📄 play_managefish.c
字号:
pFish3[g_nCurrentFish3++] = E_AllocMotion(&Fish_3_2_Action[0], temp, startX, Sys_Random(480), Sys_Random(16));
SETFISH_KIND(pFish3[g_nCurrentFish3 - 1]->pSprite->nCtrlFlag, 1);
}
//set fish control flag
SETFISH_VX(pFish3[g_nCurrentFish3 - 1]->pSprite->nCtrlFlag, Sys_Random(MAXSPEED_LEV3+1));
SETFISH_VY(pFish3[g_nCurrentFish3 - 1]->pSprite->nCtrlFlag, Sys_Random(MAXSPEED_LEV3>>1));
SETFISH_AX(pFish3[g_nCurrentFish3 - 1]->pSprite->nCtrlFlag, temp);
SETFISH_AY(pFish3[g_nCurrentFish3 - 1]->pSprite->nCtrlFlag, Sys_Random(2));
SETFISH_ST(pFish3[g_nCurrentFish3 - 1]->pSprite->nCtrlFlag, STATE_NORMAL);
SETFISH_LEV(pFish3[g_nCurrentFish3 - 1]->pSprite->nCtrlFlag, FOEMAN_LEV3);
SETFISH_OBJID(pFish3[g_nCurrentFish3 - 1]->pSprite->nCtrlFlag, 0x1F);
SETFISH_SELFID(pFish3[g_nCurrentFish3 - 1]->pSprite->nCtrlFlag, (g_nCurrentFish3 - 1));
}
}
/**
* FoemanLevel_4 - manage level4 foeman fish.
* @PlayerLevel: player's level
*/
void FoemanLevel_4(void)
{
#ifdef AUDIO_ENABLE
//TM_StopPCM(AUDIO_NO2);
TM_PlayPCM((U8 *)RES_WAVESFX_ALERT_DRM, 64, 127);
#endif
//shark move into screen
E_ChangeAction(pFish4, SHARK_WARNING);
//select left or right
if ( Sys_Random(2) )
{//to right
g_iSharkStartX = -384;
pFish4->pSprite->stPos.x = 0;
}
else
{//to left
g_iSharkStartX = SCREEN_WIDTH;
pFish4->pSprite->stPos.x = SCREEN_WIDTH - pFish4->pSprite->pFrame->stSize.width;
}
//select height
g_iSharkStartY = -128 + Sys_Random(480);
if ( g_iSharkStartY + 128 > 416 )
{
pFish4->pSprite->stPos.y = 416;
}
else
{
pFish4->pSprite->stPos.y = g_iSharkStartY + 128;
}
//debug code
/* pFish4->pSprite->stPos.x = g_iSharkStartX;
pFish4->pSprite->stPos.y = g_iSharkStartY;
if ( g_iSharkStartX < 0 )
{//left to right
E_ChangeAction(pFish4, SHARK_RIGHTMOVE);
}
else
{//right to left
E_ChangeAction(pFish4, SHARK_LEFTMOVE);
}*/
}
/**
* Play_ManageFish - .
*/
void Play_ManageFish(void)
{
if (g_nManageFishTimer < game_time)
{
g_nManageFishTimer = game_time + 10;
//foeman level1
FoemanLevel_1(g_nPlayerLevel-1);
//foeman level2
FoemanLevel_2(g_nPlayerLevel-1);
//foeman level3
FoemanLevel_3(g_nPlayerLevel-1);
}
//foeman level4
if (g_nSharkTimer < game_time && pFish4->nMtnInfo.B.MTN_ActionID == SHARK_HIDE && g_nPlayerLevel > LEVEL1)
{
FoemanLevel_4();
}
}
/**
* ProcPoPo - control popo's action.
*/
void ProcPoPo(MOTION *pMotion)
{
//move fish by screen step
pMotion->pSprite->stPos.x = (pMotion->pSprite->nCtrlFlag & 0x0000FFFF) - g_aTextPos_X[TEXT1];
pMotion->pSprite->stPos.y = (pMotion->pSprite->nCtrlFlag >> 16) - (160 + iTextCount_Y[TEXT1]);
//change action
if ( pMotion->nMtnInfo.B.MTN_ActionID == 0 &&
Sys_Random(20) > 17 )
{
#ifdef AUDIO_ENABLE
if ( IsChannelStop(AUDIO_NO3) )
{
//TM_StopPCM(AUDIO_NO3);
TM_PlayPCM((U8 *)RES_WAVESFX_BLEB1_DRM, 64, 127);
}
else
{
if ( IsChannelStop(AUDIO_NO4) )
{
//TM_StopPCM(AUDIO_NO4);
TM_PlayPCM((U8 *)RES_WAVESFX_BLEB2_DRM, 64, 127);
}
}
#endif
E_ChangeAction(pMotion, (Sys_Random(2)+1) );
}
}
/**
* ProcOctopus - control octopus's action.
*/
void ProcOctopus(MOTION *pMotion)
{
U8 i;
U8 flag;
S16 top,bottom,left,right;
S16 top1,bottom1,left1,right1;
//update octopus's coordinate
pMotion->pSprite->stPos.x = 771 - g_aTextPos_X[TEXT2];
pMotion->pSprite->stPos.y = 672 - (160 + iTextCount_Y[TEXT2]);
flag = 0;
//get octopus's block
top = pMotion->pSprite->stPos.y - 32;
bottom = pMotion->pSprite->stPos.y + pMotion->pSprite->pFrame->stSize.height/2;
left = pMotion->pSprite->stPos.x - 16;
right = pMotion->pSprite->stPos.x + 128;
for (i = 0; i < g_nCurrentFish3; i ++)
{
if ( pFish3[i] == NULL )
{
continue;
}
//get object's block
top1 = pFish3[i]->pSprite->stPos.y + 36;
bottom1 = pFish3[i]->pSprite->stPos.y + pFish3[i]->pSprite->pFrame->stSize.height - 36;
left1 = pFish3[i]->pSprite->stPos.x + 36;
right1 = pFish3[i]->pSprite->stPos.x + pFish3[i]->pSprite->pFrame->stSize.width - 36;
if ( CHECK_OVERLAP(left,top,right,bottom,
left1,top1,right1,bottom1) )
{//collision
flag = 1;
break;
}
}
if ( !flag &&
(pFish4->nMtnInfo.B.MTN_ActionID != SHARK_WARNING
&& pFish4->nMtnInfo.B.MTN_ActionID != SHARK_HIDE)
)
{//shark block
top1 = pFish4->pSprite->stPos.y + 128;
bottom1 = pFish4->pSprite->stPos.y + 224;
left1 = pFish4->pSprite->stPos.x + 48;
right1 = pFish4->pSprite->stPos.x + 288;
if ( CHECK_OVERLAP(left,top,right,bottom,
left1,top1,right1,bottom1) )
{
flag = 1;
}
}
if ( !flag )
{//Player block
top1 = pPlayer->pSprite->stPos.y + (pPlayer->pSprite->pFrame->stSize.height - ACTOR0_HEIGHT)/2;
bottom1 = pPlayer->pSprite->stPos.y + pPlayer->pSprite->pFrame->stSize.height - (pPlayer->pSprite->pFrame->stSize.height - ACTOR0_HEIGHT)/2;
left1 = pPlayer->pSprite->stPos.x + (pPlayer->pSprite->pFrame->stSize.width - ACTOR0_WIDTH)/2;
right1 = pPlayer->pSprite->stPos.x + pPlayer->pSprite->pFrame->stSize.width - (pPlayer->pSprite->pFrame->stSize.width - ACTOR0_WIDTH)/2;
if ( CHECK_OVERLAP(left,top,right,bottom,
left1,top1,right1,bottom1) )
{
flag = 1;
}
}
if ( flag && pMotion->nMtnInfo.B.MTN_ActionID > 2)//== 4
{//affright
E_ChangeAction(pMotion, 2);
return;
}
//change action
if ( pMotion->nMtnInfo.B.MTN_ActionID == 0 )
{
switch( Sys_Random(3) )
{
case 1:
E_ChangeAction(pMotion, 1);//blink
break;
case 2:
E_ChangeAction(pMotion, 2);//goggle
break;
case 0:
E_ChangeAction(pMotion, 3);//out->turn head->in
break;
}
}
}
/**
* ProcCowry - control cowry's action.
*/
void ProcCowry(MOTION *pMotion)
{
S16 top,bottom,left,right;
S16 iCenterX,iCenterY;
//update cowry's coordinate
pMotion->pSprite->stPos.x = 192 - g_aTextPos_X[TEXT2];
pMotion->pSprite->stPos.y = 653 - (160 + iTextCount_Y[TEXT2]);
if ( pMotion->nMtnInfo.B.MTN_ActionID == COWRY_STATICCLOSE )
{
if ( Sys_Random(20) == 9 )
{//open
E_ChangeAction(pMotion, COWRY_ACTOPEN);
}
}
//release player
if ( g_nPlayerState == ST_HIDE//pPlayer->nMtnInfo.B.MTN_ActionID == 0
&& pMotion->nMtnInfo.B.MTN_ActionID == COWRY_ACTOPEN
&& pMotion->nMtnInfo.B.MTN_FrameID == 9)
{
E_ChangeAction(pPlayer, (g_nPlayerLevel-1)*12+g_nOldPlayerState);
g_nPlayerState = g_nOldPlayerState;
}
//close player
if ( pMotion->nMtnInfo.B.MTN_ActionID == COWRY_STATICOPEN
&& g_nPlayerState != ST_DEATH )
{
//get cowry's block
top = pMotion->pSprite->stPos.y + 48;
bottom = pMotion->pSprite->stPos.y + 96;
left = pMotion->pSprite->stPos.x + 32;
right = pMotion->pSprite->stPos.x + 96;
//get Player's coordinate
iCenterX = pPlayer->pSprite->stPos.x + pPlayer->pSprite->pFrame->stSize.width/2;
iCenterY = pPlayer->pSprite->stPos.y + pPlayer->pSprite->pFrame->stSize.height/2;
if ( (iCenterX > left && iCenterX < right)
&& (iCenterY > top && iCenterY < bottom) )
{//close player
E_ChangeAction(pMotion, COWRY_CLOSEPLAYER);//cowry close
E_ChangeAction(pPlayer, ST_HIDE);//hide player
g_nPlayerVx = 0;
g_nPlayerVy = 0;
g_nOldPlayerState = g_nPlayerState;
g_nPlayerState = ST_HIDE;
Fish_Index = LCD_4_1;
}
}
}
/**
* ProcSeajelly - .
*@pMotion:
*/
void ProcSeajelly(MOTION *pMotion)
{
U8 temp;
//move seajelly by screen step
_SpFollowScreen(pMotion);
//flap down
if ( pMotion->nMtnInfo.B.MTN_ActionID < SEAJELLY_PRESSDOWN )
{
pMotion->pSprite->stPos.y += Sys_Random(2)+1;
}
//flap up
if ( pMotion->nMtnInfo.B.MTN_ActionID == SEAJELLY_UP )
{
if ( GETFISH_AX(pMotion->pSprite->nCtrlFlag) )
{//right
pMotion->pSprite->stPos.x += GETFISH_VX(pMotion->pSprite->nCtrlFlag);
}
else
{//left
pMotion->pSprite->stPos.x -= GETFISH_VX(pMotion->pSprite->nCtrlFlag);
}
pMotion->pSprite->stPos.y -= FishStep[GETFISH_VY(pMotion->pSprite->nCtrlFlag)];
//Vy sub
if ( GETFISH_VY(pMotion->pSprite->nCtrlFlag) > 0 )
{
SETFISH_VY(pMotion->pSprite->nCtrlFlag, (GETFISH_VY(pMotion->pSprite->nCtrlFlag) - 1));
}
return;
}
//change action
if ( pMotion->pSprite->stPos.y + 96 < 0 )
{
temp = 13;
}
else
{
if ( pMotion->pSprite->stPos.y > 480 )
{
temp = 1;
}
else
{
temp = 8;
}
}
if ( pMotion->nMtnInfo.B.MTN_ActionID == SEAJELLY_FLAPEND &&
Sys_Random(temp) == 0)
{
E_ChangeAction(pMotion, SEAJELLY_INITPRESS);
SETFISH_VY(pMotion->pSprite->nCtrlFlag, (Sys_Random(5)+16));
SETFISH_VX(pMotion->pSprite->nCtrlFlag, Sys_Random(5));
SETFISH_AX(pMotion->pSprite->nCtrlFlag, Sys_Random(2) );
if ( pMotion->pSprite->stPos.x + 48 + 256 < pPlayer->pSprite->stPos.x )
{
SETFISH_AX(pMotion->pSprite->nCtrlFlag, TO_RIGHT);
}
if ( pMotion->pSprite->stPos.x + 48 - 256 > pPlayer->pSprite->stPos.x + pPlayer->pSprite->pFrame->stSize.width )
{
SETFISH_AX(pMotion->pSprite->nCtrlFlag, TO_LEFT);
}
}
}
/**
* ProcShark - .
*@pMotion:
*/
void ProcShark(MOTION *pMotion)
{
if ( pFish4->nMtnInfo.B.MTN_ActionID != SHARK_WARNING )
{
/*if (pMotion->nMtnInfo.B.MTN_ActionID < 3
&& Sys_Random(10) < 3)
{
E_ChangeAction(pMotion, pMotion->nMtnInfo.B.MTN_ActionID + 2);
}*/
//move fish by screen step
_SpFollowScreen(pMotion);
//move shark by speed
if ( pMotion->nMtnInfo.B.MTN_ActionID == SHARK_RIGHTMOVE
|| pMotion->nMtnInfo.B.MTN_ActionID == SHARK_RIGHTEAT )
{
pMotion->pSprite->stPos.x += FishStep[MAXSPEED_LEV4];
}
else
{
pMotion->pSprite->stPos.x -= FishStep[MAXSPEED_LEV4];
}
//check shark move out to screen
if ( pMotion->pSprite->stPos.x < -384 - 20
|| pMotion->pSprite->stPos.x > SCREEN_WIDTH + 20 )
{//out to screen
E_ChangeAction(pMotion, SHARK_HIDE);
g_nSharkTimer = game_time + aFishNum_4[g_nPlayerLevel-1];
}
}
else
{//check play sprite to warning ending
if ( pFish4->nMtnInfo.B.MTN_FrameID == 5 )
{//warning end
if ( g_iSharkStartX < 0 )
{//left to right
E_ChangeAction(pFish4, SHARK_RIGHTMOVE);
}
else
{//right to left
E_ChangeAction(pFish4, SHARK_LEFTMOVE);
}
pFish4->pSprite->stPos.x = g_iSharkStartX;
pFish4->pSprite->stPos.y = g_iSharkStartY;
}
}
}
/**
* ProcActor - .
*@pMotion:
*/
void ProcActor(MOTION *pMotion)
{
U8 level;
S16 temp;
level = g_nPlayerLevel-1;
//change direction
if ( g_nPlayerState == ST_LEFTMOVE || g_nPlayerState == ST_RIGHTMOVE )
{
if ( (g_nPlayerAx ^ (g_nPlayerState - 1)) )
{//need change
E_ChangeAction(pMotion, (level*12 + g_nPlayerState + 2) );
g_nPlayerState = g_nPlayerAx + 1;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -