aboutsummaryrefslogtreecommitdiff
path: root/engines/xeen/party.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/xeen/party.cpp')
-rw-r--r--engines/xeen/party.cpp144
1 files changed, 100 insertions, 44 deletions
diff --git a/engines/xeen/party.cpp b/engines/xeen/party.cpp
index 85b27e9b36..1249be0d99 100644
--- a/engines/xeen/party.cpp
+++ b/engines/xeen/party.cpp
@@ -109,7 +109,8 @@ Party::Party(XeenEngine *vm) {
_totalTime = 0;
_rested = false;
- Common::fill(&_gameFlags[0], &_gameFlags[512], false);
+ Common::fill(&_gameFlags[0][0], &_gameFlags[0][256], false);
+ Common::fill(&_gameFlags[1][0], &_gameFlags[1][256], false);
Common::fill(&_worldFlags[0], &_worldFlags[128], false);
Common::fill(&_quests[0][0], &_quests[0][32], false);
Common::fill(&_quests[1][0], &_quests[1][32], false);
@@ -202,7 +203,8 @@ void Party::synchronize(Common::Serializer &s) {
s.syncAsUint32LE(_bankGems);
s.syncAsUint32LE(_totalTime);
s.syncAsByte(_rested);
- SavesManager::syncBitFlags(s, &_gameFlags[0], &_gameFlags[512]);
+ SavesManager::syncBitFlags(s, &_gameFlags[0][0], &_gameFlags[0][256]);
+ SavesManager::syncBitFlags(s, &_gameFlags[1][0], &_gameFlags[1][256]);
SavesManager::syncBitFlags(s, &_worldFlags[0], &_worldFlags[128]);
SavesManager::syncBitFlags(s, &_quests[0][0], &_quests[0][32]);
SavesManager::syncBitFlags(s, &_quests[1][0], &_quests[1][32]);
@@ -817,7 +819,7 @@ bool Party::giveTake(int takeMode, uint takeVal, int giveMode, uint giveVal, int
break;
}
case 20:
- //TODO: _gameFlags[files._isDarkCC][takeVal] = true;
+ _gameFlags[files._isDarkCc][takeVal] = false;
break;
case 21: {
bool found = false;
@@ -1053,7 +1055,8 @@ bool Party::giveTake(int takeMode, uint takeVal, int giveMode, uint giveVal, int
ps._conditions[giveVal]++;
}
- // TODO
+ if (giveVal >= 13 && giveVal <= 15 && ps._currentHp > 0)
+ ps._currentHp = 0;
break;
case 19: {
int idx2 = 0;
@@ -1084,48 +1087,43 @@ bool Party::giveTake(int takeMode, uint takeVal, int giveMode, uint giveVal, int
break;
}
case 20:
- // TODO: _gameFlags
+ _gameFlags[files._isDarkCc][giveVal] = true;
break;
case 21: {
- // TODO: Code below is unfinished
- bool found = false;
- for (int idx = 0; idx < 9; ++idx) {
- if (takeVal < 35) {
- if (ps._weapons[idx]._id == takeVal) {
- ps._weapons[idx].clear();
- ps._weapons.sort();
- found = true;
- break;
- }
- } else if (takeVal < 49) {
- if (ps._armor[idx]._id == (takeVal - 35)) {
- ps._armor[idx].clear();
- ps._armor.sort();
- found = true;
- break;
- }
- } else if (takeVal < 60) {
- if (ps._accessories[idx]._id == (takeVal - 49)) {
- ps._accessories[idx].clear();
- ps._accessories.sort();
- found = true;
- break;
- }
- } else if (takeVal < 82) {
- if (ps._misc[idx]._material == ((int)takeVal - 60)) {
- ps._misc[idx].clear();
- ps._misc.sort();
- found = true;
- break;
- }
- } else {
- error("Invalid id");
+ int idx;
+ if (giveVal < 35) {
+ for (idx = 0; idx < 10 && _treasure._weapons[idx]._id; ++idx);
+ if (idx < 10) {
+ _treasure._weapons[idx]._id = giveVal;
+ _treasure._hasItems = true;
+ return false;
}
+ } else if (giveVal < 49) {
+ for (idx = 0; idx < 10 && _treasure._armor[idx]._id; ++idx);
+ if (idx < 10) {
+ _treasure._armor[idx]._id = giveVal - 35;
+ _treasure._hasItems = true;
+ return false;
+ }
+ } else if (giveVal < 60) {
+ for (idx = 0; idx < 10 && _treasure._accessories[idx]._id; ++idx);
+ if (idx < 10) {
+ _treasure._accessories[idx]._id = giveVal - 49;
+ _treasure._hasItems = true;
+ return false;
+ }
+ } else if (giveVal < 82) {
+ for (idx = 0; idx < 10 && _treasure._misc[idx]._material; ++idx);
+ if (idx < 10) {
+ _treasure._accessories[idx]._material = giveVal - 60;
+ _treasure._hasItems = true;
+ return false;
+ }
+ } else {
+ error("Invalid id");
}
- if (!found)
- return true;
- break;
- }
+ return true;
+ }
case 25:
subPartyTime(giveVal);
intf.spellFX(&ps);
@@ -1247,9 +1245,67 @@ bool Party::giveTake(int takeMode, uint takeVal, int giveMode, uint giveVal, int
case 65:
_food += giveVal;
break;
- case 66:
- // TODO
+ case 66: {
+ warning("TODO: Verify case 66");
+ Character c;
+ int idx = -1;
+ if (scripts._itemType != 0) {
+ for (idx = 0; idx < 10 && _treasure._misc[idx]._material; ++idx);
+ if (idx == 10)
+ return true;
+ }
+
+ int result = ps.makeItem(giveVal, 0, (idx == -1) ? 12 : 0);
+ switch (result) {
+ case 0:
+ for (idx = 0; idx < 10 && _treasure._weapons[idx]._id; ++idx);
+ if (idx == 10)
+ return true;
+
+ ps._weapons[idx]._material = c._weapons[0]._material;
+ ps._weapons[idx]._id = c._weapons[0]._id;
+ ps._weapons[idx]._bonusFlags = c._weapons[0]._bonusFlags;
+ _treasure._hasItems = true;
+ break;
+
+ case 1:
+ for (idx = 0; idx < 10 && _treasure._armor[idx]._id; ++idx);
+ if (idx == 10)
+ return true;
+
+ ps._armor[idx]._material = c._armor[0]._material;
+ ps._armor[idx]._id = c._armor[0]._id;
+ ps._armor[idx]._bonusFlags = c._armor[0]._bonusFlags;
+ _treasure._hasItems = true;
+ break;
+
+ case 2:
+ for (idx = 0; idx < 10 && _treasure._accessories[idx]._id; ++idx);
+ if (idx == 10)
+ return true;
+
+ ps._accessories[idx]._material = c._accessories[0]._material;
+ ps._accessories[idx]._id = c._accessories[0]._id;
+ ps._accessories[idx]._bonusFlags = c._accessories[0]._bonusFlags;
+ _treasure._hasItems = true;
+ break;
+
+ case 3:
+ for (idx = 0; idx < 10 && _treasure._misc[idx]._material; ++idx);
+ if (idx == 10)
+ return true;
+
+ ps._misc[idx]._material = c._misc[0]._material;
+ ps._misc[idx]._id = c._misc[0]._id;
+ ps._misc[idx]._bonusFlags = c._misc[0]._bonusFlags;
+ _treasure._hasItems = true;
+ break;
+
+ default:
+ return true;
+ }
break;
+ }
case 69:
_levitateCount += giveVal;
break;