topical media & game development

talk show tell print

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 '': // Player start plus empty space { dbPositionCamera ( 0 , ( float ) charNum * 100.0f , 40.0f , ( float ) stringNum * 100.0f ); addFloor = 1; } break; case '@': // Add Monster Baddie start plus empty space { dbLoadObject ("media\\Bezerker.X" , baddieCount + 100 ); //dbMakeObjectCube ( baddieCount + 100 , 50 ); dbTextureObject ( baddieCount + 100 , 2 ); dbRotateObject ( baddieCount + 100 , -90 , 0 , 0 ); dbFixObjectPivot ( baddieCount + 100 ); dbSetObjectSpeed ( baddieCount + 100 , 20000 ); //dbScaleObject ( baddieCount + 100 , 100.0f , 60.0f , 120.0f ); dbPositionObject ( baddieCount + 100 , ( float ) charNum * 100.0f , 0.0f , ( float ) stringNum * 100.0f ); //dbSetObjectCollisionOff ( baddieCount + 100 ); dbSetObjectCollisionToBoxes ( baddieCount + 100 ); //dbAutomaticObjectCollision ( baddieCount + 100 , 10 , 0 ); //dbShowObjectBounds ( baddieCount + 100 , 0 ); baddie[ baddieCount ].obj = baddieCount + 100; baddie[ baddieCount ].life = 3; baddie[ baddieCount ].mode = 0; baddie[ baddieCount ].type = 0; baddie[ baddieCount ].firing = false; dbMakeObjectPlane ( baddieCount + 200 , 40 , 40 ); dbXRotateObject ( baddieCount + 200 , -90 ); dbTextureObject ( baddieCount + 200 , 3 ); dbSetObjectTransparency ( baddieCount + 200 , 1 ); dbPositionObject ( baddieCount + 200 , ( float ) charNum * 100.0f , 0.1f , ( float ) stringNum * 100.0f ); dbSetObjectCollisionOff ( baddieCount + 200 ); baddieCount++; addFloor = 1; } break; case '*': // Add Assault Trooper Baddie start plus empty space { dbLoadObject ("media\\Assault Trooper.X" , baddieCount + 100 ); //dbMakeObjectCube ( baddieCount + 100 , 50 ); //dbTextureObject ( baddieCount + 100 , 2 ); dbRotateObject ( baddieCount + 100 , -90 , 0 , 0 ); dbFixObjectPivot ( baddieCount + 100 ); dbSetObjectSpeed ( baddieCount + 100 , 20000 ); dbScaleObject ( baddieCount + 100 , 90.0f , 90.0f , 90.0f ); dbPositionObject ( baddieCount + 100 , ( float ) charNum * 100.0f , 0.0f , ( float ) stringNum * 100.0f ); //dbSetObjectCollisionOff ( baddieCount + 100 ); dbSetObjectCollisionToBoxes ( baddieCount + 100 ); dbSetObjectAmbient ( baddieCount + 100, 0 ); dbSetObjectAmbience ( baddieCount + 100, 0x00000000 ); dbSetObjectSpecular ( baddieCount + 100, 0x00111111 ); //dbAutomaticObjectCollision ( baddieCount + 100 , 10 , 0 ); //dbShowObjectBounds ( baddieCount + 100 , 0 ); baddie[ baddieCount ].obj = baddieCount + 100; baddie[ baddieCount ].life = 3; baddie[ baddieCount ].mode = 0; baddie[ baddieCount ].type = 1; baddie[ baddieCount ].firing = false; dbMakeObjectPlane ( baddieCount + 200 , 40 , 40 ); dbXRotateObject ( baddieCount + 200 , -90 ); dbTextureObject ( baddieCount + 200 , 3 ); dbSetObjectTransparency ( baddieCount + 200 , 1 ); dbPositionObject ( baddieCount + 200 , ( float ) charNum * 100.0f , 0.1f , ( float ) stringNum * 100.0f ); dbSetObjectCollisionOff ( baddieCount + 200 ); baddieCount++; addFloor = 1; } break; case 'r': // RED light plus empty space { dbMakeLight ( lightNum ); dbSetPointLight ( lightNum , ( float ) charNum * 100 , 100 , ( float ) stringNum * 100 ); dbColorLight ( lightNum , 0x00AA8888 ); lightNum++; addFloor = 1; } break; case 'g': // GREEN light plus empty space { dbMakeLight ( lightNum ); dbSetPointLight ( lightNum , ( float ) charNum * 100 , 100 , ( float ) stringNum * 100 ); dbColorLight ( lightNum , 0x0088AA88 ); lightNum++; addFloor = 1; } break; case 'b': // BLUE light plus empty space { dbMakeLight ( lightNum ); dbSetPointLight ( lightNum , ( float ) charNum * 100 , 100 , ( float ) stringNum * 100 ); dbColorLight ( lightNum , 0x008888AA ); lightNum++; addFloor = 1; } break; case '1': // Wall block { dbMakeObjectBox ( objectCount , 100, 100 , 100 ); dbPositionObject ( objectCount , ( float ) charNum * 100 , 50 , ( float ) stringNum * 100 ); dbTextureObject ( objectCount , 4 ); #ifdef SHADERS dbSetBumpMappingOn ( objectCount , 8 ); #endif dbSetObjectCollisionOn ( objectCount ); dbSetObjectCollisionToBoxes ( objectCount); //dbShowObjectBounds ( objectCount , 0 ); //dbFadeObject ( objectCount , 10 ); //dbScaleObjectTexture ( objectCount , 1 , 2 ); //dbSetBumpMappingOn ( objectCount , 5 ); //dbHideObject ( objectCount ); //dbGhostObjectOn ( objectCount , 0 ); objectCount++; //dbMakeObjectBox ( objectCount , 100, 100 , 100 ); dbLoadObject ( "media\\walltop.x" , objectCount ); dbPositionObject ( objectCount , ( float ) charNum * 100 , 150 , ( float ) stringNum * 100 ); dbTextureObject ( objectCount , 6 ); //dbSetObjectCollisionOff ( objectCount ); //dbScaleObjectTexture ( objectCount , 2 , 2 ); //dbSetBumpMappingOn ( objectCount , 5 ); objectCount++; addFloor = 0; } break; case '2': // Wall block { dbMakeObjectBox ( objectCount , 100, 100 , 100 ); dbPositionObject ( objectCount , ( float ) charNum * 100 , 50 , ( float ) stringNum * 100 ); dbTextureObject ( objectCount , 4 ); #ifdef SHADERS dbSetBumpMappingOn ( objectCount , 8 ); #endif dbSetObjectCollisionOn ( objectCount ); dbSetObjectCollisionToBoxes ( objectCount); //dbShowObjectBounds ( objectCount , 0 ); //dbFadeObject ( objectCount , 10 ); //dbScaleObjectTexture ( objectCount , 1 , 2 ); //dbSetBumpMappingOn ( objectCount , 5 ); //dbHideObject ( objectCount ); //dbGhostObjectOn ( objectCount , 0 ); objectCount++; //dbMakeObjectBox ( objectCount , 100, 100 , 100 ); dbLoadObject ( "media\\walltop2.x" , objectCount ); dbPositionObject ( objectCount , ( float ) charNum * 100 , 150 , ( float ) stringNum * 100 ); dbTextureObject ( objectCount , 6 ); //dbSetObjectCollisionOff ( objectCount ); //dbScaleObjectTexture ( objectCount , 2 , 2 ); //dbSetBumpMappingOn ( objectCount , 5 ); objectCount++; addFloor = 0; } break; case 'o': // Pillars { dbMakeObjectCylinder ( objectCount , 100 ); dbScaleObject ( objectCount , 50 , 200 , 50 ); dbPositionObject ( objectCount , ( float ) charNum * 100 , 100 , ( float ) stringNum * 100 ); dbTextureObject ( objectCount , 5 ); dbScaleObjectTexture ( objectCount , 2 , 4 ); #ifdef SHADERS dbSetBumpMappingOn ( objectCount , 9 ); #endif objectCount++; addFloor = 1; shadow = 1; } break; case '#': // Doorway { //dbMakeObjectBox ( objectCount , 100, 100 , 100 ); dbLoadObject ( "media\\walltop3.x" , objectCount ); dbPositionObject ( objectCount , ( float ) charNum * 100 , 150 , ( float ) stringNum * 100 ); dbTextureObject ( objectCount , 6 ); dbSetObjectCollisionOff ( objectCount ); //dbScaleObjectTexture ( objectCount , 2 , 2 ); //dbSetBumpMappingOn ( objectCount , 5 ); objectCount++; addFloor = 1; } break; case 'x': // Centre Point { addFloor = 1; } break; } if ( addFloor == 1 ) // if yes that add a floor and ceiling { // Add the ceiling dbMakeObjectPlane ( objectCount , 100, 100 ); dbXRotateObject ( objectCount , 90 ); dbPositionObject ( objectCount , ( float ) charNum * 100 , 200 , ( float ) stringNum * 100 ); dbTextureObject ( objectCount , 1 ); dbSetObjectCollisionOff ( objectCount ); objectCount++; // Now the floor dbMakeObjectPlane ( objectCount , 100, 100 ); dbXRotateObject ( objectCount , -90 ); dbPositionObject ( objectCount , ( float ) charNum * 100 , 0 , ( float ) stringNum * 100 ); dbTextureObject ( objectCount , 1 ); dbScaleObjectTexture ( objectCount , 2 , 2 ); dbSetObjectCollisionOff ( objectCount ); if ( shadow == 1 ) { objectCount++; dbMakeObjectPlane ( objectCount , 100, 100 ); dbXRotateObject ( objectCount , -90 ); dbPositionObject ( objectCount , ( float ) charNum * 100 , .05f , ( float ) stringNum * 100 ); dbTextureObject ( objectCount , 7 ); dbSetObjectCollisionOff ( objectCount ); //dbFadeObject (objectCount , 200 ); } objectCount++; } } } }
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

