MCPcopy Create free account
hub / github.com/OpenDungeons/OpenDungeons / takeDamage

Method takeDamage

source/entities/Building.cpp:262–308  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

260}
261
262double 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
310std::string Building::getNameTile(Tile* tile)
311{

Callers

nothing calls this directly

Calls 2

playerIsFightingMethod · 0.80
getPlayerMethod · 0.45

Tested by

no test coverage detected