Désolé d'avance pour le gros paté, j'ai aussi du code pour que les tiles à côté des portes soient particuliers (spécifique à Wolfenstein).
Donc de mon côté, la fonction translateZoneId permet en quelque sorte de savoir dans quelle zone du chipset je me trouve.
Les zones 1,2 et 3, c'est pour l'eau.
Les zones 4,5 et 6, c'est des tiles animés.
La zone 7, c'est la partie autotile.
La zone 8, c'est la partie tile "simple" sans animation, sans autotile.
J'ai aussi du code pour gérer les tiles sur les bords de la map. Comme chaque tile est dépendante des tiles à côté, j'ai du code pour reconnaitre les tiles des bords.
Chaque tile a deux couches, la couche principale et la couche supérieure qui s'imprime par dessus.
Ca permet par exemple de faire des murs avec des décorations genre tableau, des fissures, des choses écrites.
Le generatateUniqueId me permet de générer un id unique pour chaque permutation de tile (si c'est un bord ou pas, l'identifiant de la couche principale et celle du dessus, la permutation entre les différentes alternatives de couches principales).
Code : Tout sélectionner
// Rpgmaker Wolf Tile
typedef struct
{
int zone;
int tileId; // Rpgmaker internal Id, used also in Wolf
int tileIdGroup; // Tile Number used to identify which tile/tilegroup the tile belongs to
int tileIdWithinGroup; // This id is to describe how the merge is done
int tileSource; // Tile id of the picture to load
int x,y;
booleanint borderLeft[NBDIRCHIPSET];
booleanint borderRight[NBDIRCHIPSET];
int nextToADoor[NBDIRCHIPSET];
booleanint shadowed [NBDIRCHIPSET];
long unsigned int uniqueTile[NBDIRCHIPSET];
tileComposition * tc;
booleanint wall;
int tileUniqueness[NBDIRCHIPSET];
int tileIdDecoration;
int uniqueDecorationId;
} tileInfo;
typedef enum {
texture,
decoration_tile,
object_unpassable,
object_passable,
object_pickable,
doors
} tileType;
std::map<int, tileInfo *> mapTI;
std::map<int, fileChipset *> tilesPresent;
int getTilePosition(tileInfo * ti) {
return ti->y * mapWidth + ti->x;
}
void caseMergeZone(tileInfo * ti, int tileId) {
int tileIdNoZone = tileId - 4000; // tileId = 4120, tileIdNoZone = 120;
ti->tileIdGroup = (tileIdNoZone / 50); // tileIdGroup = (120 / 50) = 2
ti->tileIdWithinGroup = tileIdNoZone - (ti->tileIdGroup * 50); // tileIdWithinGroup = 120 - 2 * 50 = 20
ti->tileSource = 7 + ti->tileIdGroup;
}
void caseSimpleZone(tileInfo * ti, int tileId) {
int tileIdNoZone = tileId - 5000;
ti->tileIdGroup = tileIdNoZone;
ti->tileSource = 7 + 12 + tileIdNoZone;
ti->tileIdWithinGroup = 0;
}
int translateZoneId(int tileId) {
// First zone : water
if (tileId < 1000) {
return 1;
}
// Water with border alternative
if (tileId >= 1000 && tileId < 2000) {
return 2;
}
// Deep water
if (tileId >= 2000 && tileId < 3000) {
return 3;
}
// Short tile animations
if (tileId >= 3000 && tileId < 4000) {
if (tileId >= 3000 && tileId < 3050) {
// First tile anim
return 4;
}
if (tileId >= 3050 && tileId < 3100) {
// Second tile anim
return 5;
}
if (tileId >= 3100 && tileId < 3150) {
// Third tile anim
return 6;
}
}
if (tileId >= 4000 && tileId < 5000) {
return 7;
}
if (tileId >= 5000) {
return 8;
}
}
tileInfo* fillTileInfo(int tileId) {
tileInfo * ti = new tileInfo();
int zone = translateZoneId(tileId);
ti->zone = zone;
ti->tileId = tileId;
ti->tileSource = zone; // this is true for first zones which do not work yet
if (zone == 7) {
caseMergeZone(ti, tileId);
} else if (zone == 8) {
caseSimpleZone(ti, tileId);
}
ti->wall = testWall(ti);
return ti;
}
void generatateUniqueId(tileInfo * ti, int idDir) {
int borderId = 0;
if (ti->borderLeft[idDir]) {
borderId++;
}
if (ti->borderRight[idDir]) {
borderId += 2;
}
unsigned long int uniqueTileId = 0;
unsigned long int uniqueDecorationId = 0;
if (!ti->nextToADoor[idDir] || !testWall(ti)) {
uniqueTileId += (ti->tileUniqueness[idDir]) & 0x0000000F;
uniqueTileId += (ti->tileIdWithinGroup << 1 * HEXA) & 0x00000FF0;
uniqueTileId += (ti->tileIdGroup << 3 * HEXA) & 0x0000F000;
uniqueTileId += (ti->zone << 4 * HEXA) & 0x000F0000;
uniqueTileId += (borderId << 5 * HEXA) & 0x00F00000;
uniqueTileId += (ti->tileIdDecoration << 6 * HEXA) & 0xFF000000;
} else {
uniqueTileId += (11 << 4 * HEXA) & 0x000F0000;
uniqueTileId += (ti->tileIdDecoration << 6 * HEXA) & 0xFF000000;
}
uniqueDecorationId += generateUniqueDecorationId(ti->tileUniqueness[idDir], ti->tileIdDecoration);
ti->uniqueTile[idDir]=uniqueTileId;
ti->uniqueDecorationId=uniqueDecorationId;
}
int generateUniqueDecorationId(int tileUniqueness, int tileIdDecoration) {
unsigned long int uniqueDecorationId = 0;
uniqueDecorationId += (tileUniqueness) & 0x0000000F;
uniqueDecorationId += (10 << 4 * HEXA) & 0x000F0000;
uniqueDecorationId += (tileIdDecoration << 6 * HEXA) & 0xFF000000;
return uniqueDecorationId;
}
booleanint tileExist(int tilePosition, int decallagex, int decallagey) {
booleanint isBorderLeft = false;
booleanint isBorderRight = false;
booleanint isBorderTop = false;
booleanint isBorderBottom = false;
if (tilePosition % mapWidth == 0) {
isBorderLeft = true;
}
if ((tilePosition + 1) % mapWidth == 0) {
isBorderRight = true;
}
if (tilePosition < mapWidth) {
isBorderTop = true;
}
if (tilePosition >= mapWidth * (mapHeight - 1)) {
isBorderBottom = true;
}
if (decallagex == -1) {
if (isBorderLeft) {
return false;
}
} else if (decallagex == 1) {
if (isBorderRight) {
return false;
}
}else if (decallagex == 0) {
} else {
QuitNbr("Function only works with x and y being -1,0 or 1 and x = ", decallagex);
}
if (decallagey == -1) {
if (isBorderTop) {
return false;
}
} else if (decallagey == 1) {
if (isBorderBottom) {
return false;
}
}else if (decallagey == 0) {
} else {
QuitNbr("Function only works with x and y being -1,0 or 1 and y = ", isBorderBottom);
}
return true;
}
int getDoorBottom(tileInfo * ti) {
int tilePosition = getTilePosition(ti);
tileInfo* tiBottom = NULL;
if (tileExist(tilePosition, 0, 1)) {
tiBottom = mapTI[tilePosition + mapWidth];
}
if (tiBottom && testDoor(tiBottom)) {
return tiBottom->tileIdDecoration;
} else {
return 0;
}
}
int getDoorLeft(tileInfo * ti) {
int tilePosition = getTilePosition(ti);
tileInfo* tiLeft = NULL;
if (tileExist(tilePosition, -1, 0)) {
tiLeft = mapTI[tilePosition - 1];
}
if (tiLeft && testDoor(tiLeft)) {
return tiLeft->tileIdDecoration;
} else {
return 0;
}
}
int getDoorUp(tileInfo * ti) {
int tilePosition = getTilePosition(ti);
tileInfo* tiTop = NULL;
if (tileExist(tilePosition, 0, -1)) {
tiTop = mapTI[tilePosition - mapWidth];
}
if (tiTop && testDoor(tiTop)) {
return tiTop->tileIdDecoration;
} else {
return 0;
}
}
int getDoorRight(tileInfo * ti) {
int tilePosition = getTilePosition(ti);
tileInfo* tiRight = NULL;
if (tileExist(tilePosition, 1, 0)) {
tiRight = mapTI[tilePosition + 1];
}
if (tiRight && testDoor(tiRight)) {
return tiRight->tileIdDecoration;
} else {
return 0;
}
}
booleanint testSameLeft(tileInfo * ti) {
int tilePosition = getTilePosition(ti);
tileInfo* tiLeft = NULL;
if (tileExist(tilePosition, -1, 0)) {
tiLeft = mapTI[tilePosition - 1];
}
if (tiLeft && tiLeft->tileIdGroup == ti->tileIdGroup && tiLeft->zone == ti->zone) {
return true;
} else {
return false;
}
}
booleanint testSameRight(tileInfo * ti) {
int tilePosition = getTilePosition(ti);
tileInfo* tiRight = NULL;
if (tileExist(tilePosition, 1, 0)) {
tiRight = mapTI[tilePosition + 1];
}
if (tiRight && tiRight->tileIdGroup == ti->tileIdGroup && tiRight->zone == ti->zone) {
return true;
} else {
return false;
}
}
booleanint testSameUp(tileInfo * ti) {
int tilePosition = getTilePosition(ti);
tileInfo* tiTop = NULL;
if (tileExist(tilePosition, 0, -1)) {
tiTop = mapTI[tilePosition - mapWidth];
}
if (tiTop && tiTop->tileIdGroup == ti->tileIdGroup && tiTop->zone == ti->zone) {
return true;
} else {
return false;
}
}
booleanint testSameBottom(tileInfo * ti) {
int tilePosition = getTilePosition(ti);
tileInfo* tiBottom = NULL;
if (tileExist(tilePosition, 0, 1)) {
tiBottom = mapTI[tilePosition + mapWidth];
}
if (tiBottom && tiBottom->tileIdGroup == ti->tileIdGroup && tiBottom->zone == ti->zone) {
return true;
} else {
return false;
}
}
booleanint testNoWallLeftBottom(int tilePosition) {
tileInfo* tiLeftBottom = NULL;
if (tileExist(tilePosition, -1, 1)) {
tiLeftBottom = mapTI[tilePosition - 1 + mapWidth];
return !tiLeftBottom->wall;
}
return false;
}
booleanint testNoWallRightBottom(int tilePosition) {
tileInfo* tiRightBottom = NULL;
if (tileExist(tilePosition, 1, 1)) {
tiRightBottom = mapTI[tilePosition + 1 + mapWidth];
return !tiRightBottom->wall;
}
return false;
}
booleanint testNoWallLeftUp(int tilePosition) {
tileInfo* tiLeftUp = NULL;
if (tileExist(tilePosition, -1, -1)) {
tiLeftUp = mapTI[tilePosition - 1 - mapWidth];
return !tiLeftUp->wall;
}
return false;
}
booleanint testNoWallRightUp(int tilePosition) {
tileInfo* tiRightUp = NULL;
if (tileExist(tilePosition, 1, -1)) {
tiRightUp = mapTI[tilePosition + 1 - mapWidth];
return !tiRightUp->wall;
}
return false;
}
void calculateTileSurroundings(tileInfo * ti) {
int tilePosition = getTilePosition(ti);
ti->borderLeft[0] = ti->borderRight[0] = ti->borderLeft[1] = ti->borderRight[1] =
ti->borderLeft[2] = ti->borderRight[2] = ti->borderLeft[3] = ti->borderRight[3] = false;
if (!testSameLeft(ti) || !testNoWallLeftBottom(tilePosition)) {
ti->borderLeft[0] = true;
}
testSameRight(ti);
testNoWallRightBottom(tilePosition);
if (!testSameRight(ti) || !testNoWallRightBottom(tilePosition)) {
ti->borderRight[0] = true;
}
if (!testSameUp(ti) || !testNoWallLeftUp(tilePosition)) {
ti->borderLeft[1] = true;
}
if (!testSameBottom(ti) || !testNoWallLeftBottom(tilePosition)) {
ti->borderRight[1] = true;
}
if (!testSameRight(ti) || !testNoWallRightUp(tilePosition)) {
ti->borderLeft[2] = true;
}
if (!testSameLeft(ti) || !testNoWallLeftUp(tilePosition)) {
ti->borderRight[2] = true;
}
if (!testSameBottom(ti) || !testNoWallRightBottom(tilePosition)) {
ti->borderLeft[3] = true;
}
if (!testSameUp(ti) || !testNoWallRightUp(tilePosition)) {
ti->borderRight[3] = true;
}
ti->nextToADoor[0] = getDoorBottom(ti);
ti->nextToADoor[1] = getDoorLeft(ti);
ti->nextToADoor[2] = getDoorUp(ti);
ti->nextToADoor[3] = getDoorRight(ti);
for (int idDirection = 0; idDirection <= NBDIRCHIPSET - 1; idDirection++) {
generatateUniqueId(ti, idDirection);
}
}
tileComposition * calculateTile(int tileIdWithinGroup) {
short tileUpLeft = 0;
short tileUpRight = 0;
short tileBottomLeft = 0;
short tileBottomRight = 0;
switch(tileIdWithinGroup)
{
case 0: //00 -> Case milieu
tileUpLeft = 5;
tileUpRight = 5;
tileBottomLeft = 5;
tileBottomRight = 5;
break;
case 1: //01 -> Case milieu + haut gauche transparent
tileUpLeft = 0;
tileUpRight = 5;
tileBottomLeft = 5;
tileBottomRight = 5;
break;
case 2: //02 -> Case milieu + haut droite transparent
tileUpLeft = 5;
tileUpRight = 0;
tileBottomLeft = 5;
tileBottomRight = 5;
break;
case 3: //03 -> Tout bas Case milieu + tout haut transparent
tileUpLeft = 0;
tileUpRight = 0;
tileBottomLeft = 5;
tileBottomRight = 5;
break;
case 4: //04 -> Case milieu + bas droite transparent
tileUpLeft = 5;
tileUpRight = 5;
tileBottomLeft = 5;
tileBottomRight = 0;
break;
case 5: //05 -> Case milieu haut droite + case milieu bas gauche + reste transparent
tileUpLeft = 0;
tileUpRight = 5;
tileBottomLeft = 5;
tileBottomRight = 0;
break;
case 6: //06 -> Case milieu + haut droite et bas droite transparent
tileUpLeft = 5;
tileUpRight = 0;
tileBottomLeft = 5;
tileBottomRight = 0;
break;
case 7: //07 -> case milieu + haut gauche et droite et bas droite transparent
tileUpLeft = 0;
tileUpRight = 0;
tileBottomLeft = 5;
tileBottomRight = 0;
break;
case 8: //08 -> case milieu + bas gauche transparent
tileUpLeft = 5;
tileUpRight = 5;
tileBottomLeft = 0;
tileBottomRight = 5;
break;
case 9: //09 -> case milieu droite + tout gauche transparent
tileUpLeft = 0;
tileUpRight = 5;
tileBottomLeft = 0;
tileBottomRight = 5;
break;
case 10: //10-> case milieu + haut droite + bas gauche transparent
tileUpLeft = 5;
tileUpRight = 0;
tileBottomLeft = 0;
tileBottomRight = 5;
break;
case 11: //11-> case milieu en bas droite + reste transparent
tileUpLeft = 0;
tileUpRight = 0;
tileBottomLeft = 0;
tileBottomRight = 5;
break;
case 12: //12-> case milieu + bas transparent
tileUpLeft = 5;
tileUpRight = 5;
tileBottomLeft = 0;
tileBottomRight = 0;
break;
case 13: //13-> case milieu haut droite + reste transparent
tileUpLeft = 0;
tileUpRight = 5;
tileBottomLeft = 0;
tileBottomRight = 0;
break;
case 14: //14-> case milieu gauche haut + reste transparent
tileUpLeft = 5;
tileUpRight = 0;
tileBottomLeft = 0;
tileBottomRight = 0;
break;
case 15: //15-> tout transparent
tileUpLeft = 0;
tileUpRight = 0;
tileBottomLeft = 0;
tileBottomRight = 0;
break;
case 16: //16-> case gauche
tileUpLeft = 4;
tileUpRight = 4;
tileBottomLeft = 4;
tileBottomRight = 4;
break;
case 17: //17-> case gauche + haut droite
tileUpLeft = 4;
tileUpRight = 0;
tileBottomLeft = 4;
tileBottomRight = 4;
break;
case 18: //18-> case gauche + bas droite
tileUpLeft = 4;
tileUpRight = 4;
tileBottomLeft = 4;
tileBottomRight = 0;
break;
case 19: //18-> case gauche tout gauche + transparent tout droite
tileUpLeft = 4;
tileUpRight = 0;
tileBottomLeft = 4;
tileBottomRight = 0;
break;
case 20: //20-> case haut
tileUpLeft = 8;
tileUpRight = 8;
tileBottomLeft = 8;
tileBottomRight = 8;
break;
case 21: //21-> case haut + bas droite
tileUpLeft = 8;
tileUpRight = 8;
tileBottomLeft = 8;
tileBottomRight = 0;
break;
case 22: //22-> case haut + bas gauche
tileUpLeft = 8;
tileUpRight = 8;
tileBottomLeft = 0;
tileBottomRight = 8;
break;
case 23: //23-> case haut + tout bas transparent
tileUpLeft = 8;
tileUpRight = 8;
tileBottomLeft = 0;
tileBottomRight = 0;
break;
case 24: //24-> case droite
tileUpLeft = 6;
tileUpRight = 6;
tileBottomLeft = 6;
tileBottomRight = 6;
break;
case 25: //25-> case droite + bas gauche transparent
tileUpLeft = 6;
tileUpRight = 6;
tileBottomLeft = 0;
tileBottomRight = 6;
break;
case 26: //26-> case droite + haut gauche transparent
tileUpLeft = 0;
tileUpRight = 6;
tileBottomLeft = 6;
tileBottomRight = 6;
break;
case 27: //27-> case droite + gauche
tileUpLeft = 0;
tileUpRight = 6;
tileBottomLeft = 0;
tileBottomRight = 6;
break;
case 28: //28-> case bas
tileUpLeft = 2;
tileUpRight = 2;
tileBottomLeft = 2;
tileBottomRight = 2;
break;
case 29: //29-> case bas + haut gauche
tileUpLeft = 0;
tileUpRight = 2;
tileBottomLeft = 2;
tileBottomRight = 2;
break;
case 30: //30-> case bas + haut droite
tileUpLeft = 2;
tileUpRight = 0;
tileBottomLeft = 2;
tileBottomRight = 2;
break;
case 31: //31-> case bas + haut
tileUpLeft = 0;
tileUpRight = 0;
tileBottomLeft = 2;
tileBottomRight = 2;
break;
case 32: //32-> case gauche + case droite
tileUpLeft = 4;
tileUpRight = 6;
tileBottomLeft = 4;
tileBottomRight = 6;
break;
case 33: //33-> case haut tout haut case bas tout le bas
tileUpLeft = 8;
tileUpRight = 8;
tileBottomLeft = 2;
tileBottomRight = 2;
break;
case 34: //34-> case haut gauche
tileUpLeft = 7;
tileUpRight = 7;
tileBottomLeft = 7;
tileBottomRight = 7;
break;
case 35: //35-> case haut gauche sauf bas droite transparent
tileUpLeft = 7;
tileUpRight = 7;
tileBottomLeft = 7;
tileBottomRight = 0;
break;
case 36: //36-> case haut droite
tileUpLeft = 9;
tileUpRight = 9;
tileBottomLeft = 9;
tileBottomRight = 9;
break;
case 37: //37-> case haut droite + bas gauche transparent
tileUpLeft = 9;
tileUpRight = 9;
tileBottomLeft = 0;
tileBottomRight = 9;
break;
case 38: //38-> case bas droite
tileUpLeft = 3;
tileUpRight = 3;
tileBottomLeft = 3;
tileBottomRight = 3;
break;
case 39: //39-> case bas gauche + haut gauche transparent
tileUpLeft = 0;
tileUpRight = 3;
tileBottomLeft = 3;
tileBottomRight = 3;
break;
case 40: //40-> case bas gauche
tileUpLeft = 1;
tileUpRight = 1;
tileBottomLeft = 1;
tileBottomRight = 1;
break;
case 41: //41-> case bas gauche + haut droit transparent
tileUpLeft = 1;
tileUpRight = 0;
tileBottomLeft = 1;
tileBottomRight = 1;
break;
case 42: //42-> case haut gauche tout gauche, case haut droite tout droite
tileUpLeft = 7;
tileUpRight = 9;
tileBottomLeft = 7;
tileBottomRight = 9;
break;
case 43: //43-> case haut gauche tout haut, case bas gauche tout bas
tileUpLeft = 7;
tileUpRight = 7;
tileBottomLeft = 1;
tileBottomRight = 1;
break;
case 44: //44-> case bas gauche tout gauche, case bas droite tout droite
tileUpLeft = 1;
tileUpRight = 3;
tileBottomLeft = 1;
tileBottomRight = 3;
break;
case 45: //45-> case haut droite tout haut, case bas droite tout bas
tileUpLeft = 9;
tileUpRight = 9;
tileBottomLeft = 3;
tileBottomRight = 3;
break;
case 46: //46-> case haut droite + case haut gauche + case bas gauche + case bas droite
tileUpLeft = 7;
tileUpRight = 9;
tileBottomLeft = 1;
tileBottomRight = 3;
break;
default:
QuitNbr("Fail to guess tile ti->tileIdWithinGroup ", tileIdWithinGroup);
return NULL;
break;
}
tileComposition * tc = new tileComposition();
tc->tileUpLeft = tileUpLeft;
tc->tileUpRight = tileUpRight;
tc->tileBottomLeft = tileBottomLeft;
tc->tileBottomRight = tileBottomRight;
return tc;
}