update example project (cleanups, enhancements, comments, etc)
This commit is contained in:
parent
de3232a474
commit
6f75f4284a
|
@ -1,4 +1,17 @@
|
||||||
// Function to process and ACK resource file
|
/*
|
||||||
|
* ACK-3D Resource File Processing
|
||||||
|
* -------------------------------
|
||||||
|
*
|
||||||
|
* This source file is basically a copy of the ACKINFO.CPP file from the
|
||||||
|
* Windows example project discussed in chapter 14 of the book.
|
||||||
|
*
|
||||||
|
* There are some slight modifications that I've made though:
|
||||||
|
* - A global ACKENG structure is not assumed. You must pass one in to
|
||||||
|
* ProcessInfoFile()
|
||||||
|
* - Functions for processing a scrolling backdrop have been copied from the
|
||||||
|
* FDEMO/MALL demo projects and are included here since they are useful.
|
||||||
|
* - A function for loading a palette is included.
|
||||||
|
*/
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <io.h>
|
#include <io.h>
|
||||||
|
@ -6,10 +19,6 @@
|
||||||
#include "ackeng.h"
|
#include "ackeng.h"
|
||||||
#include "ackext.h"
|
#include "ackext.h"
|
||||||
|
|
||||||
// The application MUST have a global variable called ae for use by this
|
|
||||||
// routine.
|
|
||||||
extern ACKENG *ae;
|
|
||||||
|
|
||||||
// Globals
|
// Globals
|
||||||
int LineNumber;
|
int LineNumber;
|
||||||
char LineBuffer[200];
|
char LineBuffer[200];
|
||||||
|
@ -43,17 +52,57 @@ void ProcessBackDrop(UCHAR *bPtr) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Loads a bitmap (wall, object, screen/backdrop, etc) and returns a
|
||||||
|
// pointer to the bitmap data. The first 4-bytes of the returned pointer
|
||||||
|
// are the width and height (2 shorts) followed by the raw pixel data.
|
||||||
|
// The filename passed can be either a string specifying a file or an
|
||||||
|
// integer specifying a resource from the currently open resource file.
|
||||||
|
UCHAR* LoadBitmap(UCHAR bitmapType, char *fName) {
|
||||||
|
UCHAR *bPtr = NULL;
|
||||||
|
|
||||||
|
switch (bitmapType) {
|
||||||
|
case BMLOAD_BBM:
|
||||||
|
bPtr = AckReadiff(fName);
|
||||||
|
break;
|
||||||
|
case BMLOAD_GIF:
|
||||||
|
bPtr = AckReadgif(fName);
|
||||||
|
break;
|
||||||
|
case BMLOAD_PCX:
|
||||||
|
bPtr = AckReadPCX(fName);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return bPtr;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Loads a 256 color palette and returns a pointer to the raw color data.
|
||||||
|
UCHAR* LoadPalette(int resource) {
|
||||||
|
UCHAR *ptr = NULL;
|
||||||
|
FILE *fp;
|
||||||
|
|
||||||
|
fp = fdopen(rsHandle,"rb");
|
||||||
|
if (!fp)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
fseek(fp, rbaTable[(int)resource], SEEK_SET);
|
||||||
|
|
||||||
|
ptr = (UCHAR*)AckMalloc(768);
|
||||||
|
fread(ptr, 768, 1, fp);
|
||||||
|
|
||||||
|
return ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// Loads a background image and processes the image into the
|
// Loads a background image and processes the image into the
|
||||||
// separate slices for use at display time. Currently a background image
|
// separate slices for use at display time. Currently a background image
|
||||||
// can be 640 columns wide. This number can be made dynamic if needbe and would
|
// can be 640 columns wide. This number can be made dynamic if needbe and would
|
||||||
// need to be changed in the routine below and in the DrawBackground routine
|
// need to be changed in the routine below and in the DrawBackground routine
|
||||||
// in the ACK engine.
|
// in the ACK engine.
|
||||||
int LoadBackDrop(void) {
|
int LoadBackDrop(ACKENG *ae) {
|
||||||
UCHAR *bPtr;
|
UCHAR *bPtr;
|
||||||
|
|
||||||
if (ResScrollBack) {
|
if (ResScrollBack) {
|
||||||
bPtr = AckReadiff((char*)ResScrollBack);
|
bPtr = LoadBitmap(ae->bmLoadType, (char*)ResScrollBack);
|
||||||
if (bPtr == NULL)
|
if (bPtr == NULL)
|
||||||
return 8;
|
return 8;
|
||||||
|
|
||||||
|
@ -64,6 +113,7 @@ int LoadBackDrop(void) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Reads a text line from the resource file
|
// Reads a text line from the resource file
|
||||||
int ReadLine(void) {
|
int ReadLine(void) {
|
||||||
int len;
|
int len;
|
||||||
|
@ -110,7 +160,7 @@ char *GetNextParm(char *s) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Loads a wall bitmap specified in info file
|
// Loads a wall bitmap specified in info file
|
||||||
int LoadWall(void) {
|
int LoadWall(ACKENG *ae) {
|
||||||
int wnum, rnum, result;
|
int wnum, rnum, result;
|
||||||
long pos;
|
long pos;
|
||||||
char *lb;
|
char *lb;
|
||||||
|
@ -133,7 +183,7 @@ int LoadWall(void) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Loads an object bitmap specified in info file
|
// Loads an object bitmap specified in info file
|
||||||
int LoadObject(void) {
|
int LoadObject(ACKENG *ae) {
|
||||||
int onum, rnum, result;
|
int onum, rnum, result;
|
||||||
long pos;
|
long pos;
|
||||||
char *lb;
|
char *lb;
|
||||||
|
@ -164,7 +214,7 @@ char *SkipSpaces(char *s) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Creates and object of the desired style
|
// Creates and object of the desired style
|
||||||
int CreateObject(void) {
|
int CreateObject(ACKENG *ae) {
|
||||||
short onum, vnum;
|
short onum, vnum;
|
||||||
short result, oType;
|
short result, oType;
|
||||||
short NumViews, bmPerView;
|
short NumViews, bmPerView;
|
||||||
|
@ -289,7 +339,7 @@ int CreateObject(void) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Reads the ASCII info file and processes the commands.
|
// Reads the ASCII info file and processes the commands.
|
||||||
int ProcessInfoFile(void) {
|
int ProcessInfoFile(ACKENG *ae) {
|
||||||
int result;
|
int result;
|
||||||
int mode;
|
int mode;
|
||||||
long pos;
|
long pos;
|
||||||
|
@ -323,7 +373,7 @@ int ProcessInfoFile(void) {
|
||||||
if (!strnicmp(LineBuffer, "ENDBITMAPS:", 11))
|
if (!strnicmp(LineBuffer, "ENDBITMAPS:", 11))
|
||||||
mode = 4;
|
mode = 4;
|
||||||
else
|
else
|
||||||
result = LoadWall();
|
result = LoadWall(ae);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 2: // Object bitmaps
|
case 2: // Object bitmaps
|
||||||
|
@ -335,14 +385,14 @@ int ProcessInfoFile(void) {
|
||||||
if (!strnicmp(LineBuffer, "ENDBITMAPS:", 11))
|
if (!strnicmp(LineBuffer, "ENDBITMAPS:", 11))
|
||||||
mode = 5;
|
mode = 5;
|
||||||
else
|
else
|
||||||
result = LoadObject();
|
result = LoadObject(ae);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 3: // Create Object
|
case 3: // Create Object
|
||||||
if (!strnicmp(LineBuffer, "ENDDESC:", 8))
|
if (!strnicmp(LineBuffer, "ENDDESC:", 8))
|
||||||
mode = 5;
|
mode = 5;
|
||||||
else
|
else
|
||||||
result = CreateObject();
|
result = CreateObject(ae);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 4: // Walls topic
|
case 4: // Walls topic
|
28
example/assets.h
Normal file
28
example/assets.h
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
#ifndef ASSETS_H_INCLUDED
|
||||||
|
#define ASSETS_H_INCLUDED
|
||||||
|
|
||||||
|
#include "ack3d.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern int LineNumber;
|
||||||
|
extern char LineBuffer[];
|
||||||
|
|
||||||
|
extern int MapResource;
|
||||||
|
extern int PalResource;
|
||||||
|
extern int ResScreenBack;
|
||||||
|
extern int ResScrollBack;
|
||||||
|
|
||||||
|
UCHAR* LoadBitmap(UCHAR bitmapType, char *fName);
|
||||||
|
UCHAR* LoadPalette(int resource);
|
||||||
|
int LoadBackDrop(ACKENG *ae);
|
||||||
|
int ProcessInfoFile(ACKENG *ae);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
|
@ -24,6 +24,7 @@
|
||||||
#include "ack3d.h"
|
#include "ack3d.h"
|
||||||
#include "ackeng.h"
|
#include "ackeng.h"
|
||||||
#include "ackext.h"
|
#include "ackext.h"
|
||||||
|
#include "assets.h"
|
||||||
|
|
||||||
#define KEY_RIGHT 77
|
#define KEY_RIGHT 77
|
||||||
#define KEY_UP 72
|
#define KEY_UP 72
|
||||||
|
@ -33,23 +34,55 @@
|
||||||
#define KEY_ESCAPE 1
|
#define KEY_ESCAPE 1
|
||||||
|
|
||||||
#define TURN_SPEED 5
|
#define TURN_SPEED 5
|
||||||
#define TURN_SPEED_DECAY 3
|
#define TURN_SPEED_DECAY 2
|
||||||
#define MOVE_SPEED 5
|
#define MOVE_SPEED 4
|
||||||
#define MOVE_SPEED_DECAY 3
|
#define MOVE_SPEED_DECAY 1
|
||||||
#define BASE_MOVE_AMOUNT 8
|
#define BASE_MOVE_AMOUNT 5
|
||||||
#define BASE_TURN_AMOUNT INT_ANGLE_4
|
#define BASE_TURN_AMOUNT INT_ANGLE_2
|
||||||
|
|
||||||
// ACK3D bitmap loading routines, such as AckReadiff(), will automatically
|
// ACK3D bitmap loading routines, such as AckReadiff(), will automatically
|
||||||
// populate (and re-populate) this array with palette found in that image
|
// populate (and re-populate) this array with palette found in that image
|
||||||
// file. still, this must be manually set with AckSetPalette()
|
// file. still, this (or any other palette color data) must be manually set
|
||||||
|
// with AckSetPalette()
|
||||||
extern unsigned char colordat[];
|
extern unsigned char colordat[];
|
||||||
|
|
||||||
int ProcessInfoFile(void);
|
// These are the ranges used for distance shading. Will need to be modified
|
||||||
|
// for the new color palette used.
|
||||||
|
// For ACK-3D's distance-based light shading to look best, your palette really
|
||||||
|
// needs to be designed with this in mind (and your bitmaps too). Many of the
|
||||||
|
// ACK-3D demo assets don't look so good with it.
|
||||||
|
ColorRange ranges[64] = {
|
||||||
|
1,15,
|
||||||
|
16,16,
|
||||||
|
32,16,
|
||||||
|
48,16,
|
||||||
|
64,16,
|
||||||
|
80,16,
|
||||||
|
96,8,
|
||||||
|
104,8,
|
||||||
|
112,8,
|
||||||
|
120,8,
|
||||||
|
136,8,
|
||||||
|
144,8,
|
||||||
|
152,8,
|
||||||
|
160,8,
|
||||||
|
168,8,
|
||||||
|
176,8,
|
||||||
|
184,8,
|
||||||
|
192,16,
|
||||||
|
208,16,
|
||||||
|
224,16,
|
||||||
|
240,15,
|
||||||
|
0,0
|
||||||
|
};
|
||||||
|
|
||||||
// this is the main ACK3D engine structure. holds the map, bitmaps, objects,
|
// this is the main ACK3D engine structure. holds the map, bitmaps, objects,
|
||||||
// and also the current state of the game world (as far as ACK3D is concerned)
|
// and also the current state of the game world (as far as ACK3D is concerned)
|
||||||
ACKENG *ae;
|
ACKENG *ae;
|
||||||
|
|
||||||
|
UCHAR *uiFrame = NULL;
|
||||||
|
UCHAR *palette = NULL;
|
||||||
|
|
||||||
// this game loop made semi-overcomplicated by rudimentary turn/movement
|
// this game loop made semi-overcomplicated by rudimentary turn/movement
|
||||||
// acceleration logic
|
// acceleration logic
|
||||||
void GameLoop(void) {
|
void GameLoop(void) {
|
||||||
|
@ -101,6 +134,7 @@ void GameLoop(void) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (AckKeys[KEY_SPACE]) {
|
if (AckKeys[KEY_SPACE]) {
|
||||||
|
AckKeys[KEY_SPACE] = 0;
|
||||||
AckCheckDoorOpen(ae->xPlayer, ae->yPlayer, ae->PlayerAngle);
|
AckCheckDoorOpen(ae->xPlayer, ae->yPlayer, ae->PlayerAngle);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -141,14 +175,10 @@ int main(int argc, char *argv[]) {
|
||||||
// ack3d renderer viewport size. on 486 and lower-spec machines, you
|
// ack3d renderer viewport size. on 486 and lower-spec machines, you
|
||||||
// probably do not want this to be at full 320x200 for performance reasons
|
// probably do not want this to be at full 320x200 for performance reasons
|
||||||
// even reducing 320x200 by 20% makes a nice, noticeable difference!
|
// even reducing 320x200 by 20% makes a nice, noticeable difference!
|
||||||
ae->WinStartX = 0;
|
ae->WinStartX = 16;
|
||||||
ae->WinStartY = 0;
|
ae->WinStartY = 12;
|
||||||
ae->WinEndX = 319;
|
ae->WinEndX = 303;
|
||||||
ae->WinEndY = 199;
|
ae->WinEndY = 158;
|
||||||
|
|
||||||
// various other flags that can be set too
|
|
||||||
ae->LightFlag = SHADING_ON;
|
|
||||||
ae->DoorSpeed = 3;
|
|
||||||
|
|
||||||
printf("Initializing ACK-3D\n");
|
printf("Initializing ACK-3D\n");
|
||||||
|
|
||||||
|
@ -184,19 +214,48 @@ int main(int argc, char *argv[]) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
result = ProcessInfoFile();
|
result = ProcessInfoFile(ae);
|
||||||
if (result) {
|
if (result) {
|
||||||
printf("Error while processing. Result code %d\n", result);
|
printf("Error while processing pics.dtf\n");
|
||||||
|
printf("Result code %d\nLine number: %d\nLine: %s\n", result, LineNumber, LineBuffer);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("Processing scrolling backdrop\n");
|
printf("Processing scrolling backdrop\n");
|
||||||
// processes any (optional) scrolling backdrop that was loaded so it is
|
// processes any (optional) scrolling backdrop that was loaded so it is
|
||||||
// ready to be rendered
|
// ready to be rendered
|
||||||
LoadBackDrop();
|
LoadBackDrop(ae);
|
||||||
|
|
||||||
|
// if the resource file specified a screen/ui bitmap, then load it
|
||||||
|
if (ResScreenBack) {
|
||||||
|
uiFrame = LoadBitmap(ae->bmLoadType, (char*)ResScreenBack);
|
||||||
|
}
|
||||||
|
|
||||||
|
// if the resource file specified a palette, then load it
|
||||||
|
if (PalResource) {
|
||||||
|
palette = LoadPalette(PalResource);
|
||||||
|
}
|
||||||
|
|
||||||
|
// we won't be loading anything else from the resource file now, so we
|
||||||
|
// can close it
|
||||||
AckCloseResource();
|
AckCloseResource();
|
||||||
|
|
||||||
|
// various other flags that can be set too.
|
||||||
|
// many of these can be set by the .INF file found in pics.dtf, so
|
||||||
|
// setting any of the ACKENG properties here would override the .INF
|
||||||
|
// settings.
|
||||||
|
ae->xPlayer = 32 *GRID_SIZE+(GRID_SIZE/2); // x = middle of grid 32
|
||||||
|
ae->yPlayer = 32 *GRID_SIZE+(GRID_SIZE/2); // y = middle of grid 32
|
||||||
|
ae->PlayerAngle = 0;
|
||||||
|
|
||||||
|
ae->LightFlag = SHADING_OFF;
|
||||||
|
ae->DoorSpeed = 3;
|
||||||
|
|
||||||
|
// Set palette for shading if needed
|
||||||
|
if (ae->LightFlag) {
|
||||||
|
AckSetupPalRanges(ae, ranges);
|
||||||
|
}
|
||||||
|
|
||||||
printf("Finished initializing\n");
|
printf("Finished initializing\n");
|
||||||
|
|
||||||
// the main ack3d rendering functions all assume that the various fields
|
// the main ack3d rendering functions all assume that the various fields
|
||||||
|
@ -212,10 +271,32 @@ int main(int argc, char *argv[]) {
|
||||||
|
|
||||||
AckSetupKeyboard();
|
AckSetupKeyboard();
|
||||||
AckSetVGAmode();
|
AckSetVGAmode();
|
||||||
|
|
||||||
|
if (palette) {
|
||||||
|
// we loaded an explicitly specified palette from the resource file,
|
||||||
|
// so we'll set that one
|
||||||
|
AckSetPalette(palette);
|
||||||
|
} else {
|
||||||
|
// default to whatever the palette was from the last loaded bitmap
|
||||||
AckSetPalette(colordat);
|
AckSetPalette(colordat);
|
||||||
|
}
|
||||||
|
|
||||||
|
// draw the full screen/ui frame. ACK-3D won't overwrite this because
|
||||||
|
// our WinStart/WinEnd was set to only draw to the viewport box that our
|
||||||
|
// screen/ui frame bitmap should have (so we only need to render this
|
||||||
|
// bitmap once)
|
||||||
|
if (uiFrame) {
|
||||||
|
memcpy((void*)0xA0000, uiFrame+4, 64000);
|
||||||
|
}
|
||||||
|
|
||||||
GameLoop();
|
GameLoop();
|
||||||
|
|
||||||
|
// anything allocated with AckMalloc can only be free'd with AckFree!
|
||||||
|
if (uiFrame)
|
||||||
|
AckFree(uiFrame);
|
||||||
|
if (palette)
|
||||||
|
AckFree(palette);
|
||||||
|
|
||||||
AckWrapUp(ae);
|
AckWrapUp(ae);
|
||||||
AckSetTextMode();
|
AckSetTextMode();
|
||||||
|
|
||||||
|
|
|
@ -7,7 +7,7 @@ acklib_lib = ..\ack_lib\acklib.lib
|
||||||
|
|
||||||
object_files = &
|
object_files = &
|
||||||
example.obj &
|
example.obj &
|
||||||
ackinfo.obj
|
assets.obj
|
||||||
|
|
||||||
cc_flags_debug = /d2 /zp1 /4r /fp3 /j
|
cc_flags_debug = /d2 /zp1 /4r /fp3 /j
|
||||||
cc_flags_release = /d1+ /zp1 /4r /fp3 /onetx /j
|
cc_flags_release = /d1+ /zp1 /4r /fp3 /onetx /j
|
||||||
|
|
Loading…
Reference in a new issue