1
0
mirror of https://github.com/blupi-games/planetblupi synced 2024-12-30 10:15:36 +01:00
planetblupi/fog.cpp
2017-01-21 17:51:48 +01:00

155 lines
3.9 KiB
C++

// Fog.cpp
#include <Windows.h>
#include "DECOR.H"
// Cette table indique les quarts de cases contenant du
// brouillard lorsque la valeur est à un.
// 0 1
// 2 3
static char tableFog[15*4] =
{
1,1,1,0, // 0
1,1,0,0, // 1
1,1,0,1, // 2
1,0,1,0, // 3
1,1,1,1, // 4
0,1,0,1, // 5
1,0,1,1, // 6
0,0,1,1, // 7
0,1,1,1, // 8
0,0,0,1, // 9
0,0,1,0, // 10
1,0,0,1, // 11
0,1,0,0, // 12
1,0,0,0, // 13
0,1,1,0, // 14
};
// Retourne les bits contenant du brouillard.
BOOL GetFogBits(int icon, char *pBits)
{
pBits[0] = 0;
pBits[1] = 0;
pBits[2] = 0;
pBits[3] = 0;
if ( icon < 0 || icon >= 15 ) return TRUE;
pBits[0] = tableFog[icon*4+0];
pBits[1] = tableFog[icon*4+1];
pBits[2] = tableFog[icon*4+2];
pBits[3] = tableFog[icon*4+3];
return TRUE;
}
// Retourne l'icône correspondant aux bits de brouillard.
int GetFogIcon(char *pBits)
{
int i;
for ( i=0 ; i<15 ; i++ )
{
if ( tableFog[i*4+0] == pBits[0] &&
tableFog[i*4+1] == pBits[1] &&
tableFog[i*4+2] == pBits[2] &&
tableFog[i*4+3] == pBits[3] ) return i;
}
return -1;
}
// Table donnant la "vision" d'un blupi dans le
// brouillard.
static char table_fog[17*17] =
{
#if 1
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
4, 4, 4, 4, 4, 4, 4, 2, 4, 4, 4, 4, 4, 4, 4, 4, 4,
4, 4, 4, 4, 4, 4, 1,-1, 5, 4, 4, 4, 4, 4, 4, 4, 4,
4, 4, 4, 4, 4, 1,-1,-1,-1, 5, 4, 4, 4, 4, 4, 4, 4,
4, 4, 4, 4, 1,-1,-1,-1,-1,-1, 5, 4, 4, 4, 4, 4, 4,
4, 4, 4, 1,-1,-1,-1,-1,-1,-1,-1, 5, 4, 4, 4, 4, 4,
4, 4, 1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 5, 4, 4, 4, 4,
4, 0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 5, 4, 4, 4,
4, 4, 3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 5, 4, 4,
4, 4, 4, 3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 8, 4,
4, 4, 4, 4, 3,-1,-1,-1,-1,-1,-1,-1,-1,-1, 7, 4, 4,
4, 4, 4, 4, 4, 3,-1,-1,-1,-1,-1,-1,-1, 7, 4, 4, 4,
4, 4, 4, 4, 4, 4, 3,-1,-1,-1,-1,-1, 7, 4, 4, 4, 4,
4, 4, 4, 4, 4, 4, 4, 3,-1,-1,-1, 7, 4, 4, 4, 4, 4,
4, 4, 4, 4, 4, 4, 4, 4, 3,-1, 7, 4, 4, 4, 4, 4, 4,
4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 4, 4, 4, 4, 4, 4, 4,
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
#else
4, 4, 4, 4, 4, 4, 4, 4, 2, 4, 4, 4, 4, 4, 4, 4, 4,
4, 4, 4, 4, 4, 4, 4, 1,-1, 5, 4, 4, 4, 4, 4, 4, 4,
4, 4, 4, 4, 4, 4, 1,-1,-1,-1, 5, 4, 4, 4, 4, 4, 4,
4, 4, 4, 4, 4, 1,-1,-1,-1,-1,-1, 5, 4, 4, 4, 4, 4,
4, 4, 4, 4, 1,-1,-1,-1,-1,-1,-1,-1, 5, 4, 4, 4, 4,
4, 4, 4, 1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 5, 4, 4, 4,
4, 4, 1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 5, 4, 4,
4, 1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 5, 4,
0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 8,
4, 3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 7, 4,
4, 4, 3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 7, 4, 4,
4, 4, 4, 3,-1,-1,-1,-1,-1,-1,-1,-1,-1, 7, 4, 4, 4,
4, 4, 4, 4, 3,-1,-1,-1,-1,-1,-1,-1, 7, 4, 4, 4, 4,
4, 4, 4, 4, 4, 3,-1,-1,-1,-1,-1, 7, 4, 4, 4, 4, 4,
4, 4, 4, 4, 4, 4, 3,-1,-1,-1, 7, 4, 4, 4, 4, 4, 4,
4, 4, 4, 4, 4, 4, 4, 3,-1, 7, 4, 4, 4, 4, 4, 4, 4,
4, 4, 4, 4, 4, 4, 4, 4, 6, 4, 4, 4, 4, 4, 4, 4, 4,
#endif
};
// Ecarte le brouillard autour d'un blupi.
void CDecor::BlupiPushFog(int rank)
{
int x, y, i;
POINT cel;
char cBits[4];
char nBits[4];
if ( m_blupi[rank].perso != 0 &&
m_blupi[rank].perso != 8 ) return;
for ( y=0 ; y<17 ; y++ )
{
for ( x=0 ; x<17 ; x++ )
{
if ( x%2 != y%2 ) continue;
if ( table_fog[x+y*17] == FOGHIDE ) continue;
cel.x = (x + ((m_blupi[rank].cel.x+1)/4)*2 - 8)*2;
cel.y = (y + ((m_blupi[rank].cel.y+1)/4)*2 - 8)*2;
// Ne pas utiliser IsValid pour permettre d'aller
// jusqu'au bord !
if ( cel.x >= 0 && cel.x < MAXCELX &&
cel.y >= 0 && cel.y < MAXCELX )
{
if ( m_decor[cel.x/2][cel.y/2].fog != -1 )
{
GetFogBits(m_decor[cel.x/2][cel.y/2].fog, cBits);
GetFogBits(table_fog[x+y*17], nBits);
for ( i=0 ; i<4 ; i++ )
{
nBits[i] &= cBits[i]; // "ou" visibilité
}
m_decor[cel.x/2][cel.y/2].fog = GetFogIcon(nBits);
}
}
}
}
}