home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Monster Media 1993 #2
/
Image.iso
/
graphics
/
acksrc.zip
/
ACKMAIN.C
< prev
next >
Wrap
Text File
|
1993-06-20
|
10KB
|
556 lines
/* ACK-3D ( Animation Construction Kit 3D ) */
/* Main entry point */
/* Author: Lary Myers */
#include <stdlib.h>
#include <stdio.h>
#include <dos.h>
#include <mem.h>
#include <alloc.h>
#include <io.h>
#include <fcntl.h>
#include <time.h>
#include <string.h>
#include <sys\stat.h>
#include "ack3d.h"
#include "ackext.h"
/****************************************************************************
** **
****************************************************************************/
void main(int argc,char *argv[])
{
int i,j,done,pos,dflag;
int TablePosn;
int xPlayer,yPlayer;
int PlayerAngle;
int x1,y1;
int SkyCount;
int SkyNumber;
int DoFlash;
long CosAngle,SinAngle;
int Spin,SpinAngle;
int DoorDelay;
unsigned char sCode;
long frames,tStart,tDraw,t1;
#if DEBUG
dfp = fopen("x.dst","wt");
#else
dfp = NULL;
#endif
DoFlash = 1;
if (argc > 1)
{
for (i = 0; i < argc; i++)
{
if (!(stricmp(argv[i+1],"-F")))
DoFlash = 0;
}
}
randomize();
InitializeMouse();
strcpy(PalFile,"ack.pal");
strcpy(GridFile,"ackmap.l01");
TopColor = SkyColor = SKY_COLOR;
BottomColor = FloorColor = FLOOR_COLOR;
FlashColor = SKY_FLASH;
SkyCount = 0;
Spin = SpinAngle = 0;
CenterRow = 120;
MaxObjects = 0;
DoorSpeed = DEFAULT_DOOR_SPEED;
StartX = StartY = 96;
StartAngle = 0;
CurrentLevel = 1;
NonSecretCode = 1;
if (BuildTables())
exit(1);
if (ReadMasterFile("ACK3D.L01"))
exit(1);
if (ReadMapFile())
exit(1);
BuildXYgrid();
TopColor = SkyColor;
BottomColor = FloorColor;
xPlayer = StartX;
yPlayer = StartY;
PlayerAngle = StartAngle;
CosAngle = CosTable[PlayerAngle];
SinAngle = SinTable[PlayerAngle];
ObjList[0].Sides = 0;
ObjList[0].VidRow = CenterRow;
keyBoardInit();
oldvec=getvect(KEYBD);
setvect(KEYBD,myInt);
graphinit();
PageNum = 1;
usepage(PageNum);
LoadPalette(PalFile);
NoWalls = 0;
done = 0;
DrawView(xPlayer,yPlayer,PlayerAngle);
SkyNumber = random(1000);
txRay = 0L;
tyRay = 0L;
tDOW = 0L;
tFlip = 0L;
frames = 0L;
tDraw = 0L;
tStart = CLOCK_PTR;
while (!done)
{
CheckDoors(xPlayer,yPlayer);
CheckObjectMovement();
sCode = CheckSpecialCodes((yPlayer & 0xFFC0) + (xPlayer >> 6));
if (sCode == MAP_DOWNCODE)
{
CurrentLevel++;
ReadNewLevel();
TopColor = SkyColor;
BottomColor = FloorColor;
xPlayer = StartX;
yPlayer = StartY;
PlayerAngle = StartAngle;
CosAngle = CosTable[PlayerAngle];
SinAngle = SinTable[PlayerAngle];
}
if (sCode == MAP_UPCODE)
{
if (CurrentLevel > 1)
{
CurrentLevel--;
ReadNewLevel();
TopColor = SkyColor;
BottomColor = FloorColor;
xPlayer = StartX;
yPlayer = StartY;
PlayerAngle = StartAngle;
CosAngle = CosTable[PlayerAngle];
SinAngle = SinTable[PlayerAngle];
}
}
if (sCode == MAP_GOALCODE)
{
DoGoalScreen();
done = 1;
break;
}
if (Spin)
{
Spin >>= 1;
PlayerAngle += SpinAngle;
if (PlayerAngle >= INT_ANGLE_360)
PlayerAngle -= INT_ANGLE_360;
if (PlayerAngle < 0)
PlayerAngle += INT_ANGLE_360;
CosAngle = CosTable[PlayerAngle];
SinAngle = SinTable[PlayerAngle];
}
if (SkyCount)
{
if (!(SkyCount & 1))
TopColor = FlashColor;
else
TopColor = SkyColor;
SkyCount--;
}
if (DoFlash)
{
if (!SkyCount && random(32768) == SkyNumber)
{
SkyCount = 5;
SkyNumber = random(31000) + 1000;
}
}
if(keyBoard.escape)
break;
CheckMouse(&mouse);
if (mouse.mdx < 0)
{
Spin = -mouse.mdx;
Spin >>= 3;
SpinAngle = -INT_ANGLE_2 * Spin;
Spin = 1;
}
if (mouse.mdx > 0)
{
Spin = mouse.mdx;
Spin >>= 3;
SpinAngle = INT_ANGLE_2 * Spin;
Spin = 1;
}
if (mouse.mdy < 0)
{
i = -mouse.mdy;
i >>= 2;
i += 16;
x1 = xPlayer + (int)((CosAngle * i) >> FP_SHIFT);
y1 = yPlayer + (int)((SinAngle * i) >> FP_SHIFT);
if ((i = CheckHit(xPlayer,yPlayer,PlayerAngle)) == 0)
{
xPlayer = x1;
yPlayer = y1;
}
else
{
if (i == 3)
continue;
if (i == 1)
{
x1 = xPlayer;
if (PlayerAngle < INT_ANGLE_180)
j = INT_ANGLE_90;
else
j = INT_ANGLE_270;
}
else
{
y1 = yPlayer;
if (PlayerAngle > INT_ANGLE_270 || PlayerAngle < INT_ANGLE_90)
j = 0;
else
j = INT_ANGLE_180;
}
if (!CheckHit(xPlayer,yPlayer,j))
{
xPlayer = x1;
yPlayer = y1;
}
}
}
if (mouse.mdy > 0)
{
i = mouse.mdy;
i >>= 2;
i += 16;
x1 = xPlayer - (int)((CosAngle * i) >> FP_SHIFT);
y1 = yPlayer - (int)((SinAngle * i) >> FP_SHIFT);
j = PlayerAngle + INT_ANGLE_180;
if (j >= INT_ANGLE_360)
j -= INT_ANGLE_360;
if ((i = CheckHit(xPlayer,yPlayer,j)) == 0)
{
xPlayer = x1;
yPlayer = y1;
}
else
{
if (i == 3)
continue;
if (i == 1)
{
x1 = xPlayer;
if (j < INT_ANGLE_180)
j = INT_ANGLE_90;
else
j = INT_ANGLE_270;
}
else
{
y1 = yPlayer;
if (j > INT_ANGLE_270 || j < INT_ANGLE_90)
j = 0;
else
j = INT_ANGLE_180;
}
if (!CheckHit(xPlayer,yPlayer,j))
{
xPlayer = x1;
yPlayer = y1;
}
}
}
if (mouse.mButtons & 2)
{
i = CheckHit(xPlayer,yPlayer,PlayerAngle);
if (i == 1 && xGrid[xMapPosn] == DOOR_SECRETCODE)
{
if (xSecretColumn == 0)
{
xSecretmPos = xMapPosn;
if (iLastX > xPlayer)
{
xSecretmPos1 = xMapPosn + 1;
xSecretColumn = 1;
yGrid[xMapPosn] = yGrid[xMapPosn - GRID_WIDTH];
}
else
{
xSecretmPos1 = xMapPosn - 1;
xSecretColumn = -1;
yGrid[xSecretmPos1] = yGrid[xSecretmPos1 - GRID_WIDTH];
}
}
}
if (i == 2 && yGrid[yMapPosn] == DOOR_SECRETCODE)
{
if (ySecretColumn == 0)
{
ySecretmPos = yMapPosn;
if (iLastY > yPlayer)
{
ySecretmPos1 = yMapPosn + GRID_WIDTH;
xGrid[yMapPosn] = xGrid[yMapPosn-1];
ySecretColumn = 1;
}
else
{
ySecretmPos1 = yMapPosn - GRID_WIDTH;
xGrid[ySecretmPos1] = xGrid[ySecretmPos1 - 1];
ySecretColumn = -1;
}
}
}
if (i == 1 && xGrid[xMapPosn] == DOOR_XCODE)
{
j = FindDoorSlot(xMapPosn);
if (j >= 0)
{
Door[j].mPos = xMapPosn;
if ((int)iLastX > xPlayer)
i = xMapPosn + 1;
else
i = xMapPosn - 1;
Door[j].mCode = xGrid[xMapPosn];
Door[j].mCode1 = xGrid[i];
Door[j].mPos1 = i;
Door[j].ColOffset = 1;
Door[j].Speed = DoorSpeed;
Door[j].Type = DOOR_XCODE;
}
}
if (i == 2 && yGrid[yMapPosn] == DOOR_YCODE)
{
j = FindDoorSlot(yMapPosn);
if (j >= 0)
{
Door[j].mPos = yMapPosn;
if ((int)iLastY > yPlayer)
i = yMapPosn + GRID_WIDTH;
else
i = yMapPosn - GRID_WIDTH;
Door[j].mCode = yGrid[yMapPosn];
Door[j].mCode1 = yGrid[i];
Door[j].mPos1 = i;
Door[j].ColOffset = 1;
Door[j].Speed = DoorSpeed;
Door[j].Type = DOOR_YCODE;
}
}
}
if(keyBoard.rightArrow)
{
if (keyBoard.control)
PlayerAngle += INT_ANGLE_45;
else
PlayerAngle += INT_ANGLE_6;
if (PlayerAngle >= INT_ANGLE_360)
PlayerAngle -= INT_ANGLE_360;
CosAngle = CosTable[PlayerAngle];
SinAngle = SinTable[PlayerAngle];
}
if(keyBoard.leftArrow)
{
if (keyBoard.control)
PlayerAngle -= INT_ANGLE_45;
else
PlayerAngle -= INT_ANGLE_6;
if (PlayerAngle < 0)
PlayerAngle += INT_ANGLE_360;
CosAngle = CosTable[PlayerAngle];
SinAngle = SinTable[PlayerAngle];
}
if(keyBoard.upArrow)
{
x1 = xPlayer + (int)(CosAngle >> (FP_SHIFT - 4));
y1 = yPlayer + (int)(SinAngle >> (FP_SHIFT - 4));
if ((i = CheckHit(xPlayer,yPlayer,PlayerAngle)) == 0)
{
xPlayer = x1;
yPlayer = y1;
}
else
{
if (i == 3)
continue;
if (i == 1)
{
x1 = xPlayer;
if (PlayerAngle < INT_ANGLE_180)
j = INT_ANGLE_90;
else
j = INT_ANGLE_270;
}
else
{
y1 = yPlayer;
if (PlayerAngle > INT_ANGLE_270 || PlayerAngle < INT_ANGLE_90)
j = 0;
else
j = INT_ANGLE_180;
}
if (!CheckHit(xPlayer,yPlayer,j))
{
xPlayer = x1;
yPlayer = y1;
}
}
}
if(keyBoard.downArrow)
{
x1 = xPlayer - (int)(CosAngle >> (FP_SHIFT - 4));
y1 = yPlayer - (int)(SinAngle >> (FP_SHIFT - 4));
j = PlayerAngle + INT_ANGLE_180;
if (j >= INT_ANGLE_360)
j -= INT_ANGLE_360;
if ((i = CheckHit(xPlayer,yPlayer,j)) == 0)
{
xPlayer = x1;
yPlayer = y1;
}
else
{
if (i == 3)
continue;
if (i == 1)
{
x1 = xPlayer;
if (j < INT_ANGLE_180)
j = INT_ANGLE_90;
else
j = INT_ANGLE_270;
}
else
{
y1 = yPlayer;
if (j > INT_ANGLE_270 || j < INT_ANGLE_90)
j = 0;
else
j = INT_ANGLE_180;
}
if (!CheckHit(xPlayer,yPlayer,j))
{
xPlayer = x1;
yPlayer = y1;
}
}
}
if (keyBoard.letA)
{
if (CenterRow > 90)
{
CenterRow--;
}
}
if (keyBoard.letS)
{
if (CenterRow < 150)
{
CenterRow++;
}
}
t1 = CLOCK_PTR;
DrawView(xPlayer,yPlayer,PlayerAngle);
tDraw += CLOCK_PTR - t1;
frames++;
}
tStart = CLOCK_PTR - tStart;
WrapUp();
printf("\nFrames : %ld\n",frames);
printf("tDrawRtn : %ld\n",tDraw);
printf("tTotal : %ld\n",tStart);
printf("txRay : %ld\n",txRay);
printf("tyRay : %ld\n",tyRay);
printf("tDrawWalls: %ld\n",tDOW);
printf("tFlipPage : %ld\n",tFlip);
}