Initial commit
This commit is contained in:
+86
@@ -0,0 +1,86 @@
|
|||||||
|
/* Catacomb 3-D Source Code
|
||||||
|
* Copyright (C) 1993-2014 Flat Rock Software
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along
|
||||||
|
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// MUSE Header for .C3D
|
||||||
|
// Created Wed Oct 30 22:44:13 1991
|
||||||
|
//
|
||||||
|
/////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#define NUMSOUNDS 30
|
||||||
|
#define NUMSNDCHUNKS 91
|
||||||
|
|
||||||
|
//
|
||||||
|
// Sound names & indexes
|
||||||
|
//
|
||||||
|
typedef enum {
|
||||||
|
HITWALLSND, // 0
|
||||||
|
WARPUPSND, // 1
|
||||||
|
WARPDOWNSND, // 2
|
||||||
|
GETBOLTSND, // 3
|
||||||
|
GETNUKESND, // 4
|
||||||
|
GETPOTIONSND, // 5
|
||||||
|
GETKEYSND, // 6
|
||||||
|
GETSCROLLSND, // 7
|
||||||
|
GETPOINTSSND, // 8
|
||||||
|
USEBOLTSND, // 9
|
||||||
|
USENUKESND, // 10
|
||||||
|
USEPOTIONSND, // 11
|
||||||
|
USEKEYSND, // 12
|
||||||
|
NOITEMSND, // 13
|
||||||
|
WALK1SND, // 14
|
||||||
|
WALK2SND, // 15
|
||||||
|
TAKEDAMAGESND, // 16
|
||||||
|
MONSTERMISSSND, // 17
|
||||||
|
GAMEOVERSND, // 18
|
||||||
|
SHOOTSND, // 19
|
||||||
|
BIGSHOOTSND, // 20
|
||||||
|
SHOOTWALLSND, // 21
|
||||||
|
SHOOTMONSTERSND, // 22
|
||||||
|
TAKEDMGHURTSND, // 23
|
||||||
|
BALLBOUNCESND, // 24
|
||||||
|
COMPSCOREDSND, // 25
|
||||||
|
KEENSCOREDSND, // 26
|
||||||
|
COMPPADDLESND, // 27
|
||||||
|
KEENPADDLESND, // 28
|
||||||
|
NOWAYSND, // 29
|
||||||
|
LASTSOUND
|
||||||
|
} soundnames;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Base offsets
|
||||||
|
//
|
||||||
|
#define STARTPCSOUNDS 0
|
||||||
|
#define STARTADLIBSOUNDS 30
|
||||||
|
#define STARTDIGISOUNDS 60
|
||||||
|
#define STARTMUSIC 90
|
||||||
|
|
||||||
|
//
|
||||||
|
// Music names & indexes
|
||||||
|
//
|
||||||
|
typedef enum {
|
||||||
|
TOOHOT_MUS, // 0
|
||||||
|
LASTMUSIC
|
||||||
|
} musicnames;
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Thanks for playing with MUSE!
|
||||||
|
//
|
||||||
|
/////////////////////////////////////////////////
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+197
@@ -0,0 +1,197 @@
|
|||||||
|
; Catacomb 3-D Source Code
|
||||||
|
; Copyright (C) 1993-2014 Flat Rock Software
|
||||||
|
;
|
||||||
|
; This program is free software; you can redistribute it and/or modify
|
||||||
|
; it under the terms of the GNU General Public License as published by
|
||||||
|
; the Free Software Foundation; either version 2 of the License, or
|
||||||
|
; (at your option) any later version.
|
||||||
|
;
|
||||||
|
; This program is distributed in the hope that it will be useful,
|
||||||
|
; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
; GNU General Public License for more details.
|
||||||
|
;
|
||||||
|
; You should have received a copy of the GNU General Public License along
|
||||||
|
; with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
; 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
|
||||||
|
IDEAL
|
||||||
|
|
||||||
|
MODEL MEDIUM,C
|
||||||
|
|
||||||
|
VIEWWIDTH = (33*8)
|
||||||
|
GC_INDEX = 03CEh
|
||||||
|
|
||||||
|
DATASEG
|
||||||
|
EVEN
|
||||||
|
|
||||||
|
;=================== Tables filled in by DrawVWall ==========================
|
||||||
|
|
||||||
|
;
|
||||||
|
; wallheight has the height (scale number) of that collumn of scaled wall
|
||||||
|
; it is pre bounded to 1-MAXSCALE (the actuial height on screen is 2*height)
|
||||||
|
;
|
||||||
|
wallheight dw VIEWWIDTH dup (?)
|
||||||
|
|
||||||
|
;
|
||||||
|
; wallwidth has the pixel width (1-7) of that collumn
|
||||||
|
;
|
||||||
|
wallwidth dw VIEWWIDTH dup (?)
|
||||||
|
|
||||||
|
;
|
||||||
|
; wallseg has the segment of the wall picture
|
||||||
|
;
|
||||||
|
wallseg dw VIEWWIDTH dup (?)
|
||||||
|
|
||||||
|
;
|
||||||
|
; wallofs has the offset of the wall picture
|
||||||
|
;
|
||||||
|
wallofs dw VIEWWIDTH dup (?)
|
||||||
|
|
||||||
|
;============================================================================
|
||||||
|
|
||||||
|
;
|
||||||
|
; screenbyte is just position/8
|
||||||
|
;
|
||||||
|
LABEL screenbyte WORD
|
||||||
|
pos = 0
|
||||||
|
REPT VIEWWIDTH
|
||||||
|
dw pos/8
|
||||||
|
pos = pos+1
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
;
|
||||||
|
; screenbit is (position&7)*16
|
||||||
|
;
|
||||||
|
LABEL screenbit WORD
|
||||||
|
pos = 0
|
||||||
|
REPT VIEWWIDTH
|
||||||
|
dw (pos AND 7)*16
|
||||||
|
pos = pos+1
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
;
|
||||||
|
; Use offset: screenbit[]+pixwidth*2
|
||||||
|
; acess from bitmasks-2+offset for one biased pixwidth
|
||||||
|
; the low byte of bitmasks is for the first screen byte, the high byte
|
||||||
|
; is the bitmask for the second screen byte (if non 0)
|
||||||
|
;
|
||||||
|
|
||||||
|
bitmasks dw 0080h,00c0h,00e0h,00f0h,00f8h,00fch,00feh,00ffh
|
||||||
|
dw 0040h,0060h,0070h,0078h,007ch,007eh,007fh,807fh
|
||||||
|
dw 0020h,0030h,0038h,003ch,003eh,003fh,803fh,0c03fh
|
||||||
|
dw 0010h,0018h,001ch,001eh,001fh,801fh,0c01fh,0e01fh
|
||||||
|
dw 0008h,000ch,000eh,000fh,800fh,0c00fh,0e00fh,0f00fh
|
||||||
|
dw 0004h,0006h,0007h,8007h,0c007h,0e007h,0f007h,0f807h
|
||||||
|
dw 0002h,0003h,8003h,0c003h,0e003h,0f003h,0f803h,0fc03h
|
||||||
|
dw 0001h,8001h,0c001h,0e001h,0f001h,0f801h,0fc01h,0fe01h
|
||||||
|
|
||||||
|
|
||||||
|
;
|
||||||
|
; wallscalecall is a far pointer to the start of a compiled scaler
|
||||||
|
; The low word will never change, while the high word is set to
|
||||||
|
; compscaledirectory[scale]
|
||||||
|
;
|
||||||
|
wallscalecall dd (65*6) ; offset of t_compscale->code[0]
|
||||||
|
|
||||||
|
|
||||||
|
PUBLIC wallheight,wallwidth,wallseg,wallofs,screenbyte,screenbit
|
||||||
|
PUBLIC bitmasks,wallscalecall
|
||||||
|
|
||||||
|
|
||||||
|
EXTRN scaledirectory:WORD ; array of MAXSCALE segment pointers to
|
||||||
|
; compiled scalers
|
||||||
|
EXTRN screenseg:WORD ; basically just 0xa000
|
||||||
|
EXTRN bufferofs:WORD ; offset of the current work screen
|
||||||
|
|
||||||
|
CODESEG
|
||||||
|
|
||||||
|
;============================================================================
|
||||||
|
;
|
||||||
|
; ScaleWalls
|
||||||
|
;
|
||||||
|
; AX AL is scratched in bit mask setting and scaling
|
||||||
|
; BX table index
|
||||||
|
; CX pixwidth*2
|
||||||
|
; DX GC_INDEX
|
||||||
|
; SI offset into wall data to scale from, allways 0,64,128,...4032
|
||||||
|
; DI byte at top of screen that the collumn is contained in
|
||||||
|
; BP x pixel * 2, index into VIEWWIDTH wide tables
|
||||||
|
; DS segment of the wall data to texture map
|
||||||
|
; ES screenseg
|
||||||
|
; SS addressing DGROUP variables
|
||||||
|
;
|
||||||
|
;============================================================================
|
||||||
|
|
||||||
|
PROC ScaleWalls
|
||||||
|
PUBLIC ScaleWalls
|
||||||
|
USES SI,DI,BP
|
||||||
|
|
||||||
|
xor bp,bp ; start at location 0 in the tables
|
||||||
|
mov dx,GC_INDEX+1
|
||||||
|
mov es,[screenseg]
|
||||||
|
|
||||||
|
;
|
||||||
|
; scale one collumn of data, possibly across two bytes
|
||||||
|
;
|
||||||
|
nextcollumn:
|
||||||
|
|
||||||
|
mov bx,[wallheight+bp] ; height of walls (1-MAXSCALE)
|
||||||
|
shl bx,1
|
||||||
|
mov ax,[ss:scaledirectory+bx] ; segment of the compiled scaler
|
||||||
|
mov [WORD PTR ss:wallscalecall+2],ax
|
||||||
|
|
||||||
|
mov cx,[wallwidth+bp]
|
||||||
|
or cx,cx
|
||||||
|
jnz okwidth
|
||||||
|
mov cx,2
|
||||||
|
jmp next
|
||||||
|
|
||||||
|
okwidth:
|
||||||
|
shl cx,1
|
||||||
|
mov ds,[wallseg+bp]
|
||||||
|
mov si,[wallofs+bp]
|
||||||
|
|
||||||
|
mov di,[screenbyte+bp] ; byte at the top of the scaled collumn
|
||||||
|
add di,[ss:bufferofs] ; offset of current page flip
|
||||||
|
mov bx,[screenbit+bp] ; 0-7 << 4
|
||||||
|
add bx,cx
|
||||||
|
mov ax,[ss:bitmasks-2+bx]
|
||||||
|
out dx,al ; set bit mask register
|
||||||
|
call [DWORD PTR ss:wallscalecall] ; scale the line of pixels
|
||||||
|
or ah,ah ; is there anything in the second byte?
|
||||||
|
jnz secondbyte
|
||||||
|
;
|
||||||
|
; next
|
||||||
|
;
|
||||||
|
next:
|
||||||
|
add bp,cx
|
||||||
|
cmp bp,VIEWWIDTH*2
|
||||||
|
jb nextcollumn
|
||||||
|
jmp done
|
||||||
|
|
||||||
|
;
|
||||||
|
; draw a second byte for vertical strips that cross two bytes
|
||||||
|
;
|
||||||
|
secondbyte:
|
||||||
|
mov al,ah
|
||||||
|
inc di ; next byte over
|
||||||
|
out dx,al ; set bit mask register
|
||||||
|
call [DWORD PTR ss:wallscalecall] ; scale the line of pixels
|
||||||
|
;
|
||||||
|
; next
|
||||||
|
;
|
||||||
|
add bp,cx
|
||||||
|
cmp bp,VIEWWIDTH*2
|
||||||
|
jb nextcollumn
|
||||||
|
|
||||||
|
done:
|
||||||
|
mov ax,ss
|
||||||
|
mov ds,ax
|
||||||
|
ret
|
||||||
|
|
||||||
|
ENDP
|
||||||
|
|
||||||
|
|
||||||
|
END
|
||||||
|
|
||||||
+606
@@ -0,0 +1,606 @@
|
|||||||
|
/* Catacomb 3-D Source Code
|
||||||
|
* Copyright (C) 1993-2014 Flat Rock Software
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along
|
||||||
|
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// C3_DEBUG.C
|
||||||
|
|
||||||
|
#include "C3_DEF.H"
|
||||||
|
#pragma hdrstop
|
||||||
|
|
||||||
|
/*
|
||||||
|
=============================================================================
|
||||||
|
|
||||||
|
LOCAL CONSTANTS
|
||||||
|
|
||||||
|
=============================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define VIEWTILEX 20
|
||||||
|
#define VIEWTILEY (VIEWHEIGHT/16)
|
||||||
|
|
||||||
|
/*
|
||||||
|
=============================================================================
|
||||||
|
|
||||||
|
GLOBAL VARIABLES
|
||||||
|
|
||||||
|
=============================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
=============================================================================
|
||||||
|
|
||||||
|
LOCAL VARIABLES
|
||||||
|
|
||||||
|
=============================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
int maporgx;
|
||||||
|
int maporgy;
|
||||||
|
enum {mapview,tilemapview,actoratview,visview} viewtype;
|
||||||
|
|
||||||
|
void ViewMap (void);
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
==================
|
||||||
|
=
|
||||||
|
= DebugMemory
|
||||||
|
=
|
||||||
|
==================
|
||||||
|
*/
|
||||||
|
|
||||||
|
void DebugMemory (void)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
char scratch[80],str[10];
|
||||||
|
long mem;
|
||||||
|
spritetype _seg *block;
|
||||||
|
|
||||||
|
VW_FixRefreshBuffer ();
|
||||||
|
US_CenterWindow (16,7);
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
CA_OpenDebug ();
|
||||||
|
for (i=0;i<NUMCHUNKS;i++)
|
||||||
|
{
|
||||||
|
if (grsegs[i])
|
||||||
|
{
|
||||||
|
strcpy (scratch,"Chunk:");
|
||||||
|
itoa (i,str,10);
|
||||||
|
strcat (scratch,str);
|
||||||
|
strcat (scratch,"\n");
|
||||||
|
write (debughandle,scratch,strlen(scratch));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
CA_CloseDebug ();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
US_CPrint ("Memory Usage");
|
||||||
|
US_CPrint ("------------");
|
||||||
|
US_Print ("Total :");
|
||||||
|
US_PrintUnsigned (mminfo.mainmem/1024);
|
||||||
|
US_Print ("k\nFree :");
|
||||||
|
US_PrintUnsigned (MM_UnusedMemory()/1024);
|
||||||
|
US_Print ("k\nWith purge:");
|
||||||
|
US_PrintUnsigned (MM_TotalFree()/1024);
|
||||||
|
US_Print ("k\n");
|
||||||
|
VW_UpdateScreen();
|
||||||
|
IN_Ack ();
|
||||||
|
}
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
|
/*
|
||||||
|
================
|
||||||
|
=
|
||||||
|
= PicturePause
|
||||||
|
=
|
||||||
|
================
|
||||||
|
*/
|
||||||
|
|
||||||
|
void PicturePause (void)
|
||||||
|
{
|
||||||
|
int y;
|
||||||
|
unsigned source;
|
||||||
|
|
||||||
|
source = displayofs+panadjust;
|
||||||
|
|
||||||
|
VW_ColorBorder (15);
|
||||||
|
VW_SetLineWidth (40);
|
||||||
|
VW_SetScreen (0,0);
|
||||||
|
|
||||||
|
if (source<0x10000l-200*64)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// copy top line first
|
||||||
|
//
|
||||||
|
for (y=0;y<200;y++)
|
||||||
|
VW_ScreenToScreen (source+y*64,y*40,40,1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// copy bottom line first
|
||||||
|
//
|
||||||
|
for (y=199;y>=0;y--)
|
||||||
|
VW_ScreenToScreen (source+y*64,y*40,40,1);
|
||||||
|
}
|
||||||
|
|
||||||
|
IN_Shutdown ();
|
||||||
|
|
||||||
|
VW_WaitVBL(70);
|
||||||
|
bioskey(0);
|
||||||
|
VW_WaitVBL(70);
|
||||||
|
Quit (NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
|
/*
|
||||||
|
================
|
||||||
|
=
|
||||||
|
= ShapeTest
|
||||||
|
=
|
||||||
|
================
|
||||||
|
*/
|
||||||
|
|
||||||
|
void ShapeTest (void)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
|
#define sc_1 0x02
|
||||||
|
#define sc_2 0x03
|
||||||
|
#define sc_3 0x04
|
||||||
|
#define sc_4 0x05
|
||||||
|
#define sc_5 0x06
|
||||||
|
#define sc_6 0x07
|
||||||
|
#define sc_7 0x08
|
||||||
|
#define sc_8 0x09
|
||||||
|
#define sc_9 0x0a
|
||||||
|
#define sc_0 0x0b
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
================
|
||||||
|
=
|
||||||
|
= DebugKeys
|
||||||
|
=
|
||||||
|
================
|
||||||
|
*/
|
||||||
|
|
||||||
|
int DebugKeys (void)
|
||||||
|
{
|
||||||
|
boolean esc;
|
||||||
|
int level,i;
|
||||||
|
|
||||||
|
if (Keyboard[sc_B]) // B = border color
|
||||||
|
{
|
||||||
|
CenterWindow(24,3);
|
||||||
|
PrintY+=6;
|
||||||
|
US_Print(" Border color (0-15):");
|
||||||
|
VW_UpdateScreen();
|
||||||
|
esc = !US_LineInput (px,py,str,NULL,true,2,0);
|
||||||
|
if (!esc)
|
||||||
|
{
|
||||||
|
level = atoi (str);
|
||||||
|
if (level>=0 && level<=15)
|
||||||
|
VW_ColorBorder (level);
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
|
||||||
|
if (Keyboard[sc_C]) // C = count objects
|
||||||
|
{
|
||||||
|
CountObjects();
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (Keyboard[sc_D]) // D = start / end demo record
|
||||||
|
{
|
||||||
|
if (DemoMode == demo_Off)
|
||||||
|
StartDemoRecord ();
|
||||||
|
else if (DemoMode == demo_Record)
|
||||||
|
{
|
||||||
|
EndDemoRecord ();
|
||||||
|
playstate = ex_completed;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (Keyboard[sc_E]) // E = quit level
|
||||||
|
{
|
||||||
|
if (tedlevel)
|
||||||
|
TEDDeath();
|
||||||
|
playstate = ex_warped;
|
||||||
|
gamestate.mapon++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Keyboard[sc_F]) // F = facing spot
|
||||||
|
{
|
||||||
|
CenterWindow (12,4);
|
||||||
|
US_Print ("X:");
|
||||||
|
US_PrintUnsigned (player->x);
|
||||||
|
US_Print ("Y:");
|
||||||
|
US_PrintUnsigned (player->y);
|
||||||
|
US_Print ("A:");
|
||||||
|
US_PrintUnsigned (player->angle);
|
||||||
|
VW_UpdateScreen();
|
||||||
|
IN_Ack();
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Keyboard[sc_G]) // G = god mode
|
||||||
|
{
|
||||||
|
CenterWindow (12,2);
|
||||||
|
if (godmode)
|
||||||
|
US_PrintCentered ("God mode OFF");
|
||||||
|
else
|
||||||
|
US_PrintCentered ("God mode ON");
|
||||||
|
VW_UpdateScreen();
|
||||||
|
IN_Ack();
|
||||||
|
godmode ^= 1;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if (Keyboard[sc_H]) // H = hurt self
|
||||||
|
{
|
||||||
|
TakeDamage (5);
|
||||||
|
}
|
||||||
|
else if (Keyboard[sc_I]) // I = item cheat
|
||||||
|
{
|
||||||
|
CenterWindow (12,3);
|
||||||
|
US_PrintCentered ("Free items!");
|
||||||
|
VW_UpdateScreen();
|
||||||
|
for (i=0;i<4;i++)
|
||||||
|
{
|
||||||
|
GiveBolt ();
|
||||||
|
GiveNuke ();
|
||||||
|
GivePotion ();
|
||||||
|
if (!gamestate.keys[i])
|
||||||
|
GiveKey (i);
|
||||||
|
}
|
||||||
|
for (i=0;i<8;i++)
|
||||||
|
GiveScroll (i,false);
|
||||||
|
|
||||||
|
IN_Ack ();
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
else if (Keyboard[sc_M]) // M = memory info
|
||||||
|
{
|
||||||
|
DebugMemory();
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
else if (Keyboard[sc_O]) // O = overhead
|
||||||
|
{
|
||||||
|
ViewMap();
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
else if (Keyboard[sc_P]) // P = pause with no screen disruptioon
|
||||||
|
{
|
||||||
|
PicturePause ();
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
else if (Keyboard[sc_S]) // S = slow motion
|
||||||
|
{
|
||||||
|
singlestep^=1;
|
||||||
|
CenterWindow (18,3);
|
||||||
|
if (singlestep)
|
||||||
|
US_PrintCentered ("Slow motion ON");
|
||||||
|
else
|
||||||
|
US_PrintCentered ("Slow motion OFF");
|
||||||
|
VW_UpdateScreen();
|
||||||
|
IN_Ack ();
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
else if (Keyboard[sc_S]) // T = shape test
|
||||||
|
{
|
||||||
|
ShapeTest ();
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
else if (Keyboard[sc_V]) // V = extra VBLs
|
||||||
|
{
|
||||||
|
CenterWindow(30,3);
|
||||||
|
PrintY+=6;
|
||||||
|
US_Print(" Add how many extra VBLs(0-8):");
|
||||||
|
VW_UpdateScreen();
|
||||||
|
esc = !US_LineInput (px,py,str,NULL,true,2,0);
|
||||||
|
if (!esc)
|
||||||
|
{
|
||||||
|
level = atoi (str);
|
||||||
|
if (level>=0 && level<=8)
|
||||||
|
extravbls = level;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
else if (Keyboard[sc_W]) // W = warp to level
|
||||||
|
{
|
||||||
|
CenterWindow(26,3);
|
||||||
|
PrintY+=6;
|
||||||
|
US_Print(" Warp to which level(1-21):");
|
||||||
|
VW_UpdateScreen();
|
||||||
|
esc = !US_LineInput (px,py,str,NULL,true,2,0);
|
||||||
|
if (!esc)
|
||||||
|
{
|
||||||
|
level = atoi (str);
|
||||||
|
if (level>0 && level<21)
|
||||||
|
{
|
||||||
|
gamestate.mapon = level-1;
|
||||||
|
playstate = ex_warped;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
else if (Keyboard[sc_X]) // X = item cheat
|
||||||
|
{
|
||||||
|
CenterWindow (12,3);
|
||||||
|
US_PrintCentered ("Extra stuff!");
|
||||||
|
VW_UpdateScreen();
|
||||||
|
for (i=0;i<4;i++)
|
||||||
|
{
|
||||||
|
GiveBolt ();
|
||||||
|
GiveNuke ();
|
||||||
|
GivePotion ();
|
||||||
|
}
|
||||||
|
IN_Ack ();
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
else if (Keyboard[sc_Z]) // Z = game over
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
else if (LastScan >= sc_1 && LastScan <= sc_8) // free scrolls
|
||||||
|
{
|
||||||
|
GiveScroll (LastScan-sc_1,false);
|
||||||
|
IN_ClearKeysDown ();
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
=====================
|
||||||
|
=
|
||||||
|
= LatchDrawChar
|
||||||
|
=
|
||||||
|
=====================
|
||||||
|
*/
|
||||||
|
|
||||||
|
void LatchDrawChar (unsigned x, unsigned y, unsigned picnum)
|
||||||
|
{
|
||||||
|
unsigned source, dest;
|
||||||
|
|
||||||
|
dest = bufferofs + ylookup[y]+x;
|
||||||
|
source = latchpics[0]+picnum*8;
|
||||||
|
|
||||||
|
EGAWRITEMODE(1);
|
||||||
|
EGAMAPMASK(15);
|
||||||
|
|
||||||
|
asm mov bx,[linewidth]
|
||||||
|
asm dec bx
|
||||||
|
|
||||||
|
asm mov ax,[screenseg]
|
||||||
|
asm mov es,ax
|
||||||
|
asm mov ds,ax
|
||||||
|
|
||||||
|
asm mov si,[source]
|
||||||
|
asm mov di,[dest]
|
||||||
|
|
||||||
|
asm movsb
|
||||||
|
asm add di,bx
|
||||||
|
asm movsb
|
||||||
|
asm add di,bx
|
||||||
|
asm movsb
|
||||||
|
asm add di,bx
|
||||||
|
asm movsb
|
||||||
|
asm add di,bx
|
||||||
|
asm movsb
|
||||||
|
asm add di,bx
|
||||||
|
asm movsb
|
||||||
|
asm add di,bx
|
||||||
|
asm movsb
|
||||||
|
asm add di,bx
|
||||||
|
asm movsb
|
||||||
|
|
||||||
|
asm mov ax,ss
|
||||||
|
asm mov ds,ax // restore turbo's data segment
|
||||||
|
|
||||||
|
EGAWRITEMODE(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
=====================
|
||||||
|
=
|
||||||
|
= LatchDrawTile
|
||||||
|
=
|
||||||
|
=====================
|
||||||
|
*/
|
||||||
|
|
||||||
|
void LatchDrawTile (unsigned x, unsigned y, unsigned picnum)
|
||||||
|
{
|
||||||
|
unsigned source, dest;
|
||||||
|
|
||||||
|
dest = bufferofs + ylookup[y]+x;
|
||||||
|
source = tileoffsets[picnum];
|
||||||
|
|
||||||
|
EGAWRITEMODE(1);
|
||||||
|
EGAMAPMASK(15);
|
||||||
|
|
||||||
|
asm mov bx,[linewidth]
|
||||||
|
asm sub bx,2
|
||||||
|
|
||||||
|
asm mov ax,[screenseg]
|
||||||
|
asm mov es,ax
|
||||||
|
asm mov ds,ax
|
||||||
|
|
||||||
|
asm mov si,[source]
|
||||||
|
asm mov di,[dest]
|
||||||
|
asm mov dx,16
|
||||||
|
|
||||||
|
lineloop:
|
||||||
|
asm movsb
|
||||||
|
asm movsb
|
||||||
|
asm add di,bx
|
||||||
|
|
||||||
|
asm dec dx
|
||||||
|
asm jnz lineloop
|
||||||
|
|
||||||
|
asm mov ax,ss
|
||||||
|
asm mov ds,ax // restore turbo's data segment
|
||||||
|
|
||||||
|
EGAWRITEMODE(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
===================
|
||||||
|
=
|
||||||
|
= OverheadRefresh
|
||||||
|
=
|
||||||
|
===================
|
||||||
|
*/
|
||||||
|
|
||||||
|
void OverheadRefresh (void)
|
||||||
|
{
|
||||||
|
unsigned x,y,endx,endy,sx,sy;
|
||||||
|
unsigned tile;
|
||||||
|
|
||||||
|
|
||||||
|
if (++screenpage == 3)
|
||||||
|
screenpage = 0;
|
||||||
|
|
||||||
|
bufferofs = screenloc[screenpage];
|
||||||
|
|
||||||
|
endx = maporgx+VIEWTILEX;
|
||||||
|
endy = maporgy+VIEWTILEY;
|
||||||
|
|
||||||
|
for (y=maporgy;y<endy;y++)
|
||||||
|
for (x=maporgx;x<endx;x++)
|
||||||
|
{
|
||||||
|
sx = (x-maporgx)*2;
|
||||||
|
sy = (y-maporgy)*16;
|
||||||
|
|
||||||
|
switch (viewtype)
|
||||||
|
{
|
||||||
|
case mapview:
|
||||||
|
tile = *(mapsegs[0]+farmapylookup[y]+x);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case tilemapview:
|
||||||
|
tile = tilemap[x][y];
|
||||||
|
break;
|
||||||
|
|
||||||
|
case actoratview:
|
||||||
|
tile = (unsigned)actorat[x][y];
|
||||||
|
break;
|
||||||
|
|
||||||
|
case visview:
|
||||||
|
tile = spotvis[x][y];
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tile<NUMTILE16)
|
||||||
|
LatchDrawTile(sx,sy,tile);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LatchDrawChar(sx,sy,NUMBERCHARS+((tile&0xf000)>>12));
|
||||||
|
LatchDrawChar(sx+1,sy,NUMBERCHARS+((tile&0x0f00)>>8));
|
||||||
|
LatchDrawChar(sx,sy+8,NUMBERCHARS+((tile&0x00f0)>>4));
|
||||||
|
LatchDrawChar(sx+1,sy+8,NUMBERCHARS+(tile&0x000f));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
VW_SetScreen (bufferofs,0);
|
||||||
|
displayofs = bufferofs;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
===================
|
||||||
|
=
|
||||||
|
= ViewMap
|
||||||
|
=
|
||||||
|
===================
|
||||||
|
*/
|
||||||
|
|
||||||
|
void ViewMap (void)
|
||||||
|
{
|
||||||
|
boolean button0held;
|
||||||
|
|
||||||
|
viewtype = actoratview;
|
||||||
|
button0held = false;
|
||||||
|
|
||||||
|
|
||||||
|
maporgx = player->tilex - VIEWTILEX/2;
|
||||||
|
if (maporgx<0)
|
||||||
|
maporgx = 0;
|
||||||
|
maporgy = player->tiley - VIEWTILEY/2;
|
||||||
|
if (maporgy<0)
|
||||||
|
maporgy = 0;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// let user pan around
|
||||||
|
//
|
||||||
|
IN_ReadControl(0,&c);
|
||||||
|
if (c.xaxis == -1 && maporgx>0)
|
||||||
|
maporgx--;
|
||||||
|
if (c.xaxis == 1 && maporgx<mapwidth-VIEWTILEX)
|
||||||
|
maporgx++;
|
||||||
|
if (c.yaxis == -1 && maporgy>0)
|
||||||
|
maporgy--;
|
||||||
|
if (c.yaxis == 1 && maporgy<mapheight-VIEWTILEY)
|
||||||
|
maporgy++;
|
||||||
|
|
||||||
|
if (c.button0 && !button0held)
|
||||||
|
{
|
||||||
|
button0held = true;
|
||||||
|
viewtype++;
|
||||||
|
if (viewtype>visview)
|
||||||
|
viewtype = mapview;
|
||||||
|
}
|
||||||
|
if (!c.button0)
|
||||||
|
button0held = false;
|
||||||
|
|
||||||
|
|
||||||
|
OverheadRefresh ();
|
||||||
|
|
||||||
|
} while (!Keyboard[sc_Escape]);
|
||||||
|
|
||||||
|
IN_ClearKeysDown ();
|
||||||
|
DrawPlayScreen ();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,533 @@
|
|||||||
|
/* Catacomb 3-D Source Code
|
||||||
|
* Copyright (C) 1993-2014 Flat Rock Software
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along
|
||||||
|
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "ID_HEADS.H"
|
||||||
|
#include <MATH.H>
|
||||||
|
#include <VALUES.H>
|
||||||
|
|
||||||
|
//#define PROFILE
|
||||||
|
|
||||||
|
/*
|
||||||
|
=============================================================================
|
||||||
|
|
||||||
|
GLOBAL CONSTANTS
|
||||||
|
|
||||||
|
=============================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define NAMESTART 180
|
||||||
|
|
||||||
|
|
||||||
|
#define UNMARKGRCHUNK(chunk) (grneeded[chunk]&=~ca_levelbit)
|
||||||
|
|
||||||
|
#define MOUSEINT 0x33
|
||||||
|
|
||||||
|
#define EXPWALLSTART 8
|
||||||
|
#define NUMEXPWALLS 7
|
||||||
|
#define WALLEXP 15
|
||||||
|
#define NUMFLOORS 36
|
||||||
|
|
||||||
|
#define NUMFLOORS 36
|
||||||
|
|
||||||
|
#define NUMLATCHPICS 100
|
||||||
|
#define NUMSCALEPICS 100
|
||||||
|
#define NUMSCALEWALLS 30
|
||||||
|
|
||||||
|
|
||||||
|
#define FLASHCOLOR 5
|
||||||
|
#define FLASHTICS 4
|
||||||
|
|
||||||
|
|
||||||
|
#define NUMLEVELS 20
|
||||||
|
|
||||||
|
#define VIEWX 0 // corner of view window
|
||||||
|
#define VIEWY 0
|
||||||
|
#define VIEWWIDTH (33*8) // size of view window
|
||||||
|
#define VIEWHEIGHT (18*8)
|
||||||
|
#define VIEWXH (VIEWX+VIEWWIDTH-1)
|
||||||
|
#define VIEWYH (VIEWY+VIEWHEIGHT-1)
|
||||||
|
|
||||||
|
#define CENTERX (VIEWX+VIEWWIDTH/2-1) // middle of view window
|
||||||
|
#define CENTERY (VIEWY+VIEWHEIGHT/2-1)
|
||||||
|
|
||||||
|
#define GLOBAL1 (1l<<16)
|
||||||
|
#define TILEGLOBAL GLOBAL1
|
||||||
|
#define TILESHIFT 16l
|
||||||
|
|
||||||
|
#define MINDIST (2*GLOBAL1/5)
|
||||||
|
#define FOCALLENGTH (TILEGLOBAL) // in global coordinates
|
||||||
|
|
||||||
|
#define ANGLES 360 // must be divisable by 4
|
||||||
|
|
||||||
|
#define MAPSIZE 64 // maps are 64*64 max
|
||||||
|
#define MAXACTORS 150 // max number of tanks, etc / map
|
||||||
|
|
||||||
|
#define NORTH 0
|
||||||
|
#define EAST 1
|
||||||
|
#define SOUTH 2
|
||||||
|
#define WEST 3
|
||||||
|
|
||||||
|
#define SIGN(x) ((x)>0?1:-1)
|
||||||
|
#define ABS(x) ((int)(x)>0?(x):-(x))
|
||||||
|
#define LABS(x) ((long)(x)>0?(x):-(x))
|
||||||
|
|
||||||
|
#define MAXSCALE (VIEWWIDTH/2)
|
||||||
|
|
||||||
|
|
||||||
|
#define MAXBODY 64
|
||||||
|
#define MAXSHOTPOWER 56
|
||||||
|
|
||||||
|
#define SCREEN1START 0
|
||||||
|
#define SCREEN2START 8320
|
||||||
|
|
||||||
|
#define PAGE1START 0x900
|
||||||
|
#define PAGE2START 0x2000
|
||||||
|
#define PAGE3START 0x3700
|
||||||
|
#define FREESTART 0x4e00
|
||||||
|
|
||||||
|
#define PIXRADIUS 512
|
||||||
|
|
||||||
|
#define STATUSLINES (200-VIEWHEIGHT)
|
||||||
|
|
||||||
|
enum bonusnumbers {B_BOLT,B_NUKE,B_POTION,B_RKEY,B_YKEY,B_GKEY,B_BKEY,B_SCROLL1,
|
||||||
|
B_SCROLL2,B_SCROLL3,B_SCROLL4,B_SCROLL5,B_SCROLL6,B_SCROLL7,B_SCROLL8,
|
||||||
|
B_GOAL,B_CHEST};
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
=============================================================================
|
||||||
|
|
||||||
|
GLOBAL TYPES
|
||||||
|
|
||||||
|
=============================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
enum {BLANKCHAR=9,BOLTCHAR,NUKECHAR,POTIONCHAR,KEYCHARS,SCROLLCHARS=17,
|
||||||
|
NUMBERCHARS=25};
|
||||||
|
|
||||||
|
typedef long fixed;
|
||||||
|
|
||||||
|
typedef struct {int x,y;} tilept;
|
||||||
|
typedef struct {fixed x,y;} globpt;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
int x1,x2,leftclip,rightclip;// first pixel of wall (may not be visable)
|
||||||
|
unsigned height1,height2,color,walllength,side;
|
||||||
|
long planecoord;
|
||||||
|
} walltype;
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{nothing,playerobj,bonusobj,orcobj,batobj,skeletonobj,trollobj,demonobj,
|
||||||
|
mageobj,pshotobj,bigpshotobj,mshotobj,inertobj,bounceobj,grelmobj
|
||||||
|
,gateobj} classtype;
|
||||||
|
|
||||||
|
typedef enum {north,east,south,west,northeast,southeast,southwest,
|
||||||
|
northwest,nodir} dirtype; // a catacombs 2 carryover
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct statestruct
|
||||||
|
{
|
||||||
|
int shapenum;
|
||||||
|
int tictime;
|
||||||
|
void (*think) ();
|
||||||
|
struct statestruct *next;
|
||||||
|
} statetype;
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct objstruct
|
||||||
|
{
|
||||||
|
enum {no,yes} active;
|
||||||
|
int ticcount;
|
||||||
|
classtype obclass;
|
||||||
|
statetype *state;
|
||||||
|
|
||||||
|
boolean shootable;
|
||||||
|
boolean tileobject; // true if entirely inside one tile
|
||||||
|
|
||||||
|
long distance;
|
||||||
|
dirtype dir;
|
||||||
|
fixed x,y;
|
||||||
|
unsigned tilex,tiley;
|
||||||
|
int viewx;
|
||||||
|
unsigned viewheight;
|
||||||
|
|
||||||
|
int angle;
|
||||||
|
int hitpoints;
|
||||||
|
long speed;
|
||||||
|
|
||||||
|
unsigned size; // global radius for hit rect calculation
|
||||||
|
fixed xl,xh,yl,yh; // hit rectangle
|
||||||
|
|
||||||
|
int temp1,temp2;
|
||||||
|
struct objstruct *next,*prev;
|
||||||
|
} objtype;
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
int difficulty;
|
||||||
|
int mapon;
|
||||||
|
int bolts,nukes,potions,keys[4],scrolls[8];
|
||||||
|
long score;
|
||||||
|
int body,shotpower;
|
||||||
|
} gametype;
|
||||||
|
|
||||||
|
typedef enum {ex_stillplaying,ex_died,ex_warped,ex_resetgame
|
||||||
|
,ex_loadedgame,ex_victorious,ex_abort} exittype;
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
=============================================================================
|
||||||
|
|
||||||
|
C3_MAIN DEFINITIONS
|
||||||
|
|
||||||
|
=============================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
extern char str[80],str2[20];
|
||||||
|
extern unsigned tedlevelnum;
|
||||||
|
extern boolean tedlevel;
|
||||||
|
extern gametype gamestate;
|
||||||
|
extern exittype playstate;
|
||||||
|
|
||||||
|
|
||||||
|
void NewGame (void);
|
||||||
|
boolean SaveTheGame(int file);
|
||||||
|
boolean LoadTheGame(int file);
|
||||||
|
void ResetGame(void);
|
||||||
|
void ShutdownId (void);
|
||||||
|
void InitGame (void);
|
||||||
|
void Quit (char *error);
|
||||||
|
void TEDDeath(void);
|
||||||
|
void DemoLoop (void);
|
||||||
|
void SetupScalePic (unsigned picnum);
|
||||||
|
void SetupScaleWall (unsigned picnum);
|
||||||
|
void SetupScaling (void);
|
||||||
|
void main (void);
|
||||||
|
|
||||||
|
/*
|
||||||
|
=============================================================================
|
||||||
|
|
||||||
|
C3_GAME DEFINITIONS
|
||||||
|
|
||||||
|
=============================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
extern unsigned latchpics[NUMLATCHPICS];
|
||||||
|
extern unsigned tileoffsets[NUMTILE16];
|
||||||
|
extern unsigned textstarts[27];
|
||||||
|
|
||||||
|
|
||||||
|
#define L_CHARS 0
|
||||||
|
#define L_NOSHOT 1
|
||||||
|
#define L_SHOTBAR 2
|
||||||
|
#define L_NOBODY 3
|
||||||
|
#define L_BODYBAR 4
|
||||||
|
|
||||||
|
|
||||||
|
void ScanInfoPlane (void);
|
||||||
|
void ScanText (void);
|
||||||
|
void SetupGameLevel (void);
|
||||||
|
void Victory (void);
|
||||||
|
void Died (void);
|
||||||
|
void NormalScreen (void);
|
||||||
|
void DrawPlayScreen (void);
|
||||||
|
void LoadLatchMem (void);
|
||||||
|
void FizzleFade (unsigned source, unsigned dest,
|
||||||
|
unsigned width,unsigned height, boolean abortable);
|
||||||
|
void FizzleOut (int showlevel);
|
||||||
|
void FreeUpMemory (void);
|
||||||
|
void GameLoop (void);
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
=============================================================================
|
||||||
|
|
||||||
|
C3_PLAY DEFINITIONS
|
||||||
|
|
||||||
|
=============================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
extern ControlInfo c;
|
||||||
|
extern boolean running,slowturn;
|
||||||
|
|
||||||
|
extern int bordertime;
|
||||||
|
|
||||||
|
extern byte tilemap[MAPSIZE][MAPSIZE];
|
||||||
|
extern objtype *actorat[MAPSIZE][MAPSIZE];
|
||||||
|
extern byte spotvis[MAPSIZE][MAPSIZE];
|
||||||
|
|
||||||
|
extern objtype objlist[MAXACTORS],*new,*obj,*player;
|
||||||
|
|
||||||
|
extern unsigned farmapylookup[MAPSIZE];
|
||||||
|
extern byte *nearmapylookup[MAPSIZE];
|
||||||
|
extern byte update[];
|
||||||
|
|
||||||
|
extern boolean godmode,singlestep;
|
||||||
|
extern int extravbls;
|
||||||
|
|
||||||
|
extern int mousexmove,mouseymove;
|
||||||
|
extern int pointcount,pointsleft;
|
||||||
|
|
||||||
|
|
||||||
|
void CenterWindow(word w,word h);
|
||||||
|
void DebugMemory (void);
|
||||||
|
void PicturePause (void);
|
||||||
|
int DebugKeys (void);
|
||||||
|
void CheckKeys (void);
|
||||||
|
void InitObjList (void);
|
||||||
|
void GetNewObj (boolean usedummy);
|
||||||
|
void RemoveObj (objtype *gone);
|
||||||
|
void PollControlls (void);
|
||||||
|
void PlayLoop (void);
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
=============================================================================
|
||||||
|
|
||||||
|
C3_STATE DEFINITIONS
|
||||||
|
|
||||||
|
=============================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
void SpawnNewObj (unsigned x, unsigned y, statetype *state, unsigned size);
|
||||||
|
void SpawnNewObjFrac (long x, long y, statetype *state, unsigned size);
|
||||||
|
boolean CheckHandAttack (objtype *ob);
|
||||||
|
void T_DoDamage (objtype *ob);
|
||||||
|
boolean Walk (objtype *ob);
|
||||||
|
void ChaseThink (objtype *obj, boolean diagonal);
|
||||||
|
void MoveObj (objtype *ob, long move);
|
||||||
|
boolean Chase (objtype *ob, boolean diagonal);
|
||||||
|
|
||||||
|
extern dirtype opposite[9];
|
||||||
|
|
||||||
|
/*
|
||||||
|
=============================================================================
|
||||||
|
|
||||||
|
C3_TRACE DEFINITIONS
|
||||||
|
|
||||||
|
=============================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
int FollowTrace (fixed tracex, fixed tracey, long deltax, long deltay, int max);
|
||||||
|
int BackTrace (int finish);
|
||||||
|
void ForwardTrace (void);
|
||||||
|
int FinishWall (void);
|
||||||
|
void InsideCorner (void);
|
||||||
|
void OutsideCorner (void);
|
||||||
|
void FollowWalls (void);
|
||||||
|
|
||||||
|
extern boolean aborttrace;
|
||||||
|
|
||||||
|
/*
|
||||||
|
=============================================================================
|
||||||
|
|
||||||
|
C3_DRAW DEFINITIONS
|
||||||
|
|
||||||
|
=============================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define MAXWALLS 50
|
||||||
|
#define DANGERHIGH 45
|
||||||
|
|
||||||
|
#define MIDWALL (MAXWALLS/2)
|
||||||
|
|
||||||
|
//==========================================================================
|
||||||
|
|
||||||
|
extern tilept tile,lasttile,focal,left,mid,right;
|
||||||
|
|
||||||
|
extern globpt edge,view;
|
||||||
|
|
||||||
|
extern unsigned screenloc[3];
|
||||||
|
extern unsigned freelatch;
|
||||||
|
|
||||||
|
extern int screenpage;
|
||||||
|
|
||||||
|
extern boolean fizzlein;
|
||||||
|
|
||||||
|
extern long lasttimecount;
|
||||||
|
|
||||||
|
extern int firstangle,lastangle;
|
||||||
|
|
||||||
|
extern fixed prestep;
|
||||||
|
|
||||||
|
extern int traceclip,tracetop;
|
||||||
|
|
||||||
|
extern fixed sintable[ANGLES+ANGLES/4],*costable;
|
||||||
|
|
||||||
|
extern fixed viewx,viewy,viewsin,viewcos; // the focal point
|
||||||
|
extern int viewangle;
|
||||||
|
|
||||||
|
extern fixed scale,scaleglobal;
|
||||||
|
extern unsigned slideofs;
|
||||||
|
|
||||||
|
extern int zbuffer[VIEWXH+1];
|
||||||
|
|
||||||
|
extern walltype walls[MAXWALLS],*leftwall,*rightwall;
|
||||||
|
|
||||||
|
|
||||||
|
extern fixed tileglobal;
|
||||||
|
extern fixed focallength;
|
||||||
|
extern fixed mindist;
|
||||||
|
extern int viewheight;
|
||||||
|
extern fixed scale;
|
||||||
|
|
||||||
|
extern int walllight1[NUMFLOORS];
|
||||||
|
extern int walldark1[NUMFLOORS];
|
||||||
|
extern int walllight2[NUMFLOORS];
|
||||||
|
extern int walldark2[NUMFLOORS];
|
||||||
|
|
||||||
|
//==========================================================================
|
||||||
|
|
||||||
|
void DrawLine (int xl, int xh, int y,int color);
|
||||||
|
void DrawWall (walltype *wallptr);
|
||||||
|
void TraceRay (unsigned angle);
|
||||||
|
fixed FixedByFrac (fixed a, fixed b);
|
||||||
|
void TransformPoint (fixed gx, fixed gy, int *screenx, unsigned *screenheight);
|
||||||
|
fixed TransformX (fixed gx, fixed gy);
|
||||||
|
int FollowTrace (fixed tracex, fixed tracey, long deltax, long deltay, int max);
|
||||||
|
void ForwardTrace (void);
|
||||||
|
int FinishWall (void);
|
||||||
|
int TurnClockwise (void);
|
||||||
|
int TurnCounterClockwise (void);
|
||||||
|
void FollowWall (void);
|
||||||
|
|
||||||
|
void NewScene (void);
|
||||||
|
void BuildTables (void);
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
=============================================================================
|
||||||
|
|
||||||
|
C3_SCALE DEFINITIONS
|
||||||
|
|
||||||
|
=============================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#define COMPSCALECODESTART (65*6) // offset to start of code in comp scaler
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
unsigned codeofs[65];
|
||||||
|
unsigned start[65];
|
||||||
|
unsigned width[65];
|
||||||
|
byte code[];
|
||||||
|
} t_compscale;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
unsigned width;
|
||||||
|
unsigned codeofs[64];
|
||||||
|
} t_compshape;
|
||||||
|
|
||||||
|
|
||||||
|
extern unsigned scaleblockwidth,
|
||||||
|
scaleblockheight,
|
||||||
|
scaleblockdest;
|
||||||
|
|
||||||
|
extern byte plotpix[8];
|
||||||
|
extern byte bitmasks1[8][8];
|
||||||
|
extern byte bitmasks2[8][8];
|
||||||
|
|
||||||
|
|
||||||
|
extern t_compscale _seg *scaledirectory[MAXSCALE+1];
|
||||||
|
extern t_compshape _seg *shapedirectory[NUMSCALEPICS];
|
||||||
|
extern memptr walldirectory[NUMSCALEWALLS];
|
||||||
|
extern unsigned shapesize[MAXSCALE+1];
|
||||||
|
|
||||||
|
void DeplanePic (int picnum);
|
||||||
|
void ScaleShape (int xcenter, t_compshape _seg *compshape, unsigned scale);
|
||||||
|
unsigned BuildCompShape (t_compshape _seg **finalspot);
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
=============================================================================
|
||||||
|
|
||||||
|
C3_ASM DEFINITIONS
|
||||||
|
|
||||||
|
=============================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
extern unsigned wallheight [VIEWWIDTH];
|
||||||
|
extern unsigned wallwidth [VIEWWIDTH];
|
||||||
|
extern unsigned wallseg [VIEWWIDTH];
|
||||||
|
extern unsigned wallofs [VIEWWIDTH];
|
||||||
|
extern unsigned screenbyte [VIEWWIDTH];
|
||||||
|
extern unsigned screenbit [VIEWWIDTH];
|
||||||
|
extern unsigned bitmasks [64];
|
||||||
|
|
||||||
|
extern long wallscalecall;
|
||||||
|
|
||||||
|
void ScaleWalls (void);
|
||||||
|
|
||||||
|
/*
|
||||||
|
=============================================================================
|
||||||
|
|
||||||
|
C3_WIZ DEFINITIONS
|
||||||
|
|
||||||
|
=============================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define MAXHANDHEIGHT 72
|
||||||
|
|
||||||
|
extern long lastnuke;
|
||||||
|
extern int handheight;
|
||||||
|
extern int boltsleft;
|
||||||
|
|
||||||
|
/*
|
||||||
|
=============================================================================
|
||||||
|
|
||||||
|
C3_ACT1 DEFINITIONS
|
||||||
|
|
||||||
|
=============================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
extern statetype s_trollouch;
|
||||||
|
extern statetype s_trolldie1;
|
||||||
|
|
||||||
|
|
||||||
|
extern statetype s_orcpause;
|
||||||
|
|
||||||
|
extern statetype s_orc1;
|
||||||
|
extern statetype s_orc2;
|
||||||
|
extern statetype s_orc3;
|
||||||
|
extern statetype s_orc4;
|
||||||
|
|
||||||
|
extern statetype s_orcattack1;
|
||||||
|
extern statetype s_orcattack2;
|
||||||
|
extern statetype s_orcattack3;
|
||||||
|
|
||||||
|
extern statetype s_orcouch;
|
||||||
|
|
||||||
|
extern statetype s_orcdie1;
|
||||||
|
extern statetype s_orcdie2;
|
||||||
|
extern statetype s_orcdie3;
|
||||||
|
|
||||||
|
|
||||||
|
extern statetype s_demonouch;
|
||||||
|
extern statetype s_demondie1;
|
||||||
|
|
||||||
|
extern statetype s_mageouch;
|
||||||
|
extern statetype s_magedie1;
|
||||||
|
|
||||||
|
extern statetype s_grelouch;
|
||||||
|
extern statetype s_greldie1;
|
||||||
|
|
||||||
|
extern statetype s_batdie1;
|
||||||
@@ -0,0 +1,756 @@
|
|||||||
|
/* Catacomb 3-D Source Code
|
||||||
|
* Copyright (C) 1993-2014 Flat Rock Software
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along
|
||||||
|
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// C3_MAIN.C
|
||||||
|
|
||||||
|
#include "C3_DEF.H"
|
||||||
|
#pragma hdrstop
|
||||||
|
|
||||||
|
/*
|
||||||
|
=============================================================================
|
||||||
|
|
||||||
|
CATACOMB 3-D
|
||||||
|
|
||||||
|
An Id Software production
|
||||||
|
|
||||||
|
by John Carmack
|
||||||
|
|
||||||
|
=============================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
=============================================================================
|
||||||
|
|
||||||
|
LOCAL CONSTANTS
|
||||||
|
|
||||||
|
=============================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
=============================================================================
|
||||||
|
|
||||||
|
GLOBAL VARIABLES
|
||||||
|
|
||||||
|
=============================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
memptr scalesegs[NUMPICS];
|
||||||
|
char str[80],str2[20];
|
||||||
|
unsigned tedlevelnum;
|
||||||
|
boolean tedlevel;
|
||||||
|
gametype gamestate;
|
||||||
|
exittype playstate;
|
||||||
|
|
||||||
|
/*
|
||||||
|
=============================================================================
|
||||||
|
|
||||||
|
LOCAL VARIABLES
|
||||||
|
|
||||||
|
=============================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
|
// JAB Hack begin
|
||||||
|
#define MyInterrupt 0x60
|
||||||
|
void interrupt (*intaddr)();
|
||||||
|
void interrupt (*oldintaddr)();
|
||||||
|
char *JHParmStrings[] = {"no386",nil};
|
||||||
|
|
||||||
|
void
|
||||||
|
jabhack(void)
|
||||||
|
{
|
||||||
|
extern void far jabhack2(void);
|
||||||
|
extern int far CheckIs386(void);
|
||||||
|
|
||||||
|
int i;
|
||||||
|
|
||||||
|
oldintaddr = getvect(MyInterrupt);
|
||||||
|
|
||||||
|
for (i = 1;i < _argc;i++)
|
||||||
|
if (US_CheckParm(_argv[i],JHParmStrings) == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (CheckIs386())
|
||||||
|
{
|
||||||
|
jabhack2();
|
||||||
|
setvect(MyInterrupt,intaddr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
jabunhack(void)
|
||||||
|
{
|
||||||
|
setvect(MyInterrupt,oldintaddr);
|
||||||
|
}
|
||||||
|
// JAB Hack end
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
|
/*
|
||||||
|
=====================
|
||||||
|
=
|
||||||
|
= NewGame
|
||||||
|
=
|
||||||
|
= Set up new game to start from the beginning
|
||||||
|
=
|
||||||
|
=====================
|
||||||
|
*/
|
||||||
|
|
||||||
|
void NewGame (void)
|
||||||
|
{
|
||||||
|
memset (&gamestate,0,sizeof(gamestate));
|
||||||
|
gamestate.mapon = 0;
|
||||||
|
gamestate.body = MAXBODY;
|
||||||
|
}
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
|
#define RLETAG 0xABCD
|
||||||
|
|
||||||
|
/*
|
||||||
|
==================
|
||||||
|
=
|
||||||
|
= SaveTheGame
|
||||||
|
=
|
||||||
|
==================
|
||||||
|
*/
|
||||||
|
|
||||||
|
boolean SaveTheGame(int file)
|
||||||
|
{
|
||||||
|
word i,compressed,expanded;
|
||||||
|
objtype *o;
|
||||||
|
memptr bigbuffer;
|
||||||
|
|
||||||
|
if (!CA_FarWrite(file,(void far *)&gamestate,sizeof(gamestate)))
|
||||||
|
return(false);
|
||||||
|
|
||||||
|
expanded = mapwidth * mapheight * 2;
|
||||||
|
MM_GetPtr (&bigbuffer,expanded);
|
||||||
|
|
||||||
|
for (i = 0;i < 3;i+=2) // Write planes 0 and 2
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// leave a word at start of compressed data for compressed length
|
||||||
|
//
|
||||||
|
compressed = (unsigned)CA_RLEWCompress ((unsigned huge *)mapsegs[i]
|
||||||
|
,expanded,((unsigned huge *)bigbuffer)+1,RLETAG);
|
||||||
|
|
||||||
|
*(unsigned huge *)bigbuffer = compressed;
|
||||||
|
|
||||||
|
if (!CA_FarWrite(file,(void far *)bigbuffer,compressed+2) )
|
||||||
|
{
|
||||||
|
MM_FreePtr (&bigbuffer);
|
||||||
|
return(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (o = player;o;o = o->next)
|
||||||
|
if (!CA_FarWrite(file,(void far *)o,sizeof(objtype)))
|
||||||
|
{
|
||||||
|
MM_FreePtr (&bigbuffer);
|
||||||
|
return(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
MM_FreePtr (&bigbuffer);
|
||||||
|
|
||||||
|
return(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
|
/*
|
||||||
|
==================
|
||||||
|
=
|
||||||
|
= LoadTheGame
|
||||||
|
=
|
||||||
|
==================
|
||||||
|
*/
|
||||||
|
|
||||||
|
boolean LoadTheGame(int file)
|
||||||
|
{
|
||||||
|
unsigned i,x,y;
|
||||||
|
objtype *obj,*prev,*next,*followed;
|
||||||
|
unsigned compressed,expanded;
|
||||||
|
unsigned far *map,tile;
|
||||||
|
memptr bigbuffer;
|
||||||
|
|
||||||
|
if (!CA_FarRead(file,(void far *)&gamestate,sizeof(gamestate)))
|
||||||
|
return(false);
|
||||||
|
|
||||||
|
SetupGameLevel (); // load in and cache the base old level
|
||||||
|
|
||||||
|
expanded = mapwidth * mapheight * 2;
|
||||||
|
MM_GetPtr (&bigbuffer,expanded);
|
||||||
|
|
||||||
|
for (i = 0;i < 3;i+=2) // Read planes 0 and 2
|
||||||
|
{
|
||||||
|
if (!CA_FarRead(file,(void far *)&compressed,sizeof(compressed)) )
|
||||||
|
{
|
||||||
|
MM_FreePtr (&bigbuffer);
|
||||||
|
return(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!CA_FarRead(file,(void far *)bigbuffer,compressed) )
|
||||||
|
{
|
||||||
|
MM_FreePtr (&bigbuffer);
|
||||||
|
return(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
CA_RLEWexpand ((unsigned huge *)bigbuffer,
|
||||||
|
(unsigned huge *)mapsegs[i],expanded,RLETAG);
|
||||||
|
}
|
||||||
|
|
||||||
|
MM_FreePtr (&bigbuffer);
|
||||||
|
//
|
||||||
|
// copy the wall data to a data segment array again, to handle doors and
|
||||||
|
// bomb walls that are allready opened
|
||||||
|
//
|
||||||
|
memset (tilemap,0,sizeof(tilemap));
|
||||||
|
memset (actorat,0,sizeof(actorat));
|
||||||
|
map = mapsegs[0];
|
||||||
|
for (y=0;y<mapheight;y++)
|
||||||
|
for (x=0;x<mapwidth;x++)
|
||||||
|
{
|
||||||
|
tile = *map++;
|
||||||
|
if (tile<NUMFLOORS)
|
||||||
|
{
|
||||||
|
tilemap[x][y] = tile;
|
||||||
|
if (tile>0)
|
||||||
|
(unsigned)actorat[x][y] = tile;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Read the object list back in - assumes at least one object in list
|
||||||
|
|
||||||
|
InitObjList ();
|
||||||
|
new = player;
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
prev = new->prev;
|
||||||
|
next = new->next;
|
||||||
|
if (!CA_FarRead(file,(void far *)new,sizeof(objtype)))
|
||||||
|
return(false);
|
||||||
|
followed = new->next;
|
||||||
|
new->prev = prev;
|
||||||
|
new->next = next;
|
||||||
|
actorat[new->tilex][new->tiley] = new; // drop a new marker
|
||||||
|
|
||||||
|
if (followed)
|
||||||
|
GetNewObj (false);
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
|
/*
|
||||||
|
==================
|
||||||
|
=
|
||||||
|
= ResetGame
|
||||||
|
=
|
||||||
|
==================
|
||||||
|
*/
|
||||||
|
|
||||||
|
void ResetGame(void)
|
||||||
|
{
|
||||||
|
NewGame ();
|
||||||
|
|
||||||
|
ca_levelnum--;
|
||||||
|
ca_levelbit>>=1;
|
||||||
|
CA_ClearMarks();
|
||||||
|
ca_levelbit<<=1;
|
||||||
|
ca_levelnum++;
|
||||||
|
}
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
==========================
|
||||||
|
=
|
||||||
|
= ShutdownId
|
||||||
|
=
|
||||||
|
= Shuts down all ID_?? managers
|
||||||
|
=
|
||||||
|
==========================
|
||||||
|
*/
|
||||||
|
|
||||||
|
void ShutdownId (void)
|
||||||
|
{
|
||||||
|
US_Shutdown ();
|
||||||
|
#ifndef PROFILE
|
||||||
|
SD_Shutdown ();
|
||||||
|
IN_Shutdown ();
|
||||||
|
#endif
|
||||||
|
VW_Shutdown ();
|
||||||
|
CA_Shutdown ();
|
||||||
|
MM_Shutdown ();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
|
/*
|
||||||
|
==========================
|
||||||
|
=
|
||||||
|
= InitGame
|
||||||
|
=
|
||||||
|
= Load a few things right away
|
||||||
|
=
|
||||||
|
==========================
|
||||||
|
*/
|
||||||
|
|
||||||
|
void InitGame (void)
|
||||||
|
{
|
||||||
|
unsigned segstart,seglength;
|
||||||
|
int i,x,y;
|
||||||
|
unsigned *blockstart;
|
||||||
|
|
||||||
|
// US_TextScreen();
|
||||||
|
|
||||||
|
MM_Startup ();
|
||||||
|
VW_Startup ();
|
||||||
|
#ifndef PROFILE
|
||||||
|
IN_Startup ();
|
||||||
|
SD_Startup ();
|
||||||
|
#endif
|
||||||
|
US_Startup ();
|
||||||
|
|
||||||
|
// US_UpdateTextScreen();
|
||||||
|
|
||||||
|
CA_Startup ();
|
||||||
|
US_Setup ();
|
||||||
|
|
||||||
|
US_SetLoadSaveHooks(LoadTheGame,SaveTheGame,ResetGame);
|
||||||
|
|
||||||
|
//
|
||||||
|
// load in and lock down some basic chunks
|
||||||
|
//
|
||||||
|
|
||||||
|
CA_ClearMarks ();
|
||||||
|
|
||||||
|
CA_MarkGrChunk(STARTFONT);
|
||||||
|
CA_MarkGrChunk(STARTTILE8);
|
||||||
|
CA_MarkGrChunk(STARTTILE8M);
|
||||||
|
CA_MarkGrChunk(HAND1PICM);
|
||||||
|
CA_MarkGrChunk(HAND2PICM);
|
||||||
|
CA_MarkGrChunk(ENTERPLAQUEPIC);
|
||||||
|
|
||||||
|
CA_CacheMarks (NULL);
|
||||||
|
|
||||||
|
MM_SetLock (&grsegs[STARTFONT],true);
|
||||||
|
MM_SetLock (&grsegs[STARTTILE8],true);
|
||||||
|
MM_SetLock (&grsegs[STARTTILE8M],true);
|
||||||
|
MM_SetLock (&grsegs[HAND1PICM],true);
|
||||||
|
MM_SetLock (&grsegs[HAND2PICM],true);
|
||||||
|
MM_SetLock (&grsegs[ENTERPLAQUEPIC],true);
|
||||||
|
|
||||||
|
fontcolor = WHITE;
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// build some tables
|
||||||
|
//
|
||||||
|
for (i=0;i<MAPSIZE;i++)
|
||||||
|
nearmapylookup[i] = &tilemap[0][0]+MAPSIZE*i;
|
||||||
|
|
||||||
|
for (i=0;i<PORTTILESHIGH;i++)
|
||||||
|
uwidthtable[i] = UPDATEWIDE*i;
|
||||||
|
|
||||||
|
blockstart = &blockstarts[0];
|
||||||
|
for (y=0;y<UPDATEHIGH;y++)
|
||||||
|
for (x=0;x<UPDATEWIDE;x++)
|
||||||
|
*blockstart++ = SCREENWIDTH*16*y+x*TILEWIDTH;
|
||||||
|
|
||||||
|
BuildTables (); // 3-d tables
|
||||||
|
|
||||||
|
SetupScaling ();
|
||||||
|
|
||||||
|
#ifndef PROFILE
|
||||||
|
// US_FinishTextScreen();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//
|
||||||
|
// reclaim the memory from the linked in text screen
|
||||||
|
//
|
||||||
|
segstart = FP_SEG(&introscn);
|
||||||
|
seglength = 4000/16;
|
||||||
|
if (FP_OFF(&introscn))
|
||||||
|
{
|
||||||
|
segstart++;
|
||||||
|
seglength--;
|
||||||
|
}
|
||||||
|
|
||||||
|
MML_UseSpace (segstart,seglength);
|
||||||
|
|
||||||
|
VW_SetScreenMode (GRMODE);
|
||||||
|
VW_ColorBorder (3);
|
||||||
|
VW_ClearVideo (BLACK);
|
||||||
|
|
||||||
|
//
|
||||||
|
// initialize variables
|
||||||
|
//
|
||||||
|
updateptr = &update[0];
|
||||||
|
*(unsigned *)(updateptr + UPDATEWIDE*PORTTILESHIGH) = UPDATETERMINATE;
|
||||||
|
bufferofs = 0;
|
||||||
|
displayofs = 0;
|
||||||
|
VW_SetLineWidth(SCREENWIDTH);
|
||||||
|
}
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
|
void clrscr (void); // can't include CONIO.H because of name conflicts...
|
||||||
|
|
||||||
|
/*
|
||||||
|
==========================
|
||||||
|
=
|
||||||
|
= Quit
|
||||||
|
=
|
||||||
|
==========================
|
||||||
|
*/
|
||||||
|
|
||||||
|
void Quit (char *error)
|
||||||
|
{
|
||||||
|
unsigned finscreen;
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
if (!error)
|
||||||
|
{
|
||||||
|
CA_SetAllPurge ();
|
||||||
|
CA_CacheGrChunk (PIRACY);
|
||||||
|
finscreen = (unsigned)grsegs[PIRACY];
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
ShutdownId ();
|
||||||
|
if (error && *error)
|
||||||
|
{
|
||||||
|
puts(error);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
if (!NoWait)
|
||||||
|
{
|
||||||
|
movedata (finscreen,0,0xb800,0,4000);
|
||||||
|
bioskey (0);
|
||||||
|
clrscr();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
|
/*
|
||||||
|
==================
|
||||||
|
=
|
||||||
|
= TEDDeath
|
||||||
|
=
|
||||||
|
==================
|
||||||
|
*/
|
||||||
|
|
||||||
|
void TEDDeath(void)
|
||||||
|
{
|
||||||
|
ShutdownId();
|
||||||
|
execlp("TED5.EXE","TED5.EXE","/LAUNCH",NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
|
/*
|
||||||
|
=====================
|
||||||
|
=
|
||||||
|
= DemoLoop
|
||||||
|
=
|
||||||
|
=====================
|
||||||
|
*/
|
||||||
|
|
||||||
|
static char *ParmStrings[] = {"easy","normal","hard",""};
|
||||||
|
|
||||||
|
void DemoLoop (void)
|
||||||
|
{
|
||||||
|
int i,level;
|
||||||
|
|
||||||
|
//
|
||||||
|
// check for launch from ted
|
||||||
|
//
|
||||||
|
if (tedlevel)
|
||||||
|
{
|
||||||
|
NewGame();
|
||||||
|
gamestate.mapon = tedlevelnum;
|
||||||
|
restartgame = gd_Normal;
|
||||||
|
for (i = 1;i < _argc;i++)
|
||||||
|
{
|
||||||
|
if ( (level = US_CheckParm(_argv[i],ParmStrings)) == -1)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
restartgame = gd_Easy+level;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
GameLoop();
|
||||||
|
TEDDeath();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// main game cycle
|
||||||
|
//
|
||||||
|
displayofs = bufferofs = 0;
|
||||||
|
VW_Bar (0,0,320,200,0);
|
||||||
|
|
||||||
|
while (1)
|
||||||
|
{
|
||||||
|
CA_CacheGrChunk (TITLEPIC);
|
||||||
|
bufferofs = SCREEN2START;
|
||||||
|
displayofs = SCREEN1START;
|
||||||
|
VWB_DrawPic (0,0,TITLEPIC);
|
||||||
|
MM_SetPurge (&grsegs[TITLEPIC],3);
|
||||||
|
UNMARKGRCHUNK(TITLEPIC);
|
||||||
|
FizzleFade (bufferofs,displayofs,320,200,true);
|
||||||
|
|
||||||
|
if (!IN_UserInput(TickBase*3,false))
|
||||||
|
{
|
||||||
|
CA_CacheGrChunk (CREDITSPIC);
|
||||||
|
VWB_DrawPic (0,0,CREDITSPIC);
|
||||||
|
MM_SetPurge (&grsegs[CREDITSPIC],3);
|
||||||
|
UNMARKGRCHUNK(CREDITSPIC);
|
||||||
|
FizzleFade (bufferofs,displayofs,320,200,true);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!IN_UserInput(TickBase*3,false))
|
||||||
|
{
|
||||||
|
highscores:
|
||||||
|
DrawHighScores ();
|
||||||
|
FizzleFade (bufferofs,displayofs,320,200,true);
|
||||||
|
IN_UserInput(TickBase*3,false);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (IN_IsUserInput())
|
||||||
|
{
|
||||||
|
US_ControlPanel ();
|
||||||
|
|
||||||
|
if (restartgame || loadedgame)
|
||||||
|
{
|
||||||
|
GameLoop ();
|
||||||
|
goto highscores;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
|
/*
|
||||||
|
==========================
|
||||||
|
=
|
||||||
|
= SetupScalePic
|
||||||
|
=
|
||||||
|
==========================
|
||||||
|
*/
|
||||||
|
|
||||||
|
void SetupScalePic (unsigned picnum)
|
||||||
|
{
|
||||||
|
unsigned scnum;
|
||||||
|
|
||||||
|
scnum = picnum-FIRSTSCALEPIC;
|
||||||
|
|
||||||
|
if (shapedirectory[scnum])
|
||||||
|
{
|
||||||
|
MM_SetPurge (&(memptr)shapedirectory[scnum],0);
|
||||||
|
return; // allready in memory
|
||||||
|
}
|
||||||
|
|
||||||
|
CA_CacheGrChunk (picnum);
|
||||||
|
DeplanePic (picnum);
|
||||||
|
shapesize[scnum] = BuildCompShape (&shapedirectory[scnum]);
|
||||||
|
grneeded[picnum]&= ~ca_levelbit;
|
||||||
|
MM_FreePtr (&grsegs[picnum]);
|
||||||
|
}
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
|
/*
|
||||||
|
==========================
|
||||||
|
=
|
||||||
|
= SetupScaleWall
|
||||||
|
=
|
||||||
|
==========================
|
||||||
|
*/
|
||||||
|
|
||||||
|
void SetupScaleWall (unsigned picnum)
|
||||||
|
{
|
||||||
|
int x,y;
|
||||||
|
unsigned scnum;
|
||||||
|
byte far *dest;
|
||||||
|
|
||||||
|
scnum = picnum-FIRSTWALLPIC;
|
||||||
|
|
||||||
|
if (walldirectory[scnum])
|
||||||
|
{
|
||||||
|
MM_SetPurge (&walldirectory[scnum],0);
|
||||||
|
return; // allready in memory
|
||||||
|
}
|
||||||
|
|
||||||
|
CA_CacheGrChunk (picnum);
|
||||||
|
DeplanePic (picnum);
|
||||||
|
MM_GetPtr(&walldirectory[scnum],64*64);
|
||||||
|
dest = (byte far *)walldirectory[scnum];
|
||||||
|
for (x=0;x<64;x++)
|
||||||
|
for (y=0;y<64;y++)
|
||||||
|
*dest++ = spotvis[y][x];
|
||||||
|
grneeded[picnum]&= ~ca_levelbit;
|
||||||
|
MM_FreePtr (&grsegs[picnum]);
|
||||||
|
}
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
|
/*
|
||||||
|
==========================
|
||||||
|
=
|
||||||
|
= SetupScaling
|
||||||
|
=
|
||||||
|
==========================
|
||||||
|
*/
|
||||||
|
|
||||||
|
void SetupScaling (void)
|
||||||
|
{
|
||||||
|
int i,x,y;
|
||||||
|
byte far *dest;
|
||||||
|
|
||||||
|
//
|
||||||
|
// build the compiled scalers
|
||||||
|
//
|
||||||
|
for (i=1;i<=VIEWWIDTH/2;i++)
|
||||||
|
BuildCompScale (i*2,&scaledirectory[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
|
int showscorebox;
|
||||||
|
|
||||||
|
void RF_FixOfs (void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void HelpScreens (void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
==================
|
||||||
|
=
|
||||||
|
= CheckMemory
|
||||||
|
=
|
||||||
|
==================
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define MINMEMORY 335000l
|
||||||
|
|
||||||
|
void CheckMemory(void)
|
||||||
|
{
|
||||||
|
unsigned finscreen;
|
||||||
|
|
||||||
|
if (mminfo.nearheap+mminfo.farheap+mminfo.EMSmem+mminfo.XMSmem
|
||||||
|
>= MINMEMORY)
|
||||||
|
return;
|
||||||
|
|
||||||
|
CA_CacheGrChunk (OUTOFMEM);
|
||||||
|
finscreen = (unsigned)grsegs[OUTOFMEM];
|
||||||
|
ShutdownId ();
|
||||||
|
movedata (finscreen,7,0xb800,0,4000);
|
||||||
|
gotoxy (1,24);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
==========================
|
||||||
|
=
|
||||||
|
= main
|
||||||
|
=
|
||||||
|
==========================
|
||||||
|
*/
|
||||||
|
|
||||||
|
void main (void)
|
||||||
|
{
|
||||||
|
short i;
|
||||||
|
|
||||||
|
if (stricmp(_argv[1], "/VER") == 0)
|
||||||
|
{
|
||||||
|
printf("Catacomb 3-D version 1.22 (Rev 1)\n");
|
||||||
|
printf("Copyright 1991-93 Softdisk Publishing\n");
|
||||||
|
printf("Developed for use with 100%% IBM compatibles\n");
|
||||||
|
printf("that have 640K memory and DOS version 3.3 or later\n");
|
||||||
|
printf("and EGA graphics or better.\n");
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (stricmp(_argv[1], "/?") == 0)
|
||||||
|
{
|
||||||
|
printf("Catacomb 3-D version 1.22\n");
|
||||||
|
printf("Copyright 1991-93 Softdisk Publishing\n\n");
|
||||||
|
printf("Syntax:\n");
|
||||||
|
printf("CAT3D [/<switch>]\n\n");
|
||||||
|
printf("Switch What it does\n");
|
||||||
|
printf("/? This Information\n");
|
||||||
|
printf("/VER Display Program Version Information\n");
|
||||||
|
printf("/COMP Fix problems with SVGA screens\n");
|
||||||
|
printf("/NOAL No AdLib or SoundBlaster detection\n");
|
||||||
|
printf("/NOJOYS Tell program to ignore joystick\n");
|
||||||
|
printf("/NOMOUSE Tell program to ignore mouse\n");
|
||||||
|
printf("/HIDDENCARD Overrides video detection\n\n");
|
||||||
|
printf("Each switch must include a '/' and multiple switches\n");
|
||||||
|
printf("must be seperated by at least one space.\n\n");
|
||||||
|
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
jabhack();
|
||||||
|
|
||||||
|
InitGame ();
|
||||||
|
|
||||||
|
CheckMemory ();
|
||||||
|
|
||||||
|
LoadLatchMem ();
|
||||||
|
|
||||||
|
#ifdef PROFILE
|
||||||
|
NewGame ();
|
||||||
|
GameLoop ();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//NewGame ();
|
||||||
|
//GameLoop ();
|
||||||
|
|
||||||
|
DemoLoop();
|
||||||
|
Quit("Demo loop exited???");
|
||||||
|
}
|
||||||
@@ -0,0 +1,584 @@
|
|||||||
|
/* Catacomb 3-D Source Code
|
||||||
|
* Copyright (C) 1993-2014 Flat Rock Software
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along
|
||||||
|
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// C3_PLAY.C
|
||||||
|
|
||||||
|
#include "C3_DEF.H"
|
||||||
|
#pragma hdrstop
|
||||||
|
|
||||||
|
/*
|
||||||
|
=============================================================================
|
||||||
|
|
||||||
|
LOCAL CONSTANTS
|
||||||
|
|
||||||
|
=============================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define POINTTICS 6
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
=============================================================================
|
||||||
|
|
||||||
|
GLOBAL VARIABLES
|
||||||
|
|
||||||
|
=============================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
ControlInfo c;
|
||||||
|
boolean running,slowturn;
|
||||||
|
|
||||||
|
int bordertime;
|
||||||
|
objtype objlist[MAXACTORS],*new,*obj,*player,*lastobj,*objfreelist;
|
||||||
|
|
||||||
|
unsigned farmapylookup[MAPSIZE];
|
||||||
|
byte *nearmapylookup[MAPSIZE];
|
||||||
|
|
||||||
|
boolean singlestep,godmode;
|
||||||
|
int extravbls;
|
||||||
|
|
||||||
|
//
|
||||||
|
// replacing refresh manager
|
||||||
|
//
|
||||||
|
unsigned mapwidth,mapheight,tics;
|
||||||
|
boolean compatability;
|
||||||
|
byte *updateptr;
|
||||||
|
unsigned mapwidthtable[64];
|
||||||
|
unsigned uwidthtable[UPDATEHIGH];
|
||||||
|
unsigned blockstarts[UPDATEWIDE*UPDATEHIGH];
|
||||||
|
#define UPDATESCREENSIZE (UPDATEWIDE*PORTTILESHIGH+2)
|
||||||
|
#define UPDATESPARESIZE (UPDATEWIDE*2+4)
|
||||||
|
#define UPDATESIZE (UPDATESCREENSIZE+2*UPDATESPARESIZE)
|
||||||
|
byte update[UPDATESIZE];
|
||||||
|
|
||||||
|
int mousexmove,mouseymove;
|
||||||
|
int pointcount,pointsleft;
|
||||||
|
|
||||||
|
/*
|
||||||
|
=============================================================================
|
||||||
|
|
||||||
|
LOCAL VARIABLES
|
||||||
|
|
||||||
|
=============================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
void CalcBounds (objtype *ob);
|
||||||
|
void DrawPlayScreen (void);
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// near data map array (wall values only, get text number from far data)
|
||||||
|
//
|
||||||
|
byte tilemap[MAPSIZE][MAPSIZE];
|
||||||
|
byte spotvis[MAPSIZE][MAPSIZE];
|
||||||
|
objtype *actorat[MAPSIZE][MAPSIZE];
|
||||||
|
|
||||||
|
objtype dummyobj;
|
||||||
|
|
||||||
|
int bordertime;
|
||||||
|
int objectcount;
|
||||||
|
|
||||||
|
void StopMusic(void);
|
||||||
|
void StartMusic(void);
|
||||||
|
|
||||||
|
|
||||||
|
//==========================================================================
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// CenterWindow() - Generates a window of a given width & height in the
|
||||||
|
// middle of the screen
|
||||||
|
//
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#define MAXX 264
|
||||||
|
#define MAXY 146
|
||||||
|
|
||||||
|
void CenterWindow(word w,word h)
|
||||||
|
{
|
||||||
|
US_DrawWindow(((MAXX / 8) - w) / 2,((MAXY / 8) - h) / 2,w,h);
|
||||||
|
}
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
=====================
|
||||||
|
=
|
||||||
|
= CheckKeys
|
||||||
|
=
|
||||||
|
=====================
|
||||||
|
*/
|
||||||
|
|
||||||
|
void CheckKeys (void)
|
||||||
|
{
|
||||||
|
if (screenfaded) // don't do anything with a faded screen
|
||||||
|
return;
|
||||||
|
|
||||||
|
//
|
||||||
|
// pause key wierdness can't be checked as a scan code
|
||||||
|
//
|
||||||
|
if (Paused)
|
||||||
|
{
|
||||||
|
CenterWindow (8,3);
|
||||||
|
US_PrintCentered ("PAUSED");
|
||||||
|
VW_UpdateScreen ();
|
||||||
|
SD_MusicOff();
|
||||||
|
IN_Ack();
|
||||||
|
SD_MusicOn();
|
||||||
|
Paused = false;
|
||||||
|
if (MousePresent) Mouse(MDelta); // Clear accumulated mouse movement
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// F1-F7/ESC to enter control panel
|
||||||
|
//
|
||||||
|
if ( (LastScan >= sc_F1 && LastScan <= sc_F7) || LastScan == sc_Escape)
|
||||||
|
{
|
||||||
|
StopMusic ();
|
||||||
|
NormalScreen ();
|
||||||
|
FreeUpMemory ();
|
||||||
|
US_CenterWindow (20,8);
|
||||||
|
US_CPrint ("Loading");
|
||||||
|
VW_UpdateScreen ();
|
||||||
|
US_ControlPanel();
|
||||||
|
if (abortgame)
|
||||||
|
{
|
||||||
|
playstate = ex_abort;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
StartMusic ();
|
||||||
|
IN_ClearKeysDown();
|
||||||
|
if (restartgame)
|
||||||
|
playstate = ex_resetgame;
|
||||||
|
if (loadedgame)
|
||||||
|
playstate = ex_loadedgame;
|
||||||
|
DrawPlayScreen ();
|
||||||
|
CacheScaleds ();
|
||||||
|
lasttimecount = TimeCount;
|
||||||
|
if (MousePresent) Mouse(MDelta); // Clear accumulated mouse movement
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// F10-? debug keys
|
||||||
|
//
|
||||||
|
if (Keyboard[sc_F10])
|
||||||
|
{
|
||||||
|
DebugKeys();
|
||||||
|
if (MousePresent) Mouse(MDelta); // Clear accumulated mouse movement
|
||||||
|
lasttimecount = TimeCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
|
/*
|
||||||
|
#############################################################################
|
||||||
|
|
||||||
|
The objlist data structure
|
||||||
|
|
||||||
|
#############################################################################
|
||||||
|
|
||||||
|
objlist containt structures for every actor currently playing. The structure
|
||||||
|
is accessed as a linked list starting at *player, ending when ob->next ==
|
||||||
|
NULL. GetNewObj inserts a new object at the end of the list, meaning that
|
||||||
|
if an actor spawn another actor, the new one WILL get to think and react the
|
||||||
|
same frame. RemoveObj unlinks the given object and returns it to the free
|
||||||
|
list, but does not damage the objects ->next pointer, so if the current object
|
||||||
|
removes itself, a linked list following loop can still safely get to the
|
||||||
|
next element.
|
||||||
|
|
||||||
|
<backwardly linked free list>
|
||||||
|
|
||||||
|
#############################################################################
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
=========================
|
||||||
|
=
|
||||||
|
= InitObjList
|
||||||
|
=
|
||||||
|
= Call to clear out the entire object list, returning them all to the free
|
||||||
|
= list. Allocates a special spot for the player.
|
||||||
|
=
|
||||||
|
=========================
|
||||||
|
*/
|
||||||
|
|
||||||
|
void InitObjList (void)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i=0;i<MAXACTORS;i++)
|
||||||
|
{
|
||||||
|
objlist[i].prev = &objlist[i+1];
|
||||||
|
objlist[i].next = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
objlist[MAXACTORS-1].prev = NULL;
|
||||||
|
|
||||||
|
objfreelist = &objlist[0];
|
||||||
|
lastobj = NULL;
|
||||||
|
|
||||||
|
objectcount = 0;
|
||||||
|
|
||||||
|
//
|
||||||
|
// give the player and score the first free spots
|
||||||
|
//
|
||||||
|
GetNewObj (false);
|
||||||
|
player = new;
|
||||||
|
}
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
|
/*
|
||||||
|
=========================
|
||||||
|
=
|
||||||
|
= GetNewObj
|
||||||
|
=
|
||||||
|
= Sets the global variable new to point to a free spot in objlist.
|
||||||
|
= The free spot is inserted at the end of the liked list
|
||||||
|
=
|
||||||
|
= When the object list is full, the caller can either have it bomb out ot
|
||||||
|
= return a dummy object pointer that will never get used
|
||||||
|
=
|
||||||
|
=========================
|
||||||
|
*/
|
||||||
|
|
||||||
|
void GetNewObj (boolean usedummy)
|
||||||
|
{
|
||||||
|
if (!objfreelist)
|
||||||
|
{
|
||||||
|
if (usedummy)
|
||||||
|
{
|
||||||
|
new = &dummyobj;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Quit ("GetNewObj: No free spots in objlist!");
|
||||||
|
}
|
||||||
|
|
||||||
|
new = objfreelist;
|
||||||
|
objfreelist = new->prev;
|
||||||
|
memset (new,0,sizeof(*new));
|
||||||
|
|
||||||
|
if (lastobj)
|
||||||
|
lastobj->next = new;
|
||||||
|
new->prev = lastobj; // new->next is allready NULL from memset
|
||||||
|
|
||||||
|
new->active = false;
|
||||||
|
lastobj = new;
|
||||||
|
|
||||||
|
objectcount++;
|
||||||
|
}
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
|
/*
|
||||||
|
=========================
|
||||||
|
=
|
||||||
|
= RemoveObj
|
||||||
|
=
|
||||||
|
= Add the given object back into the free list, and unlink it from it's
|
||||||
|
= neighbors
|
||||||
|
=
|
||||||
|
=========================
|
||||||
|
*/
|
||||||
|
|
||||||
|
void RemoveObj (objtype *gone)
|
||||||
|
{
|
||||||
|
objtype **spotat;
|
||||||
|
|
||||||
|
if (gone == player)
|
||||||
|
Quit ("RemoveObj: Tried to remove the player!");
|
||||||
|
|
||||||
|
//
|
||||||
|
// fix the next object's back link
|
||||||
|
//
|
||||||
|
if (gone == lastobj)
|
||||||
|
lastobj = (objtype *)gone->prev;
|
||||||
|
else
|
||||||
|
gone->next->prev = gone->prev;
|
||||||
|
|
||||||
|
//
|
||||||
|
// fix the previous object's forward link
|
||||||
|
//
|
||||||
|
gone->prev->next = gone->next;
|
||||||
|
|
||||||
|
//
|
||||||
|
// add it back in to the free list
|
||||||
|
//
|
||||||
|
gone->prev = objfreelist;
|
||||||
|
objfreelist = gone;
|
||||||
|
}
|
||||||
|
|
||||||
|
//==========================================================================
|
||||||
|
|
||||||
|
/*
|
||||||
|
===================
|
||||||
|
=
|
||||||
|
= PollControls
|
||||||
|
=
|
||||||
|
===================
|
||||||
|
*/
|
||||||
|
|
||||||
|
void PollControls (void)
|
||||||
|
{
|
||||||
|
unsigned buttons;
|
||||||
|
|
||||||
|
IN_ReadControl(0,&c);
|
||||||
|
|
||||||
|
if (MousePresent)
|
||||||
|
{
|
||||||
|
Mouse(MButtons);
|
||||||
|
buttons = _BX;
|
||||||
|
Mouse(MDelta);
|
||||||
|
mousexmove = _CX;
|
||||||
|
mouseymove = _DX;
|
||||||
|
|
||||||
|
if (buttons&1)
|
||||||
|
c.button0 = 1;
|
||||||
|
if (buttons&2)
|
||||||
|
c.button1 = 1;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Controls[0]==ctrl_Joystick)
|
||||||
|
{
|
||||||
|
if (c.x>120 || c.x <-120 || c.y>120 || c.y<-120)
|
||||||
|
running = true;
|
||||||
|
else
|
||||||
|
running = false;
|
||||||
|
if (c.x>-48 && c.x<48)
|
||||||
|
slowturn = true;
|
||||||
|
else
|
||||||
|
slowturn = false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (Keyboard[sc_RShift])
|
||||||
|
running = true;
|
||||||
|
else
|
||||||
|
running = false;
|
||||||
|
if (c.button0)
|
||||||
|
slowturn = true;
|
||||||
|
else
|
||||||
|
slowturn = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//==========================================================================
|
||||||
|
|
||||||
|
/*
|
||||||
|
=================
|
||||||
|
=
|
||||||
|
= StopMusic
|
||||||
|
=
|
||||||
|
=================
|
||||||
|
*/
|
||||||
|
|
||||||
|
void StopMusic(void)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
SD_MusicOff();
|
||||||
|
for (i = 0;i < LASTMUSIC;i++)
|
||||||
|
if (audiosegs[STARTMUSIC + i])
|
||||||
|
{
|
||||||
|
MM_SetPurge(&((memptr)audiosegs[STARTMUSIC + i]),3);
|
||||||
|
MM_SetLock(&((memptr)audiosegs[STARTMUSIC + i]),false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//==========================================================================
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
=================
|
||||||
|
=
|
||||||
|
= StartMusic
|
||||||
|
=
|
||||||
|
=================
|
||||||
|
*/
|
||||||
|
|
||||||
|
// JAB - Cache & start the appropriate music for this level
|
||||||
|
void StartMusic(void)
|
||||||
|
{
|
||||||
|
musicnames chunk;
|
||||||
|
|
||||||
|
SD_MusicOff();
|
||||||
|
chunk = TOOHOT_MUS;
|
||||||
|
// if ((chunk == -1) || (MusicMode != smm_AdLib))
|
||||||
|
//DEBUG control panel return;
|
||||||
|
|
||||||
|
MM_BombOnError (false);
|
||||||
|
CA_CacheAudioChunk(STARTMUSIC + chunk);
|
||||||
|
MM_BombOnError (true);
|
||||||
|
if (mmerror)
|
||||||
|
mmerror = false;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
MM_SetLock(&((memptr)audiosegs[STARTMUSIC + chunk]),true);
|
||||||
|
SD_StartMusic((MusicGroup far *)audiosegs[STARTMUSIC + chunk]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//==========================================================================
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
===================
|
||||||
|
=
|
||||||
|
= PlayLoop
|
||||||
|
=
|
||||||
|
===================
|
||||||
|
*/
|
||||||
|
|
||||||
|
void PlayLoop (void)
|
||||||
|
{
|
||||||
|
int give;
|
||||||
|
|
||||||
|
void (*think)();
|
||||||
|
|
||||||
|
ingame = true;
|
||||||
|
playstate = TimeCount = 0;
|
||||||
|
gamestate.shotpower = handheight = 0;
|
||||||
|
pointcount = pointsleft = 0;
|
||||||
|
|
||||||
|
DrawLevelNumber (gamestate.mapon);
|
||||||
|
DrawBars ();
|
||||||
|
|
||||||
|
#ifndef PROFILE
|
||||||
|
fizzlein = true; // fizzle fade in the first refresh
|
||||||
|
#endif
|
||||||
|
TimeCount = lasttimecount = lastnuke = 0;
|
||||||
|
|
||||||
|
PollControls (); // center mouse
|
||||||
|
StartMusic ();
|
||||||
|
do
|
||||||
|
{
|
||||||
|
#ifndef PROFILE
|
||||||
|
PollControls();
|
||||||
|
#else
|
||||||
|
c.xaxis = 1;
|
||||||
|
if (++TimeCount == 300)
|
||||||
|
return;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
for (obj = player;obj;obj = obj->next)
|
||||||
|
if (obj->active)
|
||||||
|
{
|
||||||
|
if (obj->ticcount)
|
||||||
|
{
|
||||||
|
obj->ticcount-=tics;
|
||||||
|
while ( obj->ticcount <= 0)
|
||||||
|
{
|
||||||
|
think = obj->state->think;
|
||||||
|
if (think)
|
||||||
|
{
|
||||||
|
think (obj);
|
||||||
|
if (!obj->state)
|
||||||
|
{
|
||||||
|
RemoveObj (obj);
|
||||||
|
goto nextactor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
obj->state = obj->state->next;
|
||||||
|
if (!obj->state)
|
||||||
|
{
|
||||||
|
RemoveObj (obj);
|
||||||
|
goto nextactor;
|
||||||
|
}
|
||||||
|
if (!obj->state->tictime)
|
||||||
|
{
|
||||||
|
obj->ticcount = 0;
|
||||||
|
goto nextactor;
|
||||||
|
}
|
||||||
|
if (obj->state->tictime>0)
|
||||||
|
obj->ticcount += obj->state->tictime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
think = obj->state->think;
|
||||||
|
if (think)
|
||||||
|
{
|
||||||
|
think (obj);
|
||||||
|
if (!obj->state)
|
||||||
|
RemoveObj (obj);
|
||||||
|
}
|
||||||
|
nextactor:;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (bordertime)
|
||||||
|
{
|
||||||
|
bordertime -= tics;
|
||||||
|
if (bordertime<=0)
|
||||||
|
{
|
||||||
|
bordertime = 0;
|
||||||
|
VW_ColorBorder (3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pointcount)
|
||||||
|
{
|
||||||
|
pointcount -= tics;
|
||||||
|
if (pointcount <= 0)
|
||||||
|
{
|
||||||
|
pointcount += POINTTICS;
|
||||||
|
give = (pointsleft > 1000)? 1000 :
|
||||||
|
(
|
||||||
|
(pointsleft > 100)? 100 :
|
||||||
|
((pointsleft < 20)? pointsleft : 20)
|
||||||
|
);
|
||||||
|
SD_PlaySound (GETPOINTSSND);
|
||||||
|
AddPoints (give);
|
||||||
|
pointsleft -= give;
|
||||||
|
if (!pointsleft)
|
||||||
|
pointcount = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ThreeDRefresh ();
|
||||||
|
|
||||||
|
CheckKeys();
|
||||||
|
if (singlestep)
|
||||||
|
{
|
||||||
|
VW_WaitVBL(14);
|
||||||
|
lasttimecount = TimeCount;
|
||||||
|
}
|
||||||
|
if (extravbls)
|
||||||
|
VW_WaitVBL(extravbls);
|
||||||
|
|
||||||
|
}while (!playstate);
|
||||||
|
StopMusic ();
|
||||||
|
|
||||||
|
ingame = false;
|
||||||
|
if (bordertime)
|
||||||
|
{
|
||||||
|
bordertime = 0;
|
||||||
|
VW_ColorBorder (3);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!abortgame)
|
||||||
|
AddPoints (pointsleft);
|
||||||
|
else
|
||||||
|
abortgame = false;
|
||||||
|
}
|
||||||
|
|
||||||
+690
@@ -0,0 +1,690 @@
|
|||||||
|
/* Catacomb 3-D Source Code
|
||||||
|
* Copyright (C) 1993-2014 Flat Rock Software
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along
|
||||||
|
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// C3_SCALE.C
|
||||||
|
|
||||||
|
#include "C3_DEF.H"
|
||||||
|
#pragma hdrstop
|
||||||
|
|
||||||
|
//const unsigned viewheight = 144;
|
||||||
|
const unsigned screenbwide = 40;
|
||||||
|
const byte BACKGROUNDPIX = 5;
|
||||||
|
|
||||||
|
unsigned shapesize[MAXSCALE+1];
|
||||||
|
t_compscale _seg *scaledirectory[MAXSCALE+1];
|
||||||
|
t_compshape _seg *shapedirectory[NUMSCALEPICS];
|
||||||
|
memptr walldirectory[NUMSCALEWALLS];
|
||||||
|
|
||||||
|
/*
|
||||||
|
===========================
|
||||||
|
=
|
||||||
|
= DeplanePic
|
||||||
|
=
|
||||||
|
= Takes a raw bit map of width bytes by height and creates a scaleable shape
|
||||||
|
=
|
||||||
|
= Returns the length of the shape in bytes
|
||||||
|
=
|
||||||
|
= Fills in spotvis (a convenient 64*64 array) with the color values
|
||||||
|
=
|
||||||
|
===========================
|
||||||
|
*/
|
||||||
|
|
||||||
|
void DeplanePic (int picnum)
|
||||||
|
{
|
||||||
|
byte far *plane0,far *plane1,far *plane2,far *plane3;
|
||||||
|
byte by0,by1,by2,by3;
|
||||||
|
unsigned x,y,b,color,shift,width,height;
|
||||||
|
byte *dest;
|
||||||
|
|
||||||
|
//
|
||||||
|
// convert ega pixels to byte color values in a temp buffer
|
||||||
|
//
|
||||||
|
width = pictable[picnum-STARTPICS].width;
|
||||||
|
height = pictable[picnum-STARTPICS].height;
|
||||||
|
|
||||||
|
if (width>64 || height!=64)
|
||||||
|
Quit ("DePlanePic: Bad size shape");
|
||||||
|
|
||||||
|
memset (spotvis,BACKGROUNDPIX,sizeof(spotvis));
|
||||||
|
|
||||||
|
plane0 = (byte _seg *)grsegs[picnum];
|
||||||
|
plane1 = plane0 + width*height;
|
||||||
|
plane2 = plane1 + width*height;
|
||||||
|
plane3 = plane2 + width*height;
|
||||||
|
|
||||||
|
for (y=0;y<height;y++)
|
||||||
|
{
|
||||||
|
dest = &spotvis[y][0];
|
||||||
|
for (x=0;x<width;x++)
|
||||||
|
{
|
||||||
|
by0 = *plane0++;
|
||||||
|
by1 = *plane1++;
|
||||||
|
by2 = *plane2++;
|
||||||
|
by3 = *plane3++;
|
||||||
|
|
||||||
|
for (b=0;b<8;b++)
|
||||||
|
{
|
||||||
|
shift=8-b;
|
||||||
|
|
||||||
|
color = 0;
|
||||||
|
asm mov cl,[BYTE PTR shift]
|
||||||
|
asm mov al,[BYTE PTR by3]
|
||||||
|
asm rcr al,cl;
|
||||||
|
asm rcl [BYTE PTR color],1;
|
||||||
|
|
||||||
|
asm mov cl,[BYTE PTR shift]
|
||||||
|
asm mov al,[BYTE PTR by2]
|
||||||
|
asm rcr al,cl;
|
||||||
|
asm rcl [BYTE PTR color],1;
|
||||||
|
|
||||||
|
asm mov cl,[BYTE PTR shift]
|
||||||
|
asm mov al,[BYTE PTR by1]
|
||||||
|
asm rcr al,cl;
|
||||||
|
asm rcl [BYTE PTR color],1;
|
||||||
|
|
||||||
|
asm mov cl,[BYTE PTR shift]
|
||||||
|
asm mov al,[BYTE PTR by0]
|
||||||
|
asm rcr al,cl;
|
||||||
|
asm rcl [BYTE PTR color],1;
|
||||||
|
|
||||||
|
*dest++ = color;
|
||||||
|
} // B
|
||||||
|
} // X
|
||||||
|
} // Y
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
========================
|
||||||
|
=
|
||||||
|
= BuildCompScale
|
||||||
|
=
|
||||||
|
= Builds a compiled scaler object that will scale a 64 tall object to
|
||||||
|
= the given height (centered vertically on the screen)
|
||||||
|
=
|
||||||
|
= height should be even
|
||||||
|
=
|
||||||
|
= Call with
|
||||||
|
= ---------
|
||||||
|
= DS:SI Source for scale
|
||||||
|
= ES:DI Dest for scale
|
||||||
|
=
|
||||||
|
= Calling the compiled scaler only destroys AL
|
||||||
|
=
|
||||||
|
========================
|
||||||
|
*/
|
||||||
|
|
||||||
|
unsigned BuildCompScale (int height, memptr *finalspot)
|
||||||
|
{
|
||||||
|
t_compscale _seg *work;
|
||||||
|
byte far *code;
|
||||||
|
|
||||||
|
int i;
|
||||||
|
long fix,step;
|
||||||
|
unsigned src,totalscaled,totalsize;
|
||||||
|
int startpix,endpix,toppix;
|
||||||
|
|
||||||
|
|
||||||
|
MM_GetPtr (&(memptr)work,20000);
|
||||||
|
|
||||||
|
step = ((long)height<<16) / 64;
|
||||||
|
code = &work->code[0];
|
||||||
|
toppix = (viewheight-height)/2;
|
||||||
|
fix = 0;
|
||||||
|
|
||||||
|
for (src=0;src<=64;src++)
|
||||||
|
{
|
||||||
|
startpix = fix>>16;
|
||||||
|
fix += step;
|
||||||
|
endpix = fix>>16;
|
||||||
|
|
||||||
|
work->start[src] = startpix;
|
||||||
|
if (endpix>startpix)
|
||||||
|
work->width[src] = endpix-startpix;
|
||||||
|
else
|
||||||
|
work->width[src] = 0;
|
||||||
|
|
||||||
|
//
|
||||||
|
// mark the start of the code
|
||||||
|
//
|
||||||
|
work->codeofs[src] = FP_OFF(code);
|
||||||
|
|
||||||
|
//
|
||||||
|
// compile some code if the source pixel generates any screen pixels
|
||||||
|
//
|
||||||
|
startpix+=toppix;
|
||||||
|
endpix+=toppix;
|
||||||
|
|
||||||
|
if (startpix == endpix || endpix < 0 || startpix >= VIEWHEIGHT || src == 64)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
//
|
||||||
|
// mov al,[si+src]
|
||||||
|
//
|
||||||
|
*code++ = 0x8a;
|
||||||
|
*code++ = 0x44;
|
||||||
|
*code++ = src;
|
||||||
|
|
||||||
|
for (;startpix<endpix;startpix++)
|
||||||
|
{
|
||||||
|
if (startpix >= VIEWHEIGHT)
|
||||||
|
break; // off the bottom of the view area
|
||||||
|
if (startpix < 0)
|
||||||
|
continue; // not into the view area
|
||||||
|
|
||||||
|
//
|
||||||
|
// and [es:di+heightofs],al
|
||||||
|
//
|
||||||
|
*code++ = 0x26;
|
||||||
|
*code++ = 0x20;
|
||||||
|
*code++ = 0x85;
|
||||||
|
*((unsigned far *)code)++ = startpix*screenbwide;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// retf
|
||||||
|
//
|
||||||
|
*code++ = 0xcb;
|
||||||
|
|
||||||
|
totalsize = FP_OFF(code);
|
||||||
|
MM_GetPtr (finalspot,totalsize);
|
||||||
|
_fmemcpy ((byte _seg *)(*finalspot),(byte _seg *)work,totalsize);
|
||||||
|
MM_FreePtr (&(memptr)work);
|
||||||
|
|
||||||
|
return totalsize;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
========================
|
||||||
|
=
|
||||||
|
= BuildCompShape
|
||||||
|
=
|
||||||
|
= typedef struct
|
||||||
|
= {
|
||||||
|
= unsigned width;
|
||||||
|
= unsigned codeofs[64];
|
||||||
|
= } t_compshape;
|
||||||
|
=
|
||||||
|
= Width is the number of compiled line draws in the shape. The shape
|
||||||
|
= drawing code will assume that the midpoint of the shape is in the
|
||||||
|
= middle of the width.
|
||||||
|
=
|
||||||
|
= The non background pixel data will start at codeofs[width], so codeofs
|
||||||
|
= greater than width will be invalid.
|
||||||
|
=
|
||||||
|
= Each code offset will draw one vertical line of the shape, consisting
|
||||||
|
= of 0 or more segments of scaled pixels.
|
||||||
|
=
|
||||||
|
= The scaled shapes use ss:0-4 as a scratch variable for the far call to
|
||||||
|
= the compiled scaler, so zero it back out after the shape is scaled, or
|
||||||
|
= a "null pointer assignment" will result upon termination.
|
||||||
|
=
|
||||||
|
= Setup for a call to a compiled shape
|
||||||
|
= -----------------------------------
|
||||||
|
= ax toast
|
||||||
|
= bx toast
|
||||||
|
= cx toast
|
||||||
|
= dx segment of compiled shape
|
||||||
|
= si toast
|
||||||
|
= di byte at top of view area to draw the line in
|
||||||
|
= bp 0
|
||||||
|
= ss:2 and ds the segment of the compiled scaler to use
|
||||||
|
= es screenseg
|
||||||
|
=
|
||||||
|
= Upon return, ds IS NOT SET to the data segment. Do:
|
||||||
|
= mov ax,ss
|
||||||
|
= mov ds,ax
|
||||||
|
=
|
||||||
|
=
|
||||||
|
= GC_BITMASK set to the pixels to be drawn in the row of bytes under DI
|
||||||
|
= GC_MODE read mode 1, write mode 2
|
||||||
|
= GC_COLORDONTCARE set to 0, so all reads from video memory return 0xff
|
||||||
|
=
|
||||||
|
=
|
||||||
|
= Code generated for each segment
|
||||||
|
= -------------------------------
|
||||||
|
= mov bx,[(segend+1)*2]
|
||||||
|
= mov cx,[bx]
|
||||||
|
= mov [BYTE PTR bx],0xc8 // far return
|
||||||
|
= mov ax,[segstart*2]
|
||||||
|
= mov [ss:0],ax // entry point into the compiled scaler
|
||||||
|
= mov ds,dx // (mov ds,cs) the data is after the compiled code
|
||||||
|
= mov si,ofs data
|
||||||
|
= call [bp] // scale some pixels
|
||||||
|
= mov ds,[bp+2]
|
||||||
|
= mov [bx],cx // un patch return
|
||||||
|
=
|
||||||
|
= Code generated after all segments on a line
|
||||||
|
= -------------------------------------------
|
||||||
|
= retf
|
||||||
|
=
|
||||||
|
========================
|
||||||
|
*/
|
||||||
|
|
||||||
|
unsigned BuildCompShape (t_compshape _seg **finalspot)
|
||||||
|
{
|
||||||
|
t_compshape _seg *work;
|
||||||
|
byte far *code;
|
||||||
|
int firstline,lastline,x,y;
|
||||||
|
unsigned firstpix,lastpix,width;
|
||||||
|
unsigned totalsize,pixelofs;
|
||||||
|
unsigned buff;
|
||||||
|
|
||||||
|
|
||||||
|
// MM_GetPtr (&(memptr)work,20000);
|
||||||
|
EGAWRITEMODE(0);
|
||||||
|
EGAREADMAP(0); // use ega screen memory for temp buffer
|
||||||
|
EGAMAPMASK(1);
|
||||||
|
buff = screenloc[1];
|
||||||
|
work = (t_compshape _seg *)(0xa000+(buff+15)/16);
|
||||||
|
|
||||||
|
//
|
||||||
|
// find the width of the shape
|
||||||
|
//
|
||||||
|
firstline = -1;
|
||||||
|
x=0;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
for (y=0;y<64;y++)
|
||||||
|
if (spotvis[y][x] != BACKGROUNDPIX)
|
||||||
|
{
|
||||||
|
firstline = x;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (++x == 64)
|
||||||
|
Quit ("BuildCompShape: No shape data!");
|
||||||
|
} while (firstline == -1);
|
||||||
|
|
||||||
|
lastline = -1;
|
||||||
|
x=63;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
for (y=0;y<64;y++)
|
||||||
|
if (spotvis[y][x] != BACKGROUNDPIX)
|
||||||
|
{
|
||||||
|
lastline = x;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
x--;
|
||||||
|
} while (lastline == -1);
|
||||||
|
|
||||||
|
width = lastline-firstline+1;
|
||||||
|
|
||||||
|
work->width = width;
|
||||||
|
code = (byte far *)&work->codeofs[width];
|
||||||
|
|
||||||
|
//
|
||||||
|
// copy all non background pixels to the work space
|
||||||
|
//
|
||||||
|
pixelofs = FP_OFF(code);
|
||||||
|
|
||||||
|
for (x=firstline;x<=lastline;x++)
|
||||||
|
for (y=0;y<64;y++)
|
||||||
|
if (spotvis[y][x] != BACKGROUNDPIX)
|
||||||
|
*code++ = spotvis[y][x];
|
||||||
|
|
||||||
|
//
|
||||||
|
// start compiling the vertical lines
|
||||||
|
//
|
||||||
|
for (x=firstline;x<=lastline;x++)
|
||||||
|
{
|
||||||
|
work->codeofs[x-firstline] = FP_OFF(code);
|
||||||
|
|
||||||
|
y=0;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// scan past black background pixels
|
||||||
|
//
|
||||||
|
while (spotvis[y][x] == BACKGROUNDPIX && y<64)
|
||||||
|
y++;
|
||||||
|
|
||||||
|
if (y>63) // no more segments
|
||||||
|
break;
|
||||||
|
|
||||||
|
firstpix = y+1; // +1 because width is before codeofs
|
||||||
|
|
||||||
|
//
|
||||||
|
// scan past scalable pixels
|
||||||
|
//
|
||||||
|
while (spotvis[y][x] != BACKGROUNDPIX && y<64)
|
||||||
|
y++;
|
||||||
|
|
||||||
|
if (y>63)
|
||||||
|
lastpix = 65;
|
||||||
|
else
|
||||||
|
lastpix = y+1; // actually one pixel past the last displayed
|
||||||
|
|
||||||
|
//
|
||||||
|
// compile the scale call
|
||||||
|
//
|
||||||
|
*code++ = 0x8b; // mov bx,[lastpix*2]
|
||||||
|
*code++ = 0x1e;
|
||||||
|
*((unsigned far *)code)++ = lastpix*2;
|
||||||
|
|
||||||
|
*code++ = 0x8b; // mov cx,[bx]
|
||||||
|
*code++ = 0x0f;
|
||||||
|
|
||||||
|
*code++ = 0xc6; // move [BYTE bx],0xcb
|
||||||
|
*code++ = 0x07;
|
||||||
|
*code++ = 0xcb;
|
||||||
|
|
||||||
|
*code++ = 0xa1; // mov ax,[firstpix*2] /*************
|
||||||
|
*((unsigned far *)code)++ = firstpix*2;
|
||||||
|
|
||||||
|
*code++ = 0x36; // mov [ss:0],ax
|
||||||
|
*code++ = 0xa3;
|
||||||
|
*code++ = 0x00;
|
||||||
|
*code++ = 0x00;
|
||||||
|
|
||||||
|
*code++ = 0x8e; // mov ds,dx (mov ds,cs)
|
||||||
|
*code++ = 0xda;
|
||||||
|
|
||||||
|
*code++ = 0xbe; // mov si,OFFSET pixelofs-firstpixel
|
||||||
|
*((unsigned far *)code)++ = pixelofs-firstpix;
|
||||||
|
|
||||||
|
*code++ = 0xff; // call [DWORD bp]
|
||||||
|
*code++ = 0x5e;
|
||||||
|
*code++ = 0x00;
|
||||||
|
|
||||||
|
*code++ = 0x8e; // mov ds,[bp+2]
|
||||||
|
*code++ = 0x5e;
|
||||||
|
*code++ = 0x02;
|
||||||
|
|
||||||
|
*code++ = 0x89; // mov [bx],cx
|
||||||
|
*code++ = 0x0f;
|
||||||
|
|
||||||
|
pixelofs += (lastpix-firstpix);
|
||||||
|
} while (y<63);
|
||||||
|
|
||||||
|
//
|
||||||
|
// retf
|
||||||
|
//
|
||||||
|
*code++ = 0xcb;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// copy the final shape to a properly sized buffer
|
||||||
|
//
|
||||||
|
totalsize = FP_OFF(code);
|
||||||
|
MM_GetPtr ((memptr *)finalspot,totalsize);
|
||||||
|
_fmemcpy ((byte _seg *)(*finalspot),(byte _seg *)work,totalsize);
|
||||||
|
// MM_FreePtr (&(memptr)work);
|
||||||
|
|
||||||
|
return totalsize;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
=======================
|
||||||
|
=
|
||||||
|
= ScaleShape
|
||||||
|
=
|
||||||
|
= Draws a compiled shape at [scale] pixels high
|
||||||
|
=
|
||||||
|
= Setup for call
|
||||||
|
= --------------
|
||||||
|
= GC_MODE read mode 1, write mode 2
|
||||||
|
= GC_COLORDONTCARE set to 0, so all reads from video memory return 0xff
|
||||||
|
= GC_INDEX pointing at GC_BITMASK
|
||||||
|
=
|
||||||
|
=======================
|
||||||
|
*/
|
||||||
|
|
||||||
|
static long longtemp;
|
||||||
|
|
||||||
|
void ScaleShape (int xcenter, t_compshape _seg *compshape, unsigned scale)
|
||||||
|
{
|
||||||
|
t_compscale _seg *comptable;
|
||||||
|
unsigned width,scalewidth;
|
||||||
|
int x,pixel,lastpixel,pixwidth,min;
|
||||||
|
unsigned far *codehandle, far *widthptr;
|
||||||
|
unsigned badcodeptr;
|
||||||
|
int rightclip;
|
||||||
|
|
||||||
|
if (!compshape)
|
||||||
|
Quit ("ScaleShape: NULL compshape ptr!");
|
||||||
|
|
||||||
|
scale = (scale+1)/2;
|
||||||
|
if (!scale)
|
||||||
|
return; // too far away
|
||||||
|
if (scale>MAXSCALE)
|
||||||
|
scale = MAXSCALE;
|
||||||
|
comptable = scaledirectory[scale];
|
||||||
|
|
||||||
|
width = compshape->width;
|
||||||
|
scalewidth = comptable->start[width];
|
||||||
|
|
||||||
|
pixel = xcenter - scalewidth/2;
|
||||||
|
lastpixel = pixel+scalewidth-1;
|
||||||
|
if (pixel >= VIEWWIDTH || lastpixel < 0)
|
||||||
|
return; // totally off screen
|
||||||
|
|
||||||
|
//
|
||||||
|
// scan backwards from the right edge until pixels are visable
|
||||||
|
// rightclip is the first NON VISABLE pixel
|
||||||
|
//
|
||||||
|
if (lastpixel>=VIEWWIDTH-1)
|
||||||
|
rightclip = VIEWWIDTH-1;
|
||||||
|
else
|
||||||
|
rightclip = lastpixel;
|
||||||
|
|
||||||
|
if (zbuffer[rightclip]>scale)
|
||||||
|
{
|
||||||
|
if (pixel>0)
|
||||||
|
min = pixel;
|
||||||
|
else
|
||||||
|
min = 0;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (--rightclip < min)
|
||||||
|
return; // totally covered or before 0
|
||||||
|
if (zbuffer[rightclip]<=scale)
|
||||||
|
break;
|
||||||
|
} while (1);
|
||||||
|
}
|
||||||
|
rightclip++;
|
||||||
|
|
||||||
|
//
|
||||||
|
// scan from the left until it is on screen, leaving
|
||||||
|
// [pixel],[pixwidth],[codehandle],and [widthptr] set correctly
|
||||||
|
//
|
||||||
|
*(((unsigned *)&longtemp)+1) = (unsigned)compshape; // seg of shape
|
||||||
|
codehandle = &compshape->codeofs[0];
|
||||||
|
badcodeptr = compshape->codeofs[width];
|
||||||
|
widthptr = &comptable->width[0];
|
||||||
|
asm mov ax,[comptable]
|
||||||
|
asm mov WORD PTR [2],ax // ds:0-4 is used as a far call pointer
|
||||||
|
// by the compiled shapes
|
||||||
|
pixwidth = *widthptr; // scaled width of this pixel
|
||||||
|
while (!pixwidth)
|
||||||
|
{
|
||||||
|
pixwidth = *++widthptr; // find the first visable pixel
|
||||||
|
codehandle++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pixel<0)
|
||||||
|
{
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (pixel+pixwidth>0)
|
||||||
|
{
|
||||||
|
pixwidth += pixel;
|
||||||
|
pixel = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
do
|
||||||
|
{
|
||||||
|
pixwidth = *++widthptr;
|
||||||
|
codehandle++;
|
||||||
|
} while (!pixwidth);
|
||||||
|
pixel+=pixwidth;
|
||||||
|
} while (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// scan until it is visable, leaving
|
||||||
|
// [pixel],[pixwidth],[codehandle],and [widthptr] set correctly
|
||||||
|
//
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (zbuffer[pixel] <= scale)
|
||||||
|
break; // start drawing here
|
||||||
|
pixel++;
|
||||||
|
if (!--pixwidth)
|
||||||
|
{
|
||||||
|
do
|
||||||
|
{
|
||||||
|
pixwidth = *++widthptr;
|
||||||
|
codehandle++;
|
||||||
|
} while (!pixwidth);
|
||||||
|
}
|
||||||
|
} while (1);
|
||||||
|
|
||||||
|
if (pixel+pixwidth>rightclip)
|
||||||
|
pixwidth = rightclip-pixel;
|
||||||
|
//
|
||||||
|
// draw lines
|
||||||
|
//
|
||||||
|
do // while (1)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// scale a vertical segment [pixwidth] pixels wide at [pixel]
|
||||||
|
//
|
||||||
|
(unsigned)longtemp = *codehandle; // offset of compiled code
|
||||||
|
if ((unsigned)longtemp == badcodeptr)
|
||||||
|
Quit ("ScaleShape: codehandle past end!");
|
||||||
|
|
||||||
|
asm mov bx,[pixel]
|
||||||
|
asm mov di,bx
|
||||||
|
asm shr di,1
|
||||||
|
asm shr di,1
|
||||||
|
asm shr di,1 // X in bytes
|
||||||
|
asm add di,[bufferofs]
|
||||||
|
asm and bx,7
|
||||||
|
asm shl bx,1
|
||||||
|
asm shl bx,1
|
||||||
|
asm shl bx,1
|
||||||
|
asm add bx,[pixwidth] // bx = pixel*8+pixwidth-1
|
||||||
|
asm dec bx
|
||||||
|
asm push bx
|
||||||
|
asm mov al,BYTE PTR [bitmasks1+bx]
|
||||||
|
asm mov dx,GC_INDEX+1
|
||||||
|
asm out dx,al // set bit mask register
|
||||||
|
|
||||||
|
asm mov es,[screenseg]
|
||||||
|
asm push si
|
||||||
|
asm push di
|
||||||
|
asm push bp
|
||||||
|
asm xor bp,bp
|
||||||
|
asm mov dx,[WORD PTR longtemp+2]
|
||||||
|
asm mov ds,[2]
|
||||||
|
asm call ss:[DWORD PTR longtemp] // scale the line of pixels
|
||||||
|
asm mov ax,ss
|
||||||
|
asm mov ds,ax
|
||||||
|
asm pop bp
|
||||||
|
asm pop di
|
||||||
|
asm pop si
|
||||||
|
|
||||||
|
asm pop bx
|
||||||
|
asm mov al,BYTE PTR [bitmasks2+bx]
|
||||||
|
asm or al,al
|
||||||
|
asm jz nosecond
|
||||||
|
|
||||||
|
//
|
||||||
|
// draw a second byte for vertical strips that cross two bytes
|
||||||
|
//
|
||||||
|
asm inc di
|
||||||
|
asm mov dx,GC_INDEX+1
|
||||||
|
asm out dx,al // set bit mask register
|
||||||
|
asm push si
|
||||||
|
asm push di
|
||||||
|
asm push bp
|
||||||
|
asm xor bp,bp
|
||||||
|
asm mov dx,[WORD PTR longtemp+2]
|
||||||
|
asm mov ds,[2]
|
||||||
|
asm call ss:[DWORD PTR longtemp] // scale the line of pixels
|
||||||
|
asm mov ax,ss
|
||||||
|
asm mov ds,ax
|
||||||
|
asm pop bp
|
||||||
|
asm pop di
|
||||||
|
asm pop si
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// advance to the next drawn line
|
||||||
|
//
|
||||||
|
nosecond:;
|
||||||
|
if ( (pixel+=pixwidth) == rightclip )
|
||||||
|
{
|
||||||
|
asm mov WORD PTR [0],0
|
||||||
|
asm mov WORD PTR [2],0
|
||||||
|
return; // all done!
|
||||||
|
}
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
pixwidth = *++widthptr;
|
||||||
|
codehandle++;
|
||||||
|
} while (!pixwidth);
|
||||||
|
|
||||||
|
if (pixel+pixwidth > rightclip)
|
||||||
|
pixwidth = rightclip-pixel;
|
||||||
|
|
||||||
|
} while (1);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// bit mask tables for drawing scaled strips up to eight pixels wide
|
||||||
|
//
|
||||||
|
|
||||||
|
byte bitmasks1[8][8] = {
|
||||||
|
{0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff},
|
||||||
|
{0x40,0x60,0x70,0x78,0x7c,0x7e,0x7f,0x7f},
|
||||||
|
{0x20,0x30,0x38,0x3c,0x3e,0x3f,0x3f,0x3f},
|
||||||
|
{0x10,0x18,0x1c,0x1e,0x1f,0x1f,0x1f,0x1f},
|
||||||
|
{0x8,0xc,0xe,0xf,0xf,0xf,0xf,0xf},
|
||||||
|
{0x4,0x6,0x7,0x7,0x7,0x7,0x7,0x7},
|
||||||
|
{0x2,0x3,0x3,0x3,0x3,0x3,0x3,0x3},
|
||||||
|
{0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1} };
|
||||||
|
|
||||||
|
byte bitmasks2[8][8] = {
|
||||||
|
{0,0,0,0,0,0,0,0},
|
||||||
|
{0,0,0,0,0,0,0,0x80},
|
||||||
|
{0,0,0,0,0,0,0x80,0xc0},
|
||||||
|
{0,0,0,0,0,0x80,0xc0,0xe0},
|
||||||
|
{0,0,0,0,0x80,0xc0,0xe0,0xf0},
|
||||||
|
{0,0,0,0x80,0xc0,0xe0,0xf0,0xf8},
|
||||||
|
{0,0,0x80,0xc0,0xe0,0xf0,0xf8,0xfc},
|
||||||
|
{0,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe} };
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
+153
@@ -0,0 +1,153 @@
|
|||||||
|
; Catacomb 3-D Source Code
|
||||||
|
; Copyright (C) 1993-2014 Flat Rock Software
|
||||||
|
;
|
||||||
|
; This program is free software; you can redistribute it and/or modify
|
||||||
|
; it under the terms of the GNU General Public License as published by
|
||||||
|
; the Free Software Foundation; either version 2 of the License, or
|
||||||
|
; (at your option) any later version.
|
||||||
|
;
|
||||||
|
; This program is distributed in the hope that it will be useful,
|
||||||
|
; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
; GNU General Public License for more details.
|
||||||
|
;
|
||||||
|
; You should have received a copy of the GNU General Public License along
|
||||||
|
; with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
; 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
|
||||||
|
IDEAL
|
||||||
|
MODEL MEDIUM,C
|
||||||
|
|
||||||
|
include "ID_ASM.EQU"
|
||||||
|
|
||||||
|
;===========================================================================
|
||||||
|
;
|
||||||
|
; SCALING GRAPHICS
|
||||||
|
;
|
||||||
|
;===========================================================================
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
MACRO MAKELAB NUM
|
||||||
|
|
||||||
|
lab&NUM:
|
||||||
|
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
MACRO MAKEREF NUM
|
||||||
|
|
||||||
|
dw OFFSET lab&NUM
|
||||||
|
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
|
||||||
|
;=========================================================================
|
||||||
|
|
||||||
|
MAXSCALES equ 256
|
||||||
|
|
||||||
|
DATASEG
|
||||||
|
|
||||||
|
EXTRN screenseg:WORD
|
||||||
|
EXTRN linewidth:WORD
|
||||||
|
|
||||||
|
LABEL endtable WORD
|
||||||
|
labcount = 0
|
||||||
|
REPT MAXSCALES
|
||||||
|
MAKEREF %labcount
|
||||||
|
labcount = labcount + 1
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
|
||||||
|
CODESEG
|
||||||
|
|
||||||
|
;==================================================
|
||||||
|
;
|
||||||
|
; void scaleline (int scale, unsigned picseg, unsigned maskseg,
|
||||||
|
; unsigned screen, unsigned width)
|
||||||
|
;
|
||||||
|
;==================================================
|
||||||
|
|
||||||
|
PROC ScaleLine pixels:word, scaleptr:dword, picptr:dword, screen:word
|
||||||
|
USES si,di
|
||||||
|
PUBLIC ScaleLine
|
||||||
|
|
||||||
|
;
|
||||||
|
; modify doline procedure for proper width
|
||||||
|
;
|
||||||
|
mov bx,[pixels]
|
||||||
|
cmp bx,MAXSCALES
|
||||||
|
jbe @@scaleok
|
||||||
|
mov bx,MAXSCALES
|
||||||
|
@@scaleok:
|
||||||
|
shl bx,1
|
||||||
|
mov bx,[endtable+bx]
|
||||||
|
push [cs:bx] ;save the code that will be modified over
|
||||||
|
mov [WORD cs:bx],0d18eh ;mov ss,cx
|
||||||
|
push [cs:bx+2] ;save the code that will be modified over
|
||||||
|
mov [WORD cs:bx+2],90c3h ;ret / nop
|
||||||
|
push bx
|
||||||
|
|
||||||
|
mov dx,[linewidth]
|
||||||
|
|
||||||
|
mov di,[WORD screen]
|
||||||
|
mov es,[screenseg]
|
||||||
|
|
||||||
|
mov si,[WORD scaleptr]
|
||||||
|
mov ds,[WORD scaleptr+2]
|
||||||
|
|
||||||
|
mov bx,[WORD picptr]
|
||||||
|
mov ax,[WORD picptr+2] ;will be moved into ss after call
|
||||||
|
|
||||||
|
mov bp,bx
|
||||||
|
|
||||||
|
cli
|
||||||
|
call doline
|
||||||
|
sti
|
||||||
|
;
|
||||||
|
; restore doline to regular state
|
||||||
|
;
|
||||||
|
pop bx ;address of modified code
|
||||||
|
pop [cs:bx+2]
|
||||||
|
pop [cs:bx]
|
||||||
|
|
||||||
|
mov ax,ss
|
||||||
|
mov ds,ax
|
||||||
|
ret
|
||||||
|
|
||||||
|
;================
|
||||||
|
;
|
||||||
|
; doline
|
||||||
|
;
|
||||||
|
; Big unwound scaling routine
|
||||||
|
;
|
||||||
|
; ds:si = scale table
|
||||||
|
; ss:bx = pic data
|
||||||
|
; es:di = screen location
|
||||||
|
;
|
||||||
|
;================
|
||||||
|
|
||||||
|
doline:
|
||||||
|
|
||||||
|
mov cx,ss
|
||||||
|
mov ss,ax ;can't call a routine with ss used...
|
||||||
|
|
||||||
|
labcount = 0
|
||||||
|
|
||||||
|
REPT MAXSCALES
|
||||||
|
|
||||||
|
MAKELAB %labcount
|
||||||
|
labcount = labcount + 1
|
||||||
|
|
||||||
|
lodsb ; get scaled pixel number
|
||||||
|
xlat [ss:bx] ; look it up in the picture
|
||||||
|
xchg [es:di],al ; load latches and write pixel to screen
|
||||||
|
add di,dx ; down to next line
|
||||||
|
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
mov ss,cx
|
||||||
|
ret
|
||||||
|
|
||||||
|
ENDP
|
||||||
|
|
||||||
|
END
|
||||||
+546
@@ -0,0 +1,546 @@
|
|||||||
|
/* Catacomb 3-D Source Code
|
||||||
|
* Copyright (C) 1993-2014 Flat Rock Software
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along
|
||||||
|
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// C3_STATE.C
|
||||||
|
|
||||||
|
#include "C3_DEF.H"
|
||||||
|
#pragma hdrstop
|
||||||
|
|
||||||
|
/*
|
||||||
|
=============================================================================
|
||||||
|
|
||||||
|
LOCAL CONSTANTS
|
||||||
|
|
||||||
|
=============================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
=============================================================================
|
||||||
|
|
||||||
|
GLOBAL VARIABLES
|
||||||
|
|
||||||
|
=============================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
=============================================================================
|
||||||
|
|
||||||
|
LOCAL VARIABLES
|
||||||
|
|
||||||
|
=============================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
dirtype opposite[9] =
|
||||||
|
{south,west,north,east,southwest,northwest,northeast,southeast,nodir};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
===================
|
||||||
|
=
|
||||||
|
= SpawnNewObj
|
||||||
|
=
|
||||||
|
===================
|
||||||
|
*/
|
||||||
|
|
||||||
|
void SpawnNewObj (unsigned x, unsigned y, statetype *state, unsigned size)
|
||||||
|
{
|
||||||
|
GetNewObj (false);
|
||||||
|
new->size = size;
|
||||||
|
new->state = state;
|
||||||
|
new->ticcount = random (state->tictime)+1;
|
||||||
|
|
||||||
|
new->tilex = x;
|
||||||
|
new->tiley = y;
|
||||||
|
new->x = ((long)x<<TILESHIFT)+TILEGLOBAL/2;
|
||||||
|
new->y = ((long)y<<TILESHIFT)+TILEGLOBAL/2;
|
||||||
|
CalcBounds(new);
|
||||||
|
new->dir = nodir;
|
||||||
|
|
||||||
|
actorat[new->tilex][new->tiley] = new;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SpawnNewObjFrac (long x, long y, statetype *state, unsigned size)
|
||||||
|
{
|
||||||
|
GetNewObj (false);
|
||||||
|
new->size = size;
|
||||||
|
new->state = state;
|
||||||
|
new->ticcount = random (state->tictime)+1;
|
||||||
|
new->active = true;
|
||||||
|
|
||||||
|
new->x = x;
|
||||||
|
new->y = y;
|
||||||
|
new->tilex = x>>TILESHIFT;
|
||||||
|
new->tiley = y>>TILESHIFT;
|
||||||
|
CalcBounds(new);
|
||||||
|
new->distance = 100;
|
||||||
|
new->dir = nodir;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
===================
|
||||||
|
=
|
||||||
|
= CheckHandAttack
|
||||||
|
=
|
||||||
|
= If the object can move next to the player, it will return true
|
||||||
|
=
|
||||||
|
===================
|
||||||
|
*/
|
||||||
|
|
||||||
|
boolean CheckHandAttack (objtype *ob)
|
||||||
|
{
|
||||||
|
long deltax,deltay,size;
|
||||||
|
|
||||||
|
size = (long)ob->size + player->size + ob->speed*tics;
|
||||||
|
deltax = ob->x - player->x;
|
||||||
|
deltay = ob->y - player->y;
|
||||||
|
|
||||||
|
if (deltax > size || deltax < -size || deltay > size || deltay < -size)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
===================
|
||||||
|
=
|
||||||
|
= T_DoDamage
|
||||||
|
=
|
||||||
|
= Attacks the player if still nearby, then immediately changes to next state
|
||||||
|
=
|
||||||
|
===================
|
||||||
|
*/
|
||||||
|
|
||||||
|
void T_DoDamage (objtype *ob)
|
||||||
|
{
|
||||||
|
int points;
|
||||||
|
|
||||||
|
|
||||||
|
if (!CheckHandAttack (ob))
|
||||||
|
{
|
||||||
|
SD_PlaySound (MONSTERMISSSND);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
points = 0;
|
||||||
|
|
||||||
|
switch (ob->obclass)
|
||||||
|
{
|
||||||
|
case orcobj:
|
||||||
|
points = 4;
|
||||||
|
break;
|
||||||
|
case trollobj:
|
||||||
|
points = 8;
|
||||||
|
break;
|
||||||
|
case demonobj:
|
||||||
|
points = 15;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
TakeDamage (points);
|
||||||
|
}
|
||||||
|
|
||||||
|
ob->state = ob->state->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//==========================================================================
|
||||||
|
|
||||||
|
/*
|
||||||
|
==================================
|
||||||
|
=
|
||||||
|
= Walk
|
||||||
|
=
|
||||||
|
==================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
boolean Walk (objtype *ob)
|
||||||
|
{
|
||||||
|
switch (ob->dir)
|
||||||
|
{
|
||||||
|
case north:
|
||||||
|
if (actorat[ob->tilex][ob->tiley-1])
|
||||||
|
return false;
|
||||||
|
ob->tiley--;
|
||||||
|
ob->distance = TILEGLOBAL;
|
||||||
|
return true;
|
||||||
|
|
||||||
|
case northeast:
|
||||||
|
if (actorat[ob->tilex+1][ob->tiley-1])
|
||||||
|
return false;
|
||||||
|
ob->tilex++;
|
||||||
|
ob->tiley--;
|
||||||
|
ob->distance = TILEGLOBAL;
|
||||||
|
return true;
|
||||||
|
|
||||||
|
case east:
|
||||||
|
if (actorat[ob->tilex+1][ob->tiley])
|
||||||
|
return false;
|
||||||
|
ob->tilex++;
|
||||||
|
ob->distance = TILEGLOBAL;
|
||||||
|
return true;
|
||||||
|
|
||||||
|
case southeast:
|
||||||
|
if (actorat[ob->tilex+1][ob->tiley+1])
|
||||||
|
return false;
|
||||||
|
ob->tilex++;
|
||||||
|
ob->tiley++;
|
||||||
|
ob->distance = TILEGLOBAL;
|
||||||
|
return true;
|
||||||
|
|
||||||
|
case south:
|
||||||
|
if (actorat[ob->tilex][ob->tiley+1])
|
||||||
|
return false;
|
||||||
|
ob->tiley++;
|
||||||
|
ob->distance = TILEGLOBAL;
|
||||||
|
return true;
|
||||||
|
|
||||||
|
case southwest:
|
||||||
|
if (actorat[ob->tilex-1][ob->tiley+1])
|
||||||
|
return false;
|
||||||
|
ob->tilex--;
|
||||||
|
ob->tiley++;
|
||||||
|
ob->distance = TILEGLOBAL;
|
||||||
|
return true;
|
||||||
|
|
||||||
|
case west:
|
||||||
|
if (actorat[ob->tilex-1][ob->tiley])
|
||||||
|
return false;
|
||||||
|
ob->tilex--;
|
||||||
|
ob->distance = TILEGLOBAL;
|
||||||
|
return true;
|
||||||
|
|
||||||
|
case northwest:
|
||||||
|
if (actorat[ob->tilex-1][ob->tiley-1])
|
||||||
|
return false;
|
||||||
|
ob->tilex--;
|
||||||
|
ob->tiley--;
|
||||||
|
ob->distance = TILEGLOBAL;
|
||||||
|
return true;
|
||||||
|
|
||||||
|
case nodir:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
Quit ("Walk: Bad dir");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
==================================
|
||||||
|
=
|
||||||
|
= ChaseThink
|
||||||
|
= have the current monster go after the player,
|
||||||
|
= either diagonally or straight on
|
||||||
|
=
|
||||||
|
==================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
void ChaseThink (objtype *obj, boolean diagonal)
|
||||||
|
{
|
||||||
|
int deltax,deltay,i;
|
||||||
|
dirtype d[3];
|
||||||
|
dirtype tdir, olddir, turnaround;
|
||||||
|
|
||||||
|
|
||||||
|
olddir=obj->dir;
|
||||||
|
turnaround=opposite[olddir];
|
||||||
|
|
||||||
|
deltax=player->tilex - obj->tilex;
|
||||||
|
deltay=player->tiley - obj->tiley;
|
||||||
|
|
||||||
|
d[1]=nodir;
|
||||||
|
d[2]=nodir;
|
||||||
|
|
||||||
|
if (deltax>0)
|
||||||
|
d[1]= east;
|
||||||
|
if (deltax<0)
|
||||||
|
d[1]= west;
|
||||||
|
if (deltay>0)
|
||||||
|
d[2]=south;
|
||||||
|
if (deltay<0)
|
||||||
|
d[2]=north;
|
||||||
|
|
||||||
|
if (abs(deltay)>abs(deltax))
|
||||||
|
{
|
||||||
|
tdir=d[1];
|
||||||
|
d[1]=d[2];
|
||||||
|
d[2]=tdir;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (d[1]==turnaround)
|
||||||
|
d[1]=nodir;
|
||||||
|
if (d[2]==turnaround)
|
||||||
|
d[2]=nodir;
|
||||||
|
|
||||||
|
|
||||||
|
if (diagonal)
|
||||||
|
{ /*ramdiagonals try the best dir first*/
|
||||||
|
if (d[1]!=nodir)
|
||||||
|
{
|
||||||
|
obj->dir=d[1];
|
||||||
|
if (Walk(obj))
|
||||||
|
return; /*either moved forward or attacked*/
|
||||||
|
}
|
||||||
|
|
||||||
|
if (d[2]!=nodir)
|
||||||
|
{
|
||||||
|
obj->dir=d[2];
|
||||||
|
if (Walk(obj))
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{ /*ramstraights try the second best dir first*/
|
||||||
|
|
||||||
|
if (d[2]!=nodir)
|
||||||
|
{
|
||||||
|
obj->dir=d[2];
|
||||||
|
if (Walk(obj))
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (d[1]!=nodir)
|
||||||
|
{
|
||||||
|
obj->dir=d[1];
|
||||||
|
if (Walk(obj))
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* there is no direct path to the player, so pick another direction */
|
||||||
|
|
||||||
|
obj->dir=olddir;
|
||||||
|
if (Walk(obj))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (US_RndT()>128) /*randomly determine direction of search*/
|
||||||
|
{
|
||||||
|
for (tdir=north;tdir<=west;tdir++)
|
||||||
|
{
|
||||||
|
if (tdir!=turnaround)
|
||||||
|
{
|
||||||
|
obj->dir=tdir;
|
||||||
|
if (Walk(obj))
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for (tdir=west;tdir>=north;tdir--)
|
||||||
|
{
|
||||||
|
if (tdir!=turnaround)
|
||||||
|
{
|
||||||
|
obj->dir=tdir;
|
||||||
|
if (Walk(obj))
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
obj->dir=turnaround;
|
||||||
|
Walk(obj); /*last chance, don't worry about returned value*/
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
=================
|
||||||
|
=
|
||||||
|
= MoveObj
|
||||||
|
=
|
||||||
|
=================
|
||||||
|
*/
|
||||||
|
|
||||||
|
void MoveObj (objtype *ob, long move)
|
||||||
|
{
|
||||||
|
ob->distance -=move;
|
||||||
|
|
||||||
|
switch (ob->dir)
|
||||||
|
{
|
||||||
|
case north:
|
||||||
|
ob->y -= move;
|
||||||
|
return;
|
||||||
|
case northeast:
|
||||||
|
ob->x += move;
|
||||||
|
ob->y -= move;
|
||||||
|
return;
|
||||||
|
case east:
|
||||||
|
ob->x += move;
|
||||||
|
return;
|
||||||
|
case southeast:
|
||||||
|
ob->x += move;
|
||||||
|
ob->y += move;
|
||||||
|
return;
|
||||||
|
case south:
|
||||||
|
ob->y += move;
|
||||||
|
return;
|
||||||
|
case southwest:
|
||||||
|
ob->x -= move;
|
||||||
|
ob->y += move;
|
||||||
|
return;
|
||||||
|
case west:
|
||||||
|
ob->x -= move;
|
||||||
|
return;
|
||||||
|
case northwest:
|
||||||
|
ob->x -= move;
|
||||||
|
ob->y -= move;
|
||||||
|
return;
|
||||||
|
|
||||||
|
case nodir:
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
=================
|
||||||
|
=
|
||||||
|
= Chase
|
||||||
|
=
|
||||||
|
= returns true if hand attack range
|
||||||
|
=
|
||||||
|
=================
|
||||||
|
*/
|
||||||
|
|
||||||
|
boolean Chase (objtype *ob, boolean diagonal)
|
||||||
|
{
|
||||||
|
long move;
|
||||||
|
long deltax,deltay,size;
|
||||||
|
|
||||||
|
move = ob->speed*tics;
|
||||||
|
size = (long)ob->size + player->size + move;
|
||||||
|
|
||||||
|
while (move)
|
||||||
|
{
|
||||||
|
deltax = ob->x - player->x;
|
||||||
|
deltay = ob->y - player->y;
|
||||||
|
|
||||||
|
if (deltax <= size && deltax >= -size
|
||||||
|
&& deltay <= size && deltay >= -size)
|
||||||
|
{
|
||||||
|
CalcBounds (ob);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (move < ob->distance)
|
||||||
|
{
|
||||||
|
MoveObj (ob,move);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
actorat[ob->tilex][ob->tiley] = 0; // pick up marker from goal
|
||||||
|
if (ob->dir == nodir)
|
||||||
|
ob->dir = north;
|
||||||
|
|
||||||
|
ob->x = ((long)ob->tilex<<TILESHIFT)+TILEGLOBAL/2;
|
||||||
|
ob->y = ((long)ob->tiley<<TILESHIFT)+TILEGLOBAL/2;
|
||||||
|
move -= ob->distance;
|
||||||
|
|
||||||
|
ChaseThink (ob,diagonal);
|
||||||
|
if (!ob->distance)
|
||||||
|
break; // no possible move
|
||||||
|
actorat[ob->tilex][ob->tiley] = ob; // set down a new goal marker
|
||||||
|
}
|
||||||
|
CalcBounds (ob);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
===================
|
||||||
|
=
|
||||||
|
= ShootActor
|
||||||
|
=
|
||||||
|
===================
|
||||||
|
*/
|
||||||
|
|
||||||
|
void ShootActor (objtype *ob, unsigned damage)
|
||||||
|
{
|
||||||
|
ob->hitpoints -= damage;
|
||||||
|
if (ob->hitpoints<=0)
|
||||||
|
{
|
||||||
|
switch (ob->obclass)
|
||||||
|
{
|
||||||
|
case orcobj:
|
||||||
|
ob->state = &s_orcdie1;
|
||||||
|
GivePoints (100);
|
||||||
|
break;
|
||||||
|
case trollobj:
|
||||||
|
ob->state = &s_trolldie1;
|
||||||
|
GivePoints (400);
|
||||||
|
break;
|
||||||
|
case demonobj:
|
||||||
|
ob->state = &s_demondie1;
|
||||||
|
GivePoints (1000);
|
||||||
|
break;
|
||||||
|
case mageobj:
|
||||||
|
ob->state = &s_magedie1;
|
||||||
|
GivePoints (600);
|
||||||
|
break;
|
||||||
|
case batobj:
|
||||||
|
ob->state = &s_batdie1;
|
||||||
|
GivePoints (100);
|
||||||
|
break;
|
||||||
|
case grelmobj:
|
||||||
|
ob->state = &s_greldie1;
|
||||||
|
GivePoints (10000);
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
ob->obclass = inertobj;
|
||||||
|
ob->shootable = false;
|
||||||
|
actorat[ob->tilex][ob->tiley] = NULL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
switch (ob->obclass)
|
||||||
|
{
|
||||||
|
case orcobj:
|
||||||
|
ob->state = &s_orcouch;
|
||||||
|
break;
|
||||||
|
case trollobj:
|
||||||
|
ob->state = &s_trollouch;
|
||||||
|
break;
|
||||||
|
case demonobj:
|
||||||
|
ob->state = &s_demonouch;
|
||||||
|
break;
|
||||||
|
case mageobj:
|
||||||
|
ob->state = &s_mageouch;
|
||||||
|
break;
|
||||||
|
case grelmobj:
|
||||||
|
ob->state = &s_grelouch;
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ob->ticcount = ob->state->tictime;
|
||||||
|
}
|
||||||
|
|
||||||
+872
@@ -0,0 +1,872 @@
|
|||||||
|
/* Catacomb 3-D Source Code
|
||||||
|
* Copyright (C) 1993-2014 Flat Rock Software
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along
|
||||||
|
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// C3_TRACE.C
|
||||||
|
|
||||||
|
#include "C3_DEF.H"
|
||||||
|
#pragma hdrstop
|
||||||
|
|
||||||
|
/*
|
||||||
|
=============================================================================
|
||||||
|
|
||||||
|
LOCAL CONSTANTS
|
||||||
|
|
||||||
|
=============================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// TESTWALLVISABLE will set the global variable wallvisable to 1 or 0
|
||||||
|
// depending on if tile.x,tile.y,wallon is visable from focal point
|
||||||
|
//
|
||||||
|
#define TESTWALLVISABLE { \
|
||||||
|
if (tile.y<focal.y) \
|
||||||
|
voffset = 0; \
|
||||||
|
else if (tile.y==focal.y) \
|
||||||
|
voffset = 3; \
|
||||||
|
else \
|
||||||
|
voffset = 6; \
|
||||||
|
if (tile.x==focal.x) \
|
||||||
|
voffset ++; \
|
||||||
|
else if (tile.x>focal.x) \
|
||||||
|
voffset += 2; \
|
||||||
|
wallvisable = visable[voffset][wallon]; }
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
=============================================================================
|
||||||
|
|
||||||
|
GLOBAL VARIABLES
|
||||||
|
|
||||||
|
=============================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
boolean aborttrace;
|
||||||
|
|
||||||
|
/*
|
||||||
|
=============================================================================
|
||||||
|
|
||||||
|
LOCAL VARIABLES
|
||||||
|
|
||||||
|
=============================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
unsigned wallvisable,voffset;
|
||||||
|
|
||||||
|
|
||||||
|
fixed edgex,edgey;
|
||||||
|
|
||||||
|
int wallon;
|
||||||
|
int basecolor;
|
||||||
|
|
||||||
|
walltype *oldwall;
|
||||||
|
|
||||||
|
//
|
||||||
|
// offsets from upper left corner of a tile to the left and right edges of
|
||||||
|
// a given wall (NORTH-WEST)
|
||||||
|
//
|
||||||
|
fixed point1x[4] = {GLOBAL1,GLOBAL1,0 ,0 };
|
||||||
|
fixed point1y[4] = {0 ,GLOBAL1,GLOBAL1,0 };
|
||||||
|
|
||||||
|
fixed point2x[4] = {0 ,GLOBAL1,GLOBAL1,0 };
|
||||||
|
fixed point2y[4] = {0 ,0 ,GLOBAL1 ,GLOBAL1};
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// offset from tile.x,tile.y of the tile that shares wallon side
|
||||||
|
// (side is not visable if it is shared)
|
||||||
|
//
|
||||||
|
int sharex[4] = { 0, 1, 0,-1};
|
||||||
|
int sharey[4] = {-1, 0, 1, 0};
|
||||||
|
|
||||||
|
//
|
||||||
|
// amount to move tile.x,tile.y to follow wallon to another tile
|
||||||
|
//
|
||||||
|
int followx[4] = {-1, 0, 1, 0};
|
||||||
|
int followy[4] = { 0,-1, 0, 1};
|
||||||
|
|
||||||
|
//
|
||||||
|
// cornerwall gives the wall on the same tile to start following when the
|
||||||
|
// wall ends at an empty tile (go around an edge on same tile)
|
||||||
|
// turnwall gives the wall on tile.x+sharex,tile.y+sharey to start following
|
||||||
|
// when the wall hits another tile (right angle corner)
|
||||||
|
//
|
||||||
|
int cornerwall[4] = {WEST,NORTH,EAST,SOUTH};
|
||||||
|
int turnwall[4] = {EAST,SOUTH,WEST,NORTH};
|
||||||
|
|
||||||
|
//
|
||||||
|
// wall visabilities in reletive locations
|
||||||
|
// -,- 0,- +,-
|
||||||
|
// -,0 0,0 +,0
|
||||||
|
// -,+ 0,+ +,+
|
||||||
|
//
|
||||||
|
int visable[9][4] =
|
||||||
|
{
|
||||||
|
{0,1,1,0}, {0,0,1,0}, {0,0,1,1},
|
||||||
|
{0,1,0,0}, {0,0,0,0}, {0,0,0,1},
|
||||||
|
{1,1,0,0}, {1,0,0,0}, {1,0,0,1}
|
||||||
|
};
|
||||||
|
|
||||||
|
int startwall[9] = {2,2,3, 1,0,3, 1,0,0};
|
||||||
|
int backupwall[9] = {3,3,0, 2,0,0, 2,1,1};
|
||||||
|
|
||||||
|
|
||||||
|
int walllength;
|
||||||
|
|
||||||
|
/*
|
||||||
|
=============================================================================
|
||||||
|
|
||||||
|
FUNCTIONS
|
||||||
|
|
||||||
|
=============================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
========================
|
||||||
|
=
|
||||||
|
= FollowTrace
|
||||||
|
=
|
||||||
|
========================
|
||||||
|
*/
|
||||||
|
|
||||||
|
int FollowTrace (fixed tracex, fixed tracey, long deltax, long deltay, int max)
|
||||||
|
{
|
||||||
|
int tx,ty,otx,oty;
|
||||||
|
long absdx,absdy,xstep,ystep;
|
||||||
|
|
||||||
|
tx = tracex>>TILESHIFT;
|
||||||
|
ty = tracey>>TILESHIFT;
|
||||||
|
|
||||||
|
spotvis[tx][ty] = true;
|
||||||
|
|
||||||
|
absdx=LABS(deltax);
|
||||||
|
absdy=LABS(deltay);
|
||||||
|
|
||||||
|
if (absdx>absdy)
|
||||||
|
{
|
||||||
|
ystep = (deltay<<8)/(absdx>>8);
|
||||||
|
|
||||||
|
if (!ystep)
|
||||||
|
ystep = deltay>0 ? 1 : -1;
|
||||||
|
|
||||||
|
oty = (tracey+ystep)>>TILESHIFT;
|
||||||
|
if (deltax>0)
|
||||||
|
{
|
||||||
|
//###############
|
||||||
|
//
|
||||||
|
// step x by +1
|
||||||
|
//
|
||||||
|
//###############
|
||||||
|
do
|
||||||
|
{
|
||||||
|
tx++;
|
||||||
|
spotvis[tx][ty] = true;
|
||||||
|
tracey+=ystep;
|
||||||
|
ty = tracey>>TILESHIFT;
|
||||||
|
|
||||||
|
if (ty!=oty)
|
||||||
|
{
|
||||||
|
if (tilemap[tx-1][ty])
|
||||||
|
{
|
||||||
|
tile.x = tx-1;
|
||||||
|
tile.y = ty;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
oty = ty;
|
||||||
|
}
|
||||||
|
if (tilemap[tx][ty])
|
||||||
|
{
|
||||||
|
tile.x = tx;
|
||||||
|
tile.y = ty;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
} while (--max);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//###############
|
||||||
|
//
|
||||||
|
// step x by -1
|
||||||
|
//
|
||||||
|
//###############
|
||||||
|
do
|
||||||
|
{
|
||||||
|
tx--;
|
||||||
|
spotvis[tx][ty] = true;
|
||||||
|
tracey+=ystep;
|
||||||
|
ty = tracey>>TILESHIFT;
|
||||||
|
|
||||||
|
if (ty!=oty)
|
||||||
|
{
|
||||||
|
if (tilemap[tx][oty])
|
||||||
|
{
|
||||||
|
tile.x = tx;
|
||||||
|
tile.y = oty;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
oty = ty;
|
||||||
|
}
|
||||||
|
if (tilemap[tx][ty])
|
||||||
|
{
|
||||||
|
tile.x = tx;
|
||||||
|
tile.y = ty;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
} while (--max);
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
xstep = (deltax<<8)/(absdy>>8);
|
||||||
|
if (!xstep)
|
||||||
|
xstep = deltax>0 ? 1 : -1;
|
||||||
|
|
||||||
|
|
||||||
|
otx = (tracex+xstep)>>TILESHIFT;
|
||||||
|
if (deltay>0)
|
||||||
|
{
|
||||||
|
//###############
|
||||||
|
//
|
||||||
|
// step y by +1
|
||||||
|
//
|
||||||
|
//###############
|
||||||
|
do
|
||||||
|
{
|
||||||
|
ty++;
|
||||||
|
spotvis[tx][ty] = true;
|
||||||
|
tracex+=xstep;
|
||||||
|
tx = tracex>>TILESHIFT;
|
||||||
|
|
||||||
|
if (tx!=otx)
|
||||||
|
{
|
||||||
|
if (tilemap[tx][ty-1])
|
||||||
|
{
|
||||||
|
tile.x = tx;
|
||||||
|
tile.y = ty-1;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
otx = tx;
|
||||||
|
}
|
||||||
|
if (tilemap[tx][ty])
|
||||||
|
{
|
||||||
|
tile.x = tx;
|
||||||
|
tile.y = ty;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
} while (--max);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//###############
|
||||||
|
//
|
||||||
|
// step y by -1
|
||||||
|
//
|
||||||
|
//###############
|
||||||
|
do
|
||||||
|
{
|
||||||
|
ty--;
|
||||||
|
spotvis[tx][ty] = true;
|
||||||
|
tracex+=xstep;
|
||||||
|
tx = tracex>>TILESHIFT;
|
||||||
|
|
||||||
|
if (tx!=otx)
|
||||||
|
{
|
||||||
|
if (tilemap[otx][ty])
|
||||||
|
{
|
||||||
|
tile.x = otx;
|
||||||
|
tile.y = ty;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
otx = tx;
|
||||||
|
}
|
||||||
|
if (tilemap[tx][ty])
|
||||||
|
{
|
||||||
|
tile.x = tx;
|
||||||
|
tile.y = ty;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
} while (--max);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
=================
|
||||||
|
=
|
||||||
|
= BackTrace
|
||||||
|
=
|
||||||
|
= Traces backwards from edgex,edgey to viewx,viewy to see if a closer
|
||||||
|
= tile obscures the given point. If it does, it finishes the wall and
|
||||||
|
= starts a new one.
|
||||||
|
= Returns true if a tile is hit.
|
||||||
|
= Call with a 1 to have it automatically finish the current wall
|
||||||
|
=
|
||||||
|
=================
|
||||||
|
*/
|
||||||
|
|
||||||
|
int BackTrace (int finish)
|
||||||
|
{
|
||||||
|
fixed tracex,tracey;
|
||||||
|
long deltax,deltay,absdx,absdy;
|
||||||
|
int steps,otx,oty,testx,testheight,offset,wall;
|
||||||
|
|
||||||
|
deltax = viewx-edgex;
|
||||||
|
deltay = viewy-edgey;
|
||||||
|
|
||||||
|
absdx = LABS(deltax);
|
||||||
|
absdy = LABS(deltay);
|
||||||
|
|
||||||
|
if (absdx>absdy)
|
||||||
|
steps = ABS(focal.x-(edgex>>TILESHIFT))-1;
|
||||||
|
else
|
||||||
|
steps = ABS(focal.y-(edgey>>TILESHIFT))-1;
|
||||||
|
|
||||||
|
if (steps<=0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
otx = tile.x;
|
||||||
|
oty = tile.y;
|
||||||
|
if (!FollowTrace(edgex,edgey,deltax,deltay,steps))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
//
|
||||||
|
// if the start wall is behind the focal point, the trace went too far back
|
||||||
|
//
|
||||||
|
if (ABS(tile.x-focal.x)<2 && ABS(tile.y-focal.y)<2) // too close
|
||||||
|
{
|
||||||
|
if (tile.x == focal.x && tile.y == focal.y)
|
||||||
|
{
|
||||||
|
tile.x = otx;
|
||||||
|
tile.y = oty;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tile.x<focal.x)
|
||||||
|
{
|
||||||
|
if (tile.y<focal.y)
|
||||||
|
wall = SOUTH;
|
||||||
|
else
|
||||||
|
wall = EAST;
|
||||||
|
}
|
||||||
|
else if (tile.x==focal.x)
|
||||||
|
{
|
||||||
|
if (tile.y<focal.y)
|
||||||
|
wall = SOUTH;
|
||||||
|
else
|
||||||
|
wall = NORTH;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (tile.y<=focal.y)
|
||||||
|
wall = WEST;
|
||||||
|
else
|
||||||
|
wall = NORTH;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// rotate the X value to see if it is behind the view plane
|
||||||
|
//
|
||||||
|
if (TransformX (((long)tile.x<<16)+point1x[wall],
|
||||||
|
((long)tile.y<<16)+point1y[wall]) < FOCALLENGTH)
|
||||||
|
{
|
||||||
|
tile.x = otx;
|
||||||
|
tile.y = oty;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// if the old wall is still behind a closer wall, ignore the back trace
|
||||||
|
// and continue on (dealing with limited precision...)
|
||||||
|
//
|
||||||
|
if (finish && !FinishWall ()) // the wall is still behind a forward wall
|
||||||
|
{
|
||||||
|
tile.x = otx;
|
||||||
|
tile.y = oty;
|
||||||
|
rightwall->x1 = oldwall->x2; // common edge with last wall
|
||||||
|
rightwall->height1 = oldwall->height2;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// back up along the intersecting face to find the rightmost wall
|
||||||
|
//
|
||||||
|
|
||||||
|
if (tile.y<focal.y)
|
||||||
|
offset = 0;
|
||||||
|
else if (tile.y==focal.y)
|
||||||
|
offset = 3;
|
||||||
|
else
|
||||||
|
offset = 6;
|
||||||
|
if (tile.x==focal.x)
|
||||||
|
offset ++;
|
||||||
|
else if (tile.x>focal.x)
|
||||||
|
offset += 2;
|
||||||
|
|
||||||
|
wallon = backupwall[offset];
|
||||||
|
|
||||||
|
while (tilemap[tile.x][tile.y])
|
||||||
|
{
|
||||||
|
tile.x += followx[wallon];
|
||||||
|
tile.y += followy[wallon];
|
||||||
|
};
|
||||||
|
|
||||||
|
tile.x -= followx[wallon];
|
||||||
|
tile.y -= followy[wallon];
|
||||||
|
|
||||||
|
wallon = cornerwall[wallon]; // turn to first visable face
|
||||||
|
|
||||||
|
edgex = ((long)tile.x<<16);
|
||||||
|
edgey = ((long)tile.y<<16);
|
||||||
|
|
||||||
|
TransformPoint (edgex+point1x[wallon],edgey+point1y[wallon],
|
||||||
|
&rightwall->x1,&rightwall->height1);
|
||||||
|
|
||||||
|
basecolor = tilemap[tile.x][tile.y];
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
=================
|
||||||
|
=
|
||||||
|
= ForwardTrace
|
||||||
|
=
|
||||||
|
= Traces forwards from edgex,edgey along the line from viewx,viewy until
|
||||||
|
= a solid tile is hit. Sets tile.x,tile.y
|
||||||
|
=
|
||||||
|
=================
|
||||||
|
*/
|
||||||
|
|
||||||
|
void ForwardTrace (void)
|
||||||
|
{
|
||||||
|
int offset;
|
||||||
|
fixed tracex,tracey;
|
||||||
|
long deltax,deltay;
|
||||||
|
|
||||||
|
deltax = edgex-viewx;
|
||||||
|
deltay = edgey-viewy;
|
||||||
|
|
||||||
|
FollowTrace(edgex,edgey,deltax,deltay,0);
|
||||||
|
|
||||||
|
if (tile.y<focal.y)
|
||||||
|
offset = 0;
|
||||||
|
else if (tile.y==focal.y)
|
||||||
|
offset = 3;
|
||||||
|
else
|
||||||
|
offset = 6;
|
||||||
|
if (tile.x==focal.x)
|
||||||
|
offset ++;
|
||||||
|
else if (tile.x>focal.x)
|
||||||
|
offset += 2;
|
||||||
|
|
||||||
|
wallon = startwall[offset];
|
||||||
|
|
||||||
|
//
|
||||||
|
// start the new wall
|
||||||
|
//
|
||||||
|
edgex = ((long)tile.x<<16);
|
||||||
|
edgey = ((long)tile.y<<16);
|
||||||
|
|
||||||
|
//
|
||||||
|
// if entire first wall is invisable, corner
|
||||||
|
//
|
||||||
|
TransformPoint (edgex+point2x[wallon],edgey+point2y[wallon],
|
||||||
|
&rightwall->x2,&rightwall->height2);
|
||||||
|
|
||||||
|
if (tilemap [tile.x+sharex[wallon]] [tile.y+sharey[wallon]]
|
||||||
|
|| rightwall->x2 < (rightwall-1)->x2 )
|
||||||
|
wallon = cornerwall [wallon];
|
||||||
|
|
||||||
|
//
|
||||||
|
// transform first point
|
||||||
|
//
|
||||||
|
|
||||||
|
TransformPoint (edgex+point1x[wallon],edgey+point1y[wallon],
|
||||||
|
&rightwall->x1,&rightwall->height1);
|
||||||
|
|
||||||
|
basecolor = tilemap[tile.x][tile.y];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
=================
|
||||||
|
=
|
||||||
|
= FinishWall
|
||||||
|
=
|
||||||
|
= Transforms edgex,edgey as the next point of the current wall
|
||||||
|
= and sticks it in the wall list
|
||||||
|
=
|
||||||
|
=================
|
||||||
|
*/
|
||||||
|
|
||||||
|
int FinishWall (void)
|
||||||
|
{
|
||||||
|
char num[20];
|
||||||
|
|
||||||
|
oldwall = rightwall;
|
||||||
|
|
||||||
|
rightwall->color = basecolor;
|
||||||
|
|
||||||
|
TransformPoint (edgex,edgey,&rightwall->x2,&rightwall->height2);
|
||||||
|
|
||||||
|
if (rightwall->x2 <= (rightwall-1)->x2+2
|
||||||
|
&& rightwall->height2 < (rightwall-1)->height2 )
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
rightwall->walllength = walllength;
|
||||||
|
|
||||||
|
switch (wallon)
|
||||||
|
{
|
||||||
|
case north:
|
||||||
|
case south:
|
||||||
|
rightwall->side = 0;
|
||||||
|
rightwall->planecoord = edgey;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case west:
|
||||||
|
case east:
|
||||||
|
rightwall->side = 1;
|
||||||
|
rightwall->planecoord = edgex;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
walllength = 1;
|
||||||
|
|
||||||
|
rightwall++;
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
=================
|
||||||
|
=
|
||||||
|
= InsideCorner
|
||||||
|
=
|
||||||
|
=================
|
||||||
|
*/
|
||||||
|
|
||||||
|
void InsideCorner (void)
|
||||||
|
{
|
||||||
|
int offset;
|
||||||
|
|
||||||
|
//
|
||||||
|
// the wall turned -90 degrees, so draw what we have, move to the new tile,
|
||||||
|
// change wallon, change color, and continue following.
|
||||||
|
//
|
||||||
|
FinishWall ();
|
||||||
|
|
||||||
|
tile.x += sharex[wallon];
|
||||||
|
tile.y += sharey[wallon];
|
||||||
|
|
||||||
|
wallon = turnwall[wallon];
|
||||||
|
|
||||||
|
//
|
||||||
|
// if the new wall is visable, continue following it. Otherwise
|
||||||
|
// follow it backwards until it turns
|
||||||
|
//
|
||||||
|
TESTWALLVISABLE;
|
||||||
|
|
||||||
|
if (wallvisable)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// just turn to the next wall and continue
|
||||||
|
//
|
||||||
|
rightwall->x1 = oldwall->x2; // common edge with last wall
|
||||||
|
rightwall->height1 = oldwall->height2;
|
||||||
|
basecolor = tilemap[tile.x][tile.y];
|
||||||
|
return; // continue from here
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// back follow the invisable wall until it turns, then follow that
|
||||||
|
//
|
||||||
|
do
|
||||||
|
{
|
||||||
|
tile.x += followx[wallon];
|
||||||
|
tile.y += followy[wallon];
|
||||||
|
} while (tilemap[tile.x][tile.y]);
|
||||||
|
|
||||||
|
tile.x -= followx[wallon];
|
||||||
|
tile.y -= followy[wallon];
|
||||||
|
|
||||||
|
wallon = cornerwall[wallon]; // turn to first visable face
|
||||||
|
|
||||||
|
edgex = ((long)tile.x<<16)+point1x[wallon];
|
||||||
|
edgey = ((long)tile.y<<16)+point1y[wallon];
|
||||||
|
|
||||||
|
if (!BackTrace(0)) // backtrace without finishing a wall
|
||||||
|
{
|
||||||
|
TransformPoint (edgex,edgey,&rightwall->x1,&rightwall->height1);
|
||||||
|
basecolor = tilemap[tile.x][tile.y];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
=================
|
||||||
|
=
|
||||||
|
= OutsideCorner
|
||||||
|
=
|
||||||
|
=================
|
||||||
|
*/
|
||||||
|
|
||||||
|
void OutsideCorner (void)
|
||||||
|
{
|
||||||
|
int offset;
|
||||||
|
|
||||||
|
//
|
||||||
|
// edge is the outside edge of a corner, so draw the current wall and
|
||||||
|
// turn the corner (+90 degrees)
|
||||||
|
//
|
||||||
|
FinishWall ();
|
||||||
|
|
||||||
|
tile.x -= followx[wallon]; // backup to the real tile
|
||||||
|
tile.y -= followy[wallon];
|
||||||
|
wallon = cornerwall[wallon];
|
||||||
|
|
||||||
|
//
|
||||||
|
// if the new wall is visable, continue following it. Otherwise
|
||||||
|
// trace a ray from the corner to find a wall in the distance to
|
||||||
|
// follow
|
||||||
|
//
|
||||||
|
TESTWALLVISABLE;
|
||||||
|
|
||||||
|
if (wallvisable)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// the new wall is visable, so just continue on
|
||||||
|
//
|
||||||
|
rightwall->x1 = oldwall->x2; // common edge with last wall
|
||||||
|
rightwall->height1 = oldwall->height2;
|
||||||
|
return; // still on same tile, so color is ok
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// start from a new tile further away
|
||||||
|
//
|
||||||
|
ForwardTrace(); // find the next wall further back
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
=================
|
||||||
|
=
|
||||||
|
= FollowWalls
|
||||||
|
=
|
||||||
|
= Starts a wall edge at the leftmost edge of tile.x,tile.y and follows it
|
||||||
|
= until something else is seen or the entire view area is covered
|
||||||
|
=
|
||||||
|
=================
|
||||||
|
*/
|
||||||
|
|
||||||
|
void FollowWalls (void)
|
||||||
|
{
|
||||||
|
int height,newcolor,offset,wall;
|
||||||
|
|
||||||
|
//####################
|
||||||
|
//
|
||||||
|
// figure leftmost wall of new tile
|
||||||
|
//
|
||||||
|
//####################
|
||||||
|
|
||||||
|
restart:
|
||||||
|
|
||||||
|
walllength = 1;
|
||||||
|
|
||||||
|
if (tile.y<focal.y)
|
||||||
|
offset = 0;
|
||||||
|
else if (tile.y==focal.y)
|
||||||
|
offset = 3;
|
||||||
|
else
|
||||||
|
offset = 6;
|
||||||
|
if (tile.x==focal.x)
|
||||||
|
offset ++;
|
||||||
|
else if (tile.x>focal.x)
|
||||||
|
offset += 2;
|
||||||
|
|
||||||
|
wallon = startwall[offset];
|
||||||
|
|
||||||
|
//
|
||||||
|
// if the start wall is inside a block, skip it by cornering to the second wall
|
||||||
|
//
|
||||||
|
if ( tilemap [tile.x+sharex[wallon]] [tile.y+sharey[wallon]])
|
||||||
|
wallon = cornerwall [wallon];
|
||||||
|
|
||||||
|
//
|
||||||
|
// transform first edge to screen coordinates
|
||||||
|
//
|
||||||
|
edgex = ((long)tile.x<<16);
|
||||||
|
edgey = ((long)tile.y<<16);
|
||||||
|
|
||||||
|
TransformPoint (edgex+point1x[wallon],edgey+point1y[wallon],
|
||||||
|
&rightwall->x1,&rightwall->height1);
|
||||||
|
|
||||||
|
basecolor = tilemap[tile.x][tile.y];
|
||||||
|
|
||||||
|
//##################
|
||||||
|
//
|
||||||
|
// follow the wall as long as possible
|
||||||
|
//
|
||||||
|
//##################
|
||||||
|
|
||||||
|
advance:
|
||||||
|
|
||||||
|
do // while ( tile.x != right.x || tile.y != right.y)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// check for conditions that shouldn't happed...
|
||||||
|
//
|
||||||
|
if (rightwall->x1 > VIEWXH) // somehow missed right tile...
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (rightwall == &walls[DANGERHIGH])
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// somethiing got messed up! Correct by thrusting ahead...
|
||||||
|
//
|
||||||
|
VW_ColorBorder(6);
|
||||||
|
bordertime = 60;
|
||||||
|
Thrust(player->angle,TILEGLOBAL/4);
|
||||||
|
player->angle+=5;
|
||||||
|
if (player->angle>ANGLES)
|
||||||
|
player->angle-=ANGLES;
|
||||||
|
aborttrace = true;
|
||||||
|
return;
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
strcpy (str,"Wall list overflow at LE:");
|
||||||
|
itoa(mapon+1,str2,10);
|
||||||
|
strcat (str,str2);
|
||||||
|
strcat (str," X:");
|
||||||
|
ltoa(objlist[0].x,str2,10);
|
||||||
|
strcat (str,str2);
|
||||||
|
strcat (str," Y:");
|
||||||
|
ltoa(objlist[0].y,str2,10);
|
||||||
|
strcat (str,str2);
|
||||||
|
strcat (str," AN:");
|
||||||
|
itoa(objlist[0].angle,str2,10);
|
||||||
|
strcat (str,str2);
|
||||||
|
|
||||||
|
Quit (str);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// proceed along wall
|
||||||
|
//
|
||||||
|
|
||||||
|
edgex = ((long)tile.x<<16)+point2x[wallon];
|
||||||
|
edgey = ((long)tile.y<<16)+point2y[wallon];
|
||||||
|
|
||||||
|
if (BackTrace(1)) // went behind a closer wall
|
||||||
|
continue;
|
||||||
|
|
||||||
|
//
|
||||||
|
// advance to next tile along wall
|
||||||
|
//
|
||||||
|
tile.x += followx[wallon];
|
||||||
|
tile.y += followy[wallon];
|
||||||
|
|
||||||
|
if (tilemap [tile.x+sharex[wallon]] [tile.y+sharey[wallon]])
|
||||||
|
{
|
||||||
|
InsideCorner (); // turn at a corner
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
newcolor = tilemap[tile.x][tile.y];
|
||||||
|
|
||||||
|
if (!newcolor) // turn around an edge
|
||||||
|
{
|
||||||
|
OutsideCorner ();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (newcolor != basecolor)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// wall changed color, so draw what we have and continue following
|
||||||
|
//
|
||||||
|
FinishWall ();
|
||||||
|
rightwall->x1 = oldwall->x2; // new wall shares this edge
|
||||||
|
rightwall->height1 = oldwall->height2;
|
||||||
|
basecolor = newcolor;
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
walllength++;
|
||||||
|
} while (tile.x != right.x || tile.y != right.y);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//######################
|
||||||
|
//
|
||||||
|
// draw the last tile
|
||||||
|
//
|
||||||
|
//######################
|
||||||
|
|
||||||
|
edgex = ((long)tile.x<<16)+point2x[wallon];
|
||||||
|
edgey = ((long)tile.y<<16)+point2y[wallon];
|
||||||
|
FinishWall();
|
||||||
|
|
||||||
|
wallon = cornerwall[wallon];
|
||||||
|
|
||||||
|
//
|
||||||
|
// if the corner wall is visable, draw it
|
||||||
|
//
|
||||||
|
TESTWALLVISABLE;
|
||||||
|
|
||||||
|
if (wallvisable)
|
||||||
|
{
|
||||||
|
rightwall->x1 = oldwall->x2; // common edge with last wall
|
||||||
|
rightwall->height1 = oldwall->height2;
|
||||||
|
edgex = ((long)tile.x<<16)+point2x[wallon];
|
||||||
|
edgey = ((long)tile.y<<16)+point2y[wallon];
|
||||||
|
FinishWall();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
@@ -0,0 +1,339 @@
|
|||||||
|
GNU GENERAL PUBLIC LICENSE
|
||||||
|
Version 2, June 1991
|
||||||
|
|
||||||
|
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
Everyone is permitted to copy and distribute verbatim copies
|
||||||
|
of this license document, but changing it is not allowed.
|
||||||
|
|
||||||
|
Preamble
|
||||||
|
|
||||||
|
The licenses for most software are designed to take away your
|
||||||
|
freedom to share and change it. By contrast, the GNU General Public
|
||||||
|
License is intended to guarantee your freedom to share and change free
|
||||||
|
software--to make sure the software is free for all its users. This
|
||||||
|
General Public License applies to most of the Free Software
|
||||||
|
Foundation's software and to any other program whose authors commit to
|
||||||
|
using it. (Some other Free Software Foundation software is covered by
|
||||||
|
the GNU Lesser General Public License instead.) You can apply it to
|
||||||
|
your programs, too.
|
||||||
|
|
||||||
|
When we speak of free software, we are referring to freedom, not
|
||||||
|
price. Our General Public Licenses are designed to make sure that you
|
||||||
|
have the freedom to distribute copies of free software (and charge for
|
||||||
|
this service if you wish), that you receive source code or can get it
|
||||||
|
if you want it, that you can change the software or use pieces of it
|
||||||
|
in new free programs; and that you know you can do these things.
|
||||||
|
|
||||||
|
To protect your rights, we need to make restrictions that forbid
|
||||||
|
anyone to deny you these rights or to ask you to surrender the rights.
|
||||||
|
These restrictions translate to certain responsibilities for you if you
|
||||||
|
distribute copies of the software, or if you modify it.
|
||||||
|
|
||||||
|
For example, if you distribute copies of such a program, whether
|
||||||
|
gratis or for a fee, you must give the recipients all the rights that
|
||||||
|
you have. You must make sure that they, too, receive or can get the
|
||||||
|
source code. And you must show them these terms so they know their
|
||||||
|
rights.
|
||||||
|
|
||||||
|
We protect your rights with two steps: (1) copyright the software, and
|
||||||
|
(2) offer you this license which gives you legal permission to copy,
|
||||||
|
distribute and/or modify the software.
|
||||||
|
|
||||||
|
Also, for each author's protection and ours, we want to make certain
|
||||||
|
that everyone understands that there is no warranty for this free
|
||||||
|
software. If the software is modified by someone else and passed on, we
|
||||||
|
want its recipients to know that what they have is not the original, so
|
||||||
|
that any problems introduced by others will not reflect on the original
|
||||||
|
authors' reputations.
|
||||||
|
|
||||||
|
Finally, any free program is threatened constantly by software
|
||||||
|
patents. We wish to avoid the danger that redistributors of a free
|
||||||
|
program will individually obtain patent licenses, in effect making the
|
||||||
|
program proprietary. To prevent this, we have made it clear that any
|
||||||
|
patent must be licensed for everyone's free use or not licensed at all.
|
||||||
|
|
||||||
|
The precise terms and conditions for copying, distribution and
|
||||||
|
modification follow.
|
||||||
|
|
||||||
|
GNU GENERAL PUBLIC LICENSE
|
||||||
|
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||||
|
|
||||||
|
0. This License applies to any program or other work which contains
|
||||||
|
a notice placed by the copyright holder saying it may be distributed
|
||||||
|
under the terms of this General Public License. The "Program", below,
|
||||||
|
refers to any such program or work, and a "work based on the Program"
|
||||||
|
means either the Program or any derivative work under copyright law:
|
||||||
|
that is to say, a work containing the Program or a portion of it,
|
||||||
|
either verbatim or with modifications and/or translated into another
|
||||||
|
language. (Hereinafter, translation is included without limitation in
|
||||||
|
the term "modification".) Each licensee is addressed as "you".
|
||||||
|
|
||||||
|
Activities other than copying, distribution and modification are not
|
||||||
|
covered by this License; they are outside its scope. The act of
|
||||||
|
running the Program is not restricted, and the output from the Program
|
||||||
|
is covered only if its contents constitute a work based on the
|
||||||
|
Program (independent of having been made by running the Program).
|
||||||
|
Whether that is true depends on what the Program does.
|
||||||
|
|
||||||
|
1. You may copy and distribute verbatim copies of the Program's
|
||||||
|
source code as you receive it, in any medium, provided that you
|
||||||
|
conspicuously and appropriately publish on each copy an appropriate
|
||||||
|
copyright notice and disclaimer of warranty; keep intact all the
|
||||||
|
notices that refer to this License and to the absence of any warranty;
|
||||||
|
and give any other recipients of the Program a copy of this License
|
||||||
|
along with the Program.
|
||||||
|
|
||||||
|
You may charge a fee for the physical act of transferring a copy, and
|
||||||
|
you may at your option offer warranty protection in exchange for a fee.
|
||||||
|
|
||||||
|
2. You may modify your copy or copies of the Program or any portion
|
||||||
|
of it, thus forming a work based on the Program, and copy and
|
||||||
|
distribute such modifications or work under the terms of Section 1
|
||||||
|
above, provided that you also meet all of these conditions:
|
||||||
|
|
||||||
|
a) You must cause the modified files to carry prominent notices
|
||||||
|
stating that you changed the files and the date of any change.
|
||||||
|
|
||||||
|
b) You must cause any work that you distribute or publish, that in
|
||||||
|
whole or in part contains or is derived from the Program or any
|
||||||
|
part thereof, to be licensed as a whole at no charge to all third
|
||||||
|
parties under the terms of this License.
|
||||||
|
|
||||||
|
c) If the modified program normally reads commands interactively
|
||||||
|
when run, you must cause it, when started running for such
|
||||||
|
interactive use in the most ordinary way, to print or display an
|
||||||
|
announcement including an appropriate copyright notice and a
|
||||||
|
notice that there is no warranty (or else, saying that you provide
|
||||||
|
a warranty) and that users may redistribute the program under
|
||||||
|
these conditions, and telling the user how to view a copy of this
|
||||||
|
License. (Exception: if the Program itself is interactive but
|
||||||
|
does not normally print such an announcement, your work based on
|
||||||
|
the Program is not required to print an announcement.)
|
||||||
|
|
||||||
|
These requirements apply to the modified work as a whole. If
|
||||||
|
identifiable sections of that work are not derived from the Program,
|
||||||
|
and can be reasonably considered independent and separate works in
|
||||||
|
themselves, then this License, and its terms, do not apply to those
|
||||||
|
sections when you distribute them as separate works. But when you
|
||||||
|
distribute the same sections as part of a whole which is a work based
|
||||||
|
on the Program, the distribution of the whole must be on the terms of
|
||||||
|
this License, whose permissions for other licensees extend to the
|
||||||
|
entire whole, and thus to each and every part regardless of who wrote it.
|
||||||
|
|
||||||
|
Thus, it is not the intent of this section to claim rights or contest
|
||||||
|
your rights to work written entirely by you; rather, the intent is to
|
||||||
|
exercise the right to control the distribution of derivative or
|
||||||
|
collective works based on the Program.
|
||||||
|
|
||||||
|
In addition, mere aggregation of another work not based on the Program
|
||||||
|
with the Program (or with a work based on the Program) on a volume of
|
||||||
|
a storage or distribution medium does not bring the other work under
|
||||||
|
the scope of this License.
|
||||||
|
|
||||||
|
3. You may copy and distribute the Program (or a work based on it,
|
||||||
|
under Section 2) in object code or executable form under the terms of
|
||||||
|
Sections 1 and 2 above provided that you also do one of the following:
|
||||||
|
|
||||||
|
a) Accompany it with the complete corresponding machine-readable
|
||||||
|
source code, which must be distributed under the terms of Sections
|
||||||
|
1 and 2 above on a medium customarily used for software interchange; or,
|
||||||
|
|
||||||
|
b) Accompany it with a written offer, valid for at least three
|
||||||
|
years, to give any third party, for a charge no more than your
|
||||||
|
cost of physically performing source distribution, a complete
|
||||||
|
machine-readable copy of the corresponding source code, to be
|
||||||
|
distributed under the terms of Sections 1 and 2 above on a medium
|
||||||
|
customarily used for software interchange; or,
|
||||||
|
|
||||||
|
c) Accompany it with the information you received as to the offer
|
||||||
|
to distribute corresponding source code. (This alternative is
|
||||||
|
allowed only for noncommercial distribution and only if you
|
||||||
|
received the program in object code or executable form with such
|
||||||
|
an offer, in accord with Subsection b above.)
|
||||||
|
|
||||||
|
The source code for a work means the preferred form of the work for
|
||||||
|
making modifications to it. For an executable work, complete source
|
||||||
|
code means all the source code for all modules it contains, plus any
|
||||||
|
associated interface definition files, plus the scripts used to
|
||||||
|
control compilation and installation of the executable. However, as a
|
||||||
|
special exception, the source code distributed need not include
|
||||||
|
anything that is normally distributed (in either source or binary
|
||||||
|
form) with the major components (compiler, kernel, and so on) of the
|
||||||
|
operating system on which the executable runs, unless that component
|
||||||
|
itself accompanies the executable.
|
||||||
|
|
||||||
|
If distribution of executable or object code is made by offering
|
||||||
|
access to copy from a designated place, then offering equivalent
|
||||||
|
access to copy the source code from the same place counts as
|
||||||
|
distribution of the source code, even though third parties are not
|
||||||
|
compelled to copy the source along with the object code.
|
||||||
|
|
||||||
|
4. You may not copy, modify, sublicense, or distribute the Program
|
||||||
|
except as expressly provided under this License. Any attempt
|
||||||
|
otherwise to copy, modify, sublicense or distribute the Program is
|
||||||
|
void, and will automatically terminate your rights under this License.
|
||||||
|
However, parties who have received copies, or rights, from you under
|
||||||
|
this License will not have their licenses terminated so long as such
|
||||||
|
parties remain in full compliance.
|
||||||
|
|
||||||
|
5. You are not required to accept this License, since you have not
|
||||||
|
signed it. However, nothing else grants you permission to modify or
|
||||||
|
distribute the Program or its derivative works. These actions are
|
||||||
|
prohibited by law if you do not accept this License. Therefore, by
|
||||||
|
modifying or distributing the Program (or any work based on the
|
||||||
|
Program), you indicate your acceptance of this License to do so, and
|
||||||
|
all its terms and conditions for copying, distributing or modifying
|
||||||
|
the Program or works based on it.
|
||||||
|
|
||||||
|
6. Each time you redistribute the Program (or any work based on the
|
||||||
|
Program), the recipient automatically receives a license from the
|
||||||
|
original licensor to copy, distribute or modify the Program subject to
|
||||||
|
these terms and conditions. You may not impose any further
|
||||||
|
restrictions on the recipients' exercise of the rights granted herein.
|
||||||
|
You are not responsible for enforcing compliance by third parties to
|
||||||
|
this License.
|
||||||
|
|
||||||
|
7. If, as a consequence of a court judgment or allegation of patent
|
||||||
|
infringement or for any other reason (not limited to patent issues),
|
||||||
|
conditions are imposed on you (whether by court order, agreement or
|
||||||
|
otherwise) that contradict the conditions of this License, they do not
|
||||||
|
excuse you from the conditions of this License. If you cannot
|
||||||
|
distribute so as to satisfy simultaneously your obligations under this
|
||||||
|
License and any other pertinent obligations, then as a consequence you
|
||||||
|
may not distribute the Program at all. For example, if a patent
|
||||||
|
license would not permit royalty-free redistribution of the Program by
|
||||||
|
all those who receive copies directly or indirectly through you, then
|
||||||
|
the only way you could satisfy both it and this License would be to
|
||||||
|
refrain entirely from distribution of the Program.
|
||||||
|
|
||||||
|
If any portion of this section is held invalid or unenforceable under
|
||||||
|
any particular circumstance, the balance of the section is intended to
|
||||||
|
apply and the section as a whole is intended to apply in other
|
||||||
|
circumstances.
|
||||||
|
|
||||||
|
It is not the purpose of this section to induce you to infringe any
|
||||||
|
patents or other property right claims or to contest validity of any
|
||||||
|
such claims; this section has the sole purpose of protecting the
|
||||||
|
integrity of the free software distribution system, which is
|
||||||
|
implemented by public license practices. Many people have made
|
||||||
|
generous contributions to the wide range of software distributed
|
||||||
|
through that system in reliance on consistent application of that
|
||||||
|
system; it is up to the author/donor to decide if he or she is willing
|
||||||
|
to distribute software through any other system and a licensee cannot
|
||||||
|
impose that choice.
|
||||||
|
|
||||||
|
This section is intended to make thoroughly clear what is believed to
|
||||||
|
be a consequence of the rest of this License.
|
||||||
|
|
||||||
|
8. If the distribution and/or use of the Program is restricted in
|
||||||
|
certain countries either by patents or by copyrighted interfaces, the
|
||||||
|
original copyright holder who places the Program under this License
|
||||||
|
may add an explicit geographical distribution limitation excluding
|
||||||
|
those countries, so that distribution is permitted only in or among
|
||||||
|
countries not thus excluded. In such case, this License incorporates
|
||||||
|
the limitation as if written in the body of this License.
|
||||||
|
|
||||||
|
9. The Free Software Foundation may publish revised and/or new versions
|
||||||
|
of the General Public License from time to time. Such new versions will
|
||||||
|
be similar in spirit to the present version, but may differ in detail to
|
||||||
|
address new problems or concerns.
|
||||||
|
|
||||||
|
Each version is given a distinguishing version number. If the Program
|
||||||
|
specifies a version number of this License which applies to it and "any
|
||||||
|
later version", you have the option of following the terms and conditions
|
||||||
|
either of that version or of any later version published by the Free
|
||||||
|
Software Foundation. If the Program does not specify a version number of
|
||||||
|
this License, you may choose any version ever published by the Free Software
|
||||||
|
Foundation.
|
||||||
|
|
||||||
|
10. If you wish to incorporate parts of the Program into other free
|
||||||
|
programs whose distribution conditions are different, write to the author
|
||||||
|
to ask for permission. For software which is copyrighted by the Free
|
||||||
|
Software Foundation, write to the Free Software Foundation; we sometimes
|
||||||
|
make exceptions for this. Our decision will be guided by the two goals
|
||||||
|
of preserving the free status of all derivatives of our free software and
|
||||||
|
of promoting the sharing and reuse of software generally.
|
||||||
|
|
||||||
|
NO WARRANTY
|
||||||
|
|
||||||
|
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||||
|
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||||
|
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||||
|
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
||||||
|
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
||||||
|
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
||||||
|
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
||||||
|
REPAIR OR CORRECTION.
|
||||||
|
|
||||||
|
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||||
|
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||||
|
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
||||||
|
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
||||||
|
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
||||||
|
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
||||||
|
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
||||||
|
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||||
|
POSSIBILITY OF SUCH DAMAGES.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
How to Apply These Terms to Your New Programs
|
||||||
|
|
||||||
|
If you develop a new program, and you want it to be of the greatest
|
||||||
|
possible use to the public, the best way to achieve this is to make it
|
||||||
|
free software which everyone can redistribute and change under these terms.
|
||||||
|
|
||||||
|
To do so, attach the following notices to the program. It is safest
|
||||||
|
to attach them to the start of each source file to most effectively
|
||||||
|
convey the exclusion of warranty; and each file should have at least
|
||||||
|
the "copyright" line and a pointer to where the full notice is found.
|
||||||
|
|
||||||
|
<one line to give the program's name and a brief idea of what it does.>
|
||||||
|
Copyright (C) <year> <name of author>
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License along
|
||||||
|
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
|
||||||
|
Also add information on how to contact you by electronic and paper mail.
|
||||||
|
|
||||||
|
If the program is interactive, make it output a short notice like this
|
||||||
|
when it starts in an interactive mode:
|
||||||
|
|
||||||
|
Gnomovision version 69, Copyright (C) year name of author
|
||||||
|
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||||
|
This is free software, and you are welcome to redistribute it
|
||||||
|
under certain conditions; type `show c' for details.
|
||||||
|
|
||||||
|
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||||
|
parts of the General Public License. Of course, the commands you use may
|
||||||
|
be called something other than `show w' and `show c'; they could even be
|
||||||
|
mouse-clicks or menu items--whatever suits your program.
|
||||||
|
|
||||||
|
You should also get your employer (if you work as a programmer) or your
|
||||||
|
school, if any, to sign a "copyright disclaimer" for the program, if
|
||||||
|
necessary. Here is a sample; alter the names:
|
||||||
|
|
||||||
|
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
||||||
|
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
||||||
|
|
||||||
|
<signature of Ty Coon>, 1 April 1989
|
||||||
|
Ty Coon, President of Vice
|
||||||
|
|
||||||
|
This General Public License does not permit incorporating your program into
|
||||||
|
proprietary programs. If your program is a subroutine library, you may
|
||||||
|
consider it more useful to permit linking proprietary applications with the
|
||||||
|
library. If this is what you want to do, use the GNU Lesser General
|
||||||
|
Public License instead of this License.
|
||||||
+327
@@ -0,0 +1,327 @@
|
|||||||
|
;=====================================
|
||||||
|
;
|
||||||
|
; Graphics .EQU file for .C3D
|
||||||
|
; IGRAB-ed on Tue Dec 21 15:06:11 1993
|
||||||
|
;
|
||||||
|
;=====================================
|
||||||
|
|
||||||
|
CP_MAINMENUPIC = 5
|
||||||
|
CP_NEWGAMEMENUPIC = 6
|
||||||
|
CP_LOADMENUPIC = 7
|
||||||
|
CP_SAVEMENUPIC = 8
|
||||||
|
CP_CONFIGMENUPIC = 9
|
||||||
|
CP_SOUNDMENUPIC = 10
|
||||||
|
CP_MUSICMENUPIC = 11
|
||||||
|
CP_KEYBOARDMENUPIC = 12
|
||||||
|
CP_KEYMOVEMENTPIC = 13
|
||||||
|
CP_KEYBUTTONPIC = 14
|
||||||
|
CP_JOYSTICKMENUPIC = 15
|
||||||
|
CP_OPTIONSMENUPIC = 16
|
||||||
|
CP_PADDLEWARPIC = 17
|
||||||
|
CP_QUITPIC = 18
|
||||||
|
CP_JOYSTICKPIC = 19
|
||||||
|
CP_MENUSCREENPIC = 20
|
||||||
|
TITLEPIC = 21
|
||||||
|
CREDITSPIC = 22
|
||||||
|
HIGHSCORESPIC = 23
|
||||||
|
FINALEPIC = 24
|
||||||
|
STATUSPIC = 25
|
||||||
|
SIDEBARSPIC = 26
|
||||||
|
SCROLLTOPPIC = 27
|
||||||
|
SCROLL1PIC = 28
|
||||||
|
SCROLL2PIC = 29
|
||||||
|
SCROLL3PIC = 30
|
||||||
|
SCROLL4PIC = 31
|
||||||
|
SCROLL5PIC = 32
|
||||||
|
SCROLL6PIC = 33
|
||||||
|
SCROLL7PIC = 34
|
||||||
|
SCROLL8PIC = 35
|
||||||
|
FIRSTLATCHPIC = 36
|
||||||
|
NOSHOTPOWERPIC = 37
|
||||||
|
SHOTPOWERPIC = 38
|
||||||
|
NOBODYPIC = 39
|
||||||
|
BODYPIC = 40
|
||||||
|
COMPAS1PIC = 41
|
||||||
|
COMPAS2PIC = 42
|
||||||
|
COMPAS3PIC = 43
|
||||||
|
COMPAS4PIC = 44
|
||||||
|
COMPAS5PIC = 45
|
||||||
|
COMPAS6PIC = 46
|
||||||
|
COMPAS7PIC = 47
|
||||||
|
COMPAS8PIC = 48
|
||||||
|
COMPAS9PIC = 49
|
||||||
|
COMPAS10PIC = 50
|
||||||
|
COMPAS11PIC = 51
|
||||||
|
COMPAS12PIC = 52
|
||||||
|
COMPAS13PIC = 53
|
||||||
|
COMPAS14PIC = 54
|
||||||
|
COMPAS15PIC = 55
|
||||||
|
COMPAS16PIC = 56
|
||||||
|
DEADPIC = 57
|
||||||
|
FIRSTSCALEPIC = 58
|
||||||
|
ORC1PIC = 59
|
||||||
|
ORC2PIC = 60
|
||||||
|
ORC3PIC = 61
|
||||||
|
ORC4PIC = 62
|
||||||
|
ORCATTACK1PIC = 63
|
||||||
|
ORCATTACK2PIC = 64
|
||||||
|
ORCOUCHPIC = 65
|
||||||
|
ORCDIE1PIC = 66
|
||||||
|
ORCDIE2PIC = 67
|
||||||
|
ORCDIE3PIC = 68
|
||||||
|
TROLL1PIC = 69
|
||||||
|
TROLL2PIC = 70
|
||||||
|
TROLL3PIC = 71
|
||||||
|
TROLL4PIC = 72
|
||||||
|
TROLLOUCHPIC = 73
|
||||||
|
TROLLATTACK1PIC = 74
|
||||||
|
TROLLATTACK2PIC = 75
|
||||||
|
TROLLATTACK3PIC = 76
|
||||||
|
TROLLDIE1PIC = 77
|
||||||
|
TROLLDIE2PIC = 78
|
||||||
|
TROLLDIE3PIC = 79
|
||||||
|
WARP1PIC = 80
|
||||||
|
WARP2PIC = 81
|
||||||
|
WARP3PIC = 82
|
||||||
|
WARP4PIC = 83
|
||||||
|
BOLTOBJPIC = 84
|
||||||
|
BOLTOBJ2PIC = 85
|
||||||
|
NUKEOBJPIC = 86
|
||||||
|
NUKEOBJ2PIC = 87
|
||||||
|
POTIONOBJPIC = 88
|
||||||
|
RKEYOBJPIC = 89
|
||||||
|
YKEYOBJPIC = 90
|
||||||
|
GKEYOBJPIC = 91
|
||||||
|
BKEYOBJPIC = 92
|
||||||
|
SCROLLOBJPIC = 93
|
||||||
|
CHESTOBJPIC = 94
|
||||||
|
PSHOT1PIC = 95
|
||||||
|
PSHOT2PIC = 96
|
||||||
|
BIGPSHOT1PIC = 97
|
||||||
|
BIGPSHOT2PIC = 98
|
||||||
|
DEMON1PIC = 99
|
||||||
|
DEMON2PIC = 100
|
||||||
|
DEMON3PIC = 101
|
||||||
|
DEMON4PIC = 102
|
||||||
|
DEMONATTACK1PIC = 103
|
||||||
|
DEMONATTACK2PIC = 104
|
||||||
|
DEMONATTACK3PIC = 105
|
||||||
|
DEMONOUCHPIC = 106
|
||||||
|
DEMONDIE1PIC = 107
|
||||||
|
DEMONDIE2PIC = 108
|
||||||
|
DEMONDIE3PIC = 109
|
||||||
|
MAGE1PIC = 110
|
||||||
|
MAGE2PIC = 111
|
||||||
|
MAGEOUCHPIC = 112
|
||||||
|
MAGEATTACKPIC = 113
|
||||||
|
MAGEDIE1PIC = 114
|
||||||
|
MAGEDIE2PIC = 115
|
||||||
|
BAT1PIC = 116
|
||||||
|
BAT2PIC = 117
|
||||||
|
BAT3PIC = 118
|
||||||
|
BAT4PIC = 119
|
||||||
|
BATDIE1PIC = 120
|
||||||
|
BATDIE2PIC = 121
|
||||||
|
GREL1PIC = 122
|
||||||
|
GREL2PIC = 123
|
||||||
|
GRELATTACKPIC = 124
|
||||||
|
GRELHITPIC = 125
|
||||||
|
GRELDIE1PIC = 126
|
||||||
|
GRELDIE2PIC = 127
|
||||||
|
GRELDIE3PIC = 128
|
||||||
|
GRELDIE4PIC = 129
|
||||||
|
GRELDIE5PIC = 130
|
||||||
|
GRELDIE6PIC = 131
|
||||||
|
NEMESISPIC = 132
|
||||||
|
FIRSTWALLPIC = 133
|
||||||
|
EXPWALL1PIC = 134
|
||||||
|
EXPWALL2PIC = 135
|
||||||
|
EXPWALL3PIC = 136
|
||||||
|
WALL1LPIC = 137
|
||||||
|
WALL1DPIC = 138
|
||||||
|
WALL2DPIC = 139
|
||||||
|
WALL2LPIC = 140
|
||||||
|
WALL3DPIC = 141
|
||||||
|
WALL3LPIC = 142
|
||||||
|
WALL4DPIC = 143
|
||||||
|
WALL4LPIC = 144
|
||||||
|
WALL5DPIC = 145
|
||||||
|
WALL5LPIC = 146
|
||||||
|
WALL6DPIC = 147
|
||||||
|
WALL6LPIC = 148
|
||||||
|
WALL7DPIC = 149
|
||||||
|
WALL7LPIC = 150
|
||||||
|
RDOOR1PIC = 151
|
||||||
|
RDOOR2PIC = 152
|
||||||
|
YDOOR1PIC = 153
|
||||||
|
YDOOR2PIC = 154
|
||||||
|
GDOOR1PIC = 155
|
||||||
|
GDOOR2PIC = 156
|
||||||
|
BDOOR1PIC = 157
|
||||||
|
BDOOR2PIC = 158
|
||||||
|
ENTERPLAQUEPIC = 159
|
||||||
|
|
||||||
|
CP_MENUMASKPICM = 160
|
||||||
|
HAND1PICM = 161
|
||||||
|
HAND2PICM = 162
|
||||||
|
|
||||||
|
PADDLESPR = 163
|
||||||
|
BALLSPR = 164
|
||||||
|
BALL1PIXELTOTHERIGHTSPR = 165
|
||||||
|
|
||||||
|
LEVEL1TEXT = 456
|
||||||
|
LEVEL2TEXT = 457
|
||||||
|
LEVEL3TEXT = 458
|
||||||
|
LEVEL4TEXT = 459
|
||||||
|
LEVEL5TEXT = 460
|
||||||
|
LEVEL6TEXT = 461
|
||||||
|
LEVEL7TEXT = 462
|
||||||
|
LEVEL8TEXT = 463
|
||||||
|
LEVEL9TEXT = 464
|
||||||
|
LEVEL10TEXT = 465
|
||||||
|
LEVEL11TEXT = 466
|
||||||
|
LEVEL12TEXT = 467
|
||||||
|
LEVEL13TEXT = 468
|
||||||
|
LEVEL14TEXT = 469
|
||||||
|
LEVEL15TEXT = 470
|
||||||
|
LEVEL16TEXT = 471
|
||||||
|
LEVEL17TEXT = 472
|
||||||
|
LEVEL18TEXT = 473
|
||||||
|
LEVEL19TEXT = 474
|
||||||
|
LEVEL20TEXT = 475
|
||||||
|
OUTOFMEM = 476
|
||||||
|
PIRACY = 477
|
||||||
|
|
||||||
|
CONTROLS_LUMP_START = 5
|
||||||
|
CONTROLS_LUMP_END = 20
|
||||||
|
|
||||||
|
PADDLE_LUMP_START = 163
|
||||||
|
PADDLE_LUMP_END = 165
|
||||||
|
|
||||||
|
ORC_LUMP_START = 59
|
||||||
|
ORC_LUMP_END = 68
|
||||||
|
|
||||||
|
TROLL_LUMP_START = 69
|
||||||
|
TROLL_LUMP_END = 79
|
||||||
|
|
||||||
|
WARP_LUMP_START = 80
|
||||||
|
WARP_LUMP_END = 83
|
||||||
|
|
||||||
|
BOLT_LUMP_START = 84
|
||||||
|
BOLT_LUMP_END = 85
|
||||||
|
|
||||||
|
NUKE_LUMP_START = 86
|
||||||
|
NUKE_LUMP_END = 87
|
||||||
|
|
||||||
|
POTION_LUMP_START = 88
|
||||||
|
POTION_LUMP_END = 88
|
||||||
|
|
||||||
|
RKEY_LUMP_START = 89
|
||||||
|
RKEY_LUMP_END = 89
|
||||||
|
|
||||||
|
YKEY_LUMP_START = 90
|
||||||
|
YKEY_LUMP_END = 90
|
||||||
|
|
||||||
|
GKEY_LUMP_START = 91
|
||||||
|
GKEY_LUMP_END = 91
|
||||||
|
|
||||||
|
BKEY_LUMP_START = 92
|
||||||
|
BKEY_LUMP_END = 92
|
||||||
|
|
||||||
|
SCROLL_LUMP_START = 93
|
||||||
|
SCROLL_LUMP_END = 93
|
||||||
|
|
||||||
|
CHEST_LUMP_START = 94
|
||||||
|
CHEST_LUMP_END = 94
|
||||||
|
|
||||||
|
PLAYER_LUMP_START = 95
|
||||||
|
PLAYER_LUMP_END = 98
|
||||||
|
|
||||||
|
DEMON_LUMP_START = 99
|
||||||
|
DEMON_LUMP_END = 109
|
||||||
|
|
||||||
|
MAGE_LUMP_START = 110
|
||||||
|
MAGE_LUMP_END = 115
|
||||||
|
|
||||||
|
BAT_LUMP_START = 116
|
||||||
|
BAT_LUMP_END = 121
|
||||||
|
|
||||||
|
GREL_LUMP_START = 122
|
||||||
|
GREL_LUMP_END = 132
|
||||||
|
|
||||||
|
EXPWALL_LUMP_START = 134
|
||||||
|
EXPWALL_LUMP_END = 136
|
||||||
|
|
||||||
|
WALL1_LUMP_START = 137
|
||||||
|
WALL1_LUMP_END = 138
|
||||||
|
|
||||||
|
WALL2_LUMP_START = 139
|
||||||
|
WALL2_LUMP_END = 140
|
||||||
|
|
||||||
|
WALL3_LUMP_START = 141
|
||||||
|
WALL3_LUMP_END = 142
|
||||||
|
|
||||||
|
WALL4_LUMP_START = 143
|
||||||
|
WALL4_LUMP_END = 144
|
||||||
|
|
||||||
|
WALL5_LUMP_START = 145
|
||||||
|
WALL5_LUMP_END = 146
|
||||||
|
|
||||||
|
WALL6_LUMP_START = 147
|
||||||
|
WALL6_LUMP_END = 148
|
||||||
|
|
||||||
|
WALL7_LUMP_START = 149
|
||||||
|
WALL7_LUMP_END = 150
|
||||||
|
|
||||||
|
RDOOR_LUMP_START = 151
|
||||||
|
RDOOR_LUMP_END = 152
|
||||||
|
|
||||||
|
YDOOR_LUMP_START = 153
|
||||||
|
YDOOR_LUMP_END = 154
|
||||||
|
|
||||||
|
GDOOR_LUMP_START = 155
|
||||||
|
GDOOR_LUMP_END = 156
|
||||||
|
|
||||||
|
BDOOR_LUMP_START = 157
|
||||||
|
BDOOR_LUMP_END = 158
|
||||||
|
|
||||||
|
|
||||||
|
;
|
||||||
|
; Amount of each data item
|
||||||
|
;
|
||||||
|
NUMCHUNKS = 478
|
||||||
|
NUMFONT = 2
|
||||||
|
NUMFONTM = 0
|
||||||
|
NUMPICS = 155
|
||||||
|
NUMPICM = 3
|
||||||
|
NUMSPRITES = 3
|
||||||
|
NUMTILE8 = 108
|
||||||
|
NUMTILE8M = 36
|
||||||
|
NUMTILE16 = 216
|
||||||
|
NUMTILE16M = 72
|
||||||
|
NUMTILE32 = 0
|
||||||
|
NUMTILE32M = 0
|
||||||
|
NUMEXTERN = 22
|
||||||
|
;
|
||||||
|
; File offsets for data items
|
||||||
|
;
|
||||||
|
STRUCTPIC = 0
|
||||||
|
STRUCTPICM = 1
|
||||||
|
STRUCTSPRITE = 2
|
||||||
|
|
||||||
|
STARTFONT = 3
|
||||||
|
STARTFONTM = 5
|
||||||
|
STARTPICS = 5
|
||||||
|
STARTPICM = 160
|
||||||
|
STARTSPRITES = 163
|
||||||
|
STARTTILE8 = 166
|
||||||
|
STARTTILE8M = 167
|
||||||
|
STARTTILE16 = 168
|
||||||
|
STARTTILE16M = 384
|
||||||
|
STARTTILE32 = 456
|
||||||
|
STARTTILE32M = 456
|
||||||
|
STARTEXTERN = 456
|
||||||
|
|
||||||
|
;
|
||||||
|
; Thank you for using IGRAB!
|
||||||
|
;
|
||||||
+353
@@ -0,0 +1,353 @@
|
|||||||
|
/* Catacomb 3-D Source Code
|
||||||
|
* Copyright (C) 1993-2014 Flat Rock Software
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along
|
||||||
|
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
//////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Graphics .H file for .C3D
|
||||||
|
// IGRAB-ed on Tue Dec 21 15:06:10 1993
|
||||||
|
//
|
||||||
|
//////////////////////////////////////
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
// Lump Start
|
||||||
|
CP_MAINMENUPIC=5,
|
||||||
|
CP_NEWGAMEMENUPIC, // 6
|
||||||
|
CP_LOADMENUPIC, // 7
|
||||||
|
CP_SAVEMENUPIC, // 8
|
||||||
|
CP_CONFIGMENUPIC, // 9
|
||||||
|
CP_SOUNDMENUPIC, // 10
|
||||||
|
CP_MUSICMENUPIC, // 11
|
||||||
|
CP_KEYBOARDMENUPIC, // 12
|
||||||
|
CP_KEYMOVEMENTPIC, // 13
|
||||||
|
CP_KEYBUTTONPIC, // 14
|
||||||
|
CP_JOYSTICKMENUPIC, // 15
|
||||||
|
CP_OPTIONSMENUPIC, // 16
|
||||||
|
CP_PADDLEWARPIC, // 17
|
||||||
|
CP_QUITPIC, // 18
|
||||||
|
CP_JOYSTICKPIC, // 19
|
||||||
|
CP_MENUSCREENPIC, // 20
|
||||||
|
TITLEPIC, // 21
|
||||||
|
CREDITSPIC, // 22
|
||||||
|
HIGHSCORESPIC, // 23
|
||||||
|
FINALEPIC, // 24
|
||||||
|
STATUSPIC, // 25
|
||||||
|
SIDEBARSPIC, // 26
|
||||||
|
SCROLLTOPPIC, // 27
|
||||||
|
SCROLL1PIC, // 28
|
||||||
|
SCROLL2PIC, // 29
|
||||||
|
SCROLL3PIC, // 30
|
||||||
|
SCROLL4PIC, // 31
|
||||||
|
SCROLL5PIC, // 32
|
||||||
|
SCROLL6PIC, // 33
|
||||||
|
SCROLL7PIC, // 34
|
||||||
|
SCROLL8PIC, // 35
|
||||||
|
FIRSTLATCHPIC, // 36
|
||||||
|
NOSHOTPOWERPIC, // 37
|
||||||
|
SHOTPOWERPIC, // 38
|
||||||
|
NOBODYPIC, // 39
|
||||||
|
BODYPIC, // 40
|
||||||
|
COMPAS1PIC, // 41
|
||||||
|
COMPAS2PIC, // 42
|
||||||
|
COMPAS3PIC, // 43
|
||||||
|
COMPAS4PIC, // 44
|
||||||
|
COMPAS5PIC, // 45
|
||||||
|
COMPAS6PIC, // 46
|
||||||
|
COMPAS7PIC, // 47
|
||||||
|
COMPAS8PIC, // 48
|
||||||
|
COMPAS9PIC, // 49
|
||||||
|
COMPAS10PIC, // 50
|
||||||
|
COMPAS11PIC, // 51
|
||||||
|
COMPAS12PIC, // 52
|
||||||
|
COMPAS13PIC, // 53
|
||||||
|
COMPAS14PIC, // 54
|
||||||
|
COMPAS15PIC, // 55
|
||||||
|
COMPAS16PIC, // 56
|
||||||
|
DEADPIC, // 57
|
||||||
|
FIRSTSCALEPIC, // 58
|
||||||
|
ORC1PIC, // 59
|
||||||
|
ORC2PIC, // 60
|
||||||
|
ORC3PIC, // 61
|
||||||
|
ORC4PIC, // 62
|
||||||
|
ORCATTACK1PIC, // 63
|
||||||
|
ORCATTACK2PIC, // 64
|
||||||
|
ORCOUCHPIC, // 65
|
||||||
|
ORCDIE1PIC, // 66
|
||||||
|
ORCDIE2PIC, // 67
|
||||||
|
ORCDIE3PIC, // 68
|
||||||
|
TROLL1PIC, // 69
|
||||||
|
TROLL2PIC, // 70
|
||||||
|
TROLL3PIC, // 71
|
||||||
|
TROLL4PIC, // 72
|
||||||
|
TROLLOUCHPIC, // 73
|
||||||
|
TROLLATTACK1PIC, // 74
|
||||||
|
TROLLATTACK2PIC, // 75
|
||||||
|
TROLLATTACK3PIC, // 76
|
||||||
|
TROLLDIE1PIC, // 77
|
||||||
|
TROLLDIE2PIC, // 78
|
||||||
|
TROLLDIE3PIC, // 79
|
||||||
|
WARP1PIC, // 80
|
||||||
|
WARP2PIC, // 81
|
||||||
|
WARP3PIC, // 82
|
||||||
|
WARP4PIC, // 83
|
||||||
|
BOLTOBJPIC, // 84
|
||||||
|
BOLTOBJ2PIC, // 85
|
||||||
|
NUKEOBJPIC, // 86
|
||||||
|
NUKEOBJ2PIC, // 87
|
||||||
|
POTIONOBJPIC, // 88
|
||||||
|
RKEYOBJPIC, // 89
|
||||||
|
YKEYOBJPIC, // 90
|
||||||
|
GKEYOBJPIC, // 91
|
||||||
|
BKEYOBJPIC, // 92
|
||||||
|
SCROLLOBJPIC, // 93
|
||||||
|
CHESTOBJPIC, // 94
|
||||||
|
PSHOT1PIC, // 95
|
||||||
|
PSHOT2PIC, // 96
|
||||||
|
BIGPSHOT1PIC, // 97
|
||||||
|
BIGPSHOT2PIC, // 98
|
||||||
|
DEMON1PIC, // 99
|
||||||
|
DEMON2PIC, // 100
|
||||||
|
DEMON3PIC, // 101
|
||||||
|
DEMON4PIC, // 102
|
||||||
|
DEMONATTACK1PIC, // 103
|
||||||
|
DEMONATTACK2PIC, // 104
|
||||||
|
DEMONATTACK3PIC, // 105
|
||||||
|
DEMONOUCHPIC, // 106
|
||||||
|
DEMONDIE1PIC, // 107
|
||||||
|
DEMONDIE2PIC, // 108
|
||||||
|
DEMONDIE3PIC, // 109
|
||||||
|
MAGE1PIC, // 110
|
||||||
|
MAGE2PIC, // 111
|
||||||
|
MAGEOUCHPIC, // 112
|
||||||
|
MAGEATTACKPIC, // 113
|
||||||
|
MAGEDIE1PIC, // 114
|
||||||
|
MAGEDIE2PIC, // 115
|
||||||
|
BAT1PIC, // 116
|
||||||
|
BAT2PIC, // 117
|
||||||
|
BAT3PIC, // 118
|
||||||
|
BAT4PIC, // 119
|
||||||
|
BATDIE1PIC, // 120
|
||||||
|
BATDIE2PIC, // 121
|
||||||
|
GREL1PIC, // 122
|
||||||
|
GREL2PIC, // 123
|
||||||
|
GRELATTACKPIC, // 124
|
||||||
|
GRELHITPIC, // 125
|
||||||
|
GRELDIE1PIC, // 126
|
||||||
|
GRELDIE2PIC, // 127
|
||||||
|
GRELDIE3PIC, // 128
|
||||||
|
GRELDIE4PIC, // 129
|
||||||
|
GRELDIE5PIC, // 130
|
||||||
|
GRELDIE6PIC, // 131
|
||||||
|
NEMESISPIC, // 132
|
||||||
|
FIRSTWALLPIC, // 133
|
||||||
|
EXPWALL1PIC, // 134
|
||||||
|
EXPWALL2PIC, // 135
|
||||||
|
EXPWALL3PIC, // 136
|
||||||
|
WALL1LPIC, // 137
|
||||||
|
WALL1DPIC, // 138
|
||||||
|
WALL2DPIC, // 139
|
||||||
|
WALL2LPIC, // 140
|
||||||
|
WALL3DPIC, // 141
|
||||||
|
WALL3LPIC, // 142
|
||||||
|
WALL4DPIC, // 143
|
||||||
|
WALL4LPIC, // 144
|
||||||
|
WALL5DPIC, // 145
|
||||||
|
WALL5LPIC, // 146
|
||||||
|
WALL6DPIC, // 147
|
||||||
|
WALL6LPIC, // 148
|
||||||
|
WALL7DPIC, // 149
|
||||||
|
WALL7LPIC, // 150
|
||||||
|
RDOOR1PIC, // 151
|
||||||
|
RDOOR2PIC, // 152
|
||||||
|
YDOOR1PIC, // 153
|
||||||
|
YDOOR2PIC, // 154
|
||||||
|
GDOOR1PIC, // 155
|
||||||
|
GDOOR2PIC, // 156
|
||||||
|
BDOOR1PIC, // 157
|
||||||
|
BDOOR2PIC, // 158
|
||||||
|
ENTERPLAQUEPIC, // 159
|
||||||
|
|
||||||
|
CP_MENUMASKPICM=160,
|
||||||
|
HAND1PICM, // 161
|
||||||
|
HAND2PICM, // 162
|
||||||
|
|
||||||
|
// Lump Start
|
||||||
|
PADDLESPR=163,
|
||||||
|
BALLSPR, // 164
|
||||||
|
BALL1PIXELTOTHERIGHTSPR, // 165
|
||||||
|
|
||||||
|
LEVEL1TEXT=456,
|
||||||
|
LEVEL2TEXT, // 457
|
||||||
|
LEVEL3TEXT, // 458
|
||||||
|
LEVEL4TEXT, // 459
|
||||||
|
LEVEL5TEXT, // 460
|
||||||
|
LEVEL6TEXT, // 461
|
||||||
|
LEVEL7TEXT, // 462
|
||||||
|
LEVEL8TEXT, // 463
|
||||||
|
LEVEL9TEXT, // 464
|
||||||
|
LEVEL10TEXT, // 465
|
||||||
|
LEVEL11TEXT, // 466
|
||||||
|
LEVEL12TEXT, // 467
|
||||||
|
LEVEL13TEXT, // 468
|
||||||
|
LEVEL14TEXT, // 469
|
||||||
|
LEVEL15TEXT, // 470
|
||||||
|
LEVEL16TEXT, // 471
|
||||||
|
LEVEL17TEXT, // 472
|
||||||
|
LEVEL18TEXT, // 473
|
||||||
|
LEVEL19TEXT, // 474
|
||||||
|
LEVEL20TEXT, // 475
|
||||||
|
OUTOFMEM, // 476
|
||||||
|
PIRACY, // 477
|
||||||
|
ENUMEND
|
||||||
|
} graphicnums;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Data LUMPs
|
||||||
|
//
|
||||||
|
#define CONTROLS_LUMP_START 5
|
||||||
|
#define CONTROLS_LUMP_END 20
|
||||||
|
|
||||||
|
#define PADDLE_LUMP_START 163
|
||||||
|
#define PADDLE_LUMP_END 165
|
||||||
|
|
||||||
|
#define ORC_LUMP_START 59
|
||||||
|
#define ORC_LUMP_END 68
|
||||||
|
|
||||||
|
#define TROLL_LUMP_START 69
|
||||||
|
#define TROLL_LUMP_END 79
|
||||||
|
|
||||||
|
#define WARP_LUMP_START 80
|
||||||
|
#define WARP_LUMP_END 83
|
||||||
|
|
||||||
|
#define BOLT_LUMP_START 84
|
||||||
|
#define BOLT_LUMP_END 85
|
||||||
|
|
||||||
|
#define NUKE_LUMP_START 86
|
||||||
|
#define NUKE_LUMP_END 87
|
||||||
|
|
||||||
|
#define POTION_LUMP_START 88
|
||||||
|
#define POTION_LUMP_END 88
|
||||||
|
|
||||||
|
#define RKEY_LUMP_START 89
|
||||||
|
#define RKEY_LUMP_END 89
|
||||||
|
|
||||||
|
#define YKEY_LUMP_START 90
|
||||||
|
#define YKEY_LUMP_END 90
|
||||||
|
|
||||||
|
#define GKEY_LUMP_START 91
|
||||||
|
#define GKEY_LUMP_END 91
|
||||||
|
|
||||||
|
#define BKEY_LUMP_START 92
|
||||||
|
#define BKEY_LUMP_END 92
|
||||||
|
|
||||||
|
#define SCROLL_LUMP_START 93
|
||||||
|
#define SCROLL_LUMP_END 93
|
||||||
|
|
||||||
|
#define CHEST_LUMP_START 94
|
||||||
|
#define CHEST_LUMP_END 94
|
||||||
|
|
||||||
|
#define PLAYER_LUMP_START 95
|
||||||
|
#define PLAYER_LUMP_END 98
|
||||||
|
|
||||||
|
#define DEMON_LUMP_START 99
|
||||||
|
#define DEMON_LUMP_END 109
|
||||||
|
|
||||||
|
#define MAGE_LUMP_START 110
|
||||||
|
#define MAGE_LUMP_END 115
|
||||||
|
|
||||||
|
#define BAT_LUMP_START 116
|
||||||
|
#define BAT_LUMP_END 121
|
||||||
|
|
||||||
|
#define GREL_LUMP_START 122
|
||||||
|
#define GREL_LUMP_END 132
|
||||||
|
|
||||||
|
#define EXPWALL_LUMP_START 134
|
||||||
|
#define EXPWALL_LUMP_END 136
|
||||||
|
|
||||||
|
#define WALL1_LUMP_START 137
|
||||||
|
#define WALL1_LUMP_END 138
|
||||||
|
|
||||||
|
#define WALL2_LUMP_START 139
|
||||||
|
#define WALL2_LUMP_END 140
|
||||||
|
|
||||||
|
#define WALL3_LUMP_START 141
|
||||||
|
#define WALL3_LUMP_END 142
|
||||||
|
|
||||||
|
#define WALL4_LUMP_START 143
|
||||||
|
#define WALL4_LUMP_END 144
|
||||||
|
|
||||||
|
#define WALL5_LUMP_START 145
|
||||||
|
#define WALL5_LUMP_END 146
|
||||||
|
|
||||||
|
#define WALL6_LUMP_START 147
|
||||||
|
#define WALL6_LUMP_END 148
|
||||||
|
|
||||||
|
#define WALL7_LUMP_START 149
|
||||||
|
#define WALL7_LUMP_END 150
|
||||||
|
|
||||||
|
#define RDOOR_LUMP_START 151
|
||||||
|
#define RDOOR_LUMP_END 152
|
||||||
|
|
||||||
|
#define YDOOR_LUMP_START 153
|
||||||
|
#define YDOOR_LUMP_END 154
|
||||||
|
|
||||||
|
#define GDOOR_LUMP_START 155
|
||||||
|
#define GDOOR_LUMP_END 156
|
||||||
|
|
||||||
|
#define BDOOR_LUMP_START 157
|
||||||
|
#define BDOOR_LUMP_END 158
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// Amount of each data item
|
||||||
|
//
|
||||||
|
#define NUMCHUNKS 478
|
||||||
|
#define NUMFONT 2
|
||||||
|
#define NUMFONTM 0
|
||||||
|
#define NUMPICS 155
|
||||||
|
#define NUMPICM 3
|
||||||
|
#define NUMSPRITES 3
|
||||||
|
#define NUMTILE8 108
|
||||||
|
#define NUMTILE8M 36
|
||||||
|
#define NUMTILE16 216
|
||||||
|
#define NUMTILE16M 72
|
||||||
|
#define NUMTILE32 0
|
||||||
|
#define NUMTILE32M 0
|
||||||
|
#define NUMEXTERNS 22
|
||||||
|
//
|
||||||
|
// File offsets for data items
|
||||||
|
//
|
||||||
|
#define STRUCTPIC 0
|
||||||
|
#define STRUCTPICM 1
|
||||||
|
#define STRUCTSPRITE 2
|
||||||
|
|
||||||
|
#define STARTFONT 3
|
||||||
|
#define STARTFONTM 5
|
||||||
|
#define STARTPICS 5
|
||||||
|
#define STARTPICM 160
|
||||||
|
#define STARTSPRITES 163
|
||||||
|
#define STARTTILE8 166
|
||||||
|
#define STARTTILE8M 167
|
||||||
|
#define STARTTILE16 168
|
||||||
|
#define STARTTILE16M 384
|
||||||
|
#define STARTTILE32 456
|
||||||
|
#define STARTTILE32M 456
|
||||||
|
#define STARTEXTERNS 456
|
||||||
|
|
||||||
|
//
|
||||||
|
// Thank you for using IGRAB!
|
||||||
|
//
|
||||||
+114
@@ -0,0 +1,114 @@
|
|||||||
|
;
|
||||||
|
; Equates for all .ASM files
|
||||||
|
;
|
||||||
|
|
||||||
|
;----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
INCLUDE "GFXE_C3D.EQU"
|
||||||
|
|
||||||
|
;----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
CGAGR = 1
|
||||||
|
EGAGR = 2
|
||||||
|
VGAGR = 3
|
||||||
|
|
||||||
|
GRMODE = EGAGR
|
||||||
|
PROFILE = 0 ; 1=keep stats on tile drawing
|
||||||
|
|
||||||
|
SC_INDEX = 03C4h
|
||||||
|
SC_RESET = 0
|
||||||
|
SC_CLOCK = 1
|
||||||
|
SC_MAPMASK = 2
|
||||||
|
SC_CHARMAP = 3
|
||||||
|
SC_MEMMODE = 4
|
||||||
|
|
||||||
|
CRTC_INDEX = 03D4h
|
||||||
|
CRTC_H_TOTAL = 0
|
||||||
|
CRTC_H_DISPEND = 1
|
||||||
|
CRTC_H_BLANK = 2
|
||||||
|
CRTC_H_ENDBLANK = 3
|
||||||
|
CRTC_H_RETRACE = 4
|
||||||
|
CRTC_H_ENDRETRACE = 5
|
||||||
|
CRTC_V_TOTAL = 6
|
||||||
|
CRTC_OVERFLOW = 7
|
||||||
|
CRTC_ROWSCAN = 8
|
||||||
|
CRTC_MAXSCANLINE = 9
|
||||||
|
CRTC_CURSORSTART = 10
|
||||||
|
CRTC_CURSOREND = 11
|
||||||
|
CRTC_STARTHIGH = 12
|
||||||
|
CRTC_STARTLOW = 13
|
||||||
|
CRTC_CURSORHIGH = 14
|
||||||
|
CRTC_CURSORLOW = 15
|
||||||
|
CRTC_V_RETRACE = 16
|
||||||
|
CRTC_V_ENDRETRACE = 17
|
||||||
|
CRTC_V_DISPEND = 18
|
||||||
|
CRTC_OFFSET = 19
|
||||||
|
CRTC_UNDERLINE = 20
|
||||||
|
CRTC_V_BLANK = 21
|
||||||
|
CRTC_V_ENDBLANK = 22
|
||||||
|
CRTC_MODE = 23
|
||||||
|
CRTC_LINECOMPARE = 24
|
||||||
|
|
||||||
|
|
||||||
|
GC_INDEX = 03CEh
|
||||||
|
GC_SETRESET = 0
|
||||||
|
GC_ENABLESETRESET = 1
|
||||||
|
GC_COLORCOMPARE = 2
|
||||||
|
GC_DATAROTATE = 3
|
||||||
|
GC_READMAP = 4
|
||||||
|
GC_MODE = 5
|
||||||
|
GC_MISCELLANEOUS = 6
|
||||||
|
GC_COLORDONTCARE = 7
|
||||||
|
GC_BITMASK = 8
|
||||||
|
|
||||||
|
ATR_INDEX = 03c0h
|
||||||
|
ATR_MODE = 16
|
||||||
|
ATR_OVERSCAN = 17
|
||||||
|
ATR_COLORPLANEENABLE = 18
|
||||||
|
ATR_PELPAN = 19
|
||||||
|
ATR_COLORSELECT = 20
|
||||||
|
|
||||||
|
STATUS_REGISTER_1 = 03dah
|
||||||
|
|
||||||
|
|
||||||
|
MACRO WORDOUT
|
||||||
|
out dx,ax
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
if 0
|
||||||
|
|
||||||
|
MACRO WORDOUT
|
||||||
|
out dx,al
|
||||||
|
inc dx
|
||||||
|
xchg al,ah
|
||||||
|
out dx,al
|
||||||
|
dec dx
|
||||||
|
xchg al,ah
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
endif
|
||||||
|
|
||||||
|
UPDATEWIDE = 22
|
||||||
|
UPDATEHIGH = 13 ; hack for catacombs
|
||||||
|
|
||||||
|
;
|
||||||
|
; tile info offsets from segment tinf
|
||||||
|
;
|
||||||
|
|
||||||
|
SPEED = 402
|
||||||
|
ANIM = (SPEED+NUMTILE16)
|
||||||
|
|
||||||
|
NORTHWALL = (ANIM+NUMTILE16)
|
||||||
|
EASTWALL = (NORTHWALL+NUMTILE16M)
|
||||||
|
SOUTHWALL = (EASTWALL+NUMTILE16M)
|
||||||
|
WESTWALL = (SOUTHWALL+NUMTILE16M)
|
||||||
|
MANIM = (WESTWALL+NUMTILE16M)
|
||||||
|
INTILE = (MANIM+NUMTILE16M)
|
||||||
|
MSPEED = (INTILE+NUMTILE16M)
|
||||||
|
|
||||||
|
IFE GRMODE-EGAGR
|
||||||
|
SCREENWIDTH = 40
|
||||||
|
ENDIF
|
||||||
|
IFE GRMODE-CGAGR
|
||||||
|
SCREENWIDTH = 128
|
||||||
|
ENDIF
|
||||||
@@ -0,0 +1,124 @@
|
|||||||
|
/* Catacomb 3-D Source Code
|
||||||
|
* Copyright (C) 1993-2014 Flat Rock Software
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along
|
||||||
|
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// ID_CA.H
|
||||||
|
|
||||||
|
#ifndef __TYPES__
|
||||||
|
#include "ID_TYPES.H"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __ID_MM__
|
||||||
|
#include "ID_MM.H"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __ID_GLOB__
|
||||||
|
#include "ID_GLOB.H"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define __ID_CA__
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
|
//#define NOMAPS
|
||||||
|
//#define NOGRAPHICS
|
||||||
|
//#define NOAUDIO
|
||||||
|
|
||||||
|
#define MAPHEADERLINKED
|
||||||
|
#define GRHEADERLINKED
|
||||||
|
#define AUDIOHEADERLINKED
|
||||||
|
|
||||||
|
#define NUMMAPS 30
|
||||||
|
#define MAPPLANES 3
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
long planestart[3];
|
||||||
|
unsigned planelength[3];
|
||||||
|
unsigned width,height;
|
||||||
|
char name[16];
|
||||||
|
} maptype;
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
|
extern byte _seg *tinf;
|
||||||
|
extern int mapon;
|
||||||
|
|
||||||
|
extern unsigned _seg *mapsegs[3];
|
||||||
|
extern maptype _seg *mapheaderseg[NUMMAPS];
|
||||||
|
extern byte _seg *audiosegs[NUMSNDCHUNKS];
|
||||||
|
extern void _seg *grsegs[NUMCHUNKS];
|
||||||
|
|
||||||
|
extern byte far grneeded[NUMCHUNKS];
|
||||||
|
extern byte ca_levelbit,ca_levelnum;
|
||||||
|
|
||||||
|
extern char *titleptr[8];
|
||||||
|
|
||||||
|
extern int profilehandle,debughandle;
|
||||||
|
|
||||||
|
//
|
||||||
|
// hooks for custom cache dialogs
|
||||||
|
//
|
||||||
|
extern void (*drawcachebox) (char *title, unsigned numcache);
|
||||||
|
extern void (*updatecachebox) (void);
|
||||||
|
extern void (*finishcachebox) (void);
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
|
// just for the score box reshifting
|
||||||
|
|
||||||
|
void CAL_ShiftSprite (unsigned segment,unsigned source,unsigned dest,
|
||||||
|
unsigned width, unsigned height, unsigned pixshift);
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
|
void CA_OpenDebug (void);
|
||||||
|
void CA_CloseDebug (void);
|
||||||
|
boolean CA_FarRead (int handle, byte far *dest, long length);
|
||||||
|
boolean CA_FarWrite (int handle, byte far *source, long length);
|
||||||
|
boolean CA_ReadFile (char *filename, memptr *ptr);
|
||||||
|
boolean CA_LoadFile (char *filename, memptr *ptr);
|
||||||
|
|
||||||
|
long CA_RLEWCompress (unsigned huge *source, long length, unsigned huge *dest,
|
||||||
|
unsigned rlewtag);
|
||||||
|
|
||||||
|
void CA_RLEWexpand (unsigned huge *source, unsigned huge *dest,long length,
|
||||||
|
unsigned rlewtag);
|
||||||
|
|
||||||
|
void CA_Startup (void);
|
||||||
|
void CA_Shutdown (void);
|
||||||
|
|
||||||
|
void CA_CacheAudioChunk (int chunk);
|
||||||
|
void CA_LoadAllSounds (void);
|
||||||
|
|
||||||
|
void CA_UpLevel (void);
|
||||||
|
void CA_DownLevel (void);
|
||||||
|
|
||||||
|
void CA_SetAllPurge (void);
|
||||||
|
|
||||||
|
void CA_ClearMarks (void);
|
||||||
|
void CA_ClearAllMarks (void);
|
||||||
|
|
||||||
|
#define CA_MarkGrChunk(chunk) grneeded[chunk]|=ca_levelbit
|
||||||
|
|
||||||
|
void CA_CacheGrChunk (int chunk);
|
||||||
|
void CA_CacheMap (int mapnum);
|
||||||
|
|
||||||
|
void CA_CacheMarks (char *title);
|
||||||
|
|
||||||
+124
@@ -0,0 +1,124 @@
|
|||||||
|
/* Catacomb 3-D Source Code
|
||||||
|
* Copyright (C) 1993-2014 Flat Rock Software
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along
|
||||||
|
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// ID_GLOB.H
|
||||||
|
|
||||||
|
|
||||||
|
#include <ALLOC.H>
|
||||||
|
#include <CTYPE.H>
|
||||||
|
#include <DOS.H>
|
||||||
|
#include <ERRNO.H>
|
||||||
|
#include <FCNTL.H>
|
||||||
|
#include <IO.H>
|
||||||
|
#include <MEM.H>
|
||||||
|
#include <PROCESS.H>
|
||||||
|
#include <STDIO.H>
|
||||||
|
#include <STDLIB.H>
|
||||||
|
#include <STRING.H>
|
||||||
|
#include <SYS\STAT.H>
|
||||||
|
|
||||||
|
#define __ID_GLOB__
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------
|
||||||
|
|
||||||
|
#define EXTENSION "C3D"
|
||||||
|
|
||||||
|
extern char far introscn;
|
||||||
|
|
||||||
|
#include "GFXE_C3D.H"
|
||||||
|
#include "AUDIOC3D.H"
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------
|
||||||
|
|
||||||
|
#define CAT3D
|
||||||
|
|
||||||
|
#define TEXTGR 0
|
||||||
|
#define CGAGR 1
|
||||||
|
#define EGAGR 2
|
||||||
|
#define VGAGR 3
|
||||||
|
|
||||||
|
#define GRMODE EGAGR
|
||||||
|
|
||||||
|
#if GRMODE == EGAGR
|
||||||
|
#define GREXT "EGA"
|
||||||
|
#endif
|
||||||
|
#if GRMODE == CGAGR
|
||||||
|
#define GREXT "CGA"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//#define PROFILE
|
||||||
|
|
||||||
|
//
|
||||||
|
// ID Engine
|
||||||
|
// Types.h - Generic types, #defines, etc.
|
||||||
|
// v1.0d1
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef __TYPES__
|
||||||
|
#define __TYPES__
|
||||||
|
|
||||||
|
typedef enum {false,true} boolean;
|
||||||
|
typedef unsigned char byte;
|
||||||
|
typedef unsigned int word;
|
||||||
|
typedef unsigned long longword;
|
||||||
|
typedef byte * Ptr;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
int x,y;
|
||||||
|
} Point;
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
Point ul,lr;
|
||||||
|
} Rect;
|
||||||
|
|
||||||
|
#define nil ((void *)0)
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "ID_MM.H"
|
||||||
|
#include "ID_CA.H"
|
||||||
|
#include "ID_VW.H"
|
||||||
|
#include "ID_IN.H"
|
||||||
|
#include "ID_SD.H"
|
||||||
|
#include "ID_US.H"
|
||||||
|
|
||||||
|
|
||||||
|
void Quit (char *error); // defined in user program
|
||||||
|
|
||||||
|
//
|
||||||
|
// replacing refresh manager with custom routines
|
||||||
|
//
|
||||||
|
|
||||||
|
#define PORTTILESWIDE 21 // all drawing takes place inside a
|
||||||
|
#define PORTTILESHIGH 14 // non displayed port of this size
|
||||||
|
|
||||||
|
#define UPDATEWIDE (PORTTILESWIDE+1)
|
||||||
|
#define UPDATEHIGH PORTTILESHIGH
|
||||||
|
|
||||||
|
#define MAXTICS 6
|
||||||
|
#define DEMOTICS 3
|
||||||
|
|
||||||
|
#define UPDATETERMINATE 0x0301
|
||||||
|
|
||||||
|
extern unsigned mapwidth,mapheight,tics;
|
||||||
|
extern boolean compatability;
|
||||||
|
|
||||||
|
extern byte *updateptr;
|
||||||
|
extern unsigned uwidthtable[UPDATEHIGH];
|
||||||
|
extern unsigned blockstarts[UPDATEWIDE*UPDATEHIGH];
|
||||||
@@ -0,0 +1,208 @@
|
|||||||
|
/* Catacomb 3-D Source Code
|
||||||
|
* Copyright (C) 1993-2014 Flat Rock Software
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along
|
||||||
|
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
//
|
||||||
|
// ID Engine
|
||||||
|
// ID_IN.h - Header file for Input Manager
|
||||||
|
// v1.0d1
|
||||||
|
// By Jason Blochowiak
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef __TYPES__
|
||||||
|
#include "ID_Types.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __ID_IN__
|
||||||
|
#define __ID_IN__
|
||||||
|
|
||||||
|
#ifdef __DEBUG__
|
||||||
|
#define __DEBUG_InputMgr__
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define MaxPlayers 4
|
||||||
|
#define MaxKbds 2
|
||||||
|
#define MaxJoys 2
|
||||||
|
#define NumCodes 128
|
||||||
|
|
||||||
|
typedef byte ScanCode;
|
||||||
|
#define sc_None 0
|
||||||
|
#define sc_Bad 0xff
|
||||||
|
#define sc_Return 0x1c
|
||||||
|
#define sc_Enter sc_Return
|
||||||
|
#define sc_Escape 0x01
|
||||||
|
#define sc_Space 0x39
|
||||||
|
#define sc_BackSpace 0x0e
|
||||||
|
#define sc_Tab 0x0f
|
||||||
|
#define sc_Alt 0x38
|
||||||
|
#define sc_Control 0x1d
|
||||||
|
#define sc_CapsLock 0x3a
|
||||||
|
#define sc_LShift 0x2a
|
||||||
|
#define sc_RShift 0x36
|
||||||
|
#define sc_UpArrow 0x48
|
||||||
|
#define sc_DownArrow 0x50
|
||||||
|
#define sc_LeftArrow 0x4b
|
||||||
|
#define sc_RightArrow 0x4d
|
||||||
|
#define sc_Insert 0x52
|
||||||
|
#define sc_Delete 0x53
|
||||||
|
#define sc_Home 0x47
|
||||||
|
#define sc_End 0x4f
|
||||||
|
#define sc_PgUp 0x49
|
||||||
|
#define sc_PgDn 0x51
|
||||||
|
#define sc_F1 0x3b
|
||||||
|
#define sc_F2 0x3c
|
||||||
|
#define sc_F3 0x3d
|
||||||
|
#define sc_F4 0x3e
|
||||||
|
#define sc_F5 0x3f
|
||||||
|
#define sc_F6 0x40
|
||||||
|
#define sc_F7 0x41
|
||||||
|
#define sc_F8 0x42
|
||||||
|
#define sc_F9 0x43
|
||||||
|
#define sc_F10 0x44
|
||||||
|
#define sc_F11 0x57
|
||||||
|
#define sc_F12 0x59
|
||||||
|
|
||||||
|
#define sc_A 0x1e
|
||||||
|
#define sc_B 0x30
|
||||||
|
#define sc_C 0x2e
|
||||||
|
#define sc_D 0x20
|
||||||
|
#define sc_E 0x12
|
||||||
|
#define sc_F 0x21
|
||||||
|
#define sc_G 0x22
|
||||||
|
#define sc_H 0x23
|
||||||
|
#define sc_I 0x17
|
||||||
|
#define sc_J 0x24
|
||||||
|
#define sc_K 0x25
|
||||||
|
#define sc_L 0x26
|
||||||
|
#define sc_M 0x32
|
||||||
|
#define sc_N 0x31
|
||||||
|
#define sc_O 0x18
|
||||||
|
#define sc_P 0x19
|
||||||
|
#define sc_Q 0x10
|
||||||
|
#define sc_R 0x13
|
||||||
|
#define sc_S 0x1f
|
||||||
|
#define sc_T 0x14
|
||||||
|
#define sc_U 0x16
|
||||||
|
#define sc_V 0x2f
|
||||||
|
#define sc_W 0x11
|
||||||
|
#define sc_X 0x2d
|
||||||
|
#define sc_Y 0x15
|
||||||
|
#define sc_Z 0x2c
|
||||||
|
|
||||||
|
#define key_None 0
|
||||||
|
#define key_Return 0x0d
|
||||||
|
#define key_Enter key_Return
|
||||||
|
#define key_Escape 0x1b
|
||||||
|
#define key_Space 0x20
|
||||||
|
#define key_BackSpace 0x08
|
||||||
|
#define key_Tab 0x09
|
||||||
|
#define key_Delete 0x7f
|
||||||
|
|
||||||
|
// Stuff for the mouse
|
||||||
|
#define MReset 0
|
||||||
|
#define MButtons 3
|
||||||
|
#define MDelta 11
|
||||||
|
|
||||||
|
#define MouseInt 0x33
|
||||||
|
#define Mouse(x) _AX = x,geninterrupt(MouseInt)
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
demo_Off,demo_Record,demo_Playback,demo_PlayDone
|
||||||
|
} Demo;
|
||||||
|
typedef enum {
|
||||||
|
ctrl_Keyboard,
|
||||||
|
ctrl_Keyboard1 = ctrl_Keyboard,ctrl_Keyboard2,
|
||||||
|
ctrl_Joystick,
|
||||||
|
ctrl_Joystick1 = ctrl_Joystick,ctrl_Joystick2,
|
||||||
|
ctrl_Mouse
|
||||||
|
} ControlType;
|
||||||
|
typedef enum {
|
||||||
|
motion_Left = -1,motion_Up = -1,
|
||||||
|
motion_None = 0,
|
||||||
|
motion_Right = 1,motion_Down = 1
|
||||||
|
} Motion;
|
||||||
|
typedef enum {
|
||||||
|
dir_North,dir_NorthEast,
|
||||||
|
dir_East,dir_SouthEast,
|
||||||
|
dir_South,dir_SouthWest,
|
||||||
|
dir_West,dir_NorthWest,
|
||||||
|
dir_None
|
||||||
|
} Direction;
|
||||||
|
typedef struct {
|
||||||
|
boolean button0,button1;
|
||||||
|
int x,y;
|
||||||
|
Motion xaxis,yaxis;
|
||||||
|
Direction dir;
|
||||||
|
} CursorInfo;
|
||||||
|
typedef CursorInfo ControlInfo;
|
||||||
|
typedef struct {
|
||||||
|
ScanCode button0,button1,
|
||||||
|
upleft, up, upright,
|
||||||
|
left, right,
|
||||||
|
downleft, down, downright;
|
||||||
|
} KeyboardDef;
|
||||||
|
typedef struct {
|
||||||
|
word joyMinX,joyMinY,
|
||||||
|
threshMinX,threshMinY,
|
||||||
|
threshMaxX,threshMaxY,
|
||||||
|
joyMaxX,joyMaxY,
|
||||||
|
joyMultXL,joyMultYL,
|
||||||
|
joyMultXH,joyMultYH;
|
||||||
|
} JoystickDef;
|
||||||
|
// Global variables
|
||||||
|
extern boolean Keyboard[],
|
||||||
|
MousePresent,
|
||||||
|
JoysPresent[];
|
||||||
|
extern boolean Paused;
|
||||||
|
extern char LastASCII;
|
||||||
|
extern ScanCode LastScan;
|
||||||
|
extern KeyboardDef KbdDefs[];
|
||||||
|
extern JoystickDef JoyDefs[];
|
||||||
|
extern ControlType Controls[MaxPlayers];
|
||||||
|
|
||||||
|
extern Demo DemoMode;
|
||||||
|
extern byte _seg *DemoBuffer;
|
||||||
|
extern word DemoOffset,DemoSize;
|
||||||
|
|
||||||
|
// Function prototypes
|
||||||
|
#define IN_KeyDown(code) (Keyboard[(code)])
|
||||||
|
#define IN_ClearKey(code) {Keyboard[code] = false;\
|
||||||
|
if (code == LastScan) LastScan = sc_None;}
|
||||||
|
|
||||||
|
// DEBUG - put names in prototypes
|
||||||
|
extern void IN_Startup(void),IN_Shutdown(void),
|
||||||
|
IN_Default(boolean gotit,ControlType in),
|
||||||
|
IN_SetKeyHook(void (*)()),
|
||||||
|
IN_ClearKeysDown(void),
|
||||||
|
IN_ReadCursor(CursorInfo *),
|
||||||
|
IN_ReadControl(int,ControlInfo *),
|
||||||
|
IN_SetControlType(int,ControlType),
|
||||||
|
IN_GetJoyAbs(word joy,word *xp,word *yp),
|
||||||
|
IN_SetupJoy(word joy,word minx,word maxx,
|
||||||
|
word miny,word maxy),
|
||||||
|
IN_StartDemoPlayback(byte _seg *buffer,word bufsize),
|
||||||
|
IN_StopDemo(void),IN_FreeDemoBuffer(void),
|
||||||
|
IN_Ack(void),IN_AckBack(void);
|
||||||
|
extern boolean IN_UserInput(longword delay,boolean clear),
|
||||||
|
IN_IsUserInput(void),
|
||||||
|
IN_StartDemoRecord(word bufsize);
|
||||||
|
extern byte *IN_GetScanName(ScanCode);
|
||||||
|
extern char IN_WaitForASCII(void);
|
||||||
|
extern ScanCode IN_WaitForKey(void);
|
||||||
|
extern word IN_GetJoyButtonsDB(word joy);
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,108 @@
|
|||||||
|
/* Catacomb 3-D Source Code
|
||||||
|
* Copyright (C) 1993-2014 Flat Rock Software
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along
|
||||||
|
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// ID_MM.H
|
||||||
|
|
||||||
|
#ifndef __ID_CA__
|
||||||
|
|
||||||
|
#define __ID_CA__
|
||||||
|
|
||||||
|
#define SAVENEARHEAP 0x400 // space to leave in data segment
|
||||||
|
#define SAVEFARHEAP 0 // space to leave in far heap
|
||||||
|
|
||||||
|
#define BUFFERSIZE 0x1000 // miscelanious, allways available buffer
|
||||||
|
|
||||||
|
#define MAXBLOCKS 600
|
||||||
|
|
||||||
|
|
||||||
|
//--------
|
||||||
|
|
||||||
|
#define EMS_INT 0x67
|
||||||
|
|
||||||
|
#define EMS_STATUS 0x40
|
||||||
|
#define EMS_GETFRAME 0x41
|
||||||
|
#define EMS_GETPAGES 0x42
|
||||||
|
#define EMS_ALLOCPAGES 0x43
|
||||||
|
#define EMS_MAPPAGE 0x44
|
||||||
|
#define EMS_FREEPAGES 0x45
|
||||||
|
#define EMS_VERSION 0x46
|
||||||
|
|
||||||
|
//--------
|
||||||
|
|
||||||
|
#define XMS_VERSION 0x00
|
||||||
|
|
||||||
|
#define XMS_ALLOCHMA 0x01
|
||||||
|
#define XMS_FREEHMA 0x02
|
||||||
|
|
||||||
|
#define XMS_GENABLEA20 0x03
|
||||||
|
#define XMS_GDISABLEA20 0x04
|
||||||
|
#define XMS_LENABLEA20 0x05
|
||||||
|
#define XMS_LDISABLEA20 0x06
|
||||||
|
#define XMS_QUERYA20 0x07
|
||||||
|
|
||||||
|
#define XMS_QUERYREE 0x08
|
||||||
|
#define XMS_ALLOC 0x09
|
||||||
|
#define XMS_FREE 0x0A
|
||||||
|
#define XMS_MOVE 0x0B
|
||||||
|
#define XMS_LOCK 0x0C
|
||||||
|
#define XMS_UNLOCK 0x0D
|
||||||
|
#define XMS_GETINFO 0x0E
|
||||||
|
#define XMS_RESIZE 0x0F
|
||||||
|
|
||||||
|
#define XMS_ALLOCUMB 0x10
|
||||||
|
#define XMS_FREEUMB 0x11
|
||||||
|
|
||||||
|
//==========================================================================
|
||||||
|
|
||||||
|
typedef void _seg * memptr;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
long nearheap,farheap,EMSmem,XMSmem,mainmem;
|
||||||
|
} mminfotype;
|
||||||
|
|
||||||
|
//==========================================================================
|
||||||
|
|
||||||
|
extern mminfotype mminfo;
|
||||||
|
extern memptr bufferseg;
|
||||||
|
extern boolean mmerror;
|
||||||
|
|
||||||
|
extern void (* beforesort) (void);
|
||||||
|
extern void (* aftersort) (void);
|
||||||
|
|
||||||
|
//==========================================================================
|
||||||
|
|
||||||
|
void MM_Startup (void);
|
||||||
|
void MM_Shutdown (void);
|
||||||
|
void MM_MapEMS (void);
|
||||||
|
|
||||||
|
void MM_GetPtr (memptr *baseptr,unsigned long size);
|
||||||
|
void MM_FreePtr (memptr *baseptr);
|
||||||
|
|
||||||
|
void MM_SetPurge (memptr *baseptr, int purge);
|
||||||
|
void MM_SetLock (memptr *baseptr, boolean locked);
|
||||||
|
void MM_SortMem (void);
|
||||||
|
|
||||||
|
void MM_ShowMemory (void);
|
||||||
|
|
||||||
|
long MM_UnusedMemory (void);
|
||||||
|
long MM_TotalFree (void);
|
||||||
|
|
||||||
|
void MM_BombOnError (boolean bomb);
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,153 @@
|
|||||||
|
/* Catacomb 3-D Source Code
|
||||||
|
* Copyright (C) 1993-2014 Flat Rock Software
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along
|
||||||
|
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// ID_RF.H
|
||||||
|
|
||||||
|
#define __ID_RF__
|
||||||
|
|
||||||
|
#ifndef __ID_MM__
|
||||||
|
#include "ID_MM.H"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
=============================================================================
|
||||||
|
|
||||||
|
CONSTANTS
|
||||||
|
|
||||||
|
=============================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define MINTICS 2
|
||||||
|
#define MAXTICS 6
|
||||||
|
#define DEMOTICS 3
|
||||||
|
|
||||||
|
#define MAPBORDER 2 // map border must be at least 1
|
||||||
|
|
||||||
|
#define MAXSPRITES 50 // max tracked sprites
|
||||||
|
#define MAXANIMTILES 90 // max animating tiles on screen
|
||||||
|
#define MAXANIMTYPES 50 // max different unique anim tiles on map
|
||||||
|
|
||||||
|
#define MAXMAPHEIGHT 200
|
||||||
|
|
||||||
|
#define PRIORITIES 4
|
||||||
|
#define MASKEDTILEPRIORITY 3 // planes go: 0,1,2,MTILES,3
|
||||||
|
|
||||||
|
#define TILEGLOBAL 256
|
||||||
|
#define PIXGLOBAL 16
|
||||||
|
|
||||||
|
#define G_T_SHIFT 8 // global >> ?? = tile
|
||||||
|
#define G_P_SHIFT 4 // global >> ?? = pixels
|
||||||
|
#define P_T_SHIFT 4 // pixels >> ?? = tile
|
||||||
|
|
||||||
|
#define PORTTILESWIDE 21 // all drawing takes place inside a
|
||||||
|
#define PORTTILESHIGH 14 // non displayed port of this size
|
||||||
|
|
||||||
|
//#define PORTGLOBALWIDE (21*TILEGLOBAL)
|
||||||
|
//#define PORTGLOBALHIGH (14*TILEGLOBAL)
|
||||||
|
|
||||||
|
#define UPDATEWIDE (PORTTILESWIDE+1)
|
||||||
|
#define UPDATEHIGH PORTTILESHIGH
|
||||||
|
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
|
typedef enum {spritedraw,maskdraw} drawtype;
|
||||||
|
|
||||||
|
/*
|
||||||
|
=============================================================================
|
||||||
|
|
||||||
|
PUBLIC VARIABLES
|
||||||
|
|
||||||
|
=============================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
extern boolean compatability; // crippled refresh for wierdo SVGAs
|
||||||
|
|
||||||
|
extern unsigned tics;
|
||||||
|
extern long lasttimecount;
|
||||||
|
|
||||||
|
extern unsigned originxglobal,originyglobal;
|
||||||
|
extern unsigned originxtile,originytile;
|
||||||
|
extern unsigned originxscreen,originyscreen;
|
||||||
|
|
||||||
|
extern unsigned mapwidth,mapheight,mapbyteswide,mapwordswide
|
||||||
|
,mapbytesextra,mapwordsextra;
|
||||||
|
extern unsigned mapbwidthtable[MAXMAPHEIGHT];
|
||||||
|
|
||||||
|
extern unsigned originxmin,originxmax,originymin,originymax;
|
||||||
|
|
||||||
|
extern unsigned masterofs;
|
||||||
|
|
||||||
|
//
|
||||||
|
// the floating update window is also used by the view manager for
|
||||||
|
// double buffer tracking
|
||||||
|
//
|
||||||
|
|
||||||
|
extern byte *updateptr; // current start of update window
|
||||||
|
|
||||||
|
#if GRMODE == CGAGR
|
||||||
|
extern byte *baseupdateptr;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern unsigned blockstarts[UPDATEWIDE*UPDATEHIGH];
|
||||||
|
extern unsigned updatemapofs[UPDATEWIDE*UPDATEHIGH];
|
||||||
|
extern unsigned uwidthtable[UPDATEHIGH]; // lookup instead of multiple
|
||||||
|
|
||||||
|
#define UPDATETERMINATE 0x0301
|
||||||
|
|
||||||
|
/*
|
||||||
|
=============================================================================
|
||||||
|
|
||||||
|
PUBLIC FUNCTIONS
|
||||||
|
|
||||||
|
=============================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
void RF_Startup (void);
|
||||||
|
void RF_Shutdown (void);
|
||||||
|
|
||||||
|
void RF_FixOfs (void);
|
||||||
|
void RF_NewMap (void);
|
||||||
|
void RF_MarkTileGraphics (void);
|
||||||
|
void RF_SetScrollBlock (int x, int y, boolean horizontal);
|
||||||
|
void RF_NewPosition (unsigned x, unsigned y);
|
||||||
|
void RF_Scroll (int x, int y);
|
||||||
|
|
||||||
|
void RF_MapToMap (unsigned srcx, unsigned srcy,
|
||||||
|
unsigned destx, unsigned desty,
|
||||||
|
unsigned width, unsigned height);
|
||||||
|
void RF_MemToMap (unsigned far *source, unsigned plane,
|
||||||
|
unsigned destx, unsigned desty,
|
||||||
|
unsigned width, unsigned height);
|
||||||
|
|
||||||
|
void RF_ClearBlock (int x, int y, int width, int height);
|
||||||
|
void RF_RedrawBlock (int x, int y, int width, int height);
|
||||||
|
|
||||||
|
void RF_PlaceSprite (void **user,unsigned globalx,unsigned globaly,
|
||||||
|
unsigned spritenumber, drawtype draw, int priority);
|
||||||
|
void RF_RemoveSprite (void **user);
|
||||||
|
|
||||||
|
void RF_CalcTics (void);
|
||||||
|
|
||||||
|
void RF_Refresh (void);
|
||||||
|
void RF_ForceRefresh (void);
|
||||||
|
void RF_SetRefreshHook (void (*func) (void) );
|
||||||
|
|
||||||
|
unsigned RF_FindFreeBuffer (void);
|
||||||
|
|
||||||
+690
@@ -0,0 +1,690 @@
|
|||||||
|
; Catacomb 3-D Source Code
|
||||||
|
; Copyright (C) 1993-2014 Flat Rock Software
|
||||||
|
;
|
||||||
|
; This program is free software; you can redistribute it and/or modify
|
||||||
|
; it under the terms of the GNU General Public License as published by
|
||||||
|
; the Free Software Foundation; either version 2 of the License, or
|
||||||
|
; (at your option) any later version.
|
||||||
|
;
|
||||||
|
; This program is distributed in the hope that it will be useful,
|
||||||
|
; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
; GNU General Public License for more details.
|
||||||
|
;
|
||||||
|
; You should have received a copy of the GNU General Public License along
|
||||||
|
; with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
; 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
|
||||||
|
; ID_RF_A.ASM
|
||||||
|
|
||||||
|
IDEAL
|
||||||
|
MODEL MEDIUM,C
|
||||||
|
|
||||||
|
INCLUDE "ID_ASM.EQU"
|
||||||
|
|
||||||
|
;============================================================================
|
||||||
|
|
||||||
|
TILESWIDE = 21
|
||||||
|
TILESHIGH = 14
|
||||||
|
|
||||||
|
UPDATESIZE = (TILESWIDE+1)*TILESHIGH+1
|
||||||
|
|
||||||
|
DATASEG
|
||||||
|
|
||||||
|
EXTRN screenseg:WORD
|
||||||
|
EXTRN updateptr:WORD
|
||||||
|
EXTRN updatestart:WORD
|
||||||
|
EXTRN masterofs:WORD ;start of master tile port
|
||||||
|
EXTRN bufferofs:WORD ;start of current buffer port
|
||||||
|
EXTRN screenstart:WORD ;starts of three screens (0/1/master) in EGA mem
|
||||||
|
EXTRN grsegs:WORD
|
||||||
|
EXTRN mapsegs:WORD
|
||||||
|
EXTRN originmap:WORD
|
||||||
|
EXTRN updatemapofs:WORD
|
||||||
|
EXTRN tinf:WORD ;seg pointer to map header and tile info
|
||||||
|
EXTRN blockstarts:WORD ;offsets from bufferofs for each update block
|
||||||
|
|
||||||
|
planemask db ?
|
||||||
|
planenum db ?
|
||||||
|
|
||||||
|
CODESEG
|
||||||
|
|
||||||
|
screenstartcs dw ? ;in code segment for accesability
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
IFE GRMODE-CGAGR
|
||||||
|
;============================================================================
|
||||||
|
;
|
||||||
|
; CGA refresh routines
|
||||||
|
;
|
||||||
|
;============================================================================
|
||||||
|
|
||||||
|
TILEWIDTH = 4
|
||||||
|
|
||||||
|
;=================
|
||||||
|
;
|
||||||
|
; RFL_NewTile
|
||||||
|
;
|
||||||
|
; Draws a composit two plane tile to the master screen and sets the update
|
||||||
|
; spot to 1 in both update pages, forcing the tile to be copied to the
|
||||||
|
; view pages the next two refreshes
|
||||||
|
;
|
||||||
|
; Called to draw newlly scrolled on strips and animating tiles
|
||||||
|
;
|
||||||
|
;=================
|
||||||
|
|
||||||
|
PROC RFL_NewTile updateoffset:WORD
|
||||||
|
PUBLIC RFL_NewTile
|
||||||
|
USES SI,DI
|
||||||
|
|
||||||
|
;
|
||||||
|
; mark both update lists at this spot
|
||||||
|
;
|
||||||
|
mov di,[updateoffset]
|
||||||
|
|
||||||
|
mov bx,[updateptr] ;start of update matrix
|
||||||
|
mov [BYTE bx+di],1
|
||||||
|
|
||||||
|
mov dx,SCREENWIDTH-TILEWIDTH ;add to get to start of next line
|
||||||
|
|
||||||
|
;
|
||||||
|
; set di to the location in screenseg to draw the tile
|
||||||
|
;
|
||||||
|
shl di,1
|
||||||
|
mov si,[updatemapofs+di] ;offset in map from origin
|
||||||
|
add si,[originmap]
|
||||||
|
mov di,[blockstarts+di] ;screen location for tile
|
||||||
|
add di,[masterofs]
|
||||||
|
|
||||||
|
;
|
||||||
|
; set BX to the foreground tile number and SI to the background number
|
||||||
|
; If either BX or SI = 0xFFFF, the tile does not need to be masked together
|
||||||
|
; as one of the planes totally eclipses the other
|
||||||
|
;
|
||||||
|
mov es,[mapsegs+2] ;foreground plane
|
||||||
|
mov bx,[es:si]
|
||||||
|
mov es,[mapsegs] ;background plane
|
||||||
|
mov si,[es:si]
|
||||||
|
|
||||||
|
mov es,[screenseg]
|
||||||
|
|
||||||
|
or bx,bx
|
||||||
|
jz @@singletile
|
||||||
|
jmp @@maskeddraw ;draw both together
|
||||||
|
|
||||||
|
;=============
|
||||||
|
;
|
||||||
|
; Draw single background tile from main memory
|
||||||
|
;
|
||||||
|
;=============
|
||||||
|
|
||||||
|
@@singletile:
|
||||||
|
shl si,1
|
||||||
|
mov ds,[grsegs+STARTTILE16*2+si]
|
||||||
|
|
||||||
|
xor si,si ;block is segment aligned
|
||||||
|
|
||||||
|
REPT 15
|
||||||
|
movsw
|
||||||
|
movsw
|
||||||
|
add di,dx
|
||||||
|
ENDM
|
||||||
|
movsw
|
||||||
|
movsw
|
||||||
|
|
||||||
|
mov ax,ss
|
||||||
|
mov ds,ax ;restore turbo's data segment
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
;=========
|
||||||
|
;
|
||||||
|
; Draw a masked tile combo
|
||||||
|
; Interupts are disabled and the stack segment is reassigned
|
||||||
|
;
|
||||||
|
;=========
|
||||||
|
@@maskeddraw:
|
||||||
|
cli ; don't allow ints when SS is set
|
||||||
|
shl bx,1
|
||||||
|
mov ss,[grsegs+STARTTILE16M*2+bx]
|
||||||
|
shl si,1
|
||||||
|
mov ds,[grsegs+STARTTILE16*2+si]
|
||||||
|
|
||||||
|
xor si,si ;first word of tile data
|
||||||
|
|
||||||
|
REPT 16
|
||||||
|
mov ax,[si] ;background tile
|
||||||
|
and ax,[ss:si] ;mask
|
||||||
|
or ax,[ss:si+64] ;masked data
|
||||||
|
stosw
|
||||||
|
mov ax,[si+2] ;background tile
|
||||||
|
and ax,[ss:si+2] ;mask
|
||||||
|
or ax,[ss:si+66] ;masked data
|
||||||
|
stosw
|
||||||
|
add si,4
|
||||||
|
add di,dx
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
mov ax,@DATA
|
||||||
|
mov ss,ax
|
||||||
|
sti
|
||||||
|
mov ds,ax
|
||||||
|
ret
|
||||||
|
ENDP
|
||||||
|
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
IFE GRMODE-EGAGR
|
||||||
|
;===========================================================================
|
||||||
|
;
|
||||||
|
; EGA refresh routines
|
||||||
|
;
|
||||||
|
;===========================================================================
|
||||||
|
|
||||||
|
TILEWIDTH = 2
|
||||||
|
|
||||||
|
;=================
|
||||||
|
;
|
||||||
|
; RFL_NewTile
|
||||||
|
;
|
||||||
|
; Draws a composit two plane tile to the master screen and sets the update
|
||||||
|
; spot to 1 in both update pages, forcing the tile to be copied to the
|
||||||
|
; view pages the next two refreshes
|
||||||
|
;
|
||||||
|
; Called to draw newlly scrolled on strips and animating tiles
|
||||||
|
;
|
||||||
|
; Assumes write mode 0
|
||||||
|
;
|
||||||
|
;=================
|
||||||
|
|
||||||
|
PROC RFL_NewTile updateoffset:WORD
|
||||||
|
PUBLIC RFL_NewTile
|
||||||
|
USES SI,DI
|
||||||
|
|
||||||
|
;
|
||||||
|
; mark both update lists at this spot
|
||||||
|
;
|
||||||
|
mov di,[updateoffset]
|
||||||
|
|
||||||
|
mov bx,[updatestart] ;page 0 pointer
|
||||||
|
mov [BYTE bx+di],1
|
||||||
|
mov bx,[updatestart+2] ;page 1 pointer
|
||||||
|
mov [BYTE bx+di],1
|
||||||
|
|
||||||
|
;
|
||||||
|
; set screenstartcs to the location in screenseg to draw the tile
|
||||||
|
;
|
||||||
|
shl di,1
|
||||||
|
mov si,[updatemapofs+di] ;offset in map from origin
|
||||||
|
add si,[originmap]
|
||||||
|
mov di,[blockstarts+di] ;screen location for tile
|
||||||
|
add di,[masterofs]
|
||||||
|
mov [cs:screenstartcs],di
|
||||||
|
|
||||||
|
;
|
||||||
|
; set BX to the foreground tile number and SI to the background number
|
||||||
|
; If either BX or SI = 0xFFFF, the tile does not need to be masked together
|
||||||
|
; as one of the planes totally eclipses the other
|
||||||
|
;
|
||||||
|
mov es,[mapsegs+2] ;foreground plane
|
||||||
|
mov bx,[es:si]
|
||||||
|
mov es,[mapsegs] ;background plane
|
||||||
|
mov si,[es:si]
|
||||||
|
|
||||||
|
mov es,[screenseg]
|
||||||
|
mov dx,SC_INDEX ;for stepping through map mask planes
|
||||||
|
|
||||||
|
or bx,bx
|
||||||
|
jz @@singletile
|
||||||
|
jmp @@maskeddraw ;draw both together
|
||||||
|
|
||||||
|
;=========
|
||||||
|
;
|
||||||
|
; No foreground tile, so draw a single background tile.
|
||||||
|
;
|
||||||
|
;=========
|
||||||
|
@@singletile:
|
||||||
|
|
||||||
|
mov bx,SCREENWIDTH-2 ;add to get to start of next line
|
||||||
|
shl si,1
|
||||||
|
|
||||||
|
mov ax,[cs:screenstartcs]
|
||||||
|
mov ds,[grsegs+STARTTILE16*2+si]
|
||||||
|
|
||||||
|
xor si,si ;block is segment aligned
|
||||||
|
|
||||||
|
mov ax,SC_MAPMASK+0001b*256 ;map mask for plane 0
|
||||||
|
|
||||||
|
mov cx,4 ;draw four planes
|
||||||
|
@@planeloop:
|
||||||
|
mov dx,SC_INDEX
|
||||||
|
WORDOUT
|
||||||
|
|
||||||
|
mov di,[cs:screenstartcs] ;start at same place in all planes
|
||||||
|
|
||||||
|
REPT 15
|
||||||
|
movsw
|
||||||
|
add di,bx
|
||||||
|
ENDM
|
||||||
|
movsw
|
||||||
|
|
||||||
|
shl ah,1 ;shift plane mask over for next plane
|
||||||
|
loop @@planeloop
|
||||||
|
|
||||||
|
mov ax,ss
|
||||||
|
mov ds,ax ;restore turbo's data segment
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
;=========
|
||||||
|
;
|
||||||
|
; Draw a masked tile combo
|
||||||
|
; Interupts are disabled and the stack segment is reassigned
|
||||||
|
;
|
||||||
|
;=========
|
||||||
|
@@maskeddraw:
|
||||||
|
cli ; don't allow ints when SS is set
|
||||||
|
shl bx,1
|
||||||
|
mov ss,[grsegs+STARTTILE16M*2+bx]
|
||||||
|
shl si,1
|
||||||
|
mov ds,[grsegs+STARTTILE16*2+si]
|
||||||
|
|
||||||
|
xor si,si ;first word of tile data
|
||||||
|
|
||||||
|
mov ax,SC_MAPMASK+0001b*256 ;map mask for plane 0
|
||||||
|
|
||||||
|
mov di,[cs:screenstartcs]
|
||||||
|
@@planeloopm:
|
||||||
|
WORDOUT
|
||||||
|
tileofs = 0
|
||||||
|
lineoffset = 0
|
||||||
|
REPT 16
|
||||||
|
mov bx,[si+tileofs] ;background tile
|
||||||
|
and bx,[ss:tileofs] ;mask
|
||||||
|
or bx,[ss:si+tileofs+32] ;masked data
|
||||||
|
mov [es:di+lineoffset],bx
|
||||||
|
tileofs = tileofs + 2
|
||||||
|
lineoffset = lineoffset + SCREENWIDTH
|
||||||
|
ENDM
|
||||||
|
add si,32
|
||||||
|
shl ah,1 ;shift plane mask over for next plane
|
||||||
|
cmp ah,10000b
|
||||||
|
je @@done ;drawn all four planes
|
||||||
|
jmp @@planeloopm
|
||||||
|
|
||||||
|
@@done:
|
||||||
|
mov ax,@DATA
|
||||||
|
mov ss,ax
|
||||||
|
sti
|
||||||
|
mov ds,ax
|
||||||
|
ret
|
||||||
|
ENDP
|
||||||
|
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
IFE GRMODE-VGAGR
|
||||||
|
;============================================================================
|
||||||
|
;
|
||||||
|
; VGA refresh routines
|
||||||
|
;
|
||||||
|
;============================================================================
|
||||||
|
|
||||||
|
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
|
||||||
|
;============================================================================
|
||||||
|
;
|
||||||
|
; reasonably common refresh routines
|
||||||
|
;
|
||||||
|
;============================================================================
|
||||||
|
|
||||||
|
|
||||||
|
;=================
|
||||||
|
;
|
||||||
|
; RFL_UpdateTiles
|
||||||
|
;
|
||||||
|
; Scans through the update matrix pointed to by updateptr, looking for 1s.
|
||||||
|
; A 1 represents a tile that needs to be copied from the master screen to the
|
||||||
|
; current screen (a new row or an animated tiled). If more than one adjacent
|
||||||
|
; tile in a horizontal row needs to be copied, they will be copied as a group.
|
||||||
|
;
|
||||||
|
; Assumes write mode 1
|
||||||
|
;
|
||||||
|
;=================
|
||||||
|
|
||||||
|
|
||||||
|
; AX 0/1 for scasb, temp for segment register transfers
|
||||||
|
; BX width for block copies
|
||||||
|
; CX REP counter
|
||||||
|
; DX line width deltas
|
||||||
|
; SI source for copies
|
||||||
|
; DI scas dest / movsb dest
|
||||||
|
; BP pointer to UPDATETERMINATE
|
||||||
|
;
|
||||||
|
; DS
|
||||||
|
; ES
|
||||||
|
; SS
|
||||||
|
|
||||||
|
PROC RFL_UpdateTiles
|
||||||
|
PUBLIC RFL_UpdateTiles
|
||||||
|
USES SI,DI,BP
|
||||||
|
|
||||||
|
jmp SHORT @@realstart
|
||||||
|
@@done:
|
||||||
|
;
|
||||||
|
; all tiles have been scanned
|
||||||
|
;
|
||||||
|
ret
|
||||||
|
|
||||||
|
@@realstart:
|
||||||
|
mov di,[updateptr]
|
||||||
|
mov bp,(TILESWIDE+1)*TILESHIGH+1
|
||||||
|
add bp,di ; when di = bx, all tiles have been scanned
|
||||||
|
push di
|
||||||
|
mov cx,-1 ; definately scan the entire thing
|
||||||
|
|
||||||
|
;
|
||||||
|
; scan for a 1 in the update list, meaning a tile needs to be copied
|
||||||
|
; from the master screen to the current screen
|
||||||
|
;
|
||||||
|
@@findtile:
|
||||||
|
pop di ; place to continue scaning from
|
||||||
|
mov ax,ss
|
||||||
|
mov es,ax ; search in the data segment
|
||||||
|
mov ds,ax
|
||||||
|
mov al,1
|
||||||
|
repne scasb
|
||||||
|
cmp di,bp
|
||||||
|
je @@done
|
||||||
|
|
||||||
|
cmp [BYTE di],al
|
||||||
|
jne @@singletile
|
||||||
|
jmp @@tileblock
|
||||||
|
|
||||||
|
;============
|
||||||
|
;
|
||||||
|
; copy a single tile
|
||||||
|
;
|
||||||
|
;============
|
||||||
|
EVEN
|
||||||
|
@@singletile:
|
||||||
|
inc di ; we know the next tile is nothing
|
||||||
|
push di ; save off the spot being scanned
|
||||||
|
sub di,[updateptr]
|
||||||
|
shl di,1
|
||||||
|
mov di,[blockstarts-4+di] ; start of tile location on screen
|
||||||
|
mov si,di
|
||||||
|
add di,[bufferofs] ; dest in current screen
|
||||||
|
add si,[masterofs] ; source in master screen
|
||||||
|
|
||||||
|
mov dx,SCREENWIDTH-TILEWIDTH
|
||||||
|
mov ax,[screenseg]
|
||||||
|
mov ds,ax
|
||||||
|
mov es,ax
|
||||||
|
|
||||||
|
;--------------------------
|
||||||
|
|
||||||
|
IFE GRMODE-CGAGR
|
||||||
|
|
||||||
|
REPT 15
|
||||||
|
movsw
|
||||||
|
movsw
|
||||||
|
add si,dx
|
||||||
|
add di,dx
|
||||||
|
ENDM
|
||||||
|
movsw
|
||||||
|
movsw
|
||||||
|
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
;--------------------------
|
||||||
|
|
||||||
|
IFE GRMODE-EGAGR
|
||||||
|
|
||||||
|
REPT 15
|
||||||
|
movsb
|
||||||
|
movsb
|
||||||
|
add si,dx
|
||||||
|
add di,dx
|
||||||
|
ENDM
|
||||||
|
movsb
|
||||||
|
movsb
|
||||||
|
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
;--------------------------
|
||||||
|
|
||||||
|
jmp @@findtile
|
||||||
|
|
||||||
|
;============
|
||||||
|
;
|
||||||
|
; more than one tile in a row needs to be updated, so do it as a group
|
||||||
|
;
|
||||||
|
;============
|
||||||
|
EVEN
|
||||||
|
@@tileblock:
|
||||||
|
mov dx,di ; hold starting position + 1 in dx
|
||||||
|
inc di ; we know the next tile also gets updated
|
||||||
|
repe scasb ; see how many more in a row
|
||||||
|
push di ; save off the spot being scanned
|
||||||
|
|
||||||
|
mov bx,di
|
||||||
|
sub bx,dx ; number of tiles in a row
|
||||||
|
shl bx,1 ; number of bytes / row
|
||||||
|
|
||||||
|
mov di,dx ; lookup position of start tile
|
||||||
|
sub di,[updateptr]
|
||||||
|
shl di,1
|
||||||
|
mov di,[blockstarts-2+di] ; start of tile location
|
||||||
|
mov si,di
|
||||||
|
add di,[bufferofs] ; dest in current screen
|
||||||
|
add si,[masterofs] ; source in master screen
|
||||||
|
|
||||||
|
mov dx,SCREENWIDTH
|
||||||
|
sub dx,bx ; offset to next line on screen
|
||||||
|
IFE GRMODE-CGAGR
|
||||||
|
sub dx,bx ; bx is words wide in CGA tiles
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
mov ax,[screenseg]
|
||||||
|
mov ds,ax
|
||||||
|
mov es,ax
|
||||||
|
|
||||||
|
REPT 15
|
||||||
|
mov cx,bx
|
||||||
|
IFE GRMODE-CGAGR
|
||||||
|
rep movsw
|
||||||
|
ENDIF
|
||||||
|
IFE GRMODE-EGAGR
|
||||||
|
rep movsb
|
||||||
|
ENDIF
|
||||||
|
add si,dx
|
||||||
|
add di,dx
|
||||||
|
ENDM
|
||||||
|
mov cx,bx
|
||||||
|
IFE GRMODE-CGAGR
|
||||||
|
rep movsw
|
||||||
|
ENDIF
|
||||||
|
IFE GRMODE-EGAGR
|
||||||
|
rep movsb
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
dec cx ; was 0 from last rep movsb, now $ffff for scasb
|
||||||
|
jmp @@findtile
|
||||||
|
|
||||||
|
ENDP
|
||||||
|
|
||||||
|
|
||||||
|
;============================================================================
|
||||||
|
|
||||||
|
|
||||||
|
;=================
|
||||||
|
;
|
||||||
|
; RFL_MaskForegroundTiles
|
||||||
|
;
|
||||||
|
; Scan through update looking for 3's. If the foreground tile there is a
|
||||||
|
; masked foreground tile, draw it to the screen
|
||||||
|
;
|
||||||
|
;=================
|
||||||
|
|
||||||
|
PROC RFL_MaskForegroundTiles
|
||||||
|
PUBLIC RFL_MaskForegroundTiles
|
||||||
|
USES SI,DI,BP
|
||||||
|
jmp SHORT @@realstart
|
||||||
|
@@done:
|
||||||
|
;
|
||||||
|
; all tiles have been scanned
|
||||||
|
;
|
||||||
|
ret
|
||||||
|
|
||||||
|
@@realstart:
|
||||||
|
mov di,[updateptr]
|
||||||
|
mov bp,(TILESWIDE+1)*TILESHIGH+2
|
||||||
|
add bp,di ; when di = bx, all tiles have been scanned
|
||||||
|
push di
|
||||||
|
mov cx,-1 ; definately scan the entire thing
|
||||||
|
;
|
||||||
|
; scan for a 3 in the update list
|
||||||
|
;
|
||||||
|
@@findtile:
|
||||||
|
mov ax,ss
|
||||||
|
mov es,ax ; scan in the data segment
|
||||||
|
mov al,3
|
||||||
|
pop di ; place to continue scaning from
|
||||||
|
repne scasb
|
||||||
|
cmp di,bp
|
||||||
|
je @@done
|
||||||
|
|
||||||
|
;============
|
||||||
|
;
|
||||||
|
; found a tile, see if it needs to be masked on
|
||||||
|
;
|
||||||
|
;============
|
||||||
|
|
||||||
|
push di
|
||||||
|
|
||||||
|
sub di,[updateptr]
|
||||||
|
shl di,1
|
||||||
|
mov si,[updatemapofs-2+di] ; offset from originmap
|
||||||
|
add si,[originmap]
|
||||||
|
|
||||||
|
mov es,[mapsegs+2] ; foreground map plane segment
|
||||||
|
mov si,[es:si] ; foreground tile number
|
||||||
|
|
||||||
|
or si,si
|
||||||
|
jz @@findtile ; 0 = no foreground tile
|
||||||
|
|
||||||
|
mov bx,si
|
||||||
|
add bx,INTILE ;INTILE tile info table
|
||||||
|
mov es,[tinf]
|
||||||
|
test [BYTE PTR es:bx],80h ;high bit = masked tile
|
||||||
|
jz @@findtile
|
||||||
|
|
||||||
|
;-------------------
|
||||||
|
|
||||||
|
IFE GRMODE-CGAGR
|
||||||
|
;=================
|
||||||
|
;
|
||||||
|
; mask the tile CGA
|
||||||
|
;
|
||||||
|
;=================
|
||||||
|
|
||||||
|
mov di,[blockstarts-2+di]
|
||||||
|
add di,[bufferofs]
|
||||||
|
mov es,[screenseg]
|
||||||
|
shl si,1
|
||||||
|
mov ds,[grsegs+STARTTILE16M*2+si]
|
||||||
|
|
||||||
|
mov bx,64 ;data starts 64 bytes after mask
|
||||||
|
|
||||||
|
xor si,si
|
||||||
|
|
||||||
|
lineoffset = 0
|
||||||
|
REPT 16
|
||||||
|
mov ax,[es:di+lineoffset] ;background
|
||||||
|
and ax,[si] ;mask
|
||||||
|
or ax,[si+bx] ;masked data
|
||||||
|
mov [es:di+lineoffset],ax ;background
|
||||||
|
inc si
|
||||||
|
inc si
|
||||||
|
mov ax,[es:di+lineoffset+2] ;background
|
||||||
|
and ax,[si] ;mask
|
||||||
|
or ax,[si+bx] ;masked data
|
||||||
|
mov [es:di+lineoffset+2],ax ;background
|
||||||
|
inc si
|
||||||
|
inc si
|
||||||
|
lineoffset = lineoffset + SCREENWIDTH
|
||||||
|
ENDM
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
;-------------------
|
||||||
|
|
||||||
|
IFE GRMODE-EGAGR
|
||||||
|
;=================
|
||||||
|
;
|
||||||
|
; mask the tile
|
||||||
|
;
|
||||||
|
;=================
|
||||||
|
|
||||||
|
mov [BYTE planemask],1
|
||||||
|
mov [BYTE planenum],0
|
||||||
|
|
||||||
|
mov di,[blockstarts-2+di]
|
||||||
|
add di,[bufferofs]
|
||||||
|
mov [cs:screenstartcs],di
|
||||||
|
mov es,[screenseg]
|
||||||
|
shl si,1
|
||||||
|
mov ds,[grsegs+STARTTILE16M*2+si]
|
||||||
|
|
||||||
|
mov bx,32 ;data starts 32 bytes after mask
|
||||||
|
|
||||||
|
@@planeloopm:
|
||||||
|
mov dx,SC_INDEX
|
||||||
|
mov al,SC_MAPMASK
|
||||||
|
mov ah,[ss:planemask]
|
||||||
|
WORDOUT
|
||||||
|
mov dx,GC_INDEX
|
||||||
|
mov al,GC_READMAP
|
||||||
|
mov ah,[ss:planenum]
|
||||||
|
WORDOUT
|
||||||
|
|
||||||
|
xor si,si
|
||||||
|
mov di,[cs:screenstartcs]
|
||||||
|
lineoffset = 0
|
||||||
|
REPT 16
|
||||||
|
mov cx,[es:di+lineoffset] ;background
|
||||||
|
and cx,[si] ;mask
|
||||||
|
or cx,[si+bx] ;masked data
|
||||||
|
inc si
|
||||||
|
inc si
|
||||||
|
mov [es:di+lineoffset],cx
|
||||||
|
lineoffset = lineoffset + SCREENWIDTH
|
||||||
|
ENDM
|
||||||
|
add bx,32 ;the mask is now further away
|
||||||
|
inc [ss:planenum]
|
||||||
|
shl [ss:planemask],1 ;shift plane mask over for next plane
|
||||||
|
cmp [ss:planemask],10000b ;done all four planes?
|
||||||
|
je @@drawn ;drawn all four planes
|
||||||
|
jmp @@planeloopm
|
||||||
|
|
||||||
|
@@drawn:
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
;-------------------
|
||||||
|
|
||||||
|
mov ax,ss
|
||||||
|
mov ds,ax
|
||||||
|
mov cx,-1 ;definately scan the entire thing
|
||||||
|
|
||||||
|
jmp @@findtile
|
||||||
|
|
||||||
|
ENDP
|
||||||
|
|
||||||
|
|
||||||
|
END
|
||||||
|
|
||||||
@@ -0,0 +1,205 @@
|
|||||||
|
/* Catacomb 3-D Source Code
|
||||||
|
* Copyright (C) 1993-2014 Flat Rock Software
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along
|
||||||
|
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
//
|
||||||
|
// ID Engine
|
||||||
|
// ID_SD.h - Sound Manager Header
|
||||||
|
// v1.0d1
|
||||||
|
// By Jason Blochowiak
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef __TYPES__
|
||||||
|
#include "ID_Types.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __ID_SD__
|
||||||
|
#define __ID_SD__
|
||||||
|
|
||||||
|
#ifdef __DEBUG__
|
||||||
|
#define __DEBUG_SoundMgr__
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define TickBase 70 // 70Hz per tick - used as a base for timer 0
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
sdm_Off,
|
||||||
|
sdm_PC,sdm_AdLib,
|
||||||
|
} SDMode;
|
||||||
|
typedef enum {
|
||||||
|
smm_Off,smm_AdLib
|
||||||
|
} SMMode;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
longword length;
|
||||||
|
word priority;
|
||||||
|
} SoundCommon;
|
||||||
|
|
||||||
|
// PC Sound stuff
|
||||||
|
#define pcTimer 0x42
|
||||||
|
#define pcTAccess 0x43
|
||||||
|
#define pcSpeaker 0x61
|
||||||
|
|
||||||
|
#define pcSpkBits 3
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
SoundCommon common;
|
||||||
|
byte data[1];
|
||||||
|
} PCSound;
|
||||||
|
|
||||||
|
// Registers for the Sound Blaster card - needs to be offset by n0
|
||||||
|
#define sbReset 0x206
|
||||||
|
#define sbReadData 0x20a
|
||||||
|
#define sbWriteCmd 0x20c
|
||||||
|
#define sbWriteData 0x20c
|
||||||
|
#define sbWriteStat 0x20c
|
||||||
|
#define sbDataAvail 0x20e
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
SoundCommon common;
|
||||||
|
word hertz;
|
||||||
|
byte bits,
|
||||||
|
reference,
|
||||||
|
data[1];
|
||||||
|
} SampledSound;
|
||||||
|
|
||||||
|
// Registers for the AdLib card
|
||||||
|
// Operator stuff
|
||||||
|
#define alChar 0x20
|
||||||
|
#define alScale 0x40
|
||||||
|
#define alAttack 0x60
|
||||||
|
#define alSus 0x80
|
||||||
|
#define alWave 0xe0
|
||||||
|
// Channel stuff
|
||||||
|
#define alFreqL 0xa0
|
||||||
|
#define alFreqH 0xb0
|
||||||
|
#define alFeedCon 0xc0
|
||||||
|
// Global stuff
|
||||||
|
#define alEffects 0xbd
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
byte mChar,cChar,
|
||||||
|
mScale,cScale,
|
||||||
|
mAttack,cAttack,
|
||||||
|
mSus,cSus,
|
||||||
|
mWave,cWave,
|
||||||
|
nConn,
|
||||||
|
|
||||||
|
// These are only for Muse - these bytes are really unused
|
||||||
|
voice,
|
||||||
|
mode,
|
||||||
|
unused[3];
|
||||||
|
} Instrument;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
SoundCommon common;
|
||||||
|
Instrument inst;
|
||||||
|
byte block,
|
||||||
|
data[1];
|
||||||
|
} AdLibSound;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Sequencing stuff
|
||||||
|
//
|
||||||
|
#define sqMaxTracks 10
|
||||||
|
#define sqMaxMoods 1 // DEBUG
|
||||||
|
|
||||||
|
#define sev_Null 0 // Does nothing
|
||||||
|
#define sev_NoteOff 1 // Turns a note off
|
||||||
|
#define sev_NoteOn 2 // Turns a note on
|
||||||
|
#define sev_NotePitch 3 // Sets the pitch of a currently playing note
|
||||||
|
#define sev_NewInst 4 // Installs a new instrument
|
||||||
|
#define sev_NewPerc 5 // Installs a new percussive instrument
|
||||||
|
#define sev_PercOn 6 // Turns a percussive note on
|
||||||
|
#define sev_PercOff 7 // Turns a percussive note off
|
||||||
|
#define sev_SeqEnd -1 // Terminates a sequence
|
||||||
|
|
||||||
|
// Flags for MusicGroup.flags
|
||||||
|
#define sf_Melodic 0
|
||||||
|
#define sf_Percussive 1
|
||||||
|
|
||||||
|
#if 1
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
word length,
|
||||||
|
values[1];
|
||||||
|
} MusicGroup;
|
||||||
|
#else
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
word flags,
|
||||||
|
count,
|
||||||
|
offsets[1];
|
||||||
|
} MusicGroup;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
/* This part needs to be set up by the user */
|
||||||
|
word mood,far *moods[sqMaxMoods];
|
||||||
|
|
||||||
|
/* The rest is set up by the code */
|
||||||
|
Instrument inst;
|
||||||
|
boolean percussive;
|
||||||
|
word far *seq;
|
||||||
|
longword nextevent;
|
||||||
|
} ActiveTrack;
|
||||||
|
|
||||||
|
#define sqmode_Normal 0
|
||||||
|
#define sqmode_FadeIn 1
|
||||||
|
#define sqmode_FadeOut 2
|
||||||
|
|
||||||
|
#define sqMaxFade 64 // DEBUG
|
||||||
|
|
||||||
|
|
||||||
|
// Global variables
|
||||||
|
extern boolean AdLibPresent,
|
||||||
|
NeedsMusic; // For Caching Mgr
|
||||||
|
extern SDMode SoundMode;
|
||||||
|
extern SMMode MusicMode;
|
||||||
|
extern longword TimeCount; // Global time in ticks
|
||||||
|
|
||||||
|
// Function prototypes
|
||||||
|
extern void SD_Startup(void),
|
||||||
|
SD_Shutdown(void),
|
||||||
|
SD_Default(boolean gotit,SDMode sd,SMMode sm),
|
||||||
|
SD_PlaySound(soundnames sound),
|
||||||
|
SD_StopSound(void),
|
||||||
|
SD_WaitSoundDone(void),
|
||||||
|
SD_StartMusic(MusicGroup far *music),
|
||||||
|
SD_MusicOn(void),
|
||||||
|
SD_MusicOff(void),
|
||||||
|
SD_FadeOutMusic(void),
|
||||||
|
SD_SetUserHook(void (*hook)(void));
|
||||||
|
extern boolean SD_MusicPlaying(void),
|
||||||
|
SD_SetSoundMode(SDMode mode),
|
||||||
|
SD_SetMusicMode(SMMode mode);
|
||||||
|
extern word SD_SoundPlaying(void);
|
||||||
|
|
||||||
|
#ifdef _MUSE_ // MUSE Goes directly to the lower level routines
|
||||||
|
extern void SDL_PCPlaySound(PCSound far *sound),
|
||||||
|
SDL_PCStopSound(void),
|
||||||
|
SDL_ALPlaySound(AdLibSound far *sound),
|
||||||
|
SDL_ALStopSound(void);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,128 @@
|
|||||||
|
/* Catacomb 3-D Source Code
|
||||||
|
* Copyright (C) 1993-2014 Flat Rock Software
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along
|
||||||
|
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define S_LOADING "Loading"
|
||||||
|
#define S_EMPTYSPOT "Empty"
|
||||||
|
#define S_SVGACOMP "SVGA Compatibility Mode Enabled."
|
||||||
|
#define S_READYPRESS " Ready - Press a Key "
|
||||||
|
#define S_NOSFX "NO SOUND EFFECTS"
|
||||||
|
#define S_PCSPKR "PC SPEAKER"
|
||||||
|
#define S_ALSB "ADLIB/SOUNDBLASTER"
|
||||||
|
#define S_QUIET "QUIET ADLIB/SOUNDBLASTER"
|
||||||
|
#define S_NOMUSIC "NO MUSIC"
|
||||||
|
#define S_BEGINE "BEGIN EASY GAME"
|
||||||
|
#define S_BEGINN "BEGIN NORMAL GAME"
|
||||||
|
#define S_BEGINH "BEGIN HARD GAME"
|
||||||
|
#define S_UPLEFT "UP & LEFT"
|
||||||
|
#define S_UP "UP"
|
||||||
|
#define S_UPRIGHT "UP & RIGHT"
|
||||||
|
#define S_RIGHT "RIGHT"
|
||||||
|
#define S_DNRIGHT "DOWN & RIGHT"
|
||||||
|
#define S_DN "DOWN"
|
||||||
|
#define S_DNLEFT "DOWN & LEFT"
|
||||||
|
#define S_LEFT "LEFT"
|
||||||
|
|
||||||
|
#define S_JUMP "JUMP"
|
||||||
|
#define S_POGO "POGO"
|
||||||
|
#define S_FIRE "FIRE"
|
||||||
|
#define S_MOVEMENT "MOVEMENT"
|
||||||
|
#define S_BUTTONS "BUTTONS"
|
||||||
|
|
||||||
|
#define S_SOUND "SOUND"
|
||||||
|
#define S_MUSIC "MUSIC"
|
||||||
|
#define S_OPTIONS "OPTIONS"
|
||||||
|
#define S_USEKB "USE KEYBOARD"
|
||||||
|
#define S_USEJOY1 "USE JOYSTICK #1"
|
||||||
|
#define S_USEJOY2 "USE JOYSTICK #2"
|
||||||
|
#define S_NEWGAME "NEW GAME"
|
||||||
|
#define S_LOADGAME "LOAD GAME"
|
||||||
|
#define S_SAVEGAME "SAVE GAME"
|
||||||
|
#define S_CONFIG "CONFIGURE"
|
||||||
|
#define S_ENDGAME "END GAME"
|
||||||
|
#define S_PADDLEWAR "PADDLE WAR"
|
||||||
|
#define S_QUIT "QUIT"
|
||||||
|
|
||||||
|
#define S_ESCBACK "ESC TO BACK OUT"
|
||||||
|
#define S_ESCBACK1 "ESC to back out"
|
||||||
|
#define S_ESCQUIT "ESC to quit"
|
||||||
|
#define S_F1HELP "F1 for help"
|
||||||
|
#define S_REALLYEND "REALLY END CURRENT GAME?"
|
||||||
|
#define S_PRESSY "PRESS Y TO END IT"
|
||||||
|
#define S_REALLYQUIT "REALLY QUIT?"
|
||||||
|
#define S_PRESSYQ "PRESS Y TO QUIT"
|
||||||
|
#define S_INAGAME "YOU'RE IN A GAME"
|
||||||
|
#define S_PRESSY2L "PRESS Y TO LOAD GAME"
|
||||||
|
#define S_PRESSY4N "PRESS Y FOR NEW GAME"
|
||||||
|
|
||||||
|
#define S_USLERROR "Error: "
|
||||||
|
#define S_USLUNKNOWN "Unknown"
|
||||||
|
#define S_USLDISKFULL "Disk is Full"
|
||||||
|
#define S_USLFILEINC "File is Incomplete"
|
||||||
|
#define S_PRESSKEY "PRESS ANY KEY"
|
||||||
|
#define S_PRESSKEY1 "Press any key"
|
||||||
|
|
||||||
|
#define S_SBOXON "SCORE BOX (ON)"
|
||||||
|
#define S_SBOXOFF "SCORE BOX (OFF)"
|
||||||
|
#define S_SVGAON "SVGA COMPATIBILITY (ON)"
|
||||||
|
#define S_SVGAOFF "SVGA COMPATIBILITY (OFF)"
|
||||||
|
#define S_2BON "TWO-BUTTON FIRING (ON)"
|
||||||
|
#define S_2BOFF "TWO-BUTTON FIRING (OFF)"
|
||||||
|
|
||||||
|
#define S_SBOXNOWON "Score box now on"
|
||||||
|
#define S_SBOXNOWOFF "Score box now off"
|
||||||
|
#define S_SVGANOWON "SVGA compatibility now on"
|
||||||
|
#define S_SVGANOWOFF "SVGA compatibility now off"
|
||||||
|
#define S_2BNOWON "Two-button firing now on"
|
||||||
|
#define S_2BNOWOFF "Two-button firing now off"
|
||||||
|
|
||||||
|
#define S_KEYBOARD "KEYBOARD"
|
||||||
|
#define S_JOY1 "JOYSTICK #1"
|
||||||
|
#define S_JOY2 "JOYSTICK #2"
|
||||||
|
#define S_MOUSE "MOUSE"
|
||||||
|
#define S_CONTROL "CONTROL: "
|
||||||
|
#define S_KEYUSED "Key already used"
|
||||||
|
#define S_PB1 "and press button #1"
|
||||||
|
#define S_PB2 "and press button #2"
|
||||||
|
#define S_MJUL "Move Joystick to upper left"
|
||||||
|
#define S_MJLR "Move Joystick to lower right"
|
||||||
|
|
||||||
|
#define S_USINGJ1 "USING "S_JOY1
|
||||||
|
#define S_USINGJ2 "USING "S_JOY2
|
||||||
|
#define S_TYPENAME "Type name"
|
||||||
|
#define S_ENTERACC "Enter accepts"
|
||||||
|
#define S_UNTITLED "Untitled"
|
||||||
|
#define S_SAVING "Saving"
|
||||||
|
#define S_YOULOST "You lost!"
|
||||||
|
#define S_YOUWON "You won!"
|
||||||
|
#define S_ARRMOVE "Arrows move"
|
||||||
|
#define S_ENTERSEL "Enter selects"
|
||||||
|
|
||||||
|
#define S_RETGAME "RETURN TO GAME"
|
||||||
|
#define S_RETDEMO "RETURN TO DEMO"
|
||||||
|
#define S_CTRLPANEL "Control Panel"
|
||||||
|
#define S_QUITTING "Quitting..."
|
||||||
|
|
||||||
|
#define S_WHATNAME "What is the name of this creature?"
|
||||||
|
#define S_SORRY "Sorry, that's not quite right."
|
||||||
|
#define S_CHECKMAN "Please check your manual and try again."
|
||||||
|
|
||||||
|
#define S_BADCARD "Improper video card! If you really have an EGA/VGA card that I am not\n"\
|
||||||
|
"detecting, use the -HIDDENCARD command line parameter!"
|
||||||
|
#define S_BADCARD1 "Improper video card! If you really have a CGA card that I am not\n"\
|
||||||
|
"detecting, use the -HIDDENCARD command line parameter!"
|
||||||
|
|
||||||
@@ -0,0 +1,147 @@
|
|||||||
|
/* Catacomb 3-D Source Code
|
||||||
|
* Copyright (C) 1993-2014 Flat Rock Software
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along
|
||||||
|
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
//
|
||||||
|
// ID Engine
|
||||||
|
// ID_US.h - Header file for the User Manager
|
||||||
|
// v1.0d1
|
||||||
|
// By Jason Blochowiak
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef __TYPES__
|
||||||
|
#include "ID_Types.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __ID_US__
|
||||||
|
#define __ID_US__
|
||||||
|
|
||||||
|
#ifdef __DEBUG__
|
||||||
|
#define __DEBUG_UserMgr__
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//#define HELPTEXTLINKED
|
||||||
|
|
||||||
|
#define MaxX 320
|
||||||
|
#define MaxY 200
|
||||||
|
|
||||||
|
#define MaxHelpLines 500
|
||||||
|
|
||||||
|
#define MaxHighName 57
|
||||||
|
#define MaxScores 7
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
char name[MaxHighName + 1];
|
||||||
|
long score;
|
||||||
|
word completed;
|
||||||
|
} HighScore;
|
||||||
|
|
||||||
|
#define MaxGameName 32
|
||||||
|
#define MaxSaveGames 6
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
char signature[4];
|
||||||
|
word *oldtest;
|
||||||
|
boolean present;
|
||||||
|
char name[MaxGameName + 1];
|
||||||
|
} SaveGame;
|
||||||
|
|
||||||
|
#define MaxString 128 // Maximum input string size
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
int x,y,
|
||||||
|
w,h,
|
||||||
|
px,py;
|
||||||
|
} WindowRec; // Record used to save & restore screen windows
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
gd_Continue,
|
||||||
|
gd_Easy,
|
||||||
|
gd_Normal,
|
||||||
|
gd_Hard
|
||||||
|
} GameDiff;
|
||||||
|
|
||||||
|
// Hack import for TED launch support
|
||||||
|
extern boolean tedlevel;
|
||||||
|
extern word tedlevelnum;
|
||||||
|
extern void TEDDeath(void);
|
||||||
|
|
||||||
|
extern boolean ingame, // Set by game code if a game is in progress
|
||||||
|
abortgame, // Set if a game load failed
|
||||||
|
loadedgame, // Set if the current game was loaded
|
||||||
|
NoWait,
|
||||||
|
HighScoresDirty;
|
||||||
|
extern char *abortprogram; // Set to error msg if program is dying
|
||||||
|
extern GameDiff restartgame; // Normally gd_Continue, else starts game
|
||||||
|
extern word PrintX,PrintY; // Current printing location in the window
|
||||||
|
extern word WindowX,WindowY,// Current location of window
|
||||||
|
WindowW,WindowH;// Current size of window
|
||||||
|
|
||||||
|
extern boolean Button0,Button1,
|
||||||
|
CursorBad;
|
||||||
|
extern int CursorX,CursorY;
|
||||||
|
|
||||||
|
extern void (*USL_MeasureString)(char far *,word *,word *),
|
||||||
|
(*USL_DrawString)(char far *);
|
||||||
|
|
||||||
|
extern boolean (*USL_SaveGame)(int),(*USL_LoadGame)(int);
|
||||||
|
extern void (*USL_ResetGame)(void);
|
||||||
|
extern SaveGame Games[MaxSaveGames];
|
||||||
|
extern HighScore Scores[];
|
||||||
|
|
||||||
|
#define US_HomeWindow() {PrintX = WindowX; PrintY = WindowY;}
|
||||||
|
|
||||||
|
extern void US_Startup(void),
|
||||||
|
US_Setup(void),
|
||||||
|
US_Shutdown(void),
|
||||||
|
US_InitRndT(boolean randomize),
|
||||||
|
US_SetLoadSaveHooks(boolean (*load)(int),
|
||||||
|
boolean (*save)(int),
|
||||||
|
void (*reset)(void)),
|
||||||
|
US_TextScreen(void),
|
||||||
|
US_UpdateTextScreen(void),
|
||||||
|
US_FinishTextScreen(void),
|
||||||
|
US_ControlPanel(void),
|
||||||
|
US_DrawWindow(word x,word y,word w,word h),
|
||||||
|
US_CenterWindow(word,word),
|
||||||
|
US_SaveWindow(WindowRec *win),
|
||||||
|
US_RestoreWindow(WindowRec *win),
|
||||||
|
US_ClearWindow(void),
|
||||||
|
US_SetPrintRoutines(void (*measure)(char far *,word *,word *),
|
||||||
|
void (*print)(char far *)),
|
||||||
|
US_PrintCentered(char *s),
|
||||||
|
US_CPrint(char *s),
|
||||||
|
US_CPrintLine(char *s),
|
||||||
|
US_Print(char *s),
|
||||||
|
US_PrintUnsigned(longword n),
|
||||||
|
US_PrintSigned(long n),
|
||||||
|
US_StartCursor(void),
|
||||||
|
US_ShutCursor(void),
|
||||||
|
US_ControlPanel(void),
|
||||||
|
US_CheckHighScore(long score,word other),
|
||||||
|
US_DisplayHighScores(int which);
|
||||||
|
extern boolean US_UpdateCursor(void),
|
||||||
|
US_LineInput(int x,int y,char *buf,char *def,boolean escok,
|
||||||
|
int maxchars,int maxwidth);
|
||||||
|
extern int US_CheckParm(char *parm,char **strings),
|
||||||
|
US_RndT(void);
|
||||||
|
|
||||||
|
void USL_PrintInCenter(char *s,Rect r);
|
||||||
|
char *USL_GiveSaveName(word game);
|
||||||
|
#endif
|
||||||
+117
@@ -0,0 +1,117 @@
|
|||||||
|
; Catacomb 3-D Source Code
|
||||||
|
; Copyright (C) 1993-2014 Flat Rock Software
|
||||||
|
;
|
||||||
|
; This program is free software; you can redistribute it and/or modify
|
||||||
|
; it under the terms of the GNU General Public License as published by
|
||||||
|
; the Free Software Foundation; either version 2 of the License, or
|
||||||
|
; (at your option) any later version.
|
||||||
|
;
|
||||||
|
; This program is distributed in the hope that it will be useful,
|
||||||
|
; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
; GNU General Public License for more details.
|
||||||
|
;
|
||||||
|
; You should have received a copy of the GNU General Public License along
|
||||||
|
; with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
; 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
|
||||||
|
IDEAL
|
||||||
|
MODEL MEDIUM,C
|
||||||
|
|
||||||
|
; Assembly portion of the User Mgr. This is just John Carmack's table
|
||||||
|
; driven pseudo-random number generator, and we put it in the User Mgr
|
||||||
|
; because we couldn't figure out where it should go
|
||||||
|
|
||||||
|
|
||||||
|
;============================================================================
|
||||||
|
;
|
||||||
|
; RANDOM ROUTINES
|
||||||
|
;
|
||||||
|
;============================================================================
|
||||||
|
|
||||||
|
FARDATA
|
||||||
|
|
||||||
|
rndindex dw ?
|
||||||
|
|
||||||
|
rndtable db 0, 8, 109, 220, 222, 241, 149, 107, 75, 248, 254, 140, 16, 66
|
||||||
|
db 74, 21, 211, 47, 80, 242, 154, 27, 205, 128, 161, 89, 77, 36
|
||||||
|
db 95, 110, 85, 48, 212, 140, 211, 249, 22, 79, 200, 50, 28, 188
|
||||||
|
db 52, 140, 202, 120, 68, 145, 62, 70, 184, 190, 91, 197, 152, 224
|
||||||
|
db 149, 104, 25, 178, 252, 182, 202, 182, 141, 197, 4, 81, 181, 242
|
||||||
|
db 145, 42, 39, 227, 156, 198, 225, 193, 219, 93, 122, 175, 249, 0
|
||||||
|
db 175, 143, 70, 239, 46, 246, 163, 53, 163, 109, 168, 135, 2, 235
|
||||||
|
db 25, 92, 20, 145, 138, 77, 69, 166, 78, 176, 173, 212, 166, 113
|
||||||
|
db 94, 161, 41, 50, 239, 49, 111, 164, 70, 60, 2, 37, 171, 75
|
||||||
|
db 136, 156, 11, 56, 42, 146, 138, 229, 73, 146, 77, 61, 98, 196
|
||||||
|
db 135, 106, 63, 197, 195, 86, 96, 203, 113, 101, 170, 247, 181, 113
|
||||||
|
db 80, 250, 108, 7, 255, 237, 129, 226, 79, 107, 112, 166, 103, 241
|
||||||
|
db 24, 223, 239, 120, 198, 58, 60, 82, 128, 3, 184, 66, 143, 224
|
||||||
|
db 145, 224, 81, 206, 163, 45, 63, 90, 168, 114, 59, 33, 159, 95
|
||||||
|
db 28, 139, 123, 98, 125, 196, 15, 70, 194, 253, 54, 14, 109, 226
|
||||||
|
db 71, 17, 161, 93, 186, 87, 244, 138, 20, 52, 123, 251, 26, 36
|
||||||
|
db 17, 46, 52, 231, 232, 76, 31, 221, 84, 37, 216, 165, 212, 106
|
||||||
|
db 197, 242, 98, 43, 39, 175, 254, 145, 190, 84, 118, 222, 187, 136
|
||||||
|
db 120, 163, 236, 249
|
||||||
|
|
||||||
|
|
||||||
|
CODESEG
|
||||||
|
|
||||||
|
LastRnd dw ?
|
||||||
|
|
||||||
|
;=================================================
|
||||||
|
;
|
||||||
|
; void US_InitRndT (boolean randomize)
|
||||||
|
; Init table based RND generator
|
||||||
|
; if randomize is false, the counter is set to 0
|
||||||
|
;
|
||||||
|
;=================================================
|
||||||
|
|
||||||
|
PROC US_InitRndT randomize:word
|
||||||
|
uses si,di
|
||||||
|
public US_InitRndT
|
||||||
|
|
||||||
|
mov ax,SEG rndtable
|
||||||
|
mov es,ax
|
||||||
|
mov ax,[randomize]
|
||||||
|
or ax,ax
|
||||||
|
jne @@timeit ;if randomize is true, really random
|
||||||
|
|
||||||
|
mov dx,0 ;set to a definite value
|
||||||
|
jmp @@setit
|
||||||
|
|
||||||
|
@@timeit:
|
||||||
|
mov ah,2ch
|
||||||
|
int 21h ;GetSystemTime
|
||||||
|
and dx,0ffh
|
||||||
|
|
||||||
|
@@setit:
|
||||||
|
mov [es:rndindex],dx
|
||||||
|
ret
|
||||||
|
|
||||||
|
ENDP
|
||||||
|
|
||||||
|
;=================================================
|
||||||
|
;
|
||||||
|
; int US_RndT (void)
|
||||||
|
; Return a random # between 0-255
|
||||||
|
; Exit : AX = value
|
||||||
|
;
|
||||||
|
;=================================================
|
||||||
|
PROC US_RndT
|
||||||
|
public US_RndT
|
||||||
|
|
||||||
|
mov ax,SEG rndtable
|
||||||
|
mov es,ax
|
||||||
|
mov bx,[es:rndindex]
|
||||||
|
inc bx
|
||||||
|
and bx,0ffh
|
||||||
|
mov [es:rndindex],bx
|
||||||
|
mov al,[es:rndtable+BX]
|
||||||
|
xor ah,ah
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
ENDP
|
||||||
|
|
||||||
|
END
|
||||||
|
|
||||||
@@ -0,0 +1,370 @@
|
|||||||
|
/* Catacomb 3-D Source Code
|
||||||
|
* Copyright (C) 1993-2014 Flat Rock Software
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along
|
||||||
|
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// ID_VW.H
|
||||||
|
|
||||||
|
#ifndef __TYPES__
|
||||||
|
#include "ID_TYPES.H"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __ID_MM__
|
||||||
|
#include "ID_MM.H"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __ID_GLOB__
|
||||||
|
#include "ID_GLOB.H"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define __ID_VW__
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
|
#define G_P_SHIFT 4 // global >> ?? = pixels
|
||||||
|
|
||||||
|
#if GRMODE == EGAGR
|
||||||
|
#define SCREENWIDTH 40
|
||||||
|
#define CHARWIDTH 1
|
||||||
|
#define TILEWIDTH 2
|
||||||
|
#define GRPLANES 4
|
||||||
|
#define BYTEPIXELS 8
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if GRMODE == CGAGR
|
||||||
|
#define SCREENWIDTH 128
|
||||||
|
#define CHARWIDTH 2
|
||||||
|
#define TILEWIDTH 4
|
||||||
|
#define GRPLANES 1
|
||||||
|
#define BYTEPIXELS 4
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define VIRTUALHEIGHT 300
|
||||||
|
#define VIRTUALWIDTH 512
|
||||||
|
|
||||||
|
|
||||||
|
#if GRMODE == CGAGR
|
||||||
|
|
||||||
|
#define MAXSHIFTS 1
|
||||||
|
|
||||||
|
#define WHITE 3 // graphics mode independant colors
|
||||||
|
#define BLACK 0
|
||||||
|
#define FIRSTCOLOR 1
|
||||||
|
#define SECONDCOLOR 2
|
||||||
|
#define F_WHITE 0 // for XOR font drawing
|
||||||
|
#define F_BLACK 3
|
||||||
|
#define F_FIRSTCOLOR 2
|
||||||
|
#define F_SECONDCOLOR 1
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if GRMODE == EGAGR
|
||||||
|
|
||||||
|
#define MAXSHIFTS 4
|
||||||
|
|
||||||
|
#define WHITE 15 // graphics mode independant colors
|
||||||
|
#define BLACK 0
|
||||||
|
#define FIRSTCOLOR 1
|
||||||
|
#define SECONDCOLOR 12
|
||||||
|
#define F_WHITE 0 // for XOR font drawing
|
||||||
|
#define F_BLACK 15
|
||||||
|
#define F_FIRSTCOLOR 14
|
||||||
|
#define F_SECONDCOLOR 3
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if GRMODE == EGAGR
|
||||||
|
#define SCREENXMASK (~7)
|
||||||
|
#define SCREENXPLUS (7)
|
||||||
|
#define SCREENXDIV (8)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if GRMODE == CGAGR
|
||||||
|
#define SCREENXMASK (~3)
|
||||||
|
#define SCREENXDIV (4)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
|
|
||||||
|
#define SC_INDEX 0x3C4
|
||||||
|
#define SC_RESET 0
|
||||||
|
#define SC_CLOCK 1
|
||||||
|
#define SC_MAPMASK 2
|
||||||
|
#define SC_CHARMAP 3
|
||||||
|
#define SC_MEMMODE 4
|
||||||
|
|
||||||
|
#define CRTC_INDEX 0x3D4
|
||||||
|
#define CRTC_H_TOTAL 0
|
||||||
|
#define CRTC_H_DISPEND 1
|
||||||
|
#define CRTC_H_BLANK 2
|
||||||
|
#define CRTC_H_ENDBLANK 3
|
||||||
|
#define CRTC_H_RETRACE 4
|
||||||
|
#define CRTC_H_ENDRETRACE 5
|
||||||
|
#define CRTC_V_TOTAL 6
|
||||||
|
#define CRTC_OVERFLOW 7
|
||||||
|
#define CRTC_ROWSCAN 8
|
||||||
|
#define CRTC_MAXSCANLINE 9
|
||||||
|
#define CRTC_CURSORSTART 10
|
||||||
|
#define CRTC_CURSOREND 11
|
||||||
|
#define CRTC_STARTHIGH 12
|
||||||
|
#define CRTC_STARTLOW 13
|
||||||
|
#define CRTC_CURSORHIGH 14
|
||||||
|
#define CRTC_CURSORLOW 15
|
||||||
|
#define CRTC_V_RETRACE 16
|
||||||
|
#define CRTC_V_ENDRETRACE 17
|
||||||
|
#define CRTC_V_DISPEND 18
|
||||||
|
#define CRTC_OFFSET 19
|
||||||
|
#define CRTC_UNDERLINE 20
|
||||||
|
#define CRTC_V_BLANK 21
|
||||||
|
#define CRTC_V_ENDBLANK 22
|
||||||
|
#define CRTC_MODE 23
|
||||||
|
#define CRTC_LINECOMPARE 24
|
||||||
|
|
||||||
|
|
||||||
|
#define GC_INDEX 0x3CE
|
||||||
|
#define GC_SETRESET 0
|
||||||
|
#define GC_ENABLESETRESET 1
|
||||||
|
#define GC_COLORCOMPARE 2
|
||||||
|
#define GC_DATAROTATE 3
|
||||||
|
#define GC_READMAP 4
|
||||||
|
#define GC_MODE 5
|
||||||
|
#define GC_MISCELLANEOUS 6
|
||||||
|
#define GC_COLORDONTCARE 7
|
||||||
|
#define GC_BITMASK 8
|
||||||
|
|
||||||
|
#define ATR_INDEX 0x3c0
|
||||||
|
#define ATR_MODE 16
|
||||||
|
#define ATR_OVERSCAN 17
|
||||||
|
#define ATR_COLORPLANEENABLE 18
|
||||||
|
#define ATR_PELPAN 19
|
||||||
|
#define ATR_COLORSELECT 20
|
||||||
|
|
||||||
|
#define STATUS_REGISTER_1 0x3da
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
|
typedef enum {NOcard,MDAcard,CGAcard,EGAcard,MCGAcard,VGAcard,
|
||||||
|
HGCcard=0x80,HGCPcard,HICcard} cardtype;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
int width,
|
||||||
|
height,
|
||||||
|
orgx,orgy,
|
||||||
|
xl,yl,xh,yh,
|
||||||
|
shifts;
|
||||||
|
} spritetabletype;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
unsigned sourceoffset[MAXSHIFTS];
|
||||||
|
unsigned planesize[MAXSHIFTS];
|
||||||
|
unsigned width[MAXSHIFTS];
|
||||||
|
byte data[];
|
||||||
|
} spritetype; // the memptr for each sprite points to this
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
int width,height;
|
||||||
|
} pictabletype;
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
int height;
|
||||||
|
int location[256];
|
||||||
|
char width[256];
|
||||||
|
} fontstruct;
|
||||||
|
|
||||||
|
|
||||||
|
typedef enum {CGAgr,EGAgr,VGAgr} grtype;
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
|
extern cardtype videocard; // set by VW_Startup
|
||||||
|
extern grtype grmode; // CGAgr, EGAgr, VGAgr
|
||||||
|
|
||||||
|
extern unsigned bufferofs; // hidden port to draw to before displaying
|
||||||
|
extern unsigned displayofs; // origin of port on visable screen
|
||||||
|
extern unsigned panx,pany; // panning adjustments inside port in pixels
|
||||||
|
extern unsigned pansx,pansy;
|
||||||
|
extern unsigned panadjust; // panx/pany adjusted by screen resolution
|
||||||
|
|
||||||
|
extern unsigned screenseg; // normally 0xa000 or buffer segment
|
||||||
|
|
||||||
|
extern unsigned linewidth;
|
||||||
|
extern unsigned ylookup[VIRTUALHEIGHT];
|
||||||
|
|
||||||
|
extern boolean screenfaded;
|
||||||
|
extern char colors[7][17]; // pallets for fades
|
||||||
|
|
||||||
|
extern pictabletype _seg *pictable;
|
||||||
|
extern pictabletype _seg *picmtable;
|
||||||
|
extern spritetabletype _seg *spritetable;
|
||||||
|
|
||||||
|
extern unsigned fontnumber; // 0 based font number for drawing
|
||||||
|
extern int px,py;
|
||||||
|
extern byte pdrawmode,fontcolor;
|
||||||
|
|
||||||
|
extern int bordercolor;
|
||||||
|
|
||||||
|
//
|
||||||
|
// asm globals
|
||||||
|
//
|
||||||
|
|
||||||
|
extern unsigned *shifttabletable[8];
|
||||||
|
extern unsigned bufferwidth,bufferheight,screenspot; // used by font drawing stuff
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
|
|
||||||
|
void VW_Startup (void);
|
||||||
|
void VW_Shutdown (void);
|
||||||
|
|
||||||
|
cardtype VW_VideoID (void);
|
||||||
|
|
||||||
|
//
|
||||||
|
// EGA hardware routines
|
||||||
|
//
|
||||||
|
|
||||||
|
#define EGAWRITEMODE(x) asm{cli;mov dx,GC_INDEX;mov ax,GC_MODE+256*x;out dx,ax;sti;}
|
||||||
|
#define EGABITMASK(x) asm{cli;mov dx,GC_INDEX;mov ax,GC_BITMASK+256*x;out dx,ax;sti;}
|
||||||
|
#define EGAMAPMASK(x) asm{cli;mov dx,SC_INDEX;mov ax,SC_MAPMASK+x*256;out dx,ax;sti;}
|
||||||
|
#define EGAREADMAP(x) asm{cli;mov dx,GC_INDEX;mov ax,GC_READMAP+x*256;out dx,ax;sti;}
|
||||||
|
|
||||||
|
void VW_SetLineWidth(int width);
|
||||||
|
void VW_SetSplitScreen(int width);
|
||||||
|
void VW_SetScreen (unsigned CRTC, unsigned pelpan);
|
||||||
|
|
||||||
|
void VW_SetScreenMode (int grmode);
|
||||||
|
void VW_ClearVideo (int color);
|
||||||
|
void VW_WaitVBL (int number);
|
||||||
|
|
||||||
|
void VW_ColorBorder (int color);
|
||||||
|
void VW_SetPalette(byte *palette);
|
||||||
|
void VW_SetDefaultColors(void);
|
||||||
|
void VW_FadeOut(void);
|
||||||
|
void VW_FadeIn(void);
|
||||||
|
void VW_FadeUp(void);
|
||||||
|
void VW_FadeDown(void);
|
||||||
|
|
||||||
|
void VW_SetAtrReg (int reg, int value);
|
||||||
|
|
||||||
|
//
|
||||||
|
// block primitives
|
||||||
|
//
|
||||||
|
|
||||||
|
void VW_MaskBlock(memptr segm,unsigned ofs,unsigned dest,
|
||||||
|
unsigned wide,unsigned height,unsigned planesize);
|
||||||
|
void VW_MemToScreen(memptr source,unsigned dest,unsigned width,unsigned height);
|
||||||
|
void VW_ScreenToMem(unsigned source,memptr dest,unsigned width,unsigned height);
|
||||||
|
void VW_ScreenToScreen(unsigned source,unsigned dest,unsigned width,unsigned height);
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// block addressable routines
|
||||||
|
//
|
||||||
|
|
||||||
|
void VW_DrawTile8(unsigned x, unsigned y, unsigned tile);
|
||||||
|
|
||||||
|
#if GRMODE == EGAGR
|
||||||
|
|
||||||
|
#define VW_DrawTile8M(x,y,t) \
|
||||||
|
VW_MaskBlock(grsegs[STARTTILE8M],(t)*40,bufferofs+ylookup[y]+(x),1,8,8)
|
||||||
|
#define VW_DrawTile16(x,y,t) \
|
||||||
|
VW_MemToScreen(grsegs[STARTTILE16+t],bufferofs+ylookup[y]+(x),2,16)
|
||||||
|
#define VW_DrawTile16M(x,y,t) \
|
||||||
|
VW_MaskBlock(grsegs[STARTTILE16M],(t)*160,bufferofs+ylookup[y]+(x),2,16,32)
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if GRMODE == CGAGR
|
||||||
|
|
||||||
|
#define VW_DrawTile8M(x,y,t) \
|
||||||
|
VW_MaskBlock(grsegs[STARTTILE8M],(t)*32,bufferofs+ylookup[y]+(x),2,8,16)
|
||||||
|
#define VW_DrawTile16(x,y,t) \
|
||||||
|
VW_MemToScreen(grsegs[STARTTILE16+t],bufferofs+ylookup[y]+(x),4,16)
|
||||||
|
#define VW_DrawTile16M(x,y,t) \
|
||||||
|
VW_MaskBlock(grsegs[STARTTILE16M],(t)*128,bufferofs+ylookup[y]+(x),4,16,64)
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void VW_DrawPic(unsigned x, unsigned y, unsigned chunknum);
|
||||||
|
void VW_DrawMPic(unsigned x, unsigned y, unsigned chunknum);
|
||||||
|
void VW_ClipDrawMPic(unsigned x, int y, unsigned chunknum);
|
||||||
|
|
||||||
|
//
|
||||||
|
// pixel addressable routines
|
||||||
|
//
|
||||||
|
void VW_MeasurePropString (char far *string, word *width, word *height);
|
||||||
|
void VW_MeasureMPropString (char far *string, word *width, word *height);
|
||||||
|
|
||||||
|
void VW_DrawPropString (char far *string);
|
||||||
|
void VW_DrawMPropString (char far *string);
|
||||||
|
void VW_DrawSprite(int x, int y, unsigned sprite);
|
||||||
|
void VW_Plot(unsigned x, unsigned y, unsigned color);
|
||||||
|
void VW_Hlin(unsigned xl, unsigned xh, unsigned y, unsigned color);
|
||||||
|
void VW_Vlin(unsigned yl, unsigned yh, unsigned x, unsigned color);
|
||||||
|
void VW_Bar (unsigned x, unsigned y, unsigned width, unsigned height,
|
||||||
|
unsigned color);
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
|
//
|
||||||
|
// Double buffer management routines
|
||||||
|
//
|
||||||
|
|
||||||
|
void VW_InitDoubleBuffer (void);
|
||||||
|
void VW_FixRefreshBuffer (void);
|
||||||
|
int VW_MarkUpdateBlock (int x1, int y1, int x2, int y2);
|
||||||
|
void VW_UpdateScreen (void);
|
||||||
|
void VW_CGAFullUpdate (void);
|
||||||
|
|
||||||
|
//
|
||||||
|
// cursor
|
||||||
|
//
|
||||||
|
|
||||||
|
void VW_ShowCursor (void);
|
||||||
|
void VW_HideCursor (void);
|
||||||
|
void VW_MoveCursor (int x, int y);
|
||||||
|
void VW_SetCursor (int spritenum);
|
||||||
|
void VW_FreeCursor (void);
|
||||||
|
|
||||||
|
//
|
||||||
|
// mode independant routines
|
||||||
|
// coordinates in pixels, rounded to best screen res
|
||||||
|
// regions marked in double buffer
|
||||||
|
//
|
||||||
|
|
||||||
|
void VWB_DrawTile8 (int x, int y, int tile);
|
||||||
|
void VWB_DrawTile8M (int x, int y, int tile);
|
||||||
|
void VWB_DrawTile16 (int x, int y, int tile);
|
||||||
|
void VWB_DrawTile16M (int x, int y, int tile);
|
||||||
|
void VWB_DrawPic (int x, int y, int chunknum);
|
||||||
|
void VWB_DrawMPic(int x, int y, int chunknum);
|
||||||
|
void VWB_Bar (int x, int y, int width, int height, int color);
|
||||||
|
|
||||||
|
void VWB_DrawPropString (char far *string);
|
||||||
|
void VWB_DrawMPropString (char far *string);
|
||||||
|
void VWB_DrawSprite (int x, int y, int chunknum);
|
||||||
|
void VWB_Plot (int x, int y, int color);
|
||||||
|
void VWB_Hlin (int x1, int x2, int y, int color);
|
||||||
|
void VWB_Vlin (int y1, int y2, int x, int color);
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
+732
@@ -0,0 +1,732 @@
|
|||||||
|
; Catacomb 3-D Source Code
|
||||||
|
; Copyright (C) 1993-2014 Flat Rock Software
|
||||||
|
;
|
||||||
|
; This program is free software; you can redistribute it and/or modify
|
||||||
|
; it under the terms of the GNU General Public License as published by
|
||||||
|
; the Free Software Foundation; either version 2 of the License, or
|
||||||
|
; (at your option) any later version.
|
||||||
|
;
|
||||||
|
; This program is distributed in the hope that it will be useful,
|
||||||
|
; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
; GNU General Public License for more details.
|
||||||
|
;
|
||||||
|
; You should have received a copy of the GNU General Public License along
|
||||||
|
; with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
; 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
|
||||||
|
; ID_VW_A.ASM
|
||||||
|
|
||||||
|
IDEAL
|
||||||
|
MODEL MEDIUM,C
|
||||||
|
|
||||||
|
INCLUDE "ID_ASM.EQU"
|
||||||
|
|
||||||
|
WAITFORVBL = 1 ; setting to 0 causes setscreen and waitvbl
|
||||||
|
; to skip waiting for VBL (for timing things)
|
||||||
|
|
||||||
|
;============================================================================
|
||||||
|
|
||||||
|
DATASEG
|
||||||
|
|
||||||
|
EXTRN screenseg :WORD
|
||||||
|
EXTRN drawofs :WORD
|
||||||
|
EXTRN bufferofs :WORD
|
||||||
|
EXTRN displayofs :WORD
|
||||||
|
EXTRN drawofs :WORD
|
||||||
|
EXTRN panadjust :WORD
|
||||||
|
EXTRN ylookup :WORD
|
||||||
|
EXTRN linewidth :WORD
|
||||||
|
EXTRN grsegs :WORD
|
||||||
|
EXTRN updateptr :WORD
|
||||||
|
EXTRN blockstarts :WORD ;offsets from drawofs for each update block
|
||||||
|
EXTRN fontspace :WORD
|
||||||
|
EXTRN fontnumber :WORD
|
||||||
|
|
||||||
|
|
||||||
|
planemask db ?
|
||||||
|
planenum db ?
|
||||||
|
screendest dw ?
|
||||||
|
linedelta dw ?
|
||||||
|
|
||||||
|
LABEL shiftdata0 WORD
|
||||||
|
dw 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13
|
||||||
|
dw 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27
|
||||||
|
dw 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41
|
||||||
|
dw 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55
|
||||||
|
dw 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69
|
||||||
|
dw 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83
|
||||||
|
dw 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97
|
||||||
|
dw 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111
|
||||||
|
dw 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125
|
||||||
|
dw 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139
|
||||||
|
dw 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153
|
||||||
|
dw 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167
|
||||||
|
dw 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181
|
||||||
|
dw 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195
|
||||||
|
dw 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209
|
||||||
|
dw 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223
|
||||||
|
dw 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237
|
||||||
|
dw 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251
|
||||||
|
dw 252, 253, 254, 255
|
||||||
|
|
||||||
|
LABEL shiftdata1 WORD
|
||||||
|
dw 0,32768, 1,32769, 2,32770, 3,32771, 4,32772, 5,32773, 6,32774
|
||||||
|
dw 7,32775, 8,32776, 9,32777, 10,32778, 11,32779, 12,32780, 13,32781
|
||||||
|
dw 14,32782, 15,32783, 16,32784, 17,32785, 18,32786, 19,32787, 20,32788
|
||||||
|
dw 21,32789, 22,32790, 23,32791, 24,32792, 25,32793, 26,32794, 27,32795
|
||||||
|
dw 28,32796, 29,32797, 30,32798, 31,32799, 32,32800, 33,32801, 34,32802
|
||||||
|
dw 35,32803, 36,32804, 37,32805, 38,32806, 39,32807, 40,32808, 41,32809
|
||||||
|
dw 42,32810, 43,32811, 44,32812, 45,32813, 46,32814, 47,32815, 48,32816
|
||||||
|
dw 49,32817, 50,32818, 51,32819, 52,32820, 53,32821, 54,32822, 55,32823
|
||||||
|
dw 56,32824, 57,32825, 58,32826, 59,32827, 60,32828, 61,32829, 62,32830
|
||||||
|
dw 63,32831, 64,32832, 65,32833, 66,32834, 67,32835, 68,32836, 69,32837
|
||||||
|
dw 70,32838, 71,32839, 72,32840, 73,32841, 74,32842, 75,32843, 76,32844
|
||||||
|
dw 77,32845, 78,32846, 79,32847, 80,32848, 81,32849, 82,32850, 83,32851
|
||||||
|
dw 84,32852, 85,32853, 86,32854, 87,32855, 88,32856, 89,32857, 90,32858
|
||||||
|
dw 91,32859, 92,32860, 93,32861, 94,32862, 95,32863, 96,32864, 97,32865
|
||||||
|
dw 98,32866, 99,32867, 100,32868, 101,32869, 102,32870, 103,32871, 104,32872
|
||||||
|
dw 105,32873, 106,32874, 107,32875, 108,32876, 109,32877, 110,32878, 111,32879
|
||||||
|
dw 112,32880, 113,32881, 114,32882, 115,32883, 116,32884, 117,32885, 118,32886
|
||||||
|
dw 119,32887, 120,32888, 121,32889, 122,32890, 123,32891, 124,32892, 125,32893
|
||||||
|
dw 126,32894, 127,32895
|
||||||
|
|
||||||
|
LABEL shiftdata2 WORD
|
||||||
|
dw 0,16384,32768,49152, 1,16385,32769,49153, 2,16386,32770,49154, 3,16387
|
||||||
|
dw 32771,49155, 4,16388,32772,49156, 5,16389,32773,49157, 6,16390,32774,49158
|
||||||
|
dw 7,16391,32775,49159, 8,16392,32776,49160, 9,16393,32777,49161, 10,16394
|
||||||
|
dw 32778,49162, 11,16395,32779,49163, 12,16396,32780,49164, 13,16397,32781,49165
|
||||||
|
dw 14,16398,32782,49166, 15,16399,32783,49167, 16,16400,32784,49168, 17,16401
|
||||||
|
dw 32785,49169, 18,16402,32786,49170, 19,16403,32787,49171, 20,16404,32788,49172
|
||||||
|
dw 21,16405,32789,49173, 22,16406,32790,49174, 23,16407,32791,49175, 24,16408
|
||||||
|
dw 32792,49176, 25,16409,32793,49177, 26,16410,32794,49178, 27,16411,32795,49179
|
||||||
|
dw 28,16412,32796,49180, 29,16413,32797,49181, 30,16414,32798,49182, 31,16415
|
||||||
|
dw 32799,49183, 32,16416,32800,49184, 33,16417,32801,49185, 34,16418,32802,49186
|
||||||
|
dw 35,16419,32803,49187, 36,16420,32804,49188, 37,16421,32805,49189, 38,16422
|
||||||
|
dw 32806,49190, 39,16423,32807,49191, 40,16424,32808,49192, 41,16425,32809,49193
|
||||||
|
dw 42,16426,32810,49194, 43,16427,32811,49195, 44,16428,32812,49196, 45,16429
|
||||||
|
dw 32813,49197, 46,16430,32814,49198, 47,16431,32815,49199, 48,16432,32816,49200
|
||||||
|
dw 49,16433,32817,49201, 50,16434,32818,49202, 51,16435,32819,49203, 52,16436
|
||||||
|
dw 32820,49204, 53,16437,32821,49205, 54,16438,32822,49206, 55,16439,32823,49207
|
||||||
|
dw 56,16440,32824,49208, 57,16441,32825,49209, 58,16442,32826,49210, 59,16443
|
||||||
|
dw 32827,49211, 60,16444,32828,49212, 61,16445,32829,49213, 62,16446,32830,49214
|
||||||
|
dw 63,16447,32831,49215
|
||||||
|
|
||||||
|
LABEL shiftdata3 WORD
|
||||||
|
dw 0, 8192,16384,24576,32768,40960,49152,57344, 1, 8193,16385,24577,32769,40961
|
||||||
|
dw 49153,57345, 2, 8194,16386,24578,32770,40962,49154,57346, 3, 8195,16387,24579
|
||||||
|
dw 32771,40963,49155,57347, 4, 8196,16388,24580,32772,40964,49156,57348, 5, 8197
|
||||||
|
dw 16389,24581,32773,40965,49157,57349, 6, 8198,16390,24582,32774,40966,49158,57350
|
||||||
|
dw 7, 8199,16391,24583,32775,40967,49159,57351, 8, 8200,16392,24584,32776,40968
|
||||||
|
dw 49160,57352, 9, 8201,16393,24585,32777,40969,49161,57353, 10, 8202,16394,24586
|
||||||
|
dw 32778,40970,49162,57354, 11, 8203,16395,24587,32779,40971,49163,57355, 12, 8204
|
||||||
|
dw 16396,24588,32780,40972,49164,57356, 13, 8205,16397,24589,32781,40973,49165,57357
|
||||||
|
dw 14, 8206,16398,24590,32782,40974,49166,57358, 15, 8207,16399,24591,32783,40975
|
||||||
|
dw 49167,57359, 16, 8208,16400,24592,32784,40976,49168,57360, 17, 8209,16401,24593
|
||||||
|
dw 32785,40977,49169,57361, 18, 8210,16402,24594,32786,40978,49170,57362, 19, 8211
|
||||||
|
dw 16403,24595,32787,40979,49171,57363, 20, 8212,16404,24596,32788,40980,49172,57364
|
||||||
|
dw 21, 8213,16405,24597,32789,40981,49173,57365, 22, 8214,16406,24598,32790,40982
|
||||||
|
dw 49174,57366, 23, 8215,16407,24599,32791,40983,49175,57367, 24, 8216,16408,24600
|
||||||
|
dw 32792,40984,49176,57368, 25, 8217,16409,24601,32793,40985,49177,57369, 26, 8218
|
||||||
|
dw 16410,24602,32794,40986,49178,57370, 27, 8219,16411,24603,32795,40987,49179,57371
|
||||||
|
dw 28, 8220,16412,24604,32796,40988,49180,57372, 29, 8221,16413,24605,32797,40989
|
||||||
|
dw 49181,57373, 30, 8222,16414,24606,32798,40990,49182,57374, 31, 8223,16415,24607
|
||||||
|
dw 32799,40991,49183,57375
|
||||||
|
|
||||||
|
LABEL shiftdata4 WORD
|
||||||
|
dw 0, 4096, 8192,12288,16384,20480,24576,28672,32768,36864,40960,45056,49152,53248
|
||||||
|
dw 57344,61440, 1, 4097, 8193,12289,16385,20481,24577,28673,32769,36865,40961,45057
|
||||||
|
dw 49153,53249,57345,61441, 2, 4098, 8194,12290,16386,20482,24578,28674,32770,36866
|
||||||
|
dw 40962,45058,49154,53250,57346,61442, 3, 4099, 8195,12291,16387,20483,24579,28675
|
||||||
|
dw 32771,36867,40963,45059,49155,53251,57347,61443, 4, 4100, 8196,12292,16388,20484
|
||||||
|
dw 24580,28676,32772,36868,40964,45060,49156,53252,57348,61444, 5, 4101, 8197,12293
|
||||||
|
dw 16389,20485,24581,28677,32773,36869,40965,45061,49157,53253,57349,61445, 6, 4102
|
||||||
|
dw 8198,12294,16390,20486,24582,28678,32774,36870,40966,45062,49158,53254,57350,61446
|
||||||
|
dw 7, 4103, 8199,12295,16391,20487,24583,28679,32775,36871,40967,45063,49159,53255
|
||||||
|
dw 57351,61447, 8, 4104, 8200,12296,16392,20488,24584,28680,32776,36872,40968,45064
|
||||||
|
dw 49160,53256,57352,61448, 9, 4105, 8201,12297,16393,20489,24585,28681,32777,36873
|
||||||
|
dw 40969,45065,49161,53257,57353,61449, 10, 4106, 8202,12298,16394,20490,24586,28682
|
||||||
|
dw 32778,36874,40970,45066,49162,53258,57354,61450, 11, 4107, 8203,12299,16395,20491
|
||||||
|
dw 24587,28683,32779,36875,40971,45067,49163,53259,57355,61451, 12, 4108, 8204,12300
|
||||||
|
dw 16396,20492,24588,28684,32780,36876,40972,45068,49164,53260,57356,61452, 13, 4109
|
||||||
|
dw 8205,12301,16397,20493,24589,28685,32781,36877,40973,45069,49165,53261,57357,61453
|
||||||
|
dw 14, 4110, 8206,12302,16398,20494,24590,28686,32782,36878,40974,45070,49166,53262
|
||||||
|
dw 57358,61454, 15, 4111, 8207,12303,16399,20495,24591,28687,32783,36879,40975,45071
|
||||||
|
dw 49167,53263,57359,61455
|
||||||
|
|
||||||
|
LABEL shiftdata5 WORD
|
||||||
|
dw 0, 2048, 4096, 6144, 8192,10240,12288,14336,16384,18432,20480,22528,24576,26624
|
||||||
|
dw 28672,30720,32768,34816,36864,38912,40960,43008,45056,47104,49152,51200,53248,55296
|
||||||
|
dw 57344,59392,61440,63488, 1, 2049, 4097, 6145, 8193,10241,12289,14337,16385,18433
|
||||||
|
dw 20481,22529,24577,26625,28673,30721,32769,34817,36865,38913,40961,43009,45057,47105
|
||||||
|
dw 49153,51201,53249,55297,57345,59393,61441,63489, 2, 2050, 4098, 6146, 8194,10242
|
||||||
|
dw 12290,14338,16386,18434,20482,22530,24578,26626,28674,30722,32770,34818,36866,38914
|
||||||
|
dw 40962,43010,45058,47106,49154,51202,53250,55298,57346,59394,61442,63490, 3, 2051
|
||||||
|
dw 4099, 6147, 8195,10243,12291,14339,16387,18435,20483,22531,24579,26627,28675,30723
|
||||||
|
dw 32771,34819,36867,38915,40963,43011,45059,47107,49155,51203,53251,55299,57347,59395
|
||||||
|
dw 61443,63491, 4, 2052, 4100, 6148, 8196,10244,12292,14340,16388,18436,20484,22532
|
||||||
|
dw 24580,26628,28676,30724,32772,34820,36868,38916,40964,43012,45060,47108,49156,51204
|
||||||
|
dw 53252,55300,57348,59396,61444,63492, 5, 2053, 4101, 6149, 8197,10245,12293,14341
|
||||||
|
dw 16389,18437,20485,22533,24581,26629,28677,30725,32773,34821,36869,38917,40965,43013
|
||||||
|
dw 45061,47109,49157,51205,53253,55301,57349,59397,61445,63493, 6, 2054, 4102, 6150
|
||||||
|
dw 8198,10246,12294,14342,16390,18438,20486,22534,24582,26630,28678,30726,32774,34822
|
||||||
|
dw 36870,38918,40966,43014,45062,47110,49158,51206,53254,55302,57350,59398,61446,63494
|
||||||
|
dw 7, 2055, 4103, 6151, 8199,10247,12295,14343,16391,18439,20487,22535,24583,26631
|
||||||
|
dw 28679,30727,32775,34823,36871,38919,40967,43015,45063,47111,49159,51207,53255,55303
|
||||||
|
dw 57351,59399,61447,63495
|
||||||
|
|
||||||
|
LABEL shiftdata6 WORD
|
||||||
|
dw 0, 1024, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216,10240,11264,12288,13312
|
||||||
|
dw 14336,15360,16384,17408,18432,19456,20480,21504,22528,23552,24576,25600,26624,27648
|
||||||
|
dw 28672,29696,30720,31744,32768,33792,34816,35840,36864,37888,38912,39936,40960,41984
|
||||||
|
dw 43008,44032,45056,46080,47104,48128,49152,50176,51200,52224,53248,54272,55296,56320
|
||||||
|
dw 57344,58368,59392,60416,61440,62464,63488,64512, 1, 1025, 2049, 3073, 4097, 5121
|
||||||
|
dw 6145, 7169, 8193, 9217,10241,11265,12289,13313,14337,15361,16385,17409,18433,19457
|
||||||
|
dw 20481,21505,22529,23553,24577,25601,26625,27649,28673,29697,30721,31745,32769,33793
|
||||||
|
dw 34817,35841,36865,37889,38913,39937,40961,41985,43009,44033,45057,46081,47105,48129
|
||||||
|
dw 49153,50177,51201,52225,53249,54273,55297,56321,57345,58369,59393,60417,61441,62465
|
||||||
|
dw 63489,64513, 2, 1026, 2050, 3074, 4098, 5122, 6146, 7170, 8194, 9218,10242,11266
|
||||||
|
dw 12290,13314,14338,15362,16386,17410,18434,19458,20482,21506,22530,23554,24578,25602
|
||||||
|
dw 26626,27650,28674,29698,30722,31746,32770,33794,34818,35842,36866,37890,38914,39938
|
||||||
|
dw 40962,41986,43010,44034,45058,46082,47106,48130,49154,50178,51202,52226,53250,54274
|
||||||
|
dw 55298,56322,57346,58370,59394,60418,61442,62466,63490,64514, 3, 1027, 2051, 3075
|
||||||
|
dw 4099, 5123, 6147, 7171, 8195, 9219,10243,11267,12291,13315,14339,15363,16387,17411
|
||||||
|
dw 18435,19459,20483,21507,22531,23555,24579,25603,26627,27651,28675,29699,30723,31747
|
||||||
|
dw 32771,33795,34819,35843,36867,37891,38915,39939,40963,41987,43011,44035,45059,46083
|
||||||
|
dw 47107,48131,49155,50179,51203,52227,53251,54275,55299,56323,57347,58371,59395,60419
|
||||||
|
dw 61443,62467,63491,64515
|
||||||
|
|
||||||
|
LABEL shiftdata7 WORD
|
||||||
|
dw 0, 512, 1024, 1536, 2048, 2560, 3072, 3584, 4096, 4608, 5120, 5632, 6144, 6656
|
||||||
|
dw 7168, 7680, 8192, 8704, 9216, 9728,10240,10752,11264,11776,12288,12800,13312,13824
|
||||||
|
dw 14336,14848,15360,15872,16384,16896,17408,17920,18432,18944,19456,19968,20480,20992
|
||||||
|
dw 21504,22016,22528,23040,23552,24064,24576,25088,25600,26112,26624,27136,27648,28160
|
||||||
|
dw 28672,29184,29696,30208,30720,31232,31744,32256,32768,33280,33792,34304,34816,35328
|
||||||
|
dw 35840,36352,36864,37376,37888,38400,38912,39424,39936,40448,40960,41472,41984,42496
|
||||||
|
dw 43008,43520,44032,44544,45056,45568,46080,46592,47104,47616,48128,48640,49152,49664
|
||||||
|
dw 50176,50688,51200,51712,52224,52736,53248,53760,54272,54784,55296,55808,56320,56832
|
||||||
|
dw 57344,57856,58368,58880,59392,59904,60416,60928,61440,61952,62464,62976,63488,64000
|
||||||
|
dw 64512,65024, 1, 513, 1025, 1537, 2049, 2561, 3073, 3585, 4097, 4609, 5121, 5633
|
||||||
|
dw 6145, 6657, 7169, 7681, 8193, 8705, 9217, 9729,10241,10753,11265,11777,12289,12801
|
||||||
|
dw 13313,13825,14337,14849,15361,15873,16385,16897,17409,17921,18433,18945,19457,19969
|
||||||
|
dw 20481,20993,21505,22017,22529,23041,23553,24065,24577,25089,25601,26113,26625,27137
|
||||||
|
dw 27649,28161,28673,29185,29697,30209,30721,31233,31745,32257,32769,33281,33793,34305
|
||||||
|
dw 34817,35329,35841,36353,36865,37377,37889,38401,38913,39425,39937,40449,40961,41473
|
||||||
|
dw 41985,42497,43009,43521,44033,44545,45057,45569,46081,46593,47105,47617,48129,48641
|
||||||
|
dw 49153,49665,50177,50689,51201,51713,52225,52737,53249,53761,54273,54785,55297,55809
|
||||||
|
dw 56321,56833,57345,57857,58369,58881,59393,59905,60417,60929,61441,61953,62465,62977
|
||||||
|
dw 63489,64001,64513,65025
|
||||||
|
|
||||||
|
shifttabletable dw shiftdata0,shiftdata1,shiftdata2,shiftdata3
|
||||||
|
dw shiftdata4,shiftdata5,shiftdata6,shiftdata7
|
||||||
|
|
||||||
|
PUBLIC shifttabletable
|
||||||
|
|
||||||
|
|
||||||
|
;============================================================================
|
||||||
|
|
||||||
|
CODESEG
|
||||||
|
|
||||||
|
IFE GRMODE-CGAGR
|
||||||
|
INCLUDE "ID_VW_AC.ASM"
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
IFE GRMODE-EGAGR
|
||||||
|
INCLUDE "ID_VW_AE.ASM"
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
IFE GRMODE-VGAGR
|
||||||
|
INCLUDE "ID_VW_AV.ASM"
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
;============================================================================
|
||||||
|
;
|
||||||
|
; MISC VIDEO ROUTINES
|
||||||
|
;
|
||||||
|
;============================================================================
|
||||||
|
|
||||||
|
;========
|
||||||
|
;
|
||||||
|
; VW_WaitVBL (int number)
|
||||||
|
;
|
||||||
|
;========
|
||||||
|
|
||||||
|
PROC VW_WaitVBL number:WORD
|
||||||
|
PUBLIC VW_WaitVBL
|
||||||
|
|
||||||
|
if WAITFORVBL ; skip wait if profiling
|
||||||
|
|
||||||
|
mov dx,STATUS_REGISTER_1
|
||||||
|
|
||||||
|
mov cx,[number]
|
||||||
|
|
||||||
|
waitvbl1:
|
||||||
|
in al,dx
|
||||||
|
test al,00001000b ;look for vbl
|
||||||
|
jnz waitvbl1
|
||||||
|
|
||||||
|
waitvbl2:
|
||||||
|
in al,dx
|
||||||
|
test al,00001000b ;look for vbl
|
||||||
|
jz waitvbl2
|
||||||
|
|
||||||
|
loop waitvbl1
|
||||||
|
|
||||||
|
endif
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
ENDP
|
||||||
|
|
||||||
|
|
||||||
|
;===========================================================================
|
||||||
|
|
||||||
|
|
||||||
|
MASM
|
||||||
|
;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
|
||||||
|
;
|
||||||
|
; Name: VW_VideoID
|
||||||
|
;
|
||||||
|
; Function: Detects the presence of various video subsystems
|
||||||
|
;
|
||||||
|
; int VideoID;
|
||||||
|
;
|
||||||
|
; Subsystem ID values:
|
||||||
|
; 0 = (none)
|
||||||
|
; 1 = MDA
|
||||||
|
; 2 = CGA
|
||||||
|
; 3 = EGA
|
||||||
|
; 4 = MCGA
|
||||||
|
; 5 = VGA
|
||||||
|
; 80h = HGC
|
||||||
|
; 81h = HGC+
|
||||||
|
; 82h = Hercules InColor
|
||||||
|
;
|
||||||
|
;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
|
||||||
|
|
||||||
|
;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
|
||||||
|
;
|
||||||
|
; Equates
|
||||||
|
;
|
||||||
|
;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
|
||||||
|
VIDstruct STRUC ; corresponds to C data structure
|
||||||
|
|
||||||
|
Video0Type DB ? ; first subsystem type
|
||||||
|
Display0Type DB ? ; display attached to first subsystem
|
||||||
|
|
||||||
|
Video1Type DB ? ; second subsystem type
|
||||||
|
Display1Type DB ? ; display attached to second subsystem
|
||||||
|
|
||||||
|
VIDstruct ENDS
|
||||||
|
|
||||||
|
|
||||||
|
Device0 EQU word ptr Video0Type[di]
|
||||||
|
Device1 EQU word ptr Video1Type[di]
|
||||||
|
|
||||||
|
|
||||||
|
MDA EQU 1 ; subsystem types
|
||||||
|
CGA EQU 2
|
||||||
|
EGA EQU 3
|
||||||
|
MCGA EQU 4
|
||||||
|
VGA EQU 5
|
||||||
|
HGC EQU 80h
|
||||||
|
HGCPlus EQU 81h
|
||||||
|
InColor EQU 82h
|
||||||
|
|
||||||
|
MDADisplay EQU 1 ; display types
|
||||||
|
CGADisplay EQU 2
|
||||||
|
EGAColorDisplay EQU 3
|
||||||
|
PS2MonoDisplay EQU 4
|
||||||
|
PS2ColorDisplay EQU 5
|
||||||
|
|
||||||
|
TRUE EQU 1
|
||||||
|
FALSE EQU 0
|
||||||
|
|
||||||
|
;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
|
||||||
|
;
|
||||||
|
; Program
|
||||||
|
;
|
||||||
|
;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
|
||||||
|
|
||||||
|
Results VIDstruct <> ;results go here!
|
||||||
|
|
||||||
|
EGADisplays DB CGADisplay ; 0000b, 0001b (EGA switch values)
|
||||||
|
DB EGAColorDisplay ; 0010b, 0011b
|
||||||
|
DB MDADisplay ; 0100b, 0101b
|
||||||
|
DB CGADisplay ; 0110b, 0111b
|
||||||
|
DB EGAColorDisplay ; 1000b, 1001b
|
||||||
|
DB MDADisplay ; 1010b, 1011b
|
||||||
|
|
||||||
|
DCCtable DB 0,0 ; translate table for INT 10h func 1Ah
|
||||||
|
DB MDA,MDADisplay
|
||||||
|
DB CGA,CGADisplay
|
||||||
|
DB 0,0
|
||||||
|
DB EGA,EGAColorDisplay
|
||||||
|
DB EGA,MDADisplay
|
||||||
|
DB 0,0
|
||||||
|
DB VGA,PS2MonoDisplay
|
||||||
|
DB VGA,PS2ColorDisplay
|
||||||
|
DB 0,0
|
||||||
|
DB MCGA,EGAColorDisplay
|
||||||
|
DB MCGA,PS2MonoDisplay
|
||||||
|
DB MCGA,PS2ColorDisplay
|
||||||
|
|
||||||
|
TestSequence DB TRUE ; this list of flags and addresses
|
||||||
|
DW FindPS2 ; determines the order in which this
|
||||||
|
; program looks for the various
|
||||||
|
EGAflag DB ? ; subsystems
|
||||||
|
DW FindEGA
|
||||||
|
|
||||||
|
CGAflag DB ?
|
||||||
|
DW FindCGA
|
||||||
|
|
||||||
|
Monoflag DB ?
|
||||||
|
DW FindMono
|
||||||
|
|
||||||
|
NumberOfTests EQU ($-TestSequence)/3
|
||||||
|
|
||||||
|
|
||||||
|
PUBLIC VW_VideoID
|
||||||
|
VW_VideoID PROC
|
||||||
|
|
||||||
|
push bp ; preserve caller registers
|
||||||
|
mov bp,sp
|
||||||
|
push ds
|
||||||
|
push si
|
||||||
|
push di
|
||||||
|
|
||||||
|
push cs
|
||||||
|
pop ds
|
||||||
|
ASSUME DS:@Code
|
||||||
|
|
||||||
|
; initialize the data structure that will contain the results
|
||||||
|
|
||||||
|
lea di,Results ; DS:DI -> start of data structure
|
||||||
|
|
||||||
|
mov Device0,0 ; zero these variables
|
||||||
|
mov Device1,0
|
||||||
|
|
||||||
|
; look for the various subsystems using the subroutines whose addresses are
|
||||||
|
; tabulated in TestSequence; each subroutine sets flags in TestSequence
|
||||||
|
; to indicate whether subsequent subroutines need to be called
|
||||||
|
|
||||||
|
mov byte ptr CGAflag,TRUE
|
||||||
|
mov byte ptr EGAflag,TRUE
|
||||||
|
mov byte ptr Monoflag,TRUE
|
||||||
|
|
||||||
|
mov cx,NumberOfTests
|
||||||
|
mov si,offset TestSequence
|
||||||
|
|
||||||
|
@@L01: lodsb ; AL := flag
|
||||||
|
test al,al
|
||||||
|
lodsw ; AX := subroutine address
|
||||||
|
jz @@L02 ; skip subroutine if flag is false
|
||||||
|
|
||||||
|
push si
|
||||||
|
push cx
|
||||||
|
call ax ; call subroutine to detect subsystem
|
||||||
|
pop cx
|
||||||
|
pop si
|
||||||
|
|
||||||
|
@@L02: loop @@L01
|
||||||
|
|
||||||
|
; determine which subsystem is active
|
||||||
|
|
||||||
|
call FindActive
|
||||||
|
|
||||||
|
mov al,Results.Video0Type
|
||||||
|
mov ah,0 ; was: Results.Display0Type
|
||||||
|
|
||||||
|
pop di ; restore caller registers and return
|
||||||
|
pop si
|
||||||
|
pop ds
|
||||||
|
mov sp,bp
|
||||||
|
pop bp
|
||||||
|
ret
|
||||||
|
|
||||||
|
VW_VideoID ENDP
|
||||||
|
|
||||||
|
|
||||||
|
;
|
||||||
|
; FindPS2
|
||||||
|
;
|
||||||
|
; This subroutine uses INT 10H function 1Ah to determine the video BIOS
|
||||||
|
; Display Combination Code (DCC) for each video subsystem present.
|
||||||
|
;
|
||||||
|
|
||||||
|
FindPS2 PROC near
|
||||||
|
|
||||||
|
mov ax,1A00h
|
||||||
|
int 10h ; call video BIOS for info
|
||||||
|
|
||||||
|
cmp al,1Ah
|
||||||
|
jne @@L13 ; exit if function not supported (i.e.,
|
||||||
|
; no MCGA or VGA in system)
|
||||||
|
|
||||||
|
; convert BIOS DCCs into specific subsystems & displays
|
||||||
|
|
||||||
|
mov cx,bx
|
||||||
|
xor bh,bh ; BX := DCC for active subsystem
|
||||||
|
|
||||||
|
or ch,ch
|
||||||
|
jz @@L11 ; jump if only one subsystem present
|
||||||
|
|
||||||
|
mov bl,ch ; BX := inactive DCC
|
||||||
|
add bx,bx
|
||||||
|
mov ax,[bx+offset DCCtable]
|
||||||
|
|
||||||
|
mov Device1,ax
|
||||||
|
|
||||||
|
mov bl,cl
|
||||||
|
xor bh,bh ; BX := active DCC
|
||||||
|
|
||||||
|
@@L11: add bx,bx
|
||||||
|
mov ax,[bx+offset DCCtable]
|
||||||
|
|
||||||
|
mov Device0,ax
|
||||||
|
|
||||||
|
; reset flags for subsystems that have been ruled out
|
||||||
|
|
||||||
|
mov byte ptr CGAflag,FALSE
|
||||||
|
mov byte ptr EGAflag,FALSE
|
||||||
|
mov byte ptr Monoflag,FALSE
|
||||||
|
|
||||||
|
lea bx,Video0Type[di] ; if the BIOS reported an MDA ...
|
||||||
|
cmp byte ptr [bx],MDA
|
||||||
|
je @@L12
|
||||||
|
|
||||||
|
lea bx,Video1Type[di]
|
||||||
|
cmp byte ptr [bx],MDA
|
||||||
|
jne @@L13
|
||||||
|
|
||||||
|
@@L12: mov word ptr [bx],0 ; ... Hercules can't be ruled out
|
||||||
|
mov byte ptr Monoflag,TRUE
|
||||||
|
|
||||||
|
@@L13: ret
|
||||||
|
|
||||||
|
FindPS2 ENDP
|
||||||
|
|
||||||
|
|
||||||
|
;
|
||||||
|
; FindEGA
|
||||||
|
;
|
||||||
|
; Look for an EGA. This is done by making a call to an EGA BIOS function
|
||||||
|
; which doesn't exist in the default (MDA, CGA) BIOS.
|
||||||
|
|
||||||
|
FindEGA PROC near ; Caller: AH = flags
|
||||||
|
; Returns: AH = flags
|
||||||
|
; Video0Type and
|
||||||
|
; Display0Type updated
|
||||||
|
|
||||||
|
mov bl,10h ; BL := 10h (return EGA info)
|
||||||
|
mov ah,12h ; AH := INT 10H function number
|
||||||
|
int 10h ; call EGA BIOS for info
|
||||||
|
; if EGA BIOS is present,
|
||||||
|
; BL <> 10H
|
||||||
|
; CL = switch setting
|
||||||
|
cmp bl,10h
|
||||||
|
je @@L22 ; jump if EGA BIOS not present
|
||||||
|
|
||||||
|
mov al,cl
|
||||||
|
shr al,1 ; AL := switches/2
|
||||||
|
mov bx,offset EGADisplays
|
||||||
|
xlat ; determine display type from switches
|
||||||
|
mov ah,al ; AH := display type
|
||||||
|
mov al,EGA ; AL := subystem type
|
||||||
|
call FoundDevice
|
||||||
|
|
||||||
|
cmp ah,MDADisplay
|
||||||
|
je @@L21 ; jump if EGA has a monochrome display
|
||||||
|
|
||||||
|
mov CGAflag,FALSE ; no CGA if EGA has color display
|
||||||
|
jmp short @@L22
|
||||||
|
|
||||||
|
@@L21: mov Monoflag,FALSE ; EGA has a mono display, so MDA and
|
||||||
|
; Hercules are ruled out
|
||||||
|
@@L22: ret
|
||||||
|
|
||||||
|
FindEGA ENDP
|
||||||
|
|
||||||
|
;
|
||||||
|
; FindCGA
|
||||||
|
;
|
||||||
|
; This is done by looking for the CGA's 6845 CRTC at I/O port 3D4H.
|
||||||
|
;
|
||||||
|
FindCGA PROC near ; Returns: VIDstruct updated
|
||||||
|
|
||||||
|
mov dx,3D4h ; DX := CRTC address port
|
||||||
|
call Find6845
|
||||||
|
jc @@L31 ; jump if not present
|
||||||
|
|
||||||
|
mov al,CGA
|
||||||
|
mov ah,CGADisplay
|
||||||
|
call FoundDevice
|
||||||
|
|
||||||
|
@@L31: ret
|
||||||
|
|
||||||
|
FindCGA ENDP
|
||||||
|
|
||||||
|
;
|
||||||
|
; FindMono
|
||||||
|
;
|
||||||
|
; This is done by looking for the MDA's 6845 CRTC at I/O port 3B4H. If
|
||||||
|
; a 6845 is found, the subroutine distinguishes between an MDA
|
||||||
|
; and a Hercules adapter by monitoring bit 7 of the CRT Status byte.
|
||||||
|
; This bit changes on Hercules adapters but does not change on an MDA.
|
||||||
|
;
|
||||||
|
; The various Hercules adapters are identified by bits 4 through 6 of
|
||||||
|
; the CRT Status value:
|
||||||
|
;
|
||||||
|
; 000b = HGC
|
||||||
|
; 001b = HGC+
|
||||||
|
; 101b = InColor card
|
||||||
|
;
|
||||||
|
|
||||||
|
FindMono PROC near ; Returns: VIDstruct updated
|
||||||
|
|
||||||
|
mov dx,3B4h ; DX := CRTC address port
|
||||||
|
call Find6845
|
||||||
|
jc @@L44 ; jump if not present
|
||||||
|
|
||||||
|
mov dl,0BAh ; DX := 3BAh (status port)
|
||||||
|
in al,dx
|
||||||
|
and al,80h
|
||||||
|
mov ah,al ; AH := bit 7 (vertical sync on HGC)
|
||||||
|
|
||||||
|
mov cx,8000h ; do this 32768 times
|
||||||
|
@@L41: in al,dx
|
||||||
|
and al,80h ; isolate bit 7
|
||||||
|
cmp ah,al
|
||||||
|
loope @@L41 ; wait for bit 7 to change
|
||||||
|
jne @@L42 ; if bit 7 changed, it's a Hercules
|
||||||
|
|
||||||
|
mov al,MDA ; if bit 7 didn't change, it's an MDA
|
||||||
|
mov ah,MDADisplay
|
||||||
|
call FoundDevice
|
||||||
|
jmp short @@L44
|
||||||
|
|
||||||
|
@@L42: in al,dx
|
||||||
|
mov dl,al ; DL := value from status port
|
||||||
|
and dl,01110000b ; mask bits 4 thru 6
|
||||||
|
|
||||||
|
mov ah,MDADisplay ; assume it's a monochrome display
|
||||||
|
|
||||||
|
mov al,HGCPlus ; look for an HGC+
|
||||||
|
cmp dl,00010000b
|
||||||
|
je @@L43 ; jump if it's an HGC+
|
||||||
|
|
||||||
|
mov al,HGC ; look for an InColor card or HGC
|
||||||
|
cmp dl,01010000b
|
||||||
|
jne @@L43 ; jump if it's not an InColor card
|
||||||
|
|
||||||
|
mov al,InColor ; it's an InColor card
|
||||||
|
mov ah,EGAColorDisplay
|
||||||
|
|
||||||
|
@@L43: call FoundDevice
|
||||||
|
|
||||||
|
@@L44: ret
|
||||||
|
|
||||||
|
FindMono ENDP
|
||||||
|
|
||||||
|
;
|
||||||
|
; Find6845
|
||||||
|
;
|
||||||
|
; This routine detects the presence of the CRTC on a MDA, CGA or HGC.
|
||||||
|
; The technique is to write and read register 0Fh of the chip (cursor
|
||||||
|
; low). If the same value is read as written, assume the chip is
|
||||||
|
; present at the specified port addr.
|
||||||
|
;
|
||||||
|
|
||||||
|
Find6845 PROC near ; Caller: DX = port addr
|
||||||
|
; Returns: cf set if not present
|
||||||
|
mov al,0Fh
|
||||||
|
out dx,al ; select 6845 reg 0Fh (Cursor Low)
|
||||||
|
inc dx
|
||||||
|
in al,dx ; AL := current Cursor Low value
|
||||||
|
mov ah,al ; preserve in AH
|
||||||
|
mov al,66h ; AL := arbitrary value
|
||||||
|
out dx,al ; try to write to 6845
|
||||||
|
|
||||||
|
mov cx,100h
|
||||||
|
@@L51: loop @@L51 ; wait for 6845 to respond
|
||||||
|
|
||||||
|
in al,dx
|
||||||
|
xchg ah,al ; AH := returned value
|
||||||
|
; AL := original value
|
||||||
|
out dx,al ; restore original value
|
||||||
|
|
||||||
|
cmp ah,66h ; test whether 6845 responded
|
||||||
|
je @@L52 ; jump if it did (cf is reset)
|
||||||
|
|
||||||
|
stc ; set carry flag if no 6845 present
|
||||||
|
|
||||||
|
@@L52: ret
|
||||||
|
|
||||||
|
Find6845 ENDP
|
||||||
|
|
||||||
|
|
||||||
|
;
|
||||||
|
; FindActive
|
||||||
|
;
|
||||||
|
; This subroutine stores the currently active device as Device0. The
|
||||||
|
; current video mode determines which subsystem is active.
|
||||||
|
;
|
||||||
|
|
||||||
|
FindActive PROC near
|
||||||
|
|
||||||
|
cmp word ptr Device1,0
|
||||||
|
je @@L63 ; exit if only one subsystem
|
||||||
|
|
||||||
|
cmp Video0Type[di],4 ; exit if MCGA or VGA present
|
||||||
|
jge @@L63 ; (INT 10H function 1AH
|
||||||
|
cmp Video1Type[di],4 ; already did the work)
|
||||||
|
jge @@L63
|
||||||
|
|
||||||
|
mov ah,0Fh
|
||||||
|
int 10h ; AL := current BIOS video mode
|
||||||
|
|
||||||
|
and al,7
|
||||||
|
cmp al,7 ; jump if monochrome
|
||||||
|
je @@L61 ; (mode 7 or 0Fh)
|
||||||
|
|
||||||
|
cmp Display0Type[di],MDADisplay
|
||||||
|
jne @@L63 ; exit if Display0 is color
|
||||||
|
jmp short @@L62
|
||||||
|
|
||||||
|
@@L61: cmp Display0Type[di],MDADisplay
|
||||||
|
je @@L63 ; exit if Display0 is monochrome
|
||||||
|
|
||||||
|
@@L62: mov ax,Device0 ; make Device0 currently active
|
||||||
|
xchg ax,Device1
|
||||||
|
mov Device0,ax
|
||||||
|
|
||||||
|
@@L63: ret
|
||||||
|
|
||||||
|
FindActive ENDP
|
||||||
|
|
||||||
|
|
||||||
|
;
|
||||||
|
; FoundDevice
|
||||||
|
;
|
||||||
|
; This routine updates the list of subsystems.
|
||||||
|
;
|
||||||
|
|
||||||
|
FoundDevice PROC near ; Caller: AH = display #
|
||||||
|
; AL = subsystem #
|
||||||
|
; Destroys: BX
|
||||||
|
lea bx,Video0Type[di]
|
||||||
|
cmp byte ptr [bx],0
|
||||||
|
je @@L71 ; jump if 1st subsystem
|
||||||
|
|
||||||
|
lea bx,Video1Type[di] ; must be 2nd subsystem
|
||||||
|
|
||||||
|
@@L71: mov [bx],ax ; update list entry
|
||||||
|
ret
|
||||||
|
|
||||||
|
FoundDevice ENDP
|
||||||
|
|
||||||
|
IDEAL
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
END
|
||||||
+1485
File diff suppressed because it is too large
Load Diff
+1752
File diff suppressed because it is too large
Load Diff
Binary file not shown.
+115
@@ -0,0 +1,115 @@
|
|||||||
|
; Catacomb 3-D Source Code
|
||||||
|
; Copyright (C) 1993-2014 Flat Rock Software
|
||||||
|
;
|
||||||
|
; This program is free software; you can redistribute it and/or modify
|
||||||
|
; it under the terms of the GNU General Public License as published by
|
||||||
|
; the Free Software Foundation; either version 2 of the License, or
|
||||||
|
; (at your option) any later version.
|
||||||
|
;
|
||||||
|
; This program is distributed in the hope that it will be useful,
|
||||||
|
; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
; GNU General Public License for more details.
|
||||||
|
;
|
||||||
|
; You should have received a copy of the GNU General Public License along
|
||||||
|
; with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
; 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
|
||||||
|
; JABHACK.ASM
|
||||||
|
|
||||||
|
.386C
|
||||||
|
IDEAL
|
||||||
|
MODEL MEDIUM
|
||||||
|
|
||||||
|
EXTRN LDIV@:far
|
||||||
|
|
||||||
|
;============================================================================
|
||||||
|
|
||||||
|
DATASEG
|
||||||
|
|
||||||
|
EXTRN _intaddr:word
|
||||||
|
|
||||||
|
;============================================================================
|
||||||
|
|
||||||
|
CODESEG
|
||||||
|
|
||||||
|
; Hacked up Juan Jimenez's code a bit to just return 386/not 386
|
||||||
|
PROC _CheckIs386
|
||||||
|
PUBLIC _CheckIs386
|
||||||
|
|
||||||
|
pushf ; Save flag registers, we use them here
|
||||||
|
xor ax,ax ; Clear AX and...
|
||||||
|
push ax ; ...push it onto the stack
|
||||||
|
popf ; Pop 0 into flag registers (all bits to 0),
|
||||||
|
pushf ; attempting to set bits 12-15 of flags to 0's
|
||||||
|
pop ax ; Recover the save flags
|
||||||
|
and ax,08000h ; If bits 12-15 of flags are set to
|
||||||
|
cmp ax,08000h ; zero then it's 8088/86 or 80188/186
|
||||||
|
jz not386
|
||||||
|
|
||||||
|
mov ax,07000h ; Try to set flag bits 12-14 to 1's
|
||||||
|
push ax ; Push the test value onto the stack
|
||||||
|
popf ; Pop it into the flag register
|
||||||
|
pushf ; Push it back onto the stack
|
||||||
|
pop ax ; Pop it into AX for check
|
||||||
|
and ax,07000h ; if bits 12-14 are cleared then
|
||||||
|
jz not386 ; the chip is an 80286
|
||||||
|
|
||||||
|
mov ax,1 ; We now assume it's a 80386 or better
|
||||||
|
popf
|
||||||
|
retf
|
||||||
|
|
||||||
|
not386:
|
||||||
|
xor ax,ax
|
||||||
|
popf
|
||||||
|
retf
|
||||||
|
|
||||||
|
ENDP
|
||||||
|
|
||||||
|
|
||||||
|
PROC _jabhack2
|
||||||
|
PUBLIC _jabhack2
|
||||||
|
|
||||||
|
jmp @@skip
|
||||||
|
|
||||||
|
@@where:
|
||||||
|
int 060h
|
||||||
|
retf
|
||||||
|
|
||||||
|
@@skip:
|
||||||
|
push es
|
||||||
|
|
||||||
|
mov ax,seg LDIV@
|
||||||
|
mov es,ax
|
||||||
|
mov ax,[WORD PTR @@where]
|
||||||
|
mov [WORD FAR es:LDIV@],ax
|
||||||
|
mov ax,[WORD PTR @@where+2]
|
||||||
|
mov [WORD FAR es:LDIV@+2],ax
|
||||||
|
|
||||||
|
mov ax,offset @@jabdiv
|
||||||
|
mov [_intaddr],ax
|
||||||
|
mov ax,seg @@jabdiv
|
||||||
|
mov [_intaddr+2],ax
|
||||||
|
|
||||||
|
pop es
|
||||||
|
retf
|
||||||
|
|
||||||
|
@@jabdiv:
|
||||||
|
add sp,4 ;Nuke IRET address, but leave flags
|
||||||
|
push bp
|
||||||
|
mov bp,sp ;Save BP, and set it equal to stack
|
||||||
|
cli
|
||||||
|
|
||||||
|
mov eax,[bp+8]
|
||||||
|
cdq
|
||||||
|
idiv [DWORD PTR bp+12]
|
||||||
|
mov edx,eax
|
||||||
|
shr edx,16
|
||||||
|
|
||||||
|
pop bp ;Restore BP
|
||||||
|
popf ;Restore flags (from INT)
|
||||||
|
retf 8 ;Return to original caller
|
||||||
|
|
||||||
|
ENDP
|
||||||
|
|
||||||
|
END
|
||||||
@@ -0,0 +1,55 @@
|
|||||||
|
/* Catacomb 3-D Source Code
|
||||||
|
* Copyright (C) 1993-2014 Flat Rock Software
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along
|
||||||
|
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
///////////////////////////////////////
|
||||||
|
//
|
||||||
|
// TED5 Map Header for C3D
|
||||||
|
//
|
||||||
|
///////////////////////////////////////
|
||||||
|
|
||||||
|
//
|
||||||
|
// Map Names
|
||||||
|
//
|
||||||
|
typedef enum {
|
||||||
|
APPROACH_MAP, // 0
|
||||||
|
ENTRANCE_MAP, // 1
|
||||||
|
GROUND_FLOOR_MAP, // 2
|
||||||
|
SECOND_FLOOR_MAP, // 3
|
||||||
|
THIRD_FLOOR_MAP, // 4
|
||||||
|
TOWER_1_MAP, // 5
|
||||||
|
TOWER_2_MAP, // 6
|
||||||
|
SECRET_HALLS_MAP, // 7
|
||||||
|
ACCESS_FLOOR_MAP, // 8
|
||||||
|
DUNGEON_MAP, // 9
|
||||||
|
LOWER_DUNGEON_MAP, // 10
|
||||||
|
CATACOMB_MAP, // 11
|
||||||
|
LOWER_REACHES_MAP, // 12
|
||||||
|
WARRENS_MAP, // 13
|
||||||
|
HIDDEN_CAVERNS_MAP, // 14
|
||||||
|
FENSOFINSANITY_MAP, // 15
|
||||||
|
CHAOSCORRIDORS_MAP, // 16
|
||||||
|
LABYRINTH_MAP, // 17
|
||||||
|
HALLS_OF_BLOOD_MAP, // 18
|
||||||
|
NEMESISSLAIR_MAP, // 19
|
||||||
|
LASTMAP
|
||||||
|
} mapnames;
|
||||||
|
|
||||||
|
//
|
||||||
|
// TILEINFO offsets
|
||||||
|
//
|
||||||
|
#define ANIM 402
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
589: No mention of Id software has been removed. I thought this was
|
||||||
|
cleared up last project. I am proud of CAT3D, and I would have a problem
|
||||||
|
with the removal of credit to the development team.
|
||||||
|
|
||||||
|
591: The version number is on the intro screen
|
||||||
|
|
||||||
|
592: The new piracy screen is in
|
||||||
|
|
||||||
|
660: The map view is a debugging tool, not a feature.
|
||||||
|
|
||||||
|
682,694,695: The hang is fixed. Whenever a monster had no viable move it
|
||||||
|
went into a loop (the trolls were all added at the last minute). Good
|
||||||
|
catch.
|
||||||
|
|
||||||
|
697: The graphic screw up was fixed by adding two blocks to the map
|
||||||
|
|
||||||
|
Everything else: The single lines are a result of roundoff error between
|
||||||
|
two transformations. When a wall segment disapears it is a result of a
|
||||||
|
back trace hitting a side that should by invisable. The objects showing up
|
||||||
|
through walls is a result of the z buffer being kept in pixels (a poor
|
||||||
|
design decision). Not mentioned by you: The thick bar shown when you look
|
||||||
|
almost straight down a long wall is a result of the tangent table maxing out
|
||||||
|
in 16 bits, causing the texture mapping to think it can optimize the wall
|
||||||
|
drawing. The fish eye view when you turn right next to a wall is a result of
|
||||||
|
not having enough compiled scaler routines (memory constraints) to scale
|
||||||
|
thinks closer than the view plane. These problems are understood, but the
|
||||||
|
corrective measures are not really feasable. I think CAT3D still stands well
|
||||||
|
even with these warts. Over the past several days I have developed a ray
|
||||||
|
tracing/intersecting 3-D refresh to replace the image based system from
|
||||||
|
CAT3D, and it has addressed all of these problems. I would put it in CAT3D
|
||||||
|
except for: it uses 286 specific code in a few places, but no big deal
|
||||||
|
to replace. It is designed to work with a demand paged graphics caching
|
||||||
|
system, still no big deal. I am unsure of its memory requirements,
|
||||||
|
potentially a terminal problem. I haven't tested it with scaled sprites
|
||||||
|
yet, this would require one or two additional days.
|
||||||
|
|
||||||
|
If gamer's edge ever gets an ok to do a hard drive installable game you will
|
||||||
|
probably see the new system.
|
||||||
|
|
||||||
|
|
||||||
|
John Carmack
|
||||||
|
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
Catacomb 3-D: The Descent
|
||||||
|
=========================
|
||||||
|
|
||||||
|
This repository contains the source code for Catacomb 3-D (also known as
|
||||||
|
Catacombs 3 or Catacomb 3-D: A New Dimension). The source code is designed for
|
||||||
|
Borland C++ 2.0, but compiled fine with Borland C++ 3.1 at the time of this
|
||||||
|
release.
|
||||||
|
|
||||||
|
It is released under the GNU GPLv2. Please see COPYING for license details.
|
||||||
|
|
||||||
|
This release does not affect the licensing for the game data files. You will
|
||||||
|
need to legally acquire the game data in order to use the exe built from this
|
||||||
|
source code.
|
||||||
Reference in New Issue
Block a user