From e28f2a75bcb1ba363a902d45a62e286979fb75f5 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Fri, 29 Dec 2017 03:33:59 -0500 Subject: [PATCH] XEEN: Properly implement cmdGiveExtended opcode --- engines/xeen/party.cpp | 5 +++ engines/xeen/party.h | 5 +++ engines/xeen/scripts.cpp | 76 +++++++++++++++++++++++++++++----------- 3 files changed, 66 insertions(+), 20 deletions(-) diff --git a/engines/xeen/party.cpp b/engines/xeen/party.cpp index 20a80a0cf85..f0d58161119 100644 --- a/engines/xeen/party.cpp +++ b/engines/xeen/party.cpp @@ -1391,6 +1391,11 @@ 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; +} + int Party::howMuch() { return HowMuch::show(_vm); } diff --git a/engines/xeen/party.h b/engines/xeen/party.h index 31feaec5033..feb470fa49d 100644 --- a/engines/xeen/party.h +++ b/engines/xeen/party.h @@ -226,6 +226,11 @@ 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 + */ + bool giveTakeExt(int takeMode, uint takeVal, int giveMode, uint giveVal, int extMode, uint extVal, int charIdx); + /** * Resets the inventory that Blacksmiths sell */ diff --git a/engines/xeen/scripts.cpp b/engines/xeen/scripts.cpp index 11d21ce3742..1307a88c258 100644 --- a/engines/xeen/scripts.cpp +++ b/engines/xeen/scripts.cpp @@ -873,44 +873,80 @@ bool Scripts::cmdAlterMap(ParamsIterator ¶ms) { bool Scripts::cmdGiveExtended(ParamsIterator ¶ms) { Party &party = *_vm->_party; - uint32 val; - int newLineNum; - bool result; + int mode1, mode2, mode3; + uint32 val1, val2, val3; _refreshIcons = true; - int mode = params.readByte(); - switch (mode) { + mode1 = params.readByte(); + switch (mode1) { case 16: case 34: case 100: - val = params.readUint32LE(); + val1 = params.readUint32LE(); break; case 25: case 35: case 101: case 106: - val = params.readUint16LE(); + val1 = params.readUint16LE(); break; default: - val = params.readByte(); + val1 = params.readByte(); break; } - newLineNum = params.readByte(); - if ((_charIndex != 0 && _charIndex != 8) || mode == 44) { - result = ifProc(mode, val, _event->_opcode - OP_If1, _charIndex - 1); - } else { - result = false; - for (int idx = 0; idx < (int)party._activeParty.size() && !result; ++idx) { - if (_charIndex == 0 || (_charIndex == 8 && _v2 != idx)) { - result = ifProc(mode, val, _event->_opcode - OP_If1, idx); - } - } + mode2 = params.readByte(); + switch (mode2) { + case 16: + case 34: + case 100: + val2 = params.readUint32LE(); + break; + case 25: + case 35: + case 101: + case 106: + val2 = params.readUint16LE(); + break; + default: + val2 = params.readByte(); + break; } + mode3 = params.readByte(); + switch (mode3) { + case 16: + case 34: + case 100: + val3 = params.readUint32LE(); + break; + case 25: + case 35: + case 101: + case 106: + val3 = params.readUint16LE(); + break; + default: + val3 = params.readByte(); + break; + } + + _scriptExecuted = true; + bool result = party.giveTakeExt(mode1, val1, mode2, val2, mode3, val3, + (_charIndex > 0) ? _charIndex - 1 : 0); + if (result) { - _lineNum = newLineNum; - return false; + if (_animCounter == 255) { + _animCounter = 0; + return cmdExit(params); + } else if (mode1 == 67 || mode2 == 67 || mode3 == 67) { + _animCounter = 1; + } else { + return cmdExit(params); + } + } else { + if (mode1 == 67 || mode2 == 67 || mode3 == 67) + return cmdExit(params); } return true;