| 1969 | } |
| 1970 | |
| 1971 | double 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; |
nothing calls this directly
no test coverage detected