void MapGui::renderExtraBorders(Renderer& renderer, int currentTimeReal) { extraBorderPos.clear(); for (Vec2 wpos : layout->getAllTiles(getBounds(), levelBounds, getScreenPos())) if (objects[wpos] && objects[wpos]->hasObject(ViewLayer::FLOOR_BACKGROUND)) { ViewId viewId = objects[wpos]->getObject(ViewLayer::FLOOR_BACKGROUND).id(); if (Tile::getTile(viewId, true).hasExtraBorders()) for (Vec2 v : wpos.neighbors4()) if (v.inRectangle(extraBorderPos.getBounds())) { if (extraBorderPos.isDirty(v)) extraBorderPos.getDirtyValue(v).push_back(viewId); else extraBorderPos.setValue(v, {viewId}); } } for (Vec2 wpos : layout->getAllTiles(getBounds(), levelBounds, getScreenPos())) for (ViewId id : extraBorderPos.getValue(wpos)) { const Tile& tile = Tile::getTile(id, true); for (ViewId underId : tile.getExtraBorderIds()) if (connectionMap.has(wpos, underId)) { DirSet dirs = 0; for (Vec2 v : Vec2::directions4()) if ((wpos + v).inRectangle(levelBounds) && connectionMap.has(wpos + v, id)) dirs.insert(v.getCardinalDir()); if (auto coord = tile.getExtraBorderCoord(dirs)) { Vec2 pos = projectOnScreen(wpos, currentTimeReal); renderer.drawTile(pos, *coord, layout->getSquareSize()); } } } }
void MapGui::drawFoWSprite(Renderer& renderer, Vec2 pos, Vec2 size, DirSet dirs) { const Tile& tile = Tile::getTile(ViewId::FOG_OF_WAR, true); const Tile& tile2 = Tile::getTile(ViewId::FOG_OF_WAR_CORNER, true); static DirSet fourDirs = DirSet({Dir::N, Dir::S, Dir::E, Dir::W}); auto coord = tile.getSpriteCoord(dirs & fourDirs); renderer.drawTile(pos, coord, size); for (Dir dir : dirs.intersection(fourDirs.complement())) { static DirSet ne({Dir::N, Dir::E}); static DirSet se({Dir::S, Dir::E}); static DirSet nw({Dir::N, Dir::W}); static DirSet sw({Dir::S, Dir::W}); switch (dir) { case Dir::NE: if (!dirs.contains(ne)) continue; case Dir::SE: if (!dirs.contains(se)) continue; case Dir::NW: if (!dirs.contains(nw)) continue; case Dir::SW: if (!dirs.contains(sw)) continue; default: break; } renderer.drawTile(pos, tile2.getSpriteCoord(DirSet::oneElement(dir)), size); } }
void PrunePath() { RegPath path( UseSys ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER ); typedef std::set <string> DirSet; DirSet uniq; std::vector <string> ordered; for ( unsigned int i = 0; i < path.Count(); i++ ) { string dir = path.At( i ); std::pair<DirSet::iterator, bool> ok = uniq.insert( dir ); if ( ok.second ) { ordered.push_back( dir ); } else { cout << "Pruned: " << dir << endl; } } string entry; for ( unsigned int i = 0; i < ordered.size(); i++ ) { string dir = ExpandPath( ordered[i] ); DWORD attr = GetFileAttributes( dir.c_str() ); if ( attr == INVALID_FILE_ATTRIBUTES || ! (attr & FILE_ATTRIBUTE_DIRECTORY ) ) { cout << "Pruned: " << ConvertSep( ordered[i] ) << endl; } else { if ( entry != "" ) { entry += ";"; } entry += ordered[i]; } } path.ReplaceAll( entry ); NotifyChanges(); std::cout << ConvertSep( entry ) << std::endl; }
void MapGui::drawObjectAbs(Renderer& renderer, Vec2 pos, const ViewObject& object, Vec2 size, Vec2 tilePos, int curTimeReal, const EnumMap<HighlightType, double>& highlightMap) { const Tile& tile = Tile::getTile(object.id(), spriteMode); Color color = Renderer::getBleedingColor(object); if (object.hasModifier(ViewObject::Modifier::INVISIBLE) || object.hasModifier(ViewObject::Modifier::HIDDEN)) color = transparency(color, 70); else if (tile.translucent > 0) color = transparency(color, 255 * (1 - tile.translucent)); else if (object.hasModifier(ViewObject::Modifier::ILLUSION)) color = transparency(color, 150); if (object.hasModifier(ViewObject::Modifier::PLANNED)) color = transparency(color, 100); double waterDepth = object.getAttribute(ViewObject::Attribute::WATER_DEPTH); if (waterDepth > 0) { int val = max(0.0, 255.0 - min(2.0, waterDepth) * 60); color = Color(val, val, val); } if (spriteMode && tile.hasSpriteCoord()) { DirSet dirs; DirSet borderDirs; if (auto connectionId = getConnectionId(object)) for (Vec2 dir : getConnectionDirs(object.id())) { if ((tilePos + dir).inRectangle(levelBounds) && connectionMap.has(tilePos + dir, *connectionId)) dirs.insert(dir.getCardinalDir()); else borderDirs.insert(dir.getCardinalDir()); } Vec2 move; Vec2 movement = getMovementOffset(object, size, currentTimeGame, curTimeReal); drawCreatureHighlights(renderer, object, pos + movement, size, curTimeReal); if ((object.layer() == ViewLayer::CREATURE && object.id() != ViewId::BOULDER) || object.hasModifier(ViewObject::Modifier::ROUND_SHADOW)) { static auto coord = renderer.getTileCoord("round_shadow"); renderer.drawTile(pos + movement, coord, size, sf::Color(255, 255, 255, 160)); move.y = -4* size.y / renderer.getNominalSize().y; } static auto shortShadow = renderer.getTileCoord("short_shadow"); if (auto background = tile.getBackgroundCoord()) { renderer.drawTile(pos, *background, size, color); if (shadowed.count(tilePos)) renderer.drawTile(pos, shortShadow, size, sf::Color(255, 255, 255, 170)); } if (auto dir = object.getAttachmentDir()) move = getAttachmentOffset(*dir, size); move += movement; if (mirrorSprite(object.id())) renderer.drawTile(pos + move, tile.getSpriteCoord(dirs), size, color, object.getPositionHash() % 2, object.getPositionHash() % 4 > 1); else renderer.drawTile(pos + move, tile.getSpriteCoord(dirs), size, color); if (object.layer() == ViewLayer::FLOOR && highlightMap[HighlightType::CUT_TREE] > 0) if (auto coord = tile.getHighlightCoord()) renderer.drawTile(pos + move, *coord, size, color); if (!buttonViewId) if (auto id = object.getCreatureId()) creatureMap.push_back(CreatureInfo{Rectangle(pos + move, pos + move + size), *id, object.id()}); if (tile.hasCorners()) { for (auto coord : tile.getCornerCoords(dirs)) renderer.drawTile(pos + move, coord, size, color); } /* if (tile.floorBorders) { drawFloorBorders(renderer, borderDirs, x, y); }*/ if ((object.layer() == ViewLayer::FLOOR || object.layer() == ViewLayer::FLOOR_BACKGROUND) && shadowed.count(tilePos) && !tile.noShadow) renderer.drawTile(pos, shortShadow, size, sf::Color(255, 255, 255, 170)); if (object.getAttribute(ViewObject::Attribute::BURNING) > 0) { static auto fire1 = renderer.getTileCoord("fire1"); static auto fire2 = renderer.getTileCoord("fire2"); renderer.drawTile(pos, Random.choose({fire1, fire2}), size); } static auto key = renderer.getTileCoord("key"); if (object.hasModifier(ViewObject::Modifier::LOCKED)) renderer.drawTile(pos, key, size); } else { Vec2 movement = getMovementOffset(object, size, currentTimeGame, curTimeReal); Vec2 tilePos = pos + movement + Vec2(size.x / 2, -3); drawCreatureHighlights(renderer, object, pos, size, curTimeReal); renderer.drawText(tile.symFont ? Renderer::SYMBOL_FONT : Renderer::TILE_FONT, size.y, Tile::getColor(object), tilePos.x, tilePos.y, tile.text, Renderer::HOR); if (!buttonViewId) if (auto id = object.getCreatureId()) creatureMap.push_back(CreatureInfo{Rectangle(tilePos, tilePos + size), *id, object.id()}); double burningVal = object.getAttribute(ViewObject::Attribute::BURNING); if (burningVal > 0) { renderer.drawText(Renderer::SYMBOL_FONT, size.y, getFireColor(), pos.x + size.x / 2, pos.y - 3, L'ѡ', Renderer::HOR); if (burningVal > 0.5) renderer.drawText(Renderer::SYMBOL_FONT, size.y, getFireColor(), pos.x + size.x / 2, pos.y - 3, L'Ѡ', Renderer::HOR); } } }