static void DrawLOSPic( const Tile *tile, const Pic *pic, const struct vec2i pos, const bool useFog) { color_t mask = colorWhite; switch (GetTileLOS(tile, useFog)) { case TILE_LOS_NORMAL: break; case TILE_LOS_FOG: mask = colorFog; break; case TILE_LOS_NONE: default: // don't draw pic = NULL; break; } if (pic != NULL) { PicRender( pic, gGraphicsDevice.gameWindow.renderer, pos, mask, 0, svec2_one() ); } }
static void DrawFloor(DrawBuffer *b, Vec2i offset) { int x, y; Vec2i pos; const Tile *tile = &b->tiles[0][0]; const bool useFog = ConfigGetBool(&gConfig, "Game.Fog"); for (y = 0, pos.y = b->dy + offset.y; y < Y_TILES; y++, pos.y += TILE_HEIGHT) { for (x = 0, pos.x = b->dx + offset.x; x < b->Size.x; x++, tile++, pos.x += TILE_WIDTH) { if (tile->pic != NULL && tile->pic->pic.Data != NULL && !(tile->flags & MAPTILE_IS_WALL)) { switch (GetTileLOS(tile, useFog)) { case TILE_LOS_NORMAL: Blit(&gGraphicsDevice, &tile->pic->pic, pos); break; case TILE_LOS_FOG: BlitMasked( &gGraphicsDevice, &tile->pic->pic, pos, colorFog, false); break; case TILE_LOS_NONE: default: // don't draw break; } } } tile += X_TILES - b->Size.x; } }
void DrawWallColumn(int y, Vec2i pos, Tile *tile) { const bool useFog = ConfigGetBool(&gConfig, "Game.Fog"); while (y >= 0 && (tile->flags & MAPTILE_IS_WALL)) { switch (GetTileLOS(tile, useFog)) { case TILE_LOS_NORMAL: Blit(&gGraphicsDevice, &tile->pic->pic, pos); break; case TILE_LOS_FOG: BlitMasked(&gGraphicsDevice, &tile->pic->pic, pos, colorFog, false); break; case TILE_LOS_NONE: default: // don't draw anything break; } pos.y -= TILE_HEIGHT; tile -= X_TILES; y--; } }
static void DrawWallsAndThings(DrawBuffer *b, Vec2i offset) { Vec2i pos; Tile *tile = &b->tiles[0][0]; pos.y = b->dy + WALL_OFFSET_Y + offset.y; const bool useFog = ConfigGetBool(&gConfig, "Game.Fog"); for (int y = 0; y < Y_TILES; y++, pos.y += TILE_HEIGHT) { CArrayClear(&b->displaylist); pos.x = b->dx + offset.x; for (int x = 0; x < b->Size.x; x++, tile++, pos.x += TILE_WIDTH) { if (tile->flags & MAPTILE_IS_WALL) { if (!(tile->flags & MAPTILE_DELAY_DRAW)) { DrawWallColumn(y, pos, tile); } } else if (tile->flags & MAPTILE_OFFSET_PIC) { // Drawing doors // Doors may be offset; vertical doors are drawn centered // horizontal doors are bottom aligned Vec2i doorPos = pos; doorPos.x += (TILE_WIDTH - tile->picAlt->pic.size.x) / 2; if (tile->picAlt->pic.size.y > 16) { doorPos.y += TILE_HEIGHT - (tile->picAlt->pic.size.y % TILE_HEIGHT); } switch (GetTileLOS(tile, useFog)) { case TILE_LOS_NORMAL: Blit(&gGraphicsDevice, &tile->picAlt->pic, doorPos); break; case TILE_LOS_FOG: BlitMasked( &gGraphicsDevice, &tile->picAlt->pic, doorPos, colorFog, false); break; case TILE_LOS_NONE: default: // don't draw anything break; } } // Draw the items that are in LOS if (tile->flags & MAPTILE_OUT_OF_SIGHT) { continue; } CA_FOREACH(ThingId, tid, tile->things) const TTileItem *ti = ThingIdGetTileItem(tid); // Drawn later if (TileItemDrawLast(ti)) { continue; } CArrayPushBack(&b->displaylist, &ti); CA_FOREACH_END() } DrawBufferSortDisplayList(b); CA_FOREACH(const TTileItem *, tp, b->displaylist) DrawThing(b, *tp, offset); CA_FOREACH_END() tile += X_TILES - b->Size.x; } }