1586 lines
35 KiB
C++
1586 lines
35 KiB
C++
|
//
|
|||
|
|
|||
|
#include "kosSyst.h"
|
|||
|
#include "KosFile.h"
|
|||
|
#include "gfxdef.h"
|
|||
|
#include "gameWnd.h"
|
|||
|
#include "mcarray.h"
|
|||
|
#include "lang.h"
|
|||
|
|
|||
|
//
|
|||
|
#define EMPTY_PLACE 0
|
|||
|
|
|||
|
#define LEVEL_PROGRESS_LEFT (132+1)
|
|||
|
#define LEVEL_PROGRESS_TOP (388+21)
|
|||
|
#define LEVEL_PROGRESS_HEIGHT 4
|
|||
|
#define LEVEL_PROGRESS_WIDTH 329
|
|||
|
#define LEVEL_PROGRESS_COLOUR 0xDF2933
|
|||
|
|
|||
|
#define BONUS_SOMEBLOCK_TOP (120+21)
|
|||
|
#define BONUS_SOMEBLOCK_LEFT (46+1)
|
|||
|
#define BONUS_FREEBLOCK_TOP (163+21)
|
|||
|
#define BONUS_FREEBLOCK_LEFT (9+1)
|
|||
|
#define BONUS_DIAGBLOCK_TOP (213+21)
|
|||
|
#define BONUS_DIAGBLOCK_LEFT (48+1)
|
|||
|
#define BONUS_PROGRESS_HEIGHT 37
|
|||
|
#define BONUS_PROGRESS_WIDTH 4
|
|||
|
|
|||
|
#define LEVEL_SCORE_BASE 50
|
|||
|
|
|||
|
//
|
|||
|
CKosBitmap gameFace;
|
|||
|
CKosBitmap gameBlocks;
|
|||
|
CKosBitmap gameNumbers;
|
|||
|
CKosBitmap gameBlocksZ[4];
|
|||
|
//
|
|||
|
CFishka *fishki[blocksNum];
|
|||
|
|
|||
|
//
|
|||
|
char *gameWndTitle;
|
|||
|
#if LANG == RUS
|
|||
|
char gameWndTitle1[] = "<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ⥡<> :)";
|
|||
|
char gameWndTitle2[] = "<EFBFBD><EFBFBD> <20><><EFBFBD>...";
|
|||
|
char gameOverText[] = "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ண<EFBFBD> <20><><EFBFBD>!";
|
|||
|
#else
|
|||
|
char gameWndTitle1[] = "Pharaoh waits for you :)";
|
|||
|
char gameWndTitle2[] = "Well...";
|
|||
|
char gameOverText[] = "No further way!";
|
|||
|
#endif
|
|||
|
//
|
|||
|
Word gcx, gcy;
|
|||
|
//
|
|||
|
#define mapSize 8
|
|||
|
//
|
|||
|
//
|
|||
|
#define blocksLeft (134+2)
|
|||
|
#define blocksTop (43+22)
|
|||
|
//
|
|||
|
#define blockTypesNum 10
|
|||
|
//
|
|||
|
Byte gameMap[mapSize * mapSize];
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
int gameLevel;
|
|||
|
//
|
|||
|
int maxGameLevel;
|
|||
|
int startGameLevel;
|
|||
|
// <20><><EFBFBD><EFBFBD>
|
|||
|
Dword playerScore;
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
int insertedBlocksCount;
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
int levelBlocksLimit;
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
int selectedBlock;
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> * 1024
|
|||
|
int levelProgressStep;
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
int levelProgressCount;
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
struct sRemoveBlock
|
|||
|
{
|
|||
|
short int ndx;
|
|||
|
short int value;
|
|||
|
sRemoveBlock()
|
|||
|
{
|
|||
|
this->ndx = 0;
|
|||
|
this->value = 0;
|
|||
|
};
|
|||
|
sRemoveBlock( int pNdx, int pValue )
|
|||
|
{
|
|||
|
this->ndx = pNdx;
|
|||
|
this->value = pValue;
|
|||
|
};
|
|||
|
};
|
|||
|
bool operator == ( const sRemoveBlock &b1, const sRemoveBlock &b2 )
|
|||
|
{
|
|||
|
return b1.ndx == b2.ndx;
|
|||
|
};
|
|||
|
MCArray<sRemoveBlock> toRemoveList;
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
MCArray<int> toFallList;
|
|||
|
//
|
|||
|
bool mouseButtonDisabled;
|
|||
|
//
|
|||
|
bool freezeBonuses = false;
|
|||
|
//
|
|||
|
int bonusSomeBlockProgressStep;
|
|||
|
int bonusSomeBlockProgressCount;
|
|||
|
//
|
|||
|
int bonusFreeBlockProgressStep;
|
|||
|
int bonusFreeBlockProgressCount;
|
|||
|
//
|
|||
|
int bonusDiagBlockProgressStep;
|
|||
|
int bonusDiagBlockProgressCount;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
#define SELECTED_BLOCK_NONE -1
|
|||
|
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
int bonusSomeBlock;
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
int bonusSomeBlockCount;
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
int bonusSomeBlockEdge;
|
|||
|
#define BONUS_SOMEBLOCK_SELECTED -2
|
|||
|
//
|
|||
|
bool bonusFreeBlock;
|
|||
|
int bonusFreeBlockCount;
|
|||
|
int bonusFreeBlockEdge;
|
|||
|
#define BONUS_FREEBLOCK_SELECTED -3
|
|||
|
//
|
|||
|
int bonusDiagBlock;
|
|||
|
int bonusDiagBlockCount;
|
|||
|
int bonusDiagBlockEdge;
|
|||
|
#define BONUS_DIAGBLOCK_SELECTED -4
|
|||
|
//
|
|||
|
void drawScore();
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
void drawBonuses();
|
|||
|
//
|
|||
|
void drawLevelNum();
|
|||
|
//
|
|||
|
void fadeOutBlocks();
|
|||
|
//
|
|||
|
void fallDownBlocks();
|
|||
|
|
|||
|
|
|||
|
void ClearGameMeters()
|
|||
|
{
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
kos_DrawBar(
|
|||
|
LEVEL_PROGRESS_LEFT,
|
|||
|
LEVEL_PROGRESS_TOP,
|
|||
|
LEVEL_PROGRESS_WIDTH,
|
|||
|
LEVEL_PROGRESS_HEIGHT,
|
|||
|
0
|
|||
|
);
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
// some
|
|||
|
kos_DrawBar(
|
|||
|
33+1,
|
|||
|
118+21,
|
|||
|
BONUS_PROGRESS_WIDTH,
|
|||
|
BONUS_PROGRESS_HEIGHT,
|
|||
|
0
|
|||
|
);
|
|||
|
// free
|
|||
|
kos_DrawBar(
|
|||
|
58+1,
|
|||
|
166+21,
|
|||
|
BONUS_PROGRESS_WIDTH,
|
|||
|
BONUS_PROGRESS_HEIGHT,
|
|||
|
0
|
|||
|
);
|
|||
|
// diag
|
|||
|
kos_DrawBar(
|
|||
|
37+1,
|
|||
|
213+21,
|
|||
|
BONUS_PROGRESS_WIDTH,
|
|||
|
BONUS_PROGRESS_HEIGHT,
|
|||
|
0
|
|||
|
);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
void drawGameMeters()
|
|||
|
{
|
|||
|
//
|
|||
|
ClearGameMeters();
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
kos_DrawBar(
|
|||
|
LEVEL_PROGRESS_LEFT,
|
|||
|
LEVEL_PROGRESS_TOP,
|
|||
|
levelProgressCount,
|
|||
|
LEVEL_PROGRESS_HEIGHT,
|
|||
|
LEVEL_PROGRESS_COLOUR
|
|||
|
);
|
|||
|
//
|
|||
|
if ( bonusSomeBlockProgressCount > 0 )
|
|||
|
// some
|
|||
|
kos_DrawBar(
|
|||
|
33+1,
|
|||
|
118+21+BONUS_PROGRESS_HEIGHT-bonusSomeBlockProgressCount,
|
|||
|
BONUS_PROGRESS_WIDTH,
|
|||
|
bonusSomeBlockProgressCount,
|
|||
|
LEVEL_PROGRESS_COLOUR
|
|||
|
);
|
|||
|
//
|
|||
|
if ( bonusFreeBlockProgressCount > 0 )
|
|||
|
// free
|
|||
|
kos_DrawBar(
|
|||
|
58+1,
|
|||
|
166+21+BONUS_PROGRESS_HEIGHT-bonusFreeBlockProgressCount,
|
|||
|
BONUS_PROGRESS_WIDTH,
|
|||
|
bonusFreeBlockProgressCount,
|
|||
|
LEVEL_PROGRESS_COLOUR
|
|||
|
);
|
|||
|
//
|
|||
|
if ( bonusDiagBlockProgressCount > 0 )
|
|||
|
// diag
|
|||
|
kos_DrawBar(
|
|||
|
37+1,
|
|||
|
213+21+BONUS_PROGRESS_HEIGHT-bonusDiagBlockProgressCount,
|
|||
|
BONUS_PROGRESS_WIDTH,
|
|||
|
bonusDiagBlockProgressCount,
|
|||
|
LEVEL_PROGRESS_COLOUR
|
|||
|
);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
////////////////////////////////////////////////////////////////////////////////
|
|||
|
void SetLevelVariables()
|
|||
|
{
|
|||
|
selectedBlock = -1;
|
|||
|
levelBlocksLimit = ( gameLevel > 5 ) ? LEVEL_SCORE_BASE * ( gameLevel + 1 ) : LEVEL_SCORE_BASE * ( 11 - gameLevel );
|
|||
|
insertedBlocksCount = 0;
|
|||
|
//
|
|||
|
levelProgressCount = 0;
|
|||
|
levelProgressStep = ( LEVEL_PROGRESS_WIDTH * 1024 ) / levelBlocksLimit;
|
|||
|
//
|
|||
|
bonusSomeBlockEdge = levelBlocksLimit / 4;
|
|||
|
bonusFreeBlockEdge = levelBlocksLimit / 3;
|
|||
|
bonusDiagBlockEdge = levelBlocksLimit / 2;
|
|||
|
//
|
|||
|
bonusSomeBlockProgressStep = ( BONUS_PROGRESS_HEIGHT * 1024 ) / bonusSomeBlockEdge;
|
|||
|
bonusSomeBlockProgressCount = ( ( ( bonusSomeBlockCount > bonusSomeBlockEdge ) ? bonusSomeBlockEdge : bonusSomeBlockCount ) * bonusSomeBlockProgressStep ) / 1024;
|
|||
|
//
|
|||
|
bonusFreeBlockProgressStep = ( BONUS_PROGRESS_HEIGHT * 1024 ) / bonusFreeBlockEdge;
|
|||
|
bonusFreeBlockProgressCount = ( ( ( bonusFreeBlockCount > bonusFreeBlockEdge ) ? bonusFreeBlockEdge : bonusFreeBlockCount ) * bonusFreeBlockProgressStep ) / 1024;
|
|||
|
//
|
|||
|
bonusDiagBlockProgressStep = ( BONUS_PROGRESS_HEIGHT * 1024 ) / bonusDiagBlockEdge;
|
|||
|
bonusDiagBlockProgressCount = ( ( ( bonusDiagBlockCount > bonusDiagBlockEdge ) ? bonusDiagBlockEdge : bonusDiagBlockCount ) * bonusDiagBlockProgressStep ) / 1024;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
int GetScoreByBlocks( int blocksCount )
|
|||
|
{
|
|||
|
int limit, update, i, j, acc;
|
|||
|
|
|||
|
//
|
|||
|
if ( blocksCount < 3 ) return 0;
|
|||
|
//
|
|||
|
limit = 20 * blocksNum * gameLevel;
|
|||
|
//
|
|||
|
update = gameLevel;
|
|||
|
acc = 1;
|
|||
|
//
|
|||
|
j = blocksCount - 3;
|
|||
|
//
|
|||
|
for ( i = 0; i < j; i++ )
|
|||
|
{
|
|||
|
//
|
|||
|
acc *= gameLevel + 1;
|
|||
|
//
|
|||
|
if ( ( update + acc ) > limit ) return limit;
|
|||
|
}
|
|||
|
//
|
|||
|
return update + acc;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
int insertNewBlocks()
|
|||
|
{
|
|||
|
int i, j, k, ndx, result, btn;
|
|||
|
|
|||
|
//
|
|||
|
toFallList.Clear();
|
|||
|
//
|
|||
|
result = 0;
|
|||
|
//
|
|||
|
btn = gameLevel > 5 ? blockTypesNum : 5 + gameLevel;
|
|||
|
//
|
|||
|
ndx = ( mapSize * mapSize ) - mapSize;
|
|||
|
//
|
|||
|
for ( i = 0; i < mapSize; i++ )
|
|||
|
{
|
|||
|
for ( j = 0; j < mapSize; j++ )
|
|||
|
{
|
|||
|
//
|
|||
|
k = ndx + i - ( j * mapSize );
|
|||
|
//
|
|||
|
if ( gameMap[k] == EMPTY_PLACE )
|
|||
|
{
|
|||
|
//
|
|||
|
for ( ; j < (mapSize-1); j++ )
|
|||
|
{
|
|||
|
//
|
|||
|
gameMap[k] = gameMap[k-mapSize];
|
|||
|
toFallList.AddExclusive( k );
|
|||
|
k -= mapSize;
|
|||
|
}
|
|||
|
//
|
|||
|
gameMap[i] = ( rtlRand() % btn ) + 1;
|
|||
|
toFallList.AddExclusive( i );
|
|||
|
//
|
|||
|
result++;
|
|||
|
//
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
//
|
|||
|
insertedBlocksCount += result;
|
|||
|
//
|
|||
|
return result;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
int findBlockLines()
|
|||
|
{
|
|||
|
int x, y, ndx;
|
|||
|
int removeCount = 0;
|
|||
|
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
toRemoveList.Clear();
|
|||
|
//
|
|||
|
for ( y = 0; y < mapSize; y++ )
|
|||
|
{
|
|||
|
//
|
|||
|
for ( x = 0; x < mapSize; x++ )
|
|||
|
{
|
|||
|
//
|
|||
|
ndx = x + ( y * mapSize );
|
|||
|
//
|
|||
|
if ( gameMap[ndx] == EMPTY_PLACE ) continue;
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
if ( x < (mapSize - 2) )
|
|||
|
{
|
|||
|
//
|
|||
|
if (
|
|||
|
( gameMap[ndx] == gameMap[ndx+1] && gameMap[ndx] == gameMap[ndx+2] )
|
|||
|
|| ( BONUS_FREE_BLOCK == gameMap[ndx] && gameMap[ndx+1] == gameMap[ndx+2] )
|
|||
|
|| ( gameMap[ndx] == gameMap[ndx+1] && BONUS_FREE_BLOCK == gameMap[ndx+2] )
|
|||
|
|| ( gameMap[ndx] == gameMap[ndx+2] && BONUS_FREE_BLOCK == gameMap[ndx+1] )
|
|||
|
)
|
|||
|
{
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
toRemoveList.AddExclusive( sRemoveBlock( ndx, gameMap[ndx] ) );
|
|||
|
toRemoveList.AddExclusive( sRemoveBlock( ndx+1, gameMap[ndx+1] ) );
|
|||
|
toRemoveList.AddExclusive( sRemoveBlock( ndx+2, gameMap[ndx+2] ) );
|
|||
|
}
|
|||
|
}
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
if ( y < (mapSize - 2) )
|
|||
|
{
|
|||
|
//
|
|||
|
if (
|
|||
|
( gameMap[ndx] == gameMap[ndx+mapSize] && gameMap[ndx] == gameMap[ndx+mapSize+mapSize] )
|
|||
|
|| ( BONUS_FREE_BLOCK == gameMap[ndx] && gameMap[ndx+mapSize] == gameMap[ndx+mapSize+mapSize] )
|
|||
|
|| ( gameMap[ndx] == gameMap[ndx+mapSize] && BONUS_FREE_BLOCK == gameMap[ndx+mapSize+mapSize] )
|
|||
|
|| ( gameMap[ndx] == gameMap[ndx+mapSize+mapSize] && BONUS_FREE_BLOCK == gameMap[ndx+mapSize] )
|
|||
|
)
|
|||
|
{
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
toRemoveList.AddExclusive( sRemoveBlock( ndx, gameMap[ndx] ) );
|
|||
|
toRemoveList.AddExclusive( sRemoveBlock( ndx+mapSize, gameMap[ndx+mapSize] ) );
|
|||
|
toRemoveList.AddExclusive( sRemoveBlock( ndx+mapSize+mapSize, gameMap[ndx+mapSize+mapSize] ) );
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
//
|
|||
|
return toRemoveList.GetCount();
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
bool checkGameOut()
|
|||
|
{
|
|||
|
int x, y, ndx;
|
|||
|
|
|||
|
//
|
|||
|
ndx = 0;
|
|||
|
//
|
|||
|
for ( y = 0; y < mapSize; y++ )
|
|||
|
{
|
|||
|
//
|
|||
|
for ( x = 0; x < mapSize; x++ )
|
|||
|
{
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
if ( x < (mapSize - 1) )
|
|||
|
{
|
|||
|
//
|
|||
|
if ( gameMap[ndx] == gameMap[ndx+1] )
|
|||
|
{
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
if ( bonusSomeBlock == gameMap[ndx] ) return false;
|
|||
|
if ( bonusFreeBlock ) return false;
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
if ( y > 0 )
|
|||
|
{
|
|||
|
//
|
|||
|
if ( x > 0 )
|
|||
|
{
|
|||
|
//
|
|||
|
if ( gameMap[ndx-mapSize-1] == gameMap[ndx] ) return false;
|
|||
|
}
|
|||
|
//
|
|||
|
if ( x < (mapSize - 2) )
|
|||
|
{
|
|||
|
//
|
|||
|
if ( gameMap[ndx-mapSize+2] == gameMap[ndx] ) return false;
|
|||
|
}
|
|||
|
}
|
|||
|
//
|
|||
|
if ( x > 1 )
|
|||
|
{
|
|||
|
//
|
|||
|
if ( gameMap[ndx-2] == gameMap[ndx] ) return false;
|
|||
|
}
|
|||
|
//
|
|||
|
if ( x < (mapSize - 3) )
|
|||
|
{
|
|||
|
//
|
|||
|
if ( gameMap[ndx+3] == gameMap[ndx] ) return false;
|
|||
|
}
|
|||
|
//
|
|||
|
if ( y < (mapSize - 1) )
|
|||
|
{
|
|||
|
//
|
|||
|
if ( x > 0 )
|
|||
|
{
|
|||
|
//
|
|||
|
if ( gameMap[ndx+mapSize-1] == gameMap[ndx] ) return false;
|
|||
|
}
|
|||
|
//
|
|||
|
if ( x < (mapSize - 2) )
|
|||
|
{
|
|||
|
//
|
|||
|
if ( gameMap[ndx+mapSize+2] == gameMap[ndx] ) return false;
|
|||
|
}
|
|||
|
}
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
if ( bonusDiagBlock > 0 )
|
|||
|
{
|
|||
|
//
|
|||
|
if ( y > 0 )
|
|||
|
{
|
|||
|
//
|
|||
|
if ( x > 1 )
|
|||
|
{
|
|||
|
//
|
|||
|
if ( gameMap[ndx-mapSize-2] == gameMap[ndx] ) return false;
|
|||
|
}
|
|||
|
//
|
|||
|
if ( gameMap[ndx-mapSize] == gameMap[ndx] ) return false;
|
|||
|
//
|
|||
|
if ( x < (mapSize - 2) )
|
|||
|
{
|
|||
|
//
|
|||
|
if ( gameMap[ndx-mapSize+1] == gameMap[ndx] ) return false;
|
|||
|
}
|
|||
|
//
|
|||
|
if ( x < (mapSize - 3) )
|
|||
|
{
|
|||
|
//
|
|||
|
if ( gameMap[ndx-mapSize+3] == gameMap[ndx] ) return false;
|
|||
|
}
|
|||
|
}
|
|||
|
//
|
|||
|
if ( y < (mapSize - 1) )
|
|||
|
{
|
|||
|
//
|
|||
|
if ( x > 1 )
|
|||
|
{
|
|||
|
//
|
|||
|
if ( gameMap[ndx+mapSize-2] == gameMap[ndx] ) return false;
|
|||
|
}
|
|||
|
//
|
|||
|
if ( gameMap[ndx+mapSize] == gameMap[ndx] ) return false;
|
|||
|
//
|
|||
|
if ( x < (mapSize - 2) )
|
|||
|
{
|
|||
|
//
|
|||
|
if ( gameMap[ndx+mapSize+1] == gameMap[ndx] ) return false;
|
|||
|
}
|
|||
|
//
|
|||
|
if ( x < (mapSize - 3) )
|
|||
|
{
|
|||
|
//
|
|||
|
if ( gameMap[ndx+mapSize+3] == gameMap[ndx] ) return false;
|
|||
|
}
|
|||
|
}
|
|||
|
} // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
}
|
|||
|
}
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
if ( x < (mapSize - 2) )
|
|||
|
{
|
|||
|
//
|
|||
|
if ( gameMap[ndx] == gameMap[ndx+2] )
|
|||
|
{
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
if ( bonusSomeBlock == gameMap[ndx] ) return false;
|
|||
|
if ( bonusFreeBlock ) return false;
|
|||
|
//
|
|||
|
if ( y > 0 )
|
|||
|
{
|
|||
|
//
|
|||
|
if ( gameMap[ndx-mapSize+1] == gameMap[ndx] ) return false;
|
|||
|
}
|
|||
|
//
|
|||
|
if ( y < (mapSize-1) )
|
|||
|
{
|
|||
|
//
|
|||
|
if ( gameMap[ndx+mapSize+1] == gameMap[ndx] ) return false;
|
|||
|
}
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
if ( bonusDiagBlock > 0 )
|
|||
|
{
|
|||
|
//
|
|||
|
if ( y > 0 )
|
|||
|
{
|
|||
|
//
|
|||
|
if ( gameMap[ndx-mapSize] == gameMap[ndx] ) return false;
|
|||
|
//
|
|||
|
if ( gameMap[ndx-mapSize+2] == gameMap[ndx] ) return false;
|
|||
|
}
|
|||
|
//
|
|||
|
if ( y < (mapSize-1) )
|
|||
|
{
|
|||
|
//
|
|||
|
if ( gameMap[ndx+mapSize] == gameMap[ndx] ) return false;
|
|||
|
//
|
|||
|
if ( gameMap[ndx+mapSize+2] == gameMap[ndx] ) return false;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
if ( y < (mapSize - 1) )
|
|||
|
{
|
|||
|
//
|
|||
|
if ( gameMap[ndx] == gameMap[ndx+mapSize] )
|
|||
|
{
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
if ( bonusSomeBlock == gameMap[ndx] ) return false;
|
|||
|
if ( bonusFreeBlock ) return false;
|
|||
|
//
|
|||
|
if ( x > 0 )
|
|||
|
{
|
|||
|
//
|
|||
|
if ( y > 0 )
|
|||
|
{
|
|||
|
//
|
|||
|
if ( gameMap[ndx-1-mapSize] == gameMap[ndx] ) return false;
|
|||
|
}
|
|||
|
//
|
|||
|
if ( y < (mapSize - 2) )
|
|||
|
{
|
|||
|
//
|
|||
|
if ( gameMap[ndx-1+(2*mapSize)] == gameMap[ndx] ) return false;
|
|||
|
}
|
|||
|
}
|
|||
|
//
|
|||
|
if ( y > 1 )
|
|||
|
{
|
|||
|
//
|
|||
|
if ( gameMap[ndx-(2*mapSize)] == gameMap[ndx] ) return false;
|
|||
|
}
|
|||
|
//
|
|||
|
if ( y < (mapSize - 3) )
|
|||
|
{
|
|||
|
//
|
|||
|
if ( gameMap[ndx+(3*mapSize)] == gameMap[ndx] ) return false;
|
|||
|
}
|
|||
|
//
|
|||
|
if ( x < (mapSize - 1) )
|
|||
|
{
|
|||
|
//
|
|||
|
if ( y > 0 )
|
|||
|
{
|
|||
|
//
|
|||
|
if ( gameMap[ndx+1-mapSize] == gameMap[ndx] ) return false;
|
|||
|
}
|
|||
|
//
|
|||
|
if ( y < (mapSize - 2) )
|
|||
|
{
|
|||
|
//
|
|||
|
if ( gameMap[ndx+1+(2*mapSize)] == gameMap[ndx] ) return false;
|
|||
|
}
|
|||
|
}
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
if ( bonusDiagBlock > 0 )
|
|||
|
{
|
|||
|
//
|
|||
|
if ( x > 0 )
|
|||
|
{
|
|||
|
//
|
|||
|
if ( y > 1 )
|
|||
|
{
|
|||
|
//
|
|||
|
if ( gameMap[ndx-1-(2*mapSize)] == gameMap[ndx] ) return false;
|
|||
|
}
|
|||
|
//
|
|||
|
if ( gameMap[ndx-1] == gameMap[ndx] ) return false;
|
|||
|
//
|
|||
|
if ( y < (mapSize - 2) )
|
|||
|
{
|
|||
|
//
|
|||
|
if ( gameMap[ndx-1+mapSize] == gameMap[ndx] ) return false;
|
|||
|
}
|
|||
|
//
|
|||
|
if ( y < (mapSize - 3) )
|
|||
|
{
|
|||
|
//
|
|||
|
if ( gameMap[ndx-1+(3*mapSize)] == gameMap[ndx] ) return false;
|
|||
|
}
|
|||
|
}
|
|||
|
//
|
|||
|
if ( x < (mapSize - 1) )
|
|||
|
{
|
|||
|
//
|
|||
|
if ( y > 1 )
|
|||
|
{
|
|||
|
//
|
|||
|
if ( gameMap[ndx+1-(2*mapSize)] == gameMap[ndx] ) return false;
|
|||
|
}
|
|||
|
//
|
|||
|
if ( gameMap[ndx+1] == gameMap[ndx] ) return false;
|
|||
|
//
|
|||
|
if ( y < (mapSize - 2) )
|
|||
|
{
|
|||
|
//
|
|||
|
if ( gameMap[ndx+1+mapSize] == gameMap[ndx] ) return false;
|
|||
|
}
|
|||
|
//
|
|||
|
if ( y < (mapSize - 3) )
|
|||
|
{
|
|||
|
//
|
|||
|
if ( gameMap[ndx+1+(3*mapSize)] == gameMap[ndx] ) return false;
|
|||
|
}
|
|||
|
}
|
|||
|
} // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
}
|
|||
|
}
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
if ( y < (mapSize - 2) )
|
|||
|
{
|
|||
|
//
|
|||
|
if ( gameMap[ndx] == gameMap[ndx+(2*mapSize)] )
|
|||
|
{
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
if ( bonusSomeBlock == gameMap[ndx] ) return false;
|
|||
|
if ( bonusFreeBlock ) return false;
|
|||
|
//
|
|||
|
if ( x > 0 )
|
|||
|
{
|
|||
|
//
|
|||
|
if ( gameMap[ndx-1+mapSize] == gameMap[ndx] ) return false;
|
|||
|
}
|
|||
|
//
|
|||
|
if ( x < (mapSize-1) )
|
|||
|
{
|
|||
|
//
|
|||
|
if ( gameMap[ndx+1+mapSize] == gameMap[ndx] ) return false;
|
|||
|
}
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
if ( bonusDiagBlock > 0 )
|
|||
|
{
|
|||
|
//
|
|||
|
if ( x > 0 )
|
|||
|
{
|
|||
|
//
|
|||
|
if ( gameMap[ndx-1] == gameMap[ndx] ) return false;
|
|||
|
//
|
|||
|
if ( gameMap[ndx-1+(2*mapSize)] == gameMap[ndx] ) return false;
|
|||
|
}
|
|||
|
//
|
|||
|
if ( x < (mapSize-1) )
|
|||
|
{
|
|||
|
//
|
|||
|
if ( gameMap[ndx+1] == gameMap[ndx] ) return false;
|
|||
|
//
|
|||
|
if ( gameMap[ndx+1+(2*mapSize)] == gameMap[ndx] ) return false;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
//
|
|||
|
ndx++;
|
|||
|
}
|
|||
|
}
|
|||
|
//
|
|||
|
gameWndTitle = gameWndTitle2;
|
|||
|
//
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
bool exterminateLines()
|
|||
|
{
|
|||
|
int deletedBlocks, btn, i, j;
|
|||
|
bool needRedrawBonus = false;
|
|||
|
|
|||
|
//
|
|||
|
btn = gameLevel > 5 ? blockTypesNum : 5 + gameLevel;
|
|||
|
//
|
|||
|
playerScore += GetScoreByBlocks( deletedBlocks = findBlockLines() );
|
|||
|
//
|
|||
|
if ( ! freezeBonuses )
|
|||
|
{
|
|||
|
//
|
|||
|
if ( gameLevel >= 2 && bonusSomeBlock <= 0 ) bonusSomeBlockCount += deletedBlocks;
|
|||
|
if ( gameLevel >= 3 && !bonusFreeBlock ) bonusFreeBlockCount += deletedBlocks;
|
|||
|
if ( gameLevel >= 4 && bonusDiagBlock <= 0 ) bonusDiagBlockCount += deletedBlocks;
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
if (
|
|||
|
( bonusSomeBlockCount >= bonusSomeBlockEdge || ( gameLevel >= 2 && deletedBlocks >= 4 ) )
|
|||
|
&& bonusSomeBlock <= 0
|
|||
|
)
|
|||
|
{
|
|||
|
bonusSomeBlock = ( rtlRand() % btn ) + 1;
|
|||
|
needRedrawBonus = true;
|
|||
|
if ( bonusSomeBlockCount >= bonusSomeBlockEdge ) bonusSomeBlockCount = 0;
|
|||
|
}
|
|||
|
if ( bonusSomeBlockCount >= bonusSomeBlockEdge ) bonusSomeBlockCount = 0;
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
if ( bonusFreeBlockCount >= bonusFreeBlockEdge || ( gameLevel >=3 && deletedBlocks >= 5 ) )
|
|||
|
{
|
|||
|
bonusFreeBlock = true;
|
|||
|
needRedrawBonus = true;
|
|||
|
if ( bonusFreeBlockCount >= bonusFreeBlockEdge ) bonusFreeBlockCount = 0;
|
|||
|
}
|
|||
|
if ( bonusFreeBlockCount >= bonusFreeBlockEdge ) bonusFreeBlockCount = 0;
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
if ( bonusDiagBlockCount >= bonusDiagBlockEdge || ( gameLevel >= 4 && deletedBlocks >= 6 ) )
|
|||
|
{
|
|||
|
bonusDiagBlock = 3;
|
|||
|
needRedrawBonus = true;
|
|||
|
if ( bonusDiagBlockCount >= bonusDiagBlockEdge ) bonusDiagBlockCount = 0;
|
|||
|
}
|
|||
|
if ( bonusDiagBlockCount >= bonusDiagBlockEdge ) bonusDiagBlockCount = 0;
|
|||
|
//
|
|||
|
bonusSomeBlockProgressCount = ( ( ( bonusSomeBlockCount > bonusSomeBlockEdge ) ? bonusSomeBlockEdge : bonusSomeBlockCount ) * bonusSomeBlockProgressStep ) / 1024;
|
|||
|
//
|
|||
|
bonusFreeBlockProgressCount = ( ( ( bonusFreeBlockCount > bonusFreeBlockEdge ) ? bonusFreeBlockEdge : bonusFreeBlockCount ) * bonusFreeBlockProgressStep ) / 1024;
|
|||
|
//
|
|||
|
bonusDiagBlockProgressCount = ( ( ( bonusDiagBlockCount > bonusDiagBlockEdge ) ? bonusDiagBlockEdge : bonusDiagBlockCount ) * bonusDiagBlockProgressStep ) / 1024;
|
|||
|
//
|
|||
|
if ( needRedrawBonus ) drawBonuses();
|
|||
|
}
|
|||
|
//
|
|||
|
j = toRemoveList.GetCount();
|
|||
|
//
|
|||
|
for ( i = 0; i < j; i++ )
|
|||
|
{
|
|||
|
gameMap[toRemoveList[i].ndx] = EMPTY_PLACE;
|
|||
|
}
|
|||
|
//
|
|||
|
return toRemoveList.GetCount() > 0;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
void initGameMap()
|
|||
|
{
|
|||
|
int i, localScore, localInserted, btn;
|
|||
|
|
|||
|
//
|
|||
|
btn = gameLevel > 5 ? blockTypesNum : 5 + gameLevel;
|
|||
|
//
|
|||
|
for ( i = 0; i < (mapSize * mapSize); i++ )
|
|||
|
{
|
|||
|
gameMap[i] = ( rtlRand() % btn ) + 1;
|
|||
|
}
|
|||
|
//
|
|||
|
localScore = playerScore;
|
|||
|
localInserted = insertedBlocksCount;
|
|||
|
//
|
|||
|
freezeBonuses = true;
|
|||
|
//
|
|||
|
while ( exterminateLines() )
|
|||
|
{
|
|||
|
while ( insertNewBlocks() > 0 );
|
|||
|
}
|
|||
|
//
|
|||
|
freezeBonuses = false;
|
|||
|
//
|
|||
|
playerScore = localScore;
|
|||
|
insertedBlocksCount = localInserted;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
void drawBonuses()
|
|||
|
{
|
|||
|
//
|
|||
|
kos_PutImage(
|
|||
|
selectedBlock != BONUS_SOMEBLOCK_SELECTED ?
|
|||
|
fishki[bonusSomeBlock]->GetBits() :
|
|||
|
fishki[bonusSomeBlock]->GetHighlightedBits(),
|
|||
|
blockSize, blockSize,
|
|||
|
BONUS_SOMEBLOCK_LEFT, BONUS_SOMEBLOCK_TOP
|
|||
|
);
|
|||
|
//
|
|||
|
kos_PutImage(
|
|||
|
bonusFreeBlock ?
|
|||
|
(
|
|||
|
selectedBlock != BONUS_FREEBLOCK_SELECTED ?
|
|||
|
fishki[BONUS_FREE_BLOCK]->GetBits() :
|
|||
|
fishki[BONUS_FREE_BLOCK]->GetHighlightedBits()
|
|||
|
) :
|
|||
|
fishki[0]->GetBits(),
|
|||
|
blockSize, blockSize,
|
|||
|
BONUS_FREEBLOCK_LEFT, BONUS_FREEBLOCK_TOP
|
|||
|
);
|
|||
|
//
|
|||
|
kos_PutImage(
|
|||
|
bonusDiagBlock > 0 ?
|
|||
|
fishki[bonusDiagBlock+BONUS_DIAG_BLOCK-1]->GetBits() :
|
|||
|
fishki[0]->GetBits(),
|
|||
|
blockSize, blockSize,
|
|||
|
BONUS_DIAGBLOCK_LEFT, BONUS_DIAGBLOCK_TOP
|
|||
|
);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
void drawGameMap()
|
|||
|
{
|
|||
|
int i, j, ndx;
|
|||
|
|
|||
|
//
|
|||
|
for ( i = 0; i < mapSize; i++ )
|
|||
|
{
|
|||
|
//
|
|||
|
for ( j = 0; j < mapSize; j++ )
|
|||
|
{
|
|||
|
//
|
|||
|
ndx = (i*mapSize) + j;
|
|||
|
//
|
|||
|
kos_PutImage(
|
|||
|
ndx != selectedBlock ?
|
|||
|
fishki[gameMap[ndx]]->GetBits() :
|
|||
|
fishki[gameMap[ndx]]->GetHighlightedBits(),
|
|||
|
blockSize, blockSize,
|
|||
|
(j * blockSize) + blocksLeft,
|
|||
|
(i * blockSize) + blocksTop
|
|||
|
);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> "<22><><EFBFBD><EFBFBD>"
|
|||
|
int mX, mY;
|
|||
|
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> "<22><><EFBFBD><EFBFBD>"
|
|||
|
bool mouseLButtonDown()
|
|||
|
{
|
|||
|
static bool isDown = false;
|
|||
|
Dword buttons;
|
|||
|
|
|||
|
//
|
|||
|
kos_GetMouseState( buttons, mX, mY );
|
|||
|
//
|
|||
|
if ( mouseButtonDisabled ) return false;
|
|||
|
//
|
|||
|
if ( ( buttons & 1 ) )
|
|||
|
{
|
|||
|
if ( isDown )
|
|||
|
return false;
|
|||
|
else
|
|||
|
{
|
|||
|
isDown = true;
|
|||
|
return true;
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
if ( isDown )
|
|||
|
{
|
|||
|
isDown = false;
|
|||
|
}
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
void flipTwoBlocks( int ndx1, int ndx2 )
|
|||
|
{
|
|||
|
Word blX, blY, selX, selY;
|
|||
|
Byte fishCode;
|
|||
|
|
|||
|
//
|
|||
|
blX = ( ndx1 % mapSize ) * blockSize + blocksLeft;
|
|||
|
blY = ( ndx1 / mapSize ) * blockSize + blocksTop;
|
|||
|
selX = ( ndx2 % mapSize ) * blockSize + blocksLeft;
|
|||
|
selY = ( ndx2 / mapSize ) * blockSize + blocksTop;
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
fishCode = gameMap[ndx1];
|
|||
|
gameMap[ndx1] = gameMap[ndx2];
|
|||
|
gameMap[ndx2] = fishCode;
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
kos_PutImage(
|
|||
|
fishki[gameMap[ndx1]]->GetBits(),
|
|||
|
blockSize, blockSize,
|
|||
|
blX,
|
|||
|
blY
|
|||
|
);
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
kos_PutImage(
|
|||
|
fishki[gameMap[ndx2]]->GetBits(),
|
|||
|
blockSize, blockSize,
|
|||
|
selX,
|
|||
|
selY
|
|||
|
);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
int GameLoop()
|
|||
|
{
|
|||
|
int result, ndx, blX, blY, selX, selY, ddX, ddY, nSel;
|
|||
|
Byte keyCode, mCode;
|
|||
|
bool needDecBonus;
|
|||
|
Dword buttonID;
|
|||
|
|
|||
|
//
|
|||
|
gameWndTitle = gameWndTitle1;
|
|||
|
gameFace.GetSize( gcx, gcy );
|
|||
|
gameLevel = startGameLevel;
|
|||
|
playerScore = 0;
|
|||
|
bonusSomeBlock = 0;
|
|||
|
bonusFreeBlock = false;
|
|||
|
bonusDiagBlock = 0;
|
|||
|
bonusSomeBlockCount = 0;
|
|||
|
bonusFreeBlockCount = 0;
|
|||
|
bonusDiagBlockCount = 0;
|
|||
|
bonusSomeBlockProgressCount = 0;
|
|||
|
bonusFreeBlockProgressCount = 0;
|
|||
|
bonusDiagBlockProgressCount = 0;
|
|||
|
SetLevelVariables();
|
|||
|
mouseButtonDisabled = false;
|
|||
|
initGameMap();
|
|||
|
//
|
|||
|
kos_ChangeWindow( -1, -1, gcx + 1, gcy + 21 );
|
|||
|
//
|
|||
|
for ( result = GM_NONE; result == GM_NONE; )
|
|||
|
{
|
|||
|
switch( kos_WaitForEvent() )
|
|||
|
{
|
|||
|
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
case 1:
|
|||
|
DrawGameWindow();
|
|||
|
break;
|
|||
|
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
case 2:
|
|||
|
if ( kos_GetKey( keyCode ) )
|
|||
|
{
|
|||
|
//
|
|||
|
switch ( keyCode )
|
|||
|
{
|
|||
|
case 0x1B:
|
|||
|
result = GM_ABORT;
|
|||
|
break;
|
|||
|
|
|||
|
default:
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
break;
|
|||
|
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
case 3:
|
|||
|
if ( kos_GetButtonID( buttonID ) )
|
|||
|
{
|
|||
|
switch ( buttonID )
|
|||
|
{
|
|||
|
case 0xA:
|
|||
|
result = GM_ABORT;
|
|||
|
break;
|
|||
|
|
|||
|
default:
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>
|
|||
|
case 6:
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
|
|||
|
if ( mouseLButtonDown() )
|
|||
|
{
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
blX = mX - blocksLeft;
|
|||
|
blY = mY - blocksTop;
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>?
|
|||
|
if ( blX >= 0 && blX < (mapSize * blockSize)
|
|||
|
&& blY >= 0 && blY < (mapSize * blockSize) )
|
|||
|
{
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
blX /= blockSize;
|
|||
|
blY /= blockSize;
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
ndx = blX + ( blY * mapSize );
|
|||
|
// <20><><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
if ( ndx >= 0 && ndx < (mapSize * mapSize) )
|
|||
|
{
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
kos_WindowRedrawStatus( WRS_BEGIN );
|
|||
|
// <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
if ( selectedBlock == SELECTED_BLOCK_NONE )
|
|||
|
{
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
selectedBlock = ndx;
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
kos_PutImage(
|
|||
|
fishki[gameMap[selectedBlock]]->GetHighlightedBits(),
|
|||
|
blockSize, blockSize,
|
|||
|
( selectedBlock % mapSize ) * blockSize + blocksLeft,
|
|||
|
( selectedBlock / mapSize ) * blockSize + blocksTop
|
|||
|
);
|
|||
|
}
|
|||
|
else // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
{
|
|||
|
if ( selectedBlock >= 0 )
|
|||
|
{
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
selX = selectedBlock % mapSize;
|
|||
|
selY = selectedBlock / mapSize;
|
|||
|
// <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>?
|
|||
|
if ( ndx != selectedBlock )
|
|||
|
{
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
ddX = selX - blX;
|
|||
|
ddY = selY - blY;
|
|||
|
needDecBonus = ( bonusDiagBlock > 0 && abs(ddX) == 1 && abs(ddY) == 1 );
|
|||
|
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
if (
|
|||
|
( abs(ddX) == 1 && ddY == 0 )
|
|||
|
|| ( abs(ddY) == 1 && ddX == 0 )
|
|||
|
|| needDecBonus
|
|||
|
)
|
|||
|
{
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
flipTwoBlocks( ndx, selectedBlock );
|
|||
|
//
|
|||
|
kos_Pause( 16 );
|
|||
|
//
|
|||
|
if ( findBlockLines() > 0 )
|
|||
|
{
|
|||
|
//
|
|||
|
if ( needDecBonus )
|
|||
|
{
|
|||
|
//
|
|||
|
--bonusDiagBlock;
|
|||
|
//
|
|||
|
drawBonuses();
|
|||
|
}
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
selectedBlock = SELECTED_BLOCK_NONE;
|
|||
|
//
|
|||
|
while ( exterminateLines() )
|
|||
|
{
|
|||
|
//
|
|||
|
fadeOutBlocks();
|
|||
|
//
|
|||
|
//drawGameMap();
|
|||
|
//drawScore();
|
|||
|
//
|
|||
|
//kos_Pause( 25 );
|
|||
|
//
|
|||
|
while ( insertNewBlocks() > 0 )
|
|||
|
{
|
|||
|
//
|
|||
|
fallDownBlocks();
|
|||
|
//
|
|||
|
//drawGameMap();
|
|||
|
//kos_Pause( 30 );
|
|||
|
}
|
|||
|
}
|
|||
|
//
|
|||
|
drawScore();
|
|||
|
//
|
|||
|
levelProgressCount = ( ( ( insertedBlocksCount > levelBlocksLimit ) ? levelBlocksLimit : insertedBlocksCount ) * levelProgressStep ) / 1024;
|
|||
|
//
|
|||
|
drawGameMeters();
|
|||
|
//
|
|||
|
if ( insertedBlocksCount > levelBlocksLimit )
|
|||
|
{
|
|||
|
kos_Pause( 50 );
|
|||
|
gameLevel++;
|
|||
|
SetLevelVariables();
|
|||
|
//
|
|||
|
//initGameMap();
|
|||
|
//
|
|||
|
//DrawGameWindow();
|
|||
|
//
|
|||
|
drawGameMeters();
|
|||
|
drawLevelNum();
|
|||
|
}
|
|||
|
else
|
|||
|
//
|
|||
|
if ( mouseButtonDisabled = checkGameOut() )
|
|||
|
{
|
|||
|
//
|
|||
|
DrawGameWindow();
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
// <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
flipTwoBlocks( ndx, selectedBlock );
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
selectedBlock = SELECTED_BLOCK_NONE;
|
|||
|
}
|
|||
|
}
|
|||
|
else // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
{
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
kos_PutImage(
|
|||
|
fishki[gameMap[selectedBlock]]->GetBits(),
|
|||
|
blockSize, blockSize,
|
|||
|
selX * blockSize + blocksLeft,
|
|||
|
selY * blockSize + blocksTop
|
|||
|
);
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
selectedBlock = ndx;
|
|||
|
// <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
kos_PutImage(
|
|||
|
fishki[gameMap[selectedBlock]]->GetHighlightedBits(),
|
|||
|
blockSize, blockSize,
|
|||
|
blX * blockSize + blocksLeft,
|
|||
|
blY * blockSize + blocksTop
|
|||
|
);
|
|||
|
}
|
|||
|
}
|
|||
|
else // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>
|
|||
|
{
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
kos_PutImage(
|
|||
|
fishki[gameMap[selectedBlock]]->GetBits(),
|
|||
|
blockSize, blockSize,
|
|||
|
selX * blockSize + blocksLeft,
|
|||
|
selY * blockSize + blocksTop
|
|||
|
);
|
|||
|
//
|
|||
|
selectedBlock = SELECTED_BLOCK_NONE;
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
{
|
|||
|
//
|
|||
|
mCode = gameMap[ndx];
|
|||
|
//
|
|||
|
switch ( selectedBlock )
|
|||
|
{
|
|||
|
case BONUS_SOMEBLOCK_SELECTED:
|
|||
|
gameMap[ndx] = bonusSomeBlock;
|
|||
|
break;
|
|||
|
|
|||
|
case BONUS_FREEBLOCK_SELECTED:
|
|||
|
gameMap[ndx] = BONUS_FREE_BLOCK;
|
|||
|
break;
|
|||
|
|
|||
|
default:
|
|||
|
break;
|
|||
|
}
|
|||
|
//
|
|||
|
if ( findBlockLines() > 0 )
|
|||
|
{
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
switch ( selectedBlock )
|
|||
|
{
|
|||
|
case BONUS_SOMEBLOCK_SELECTED:
|
|||
|
bonusSomeBlock = 0;
|
|||
|
break;
|
|||
|
|
|||
|
case BONUS_FREEBLOCK_SELECTED:
|
|||
|
bonusFreeBlock = false;
|
|||
|
break;
|
|||
|
|
|||
|
default:
|
|||
|
break;
|
|||
|
}
|
|||
|
// <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
drawBonuses();
|
|||
|
drawGameMap();
|
|||
|
kos_Pause( 16 );
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
selectedBlock = SELECTED_BLOCK_NONE;
|
|||
|
//
|
|||
|
while ( exterminateLines() )
|
|||
|
{
|
|||
|
//
|
|||
|
fadeOutBlocks();
|
|||
|
//
|
|||
|
//drawGameMap();
|
|||
|
//drawScore();
|
|||
|
//
|
|||
|
//kos_Pause( 25 );
|
|||
|
//
|
|||
|
while ( insertNewBlocks() > 0 )
|
|||
|
{
|
|||
|
//
|
|||
|
fallDownBlocks();
|
|||
|
//
|
|||
|
//drawGameMap();
|
|||
|
//kos_Pause( 30 );
|
|||
|
}
|
|||
|
}
|
|||
|
//
|
|||
|
drawScore();
|
|||
|
//
|
|||
|
levelProgressCount = ( ( ( insertedBlocksCount > levelBlocksLimit ) ? levelBlocksLimit : insertedBlocksCount ) * levelProgressStep ) / 1024;
|
|||
|
//
|
|||
|
drawGameMeters();
|
|||
|
//
|
|||
|
if ( insertedBlocksCount > levelBlocksLimit )
|
|||
|
{
|
|||
|
kos_Pause( 50 );
|
|||
|
gameLevel++;
|
|||
|
SetLevelVariables();
|
|||
|
//
|
|||
|
//initGameMap();
|
|||
|
//
|
|||
|
//DrawGameWindow();
|
|||
|
//
|
|||
|
drawGameMeters();
|
|||
|
drawLevelNum();
|
|||
|
}
|
|||
|
else
|
|||
|
//
|
|||
|
mouseButtonDisabled = checkGameOut();
|
|||
|
}
|
|||
|
else
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
{
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
gameMap[ndx] = mCode;
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
selectedBlock = ndx;
|
|||
|
// <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
kos_PutImage(
|
|||
|
fishki[gameMap[selectedBlock]]->GetHighlightedBits(),
|
|||
|
blockSize, blockSize,
|
|||
|
blX * blockSize + blocksLeft,
|
|||
|
blY * blockSize + blocksTop
|
|||
|
);
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
drawBonuses();
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
kos_DefineButton(
|
|||
|
444+1, 2+21,
|
|||
|
54, 20,
|
|||
|
0x6000000A,
|
|||
|
0
|
|||
|
);
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
kos_WindowRedrawStatus( WRS_END );
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
{
|
|||
|
nSel = 0;
|
|||
|
//
|
|||
|
if ( mX >= BONUS_SOMEBLOCK_LEFT && (mX - BONUS_SOMEBLOCK_LEFT) <= blockSize
|
|||
|
&& mY >= BONUS_SOMEBLOCK_TOP && (mY - BONUS_SOMEBLOCK_TOP ) <= blockSize )
|
|||
|
{
|
|||
|
//
|
|||
|
nSel = BONUS_SOMEBLOCK_SELECTED;
|
|||
|
}
|
|||
|
//
|
|||
|
if ( mX >= BONUS_FREEBLOCK_LEFT && (mX - BONUS_FREEBLOCK_LEFT) <= blockSize
|
|||
|
&& mY >= BONUS_FREEBLOCK_TOP && (mY - BONUS_FREEBLOCK_TOP ) <= blockSize )
|
|||
|
{
|
|||
|
//
|
|||
|
nSel = BONUS_FREEBLOCK_SELECTED;
|
|||
|
}
|
|||
|
//
|
|||
|
if ( mX >= BONUS_DIAGBLOCK_LEFT && (mX - BONUS_DIAGBLOCK_LEFT) <= blockSize
|
|||
|
&& mY >= BONUS_DIAGBLOCK_TOP && (mY - BONUS_DIAGBLOCK_TOP ) <= blockSize )
|
|||
|
{
|
|||
|
//
|
|||
|
nSel = BONUS_DIAGBLOCK_SELECTED;
|
|||
|
}
|
|||
|
//
|
|||
|
if ( nSel != 0 )
|
|||
|
{
|
|||
|
//
|
|||
|
if ( selectedBlock > 0 )
|
|||
|
{
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
kos_PutImage(
|
|||
|
fishki[gameMap[selectedBlock]]->GetBits(),
|
|||
|
blockSize, blockSize,
|
|||
|
(selectedBlock % mapSize) * blockSize + blocksLeft,
|
|||
|
(selectedBlock / mapSize) * blockSize + blocksTop
|
|||
|
);
|
|||
|
}
|
|||
|
//
|
|||
|
if ( selectedBlock != nSel )
|
|||
|
selectedBlock = nSel;
|
|||
|
else
|
|||
|
selectedBlock = SELECTED_BLOCK_NONE;
|
|||
|
//
|
|||
|
drawBonuses();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
//
|
|||
|
break;
|
|||
|
|
|||
|
default:
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
kos_DefineButton(
|
|||
|
0, 0,
|
|||
|
0, 0,
|
|||
|
0x8000000A,
|
|||
|
0
|
|||
|
);
|
|||
|
//
|
|||
|
if ( gameLevel > maxGameLevel ) maxGameLevel = gameLevel;
|
|||
|
//
|
|||
|
return result;
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
void drawLevelNum()
|
|||
|
{
|
|||
|
Word startX;
|
|||
|
|
|||
|
//
|
|||
|
if ( gameLevel > 9 )
|
|||
|
{
|
|||
|
//
|
|||
|
startX = LEVEL_LEFT;
|
|||
|
//
|
|||
|
kos_PutImage(
|
|||
|
gameNumbers.GetBits() + ( ( gameLevel / 10 ) * NUM_WIDTH * NUM_HEIGHT ),
|
|||
|
NUM_WIDTH, NUM_HEIGHT,
|
|||
|
startX, LEVEL_TOP
|
|||
|
);
|
|||
|
//
|
|||
|
startX += NUM_WIDTH;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
//
|
|||
|
startX = LEVEL_LEFT + ( (LEVEL_WIDTH - NUM_WIDTH) / 2 );
|
|||
|
}
|
|||
|
//
|
|||
|
kos_PutImage(
|
|||
|
gameNumbers.GetBits() + ( ( gameLevel % 10 ) * NUM_WIDTH * NUM_HEIGHT ),
|
|||
|
NUM_WIDTH, NUM_HEIGHT,
|
|||
|
startX, LEVEL_TOP
|
|||
|
);
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
void drawScore()
|
|||
|
{
|
|||
|
Word startX;
|
|||
|
int i, j;
|
|||
|
char strNum[8];
|
|||
|
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
sprintf( strNum, "%U", playerScore );
|
|||
|
//
|
|||
|
j = strlen( strNum );
|
|||
|
//
|
|||
|
startX = SCORE_LEFT + ( ( SCORE_WIDTH - ( NUM_WIDTH * j ) ) / 2 );
|
|||
|
//
|
|||
|
for ( i = 0; i < j; i++ )
|
|||
|
{
|
|||
|
//
|
|||
|
kos_PutImage(
|
|||
|
gameNumbers.GetBits() + ( ( strNum[i] - '0' ) * NUM_WIDTH * NUM_HEIGHT ),
|
|||
|
NUM_WIDTH, NUM_HEIGHT,
|
|||
|
startX, SCORE_TOP
|
|||
|
);
|
|||
|
//
|
|||
|
startX += NUM_WIDTH;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
void DrawGameWindow()
|
|||
|
{
|
|||
|
//
|
|||
|
kos_WindowRedrawStatus( WRS_BEGIN );
|
|||
|
// <20><><EFBFBD><EFBFBD>
|
|||
|
kos_DefineAndDrawWindow(
|
|||
|
WNDLEFT, WNDTOP,
|
|||
|
gcx + 1, gcy + 21,
|
|||
|
0, 0x0,
|
|||
|
0, WNDHEADCOLOUR,
|
|||
|
WNDHEADCOLOUR
|
|||
|
);
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
kos_WriteTextToWindow(
|
|||
|
4, 7,
|
|||
|
0x10, WNDTITLECOLOUR,
|
|||
|
gameWndTitle, strlen(gameWndTitle)
|
|||
|
);
|
|||
|
//
|
|||
|
gameFace.Draw( 1, 21 );
|
|||
|
drawGameMap();
|
|||
|
drawGameMeters();
|
|||
|
drawBonuses();
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
drawLevelNum();
|
|||
|
drawScore();
|
|||
|
//
|
|||
|
if ( mouseButtonDisabled )
|
|||
|
{
|
|||
|
//
|
|||
|
kos_DrawBar(
|
|||
|
( gcx + 1 - 160 ) / 2, ( gcy + 21 - 32 ) / 2,
|
|||
|
160, 32,
|
|||
|
0x2383B3
|
|||
|
);
|
|||
|
//
|
|||
|
kos_WriteTextToWindow(
|
|||
|
( gcx + 1 - sizeof( gameOverText ) * 6 ) / 2, ( gcy + 21 - 9 ) / 2,
|
|||
|
0x0, 0xF7F7F7,
|
|||
|
gameOverText,
|
|||
|
sizeof( gameOverText )
|
|||
|
);
|
|||
|
}
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
kos_DefineButton(
|
|||
|
444+1, 2+21,
|
|||
|
54, 20,
|
|||
|
0x6000000A,
|
|||
|
0
|
|||
|
);
|
|||
|
//
|
|||
|
kos_WindowRedrawStatus( WRS_END );
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
void fadeOutBlocks()
|
|||
|
{
|
|||
|
int i, j, k, ndx, x, y;
|
|||
|
|
|||
|
//
|
|||
|
j = toRemoveList.GetCount();
|
|||
|
//
|
|||
|
for ( k = 0; k < 4; k++ )
|
|||
|
{
|
|||
|
//
|
|||
|
__asm{
|
|||
|
push eax
|
|||
|
push ebx
|
|||
|
mov eax, 18
|
|||
|
mov ebx, 14
|
|||
|
int 0x40
|
|||
|
pop eax
|
|||
|
pop ebx
|
|||
|
}
|
|||
|
//
|
|||
|
for ( i = 0; i < j; i++ )
|
|||
|
{
|
|||
|
//
|
|||
|
ndx = toRemoveList[i].ndx;
|
|||
|
y = ndx / mapSize;
|
|||
|
x = ndx % mapSize;
|
|||
|
//
|
|||
|
kos_PutImage(
|
|||
|
gameBlocksZ[k].GetBits() + ( (toRemoveList[i].value - 1) * blockSize * blockSize ),
|
|||
|
blockSize, blockSize,
|
|||
|
(x * blockSize) + blocksLeft,
|
|||
|
(y * blockSize) + blocksTop
|
|||
|
);
|
|||
|
}
|
|||
|
//
|
|||
|
kos_Pause( 3 );
|
|||
|
}
|
|||
|
//clear
|
|||
|
for ( i = 0; i < j; i++ )
|
|||
|
{
|
|||
|
//
|
|||
|
ndx = toRemoveList[i].ndx;
|
|||
|
y = ndx / mapSize;
|
|||
|
x = ndx % mapSize;
|
|||
|
//
|
|||
|
kos_DrawBar(
|
|||
|
(x * blockSize) + blocksLeft,
|
|||
|
(y * blockSize) + blocksTop,
|
|||
|
blockSize, blockSize, 0
|
|||
|
);
|
|||
|
}
|
|||
|
//
|
|||
|
kos_Pause( 16 );
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
void fallDownBlocks()
|
|||
|
{
|
|||
|
int i, j, k, ndx, x, y, height, offset;
|
|||
|
|
|||
|
//
|
|||
|
j = toFallList.GetCount();
|
|||
|
//
|
|||
|
for ( k = 1; k <= blockSize; k += 2 )
|
|||
|
{
|
|||
|
//
|
|||
|
__asm{
|
|||
|
push eax
|
|||
|
push ebx
|
|||
|
mov eax, 18
|
|||
|
mov ebx, 14
|
|||
|
int 0x40
|
|||
|
pop eax
|
|||
|
pop ebx
|
|||
|
}
|
|||
|
//
|
|||
|
for ( i = 0; i < j; i++ )
|
|||
|
{
|
|||
|
//
|
|||
|
ndx = toFallList[i];
|
|||
|
//
|
|||
|
y = ( ( ( ndx / mapSize ) - 1 ) * blockSize ) + k;
|
|||
|
if ( y < 0 )
|
|||
|
{
|
|||
|
y = 0;
|
|||
|
height = k;
|
|||
|
offset = blockSize - k;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
offset = 0;
|
|||
|
height = blockSize;
|
|||
|
}
|
|||
|
//
|
|||
|
x = ( ndx % mapSize ) * blockSize;
|
|||
|
//
|
|||
|
kos_PutImage(
|
|||
|
fishki[gameMap[ndx]]->GetBits() + ( offset * blockSize ),
|
|||
|
blockSize, height,
|
|||
|
x + blocksLeft,
|
|||
|
y + blocksTop
|
|||
|
);
|
|||
|
}
|
|||
|
//
|
|||
|
kos_Pause( 1 );
|
|||
|
}
|
|||
|
}
|