Пример #1
0
//------------------------------------------------------------------------------
//! \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++;
			}
	}
}