#include "SAT.h" #include //original dimensions are 500 x 150 #define deptho 500 #define heighto 150 #define numdudes 4 #define kTicksPerFrame 2 #define skypat 128 #define groundpat 129 #define leftButton 0x7B #define rightButton 0x7C #define inputDelay 3 SpritePtr ignore; short landscape[ deptho ],layering = 10,score = 0; Boolean quit=false; pascal void HandleSprite( SpritePtr me); pascal void SetupSprite( SpritePtr me); pascal void SetupDudes( SpritePtr me ); pascal void HandleDudes( SpritePtr me ); pascal void NixNuke( SpritePtr me, SpritePtr him); pascal void DieDude( SpritePtr me ); pascal void BoomDude( SpritePtr me ); pascal void SetupSplash( SpritePtr me); void DisplayScore( void ); void StopScreen( short pcID ); void MakeLand( void ); Boolean KeyState(short keyCode); pascal void HandleSprite (SpritePtr me) { if(KeyState(leftButton)) { if(me->speed.h>-6) { if(++me->appLong>inputDelay) { me->speed.h -= 1; me->appLong = 0; } } } if(KeyState(rightButton)) { if(me->speed.h<6) { if(++me->appLong>inputDelay) { me->speed.h += 1; me->appLong = 0; } } } //Cycle cicn's for runner's animation if(me->speed.h!=0) { if(me->speed.h<0) { if(me->mode<136) {me->mode = me->mode + 7; me->face = SATGetFace(me->mode);} if(me->mode<142) me->face = SATGetFace(++me->mode); else me->face = SATGetFace(me->mode=136); } else { if(me->mode>135) {me->mode = me->mode - 7; me->face = SATGetFace(me->mode);} if(me->mode<135) me->face = SATGetFace(++me->mode); else me->face = SATGetFace(me->mode=129); } } else { me->face = SATGetFace(1000); } me->position.h += me->speed.h; if ( me->position.h+16 < deptho ) me->position.v = (gSAT.offSizeV-landscape[me->position.h+16])-32; if (me->position.h <= 0 || me->position.h >= (gSAT.offSizeH-32)) {me->speed.h *= -1;} if(me->position.v < 0) me->position.v = 0; if(me->position.v > (gSAT.offSizeV-32)) me->position.v = gSAT.offSizeV-32; } pascal void SetupSprite (SpritePtr me) { me->task = &HandleSprite; me->mode = 1000; me->face = SATGetFace(me->mode); SetRect(&me->hotRect,10,0,22,32); me->speed.h = 0; me->layer = 10; me->hitTask = &NixNuke; me->appLong = 0; } pascal void SetupSplash( SpritePtr me ) { me->task = &BoomDude; me->mode = 0;// add to splashboom cicn first id and increment to step through explosion me->face = SATGetFace(200 + me->mode ); //See? me->layer = -10; me->appLong = TickCount(); } pascal void SetupDudes( SpritePtr me ) { me->task = &HandleDudes; me->face = SATGetFace(1500); SetRect(&me->hotRect,3,0,29,32); me->speed.h = 0; me->layer = (layering -= 1); } pascal void BoomDude( SpritePtr me )//6min20sectrackninecd4 - spiffy sound { me->face=SATGetFace(200+(me->mode++)); if(me->mode+1>205) me->task = nil; } pascal void NixNuke( SpritePtr me, SpritePtr him) { SATPort normalport; Rect r; short temp; if(him->task = &HandleDudes) { if(fabs(me->speed.h + him->speed.h) >= fabs(me->speed.h) + fabs(him->speed.h) && fabs(me->speed.h)>=fabs(him->speed.h) && fabs(me->speed.h+him->speed.h)!=0) { ignore = SATNewSprite(0,him->position.h,him->position.v,&SetupSplash); him->task = &DieDude; him->mode = 1; him->kind = 0; score++; layering += 1; SATGetPort(&normalport); SATSetPortBackScreen(); SetRect(&r,StringWidth("\pCaught")+10,0,StringWidth("\pCaught")+60,15); EraseRect(&r); MoveTo(r.left,r.bottom-3); SATDrawInt(score); SATBackChanged(&r); SATSetPort(&normalport); ignore = SATNewSprite(-5, (temp = SATRand(gSAT.offSizeH-32)), gSAT.offSizeV-landscape[temp-16]-33, &SetupDudes); } else if(fabs(me->speed.h + him->speed.h) < fabs(me->speed.h) + fabs(him->speed.h) && fabs(me->speed.h+him->speed.h)!=0 ) { him->speed.h *= -1; him->speed.h = him->speed.h+me->speed.h; me->position.v = gSAT.offSizeV-landscape[(me->position.h += (me->speed.h/=3))+16]-32; } } } pascal void DieDude( SpritePtr me ) { if(me->position.v > -32 ) { me->position.v -= me->mode; me->mode *= 2; } else me->task = nil; } pascal void HandleDudes( SpritePtr me ) { short temp; if(KeyState(0x05)) ignore = SATNewSprite(-5, (temp = SATRand(gSAT.offSizeH-32)), gSAT.offSizeV-landscape[temp-16]-33, &SetupDudes); me->position.v = gSAT.offSizeV-landscape[me->position.h+16]-33; if(SATRand100()<22) { switch(SATRand10()<6) { case true: if(me->speed.h<5) me->speed.h += 1; break; case false: if(me->speed.h>-5) me->speed.h -= 1; break; } } if(me->position.h+me->speed.h>=0 && me->position.h+32+me->speed.h<=gSAT.offSizeH) me->position.h += me->speed.h; else me->position.h += (me->speed.h *= -1); if(fabs(me->speed.h)>5) me->speed.h -= (me->speed.h/fabs(me->speed.h)); } void main(void) { long t,duration=0; short i,temp,fID,l; Rect timebox,aframe,realwind; SATPort theport,sp; WindowPtr portal; Rect qbut; PicHandle qpic; SATInitToolbox(); SATConfigure( false, kLayerSort, kKindCollision, 32 ); aframe = qd.screenBits.bounds; SetRect(&realwind, (aframe.right/2)-(deptho/2), (aframe.bottom/2)-(heighto/2), (aframe.right/2)+(deptho/2), (aframe.bottom/2)+(heighto/2) ); portal = NewCWindow(nil,&realwind,nil,true,dBoxProc,(WindowPtr)-1,false,0); ShowWindow(portal); SetPort(portal); SetRect(&realwind,0,0,deptho,heighto); SATCustomInit(nil,nil,&realwind,portal,nil,false,false,false,true,false); ShowWindow(gSAT.wind.port); SelectWindow(gSAT.wind.port); SATRedraw(); StopScreen(true); while(!quit) { HideCursor(); GetDateTime((unsigned long*) &qd.randSeed); MakeLand(); ignore = SATNewSprite(5, gSAT.offSizeH/2-16, gSAT.offSizeV-landscape[gSAT.offSizeH/2-16]-33, &SetupSprite); for(i=0; i6) { if(yL+1=0) landscape[i] = (yL -= 1); } } SATGetPort(&saveport); SATSetPortBackScreen(); SetRect(&screenr,0,0,gSAT.offSizeH,gSAT.offSizeV); dapattern = SATGetPat(skypat); SATBackPat(dapattern); EraseRect(&screenr); dapattern = SATGetPat(groundpat); SATPenPat(dapattern); for ( i = 0; i < deptho; i++ ) { MoveTo(i,gSAT.offSizeV-landscape[i]); LineTo(i,gSAT.offSizeV); } SATDisposePat(dapattern); GetForeColor(&thecolor); for (i = 0; i> bitToCheck) & 0x01; return isKeyPressed; }