From b812ed50c8f6d9a24b607831a88a398730458d9a Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Mon, 11 Jun 2012 11:51:54 +0300 Subject: SCI: Bugfix for negative numbers in kString(at) Fixes one of the bugs in the savegame selection screen in Phantasmagoria --- engines/sci/engine/kstring.cpp | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) (limited to 'engines/sci/engine/kstring.cpp') diff --git a/engines/sci/engine/kstring.cpp b/engines/sci/engine/kstring.cpp index fe8d631497..0877e37a65 100644 --- a/engines/sci/engine/kstring.cpp +++ b/engines/sci/engine/kstring.cpp @@ -653,10 +653,18 @@ reg_t kString(EngineState *s, int argc, reg_t *argv) { case 1: // Size return make_reg(0, s->_segMan->getString(argv[1]).size()); case 2: { // At (return value at an index) - if (argv[1].segment == s->_segMan->getStringSegmentId()) - return make_reg(0, s->_segMan->lookupString(argv[1])->getRawData()[argv[2].toUint16()]); - - return make_reg(0, s->_segMan->getString(argv[1])[argv[2].toUint16()]); + // Note that values need to be truncated to bytes, otherwise + // 0xff (negative char -1) will incorrectly be changed to + // 0xffff (negative int16 -1) + if (argv[1].segment == s->_segMan->getStringSegmentId()) { + SciString *string = s->_segMan->lookupString(argv[1]); + byte val = string->getRawData()[argv[2].toUint16()]; + return make_reg(0, val); + } else { + Common::String string = s->_segMan->getString(argv[1]); + byte val = string[argv[2].toUint16()]; + return make_reg(0, val); + } } case 3: { // Atput (put value at an index) SciString *string = s->_segMan->lookupString(argv[1]); -- cgit v1.2.3 From ef8239df4877772762876ca1a98ad48676af8d5c Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Mon, 11 Jun 2012 20:10:49 -0400 Subject: SCI: Fix comment in kString(at) --- engines/sci/engine/kstring.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) (limited to 'engines/sci/engine/kstring.cpp') diff --git a/engines/sci/engine/kstring.cpp b/engines/sci/engine/kstring.cpp index 0877e37a65..33b8c15e9f 100644 --- a/engines/sci/engine/kstring.cpp +++ b/engines/sci/engine/kstring.cpp @@ -653,9 +653,7 @@ reg_t kString(EngineState *s, int argc, reg_t *argv) { case 1: // Size return make_reg(0, s->_segMan->getString(argv[1]).size()); case 2: { // At (return value at an index) - // Note that values need to be truncated to bytes, otherwise - // 0xff (negative char -1) will incorrectly be changed to - // 0xffff (negative int16 -1) + // Note that values are put in bytes to avoid sign extension if (argv[1].segment == s->_segMan->getStringSegmentId()) { SciString *string = s->_segMan->lookupString(argv[1]); byte val = string->getRawData()[argv[2].toUint16()]; -- cgit v1.2.3 From 2b50824133ced47f1d8fb6407a1e0212a7eeb41c Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Mon, 18 Jun 2012 05:21:59 +0300 Subject: SCI: Add setter/getter methods to reg_t's No functionality change has been made with this commit. This avoids setting and getting the reg_t members directly, and is the basis of any future work on large SCI3 scripts (larger than 64KB) --- engines/sci/engine/kstring.cpp | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) (limited to 'engines/sci/engine/kstring.cpp') diff --git a/engines/sci/engine/kstring.cpp b/engines/sci/engine/kstring.cpp index 33b8c15e9f..8d627efacf 100644 --- a/engines/sci/engine/kstring.cpp +++ b/engines/sci/engine/kstring.cpp @@ -33,7 +33,7 @@ namespace Sci { reg_t kStrEnd(EngineState *s, int argc, reg_t *argv) { reg_t address = argv[0]; - address.offset += s->_segMan->strlen(address); + address.incOffset(s->_segMan->strlen(address)); return address; } @@ -123,18 +123,22 @@ reg_t kStrAt(EngineState *s, int argc, reg_t *argv) { oddOffset = !oddOffset; if (!oddOffset) { - value = tmp.offset & 0x00ff; + value = tmp.getOffset() & 0x00ff; if (argc > 2) { /* Request to modify this char */ - tmp.offset &= 0xff00; - tmp.offset |= newvalue; - tmp.segment = 0; + uint16 offset = tmp.toUint16(); + offset &= 0xff00; + offset |= newvalue; + tmp.setOffset(offset); + tmp.setSegment(0); } } else { - value = tmp.offset >> 8; + value = tmp.getOffset() >> 8; if (argc > 2) { /* Request to modify this char */ - tmp.offset &= 0x00ff; - tmp.offset |= newvalue << 8; - tmp.segment = 0; + uint16 offset = tmp.toUint16(); + offset &= 0x00ff; + offset |= newvalue << 8; + tmp.setOffset(offset); + tmp.setSegment(0); } } } @@ -204,7 +208,7 @@ reg_t kFormat(EngineState *s, int argc, reg_t *argv) { int strLength = 0; /* Used for stuff like "%13s" */ bool unsignedVar = false; - if (position.segment) + if (position.getSegment()) startarg = 2; else { // WORKAROUND: QFG1 VGA Mac calls this without the first parameter (dest). It then @@ -291,7 +295,7 @@ reg_t kFormat(EngineState *s, int argc, reg_t *argv) { if (extralen < 0) extralen = 0; - if (reg.segment) /* Heap address? */ + if (reg.getSegment()) /* Heap address? */ paramindex++; else paramindex += 2; /* No, text resource address */ @@ -654,7 +658,7 @@ reg_t kString(EngineState *s, int argc, reg_t *argv) { return make_reg(0, s->_segMan->getString(argv[1]).size()); case 2: { // At (return value at an index) // Note that values are put in bytes to avoid sign extension - if (argv[1].segment == s->_segMan->getStringSegmentId()) { + if (argv[1].getSegment() == s->_segMan->getStringSegmentId()) { SciString *string = s->_segMan->lookupString(argv[1]); byte val = string->getRawData()[argv[2].toUint16()]; return make_reg(0, val); @@ -705,7 +709,7 @@ reg_t kString(EngineState *s, int argc, reg_t *argv) { uint32 string2Size = 0; Common::String string; - if (argv[3].segment == s->_segMan->getStringSegmentId()) { + if (argv[3].getSegment() == s->_segMan->getStringSegmentId()) { SciString *sstr; sstr = s->_segMan->lookupString(argv[3]); string2 = sstr->getRawData(); @@ -755,7 +759,7 @@ reg_t kString(EngineState *s, int argc, reg_t *argv) { SciString *dupString = s->_segMan->allocateString(&stringHandle); - if (argv[1].segment == s->_segMan->getStringSegmentId()) { + if (argv[1].getSegment() == s->_segMan->getStringSegmentId()) { *dupString = *s->_segMan->lookupString(argv[1]); } else { dupString->fromString(s->_segMan->getString(argv[1])); -- cgit v1.2.3 From 76f3f1b13621b43781c4a2c505e646d9d52fdab7 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 21 Jun 2012 22:24:22 +0300 Subject: SCI: Fix warnings --- engines/sci/engine/kstring.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'engines/sci/engine/kstring.cpp') diff --git a/engines/sci/engine/kstring.cpp b/engines/sci/engine/kstring.cpp index 8d627efacf..9eebf2c88a 100644 --- a/engines/sci/engine/kstring.cpp +++ b/engines/sci/engine/kstring.cpp @@ -96,7 +96,7 @@ reg_t kStrAt(EngineState *s, int argc, reg_t *argv) { byte value; byte newvalue = 0; - unsigned int offset = argv[1].toUint16(); + uint16 offset = argv[1].toUint16(); if (argc > 2) newvalue = argv[2].toSint16(); @@ -125,19 +125,19 @@ reg_t kStrAt(EngineState *s, int argc, reg_t *argv) { if (!oddOffset) { value = tmp.getOffset() & 0x00ff; if (argc > 2) { /* Request to modify this char */ - uint16 offset = tmp.toUint16(); + uint16 tmpOffset = tmp.toUint16(); offset &= 0xff00; offset |= newvalue; - tmp.setOffset(offset); + tmp.setOffset(tmpOffset); tmp.setSegment(0); } } else { value = tmp.getOffset() >> 8; if (argc > 2) { /* Request to modify this char */ - uint16 offset = tmp.toUint16(); + uint16 tmpOffset = tmp.toUint16(); offset &= 0x00ff; offset |= newvalue << 8; - tmp.setOffset(offset); + tmp.setOffset(tmpOffset); tmp.setSegment(0); } } -- cgit v1.2.3 From 99b1c736396799260cd715b40a074cf32d104485 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 21 Jun 2012 22:57:00 +0300 Subject: SCI: Fix silly typo Thanks to digitall for spotting this --- engines/sci/engine/kstring.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'engines/sci/engine/kstring.cpp') diff --git a/engines/sci/engine/kstring.cpp b/engines/sci/engine/kstring.cpp index 9eebf2c88a..c22d7c7b1e 100644 --- a/engines/sci/engine/kstring.cpp +++ b/engines/sci/engine/kstring.cpp @@ -126,8 +126,8 @@ reg_t kStrAt(EngineState *s, int argc, reg_t *argv) { value = tmp.getOffset() & 0x00ff; if (argc > 2) { /* Request to modify this char */ uint16 tmpOffset = tmp.toUint16(); - offset &= 0xff00; - offset |= newvalue; + tmpOffset &= 0xff00; + tmpOffset |= newvalue; tmp.setOffset(tmpOffset); tmp.setSegment(0); } @@ -135,8 +135,8 @@ reg_t kStrAt(EngineState *s, int argc, reg_t *argv) { value = tmp.getOffset() >> 8; if (argc > 2) { /* Request to modify this char */ uint16 tmpOffset = tmp.toUint16(); - offset &= 0x00ff; - offset |= newvalue << 8; + tmpOffset &= 0x00ff; + tmpOffset |= newvalue << 8; tmp.setOffset(tmpOffset); tmp.setSegment(0); } -- cgit v1.2.3 From ba1307b0ce37dd8f2f3be36da37d1d88de1fb70e Mon Sep 17 00:00:00 2001 From: Willem Jan Palenstijn Date: Fri, 5 Oct 2012 16:40:57 +0200 Subject: SCI: Add kReadNumber fixme Thanks to Walter for noticing this. --- engines/sci/engine/kstring.cpp | 1 + 1 file changed, 1 insertion(+) (limited to 'engines/sci/engine/kstring.cpp') diff --git a/engines/sci/engine/kstring.cpp b/engines/sci/engine/kstring.cpp index c22d7c7b1e..c4db0b891c 100644 --- a/engines/sci/engine/kstring.cpp +++ b/engines/sci/engine/kstring.cpp @@ -165,6 +165,7 @@ reg_t kReadNumber(EngineState *s, int argc, reg_t *argv) { // do clipping. In SQ4 we get the door code in here and that's even // larger than uint32! if (*source == '-') { + // FIXME: Setting result to -1 does _not_ negate the output. result = -1; source++; } -- cgit v1.2.3