aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
Diffstat (limited to 'engines')
-rw-r--r--engines/xeen/character.cpp15
-rw-r--r--engines/xeen/character.h9
-rw-r--r--engines/xeen/locations.cpp6
3 files changed, 20 insertions, 10 deletions
diff --git a/engines/xeen/character.cpp b/engines/xeen/character.cpp
index 29b8dcb94a..8a6dd14c42 100644
--- a/engines/xeen/character.cpp
+++ b/engines/xeen/character.cpp
@@ -682,7 +682,7 @@ void Character::clear() {
_birthDay = 0;
_tempAge = 0;
Common::fill(&_skills[0], &_skills[18], 0);
- Common::fill(&_awards[0], &_awards[128], false);
+ Common::fill(&_awards[0], &_awards[128], 0);
Common::fill(&_spells[0], &_spells[39], 0);
_lloydMap = 0;
_hasSpells = false;
@@ -748,13 +748,16 @@ void Character::synchronize(Common::Serializer &s) {
for (int idx = 0; idx < 18; ++idx)
s.syncAsByte(_skills[idx]);
- // Synchronize character awards
+ // Synchronize character awards. The original packed awards 64..127 in the
+ // upper nibble of the first 64 bytes. Except for award 9, which was a full
+ // byte counter counting the number of times the warzone was awarded
for (int idx = 0; idx < 64; ++idx) {
- byte b = (_awards[idx] ? 1 : 0) | (_awards[idx + 64] ? 0x10 : 0);
+ byte b = (idx == WARZONE_AWARD) ? _awards[idx] :
+ (_awards[idx] ? 0x1 : 0) | (_awards[idx + 64] ? 0x10 : 0);
s.syncAsByte(b);
if (s.isLoading()) {
- _awards[idx] = (b & 0xF) != 0;
- _awards[idx + 64] = (b & 0xF0) != 0;
+ _awards[idx] = (idx == WARZONE_AWARD) ? b : b & 0xF;
+ _awards[idx + 64] = (idx == WARZONE_AWARD) ? 0 : (b >> 4) & 0xf;
}
}
@@ -1041,7 +1044,7 @@ void Character::setAward(int awardId, bool value) {
else if (awardId == 81)
v = 127;
- _awards[v] = value;
+ _awards[v] = value ? 1 : 0;
}
bool Character::hasAward(int awardId) const {
diff --git a/engines/xeen/character.h b/engines/xeen/character.h
index c16ae6addb..c19cfef4fc 100644
--- a/engines/xeen/character.h
+++ b/engines/xeen/character.h
@@ -35,6 +35,7 @@ namespace Xeen {
#define INV_ITEMS_TOTAL 9
#define MAX_SPELLS_PER_CLASS 39
#define AWARDS_TOTAL 88
+#define WARZONE_AWARD 9
enum BonusFlags {
ITEMFLAG_BONUS_MASK = 0xBF, ITEMFLAG_CURSED = 0x40, ITEMFLAG_BROKEN = 0x80
@@ -288,7 +289,7 @@ public:
uint _birthDay;
int _tempAge;
int _skills[18];
- bool _awards[128];
+ int _awards[128];
int _spells[MAX_SPELLS_PER_CLASS];
int _lloydMap;
Common::Point _lloydPosition;
@@ -372,8 +373,14 @@ public:
bool noActions();
+ /**
+ * Sets an award status
+ */
void setAward(int awardId, bool value);
+ /**
+ * Returns true if a character has a given award
+ */
bool hasAward(int awardId) const;
int getArmorClass(bool baseOnly = false) const;
diff --git a/engines/xeen/locations.cpp b/engines/xeen/locations.cpp
index e11f3daa6d..76c18399e9 100644
--- a/engines/xeen/locations.cpp
+++ b/engines/xeen/locations.cpp
@@ -1125,11 +1125,11 @@ int ArenaLocation::show() {
// Give each character the award
for (uint idx = 0; idx < party._activeParty.size(); ++idx) {
- party._activeParty[idx]._awards[9]++;
+ party._activeParty[idx]._awards[WARZONE_AWARD]++;
}
Common::String format = map._events._text[3];
- Common::String count = Common::String::format("%05u", party._activeParty[0]._awards[9]);
+ Common::String count = Common::String::format("%05u", party._activeParty[0]._awards[WARZONE_AWARD]);
int numIdx = count[3] == '1' ? 0 : count[4] - '0';
Common::String msg = Common::String::format(format.c_str(), count.c_str(), SUFFIXES[numIdx]);
@@ -1140,7 +1140,7 @@ int ArenaLocation::show() {
}
for (uint idx = 0; idx < party._activeParty.size(); ++idx) {
- if (party._activeParty[idx]._awards[idx] >= 99) {
+ if (party._activeParty[idx]._awards[WARZONE_AWARD] >= 99) {
LocationMessage::show(27, Res.WARZONE_BATTLE_MASTER, Res.WARZONE_MAXED, 1);
map.load(28);
goto exit;