diff options
Diffstat (limited to 'engines')
-rw-r--r-- | engines/dm/champion.cpp | 19 | ||||
-rw-r--r-- | engines/dm/champion.h | 4 |
2 files changed, 21 insertions, 2 deletions
diff --git a/engines/dm/champion.cpp b/engines/dm/champion.cpp index f38552ac32..898975de65 100644 --- a/engines/dm/champion.cpp +++ b/engines/dm/champion.cpp @@ -3,6 +3,7 @@ #include "eventman.h"
#include "menus.h"
#include "inventory.h"
+#include "objectman.h"
namespace DM {
@@ -337,14 +338,30 @@ void ChampionMan::drawChampionBarGraphs(ChampionIndex champIndex) { }
-int16 ChampionMan::getStaminaAdjustedValue(Champion *champ, int16 val) {
+uint16 ChampionMan::getStaminaAdjustedValue(Champion *champ, int16 val) {
int16 currStamina = champ->_currStamina;
int16 halfMaxStamina = champ->_maxStamina / 2;
if (currStamina < halfMaxStamina) {
+ warning("Possible undefined behaviour in the original code");
val /= 2;
return val + ((uint32)val * (uint32)currStamina) / halfMaxStamina;
}
return val;
}
+uint16 ChampionMan::getMaximumLoad(Champion *champ) {
+ uint16 maximumLoad = champ->getStatistic(kChampionStatStrength, kChampionStatCurrent) * 8 + 100;
+ maximumLoad = getStaminaAdjustedValue(champ, maximumLoad);
+ int16 wounds = champ->getWounds();
+ if (wounds) {
+ maximumLoad -= maximumLoad >> (champ->getWoundsFlag(kChampionWoundLegs) ? 2 : 3);
+ }
+ if (_vm->_objectMan->getIconIndex(champ->getSlot(kChampionSlotFeet)) == kIconIndiceArmourElvenBoots) {
+ maximumLoad += maximumLoad * 16;
+ }
+ maximumLoad += 9;
+ maximumLoad -= maximumLoad % 10;
+ return maximumLoad;
+}
+
}
\ No newline at end of file diff --git a/engines/dm/champion.h b/engines/dm/champion.h index 6271c94fc6..db554120f2 100644 --- a/engines/dm/champion.h +++ b/engines/dm/champion.h @@ -359,6 +359,7 @@ public: _wounds &= ~flag; } } + uint16 getWoundsFlag(ChampionWound wound) { return _wounds & wound; } void clearWounds() { _wounds = kChampionWoundNone; } void resetToZero() { // oh boy > . < for (int16 i = 0; i < 30; ++i) @@ -405,7 +406,8 @@ public: void resetDataToStartGame(); // @ F0278_CHAMPION_ResetDataToStartGame void addCandidateChampionToParty(uint16 championPortraitIndex); // @ F0280_CHAMPION_AddCandidateChampionToParty void drawChampionBarGraphs(ChampionIndex champIndex); // @ F0287_CHAMPION_DrawBarGraphs - int16 getStaminaAdjustedValue(Champion *champ, int16 val); // @ F0306_CHAMPION_GetStaminaAdjustedValue + uint16 getStaminaAdjustedValue(Champion *champ, int16 val); // @ F0306_CHAMPION_GetStaminaAdjustedValue + uint16 getMaximumLoad(Champion *champ); // @ F0309_CHAMPION_GetMaximumLoad }; |