// Worm.cpp #include #include #include #include "comconst.h" #include "pad.h" #include "worm.h" #include "sincos.h" #include "pixmap.h" #include "sound.h" extern CPixMap WormMap; extern CPixMap HoleMap; int CWorm::mCx[MAXCOLOURS]; int CWorm::mCy[MAXCOLOURS]; int CWorm::mTexturePage; int CWorm::mSpeed; #define RESPONSIVENESS 40 #define MAXSOLID 300 #define MINSOLID 150 #define MAXHOLE 15 #define MINHOLE 8 CWorm::CWorm(CPad* controller, int colour) { //colour from 0 to 5 attribute=0; w=4; h=4; tpage=mTexturePage; u=0; v=0; cx=mCx[colour]; cy=mCy[colour]; r=128; g=128; b=128; mx=0; my=0; scalex=0; scaley=0; rotate=0; mColour=colour; mController=controller; this->Reset(); this->ResetScore(); } void CWorm::ResetScore() { mScore=0; } void CWorm::Reset() { mX=0; mY=0; mActualX=((rand()*ONE)/RAND_MAX)*SCREENW; mActualY=((rand()*ONE)/RAND_MAX)*SCREENH; mDoingAHole=FALSE; mSolidCount=0; mHoleCount=0; mThroughAHole=FALSE; mCrashed=FALSE; mNextSolid=((rand()*(MAXSOLID-MINSOLID))/RAND_MAX)+MINSOLID; //Point worm towards centre if (mActualX < (ONE*SCREENW / 2)) { if (mActualY < (ONE*SCREENH / 2)) { mHeading = (3*ONE)/8; } else { mHeading = ONE/8; } } else { if (mActualY < ONE* SCREENH/2) { mHeading = (5*ONE)/8; } else { mHeading = (7*ONE)/8; } } } void CWorm::SetUpWormSprites() { RECT rect; unsigned long wormCross[2] = { 0x01110010, 0x00000010 }; //red, blue, green, cyan, yellow, purple unsigned long wormColour[6][8]= { {0x003F0000, 0x003F003F, 0x003F003F, 0x003F003F, 0x003F003F, 0x003F003F, 0x003F003F, 0x003F003F}, {0xF8010000, 0xF801F801, 0xF801F801, 0xF801F801, 0xF801F801, 0xF801F801, 0xF801F801, 0xF801F801}, {0x07C10000, 0x07C107C1, 0x07C107C1, 0x07C107C1, 0x07C107C1, 0x07C107C1, 0x07C107C1, 0x07C107C1}, {0xFFC10000, 0xFFC1FFC1, 0xFFC1FFC1, 0xFFC1FFC1, 0xFFC1FFC1, 0xFFC1FFC1, 0xFFC1FFC1, 0xFFC1FFC1}, {0x07FF0000, 0x07FF07FF, 0x07FF07FF, 0x07FF07FF, 0x07FF07FF, 0x07FF07FF, 0x07FF07FF, 0x07FF07FF}, {0xF83F0000, 0xF83FF83F, 0xF83FF83F, 0xF83FF83F, 0xF83FF83F, 0xF83FF83F, 0xF83FF83F, 0xF83FF83F}, }; rect.x=960; rect.y=0; rect.w=4/4; rect.h=4; LoadImage(&rect, wormCross); DrawSync(0); mTexturePage=GetTPage(0, 0, 960, 0); for (int g=0; g((SCREENW-1)*ONE))) { TRACE("Crashed X, %d %d\n", mActualX, mActualY); mCrashed=TRUE; return FALSE; } if ((mActualY<0) || (mActualY>((SCREENH-1)*ONE))) { TRACE("Crashed Y, %d %d\n", mActualX, mActualY); mCrashed=TRUE; return FALSE; } xOld=mX; yOld=mY; mX=mActualX/ONE; mY=mActualY/ONE; //These set sprite coordinates x=mX-XOFFSET; y=mY-YOFFSET; //Check for collisions if (mX>xOld) { if ((((mHeading<=ONE/4) || (mHeading>=3*ONE/4)) && (WormMap.Plotted(mX+2, mY))) || (((mHeading>ONE/4) && (mHeading<3*ONE/4)) && (WormMap.Plotted(mX+2, mY+2)))) { TRACE("Crashed trail right\n"); mCrashed=TRUE; return FALSE; } } else if (mX=3*ONE/4)) && (WormMap.Plotted(mX, mY))) || (((mHeading>ONE/4) && (mHeading<3*ONE/4)) && (WormMap.Plotted(mX, mY+2)))) { TRACE("Crashed Trail left\n"); mCrashed=TRUE; return FALSE; } } if (mY>yOld) { if (((mHeading>=ONE/2) && (WormMap.Plotted(mX, mY+2))) || ((mHeading=ONE/2) && (WormMap.Plotted(mX, mY))) || ((mHeading=mNextSolid) { mDoingAHole=TRUE; mHoleCount=0; mNextHole=((rand()*(MAXHOLE-MINHOLE))/RAND_MAX)+MINHOLE; } GsSortFastSprite(this, orderingTable, 0); WormMap.Plot(mX+2, mY+1); WormMap.Plot(mX+1, mY); WormMap.Plot(mX, mY+1); WormMap.Plot(mX+1, mY+1); WormMap.Plot(mX+1, mY+2); if (HoleMap.Plotted(mX+1, mY+1)) { if (!mThroughAHole) { mThroughAHole=TRUE; CSound::HoleSound(); } } else { mThroughAHole=FALSE; } } else { mHoleCount++; if (mHoleCount>=mNextHole) { mDoingAHole=FALSE; mSolidCount=0; mNextSolid=((rand()*(MAXSOLID-MINSOLID))/RAND_MAX)+MINSOLID; mThroughAHole=TRUE; //Dont get points from making holes! } HoleMap.Plot(mX+2, mY+1); HoleMap.Plot(mX+1, mY); HoleMap.Plot(mX, mY+1); HoleMap.Plot(mX+1, mY+1); HoleMap.Plot(mX+1, mY+2); } return TRUE; } void CWorm::Respond() { if (mController->LeftPressed()) { mHeading = (mHeading - RESPONSIVENESS) % ONE; } else { if (mController->RightPressed()) { mHeading = (mHeading + RESPONSIVENESS) % ONE; } } } int CWorm::GetScore() { return mScore; } int CWorm::GetColour() { return mColour; } BOOL CWorm::IsCrashed() { return mCrashed; }