void updateDoors() { int iLoop; int iLoop2; float dist; bool open = false; for ( iLoop = 0 ; iLoop < doorCount ; iLoop++ ) { open = false; // first check if the player is near the door if ( door [ iLoop ].type == 0 ) { dist = getDistance ( dbCameraPositionX ( 0 ) , 0 , dbCameraPositionZ ( 0 ) , dbObjectPositionX ( door[ iLoop ].distObj ) , 0 , dbObjectPositionZ ( door[ iLoop ].distObj ) + 50 ); } else { dist = getDistance ( dbCameraPositionX ( 0 ) , 0 , dbCameraPositionZ ( 0 ) , dbObjectPositionX ( door[ iLoop ].distObj ) , 0 , dbObjectPositionZ ( door[ iLoop ].distObj ) - 50 ); } if ( dist < 150.0f ) open = true; // now check if a baddie is near the door for ( iLoop2 = 0 ; iLoop2 < baddieCount ; iLoop2++ ) { if ( door [ iLoop ].type == 0 ) { dist = getDistance ( dbObjectPositionX ( baddie [ iLoop2 ].obj ) , 0 , dbObjectPositionZ ( baddie [ iLoop2 ].obj ) , dbObjectPositionX ( door[ iLoop ].distObj ) , 0 , dbObjectPositionZ ( door[ iLoop ].distObj ) + 50 ); } else { dist = getDistance ( dbObjectPositionX ( baddie [ iLoop2 ].obj ) , 0 , dbObjectPositionZ ( baddie [ iLoop2 ].obj ) , dbObjectPositionX ( door[ iLoop ].distObj ) , 0 , dbObjectPositionZ ( door[ iLoop ].distObj ) - 50 ); } if ( dist < 150.0f ) open = true; } if ( open == true ) { if ( dbObjectPositionX ( door[ iLoop ].leftObj ) == door[ iLoop ].leftStartX ) { doorSound = !doorSound; if ( doorSound ) { dbStopSound ( 3 ); dbPlaySound ( 3 , 0 ); } else { dbStopSound ( 4 ); dbPlaySound ( 4 , 0 ); } } dbMoveObjectLeft ( door[ iLoop ].leftObj , 2 ); dbMoveObjectRight ( door[ iLoop ].rightObj , 2 ); if ( door[ iLoop ].type == 0 ) { if ( dbObjectPositionX ( door[ iLoop ].leftObj ) < door[ iLoop ].leftStartX - 100.0f ) { dbPositionObject ( door[ iLoop ].leftObj , door[ iLoop ].leftStartX - 100.0f , dbObjectPositionY ( door[ iLoop ].leftObj ) , dbObjectPositionZ ( door[ iLoop ].leftObj ) ); dbPositionObject ( door[ iLoop ].rightObj , door[ iLoop ].rightStartX + 100.0f , dbObjectPositionY ( door[ iLoop ].leftObj ) , dbObjectPositionZ ( door[ iLoop ].rightObj ) ); } } else { if ( dbObjectPositionX ( door[ iLoop ].leftObj ) > door[ iLoop ].leftStartX + 100.0f ) { dbPositionObject ( door[ iLoop ].leftObj , door[ iLoop ].leftStartX + 100.0f , dbObjectPositionY ( door[ iLoop ].leftObj ) , dbObjectPositionZ ( door[ iLoop ].leftObj ) ); dbPositionObject ( door[ iLoop ].rightObj , door[ iLoop ].rightStartX - 100.0f , dbObjectPositionY ( door[ iLoop ].leftObj ) , dbObjectPositionZ ( door[ iLoop ].rightObj ) ); } } } else { if ( dbObjectPositionX ( door[ iLoop ].leftObj ) != door[ iLoop ].leftStartX ) { dbMoveObjectRight ( door[ iLoop ].leftObj , 2 ); dbMoveObjectLeft ( door[ iLoop ].rightObj , 2 ); } } } }
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

void showFPS ( ) { //int iLoop; char czText[256]; wsprintf ( czFPS , "\%d FPS " , dbScreenFPS ( ) ); dbText ( 0 , 0 , czFPS ); wsprintf ( czText , "\%d HEALTH " , health ); dbText ( 0 , 15 , czText ); /*for ( iLoop = 0 ; iLoop < visCount ; iLoop++ ) { sprintf ( czText , "Vis \%d , Start = \%d, End = \%d, Start Obj = \%d, End Obj = \%d" , iLoop , vis[iLoop].start , vis[iLoop].end , vis[iLoop].startObj , vis[iLoop].endObj ); dbText ( 0 , ( iLoop + 1 ) * 15 , czText ); } sprintf ( czText , "Current Vis = \%d" , currentVis ); dbText ( 0 , 600-20 , czText );*/ }
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

void showVis() { int iLoop; int visLoop; int colCount=0; int color; for ( iLoop = 0 ; iLoop < visCount ; iLoop++) { switch ( colCount ) { case 0: { color = 0x00FF0000; } break; case 1: { color = 0x0000FF00; } break; case 2: { color = 0x000000FF; } break; case 3: { color = 0x00FF00FF; } break; case 4: { color = 0x00FFFF00; } break; case 5: { color = 0x0000FFFF; } break; } colCount++; if ( colCount > 5 ) colCount = 0; for ( visLoop = vis[iLoop].startObj ; visLoop <= vis[iLoop].endObj ; visLoop++ ) { dbColorObject ( visLoop , color ); } } }
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

void updateVis() { int colZ = (int) ( ( dbCameraPositionZ ( 0 ) - 50 ) / 100.0f ) + 1; int oldVis = currentVis; int iLoop; int visLoop; //int baddieLoop; // int baddieVis; for ( iLoop = 0 ; iLoop < visCount ; iLoop++ ) { if ( colZ >= vis[iLoop].start && colZ <= vis[iLoop].end ) { currentVis = iLoop; } } // Are we in a different vis area? if ( currentVis != oldVis ) { // First lets move the new blocks down (if needed) for ( iLoop = currentVis -1 ; iLoop < currentVis + 2 ; iLoop++ ) { // does the area need moving down? if (iLoop > -1 && iLoop < visCount ) { if ( dbObjectPositionY ( vis[iLoop].startObj ) > 49000 ) { for ( visLoop = vis[iLoop].startObj ; visLoop < vis[iLoop].endObj + 1 ; visLoop++ ) { dbMoveObjectDown ( visLoop , 50000 ); //dbExcludeOff ( visLoop ); } } } } // Now lets move the other blocks up (if needed) for ( iLoop = 0 ; iLoop < visCount ; iLoop++ ) { if ( iLoop < currentVis -1 || iLoop > currentVis +1 ) // dont move the current vis up { // does the area need moving up? if ( dbObjectPositionY ( vis[iLoop].startObj ) < 49000 ) { for ( visLoop = vis[iLoop].startObj ; visLoop < vis[iLoop].endObj + 1 ; visLoop++ ) { dbMoveObjectUp ( visLoop , 50000 ); //dbExcludeOn ( visLoop ); } } } } } // Now lets check the baddies /*for ( baddieLoop = 0 ; baddieLoop < baddieCount ; baddieLoop++ ) { colZ = (int) ( ( dbObjectPositionZ ( baddie[baddieLoop].obj ) - 50 ) / 100.0f ) + 1; for ( iLoop = 0 ; iLoop < visCount ; iLoop++ ) { if ( colZ >= vis[iLoop].start && colZ <= vis[iLoop].end ) { baddieVis = iLoop; } } if ( baddieVis > currentVis + 1 || baddieVis < currentVis -1 ) { dbStopObject ( baddie[baddieLoop].obj ); dbPositionObject ( baddie[baddieLoop].obj , dbObjectPositionX ( baddie[baddieLoop].obj ) , 50000 , dbObjectPositionZ ( baddie[baddieLoop].obj ) ); dbPositionObject ( baddie[baddieLoop].obj + 100 , dbObjectPositionX ( baddie[baddieLoop].obj ) , 50000 , dbObjectPositionZ ( baddie[baddieLoop].obj ) ); } else { dbPositionObject ( baddie[baddieLoop].obj , dbObjectPositionX ( baddie[baddieLoop].obj ) , 0 , dbObjectPositionZ ( baddie[baddieLoop].obj ) ); dbPositionObject ( baddie[baddieLoop].obj , dbObjectPositionX ( baddie[baddieLoop].obj ) , 0.1f , dbObjectPositionZ ( baddie[baddieLoop].obj ) ); } }*/ }
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

// Move all blocks up 50000 void setupVis() { int iLoop; int visLoop; for ( iLoop = 0 ; iLoop < visCount ; iLoop++ ) { for ( visLoop = vis[iLoop].startObj ; visLoop < vis[iLoop].endObj + 1 ; visLoop++ ) { dbMoveObjectUp ( visLoop , 50000 ); //dbExcludeOn ( visLoop ); } } currentVis = -1; //to force the vis to update first frame }
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

void updateFire() { int iLoop; char czCol; for ( iLoop = 0 ; iLoop < MAXFIREBALLS ; iLoop++ ) { if ( fire[iLoop].on == true ) { czCol = czLevel[ (int) ( ( dbObjectPositionZ ( iLoop + 10000 ) - 50 ) / 100.0f ) + 1 ][ (int) ( ( dbObjectPositionX ( iLoop + 10000 ) - 50 ) / 100.0f ) + 1 ]; if ( czCol == '1' || czCol == '2' || czCol == 'o' ) fire[iLoop].life = 0; dbRotateObject ( iLoop + 10000 , 0 , fire[iLoop].angleY , 0 ); dbMoveObject ( iLoop + 10000 , 20.0f ); dbSetObjectToCameraOrientation ( iLoop + 10000 ); czCol = czLevel[ (int) ( ( dbObjectPositionZ ( iLoop + 10000 ) - 50 ) / 100.0f ) + 1 ][ (int) ( ( dbObjectPositionX ( iLoop + 10000 ) - 50 ) / 100.0f ) + 1 ]; if ( czCol == '1' || czCol == '2' || czCol == 'o' ) fire[iLoop].life = 0; // have we hit the player? if ( getDistance ( dbCameraPositionX ( 0 ) , 0 , dbCameraPositionZ ( 0 ) , dbObjectPositionX ( iLoop + 10000 ) , 0 , dbObjectPositionZ ( iLoop + 10000 ) ) < 40 ) { playerHurt(); } // Has the life of the fireball run out? if so shift it out of the view fustrum if ( --fire[iLoop].life <= 0 ) { fire[iLoop].on = false; baddie[fire[iLoop].baddie].firing = false; //dbHideObject ( iLoop + 10000 ); dbPositionObject ( iLoop + 10000 , 0 , 50000 , 0 ); } } } }
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

void playerHurt() { dbBox ( 0 , 0 , dbScreenWidth() , dbScreenHeight() , 0x00FF0000 , 0x00FF0000 , 0x00FF0000 , 0x00FF0000 ); health--; }
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

void die() { if ( dbCameraPositionY ( 0 ) > 5.0f ) { dbPositionCamera ( 0 , dbCameraPositionX ( 0 ) , dbCameraPositionY ( 0 ) - 0.4f , dbCameraPositionZ ( 0 ) ); dbMoveObjectDown ( 10 , .5 ); dbMoveObjectLeft ( 10 , 1.5 ); dbZRotateObject ( 10 , dbObjectAngleZ ( 10 ) + 5 ); dbEnableObjectZDepth ( 10 ); dbZRotateCamera ( 0 , dbCameraAngleZ ( 0 ) - 1 ); } isDying++; if ( isDying == 240 ) { if ( dbImageExist ( 1 ) ) { dbDeleteImage ( 1 ); dbLoadImage ( "media\\gameover.jpg" , 1 , 1 ); } } if ( isDying > 240 ) { dbPasteImage ( 1 , 0 , 0 ); isDying = 241; } }


(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.