//------------------------------------------------------------------------------ //! \brief Load a bitmap - ready to draw (Load Bitmap) //! //! \param sprid = Sprite ID //------------------------------------------------------------------------------ void CBitmapGroup::Load(int sprid) { int offset; offset = sprid - SPR_START_NUMBER; // Get offset if ( (offset < 0) || (offset >= SPR_SIZE) ) return; // Illegal Sprite ID if (m_ItemList[offset]) // Already exists? { // Check for mask exist? m_ItemList[offset]->m_PurgeFlag = 1; // Set the purge flag return; } CBitmapItem *pitem; SMB_NEW(pitem,CBitmapItem); // Allocate structure if (pitem) // Allocated okay? { pitem->m_pGame = m_pGame; m_ItemList[offset] = pitem; // Insert bitmap item pitem->m_PurgeFlag = 1; // Set the purge flag pitem->Load(sprid); // Load the bitmap pitem->m_XOff = MainOffsets[offset].xoff; pitem->m_YOff = MainOffsets[offset].yoff; } }
//------------------------------------------------------------------------------ //! \brief Control do dah day in the back of the train //------------------------------------------------------------------------------ void CEndBoss::ControlDay( void ) { m_BombPause++; if (m_BombPause>=BOSS_FIRE_RATE) { m_BombPause = 0; CBombObj *cobj; SMB_NEW(cobj,CBombObj); if (cobj) { m_pGame->InitFrkObject(cobj, OBJ_BOMB, m_XPos , m_YPos, &m_pGame->m_BaddieList); cobj->m_XInert = -m_XInert; } } }
//------------------------------------------------------------------------------ //! \brief Setup the object getting caught //------------------------------------------------------------------------------ void CEndBoss::SetupCaught( void ) { CSuckable::SetupCaught(); // Must call virtual member if (m_HatFrame) // Destroy Hat? { CDropOffObj *cobj; SMB_NEW(cobj,CDropOffObj); if (cobj) { m_pGame->InitFrkObject(cobj, OBJ_DROPOFF, m_XPos , m_YPos-20, &m_pGame->m_GoodieList); cobj->m_Frame = m_HatFrame; } m_HatFrame = 0; } }
//------------------------------------------------------------------------------ //! \brief Set the object to explode //------------------------------------------------------------------------------ void CEndBoss::SetExplode( void ) { if (!m_Segment) { CKillBossObj *cobj; SMB_NEW(cobj,CKillBossObj); if (cobj) { m_pGame->InitFrkObject(cobj, OBJ_KILLBOSS, (SCR_WIDTH/2) - 16, (SCR_HEIGHT/2) - 16, &m_pGame->m_BaddieList); }else { // NOTE IF ALLOCATION FAILED - STILL COMPLETE THE GAME! } } CSuckable::SetExplode(); }
//------------------------------------------------------------------------------ //! \brief Make the crab boss baddie //------------------------------------------------------------------------------ void CCrabBoss::PatDump( void ) { switch (m_PipeCmd) { case PIPE_START: // Check to see if need to reswawn (not 100% correct - added features!) if (m_pGame->m_BaddieList.FindFirst(OBJ_SPIKE)) { m_Pattern++; break; } m_PipeOffset = 0; m_PipeCmd = PIPE_BOSSUP; // Fall through case PIPE_BOSSUP: m_PipeOffset+=2; m_YPos-=2; if (m_PipeOffset>=30) { m_PipeCmd = PIPE_BADDOWNPIPE; m_LumpOffset = 0; } break; case PIPE_BADDOWNPIPE: m_LumpOffset+=3; if (m_LumpOffset>=36) { m_LumpOffset = 0; m_EjectDir = m_EjectDir^1; // Swap the direction m_EjectCnt = NUMSUCKANIM/2; m_PipeCmd = PIPE_LETOUT; } break; case PIPE_LETOUT: SUCKANIM *sanim; CSpikeObj *sobj; if (m_EjectCnt>=NUMSUCKANIM) // All done? { m_EjectFrame = 0; m_PipeCmd = PIPE_UP; SMB_NEW(sobj,CSpikeObj); if (sobj) { sobj->Setup(m_EjectDir,m_EjectXOff+m_XPos, m_EjectYOff + m_YPos); m_pGame->m_BaddieList.Attach(sobj, OBJ_SPIKE, m_pGame); m_pGame->m_pSound->PlaySample(SND_SPIT, m_XPos); } break; } if (m_EjectDir) sanim = suck_spike_right; else sanim = suck_spike_left; sanim = &sanim[m_EjectCnt]; m_EjectFrame = sanim->frame; m_EjectXOff = sanim->xoffset; if (m_EjectDir) m_EjectXOff+=0x38; else m_EjectXOff+=0x4; m_EjectYOff = sanim->yoffset + 0x70-1; m_EjectCnt++; break; case PIPE_UP: m_PipeOffset-=2; if (m_PipeOffset<=0) { m_PipeCmd = PIPE_START; m_Pattern++; } } }