topical media & game development
lib-game-darkgdk-samples-Dark-Dungeon-Demo.cpp / cpp
// Dark GDK - The Game Creators - www.thegamecreators.com
// include Dark GDK header file
include <DarkGDK.h>
typedef struct tPlayer
{
} tPlayer;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
typedef struct tBaddie
{
int type; // type of baddie, 0 = monster
int mode; // 0 = idle, 1 = seeking, 2 = hit, 99 = dead
int obj; // which object number the baddie occupies
int life; // how much damage left before perishing
bool hit; // has been hit - do anim
int fallAmount; // how many points of damage before falling over
int hitCount; // count of hits taken, when it reaches fallAmount the baddie will keel over
bool attack;
bool firing; // is this baddie currently firing?
} tBaddie;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
typedef struct tDoor
{
int type;
int distObj;
int leftObj;
int rightObj;
float leftStartX;
float rightStartX;
float leftCurrentX;
float rightCurrentX;
} tDoor;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
typedef struct tVis
{
int start;
int end;
int startObj;
int endObj;
} tVis;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
typedef struct tFire
{
bool on;
int baddie; // the baddie who is firing this
float angleY;
int life; // when reaches zero the fireball will perish
} tFire;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//using namespace std;
//#define SHADERS 1 // use shaders
define MAXBADDIES 40 // max number of baddies
define MAXCRUMBS 20 // max amount of crumbs
define MAXVIS 8 // max vis areas
define MAXFIREBALLS 10 // max fire balls
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Function declarations
void loadMedia ();
void setup ();
void game ();
void updatePlayer ();
void updateBaddies ();
int turnToFace ( int source, int target );
float getDistance ( float x1 , float y1 , float z1 , float x2 , float y2 , float z2);
void makeLevel ();
void updateDoors ();
void showFPS ();
void showVis ();
void updateVis ();
void setupVis ();
void updateFire ();
void playerHurt ();
void die ();
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// GLOBAL GAME VARIABLES
char* czLevel[55]; // LEVEL DATA
int crumbs[MAXCRUMBS][3 + MAXBADDIES]; // crumbs for the player to drop , 0=x , 1=z , 2=crumb number , 3+ is to flag if each baddie has taken the crumb
float PLAYERSPEED = 4.5f;
float BADDIESPEED = 4.0f;
int crumbCount = 1;
int currentCrumb = 0;
float gunWaggle = 0;
float gunWaggle2 = 0;
int playerBullet = 0;
bool doorSound = false;
int doorCount = 0;
int baddieCount = 0;
int visCount = 0;
int scorch = 0;
int currentVis = 0;
int currentFire = 0;
int health = 100;
bool title = true;
int isDying = 0;
//int timer = 0;
int scorchAlpha[10];
char czFPS[10];
char czText[256];
tBaddie baddie[MAXBADDIES];
tDoor door[20];
tVis vis[MAXVIS];
tFire fire[MAXFIREBALLS];
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// main entry point for program
void DarkGDK ( void )
{
dbSetDir ( "media" );
dbSetDisplayMode ( 800 , 600 , 32 );
//dbSetWindowOff ( );
//dbMaximiseWindow ( );
dbBackdropOff ( 0 );
dbSyncOn ( );
dbSyncRate ( 60 );
dbLoadImage ( "media\\loading.jpg" , 1 , 1 );
dbPasteImage ( 1 , 0 , 0 , 0 );
dbDeleteImage ( 1 );
dbSync ( );
dbSync ( );
dbHideMouse ( );
loadMedia();
setup();
while ( LoopGDK ( ) )
{
if ( dbEscapeKey ( ) )
return;
game();
}
}
void game()
{
if ( title == true )
{
if ( dbMouseClick() == 0 )
{
dbPasteImage ( 17 , 0 , 0 , 1 );
}
else
{
title = false;
dbDeleteImage ( 17 );
//dbStopMusic ( 1 );
//dbDeleteMusic ( 1 );
//dbLoopMusic ( 2 );
}
}
else
{
//dead?
if ( health > 0 )
{
updatePlayer ( );
updateBaddies ( );
}
else
{
die( );
}
updateDoors ( );
showFPS ( );
updateFire ( );
updateVis ( );
}
dbSync ( );
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void loadMedia()
{
int iLoop;
dbLoadImage ("media\\floor3.jpg" , 1 , 0 );
dbLoadImage ("media\\berzeka.bmp" , 2 );
dbLoadImage ("media\\shadow.png" , 3 , 0 );
dbLoadImage ("media\\wall1.jpg" , 4 , 0 );
dbLoadImage ("media\\wall11c.jpg" , 5 , 0 );
dbLoadImage ("media\\wall5c.jpg" , 6 , 0 );
dbLoadImage ("media\\shadow.jpg" , 7 , 0 );
dbLoadImage ("media\\wall1 bump.jpg" , 8 , 0 );
dbLoadImage ("media\\wall11c bump.jpg" , 9 , 0 );
dbLoadImage ("media\\wall5c bump.jpg" , 10 , 0 );
dbLoadImage ( "media\\gunfire1.png" , 11 , 0 );
dbLoadImage ("media\\crosshair.png" , 12 , 1 );
dbLoadImage ("media\\blood.png" , 13 , 1 ); // blood on the floor
dbLoadImage ("media\\hit.png" , 14 , 1); // blood as a shot hits home
dbLoadImage ("media\\fire.png" , 15 , 1); // fireball from the running monsters
dbLoadImage ("media\\laser.png" , 16 , 1); // laserball from the troopers
dbLoadImage ("media\\title.jpg" , 17 , 1); // laserball from the troopers
// gun
dbLoadObject ("media\\Atomiser.X", 10 );
dbRotateObject ( 10 ,-90 , 0 , 0 );
dbSetObjectAmbient ( 10 , 0 );
dbSetObjectAmbience ( 10 , 0x00000000 );
dbFixObjectPivot ( 10 );
dbDisableObjectZDepth ( 10 );
dbSetObjectCollisionOff ( 10 );
// gunfire
dbMakeObjectBox ( 11, 4 , 4, 0 );
dbTextureObject ( 11 , 11 );
dbSetObjectLight ( 11 , 0 );
dbSetObjectEmissive ( 11 , 0x00646464 );
dbSetObjectAmbience ( 11 , 0x00FFFFFF );
dbFadeObject ( 11, 8000 );
dbSetObjectTransparency ( 11 , 1 );
dbHideObject ( 11 );
dbSetObjectCollisionOff ( 11 );
//hit as the bullet hits a wall / object
for ( scorch = 0 ; scorch < 10 ; scorch++ )
{
dbMakeObjectPlane ( 12 + scorch , 20 , 20 );
dbTextureObject ( 12 + scorch , 14 );
dbSetObjectCollisionOff ( 12 + scorch );
dbSetObjectTransparency ( 12 + scorch , 1 );
dbFadeObject ( 12 + scorch , 400 );
scorchAlpha[ scorch ] = 0;
dbSetAlphaMappingOn ( 12 + scorch , scorchAlpha[ scorch ]);
}
scorch = 0;
dbLoadSound ( "media\\gun1.wav" , 2 , 0 );
dbLoadSound ( "media\\shoop.wav" , 3 , 0 );
dbLoadSound ( "media\\shoop.wav" , 4 , 0 );
dbSetSoundSpeed ( 2 , 88000 );
dbLoadSound ( "media\\roar.wav" , 5 , 0 );
dbLoadSound ( "media\\die.wav" , 6 , 0 );
dbLoadSound ( "media\\laser.wav" , 7 , 0 );
//dbLoadMusic ( "misty.mp3" , 1 );
//dbLoadMusic ( "misty.mp3" , 2 );
for ( iLoop = 0 ; iLoop < MAXCRUMBS ; iLoop++ )
{
dbMakeObjectCube ( iLoop + 5000 , 5 );
dbPositionObject ( iLoop + 5000 , -99999, -99999 , -99999 );
dbSetObjectCollisionOff ( iLoop + 5000 );
crumbs[iLoop][0] = - 99999;
crumbs[iLoop][1] = - 99999;
crumbs[iLoop][2] = 0;
dbHideObject ( iLoop + 5000 );
}
for ( iLoop = 0 ; iLoop < MAXFIREBALLS ; iLoop++ )
{
dbMakeObjectPlane ( iLoop + 10000 , 10 , 10 );
dbSetObjectCollisionOff ( iLoop + 10000 );
dbSetObjectCollisionOff ( iLoop + 10000 );
dbTextureObject ( iLoop + 10000 , 16 );
dbFadeObject ( iLoop + 10000 , 800 );
dbSetObjectTransparency ( iLoop + 10000 , 1 );
dbSetObjectLight ( iLoop + 10000 , 0 );
fire[iLoop].baddie = 0;
fire[iLoop].on = false;
fire[iLoop].angleY = 0.0f;
}
//dbPlayMusic ( 1 );
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void setup()
{
makeLevel ( );
dbHideLight ( 0 );
dbSetAmbientLight ( 10 );
dbSetPointLight ( 0 , 0 , 0 ,0 );
dbColorLight ( 0 , 0x00FFFF00 );
dbSetLightRange ( 0 , 300 );
dbPositionCamera ( 0 , 200.0f , 40.0f , 100.0f );
dbAutomaticCameraCollision ( 0 , 10 , 0 );
dbSetCameraRange ( 0 , 1 , 2000 );
setupVis();
//showVis();
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
float OldCamAngleY;
float OldCamAngleX;
float CameraAngleY;
float CameraAngleX;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void updatePlayer()
{
int oldX = ( ( ( int ) ( dbCameraPositionX ( 0 ) - 50 ) / 100 ) + 1 );
int oldZ = ( ( ( int ) ( dbCameraPositionZ ( 0 ) - 50 ) / 100 ) + 1 );
int newX;
int newZ;
int iStrike; // which baddie has been hit
int iOldBaddieRotY; // used so we can face the baddie to the camera, blast him away and rotate back
int iLoop;
int scorchLoop = 0;
//dbControlCameraUsingArrowKeys ( 0 , 1 , 1 );
dbPositionMouse ( dbScreenWidth()/2 , dbScreenHeight()/2 );
if ( dbUpKey() || dbKeyState( 17 ) == 1 )
{
dbMoveCamera ( 0 , PLAYERSPEED );
gunWaggle += 0.5f;
gunWaggle2 += 0.25f;
}
if ( dbDownKey() || dbKeyState( 31 ) == 1 )
{
dbMoveCamera ( 0 , -PLAYERSPEED );
gunWaggle += 0.5f;
gunWaggle2 += 0.25f;
}
if ( dbLeftKey() || dbKeyState( 30 ) == 1 )
{
dbYRotateCamera ( 0 , dbCameraAngleY( 0 ) -90 );
dbMoveCamera ( 0 , PLAYERSPEED );
dbYRotateCamera ( 0 , dbCameraAngleY( 0 ) +90 );
}
if ( dbRightKey() || dbKeyState( 32 ) == 1 )
{
dbYRotateCamera ( 0 , dbCameraAngleY( 0 ) + 90 );
dbMoveCamera ( 0 , PLAYERSPEED );
dbYRotateCamera ( 0 , dbCameraAngleY( 0 ) -90 );
}
float cx = dbCameraPositionX ( 0 );
float cy = dbCameraPositionY ( 0 ) -40;
float cz = dbCameraPositionZ ( 0 );
float OldCamAngleY = dbCameraAngleY ( 0 );
float OldCamAngleX = dbCameraAngleX ( 0 );
CameraAngleY = dbWrapValue ( ( dbCameraAngleY ( 0 ) + dbMouseMoveX ( ) * 0.4f ) );
CameraAngleX = dbWrapValue ( ( dbCameraAngleX ( 0 ) + dbMouseMoveY ( ) * 0.4f ) );
if ( CameraAngleX > 80 && CameraAngleX <180 ) CameraAngleX = 80;
if ( CameraAngleX < 270 && CameraAngleX > 180 ) CameraAngleX = 270;
dbYRotateCamera ( 0 , dbCurveAngle ( CameraAngleY , OldCamAngleY , 6 ) );
dbXRotateCamera ( 0 , dbCurveAngle ( CameraAngleX , OldCamAngleX , 6 ) );
dbPositionCamera ( 0 , dbCameraPositionX ( 0 ) , 40 , dbCameraPositionZ ( 0 ) );
dbSetPointLight ( 0 , dbCameraPositionX ( 0 ) , 80 , dbCameraPositionZ ( 0 ) );
//GUN
dbSetObjectToCameraOrientation ( 10 );
dbSetObjectToCameraOrientation ( 11 );
dbPositionObject ( 10 , dbCameraPositionX ( 0 ) , dbCameraPositionY ( 0 ) , dbCameraPositionZ( 0 ) );
dbPositionObject ( 11 , dbCameraPositionX ( 0 ) , dbCameraPositionY ( 0 ) , dbCameraPositionZ( 0 ) );
dbMoveObjectRight ( 10 , 15 + sin ( gunWaggle2 / 2.0f ) / 2.0f );
dbMoveObject ( 10 , 15.0f );
dbMoveObjectDown ( 10 , 15.0f + cos ( gunWaggle / 2.0f ) / 2.0f );
dbMoveObjectRight ( 11 , 2.5f + sin ( gunWaggle2 / 2.0f ) / 8.0f );
dbMoveObject ( 11 , 8 );
dbMoveObjectDown ( 11 , 2.0f + cos ( gunWaggle / 2.0f ) / 8.0f );
gunWaggle += 0.25f;
// draw cross hair
dbPasteImage ( 12 , ( dbScreenWidth( ) / 2 ) - 16 , ( dbScreenHeight( ) / 2 ) - 16 , 1 );
for ( scorchLoop = 0 ; scorchLoop < 10 ; scorchLoop++ )
{
dbSetAlphaMappingOn ( 12 + scorchLoop , scorchAlpha[ scorchLoop ]);
if ( scorchAlpha[ scorchLoop ] > 0.0f )
{
scorchAlpha[ scorchLoop ] -= 2;
if ( scorchLoop % 2 )
{
dbRollObjectLeft ( 12 + scorchLoop, 2 );
}
else
{
dbRollObjectRight ( 12 + scorchLoop, 2 );
}
dbMoveObjectDown ( 12 + scorchLoop , 0.4f );
}
}
if ( dbMouseClick() == 1 )
{
gunWaggle2 += 1.0f;
if ( dbSoundPlaying ( 2 ) == 0 )
{
dbLoopSound ( 2 , 0 , 10000 , 0 );
}
//iShow = rand () % 2;
if ( playerBullet++ == 6 )
{
playerBullet = 0;
dbShowObject ( 11 );
dbRollObjectLeft ( 11 , (float)(rand() % 360) );
dbShowLight ( 0 );
dbPositionLight ( 0 , dbObjectPositionX ( 11 ) , dbObjectPositionY ( 11 ), dbObjectPositionZ ( 11 ) );
// Have we shot a baddie?
iStrike = dbPickObject ( dbScreenWidth( ) / 2 , dbScreenHeight( ) / 2 , 100 , 5000 );
if ( iStrike >= 100 && iStrike < 200 )
{
dbPositionObject ( 12 + scorch , dbCameraPositionX ( 0 ) + 0 , dbCameraPositionY ( 0 ) + 0 , dbCameraPositionZ ( 0 ) + 0 );
dbSetObjectToCameraOrientation ( 12 + scorch );
dbMoveObject ( 12 + scorch , getDistance ( dbCameraPositionX ( 0 ) , 0 , dbCameraPositionZ ( 0 ) , dbObjectPositionX ( iStrike ) , 0 , dbObjectPositionZ ( iStrike ) ) -30 );
dbShowObject ( 12 + scorch );
scorchAlpha[ scorch ] = 100;
scorch++;
if (scorch == 9 ) scorch = 0;
}
if ( iStrike >= 100 && iStrike < 200 )
{
iOldBaddieRotY = (int) dbObjectAngleY ( iStrike );
dbSetObjectToCameraOrientation ( iStrike );
dbXRotateObject ( iStrike , 0 );
dbYRotateObject ( iStrike , (float)iOldBaddieRotY );
if ( baddie [ iStrike - 100 ].mode < 2 ) baddie [ iStrike - 100 ].mode = 2;
if ( baddie[ iStrike - 100 ].hitCount < 5 || baddie[ iStrike - 100 ].hitCount == 7 )
{
baddie [ iStrike - 100 ].hit = true;
dbStopObject ( iStrike );
baddie [ iStrike - 100 ].hitCount++;
if ( baddie [ iStrike - 100 ].hitCount == 5 )
{
baddie [ iStrike - 100 ].life--;
if ( baddie [ iStrike - 100 ].life <= 0 )
{
dbPlayObject ( baddie [ iStrike - 100 ].obj , 370*160 , 400*160 );
dbTextureObject ( baddie [ iStrike - 100 ].obj + 100 , 13 );
dbSetObjectCollisionOff ( baddie [ iStrike - 100 ].obj );
dbScaleObject ( baddie [ iStrike - 100 ].obj + 100 , 200 , 100 , 200 );
//dbMoveObjectDown ( baddie [ iStrike - 100 ].obj , 10 );
}
}
if ( baddie[ iStrike - 100 ].hitCount > 7 ) baddie[ iStrike - 100 ].hitCount = 0;
}
}
}
else
{
dbHideObject ( 11 );
dbHideLight ( 0 );
}
}
else
{
playerBullet = 6;
dbStopSound ( 2 );
dbHideObject ( 11 );
dbHideLight ( 0 );
}
newX = ( ( ( int ) ( dbCameraPositionX ( 0 ) - 50 ) / 100 ) + 1 );
newZ = ( ( ( int ) ( dbCameraPositionZ ( 0 ) - 50 ) / 100 ) + 1 );
// drop a crumb?
if ( oldX != newX || oldZ != newZ )
{
if ( czLevel[newZ][newX] == '#' || czLevel[newZ][newX] == '+' || czLevel[newZ][newX] == 's' || czLevel[newZ][newX] == 'n' ) // || ( ++timer == 8 && czLevel[newZ][newX] != 'o') ) // || czLevel[newZ][newX] == '.' )
{
//timer = 0;
currentCrumb++;
if (currentCrumb > MAXCRUMBS-1 ) currentCrumb = 0; // reset and kill off the first crumb
crumbs[currentCrumb][0] = (( ( (int) ( dbCameraPositionX ( 0 ) - 50 ) / 100 ) + 1) * 100 ) ;
crumbs[currentCrumb][1] = (( ( (int) ( dbCameraPositionZ ( 0 ) - 50 ) / 100 ) + 1) * 100 ) ;
crumbs[currentCrumb][2] = crumbCount++;
dbPositionObject ( 5000+currentCrumb , (float)crumbs[currentCrumb][0] , 0 , (float)crumbs[currentCrumb][1] );
dbSetObjectCollisionOff ( 5000+currentCrumb );
// clear the baddies flags since no baddies have hit this crumb yet
for ( iLoop = 3 ; iLoop < baddieCount+2 ; iLoop++)
{
crumbs[currentCrumb][iLoop] = 0;
}
}
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void updateBaddies()
{
int iLoop;
int iLoop2;
int crumbLoop;
int crumbLoop2;
float fX;
float fZ;
int whichWay;
//char czText[256];
char czCol = ' ';
int prevZ; // = (int) ( ( dbObjectPositionZ ( 100 ) - 50 ) / 100.0f ) + 1;
int prevX; // = (int) ( ( dbObjectPositionX ( 100 ) - 50 ) / 100.0f ) + 1;
int curAngle; // = dbWrapValue ( dbObjectAngleY ( 100 ) );
float dist;
float dist2;
float dist3;
int crumb; // If this stays set to 0 then the baddie will turn to the camera otherwise turn to object crumb+5000
bool hit;
int odd; //odd or even baddie number to decide direction round things
int colX;
int colZ;
int oldColX;
int oldColZ;
//int colLoop;
//int plusZ;
//int plusX;
bool hasCol;
for ( iLoop = 0 ; iLoop < baddieCount ; iLoop++ )
{
if ( baddie [ iLoop ].life > 0 )
{
switch ( baddie [ iLoop ].mode )
{
case 0:
{
dbLoopObject ( baddie [ iLoop ].obj , 0 , 80*160 );
baddie [ iLoop ].mode = 1;
} break;
case 1:
{
dist = getDistance ( dbObjectPositionX ( baddie [ iLoop ].obj ) , 0 , dbObjectPositionZ ( baddie [ iLoop ].obj ) , dbCameraPositionX ( 0 ) , 0 , dbCameraPositionZ ( 0 ) );
if (dist < 800 ) baddie [ iLoop ].mode = 2;
} break;
case 2:
{
dbLoopObject ( baddie [ iLoop ].obj , 91200 , 100800 );
dbPlaySound ( 5 , 0 );
baddie [ iLoop ].mode = 3;
} break;
case 3:
{
prevZ = (int) ( ( dbObjectPositionZ ( baddie [ iLoop ].obj ) - 50 ) / 100.0f ) + 1;
prevX = (int) ( ( dbObjectPositionX ( baddie [ iLoop ].obj ) - 50 ) / 100.0f ) + 1;
curAngle = (int)dbWrapValue ( dbObjectAngleY ( baddie [ iLoop ].obj ) );
crumb = 0; // If this stays set to 0 then the baddie will turn to the camera otherwise turn to object crumb+5000
hit = false;
if ( baddie [ iLoop ].hit == false )
{
if ( dbObjectPlaying ( baddie [ iLoop ].obj ) == 0 ) dbLoopObject ( baddie[ iLoop ].obj , 91200 , 100800 );
fX = dbCameraPositionX ( 0 ) - dbObjectPositionX ( baddie [ iLoop ].obj );
fZ = dbCameraPositionZ ( 0 ) - dbObjectPositionZ ( baddie [ iLoop ].obj );
dist = getDistance ( dbObjectPositionX ( baddie [ iLoop ].obj ) , 0 , dbObjectPositionZ ( baddie [ iLoop ].obj ) , dbCameraPositionX ( 0 ) , 0 , dbCameraPositionZ ( 0 ) );
for ( iLoop2 = 0 ; iLoop2 < baddieCount ; iLoop2++ )
{
if ( iLoop2 != iLoop )
{
if ( baddie[ iLoop2 ].life > 0 )
{
dist2 = getDistance ( dbObjectPositionX ( baddie [ iLoop ].obj ) , 0 , dbObjectPositionZ ( baddie [ iLoop ].obj ) , dbObjectPositionX ( baddie [ iLoop2 ].obj ) , 0 , dbObjectPositionZ ( baddie [ iLoop2 ].obj ) );
dbMoveObject ( baddie [ iLoop ].obj , BADDIESPEED );
dist3 = getDistance ( dbObjectPositionX ( baddie [ iLoop ].obj ) , 0 , dbObjectPositionZ ( baddie [ iLoop ].obj ) , dbObjectPositionX ( baddie [ iLoop2 ].obj ) , 0 , dbObjectPositionZ ( baddie [ iLoop2 ].obj ) );
if ( dist3 < dist2 && dist3 < 40 ) dist = 0;
dbMoveObject ( baddie [ iLoop ].obj , -BADDIESPEED );
}
}
}
if ( ( baddie [ iLoop ].type == 0 && dist > 80 ) || ( baddie [ iLoop ].type == 1 && dist > 300 ) )
{
oldColZ = (int) ( ( dbObjectPositionZ ( baddie [ iLoop ].obj ) - 50 ) / 100.0f ) + 1;
oldColX = (int) ( ( dbObjectPositionX ( baddie [ iLoop ].obj ) - 50 ) / 100.0f ) + 1;
dbMoveObject ( baddie [ iLoop ].obj , BADDIESPEED );
if ( baddie [ iLoop ].attack == true && dbObjectFrame ( baddie [ iLoop ].obj ) > 195*160 )
{
baddie [ iLoop ].attack = false;
baddie [ iLoop ].mode = 2;
}
}
else // SLASH ATTACK
{
if ( baddie [ iLoop].type == 0 && ( baddie [ iLoop ].attack == false || dbObjectFrame ( baddie [ iLoop ].obj ) > 201*160 ) )
{
//if ( getDistance ( dbObjectPositionX ( baddie [ iLoop ].obj ) , 0 , dbObjectPositionZ ( baddie [ iLoop ].obj ) , dbCameraPositionX ( 0 ) , 0 , dbCameraPositionZ ( 0 ) < 10 ) )
dbLoopObject ( baddie [ iLoop ].obj , 150*160 , 200*160 );
{
if ( baddie [ iLoop ].attack == false )
{
playerHurt();
}
baddie [ iLoop ].attack = true;
}
}
}
// Check for collision
czCol = czLevel[ (int) ( ( dbObjectPositionZ ( baddie [ iLoop ].obj ) - 50 ) / 100.0f ) + 1 ][ (int) ( ( dbObjectPositionX ( baddie [ iLoop ].obj ) - 50 ) / 100.0f ) + 1 ];
if ( czCol == 'o' )
{
dbMoveObject ( baddie [ iLoop ].obj , -BADDIESPEED );
odd = ( iLoop % 2 );
( odd == 0 ) ? dbMoveObjectRight ( baddie [ iLoop ].obj , 1.5f ) : dbMoveObjectLeft ( baddie [ iLoop ].obj , 1.5f );
}
else if ( czCol == '1' || czCol == '2' )
{
colZ = (int) ( ( dbObjectPositionZ ( baddie [ iLoop ].obj ) - 50 ) / 100.0f ) + 1;
colX = (int) ( ( dbObjectPositionX ( baddie [ iLoop ].obj ) - 50 ) / 100.0f ) + 1;
// moved west
if ( oldColX > colX ) dbYRotateObject ( baddie [ iLoop ].obj , 270 );
// moved east
if ( oldColX < colX ) dbYRotateObject ( baddie [ iLoop ].obj , 90 );
// moved north
if ( oldColZ < colZ ) dbYRotateObject ( baddie [ iLoop ].obj , 0 );
// moved south
if ( oldColZ > colZ ) dbYRotateObject ( baddie [ iLoop ].obj , 180 );
// moved north east
if ( oldColZ < colZ && oldColX < colX ) dbYRotateObject ( baddie [ iLoop ].obj , 45 );
// moved north west
if ( oldColZ < colZ && oldColX > colX ) dbYRotateObject ( baddie [ iLoop ].obj , 315 );
// moved south west
if ( oldColZ > colZ && oldColX > colX ) dbYRotateObject ( baddie [ iLoop ].obj , 225 );
// moved south est
if ( oldColZ > colZ && oldColX < colX ) dbYRotateObject ( baddie [ iLoop ].obj , 135 );
while ( czCol == '1' || czCol == '2' )
{
dbMoveObject ( baddie [ iLoop ].obj ,-0.5f );
czCol = czLevel[ (int) ( ( dbObjectPositionZ ( baddie [ iLoop ].obj ) - 50 ) / 100.0f ) + 1 ][ (int) ( ( dbObjectPositionX ( baddie [ iLoop ].obj ) - 50 ) / 100.0f ) + 1 ];
}
//odd = ( iLoop % 2 );
//( odd == 0 ) ? dbMoveObjectRight ( baddie [ iLoop ].obj , 1.5f ) : dbMoveObjectLeft ( baddie [ iLoop ].obj , 1.5f );
dbYRotateObject ( baddie [ iLoop ].obj , (float)curAngle );
}
for ( crumbLoop = 0 ; crumbLoop < MAXCRUMBS ; crumbLoop++ )
{
if ( crumbs[crumbLoop][ 3 + iLoop ] == 0 && getDistance ( dbObjectPositionX ( baddie [ iLoop ].obj ) , 0 , dbObjectPositionZ ( baddie [ iLoop ].obj ) , (float)crumbs[crumbLoop][0] , 0 , (float)crumbs[crumbLoop][1] ) < dist )
{
dist = getDistance ( dbCameraPositionX ( 0 ) , 0 , dbCameraPositionZ ( 0 ) , (float)crumbs[crumbLoop][0] , 0 , (float)crumbs[crumbLoop][1] );
if ( getDistance ( dbObjectPositionX ( baddie [ iLoop ].obj ) , 0 , dbObjectPositionZ ( baddie [ iLoop ].obj ) , (float)crumbs[crumbLoop][0] , 0 , (float)crumbs[crumbLoop][1] ) < 30 )
{
crumbs[crumbLoop][ 3 + iLoop ] = 1;
}
else
{
if ( getDistance ( dbObjectPositionX ( baddie [ iLoop ].obj ) , 0 , dbObjectPositionZ ( baddie [ iLoop ].obj ) , (float)crumbs[crumbLoop][0] , 0 , (float)crumbs[crumbLoop][1] ) < getDistance ( dbObjectPositionX ( baddie [ iLoop ].obj ) , 0 , dbObjectPositionZ ( baddie [ iLoop ].obj ) , (float)crumbs[crumb][0] , 0 , (float)crumbs[crumb][1] ) || crumb == 0 )
{
crumb = crumbLoop; // this crumb is closer to the baddie than the player
// lets get rid of all the crumbs further away from the player than this one
for ( crumbLoop2 = 0 ; crumbLoop2 < MAXCRUMBS ; crumbLoop2++ )
{
//if ( getDistance ( dbCameraPositionX ( 0 ) , 0 , dbCameraPositionZ ( 0 ) , crumbs[crumbLoop2][0] , 0 , crumbs[crumbLoop2][1] ) > dist )
if ( crumbs[crumbLoop2][2] < crumbs[crumb][2] )
{
//crumbs[crumbLoop2][0] = - 99999;
//crumbs[crumbLoop2][1] = - 99999;
//crumbs[crumbLoop2][2] = 0;
//dbPositionObject ( crumbLoop2 + 5000 , -99999 , -99999 , -99999 );
}
}
}
}
}
}
( crumb ) ? whichWay = turnToFace ( baddie [ iLoop ].obj , crumb+5000 ) : whichWay = turnToFace ( baddie [ iLoop ].obj , 0 );
if (whichWay == -1 ) // turn left
{
if ( hasCol = true ) dbMoveObjectLeft ( baddie [ iLoop ].obj , 1.5f );
dbYRotateObject ( baddie [ iLoop ].obj , dbObjectAngleY ( baddie [ iLoop ].obj ) - 4.0f );
}
else if (whichWay == 1 ) // turn right
{
if ( hasCol = true ) dbMoveObjectRight ( baddie [ iLoop ].obj , 1.5f );
dbYRotateObject ( baddie [ iLoop ].obj , dbObjectAngleY ( baddie [ iLoop ].obj ) + 4.0f );
}
dbPositionObject ( baddie [ iLoop ].obj + 100 , dbObjectPositionX ( baddie [ iLoop ].obj ) , .1f , dbObjectPositionZ ( baddie [ iLoop ].obj ) );
// Firing at the player if we are facing him
//if ( baddie [ iLoop ].attack == false && whichWay == 0 )
if ( baddie [ iLoop ].attack == false )
{
if ( ( ( rand() % 60 ) == 10 ) && baddie [ iLoop ].firing == false )
{
dist = getDistance ( dbObjectPositionX ( baddie [ iLoop ].obj ) , 0 , dbObjectPositionZ ( baddie [ iLoop ].obj ) , dbCameraPositionX ( 0 ) , 0 , dbCameraPositionZ ( 0 ) );
if ( ( baddie [ iLoop ].type == 0 && dist > 100 && dist < 700 ) || ( baddie [ iLoop ].type == 1) )
{
if ( baddie [ iLoop].type == 1 && baddie [ iLoop ].attack == false )
{
dbPlayObject ( baddie [ iLoop ].obj , 150*160 , 200*160 );
//baddie [ iLoop ].attack = true;
}
baddie [ iLoop ].firing = true;
if ( fire[currentFire].on == false )
{
fire[currentFire].on = true;
fire[currentFire].life = 200;
fire[currentFire].baddie = iLoop;
dbPlaySound ( 7 , 0 );
dbPositionObject ( currentFire + 10000 , dbObjectPositionX ( baddie [ iLoop ].obj ) , 42.5 , dbObjectPositionZ ( baddie [ iLoop ].obj ) );
dbYRotateObject ( currentFire + 10000 , dbObjectAngleY ( baddie [ iLoop ].obj ) );
fire[currentFire].angleY = dbObjectAngleY ( currentFire + 10000 );
currentFire++;
if ( currentFire == MAXFIREBALLS ) currentFire = 0;
}
}
}
}
}
else
{
if ( baddie [ iLoop ].hitCount == 5 )
{
dbPlayObject ( baddie [ iLoop ].obj , 370*160 , 390*160 );
dbPlaySound ( 6 , 0 );
baddie [ iLoop ].hitCount++;
}
if ( baddie [ iLoop ].hitCount == 6 && dbObjectPlaying ( baddie[ iLoop ].obj ) == 0 )
{
dbPlayObject ( baddie [ iLoop ].obj , 390*160 , 500*160 );
baddie [ iLoop ].hitCount++;
}
if ( dbObjectPlaying ( baddie[ iLoop ].obj ) == 0 )
{
baddie[ iLoop ].hit = false;
dbPlayObject ( baddie[ iLoop ].obj , 230*160 , 235*160 );
if ( baddie [ iLoop ].hitCount == 7 )
{
baddie [ iLoop ].hitCount = 0;
dbPlaySound ( 5 , 0 );
dbLoopObject ( baddie[ iLoop ].obj , 91200 , 100800 );
}
}
}
}
}
}
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int turnToFace( int source, int target )
{
// source: object that we want to turn too
// target: camera or object to point too ( 0 = camera )
// Returned values:
// 0 : no turn needed
// -1 : turn left
// 1 : turn right
float fOrignalAngleY = dbObjectAngleY ( source ); // store the original yaw of the target
int s;
int t;
int sum;
// turn to face the target pivot
if ( target == 0 ) // if 0 then it is the camera we are pointing too
{
dbPointObject ( source , dbCameraPositionX ( 0 ) , 0 , dbCameraPositionZ ( 0 ) );
}
else
{
dbPointObject ( source , dbObjectPositionX ( target ) , 0 , dbObjectPositionZ ( target ) );
}
// start angle and end angle
s = (int) dbWrapValue( fOrignalAngleY );
t = (int) dbWrapValue( dbObjectAngleY ( source ) );
// Put original Y rotation back
dbYRotateObject ( source , fOrignalAngleY );
( s > t ) ? sum = s - t : sum = t - s;
if ( sum <= 4 ) return 0; // If the two angles are close we do not need any rotation !
// the angle goes from 0,180 and 0,-180; now I normalize to 0-360
//if ( s < 0 ) s = 360 + s;
//if ( t < 0 ) t = 360 + t;
// now we found the right direction where to turn, in order to choose the shortest path:
// check if the difference is greather than 180
if ( abs ( s - t ) > 180 )
{
// check if the start angle is greater than the target angle
if ( s > t )
{
return 1; // turn left
}
else
{
return -1; //turn right
}
}
else
{
// check if the start angle is greater than the target angle
if ( s > t )
{
return -1; //turn right
}
else
{
return 1; //turn left
}
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
float getDistance ( float x1 , float y1 , float z1 , float x2 , float y2 , float z2)
{
float dist;
float dx;
float dy;
float dz;
dx = x2 - x1;
dy = y2 - y1;
dz = z2 - z1;
dist = sqrt ( ( dx * dx ) + ( dy * dy ) + ( dz * dz ) );
return dist;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void makeLevel()
{
int objectCount = 300;
int charNum = 0;
int stringNum = 0;
int addFloor = 0;
int lightNum = 1; // can have 6 lights max in the level R, G or B
int shadow = 0;
// Define the level
czLevel[0] = "{121 ";
czLevel[1] = " 1$1 ";
czLevel[2] = " 1.1 ";
czLevel[3] = " 1.1 }";
czLevel[4] = "{1.222222222222222221 ";
czLevel[5] = " 1~........^........1 ";
czLevel[6] = " 1.o...o...o.@...2221 ";
czLevel[7] = " 1..........r...22221 ";
czLevel[8] = " 1.o.b...x.o.@......1 ";
czLevel[9] = " 1.............s....1 ";
czLevel[10] = " 1.o..*o.....22#22221 ";
czLevel[11] = " 1....*.....22.ng...1 ";
czLevel[12] = " 1.....^...22..s....1 ";
czLevel[13] = " 12222222222222#22221}";
czLevel[14] = "{ 122#221 ";
czLevel[15] = " 1 1 ";
czLevel[16] = " 1#222#1 }";
czLevel[17] = "{122222222222#222#221 ";
czLevel[18] = " 1...........n...n..1 ";
czLevel[19] = " 1..o.....x.o.......1 ";
czLevel[20] = " 1..........b.......1 ";
czLevel[21] = " 1..@s..@.....^..^..1 ";
czLevel[22] = " 1222#222222222222221}";
czLevel[23] = "{ 1#221 ";
czLevel[24] = " 1 1 ";
czLevel[25] = " 122#1 }";
czLevel[26] = "{122222#222221 ";
czLevel[27] = " 1.....n.....1 ";
czLevel[28] = " 1...........1 ";
czLevel[29] = " 1..........^1 ";
czLevel[30] = " 1.....xr....1 ";
czLevel[31] = " 1^..........1 ";
czLevel[32] = " 1...........1 ";
czLevel[33] = " 1..s.*s.*s..1 ";
czLevel[34] = " 122
#221 }";
czLevel[35] = "{ 1
#221 ";
czLevel[36] = " 1 1 ";
czLevel[37] = " 122222222#1 }";
czLevel[38] = "{12222222222#22222221 ";
czLevel[39] = " 1..........n...^...1 ";
czLevel[40] = " 1..................1 ";
czLevel[41] = " 1.o.......o......o.1 ";
czLevel[42] = " 1....g.............1 ";
czLevel[43] = " 1........x.........1 ";
czLevel[44] = " 1.o..............o.1 ";
czLevel[45] = " 1........@.......@.1 ";
czLevel[46] = " 1..@..........r.*..1 ";
czLevel[47] = " 1.o....*..o......o.1 ";
czLevel[48] = " 1.....^.......^....1 ";
czLevel[49] = " 12222222222222222221}";
for ( stringNum = 0 ; stringNum < 50 ; stringNum++ )
{
for ( charNum = 0 ; charNum < 22 ; charNum++ )
{
shadow = 0;
switch ( czLevel[ stringNum ][ charNum ] )
{
case '{':
{
vis[visCount].start = stringNum;
vis[visCount].startObj = objectCount;
} break;
case '}':
{
vis[visCount].end = stringNum;
vis[visCount].endObj = objectCount - 1;
visCount++;
} break;
case '.': // empty space
{
addFloor = 1;
} break;
case '+': // empty space
{
addFloor = 1;
} break;
case 's': // south facing door empty space
{
dbLoadObject ( "media\\door_frame1.x" , objectCount );
dbPositionObject ( objectCount , ( float ) charNum * 100 , 50 , ( float ) stringNum * 100 );
dbScaleObject ( objectCount , 180 , 160 , 130 );
dbMoveObject ( objectCount , -10 );
dbFadeObject ( objectCount , 200 );
dbSetObjectCollisionOff ( objectCount );
door[ doorCount ].type = 0; // south
door[ doorCount ].distObj = ( objectCount );
objectCount++;
dbLoadObject ( "media\\door_1a.x" , objectCount );
dbPositionObject ( objectCount , ( float ) charNum * 100 , 50 , ( float ) stringNum * 100 );
dbScaleObject ( objectCount , 100 , 110 , 100 );
dbMoveObject ( objectCount , 5 );
dbSetObjectCollisionOff ( objectCount );
door[ doorCount ].leftObj = ( objectCount );
door[ doorCount ].leftStartX = dbObjectPositionX ( objectCount );
door[ doorCount ].leftCurrentX = dbObjectPositionX ( objectCount );
objectCount++;
dbLoadObject ( "media\\door_1b.x" , objectCount );
dbPositionObject ( objectCount , ( float ) charNum * 100 , 50 , ( float ) stringNum * 100 );
dbScaleObject ( objectCount , 100 , 110 , 100 );
dbMoveObject ( objectCount , 5 );
dbSetObjectCollisionOff ( objectCount );
door[ doorCount ].rightObj = ( objectCount );
door[ doorCount ].rightStartX = dbObjectPositionX ( objectCount );
door[ doorCount ].rightCurrentX = dbObjectPositionX ( objectCount );
objectCount++;
doorCount++;
addFloor = 1;
} break;
case 'n': // north facing door empty space
{
dbLoadObject ( "media\\door_frame1.x" , objectCount );
dbPositionObject ( objectCount , ( float ) charNum * 100 , 50 , ( float ) stringNum * 100 );
dbYRotateObject ( objectCount , 180 );
dbScaleObject ( objectCount , 180 , 160 , 130 );
dbMoveObject ( objectCount , -10 );
dbFadeObject ( objectCount , 200 );
dbSetObjectCollisionOff ( objectCount );
door[ doorCount ].type = 1; // south
door[ doorCount ].distObj = ( objectCount );
objectCount++;
dbLoadObject ( "media\\door_1a.x" , objectCount );
dbPositionObject ( objectCount , ( float ) charNum * 100 , 50 , ( float ) stringNum * 100 );
dbYRotateObject ( objectCount , 180 );
dbScaleObject ( objectCount , 100 , 110 , 100 );
dbMoveObject ( objectCount , 5 );
dbSetObjectCollisionOff ( objectCount );
door[ doorCount ].leftObj = ( objectCount );
door[ doorCount ].leftStartX = dbObjectPositionX ( objectCount );
door[ doorCount ].leftCurrentX = dbObjectPositionX ( objectCount );
objectCount++;
dbLoadObject ( "media\\door_1b.x" , objectCount );
dbPositionObject ( objectCount , ( float ) charNum * 100 , 50 , ( float ) stringNum * 100 );
dbYRotateObject ( objectCount , 180 );
dbScaleObject ( objectCount , 100 , 110 , 100 );
dbMoveObject ( objectCount , 5 );
dbSetObjectCollisionOff ( objectCount );
door[ doorCount ].rightObj = ( objectCount );
door[ doorCount ].rightStartX = dbObjectPositionX ( objectCount );
door[ doorCount ].rightCurrentX = dbObjectPositionX ( objectCount );
objectCount++;
doorCount++;
addFloor = 1;
} break;
case '~': // north facing door empty space
{
dbLoadObject ( "media\\door_frame1.x" , objectCount );
dbPositionObject ( objectCount , ( float ) charNum * 100 , 50 , ( float ) stringNum * 100 );
dbYRotateObject ( objectCount , 180 );
dbScaleObject ( objectCount , 180 , 160 , 130 );
dbMoveObject ( objectCount , -10 );
dbFadeObject ( objectCount , 200 );
dbSetObjectCollisionOff ( objectCount );
door[ doorCount ].type = 1; // south
door[ doorCount ].distObj = ( objectCount );
objectCount++;
dbLoadObject ( "media\\door_1a.x" , objectCount );
dbPositionObject ( objectCount , ( float ) charNum * 100 , 50 , ( float ) stringNum * 100 );
dbYRotateObject ( objectCount , 180 );
dbScaleObject ( objectCount , 100 , 110 , 100 );
dbMoveObject ( objectCount , 5 );
dbSetObjectCollisionOff ( objectCount );
door[ doorCount ].leftObj = ( objectCount );
door[ doorCount ].leftStartX = dbObjectPositionX ( objectCount );
door[ doorCount ].leftCurrentX = dbObjectPositionX ( objectCount );
objectCount++;
dbLoadObject ( "media\\door_1b.x" , objectCount );
dbPositionObject ( objectCount , ( float ) charNum * 100 , 50 , ( float ) stringNum * 100 );
dbYRotateObject ( objectCount , 180 );
dbScaleObject ( objectCount , 100 , 110 , 100 );
dbMoveObject ( objectCount , 5 );
dbSetObjectCollisionOff ( objectCount );
door[ doorCount ].rightObj = ( objectCount );
door[ doorCount ].rightStartX = dbObjectPositionX ( objectCount );
door[ doorCount ].rightCurrentX = dbObjectPositionX ( objectCount );
objectCount++;
doorCount++;
addFloor = 1;
} break;
case '^': // empty space
{
dbLoadObject ( "media\\Energy-Box.X" , objectCount );
dbPositionObject ( objectCount , ( float ) charNum * 100 , 25 , ( float ) stringNum * 100 );
dbScaleObject ( objectCount , 400 , 400 , 400 );
dbSetObjectAmbient ( objectCount , 0 );
dbSetObjectAmbience ( objectCount , 0x00000000 );
dbSetObjectSpecular ( objectCount , 0x00111111 );
objectCount++;
addFloor = 1;
} break;
case '
(C) Æliens
04/09/2009
You may not copy or print any of this material without explicit permission of the author or the publisher.
In case of other copyright issues, contact the author.