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

Method takeDamage

source/entities/Creature.cpp:1971–2029  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1969}
1970
1971double Creature::takeDamage(GameEntity* attacker, double absoluteDamage, double physicalDamage, double magicalDamage, double elementDamage,
1972 Tile *tileTakingDamage, bool ko)
1973{
1974 mNbTurnsWithoutBattle = 0;
1975 physicalDamage = std::max(physicalDamage - getPhysicalDefense(), 0.0);
1976 magicalDamage = std::max(magicalDamage - getMagicalDefense(), 0.0);
1977 elementDamage = std::max(elementDamage - getElementDefense(), 0.0);
1978 double damageDone = std::min(mHp, absoluteDamage + physicalDamage + magicalDamage + elementDamage);
1979 mHp -= damageDone;
1980 if(mHp <= 0)
1981 {
1982 // If the attacking entity is a creature and its seat is configured to KO creatures
1983 // instead of killing, we KO
1984 if(ko)
1985 {
1986 mHp = 1.0;
1987 mKoTurnCounter = -ConfigManager::getSingleton().getNbTurnsKoCreatureAttacked();
1988 OD_LOG_INF("creature=" + getName() + " has been KO by " + attacker->getName());
1989 dropCarriedEquipment();
1990 }
1991 }
1992
1993 computeCreatureOverlayHealthValue();
1994 computeCreatureOverlayMoodValue();
1995
1996 if(!isAlive())
1997 fireEntityDead();
1998
1999 if(!getIsOnServerMap())
2000 return damageDone;
2001
2002 Player* player = getGameMap()->getPlayerBySeat(getSeat());
2003 if (player == nullptr)
2004 return damageDone;
2005
2006 // If we are a worker attacked by a worker, we fight. Otherwise, we flee (if it is a fighter, a trap,
2007 // or whatever)
2008 if(!getDefinition()->isWorker())
2009 return damageDone;
2010
2011 bool shouldFlee = true;
2012 if((attacker != nullptr) &&
2013 (attacker->getObjectType() == GameEntityType::creature))
2014 {
2015 Creature* creatureAttacking = static_cast<Creature*>(attacker);
2016 if(creatureAttacking->getDefinition()->isWorker())
2017 {
2018 // We do not flee because of this attack
2019 shouldFlee = false;
2020 }
2021 }
2022
2023 if(shouldFlee)
2024 {
2025 flee();
2026 return damageDone;
2027 }
2028 return damageDone;

Callers

nothing calls this directly

Calls 5

getPlayerBySeatMethod · 0.80
isWorkerMethod · 0.80
getDefinitionMethod · 0.80
getObjectTypeMethod · 0.45

Tested by

no test coverage detected