/* * geometry of zone needs to be set after */ zone654 *zone_add_item(desk654 *desk, zone654 *head, int level) { if (!desk || !head || desk->nb_max_zones <= desk->nb_zones || desk->nb_max_level <= level) { FOG("Add zone failed, bad parameters"); return NULL; } // zone654 *zone = &desk->zones[desk->nb_zones]; // @@@ zone->pties.flags = PLAIN_MASK650; // zone->links.key = desk->nb_zones; zone->links.flags = 0; zone->links.header = NULL; // @@@ // zone->pties.posr.x = 0; zone->pties.posr.y = 0; zone->pties.dim.width = 0; zone->pties.dim.height = 0; // zone->links.head = head; zone->links.items = NULL; zone->links.prev = NULL; zone->links.next = head->links.items; if (head->links.items) head->links.items->links.prev = zone; head->links.items = zone; // zone->links.level = &desk->levels[level]; zone->links.down = zone->links.level->last; if (zone->links.level->last) zone->links.level->last->links.up = zone; zone->links.up = NULL; // desk->nb_zones++; // return zone; }
void TileMap::DrawFogOfWar(ieByte* explored_mask, ieByte* visible_mask, Region viewport) { // viewport - pos & size of the control int w = XCellCount * CELL_RATIO; int h = YCellCount * CELL_RATIO; if (LargeMap) { w++; h++; } Color black = { 0, 0, 0, 255 }; Video* vid = core->GetVideoDriver(); Region vp = vid->GetViewport(); vp.w = viewport.w; vp.h = viewport.h; if (( vp.x + vp.w ) > w * CELL_SIZE) { vp.x = ( w * CELL_SIZE - vp.w ); } if (vp.x < 0) { vp.x = 0; } if (( vp.y + vp.h ) > h * CELL_SIZE) { vp.y = ( h * CELL_SIZE - vp.h ); } if (vp.y < 0) { vp.y = 0; } int sx = ( vp.x ) / CELL_SIZE; int sy = ( vp.y ) / CELL_SIZE; int dx = sx + vp.w / CELL_SIZE + 2; int dy = sy + vp.h / CELL_SIZE + 2; int x0 = sx * CELL_SIZE - vp.x; int y0 = sy * CELL_SIZE - vp.y; if (LargeMap) { x0 -= CELL_SIZE / 2; y0 -= CELL_SIZE / 2; dx++; dy++; } for (int y = sy; y < dy && y < h; y++) { for (int x = sx; x < dx && x < w; x++) { Region r = Region(x0 + viewport.x + ( (x - sx) * CELL_SIZE ), y0 + viewport.y + ( (y - sy) * CELL_SIZE ), CELL_SIZE, CELL_SIZE); if (! IS_EXPLORED( x, y )) { // Unexplored tiles are all black vid->DrawRect(r, black, true, true); continue; // Don't draw 'invisible' fog } else { // If an explored tile is adjacent to an // unexplored one, we draw border sprite // (gradient black <-> transparent) // Tiles in four cardinal directions have these // values. // // 1 // 2 8 // 4 // // Values of those unexplored are // added together, the resulting number being // an index of shadow sprite to use. For now, // some tiles are made 'on the fly' by // drawing two or more tiles int e = ! IS_EXPLORED( x, y - 1); if (! IS_EXPLORED( x - 1, y )) e |= 2; if (! IS_EXPLORED( x, y + 1 )) e |= 4; if (! IS_EXPLORED( x + 1, y )) e |= 8; switch (e) { case 1: case 2: case 3: case 4: case 6: case 8: case 9: case 12: FOG( e ); break; case 5: FOG( 1 ); FOG( 4 ); break; case 7: FOG( 3 ); FOG( 6 ); break; case 10: FOG( 2 ); FOG( 8 ); break; case 11: FOG( 3 ); FOG( 9 ); break; case 13: FOG( 9 ); FOG( 12 ); break; case 14: FOG( 6 ); FOG( 12 ); break; case 15: //this is black too vid->DrawRect(r, black, true, true); break; } } if (! IS_VISIBLE( x, y )) { // Invisible tiles are all gray FOG( 16 ); continue; // Don't draw 'invisible' fog } else { // If a visible tile is adjacent to an // invisible one, we draw border sprite // (gradient gray <-> transparent) // Tiles in four cardinal directions have these // values. // // 1 // 2 8 // 4 // // Values of those invisible are // added together, the resulting number being // an index of shadow sprite to use. For now, // some tiles are made 'on the fly' by // drawing two or more tiles int e = ! IS_VISIBLE( x, y - 1); if (! IS_VISIBLE( x - 1, y )) e |= 2; if (! IS_VISIBLE( x, y + 1 )) e |= 4; if (! IS_VISIBLE( x + 1, y )) e |= 8; switch (e) { case 1: case 2: case 3: case 4: case 6: case 8: case 9: case 12: FOG( 16 + e ); break; case 5: FOG( 16 + 1 ); FOG( 16 + 4 ); break; case 7: FOG( 16 + 3 ); FOG( 16 + 6 ); break; case 10: FOG( 16 + 2 ); FOG( 16 + 8 ); break; case 11: FOG( 16 + 3 ); FOG( 16 + 9 ); break; case 13: FOG( 16 + 9 ); FOG( 16 + 12 ); break; case 14: FOG( 16 + 6 ); FOG( 16 + 12 ); break; case 15: //this is unseen too FOG( 16 ); break; } } } } }