aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
Diffstat (limited to 'engines')
-rw-r--r--engines/dm/champion.cpp19
-rw-r--r--engines/dm/champion.h4
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
};