void DoRotate( int player ) { MBoolean possible; EraseSpriteBlobs( player ); blobR[player] = ( blobR[player] + 1 ) % 4; possible = CanMoveDirection( player, 0, halfway[player]? 1: 0 ); StartTweak( player, 0, 1, 0 ); // only rotates clockwise if( !possible ) { if( blobR[player] == downRotate ) { if( halfway[player] ) halfway[player] = false; else blobY[player]--; if( ++blobSpin[player] >= 4 ) { blobTime[player] = animTime[player] = GameTickCount( ); role[player] = kLockdownBlobs; anim[player] = 0; PlayStereoFrequency( player, kPlace, player ); } } if( blobR[player] == leftRotate ) { if( CanGoRight(player) ) GoRight( player ); else { blobR[player]++; StartTweak( player, 0, 2, 0 ); } } if( blobR[player] == rightRotate ) { if( CanGoLeft(player) ) GoLeft( player ); else { blobR[player]++; StartTweak( player, 0, 2, 0 ); if( !CanMoveDirection( player, 0, halfway[player]? 1: 0 ) ) { if( halfway[player] ) halfway[player] = false; else blobY[player]--; if( ++blobSpin[player] >= 4 ) { blobTime[player] = animTime[player] = GameTickCount( ); role[player] = kLockdownBlobs; anim[player] = 0; PlayStereoFrequency( player, kPlace, player ); } } } } } DrawSpriteBlobs( player, kNoSuction ); PlayStereo( player, kRotate ); }
void PlayStereo( short player, short which ) { PlayStereoFrequency( player, which, 0 ); }
void ZapBlobs( int player ) { int x, y, cluster, clusterCount = 0, multiplier, amount = 0; int zapFocusX = -1, zapFocusY = -1, zapFocusC = 0; zapScorePt[player].y = 0; zapScoreFrame[player] = 0; switch( chain[player] ) { case 1: multiplier = 1; break; default: multiplier = 2 << chain[player]; break; } for( y=kGridDown-1; y>=0; y-- ) { for( x=kGridAcross-1; x>=0; x-- ) { if( grid[player][x][y] >= kFirstBlob && grid[player][x][y] <= kLastBlob && suction[player][x][y] != kInDeath ) { cluster = SizeUp( grid[player], x, y, grid[player][x][y] ); if( cluster >= kBlobClusterSize ) { clusterCount++; zapFocusX = x; zapFocusY = y; zapFocusC = grid[player][x][y]; amount += cluster * 10; multiplier += cluster - kBlobClusterSize; RemoveBlobs( player, x, y, grid[player][x][y], 0 ); } } } } if( clusterCount > 0 ) { switch( clusterCount ) { case 1: break; case 2: multiplier += 3; break; case 3: multiplier += 6; break; case 4: multiplier += 12; break; default: multiplier += 24; break; } if( multiplier > 999 ) multiplier = 999; CalculateGrays( 1-player, amount * multiplier / difficulty[player] ); potentialCombo[player].value += amount * multiplier; if( players == 1 ) amount *= ((level <= kLevels)? level: 1); score[player] += amount * multiplier; ZapScoreDisplay( player, amount, multiplier, zapFocusX, zapFocusY, zapFocusC ); } blobTime[player] = GameTickCount( ); if( clusterCount > 0 ) { chain[player]++; role[player] = kKillBlobs; PlayStereoFrequency( player, kSquishy, zapIteration[player]++ ); } else { if( control[player] == kPlayerControl ) { SubmitCombo( &potentialCombo[player] ); } SetupGrays( player ); role[player] = kDropGrays; if( BusyDroppingGrays( player ) ) { PlayStereoFrequency( player, kWhistle, player ); } } }