[Scummvm-git-logs] scummvm master -> 808dd292a6d47bfa9fcd1d990ae1ca51640df5e2

dreammaster dreammaster at scummvm.org
Sat Dec 16 16:32:04 CET 2017


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
808dd292a6 XEEN: Convert character _awards array from bool to int


Commit: 808dd292a6d47bfa9fcd1d990ae1ca51640df5e2
    https://github.com/scummvm/scummvm/commit/808dd292a6d47bfa9fcd1d990ae1ca51640df5e2
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2017-12-16T10:31:15-05:00

Commit Message:
XEEN: Convert character _awards array from bool to int

This is needed for the Warzone award (9), which doubles as a counter

Changed paths:
    engines/xeen/character.cpp
    engines/xeen/character.h
    engines/xeen/locations.cpp


diff --git a/engines/xeen/character.cpp b/engines/xeen/character.cpp
index 29b8dcb..8a6dd14 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 c16ae6a..c19cfef 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 e11f3da..76c1839 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;





More information about the Scummvm-git-logs mailing list