/** ** Draw fog of war tile. ** ** @param sx Offset into fields to current tile. ** @param sy Start of the current row. ** @param dx X position into video memory. ** @param dy Y position into video memory. */ static void DrawFogOfWarTile(int sx, int sy, int dx, int dy) { int fogTile = 0; int blackFogTile = 0; GetFogOfWarTile(sx, sy, &fogTile, &blackFogTile); if (IsMapFieldVisibleTable(sx) || ReplayRevealMap) { if (fogTile && fogTile != blackFogTile) { #if defined(USE_OPENGL) || defined(USE_GLES) if (UseOpenGL) { Map.FogGraphic->DrawFrameClipTrans(fogTile, dx, dy, FogOfWarOpacity); } else #endif { AlphaFogG->DrawFrameClip(fogTile, dx, dy); } } } else { VideoDrawOnlyFog(dx, dy); } if (blackFogTile) { Map.FogGraphic->DrawFrameClip(blackFogTile, dx, dy); } #undef IsMapFieldExploredTable #undef IsMapFieldVisibleTable }
static void GetFogOfWarTile(int sx, int sy, int *fogTile, int *blackFogTile) { #define IsMapFieldExploredTable(index) (VisibleTable[(index)]) #define IsMapFieldVisibleTable(index) (VisibleTable[(index)] > 1) int w = Map.Info.MapWidth; int fogTileIndex = 0; int blackFogTileIndex = 0; int x = sx - sy; if (ReplayRevealMap) { *fogTile = 0; *blackFogTile = 0; return; } // // Which Tile to draw for fog // // Investigate tiles around current tile // 1 2 3 // 4 * 5 // 6 7 8 // 2 3 1 // 10 ** 5 // 8 12 4 if (sy) { unsigned int index = sy - Map.Info.MapWidth;//(y-1) * Map.Info.MapWidth; if (sx != sy) { //if (!IsMapFieldExploredTable(x - 1, y - 1)) { if (!IsMapFieldExploredTable(x - 1 + index)) { blackFogTileIndex |= 2; fogTileIndex |= 2; //} else if (!IsMapFieldVisibleTable(x - 1, y - 1)) { } else if (!IsMapFieldVisibleTable(x - 1 + index)) { fogTileIndex |= 2; } } //if (!IsMapFieldExploredTable(x, y - 1)) { if (!IsMapFieldExploredTable(x + index)) { blackFogTileIndex |= 3; fogTileIndex |= 3; //} else if (!IsMapFieldVisibleTable(x, y - 1)) { } else if (!IsMapFieldVisibleTable(x + index)) { fogTileIndex |= 3; } if (sx != sy + w - 1) { //if (!IsMapFieldExploredTable(x + 1, y - 1)) { if (!IsMapFieldExploredTable(x + 1 + index)) { blackFogTileIndex |= 1; fogTileIndex |= 1; //} else if (!IsMapFieldVisibleTable(x + 1, y - 1)) { } else if (!IsMapFieldVisibleTable(x + 1 + index)) { fogTileIndex |= 1; } } } if (sx != sy) { unsigned int index = sy;//(y) * Map.Info.MapWidth; //if (!IsMapFieldExploredTable(x - 1, y)) { if (!IsMapFieldExploredTable(x - 1 + index)) { blackFogTileIndex |= 10; fogTileIndex |= 10; //} else if (!IsMapFieldVisibleTable(x - 1, y)) { } else if (!IsMapFieldVisibleTable(x - 1 + index)) { fogTileIndex |= 10; } } if (sx != sy + w - 1) { unsigned int index = sy;//(y) * Map.Info.MapWidth; //if (!IsMapFieldExploredTable(x + 1, y)) { if (!IsMapFieldExploredTable(x + 1 + index)) { blackFogTileIndex |= 5; fogTileIndex |= 5; //} else if (!IsMapFieldVisibleTable(x + 1, y)) { } else if (!IsMapFieldVisibleTable(x + 1 + index)) { fogTileIndex |= 5; } } if (sy + w < Map.Info.MapHeight * w) { unsigned int index = sy + Map.Info.MapWidth;//(y+1) * Map.Info.MapWidth; if (sx != sy) { //if (!IsMapFieldExploredTable(x - 1, y + 1)) { if (!IsMapFieldExploredTable(x - 1 + index)) { blackFogTileIndex |= 8; fogTileIndex |= 8; //} else if (!IsMapFieldVisibleTable(x - 1, y + 1)) { } else if (!IsMapFieldVisibleTable(x - 1 + index)) { fogTileIndex |= 8; } } //if (!IsMapFieldExploredTable(x, y + 1)) { if (!IsMapFieldExploredTable(x + index)) { blackFogTileIndex |= 12; fogTileIndex |= 12; //} else if (!IsMapFieldVisibleTable(x, y + 1)) { } else if (!IsMapFieldVisibleTable(x + index)) { fogTileIndex |= 12; } if (sx != sy + w - 1) { //if (!IsMapFieldExploredTable(x + 1, y + 1)) { if (!IsMapFieldExploredTable(x + 1 + index)) { blackFogTileIndex |= 4; fogTileIndex |= 4; //} else if (!IsMapFieldVisibleTable(x + 1, y + 1)) { } else if (!IsMapFieldVisibleTable(x + 1 + index)) { fogTileIndex |= 4; } } } *fogTile = FogTable[fogTileIndex]; *blackFogTile = FogTable[blackFogTileIndex]; }
//Wyrmgus start //static void GetFogOfWarTile(int sx, int sy, int *fogTile, int *blackFogTile) static void GetFogOfWarTile(int sx, int sy, int *fogTile, int *blackFogTile, int z) //Wyrmgus end { //Wyrmgus start //#define IsMapFieldExploredTable(index) (VisibleTable[(index)]) //#define IsMapFieldVisibleTable(index) (VisibleTable[(index)] > 1) #define IsMapFieldExploredTable(index, layer) (VisibleTable[(layer)][(index)]) #define IsMapFieldVisibleTable(index, layer) (VisibleTable[(layer)][(index)] > 1) //Wyrmgus end //Wyrmgus start // int w = Map.Info.MapWidth; int w = Map.Info.MapWidths[z]; //Wyrmgus end int fogTileIndex = 0; int blackFogTileIndex = 0; int x = sx - sy; if (ReplayRevealMap) { *fogTile = 0; *blackFogTile = 0; return; } // // Which Tile to draw for fog // // Investigate tiles around current tile // 1 2 3 // 4 * 5 // 6 7 8 // 2 3 1 // 10 ** 5 // 8 12 4 if (sy) { //Wyrmgus start // unsigned int index = sy - Map.Info.MapWidth;//(y-1) * Map.Info.MapWidth; unsigned int index = sy - Map.Info.MapWidths[z];//(y-1) * Map.Info.MapWidth; //Wyrmgus end if (sx != sy) { //if (!IsMapFieldExploredTable(x - 1, y - 1)) { //Wyrmgus start // if (!IsMapFieldExploredTable(x - 1 + index)) { if (!IsMapFieldExploredTable(x - 1 + index, z)) { //Wyrmgus end blackFogTileIndex |= 2; fogTileIndex |= 2; //} else if (!IsMapFieldVisibleTable(x - 1, y - 1)) { //Wyrmgus start // } else if (!IsMapFieldVisibleTable(x - 1 + index)) { } else if (!IsMapFieldVisibleTable(x - 1 + index, z)) { //Wyrmgus end fogTileIndex |= 2; } } //if (!IsMapFieldExploredTable(x, y - 1)) { //Wyrmgus start // if (!IsMapFieldExploredTable(x + index)) { if (!IsMapFieldExploredTable(x + index, z)) { //Wyrmgus end blackFogTileIndex |= 3; fogTileIndex |= 3; //} else if (!IsMapFieldVisibleTable(x, y - 1)) { //Wyrmgus start // } else if (!IsMapFieldVisibleTable(x + index)) { } else if (!IsMapFieldVisibleTable(x + index, z)) { //Wyrmgus end fogTileIndex |= 3; } if (sx != sy + w - 1) { //if (!IsMapFieldExploredTable(x + 1, y - 1)) { //Wyrmgus start // if (!IsMapFieldExploredTable(x + 1 + index)) { if (!IsMapFieldExploredTable(x + 1 + index, z)) { //Wyrmgus end blackFogTileIndex |= 1; fogTileIndex |= 1; //} else if (!IsMapFieldVisibleTable(x + 1, y - 1)) { //Wyrmgus start // } else if (!IsMapFieldVisibleTable(x + 1 + index)) { } else if (!IsMapFieldVisibleTable(x + 1 + index, z)) { //Wyrmgus end fogTileIndex |= 1; } } } if (sx != sy) { unsigned int index = sy;//(y) * Map.Info.MapWidth; //if (!IsMapFieldExploredTable(x - 1, y)) { //Wyrmgus start // if (!IsMapFieldExploredTable(x - 1 + index)) { if (!IsMapFieldExploredTable(x - 1 + index, z)) { //Wyrmgus end blackFogTileIndex |= 10; fogTileIndex |= 10; //} else if (!IsMapFieldVisibleTable(x - 1, y)) { //Wyrmgus start // } else if (!IsMapFieldVisibleTable(x - 1 + index)) { } else if (!IsMapFieldVisibleTable(x - 1 + index, z)) { //Wyrmgus end fogTileIndex |= 10; } } if (sx != sy + w - 1) { unsigned int index = sy;//(y) * Map.Info.MapWidth; //if (!IsMapFieldExploredTable(x + 1, y)) { //Wyrmgus start // if (!IsMapFieldExploredTable(x + 1 + index)) { if (!IsMapFieldExploredTable(x + 1 + index, z)) { //Wyrmgus end blackFogTileIndex |= 5; fogTileIndex |= 5; //} else if (!IsMapFieldVisibleTable(x + 1, y)) { //Wyrmgus start // } else if (!IsMapFieldVisibleTable(x + 1 + index)) { } else if (!IsMapFieldVisibleTable(x + 1 + index, z)) { //Wyrmgus end fogTileIndex |= 5; } } //Wyrmgus start // if (sy + w < Map.Info.MapHeight * w) { if (sy + w < Map.Info.MapHeights[z] * w) { //Wyrmgus end //Wyrmgus start // unsigned int index = sy + Map.Info.MapWidth;//(y+1) * Map.Info.MapWidth; unsigned int index = sy + Map.Info.MapWidths[z];//(y+1) * Map.Info.MapWidth; //Wyrmgus end if (sx != sy) { //if (!IsMapFieldExploredTable(x - 1, y + 1)) { //Wyrmgus start // if (!IsMapFieldExploredTable(x - 1 + index)) { if (!IsMapFieldExploredTable(x - 1 + index, z)) { //Wyrmgus end blackFogTileIndex |= 8; fogTileIndex |= 8; //} else if (!IsMapFieldVisibleTable(x - 1, y + 1)) { //Wyrmgus start // } else if (!IsMapFieldVisibleTable(x - 1 + index)) { } else if (!IsMapFieldVisibleTable(x - 1 + index, z)) { //Wyrmgus end fogTileIndex |= 8; } } //if (!IsMapFieldExploredTable(x, y + 1)) { //Wyrmgus start // if (!IsMapFieldExploredTable(x + index)) { if (!IsMapFieldExploredTable(x + index, z)) { //Wyrmgus end blackFogTileIndex |= 12; fogTileIndex |= 12; //} else if (!IsMapFieldVisibleTable(x, y + 1)) { //Wyrmgus start // } else if (!IsMapFieldVisibleTable(x + index)) { } else if (!IsMapFieldVisibleTable(x + index, z)) { //Wyrmgus end fogTileIndex |= 12; } if (sx != sy + w - 1) { //if (!IsMapFieldExploredTable(x + 1, y + 1)) { //Wyrmgus start // if (!IsMapFieldExploredTable(x + 1 + index)) { if (!IsMapFieldExploredTable(x + 1 + index, z)) { //Wyrmgus end blackFogTileIndex |= 4; fogTileIndex |= 4; //} else if (!IsMapFieldVisibleTable(x + 1, y + 1)) { //Wyrmgus start // } else if (!IsMapFieldVisibleTable(x + 1 + index)) { } else if (!IsMapFieldVisibleTable(x + 1 + index, z)) { //Wyrmgus end fogTileIndex |= 4; } } } //Wyrmgus start // *fogTile = FogTable[fogTileIndex]; // *blackFogTile = FogTable[blackFogTileIndex]; //apply variation according to tile index (sx is equal to the tile index, so let's use it) int FogTileVariation = 0; if (sx % 3 == 0 && Map.FogGraphic->Surface->h / 32 >= 3) { FogTileVariation = 2; } else if (sx % 2 == 0 && Map.FogGraphic->Surface->h / 32 >= 2) { FogTileVariation = 1; } if (FogTable[fogTileIndex] && FogTable[fogTileIndex] != 16) { *fogTile = FogTable[fogTileIndex] + (FogTileVariation * 16); } else { *fogTile = FogTable[fogTileIndex]; } if (FogTable[blackFogTileIndex] && FogTable[blackFogTileIndex] != 16) { *blackFogTile = FogTable[blackFogTileIndex] + (FogTileVariation * 16); } else { *blackFogTile = FogTable[blackFogTileIndex]; } //Wyrmgus end }