home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Monster Media 1993 #2
/
Image.iso
/
graphics
/
acksrc.zip
/
ACKUTIL.C
< prev
next >
Wrap
Text File
|
1993-06-15
|
9KB
|
350 lines
/* ACK-3D ( Animation Construction Kit 3D ) */
/* Utility routines */
/* 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 Beep(void)
{
sound(440);
delay(20);
nosound();
}
/****************************************************************************
** **
****************************************************************************/
void WrapUp(void)
{
if (dfp != NULL)
fclose(dfp);
textmode(3);
setvect(KEYBD,oldvec);
}
/****************************************************************************
** Allocates memory for the various trig tables and reads in the pre- **
** calculated values from "trig.dat". **
** **
** **
****************************************************************************/
int GetTables(void)
{
int handle,len;
int ca,na;
LongTanTable = (long far *)malloc(sizeof(long) * INT_ANGLE_360);
LongInvTanTable = (long far *)malloc(sizeof(long) * INT_ANGLE_360);
CosTable = (long far *)malloc(sizeof(long) * INT_ANGLE_360);
SinTable = (long far *)malloc(sizeof(long) * INT_ANGLE_360);
InvSinTable = (long far *)malloc(sizeof(long) * INT_ANGLE_360);
InvCosTable = (long far *)malloc(sizeof(long) * INT_ANGLE_360);
LongCosTable = (long far *)malloc(sizeof(long) * INT_ANGLE_360);
xNextTable = (long far *)malloc(sizeof(long) * INT_ANGLE_360);
yNextTable = (long far *)malloc(sizeof(long) * INT_ANGLE_360);
ViewCosTable = (long far *)malloc(sizeof(long) * VIEW_WIDTH);
if (LongTanTable == NULL ||
LongInvTanTable == NULL ||
CosTable == NULL ||
SinTable == NULL ||
InvSinTable == NULL ||
InvCosTable == NULL ||
LongCosTable == NULL ||
xNextTable == NULL ||
yNextTable == NULL ||
ViewCosTable == NULL)
{
printf("Unable to get initialization memory!\n");
return(-1);
}
len = sizeof(long) * INT_ANGLE_360;
handle = open("trig.dat",O_RDWR|O_BINARY);
if (handle < 1)
{
printf("Unable to locate file TRIG.DAT\n");
return(-1);
}
read(handle,SinTable,len);
read(handle,CosTable,len);
read(handle,LongTanTable,len);
read(handle,LongInvTanTable,len);
read(handle,InvCosTable,len);
read(handle,InvSinTable,len);
read(handle,LongCosTable,len);
close(handle);
ca = INT_ANGLE_30;
na = -1;
for (len = 0; len < VIEW_WIDTH; len++)
{
ViewCosTable[len] = LongCosTable[ca];
ca += na;
if (ca <= 0)
{
ca = -ca;
na = -na;
}
}
for (len = 0; len < INT_ANGLE_360; len++)
{
yNextTable[len] = (long)GRID_SIZE * LongTanTable[len];
xNextTable[len] = (long)GRID_SIZE * LongInvTanTable[len];
}
return(0);
}
/****************************************************************************
** Checks the scancode from the INT 9 interrupt and sets the appropriate **
** item in the keyboard structure. **
****************************************************************************/
void keyCheck(void)
{
if(scanCode==RIGHT_ARROW_PRESSED)keyBoard.rightArrow=1;
if(scanCode==RIGHT_ARROW_RELEASED)keyBoard.rightArrow=0;
if(scanCode==UP_ARROW_PRESSED)keyBoard.upArrow=1;
if(scanCode==UP_ARROW_RELEASED)keyBoard.upArrow=0;
if(scanCode==LEFT_ARROW_PRESSED)keyBoard.leftArrow=1;
if(scanCode==LEFT_ARROW_RELEASED)keyBoard.leftArrow=0;
if(scanCode==DOWN_ARROW_PRESSED)keyBoard.downArrow=1;
if(scanCode==DOWN_ARROW_RELEASED)keyBoard.downArrow=0;
if(scanCode==CONTROL_PRESSED)keyBoard.control=1;
if(scanCode==CONTROL_RELEASED)keyBoard.control=0;
if(scanCode==ESCAPE)keyBoard.escape=1;
if(scanCode==PLUS_PRESSED)keyBoard.plus = 1;
if(scanCode==PLUS_RELEASED)keyBoard.plus = 0;
if(scanCode==MINUS_PRESSED)keyBoard.minus = 1;
if(scanCode==MINUS_RELEASED)keyBoard.minus = 0;
if(scanCode==LETTER_A_PRESSED)keyBoard.letA = 1;
if(scanCode==LETTER_A_RELEASED)keyBoard.letA = 0;
if(scanCode==LETTER_S_PRESSED)keyBoard.letS = 1;
if(scanCode==LETTER_S_RELEASED)keyBoard.letS = 0;
#if 0
if(scanCode==HOME_PRESSED)keyBoard.home=1;
if(scanCode==HOME_RELEASED)keyBoard.home=0;
if(scanCode==END_PRESSED)keyBoard.end=1;
if(scanCode==END_RELEASED)keyBoard.end=0;
if(scanCode==PGUP_PRESSED)keyBoard.pgup=1;
if(scanCode==PGUP_RELEASED)keyBoard.pgup=0;
if(scanCode==PGDN_PRESSED)keyBoard.pgdn=1;
if(scanCode==PGDN_RELEASED)keyBoard.pgdn=0;
#endif
}
/****************************************************************************
** Keyboard interrupt 9 **
****************************************************************************/
void interrupt myInt(void)
{
register char x;
scanCode = inp(0x60); // read keyboard data port
x = inp(0x61);
outp(0x61, (x | 0x80));
outp(0x61, x);
outp(0x20, 0x20);
keyCheck();
}
/****************************************************************************
** **
****************************************************************************/
void keyBoardInit(void)
{
keyBoard.rightArrow=0;
keyBoard.upArrow=0;
keyBoard.leftArrow=0;
keyBoard.downArrow=0;
keyBoard.control=0;
keyBoard.escape=0;
numLockKeyStatus=0;
}
/****************************************************************************
** Return the square root of a long value **
****************************************************************************/
long long_sqrt(long v)
{
int i;
unsigned long result,tmp;
unsigned long low,high;
if (v <= 1L) return((unsigned)v);
low = v;
high = 0L;
result = 0;
for (i = 0; i < 16; i++)
{
result += result;
high = (high << 2) | ((low >>30) & 0x3);
low <<= 2;
tmp = result + result + 1;
if (high >= tmp)
{
result++;
high -= tmp;
}
}
if (v - (result * result) >= (result - 1))
result++;
return(result);
}
/****************************************************************************
** **
****************************************************************************/
char *GetExtent(char *s)
{
char *e;
e = strchr(s,'.');
if (e == NULL)
return(s);
e++;
return(e);
}
/****************************************************************************
** **
****************************************************************************/
char *StripEndOfLine(char *s)
{
int len;
char ch;
len = strlen(s);
while (--len >= 0)
{
ch = s[len];
if (ch != ' ' && ch != ';' && ch != '\t' && ch != 13 && ch != 10)
break;
s[len] = '\0';
}
return(s);
}
/****************************************************************************
** **
****************************************************************************/
char *SkipSpaces(char *s)
{
while (*s == ' ' || *s == '\t' || *s == ',')
strcpy(s,&s[1]);
return(s);
}
/****************************************************************************
** **
****************************************************************************/
char *AddExtent(char *s,char *ext)
{
if (strchr(s,'.') == NULL)
strcat(s,ext);
return(s);
}
/****************************************************************************
** **
****************************************************************************/
char *CopyToComma(char *dest,char *src)
{
char ch;
while (*src)
{
ch = *src++;
if (ch == ' ' || ch == '\t' || ch == ',')
break;
*dest++ = ch;
}
*dest = '\0';
return(src);
}
/****************************************************************************
** **
****************************************************************************/
void CheckMouse(MOUSE *m)
{
int dx,dy;
int x,y,buttons;
if (HaveMouse)
{
mouse_read_cursor(&buttons,&y,&x);
dx = x - 160;
dy = y - 120;
m->mButtons = buttons;
mouse_set_cursor(120,160);
if (abs(dy) > 10 && abs(dx) < 32)
dx >>= 2;
m->mdx = dx;
m->mdy = dy;
}
}
/****************************************************************************
** **
****************************************************************************/
unsigned char CheckSpecialCodes(int MapPosn)
{
int i;
for (i = 0; i < TotalSpecial; i++)
{
if (SpecialCodes[i].mPos == MapPosn)
return(SpecialCodes[i].mCode);
}
return(0);
}