[Scummvm-git-logs] scummvm master -> 47d95c6bcd28e765486f8de7e79ea84120196bc5

dreammaster dreammaster at scummvm.org
Fri Dec 29 11:02:59 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:
47d95c6bcd XEEN: Implemented giveExt method


Commit: 47d95c6bcd28e765486f8de7e79ea84120196bc5
    https://github.com/scummvm/scummvm/commit/47d95c6bcd28e765486f8de7e79ea84120196bc5
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2017-12-29T04:59:34-05:00

Commit Message:
XEEN: Implemented giveExt method

Changed paths:
    engines/xeen/party.cpp
    engines/xeen/party.h
    engines/xeen/resources.cpp
    engines/xeen/resources.h
    engines/xeen/scripts.cpp


diff --git a/engines/xeen/party.cpp b/engines/xeen/party.cpp
index f0d5816..49369e7 100644
--- a/engines/xeen/party.cpp
+++ b/engines/xeen/party.cpp
@@ -1391,9 +1391,108 @@ bool Party::giveTake(int takeMode, uint takeVal, int giveMode, uint giveVal, int
 	return false;
 }
 
-bool Party::giveTakeExt(int takeMode, uint takeVal, int giveMode, uint giveVal, int extMode, uint extVal, int charIdx) {
-	// TODO
-	return true;
+bool Party::giveExt(int mode1, uint val1, int mode2, uint val2, int mode3, uint val3, int charId) {
+	Combat &combat = *g_vm->_combat;
+	FileManager &files = *g_vm->_files;
+	Interface &intf = *g_vm->_interface;
+	Map &map = *g_vm->_map;
+	Party &party = *g_vm->_party;
+	Scripts &scripts = *g_vm->_scripts;
+	Sound &sound = *g_vm->_sound;
+	Character &c = party._activeParty[charId];
+	int var1 = 0;
+	bool retFlag = false;
+
+	if (intf._objNumber && !scripts._animCounter) {
+		MazeObject &obj = map._mobData._objects[intf._objNumber - 1];
+		switch (obj._spriteId) {
+		case 15:
+			if (!files._isDarkCc)
+				break;
+			// Intentional fall-through
+
+		case 16:
+		case 58:
+		case 73:
+			obj._frame = 1;
+
+			if (obj._position.x != 20) {
+				if (g_vm->getRandomNumber(1, 4) == 1) {
+					combat.giveCharDamage(map.mazeData()._trapDamage,
+						(DamageType)_vm->getRandomNumber(0, 6), charId);
+				}
+
+				int unlockBox = map.mazeData()._difficulties._unlockBox;
+				if ((c.getThievery() + _vm->getRandomNumber(1, 20)) >= unlockBox) {
+					scripts._animCounter++;
+					g_vm->_mode = MODE_7;
+					c._experience += c.getCurrentLevel() * unlockBox * 10;
+
+					intf.draw3d(true, false);
+					Common::String msg = Common::String::format(Res.PICKS_THE_LOCK, c._name.c_str());
+					ErrorScroll::show(g_vm, msg);
+				} else {
+					sound.playFX(21);
+
+					obj._frame = 0;
+					scripts._animCounter = 0;
+					Common::String msg = Common::String::format(Res.UNABLE_TO_PICK_LOCK, c._name.c_str());
+					ErrorScroll::show(g_vm, msg);
+
+					scripts._animCounter = 255;
+					return true;
+				}
+			}
+		}
+	}
+
+	for (int paramCtr = 0; paramCtr < 3; ++paramCtr) {
+		int mode = (paramCtr == 0) ? mode1 : (paramCtr == 1 ? mode2 : mode3);
+		int val = (paramCtr == 0) ? val1 : (paramCtr == 1 ? val2 : val3);
+
+		switch (mode) {
+		case 34:
+			party._treasure._gold += val;
+			break;
+
+		case 35:
+			party._treasure._gems += val;
+			break;
+
+		case 66:
+			c = _itemsCharacter;
+			c.clear();
+
+			if (giveTake(0, 0, mode, val, charId))
+				return true;
+			break;
+
+		case 100:
+			_treasure._gold += g_vm->getRandomNumber(1, val);
+			break;
+
+		case 101:
+			_treasure._gems += g_vm->getRandomNumber(1, val);
+			break;
+
+		case 106:
+			party._food += g_vm->getRandomNumber(1, val);
+			break;
+
+		case 67:
+			retFlag = true;
+			// Intentional fall-through
+
+		default:
+			if (giveTake(0, 0, mode, val, charId))
+				return true;
+			else if (retFlag)
+				return false;
+			break;
+		}
+	}
+
+	return false;
 }
 
 int Party::howMuch() {
diff --git a/engines/xeen/party.h b/engines/xeen/party.h
index feb470f..9262417 100644
--- a/engines/xeen/party.h
+++ b/engines/xeen/party.h
@@ -227,9 +227,9 @@ public:
 	bool giveTake(int takeMode, uint takeVal, int giveMode, uint giveVal, int charIdx);
 
 	/**
-	 * Gives and/or takes amounts from various character and/or party properties
+	 * Gives up to three different item/amounts to various character and/or party properties
 	 */
-	bool giveTakeExt(int takeMode, uint takeVal, int giveMode, uint giveVal, int extMode, uint extVal, int charIdx);
+	bool giveExt(int mode1, uint val1, int mode2, uint val2, int mode3, uint val3, int charId);
 
 	/**
 	 * Resets the inventory that Blacksmiths sell
diff --git a/engines/xeen/resources.cpp b/engines/xeen/resources.cpp
index cff4127..7edd920 100644
--- a/engines/xeen/resources.cpp
+++ b/engines/xeen/resources.cpp
@@ -1668,4 +1668,8 @@ const char *const Resources::WARZONE_LEVEL = "What level of monsters? (1-10)\n";
 
 const char *const Resources::WARZONE_HOW_MANY = "How many monsters? (1-20)\n";
 
+const char *const Resources::PICKS_THE_LOCK = "\x3""c\xB""010%s picks the lock!\nPress any key.";
+
+const char *const Resources::UNABLE_TO_PICK_LOCK = "\x3""c\v010%s was unable to pick the lock!\nPress any key.";
+
 } // End of namespace Xeen
diff --git a/engines/xeen/resources.h b/engines/xeen/resources.h
index dab3dff..6158159 100644
--- a/engines/xeen/resources.h
+++ b/engines/xeen/resources.h
@@ -351,6 +351,8 @@ public:
 	static const char *const WARZONE_MAXED;
 	static const char *const WARZONE_LEVEL;
 	static const char *const WARZONE_HOW_MANY;
+	static const char *const PICKS_THE_LOCK;
+	static const char *const UNABLE_TO_PICK_LOCK;
 public:
 	/**
 	 * Initializes an instnace of the resources
diff --git a/engines/xeen/scripts.cpp b/engines/xeen/scripts.cpp
index 1307a88..fde53b0 100644
--- a/engines/xeen/scripts.cpp
+++ b/engines/xeen/scripts.cpp
@@ -932,7 +932,7 @@ bool Scripts::cmdGiveExtended(ParamsIterator &params) {
 	}
 
 	_scriptExecuted = true;
-	bool result = party.giveTakeExt(mode1, val1, mode2, val2, mode3, val3,
+	bool result = party.giveExt(mode1, val1, mode2, val2, mode3, val3,
 		(_charIndex > 0) ? _charIndex - 1 : 0);
 
 	if (result) {





More information about the Scummvm-git-logs mailing list