void AGOSEngine_Simon2::playSpeech(uint16 speech_id, uint16 vgaSpriteId) { if (speech_id == 0xFFFF) { if (_subtitles) return; if (!getBitFlag(14) && !getBitFlag(28)) { setBitFlag(14, true); _variableArray[100] = 5; animate(4, 1, 30, 0, 0, 0); waitForSync(130); } _skipVgaWait = true; } else { if (getGameType() == GType_SIMON2 && _subtitles && _language != Common::HE_ISR) { loadVoice(speech_id); return; } if (_subtitles && _scriptVar2) { animate(4, 2, 5, 0, 0, 0); waitForSync(205); stopAnimateSimon2(2,5); } stopAnimateSimon2(2, vgaSpriteId + 2); loadVoice(speech_id); animate(4, 2, vgaSpriteId + 2, 0, 0, 0); } }
void AGOSEngine_Feeble::clearName() { stopAnimateSimon2(2, 6); _lastNameOn = NULL; _animatePointer = false; _mouseAnim = 1; return; }
void AGOSEngine_Simon1::os1_screenTextMsg() { // 162: print string uint vgaSpriteId = getVarOrByte(); uint color = getVarOrByte(); uint stringId = getNextStringID(); const byte *stringPtr = NULL; uint speechId = 0; TextLocation *tl; if (stringId != 0xFFFF) stringPtr = getStringPtrByID(stringId); if (getFeatures() & GF_TALKIE) { if (getGameType() == GType_FF || getGameType() == GType_PP) speechId = (uint16)getVarOrWord(); else speechId = (uint16)getNextWord(); } if (getGameType() == GType_FF || getGameType() == GType_PP) vgaSpriteId = 1; tl = getTextLocation(vgaSpriteId); if (_speech && speechId != 0) playSpeech(speechId, vgaSpriteId); if (((getGameType() == GType_SIMON2 && (getFeatures() & GF_TALKIE)) || getGameType() == GType_FF) && speechId == 0) { stopAnimateSimon2(2, vgaSpriteId + 2); } if (stringPtr != NULL && stringPtr[0] != 0 && (speechId == 0 || _subtitles)) printScreenText(vgaSpriteId, color, (const char *)stringPtr, tl->x, tl->y, tl->width); }
void SimonEngine::printInteractText(uint16 num, const char *string) { char convertedString[320]; char *convertedString2 = convertedString; const char *string2 = string; uint16 height = 15; uint16 w = 0xFFFF; uint16 b, pixels, x; // It doesn't really matter what 'w' is to begin with, as long as it's // something that cannot be generated by getPixelLength(). The original // used 620, which was a potential problem. while (1) { string2 = getPixelLength(string, 620, pixels); if (*string2 == 0x00) { if (w == 0xFFFF) w = pixels; strcpy(convertedString2, string); break; } while (*string2 != ' ') { byte chr = *string2; pixels -= charWidth[chr]; string2--; } if (w == 0xFFFF) w = pixels; b = string2 - string; strncpy(convertedString2, string, b); convertedString2 += b; *convertedString2++ = '\n'; height += 15; string = string2; } // ScrollX x = _variableArray[251]; x += 20; if (num == 1) _interactY = 385; // Returned values for box definition _variableArray[51] = x; _variableArray[52] = _interactY; _variableArray[53] = w; _variableArray[54] = height; stopAnimateSimon2(2, num + 6); renderString(num, 0, w, height, convertedString); loadSprite(4, 2, num + 6, x, _interactY, 12); _interactY += height; }
void AGOSEngine::skipSpeech() { _sound->stopVoice(); if (!getBitFlag(28)) { setBitFlag(14, true); if (getGameType() == GType_FF) { _variableArray[103] = 5; animate(4, 2, 13, 0, 0, 0); waitForSync(213); stopAnimateSimon2(2, 1); } else if (getGameType() == GType_SIMON2) { _variableArray[100] = 5; animate(4, 1, 30, 0, 0, 0); waitForSync(130); stopAnimateSimon2(2, 1); } else { _variableArray[100] = 15; animate(4, 1, 130, 0, 0, 0); waitForSync(130); stopAnimate(1); } } }
void AGOSEngine_Simon1::os1_screenTextMsg() { // 162: print string uint vgaSpriteId = getVarOrByte(); uint color = getVarOrByte(); uint stringId = getNextStringID(); const byte *stringPtr = NULL; uint speechId = 0; TextLocation *tl; if (stringId != 0xFFFF) stringPtr = getStringPtrByID(stringId); if (getFeatures() & GF_TALKIE) { if (getGameType() == GType_FF || getGameType() == GType_PP) speechId = (uint16)getVarOrWord(); else speechId = (uint16)getNextWord(); } if (getGameType() == GType_FF || getGameType() == GType_PP) vgaSpriteId = 1; tl = getTextLocation(vgaSpriteId); if (_speech && speechId != 0) playSpeech(speechId, vgaSpriteId); if (((getGameType() == GType_SIMON2 && (getFeatures() & GF_TALKIE)) || getGameType() == GType_FF) && speechId == 0) { stopAnimateSimon2(2, vgaSpriteId + 2); } // WORKAROUND: Several strings in the French version of Simon the Sorcerer 1 set the incorrect width, // causing crashes, or glitches in subtitles. See bug #3512776 for example. if (getGameType() == GType_SIMON1 && _language == Common::FR_FRA) { if ((getFeatures() & GF_TALKIE) && stringId == 33219) tl->width = 96; if (!(getFeatures() & GF_TALKIE) && stringId == 33245) tl->width = 96; } if (stringPtr != NULL && stringPtr[0] != 0 && (speechId == 0 || _subtitles)) printScreenText(vgaSpriteId, color, (const char *)stringPtr, tl->x, tl->y, tl->width); }
void AGOSEngine_Simon2::os2_stopAnimate() { // 99: kill sprite uint16 a = getVarOrWord(); uint16 b = getVarOrWord(); stopAnimateSimon2(a, b); }
void SimonEngine::printScreenText(uint vgaSpriteId, uint color, const char *string, int16 x, int16 y, int16 width) { char convertedString[320]; char *convertedString2 = convertedString; const char *string2 = string; int16 height, talkDelay; int stringLength = strlen(string); int padding, lettersPerRow, lettersPerRowJustified; const int textHeight = (getGameType() == GType_FF) ? 15: 10; height = textHeight; lettersPerRow = width / 6; lettersPerRowJustified = stringLength / (stringLength / lettersPerRow + 1) + 1; talkDelay = (stringLength + 3) / 3; if ((getGameType() == GType_SIMON1) && (getFeatures() & GF_TALKIE)) { if (_variableArray[141] == 0) _variableArray[141] = 9; _variableArray[85] = _variableArray[141] * talkDelay; } else { if (_variableArray[86] == 0) talkDelay /= 2; if (_variableArray[86] == 2) talkDelay *= 2; _variableArray[85] = talkDelay * 5; } assert(stringLength > 0); if (getGameType() == GType_FF) { uint16 b, pixels, spaces; uint16 curWdth = width; while (1) { string2 = getPixelLength(string, curWdth, pixels); if (*string2 == 0) { spaces = (width - pixels) / 12; if (spaces != 0) spaces--; while (spaces) { *convertedString2++=' '; spaces--; } strcpy(convertedString2, string); break; } while (*string2 != ' ') { byte chr = *string2; pixels -= charWidth[chr]; string2--; } spaces = (width - pixels) / 12; if (spaces != 0) spaces--; while (spaces) { *convertedString2++ = ' '; spaces--; } b = string2 - string; strncpy(convertedString2, string, b); convertedString2 += b; *convertedString2++ = '\n'; height += textHeight; y -= textHeight; if (y < 2) y = 2; curWdth = pixels; string = string2; } } else { while (stringLength > 0) { int pos = 0; if (stringLength > lettersPerRow) { int removeLastWord = 0; if (lettersPerRow > lettersPerRowJustified) { pos = lettersPerRowJustified; while (string[pos] != ' ') pos++; if (pos > lettersPerRow) removeLastWord = 1; } if (lettersPerRow <= lettersPerRowJustified || removeLastWord) { pos = lettersPerRow; while (string[pos] != ' ' && pos > 0) pos--; } height += textHeight; y -= textHeight; } else pos = stringLength; padding = (lettersPerRow - pos) % 2 ? (lettersPerRow - pos) / 2 + 1 : (lettersPerRow - pos) / 2; while (padding--) *convertedString2++ = ' '; stringLength -= pos; while (pos--) *convertedString2++ = *string++; *convertedString2++ = '\n'; string++; // skip space stringLength--; // skip space } *(convertedString2 - 1) = '\0'; } if (getGameType() == GType_SIMON1) stopAnimateSimon1(vgaSpriteId + 199); else stopAnimateSimon2(2, vgaSpriteId); if (getGameType() == GType_FF) { renderString(1, color, width, height, convertedString); } else { color = color * 3 + 192; if (getPlatform() == Common::kPlatformAmiga) renderStringAmiga(vgaSpriteId, color, width, height, convertedString); else renderString(vgaSpriteId, color, width, height, convertedString); } int b = 4; if (getGameType() == GType_SIMON1 || getGameType() == GType_SIMON2) { if (!getBitFlag(133)) b = 3; x /= 8; if (y < 2) y = 2; } if (getGameType() == GType_SIMON1) loadSprite(b, 2, vgaSpriteId + 199, x, y, 12); else loadSprite(b, 2, vgaSpriteId, x, y, 12); }
// The Feeble Files specific void AGOSEngine_Feeble::printScreenText(uint vgaSpriteId, uint color, const char *string, int16 x, int16 y, int16 width) { char convertedString[320]; char *convertedString2 = convertedString; const char *string2 = string; int16 height, talkDelay; int stringLength = strlen(string); const int textHeight = 15; height = textHeight; talkDelay = (stringLength + 3) / 3; if (_variableArray[86] == 0) talkDelay /= 2; if (_variableArray[86] == 2) talkDelay *= 2; _variableArray[85] = talkDelay * 5; assert(stringLength > 0); uint16 b, pixels, spaces; while (1) { string2 = getPixelLength(string, width, pixels); if (*string2 == 0) { spaces = (width - pixels) / 12; if (spaces != 0) spaces--; while (spaces) { *convertedString2++ = ' '; spaces--; } strcpy(convertedString2, string); break; } while (*string2 != ' ') { byte chr = *string2; pixels -= (_language == Common::PL_POL) ? polish_charWidth[chr] : charWidth[chr]; string2--; } spaces = (width - pixels) / 12; if (spaces != 0) spaces--; while (spaces) { *convertedString2++ = ' '; spaces--; } b = string2 - string; strncpy(convertedString2, string, b); convertedString2 += b; *convertedString2++ = '\n'; height += textHeight; y -= textHeight; if (y < 2) y = 2; string = string2; } stopAnimateSimon2(2, vgaSpriteId); renderString(1, color, width, height, convertedString); animate(4, 2, vgaSpriteId, x, y, 12); }
void AGOSEngine::printScreenText(uint vgaSpriteId, uint color, const char *string, int16 x, int16 y, int16 width) { char convertedString[320]; char *convertedString2 = convertedString; int16 height, talkDelay; int stringLength = strlen(string); int padding, lettersPerRow, lettersPerRowJustified; const int textHeight = 10; height = textHeight; lettersPerRow = width / 6; lettersPerRowJustified = stringLength / (stringLength / lettersPerRow + 1) + 1; talkDelay = (stringLength + 3) / 3; if (getGameType() == GType_SIMON1 && (getFeatures() & GF_TALKIE)) { if (_variableArray[141] == 0) _variableArray[141] = 9; _variableArray[85] = _variableArray[141] * talkDelay; } else { if (_variableArray[86] == 0) talkDelay /= 2; if (_variableArray[86] == 2) talkDelay *= 2; _variableArray[85] = talkDelay * 5; } assert(stringLength > 0); while (stringLength > 0) { int pos = 0; if (stringLength > lettersPerRow) { int removeLastWord = 0; if (lettersPerRow > lettersPerRowJustified) { pos = lettersPerRowJustified; while (string[pos] != ' ') pos++; if (pos > lettersPerRow) removeLastWord = 1; } if (lettersPerRow <= lettersPerRowJustified || removeLastWord) { pos = lettersPerRow; while (string[pos] != ' ' && pos > 0) pos--; } height += textHeight; y -= textHeight; } else pos = stringLength; padding = ((lettersPerRow - pos) % 2) ? (lettersPerRow - pos) / 2 + 1 : (lettersPerRow - pos) / 2; while (padding--) *convertedString2++ = ' '; stringLength -= pos; while (pos--) *convertedString2++ = *string++; *convertedString2++ = '\n'; string++; // skip space stringLength--; // skip space } *(convertedString2 - 1) = '\0'; if (getGameType() == GType_SIMON1) stopAnimate(vgaSpriteId + 199); else stopAnimateSimon2(2, vgaSpriteId); if (getPlatform() == Common::kPlatformAmiga) { color = color * 3 + 1; renderStringAmiga(vgaSpriteId, color, width, height, convertedString); } else { color = color * 3 + 192; renderString(vgaSpriteId, color, width, height, convertedString); } uint16 windowNum = (!getBitFlag(133)) ? 3 : 4; if (getGameType() == GType_SIMON1 && (getFeatures() & GF_DEMO)) windowNum = 4; x /= 8; if (y < 2) y = 2; if (getGameType() == GType_SIMON1) { uint16 id = 199 + vgaSpriteId; animate(windowNum, id / 100, id, x, y, 12); } else { animate(windowNum, 2, vgaSpriteId, x, y, 12); } }