| 260 | } |
| 261 | |
| 262 | double Building::takeDamage(GameEntity* attacker, double absoluteDamage, double physicalDamage, double magicalDamage, double elementDamage, |
| 263 | Tile *tileTakingDamage, bool ko) |
| 264 | { |
| 265 | auto it = mTileData.find(tileTakingDamage); |
| 266 | if(it == mTileData.end()) |
| 267 | { |
| 268 | OD_LOG_ERR("building=" + getName() + ", tile=" + Tile::displayAsString(tileTakingDamage)); |
| 269 | return 0.0; |
| 270 | } |
| 271 | |
| 272 | TileData* tileData = it->second; |
| 273 | double def; |
| 274 | def = getPhysicalDefense(); |
| 275 | physicalDamage = (def > physicalDamage ? 0.0 : physicalDamage - def); |
| 276 | |
| 277 | def = getMagicalDefense(); |
| 278 | magicalDamage = (def > magicalDamage ? 0.0 : magicalDamage - def); |
| 279 | |
| 280 | def = getElementDefense(); |
| 281 | elementDamage = (def > elementDamage ? 0.0 : elementDamage - def); |
| 282 | |
| 283 | double damageDone = std::min(tileData->mHP, absoluteDamage + physicalDamage + magicalDamage + elementDamage); |
| 284 | tileData->mHP -= damageDone; |
| 285 | |
| 286 | // We check if the building is still alive |
| 287 | bool isAlive = false; |
| 288 | for (std::pair<Tile* const, TileData*>& p : mTileData) |
| 289 | { |
| 290 | if (p.second->mHP <= 0.0) |
| 291 | continue; |
| 292 | |
| 293 | isAlive = true; |
| 294 | break; |
| 295 | } |
| 296 | |
| 297 | if(!isAlive) |
| 298 | fireEntityDead(); |
| 299 | |
| 300 | Player* player = getSeat()->getPlayer(); |
| 301 | if (player == nullptr) |
| 302 | return damageDone; |
| 303 | |
| 304 | // Tells the server game map the player is under attack. |
| 305 | getGameMap()->playerIsFighting(player, tileTakingDamage); |
| 306 | |
| 307 | return damageDone; |
| 308 | } |
| 309 | |
| 310 | std::string Building::getNameTile(Tile* tile) |
| 311 | { |
nothing calls this directly
no test coverage detected