Files
scummvm-cursorfix/engines/tot/cutscenes.cpp
2026-02-02 04:50:13 +01:00

958 lines
25 KiB
C++

/* ScummVM - Graphic Adventure Engine
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
* file distributed with this source distribution.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
#include "common/config-manager.h"
#include "tot/anims.h"
#include "tot/tot.h"
#include "tot/util.h"
namespace Tot {
byte *drawCreditsScreen(uint &sizeAuxBG, byte *&auxBG) {
Palette intermediatePalette, darkPalette;
Common::File ppFile;
if (!ppFile.open("DIPLOMA.PAN")) {
showError(315);
}
byte *backgroundPointer = (byte *)malloc(320 * 200);
ppFile.read(intermediatePalette, 256 * 3);
ppFile.read(backgroundPointer, 320 * 200);
ppFile.close();
g_engine->_graphics->drawFullScreen(backgroundPointer);
sizeAuxBG = imagesize(0, 0, 319, 59);
// Screen is now backgroundPointer so auxBG contains a 320x60 crop of backgroundPointer
auxBG = (byte *)malloc(sizeAuxBG);
g_engine->_graphics->getImg(0, 0, 319, 59, auxBG);
for (int i = 0; i < 256; i++) {
darkPalette[i * 3 + 0] = 0;
darkPalette[i * 3 + 1] = 0;
darkPalette[i * 3 + 2] = 0;
// Adjust for 6-bit DAC color
intermediatePalette[i * 3 + 0] <<= 2;
intermediatePalette[i * 3 + 1] <<= 2;
intermediatePalette[i * 3 + 2] <<= 2;
}
g_engine->_graphics->fadePalettes(darkPalette, intermediatePalette);
g_engine->_graphics->copyPalette(intermediatePalette, g_engine->_graphics->_pal);
if (g_engine->_cpCounter2 > 9)
showError(274);
return backgroundPointer;
}
void putCreditsImg(uint x, uint y, const byte *img1, const byte *img2, bool direct) {
uint16 wImg1, hImg1;
uint horizontalAux;
wImg1 = READ_LE_UINT16(img1);
hImg1 = READ_LE_UINT16(img1 + 2);
byte * step = (byte *)malloc((wImg1 + 1) * (hImg1 + 1) + 4);
horizontalAux = wImg1 + 1;
uint yPos = hImg1 + y;
// makes sure that if the image is at the bottom of the screen we chop the bottom part
for (int i = yPos; i >= 200; i--)
hImg1 -= 1;
hImg1++;
// Copies the crop in the background corresponding to the current credit window in img1
for (int i = 0; i < hImg1; i++) {
const byte *src = img2 + (320 * (y + i)) + x;
byte *dst = step + 4 + (horizontalAux * i);
Common::copy(src, src + horizontalAux, dst);
}
for (int kk = 0; kk < hImg1; kk++) {
uint inc2 = (kk * wImg1) + 4;
yPos = kk + y;
for (int jj = 0; jj <= wImg1; jj++) {
uint inc = inc2 + jj;
if ((direct && img1[inc] > 0) || (img1[inc] > 16 && yPos >= 66 && yPos <= 192)) {
step[inc] = img1[inc];
} else if (img1[inc] > 16) {
switch (yPos) {
case 59:
case 199:
step[inc] = img1[inc] + 210;
break;
case 60:
case 198:
step[inc] = img1[inc] + 180;
break;
case 61:
case 197:
step[inc] = img1[inc] + 150;
break;
case 62:
case 196:
step[inc] = img1[inc] + 120;
break;
case 63:
case 195:
step[inc] = img1[inc] + 90;
break;
case 64:
case 194:
step[inc] = img1[inc] + 60;
break;
case 65:
case 193:
step[inc] = img1[inc] + 30;
break;
}
}
}
}
// Wait until render tick
do {
g_engine->_chrono->updateChrono();
g_system->delayMillis(10);
} while (!g_engine->_chrono->_gameTick && !g_engine->shouldQuit());
g_engine->_chrono->_gameTick = false;
// Copies the credit window directly to the screen
for (int i = 0; i < hImg1; i++) {
const byte *src = step + 4 + (horizontalAux * i);
byte *dst = ((byte *)g_engine->_screen->getPixels()) + (320 * (y + i)) + x;
Common::copy(src, src + horizontalAux, dst);
}
g_engine->_screen->addDirtyRect(Common::Rect(x, y, x + wImg1 + 1, y + hImg1 + 1));
free(step);
}
void scrollCredit(
int32 position,
uint size,
Palette &pal2,
byte *&background,
bool &exit,
int minHeight,
bool withFade,
bool refresh) {
Common::File creditFile;
if (!creditFile.open("CREDITOS.DAT")) {
showError(270);
}
creditFile.seek(position);
creditFile.read(g_engine->_sceneBackground, size);
creditFile.read(pal2, 768);
creditFile.close();
for (int i = 16; i < 256; i++) {
// Adjust for 6-bit DAC
pal2[i * 3 + 0] <<= 2;
pal2[i * 3 + 1] <<= 2;
pal2[i * 3 + 2] <<= 2;
g_engine->_graphics->_pal[i * 3 + 0] = pal2[i * 3 + 0];
g_engine->_graphics->_pal[i * 3 + 1] = pal2[i * 3 + 1];
g_engine->_graphics->_pal[i * 3 + 2] = pal2[i * 3 + 2];
}
g_engine->_graphics->setPalette(&g_engine->_graphics->_pal[16 * 3 + 0], 16, 240);
// Loops an image from the bottom of the screen to the top
for (int i = 199; i >= minHeight; i--) {
g_engine->_events->pollEvent();
putCreditsImg(85, i, g_engine->_sceneBackground, background, !withFade);
if (g_engine->_events->_keyPressed) {
exit = true;
break;
}
g_engine->_screen->update();
g_system->delayMillis(10);
if (g_engine->shouldQuit())
break;
}
if (refresh) {
g_engine->_graphics->copyFromScreen(background);
}
}
void scrollSingleCredit(
int32 pos,
uint size,
Palette &pal2,
byte *&background,
bool &exit) {
scrollCredit(
pos,
size,
pal2,
background,
exit,
8,
true,
false);
}
void removeTitle(byte *&background2) {
uint i2, j2;
for (int i1 = 1; i1 <= 15000; i1++) {
g_engine->_events->pollEvent();
i2 = g_engine->getRandomNumber(318);
j2 = getRandom(58);
byte *src = background2 + 4 + (j2 * 320) + i2;
byte *dest = ((byte *)g_engine->_screen->getPixels()) + (j2 * 320) + i2;
Common::copy(src, src + 2, dest);
byte *src2 = background2 + 4 + ((j2 + 1) * 320) + i2;
byte *dest2 = ((byte *)g_engine->_screen->getPixels()) + ((j2 + 1) * 320) + i2;
Common::copy(src2, src2 + 2, dest2);
i2 = getRandom(320);
j2 = getRandom(60);
byte *src3 = background2 + 4 + (j2 * 320) + i2;
byte *dest3 = ((byte *)g_engine->_screen->getPixels()) + (j2 * 320) + i2;
Common::copy(src3, src3 + 1, dest3);
if (i1 % 200 == 0) {
g_engine->_screen->addDirtyRect(Common::Rect(0, 0, 320, 60));
g_engine->_screen->update();
}
if (g_engine->shouldQuit()) {
break;
}
}
g_engine->_screen->addDirtyRect(Common::Rect(0, 0, 320, 60));
g_engine->_screen->update();
}
inline bool keyPressed() {
g_engine->_events->pollEvent();
return g_engine->_events->_keyPressed;
}
void TotEngine::credits() {
_saveAllowed = true;
Palette pal2;
byte *background2;
uint sizeBg2;
bool shouldExit = false;
_mouse->hide();
_graphics->totalFadeOut(0);
_sound->fadeOutMusic();
_screen->clear();
_sound->playMidi("CREDITOS", true);
_sound->fadeInMusic();
byte *background = drawCreditsScreen(sizeBg2, background2);
if (keyPressed() || shouldExit)
goto Lexit;
scrollCredit(0, 8004, pal2, background, shouldExit, 10, false, true);
if (keyPressed() || shouldExit)
goto Lexit;
scrollSingleCredit(8772, 8004, pal2, background, shouldExit);
if (keyPressed() || shouldExit)
goto Lexit;
scrollSingleCredit(17544, 8004, pal2, background, shouldExit);
if (keyPressed() || shouldExit)
goto Lexit;
scrollSingleCredit(26316, 7504, pal2, background, shouldExit);
if (keyPressed() || shouldExit)
goto Lexit;
scrollSingleCredit(34588, 7504, pal2, background, shouldExit);
if (keyPressed() || shouldExit)
goto Lexit;
scrollSingleCredit(42860, 8004, pal2, background, shouldExit);
if (keyPressed() || shouldExit)
goto Lexit;
scrollSingleCredit(51632, 7504, pal2, background, shouldExit);
if (keyPressed() || shouldExit)
goto Lexit;
removeTitle(background2);
if (keyPressed())
goto Lexit;
_graphics->putImg(0, 0, background2);
if (keyPressed())
goto Lexit;
_graphics->copyFromScreen(background);
if (keyPressed())
goto Lexit;
scrollCredit(59904, 8004, pal2, background, shouldExit, 10, false, true);
if (keyPressed() || shouldExit)
goto Lexit;
scrollSingleCredit(68676, 8004, pal2, background, shouldExit);
if (keyPressed() || shouldExit)
goto Lexit;
scrollSingleCredit(77448, 8004, pal2, background, shouldExit);
if (keyPressed() || shouldExit)
goto Lexit;
scrollSingleCredit(86220, 8004, pal2, background, shouldExit);
if (keyPressed() || shouldExit)
goto Lexit;
scrollSingleCredit(94992, 8004, pal2, background, shouldExit);
if (keyPressed() || shouldExit)
goto Lexit;
scrollSingleCredit(103764, 8004, pal2, background, shouldExit);
if (keyPressed() || shouldExit)
goto Lexit;
scrollSingleCredit(112536, 8004, pal2, background, shouldExit);
if (keyPressed() || shouldExit)
goto Lexit;
removeTitle(background2);
if (keyPressed())
goto Lexit;
_graphics->putImg(0, 0, background2);
if (keyPressed())
goto Lexit;
_graphics->copyFromScreen(background);
if (keyPressed())
goto Lexit;
scrollCredit(121308, 8004, pal2, background, shouldExit, 80, false, true);
Lexit:
delay(1000);
_graphics->totalFadeOut(0);
_sound->fadeOutMusic();
_screen->clear();
_sound->playMidi("INTRODUC", true);
_sound->fadeInMusic();
_mouse->show();
free(background);
free(background2);
}
void TotEngine::introduction() {
_saveAllowed = false;
_mouse->hide();
bool exitPressed;
uint loopCount;
bool isSpanish = isLanguageSpanish();
const char *const *messages = getFullScreenMessagesByCurrentLanguage();
const int32 *offsets = getOffsetsByCurrentLanguage();
exitPressed = false;
_graphics->totalFadeOut(0);
if (_cpCounter > 6)
showError(270);
_screen->clear();
drawFlc(136, 53, offsets[2], 136, 9, 1, true, true, false, exitPressed);
if (exitPressed)
goto LexitIntro;
drawFlc(135, 54, offsets[3], 0, 9, 2, true, true, false, exitPressed);
if (exitPressed)
goto LexitIntro;
_graphics->totalFadeOut(0);
_screen->clear();
if (isSpanish) {
littText(25, 20, messages[0], 253);
littText(25, 35, messages[1], 253);
littText(25, 50, messages[2], 253);
littText(25, 65, messages[3], 253);
littText(25, 80, messages[4], 253);
littText(25, 95, messages[5], 253);
littText(25, 120, messages[6], 253);
littText(25, 140, messages[7], 253);
littText(25, 155, messages[8], 253);
} else {
littText(25, 35, messages[0], 253);
littText(25, 55, messages[1], 253);
littText(25, 75, messages[2], 253);
littText(25, 95, messages[3], 253);
littText(25, 115, messages[4], 253);
littText(25, 135, messages[5], 253);
}
if (shouldQuit()) {
return;
}
_graphics->totalFadeIn(0, "DEFAULT");
_screen->markAllDirty();
_screen->update();
loopCount = 0;
do {
_chrono->updateChrono();
g_engine->_events->pollEvent();
if (g_engine->_events->_keyPressed || g_engine->_events->_leftMouseButton) {
goto LexitIntro;
}
if (g_engine->_chrono->_gameTick) {
loopCount += 1;
}
g_system->delayMillis(10);
} while (loopCount < 180 && !shouldQuit());
_graphics->totalFadeOut(0);
_screen->clear();
drawFlc(0, 0, offsets[4], 0, 9, 3, true, true, false, exitPressed);
if (exitPressed)
goto LexitIntro;
drawFlc(110, 30, offsets[5], 2, 9, 4, false, true, false, exitPressed);
if (exitPressed)
goto LexitIntro;
drawFlc(110, 30, offsets[6], 3, 9, 5, false, true, false, exitPressed);
if (exitPressed)
goto LexitIntro;
drawFlc(110, 30, offsets[7], 0, 9, 0, false, true, false, exitPressed);
if (exitPressed)
goto LexitIntro;
drawFlc(110, 30, offsets[8], isSpanish ? 4 : 8, 9, 6, false, true, false, exitPressed);
if (exitPressed)
goto LexitIntro;
drawFlc(110, 30, offsets[9], 3, 9, 7, false, true, false, exitPressed);
if (exitPressed)
goto LexitIntro;
drawFlc(110, 30, offsets[8], isSpanish ? 3 : 8, 9, 8, false, true, false, exitPressed);
if (exitPressed)
goto LexitIntro;
drawFlc(110, 30, offsets[9], 2, 9, 9, false, true, false, exitPressed);
if (exitPressed)
goto LexitIntro;
drawFlc(0, 0, offsets[10], 0, 9, 0, false, true, false, exitPressed);
if (exitPressed)
goto LexitIntro;
drawFlc(235, 100, offsets[11], 3, 9, 10, false, true, false, exitPressed);
if (exitPressed)
goto LexitIntro;
drawFlc(150, 40, offsets[12], 0, 9, 11, false, true, false, exitPressed);
if (exitPressed)
goto LexitIntro;
drawFlc(235, 100, offsets[11], 3, 9, 12, false, true, false, exitPressed);
if (exitPressed)
goto LexitIntro;
drawFlc(150, 40, offsets[12], isSpanish ? 0 : 2, 9, 13, false, true, false, exitPressed);
if (exitPressed)
goto LexitIntro;
drawFlc(235, 100, offsets[11], isSpanish ? 3 : 8, 9, 14, false, true, false, exitPressed);
if (exitPressed)
goto LexitIntro;
drawFlc(150, 40, offsets[12], 0, 9, 15, false, true, false, exitPressed);
if (exitPressed)
goto LexitIntro;
drawFlc(173, 98, offsets[13], 0, 9, 0, false, true, false, exitPressed);
if (exitPressed)
goto LexitIntro;
drawFlc(224, 100, offsets[14], 2, 9, 16, false, true, false, exitPressed);
if (exitPressed)
goto LexitIntro;
drawFlc(0, 0, offsets[15], 0, 18, 17, false, true, false, exitPressed);
if (exitPressed)
goto LexitIntro;
drawFlc(150, 40, offsets[16], 0, 9, 18, false, true, false, exitPressed);
if (exitPressed)
goto LexitIntro;
delay(1000);
LexitIntro:
_graphics->totalFadeOut(0);
_screen->clear();
_mouse->show();
}
void TotEngine::firstIntroduction() {
if (!_firstTimeDone && !_isIntroSeen) {
introduction();
_firstTimeDone = true;
ConfMan.setBool("introSeen", true);
ConfMan.flushToDisk();
}
}
void TotEngine::initialLogo() {
bool foobar = false;
const int32 *offsets = getOffsetsByCurrentLanguage();
drawFlc(0, 0, offsets[0], 0, 18, 25, false, false, false, foobar);
delay(1000);
}
void TotEngine::sacrificeScene() {
_saveAllowed = false;
Palette palaux;
Common::File file;
bool isSpanish = isLanguageSpanish();
const char *const *messages = getFullScreenMessagesByCurrentLanguage();
const int32 *offsets = getOffsetsByCurrentLanguage();
_sound->stopVoc();
bool exitPressed = _currentRoomData->paletteAnimationFlag;
_currentRoomData->paletteAnimationFlag = false;
bar(0, 139, 319, 149, 0);
bar(10, 10, 310, 120, 0);
if (isSpanish) {
littText(10, 10, messages[9], 200);
littText(10, 30, messages[10], 200);
littText(10, 50, messages[11], 200);
littText(10, 70, messages[12], 200);
littText(10, 90, messages[13], 200);
} else {
littText(10, 20, messages[9], 200);
littText(10, 40, messages[10], 200);
littText(10, 60, messages[11], 200);
littText(10, 80, messages[12], 200);
littText(10, 100, messages[13], 200);
}
for (int i = 0; i <= 28; i++)
setRGBPalette(200, i * 2, i * 2, i * 2);
delay(10000);
if (shouldQuit())
return;
for (int i = 28; i >= 0; i--)
setRGBPalette(200, i * 2, i * 2, i * 2);
bar(10, 10, 310, 120, 0);
if (isSpanish) {
littText(10, 10, messages[14], 200);
littText(10, 30, messages[15], 200);
littText(10, 50, messages[16], 200);
littText(10, 70, messages[17], 200);
littText(10, 90, messages[18], 200);
} else {
littText(10, 20, messages[14], 200);
littText(10, 40, messages[15], 200);
littText(10, 60, messages[16], 200);
littText(10, 80, messages[17], 200);
}
for (int i = 0; i <= 28; i++)
setRGBPalette(200, i * 2, i * 2, i * 2);
delay(10000);
if (shouldQuit())
return;
for (int i = 28; i >= 0; i--)
setRGBPalette(200, i * 2, i * 2, i * 2);
bar(10, 10, 310, 120, 0);
if (isSpanish) {
littText(10, 10, messages[19], 200);
littText(10, 50, messages[20], 200);
littText(10, 70, messages[21], 200);
littText(10, 90, messages[22], 200);
} else {
littText(10, 30, messages[19], 200);
littText(10, 60, messages[20], 200);
littText(10, 80, messages[21], 200);
}
for (int i = 0; i <= 28; i++)
setRGBPalette(200, i * 2, i * 2, i * 2);
delay(10000);
if (shouldQuit())
return;
for (int i = 28; i >= 0; i--)
setRGBPalette(200, i * 2, i * 2, i * 2);
bar(10, 10, 310, 120, 0);
if (!file.open("SALONREC.PAN")) {
showError(318);
}
file.read(palaux, 768);
file.read(_sceneBackground, 44800);
file.close();
g_engine->_graphics->_pal[0] = 0;
g_engine->_graphics->_pal[1] = 0;
g_engine->_graphics->_pal[2] = 0;
for (int i = 1; i <= 234; i++) {
g_engine->_graphics->_pal[i * 3 + 1] = palaux[i * 3 + 1] << 2;
g_engine->_graphics->_pal[i * 3 + 2] = palaux[i * 3 + 2] << 2;
g_engine->_graphics->_pal[i * 3 + 3] = palaux[i * 3 + 3] << 2;
}
// We dont have the width and height here in the byte buffer
_graphics->drawScreen(_sceneBackground, false);
_graphics->partialFadeIn(234);
_sound->stopVoc();
if (shouldQuit())
return;
drawFlc(0, 0, offsets[17], 0, 9, 19, false, false, true, exitPressed);
_graphics->totalFadeOut(128);
_sound->stopVoc();
delay(1000);
if (shouldQuit())
return;
_sound->fadeOutMusic();
_sound->playMidi("SACRIFIC", true);
_sound->fadeInMusic();
_graphics->clear();
littText(10, 31, messages[23], 254);
littText(10, 29, messages[23], 254);
littText(11, 30, messages[23], 254);
littText(9, 30, messages[23], 254);
littText(10, 51, messages[24], 254);
littText(10, 49, messages[24], 254);
littText(11, 50, messages[24], 254);
littText(9, 50, messages[24], 254);
littText(10, 71, messages[25], 254);
littText(10, 69, messages[25], 254);
littText(11, 70, messages[25], 254);
littText(9, 70, messages[25], 254);
littText(10, 30, messages[23], 255);
littText(10, 50, messages[24], 255);
littText(10, 70, messages[25], 255);
for (int i = 0; i <= 31; i++) {
setRGBPalette(255, 32 + i, i * 2, i * 2);
setRGBPalette(254, 32 - i, 0, 0);
}
delay(10000);
if (shouldQuit())
return;
for (int i = 31; i >= 0; i--) {
setRGBPalette(255, 63 - (32 - i), i * 2, i * 2);
setRGBPalette(254, 32 - i, 0, 0);
}
delay(2000);
if (!file.open("SACRIFIC.PAN")) {
showError(318);
}
file.read(palaux, 768);
for (int i = 0; i < 256; i++) {
palaux[i * 3 + 0] <<= 2;
palaux[i * 3 + 1] <<= 2;
palaux[i * 3 + 2] <<= 2;
}
file.read(_sceneBackground, 64000);
file.close();
_graphics->drawFullScreen(_sceneBackground);
palaux[0] = 0;
palaux[1] = 0;
palaux[2] = 0;
_graphics->redFadeIn(palaux);
drawFlc(112, 57, offsets[18], 33, 9, 20, true, false, true, exitPressed);
_sound->autoPlayVoc("REZOS", 0, 0);
if (shouldQuit())
return;
drawFlc(42, 30, offsets[19], 0, 9, 27, false, false, false, exitPressed);
if (shouldQuit())
return;
_graphics->totalFadeOut(128);
_sound->stopVoc();
_graphics->clear();
littText(10, 21, messages[26], 254);
littText(10, 19, messages[26], 254);
littText(11, 20, messages[26], 254);
littText(9, 20, messages[26], 254);
littText(10, 41, messages[27], 254);
littText(10, 39, messages[27], 254);
littText(11, 40, messages[27], 254);
littText(9, 40, messages[27], 254);
littText(10, 61, messages[28], 254);
littText(10, 59, messages[28], 254);
littText(11, 60, messages[28], 254);
littText(9, 60, messages[28], 254);
littText(10, 81, messages[29], 254);
littText(10, 79, messages[29], 254);
littText(11, 80, messages[29], 254);
littText(9, 80, messages[29], 254);
littText(10, 101, messages[30], 254);
littText(10, 99, messages[30], 254);
littText(11, 100, messages[30], 254);
littText(9, 100, messages[30], 254);
littText(10, 121, messages[31], 254);
littText(10, 119, messages[31], 254);
littText(11, 120, messages[31], 254);
littText(9, 120, messages[31], 254);
littText(10, 141, messages[32], 254);
littText(10, 139, messages[32], 254);
littText(11, 140, messages[32], 254);
littText(9, 140, messages[32], 254);
if (!isSpanish) {
littText(10, 161, messages[56], 254);
littText(10, 159, messages[56], 254);
littText(11, 160, messages[56], 254);
littText(9, 160, messages[56], 254);
littText(10, 181, messages[57], 254);
littText(10, 179, messages[57], 254);
littText(11, 180, messages[57], 254);
littText(9, 180, messages[57], 254);
}
littText(10, 20, messages[26], 255);
littText(10, 40, messages[27], 255);
littText(10, 60, messages[28], 255);
littText(10, 80, messages[29], 255);
littText(10, 100, messages[30], 255);
littText(10, 120, messages[31], 255);
littText(10, 140, messages[32], 255);
if (!isSpanish) {
littText(10, 160, messages[56], 255);
littText(10, 180, messages[57], 255);
}
for (int i = 0; i <= 31; i++) {
setRGBPalette(255, 32 + i, i * 2, i * 2);
setRGBPalette(254, 32 - i, 0, 0);
}
delay(16000);
if (shouldQuit())
return;
for (int i = 31; i >= 0; i--) {
setRGBPalette(255, 63 - (32 - i), i * 2, i * 2);
setRGBPalette(254, 32 - i, 0, 0);
}
delay(2000);
if (shouldQuit())
return;
_graphics->clear();
littText(10, 21, messages[33], 254);
littText(10, 19, messages[33], 254);
littText(11, 20, messages[33], 254);
littText(9, 20, messages[33], 254);
littText(10, 41, messages[34], 254);
littText(10, 39, messages[34], 254);
littText(11, 40, messages[34], 254);
littText(9, 40, messages[34], 254);
littText(10, 61, messages[35], 254);
littText(10, 59, messages[35], 254);
littText(11, 60, messages[35], 254);
littText(9, 60, messages[35], 254);
if (isSpanish) {
littText(10, 81, messages[36], 254);
littText(10, 79, messages[36], 254);
littText(11, 80, messages[36], 254);
littText(9, 80, messages[36], 254);
littText(10, 101, messages[37], 254);
littText(10, 99, messages[37], 254);
littText(11, 100, messages[37], 254);
littText(9, 100, messages[37], 254);
littText(10, 121, messages[38], 254);
littText(10, 119, messages[38], 254);
littText(11, 120, messages[38], 254);
littText(9, 120, messages[38], 254);
littText(10, 141, messages[39], 254);
littText(10, 139, messages[39], 254);
littText(11, 140, messages[39], 254);
littText(9, 140, messages[39], 254);
}
littText(10, 20, messages[33], 255);
littText(10, 40, messages[34], 255);
littText(10, 60, messages[35], 255);
if (isSpanish) {
littText(10, 80, messages[36], 255);
littText(10, 100, messages[37], 255);
littText(10, 120, messages[38], 255);
littText(10, 140, messages[39], 255);
}
for (int i = 0; i <= 31; i++) {
setRGBPalette(255, 32 + i, i * 2, i * 2);
setRGBPalette(254, 32 - i, 0, 0);
}
delay(13000);
if (shouldQuit())
return;
for (int i = 31; i >= 0; i--) {
setRGBPalette(255, 63 - (32 - i), i * 2, i * 2);
setRGBPalette(254, 32 - i, 0, 0);
}
delay(2000);
if (shouldQuit())
return;
_graphics->clear();
littText(10, 61, messages[40], 254);
littText(10, 59, messages[40], 254);
littText(11, 60, messages[40], 254);
littText(9, 60, messages[40], 254);
littText(10, 81, messages[41], 254);
littText(10, 79, messages[41], 254);
littText(11, 80, messages[41], 254);
littText(9, 80, messages[41], 254);
littText(10, 101, messages[42], 254);
littText(10, 99, messages[42], 254);
littText(11, 100, messages[42], 254);
littText(9, 100, messages[42], 254);
littText(10, 60, messages[40], 255);
littText(10, 80, messages[41], 255);
littText(10, 100, messages[42], 255);
for (int i = 0; i <= 31; i++) {
setRGBPalette(255, 32 + i, i * 2, i * 2);
setRGBPalette(254, 32 - i, 0, 0);
}
delay(7000);
if (shouldQuit())
return;
for (int i = 31; i >= 0; i--) {
setRGBPalette(255, 63 - (32 - i), i * 2, i * 2);
setRGBPalette(254, 32 - i, 0, 0);
}
delay(2000);
_graphics->totalFadeOut(0);
_currentRoomData->paletteAnimationFlag = exitPressed;
_saveAllowed = true;
}
void TotEngine::ending() {
_saveAllowed = false;
bool exitRequested;
const char *const *messages = getFullScreenMessagesByCurrentLanguage();
const int32 *offsets = getOffsetsByCurrentLanguage();
littText(10, 41, messages[43], 249);
littText(10, 39, messages[43], 249);
littText(11, 40, messages[43], 249);
littText(9, 40, messages[43], 249);
littText(10, 61, messages[44], 249);
littText(10, 59, messages[44], 249);
littText(11, 60, messages[44], 249);
littText(9, 60, messages[44], 249);
littText(10, 40, messages[43], 253);
littText(10, 60, messages[44], 253);
if (shouldQuit()) {
return;
}
delay(4000);
_graphics->totalFadeOut(0);
_graphics->clear();
if (shouldQuit()) {
return;
}
_sound->fadeOutMusic();
_sound->playMidi("SACRIFIC", true);
_sound->fadeInMusic();
drawFlc(0, 0, offsets[30], 12, 9, 26, true, false, false, exitRequested);
if (exitRequested) {
return;
}
drawFlc(0, 0, offsets[31], 0, 9, 0, false, false, false, exitRequested);
if (exitRequested) {
return;
}
delay(1000);
_sound->playVoc("NOOO", 0, 0);
delay(3000);
_saveAllowed = true;
}
void TotEngine::wcScene() {
Palette wcPalette;
_currentZone = _currentRoomData->walkAreasGrid[(_characterPosX + kCharacterCorrectionX) / kXGridCount][(_characterPosY + kCharacerCorrectionY) / kYGridCount];
goToObject(_currentZone, _targetZone);
_graphics->copyPalette(g_engine->_graphics->_pal, wcPalette);
_mouse->hide();
_graphics->partialFadeOut(234);
const char *const *messages = getFullScreenMessagesByCurrentLanguage();
littText(10, 20, messages[45], 253);
delay(1000);
bar(10, 20, 150, 30, 0);
delay(2000);
littText(100, 50, messages[46], 255);
delay(1000);
bar(100, 50, 250, 60, 0);
delay(2000);
littText(30, 110, messages[47], 253);
delay(1000);
bar(30, 110, 210, 120, 0);
delay(3000);
littText(50, 90, messages[48], 248);
delay(1000);
_sound->playVoc("WATER", 272050, 47062);
bar(50, 90, 200, 100, 0);
delay(4000);
_characterPosX = 76 - kCharacterCorrectionX;
_characterPosY = 78 - kCharacerCorrectionY;
_graphics->copyPalette(wcPalette, g_engine->_graphics->_pal);
_graphics->restoreBackground();
assembleScreen();
_graphics->drawScreen(_sceneBackground);
_graphics->partialFadeIn(234);
_xframe2 = 0;
_currentTrajectoryIndex = 0;
_trajectoryLength = 1;
_currentZone = 8;
_targetZone = 8;
_trajectory[0].x = _characterPosX;
_trajectory[0].y = _characterPosY;
_mouse->show();
}
} // End of namespace Tot