525 lines
11 KiB
C++
525 lines
11 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/textconsole.h"
|
|
#include "graphics/paletteman.h"
|
|
|
|
#include "tot/statics.h"
|
|
#include "tot/tot.h"
|
|
#include "tot/util.h"
|
|
#include "util.h"
|
|
|
|
namespace Tot {
|
|
|
|
// Enforces a small delay when text reveal is supposed to happen
|
|
const int kEnforcedTextAnimDelay = 0;
|
|
|
|
void showError(int code) {
|
|
const char *const *messages = (isLanguageSpanish()) ? errorMessages[0] : errorMessages[1];
|
|
switch (code) {
|
|
case 1:
|
|
error("%s", messages[0]);
|
|
break;
|
|
case 2:
|
|
error("%s", messages[1]);
|
|
break;
|
|
case 3:
|
|
error("%s", messages[2]);
|
|
break;
|
|
case 4:
|
|
error("%s", messages[3]);
|
|
break;
|
|
case 5:
|
|
error("%s", messages[4]);
|
|
break;
|
|
case 6:
|
|
error("%s", messages[5]);
|
|
break;
|
|
case 12:
|
|
error("%s", messages[6]);
|
|
break;
|
|
case 13:
|
|
case 14:
|
|
error(messages[7], code);
|
|
break;
|
|
case 15:
|
|
error("%s", messages[8]);
|
|
break;
|
|
case 16:
|
|
error("%s", messages[9]);
|
|
break;
|
|
case 17:
|
|
error("%s", messages[10]);
|
|
break;
|
|
case 18:
|
|
error("%s", messages[11]);
|
|
break;
|
|
case 100:
|
|
error("%s", messages[12]);
|
|
break;
|
|
case 101:
|
|
error("%s", messages[13]);
|
|
break;
|
|
case 102:
|
|
error("%s", messages[14]);
|
|
break;
|
|
case 103:
|
|
error("%s", messages[15]);
|
|
break;
|
|
case 104:
|
|
error("%s", messages[16]);
|
|
break;
|
|
case 105:
|
|
error("%s", messages[17]);
|
|
break;
|
|
case 106:
|
|
error("%s", messages[18]);
|
|
break;
|
|
case 150:
|
|
error("%s", messages[19]);
|
|
break;
|
|
case 151:
|
|
error("%s", messages[20]);
|
|
break;
|
|
case 152:
|
|
error("%s", messages[21]);
|
|
break;
|
|
case 153:
|
|
error("%s", messages[22]);
|
|
break;
|
|
case 154:
|
|
error("%s", messages[23]);
|
|
break;
|
|
case 155:
|
|
error(messages[24], code);
|
|
break;
|
|
case 156:
|
|
error("%s", messages[25]);
|
|
break;
|
|
case 157:
|
|
error("%s", messages[26]);
|
|
break;
|
|
case 158:
|
|
error("%s", messages[27]);
|
|
break;
|
|
case 159:
|
|
error("%s", messages[28]);
|
|
break;
|
|
case 160:
|
|
error("%s", messages[29]);
|
|
break;
|
|
case 161:
|
|
error("%s", messages[30]);
|
|
break;
|
|
case 162:
|
|
error("%s", messages[31]);
|
|
break;
|
|
case 200:
|
|
error("%s", messages[32]);
|
|
break;
|
|
case 201:
|
|
error("%s", messages[33]);
|
|
break;
|
|
case 202:
|
|
error("%s", messages[34]);
|
|
break;
|
|
case 203:
|
|
error("%s", messages[35]);
|
|
break;
|
|
case 204:
|
|
error("%s", messages[36]);
|
|
break;
|
|
case 205:
|
|
error("%s", messages[37]);
|
|
break;
|
|
case 206:
|
|
error("%s", messages[38]);
|
|
break;
|
|
case 207:
|
|
error("%s", messages[39]);
|
|
break;
|
|
case 208:
|
|
error("%s", messages[40]);
|
|
break;
|
|
case 209:
|
|
error("%s", messages[41]);
|
|
break;
|
|
case 210:
|
|
error("%s", messages[42]);
|
|
break;
|
|
case 211:
|
|
error("%s", messages[43]);
|
|
break;
|
|
case 212:
|
|
error("%s", messages[44]);
|
|
break;
|
|
case 213:
|
|
error("%s", messages[45]);
|
|
break;
|
|
case 214:
|
|
error("%s", messages[46]);
|
|
break;
|
|
case 215:
|
|
error("%s", messages[47]);
|
|
break;
|
|
case 216:
|
|
error("%s", messages[48]);
|
|
break;
|
|
case 250:
|
|
error("%s", messages[49]);
|
|
break;
|
|
case 251:
|
|
error("%s", messages[50]);
|
|
break;
|
|
case 252:
|
|
error("%s", messages[51]);
|
|
break;
|
|
case 253:
|
|
error("%s", messages[52]);
|
|
break;
|
|
case 254:
|
|
error("%s", messages[53]);
|
|
break;
|
|
case 255:
|
|
error("%s", messages[54]);
|
|
break;
|
|
case 256:
|
|
error("%s", messages[55]);
|
|
break;
|
|
case 257:
|
|
error("%s", messages[56]);
|
|
break;
|
|
case 258:
|
|
error("%s", messages[57]);
|
|
break;
|
|
case 259:
|
|
error("%s", messages[58]);
|
|
break;
|
|
case 260:
|
|
error("%s", messages[59]);
|
|
break;
|
|
case 261:
|
|
error("%s", messages[60]);
|
|
break;
|
|
case 262:
|
|
error("%s", messages[61]);
|
|
break;
|
|
case 263:
|
|
error("%s", messages[62]);
|
|
break;
|
|
case 264:
|
|
error("%s", messages[63]);
|
|
break;
|
|
case 265:
|
|
error("%s", messages[64]);
|
|
break;
|
|
case 266:
|
|
error("%s", messages[65]);
|
|
break;
|
|
case 267:
|
|
error("%s", messages[66]);
|
|
break;
|
|
case 268:
|
|
error("%s", messages[67]);
|
|
break;
|
|
case 269:
|
|
error("%s", messages[68]);
|
|
break;
|
|
case 270:
|
|
error("%s", messages[69]);
|
|
break;
|
|
case 271:
|
|
error("%s", messages[70]);
|
|
break;
|
|
case 272:
|
|
error("%s", messages[71]);
|
|
break;
|
|
case 273:
|
|
error("%s", messages[72]);
|
|
break;
|
|
case 274:
|
|
error("%s", messages[73]);
|
|
break;
|
|
case 275:
|
|
error("%s", messages[74]);
|
|
break;
|
|
case 276:
|
|
error("%s", messages[75]);
|
|
break;
|
|
case 277:
|
|
error("%s", messages[76]);
|
|
break;
|
|
case 278:
|
|
error("%s", messages[77]);
|
|
break;
|
|
case 279:
|
|
error("%s", messages[78]);
|
|
break;
|
|
case 280:
|
|
error("%s", messages[79]);
|
|
break;
|
|
case 281:
|
|
error("%s", messages[80]);
|
|
break;
|
|
case 282:
|
|
error("%s", messages[81]);
|
|
break;
|
|
case 299:
|
|
error("%s", messages[82]);
|
|
break;
|
|
case 300:
|
|
error("%s", messages[83]);
|
|
break;
|
|
case 301:
|
|
error("%s", messages[84]);
|
|
break;
|
|
case 302:
|
|
error("%s", messages[85]);
|
|
break;
|
|
case 303:
|
|
error("%s", messages[86]);
|
|
break;
|
|
case 304:
|
|
error("%s", messages[87]);
|
|
break;
|
|
case 305:
|
|
error("%s", messages[88]);
|
|
break;
|
|
case 306:
|
|
error("%s", messages[89]);
|
|
break;
|
|
case 307:
|
|
error("%s", messages[90]);
|
|
break;
|
|
case 308:
|
|
error("%s", messages[91]);
|
|
break;
|
|
case 309:
|
|
error("%s", messages[92]);
|
|
break;
|
|
case 310:
|
|
error("%s", messages[93]);
|
|
break;
|
|
case 311:
|
|
error("%s", messages[94]);
|
|
break;
|
|
case 312:
|
|
error("%s", messages[95]);
|
|
break;
|
|
case 313:
|
|
error("%s", messages[96]);
|
|
break;
|
|
case 314:
|
|
error("%s", messages[97]);
|
|
break;
|
|
case 315:
|
|
error("%s", messages[98]);
|
|
break;
|
|
case 316:
|
|
error("%s", messages[99]);
|
|
break;
|
|
case 317:
|
|
error("%s", messages[100]);
|
|
break;
|
|
case 318:
|
|
error("%s", messages[101]);
|
|
break;
|
|
case 319:
|
|
error("%s", messages[102]);
|
|
break;
|
|
case 320:
|
|
error("%s", messages[103]);
|
|
break;
|
|
case 321:
|
|
error("%s", messages[104]);
|
|
break;
|
|
case 322:
|
|
error("%s", messages[105]);
|
|
break;
|
|
case 323:
|
|
error("%s", messages[106]);
|
|
break;
|
|
default: {
|
|
if (code >= 7 && code <= 11) {
|
|
error(messages[107], code);
|
|
} else if (code >= 19 && code <= 99) {
|
|
error(messages[108], code);
|
|
} else if (code >= 107 && code <= 149) {
|
|
error(messages[109],
|
|
code);
|
|
} else if (code >= 163 && code <= 199) {
|
|
error(messages[110], code);
|
|
} else if (code >= 217 && code <= 249) {
|
|
error(messages[111], code);
|
|
} else if (code >= 283 && code <= 298) {
|
|
error(messages[112], code);
|
|
} else {
|
|
error(messages[113], code);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void delay(uint16 ms) {
|
|
g_engine->_chrono->delay(ms);
|
|
}
|
|
|
|
/*
|
|
Allows you to modify palette entries for the IBM
|
|
8514 and the VGA drivers.
|
|
*/
|
|
void setRGBPalette(int color, int r, int g, int b) {
|
|
// Take current palette
|
|
byte palbuf[768];
|
|
g_system->getPaletteManager()->grabPalette(palbuf, 0, 256);
|
|
|
|
palbuf[color * 3 + 0] = r << 2;
|
|
palbuf[color * 3 + 1] = g << 2;
|
|
palbuf[color * 3 + 2] = b << 2;
|
|
|
|
g_system->getPaletteManager()->setPalette(palbuf, 0, 256);
|
|
}
|
|
|
|
void littText(int x, int y, const Common::String &text, byte color, Graphics::TextAlign align) {
|
|
littText(x, y, text.c_str(), color, align);
|
|
}
|
|
|
|
void littText(int x, int y, const char *text, byte color, Graphics::TextAlign align) {
|
|
bool yAligned = (align == Graphics::kTextAlignCenter) ? true : false;
|
|
x = (align == Graphics::kTextAlignCenter) ? 0 : x;
|
|
y = y + 2;
|
|
g_engine->_graphics->littText(text, x, y, color, align, yAligned);
|
|
}
|
|
|
|
void euroText(int x, int y, const Common::String &text, byte color, Graphics::TextAlign align) {
|
|
euroText(x, y, text.c_str(), color, align);
|
|
}
|
|
|
|
void euroText(int x, int y, const char *text, byte color, Graphics::TextAlign align) {
|
|
bool yAligned = (align == Graphics::kTextAlignCenter) ? true : false;
|
|
x = (align == Graphics::kTextAlignCenter) ? 0 : x;
|
|
y = y + 2;
|
|
g_engine->_graphics->euroText(text, x, y, color, align, yAligned);
|
|
}
|
|
|
|
void biosText(int x, int y, const Common::String &text, byte color) {
|
|
g_engine->_graphics->biosText(text, x, y, color);
|
|
}
|
|
|
|
uint imagesize(int x, int y, int x2, int y2) {
|
|
int w = x2 - x + 1;
|
|
int h = y2 - y + 1;
|
|
return 4 + (w * h);
|
|
}
|
|
|
|
void rectangle(int x1, int y1, int x2, int y2, byte color) {
|
|
g_engine->_screen->drawLine(x1, y1, x2, y1, color);
|
|
g_engine->_screen->drawLine(x2, y1, x2, y2, color);
|
|
g_engine->_screen->drawLine(x1, y2, x2, y2, color);
|
|
g_engine->_screen->drawLine(x1, y1, x1, y2, color);
|
|
g_engine->_screen->addDirtyRect(Common::Rect(x1, y1, x2, y2));
|
|
}
|
|
|
|
void bar(int x1, int y1, int x2, int y2, byte color) {
|
|
x2 = x2 + 1;
|
|
y2 = y2 + 1;
|
|
for (int i = x1; i < x2; i++) {
|
|
for (int j = y1; j < y2; j++) {
|
|
*((byte *)g_engine->_screen->getBasePtr(i, j)) = color;
|
|
}
|
|
}
|
|
g_engine->_screen->addDirtyRect(Common::Rect(x1, y1, x2, y2));
|
|
}
|
|
|
|
void putpixel(int x, int y, byte color) {
|
|
g_engine->_screen->setPixel(x, y, color);
|
|
}
|
|
|
|
void line(uint x1, uint y1, uint x2, uint y2, byte color) {
|
|
g_engine->_screen->drawLine(x1, y1, x2, y2, color);
|
|
}
|
|
|
|
void changeGameSpeed(Common::Event e) {
|
|
if (e.type == Common::EVENT_KEYDOWN) {
|
|
if (e.kbd.hasFlags(Common::KBD_CTRL)) {
|
|
if (e.kbd.keycode == Common::KEYCODE_f) {
|
|
g_engine->_chrono->changeSpeed();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void emptyLoop() {
|
|
do {
|
|
g_engine->_events->pollEvent();
|
|
g_engine->_chrono->updateChrono();
|
|
g_engine->_screen->update();
|
|
} while (!g_engine->_chrono->_gameTick && !g_engine->shouldQuit());
|
|
}
|
|
|
|
void emptyLoop2() {
|
|
do {
|
|
g_engine->_chrono->updateChrono();
|
|
g_engine->_screen->update();
|
|
} while (!g_engine->_chrono->_gameTickHalfSpeed);
|
|
}
|
|
|
|
int getRandom(int range) { return g_engine->getRandomNumber(range - 1); }
|
|
|
|
Common::String getObjectName(int idx) {
|
|
return g_engine->_lang == Common::ES_ESP ? hardcodedTexts_ES[idx] : hardcodedTexts_EN[idx];
|
|
}
|
|
|
|
Common::String getActionLineText(int idx) {
|
|
return g_engine->_lang == Common::ES_ESP ? actionLine_ES[idx] : actionLine_EN[idx];
|
|
}
|
|
|
|
const char *const *getFullScreenMessagesByCurrentLanguage() {
|
|
return (g_engine->_lang == Common::ES_ESP) ? fullScreenMessages[0] : fullScreenMessages[1];
|
|
}
|
|
|
|
const char *const *getAnimMessagesByCurrentLanguage() {
|
|
return (g_engine->_lang == Common::ES_ESP) ? animMessages[0] : animMessages[1];
|
|
}
|
|
|
|
const char *const *getHardcodedTextsByCurrentLanguage() {
|
|
return (g_engine->_lang == Common::ES_ESP) ? hardcodedTexts_ES : hardcodedTexts_EN;
|
|
}
|
|
|
|
const int32 *getOffsetsByCurrentLanguage() {
|
|
return (g_engine->_lang == Common::ES_ESP) ? flcOffsets[0] : flcOffsets[1];
|
|
}
|
|
|
|
void newSecondaryAnimationFrame() {
|
|
if (g_engine->_curSecondaryAnimationFrame != nullptr) {
|
|
free(g_engine->_curSecondaryAnimationFrame);
|
|
}
|
|
g_engine->_curSecondaryAnimationFrame = (byte *)malloc(g_engine->_secondaryAnimFrameSize);
|
|
}
|
|
|
|
void clearScreenLayer(uint pos) {
|
|
if (g_engine->_screenLayers[pos]) {
|
|
free(g_engine->_screenLayers[pos]);
|
|
}
|
|
g_engine->_screenLayers[pos] = nullptr;
|
|
}
|
|
|
|
} // End of namespace Tot
|