TRECISION: Move save/load code to main class
This commit is contained in:
parent
9e7dd6ab75
commit
980a41072b
8 changed files with 464 additions and 447 deletions
|
@ -4246,7 +4246,7 @@ void LogicManager::DoSys(uint16 curObj) {
|
|||
if (_vm->_oldRoom == kRoomControlPanel)
|
||||
break;
|
||||
_vm->_curRoom = _vm->_obj[o00EXIT]._goRoom;
|
||||
if (!DataSave()) {
|
||||
if (!g_vm->DataSave()) {
|
||||
_vm->showInventoryName(NO_OBJECTS, false);
|
||||
doEvent(MC_INVENTORY, ME_SHOWICONNAME, MP_DEFAULT, _vm->_mouseX, _vm->_mouseY, 0, 0);
|
||||
doEvent(MC_SYSTEM, ME_CHANGEROOM, MP_SYSTEM, _vm->_obj[o00EXIT]._goRoom, 0, 0, 0);
|
||||
|
@ -4255,7 +4255,7 @@ void LogicManager::DoSys(uint16 curObj) {
|
|||
break;
|
||||
|
||||
case o00LOAD:
|
||||
if (!DataLoad()) {
|
||||
if (!g_vm->DataLoad()) {
|
||||
_vm->showInventoryName(NO_OBJECTS, false);
|
||||
doEvent(MC_INVENTORY, ME_SHOWICONNAME, MP_DEFAULT, _vm->_mouseX, _vm->_mouseY, 0, 0);
|
||||
}
|
||||
|
|
|
@ -421,7 +421,7 @@ void doIdle() {
|
|||
&& (g_vm->_actor->_curAction < hWALKIN) && !g_vm->_flagUseWithStarted && g_vm->_flagShowCharacter
|
||||
&& !g_vm->_animMgr->_playingAnims[kSmackerAction]) {
|
||||
::createThumbnailFromScreen(&g_vm->_thumbnail);
|
||||
DataSave();
|
||||
g_vm->DataSave();
|
||||
g_vm->showInventoryName(NO_OBJECTS, false);
|
||||
doEvent(MC_INVENTORY, ME_SHOWICONNAME, MP_DEFAULT, g_vm->_mouseX, g_vm->_mouseY, 0, 0);
|
||||
g_vm->refreshInventory(g_vm->_inventoryRefreshStartIcon, g_vm->_inventoryRefreshStartLine);
|
||||
|
@ -434,7 +434,7 @@ void doIdle() {
|
|||
&& (g_vm->_actor->_curAction < hWALKIN) && !g_vm->_flagUseWithStarted && g_vm->_flagShowCharacter
|
||||
&& !g_vm->_animMgr->_playingAnims[kSmackerAction]) {
|
||||
::createThumbnailFromScreen(&g_vm->_thumbnail);
|
||||
if (!DataLoad()) {
|
||||
if (!g_vm->DataLoad()) {
|
||||
g_vm->showInventoryName(NO_OBJECTS, false);
|
||||
doEvent(MC_INVENTORY, ME_SHOWICONNAME, MP_DEFAULT, g_vm->_mouseX, g_vm->_mouseY, 0, 0);
|
||||
g_vm->refreshInventory(g_vm->_inventoryRefreshStartIcon, g_vm->_inventoryRefreshStartLine);
|
||||
|
|
|
@ -105,8 +105,6 @@ extern uint8 TextStatus;
|
|||
|
||||
int Compare(const void *p1, const void *p2);
|
||||
void RedrawRoom();
|
||||
bool DataSave();
|
||||
bool DataLoad();
|
||||
bool QuitGame();
|
||||
void DemoOver();
|
||||
void openSys();
|
||||
|
|
|
@ -43,8 +43,6 @@
|
|||
|
||||
namespace Trecision {
|
||||
|
||||
uint16 BlinkLastDTextChar = MASKCOL;
|
||||
|
||||
void SDText::set(SDText org) {
|
||||
set(org.x, org.y, org.dx, org.dy, org._subtitleRect.left, org._subtitleRect.top, org._subtitleRect.right, org._subtitleRect.bottom, org.tcol, org.scol, org.text);
|
||||
}
|
||||
|
@ -175,8 +173,8 @@ void SDText::DText(uint16 *frameBuffer) {
|
|||
uint16 fontDataOffset = 768;
|
||||
const uint16 charWidth = g_vm->_font[curChar * 3 + 2];
|
||||
|
||||
if (c == len - 1 && BlinkLastDTextChar != MASKCOL)
|
||||
tmpTCol = BlinkLastDTextChar;
|
||||
if (c == len - 1 && g_vm->BlinkLastDTextChar != MASKCOL)
|
||||
tmpTCol = g_vm->BlinkLastDTextChar;
|
||||
|
||||
for (uint16 a = b * CARHEI; a < (b + 1) * CARHEI; a++) {
|
||||
uint16 curPos = 0;
|
||||
|
@ -230,438 +228,6 @@ void SDText::DText(uint16 *frameBuffer) {
|
|||
}
|
||||
}
|
||||
|
||||
#define MAXSAVEFILE 12
|
||||
|
||||
Graphics::Surface *convertScummVMThumbnail(Graphics::Surface *thumbnail) {
|
||||
Graphics::Surface *thumbnailConverted = thumbnail->convertTo(g_system->getScreenFormat());
|
||||
Graphics::Surface *result = thumbnailConverted->scale(ICONDX, ICONDY);
|
||||
|
||||
thumbnailConverted->free();
|
||||
delete thumbnailConverted;
|
||||
thumbnail->free();
|
||||
delete thumbnail;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
void loadSaveSlots(Common::StringArray &saveNames) {
|
||||
Common::SaveFileManager *saveFileMan = g_engine->getSaveFileManager();
|
||||
|
||||
for (int i = 0; i < g_vm->_inventorySize; i++) {
|
||||
Common::String saveFileName = g_vm->getSaveStateName(i + 1);
|
||||
Common::InSaveFile *saveFile = saveFileMan->openForLoading(saveFileName);
|
||||
ExtendedSavegameHeader header;
|
||||
|
||||
if (!saveFile) {
|
||||
saveNames.push_back(g_vm->_sysText[kMessageEmptySpot]);
|
||||
g_vm->_inventory[i] = iEMPTYSLOT;
|
||||
continue;
|
||||
}
|
||||
|
||||
const byte version = saveFile->readByte();
|
||||
|
||||
if (saveFile && version == SAVE_VERSION_ORIGINAL) {
|
||||
// Original saved game, convert
|
||||
char buf[40];
|
||||
saveFile->read(buf, 40);
|
||||
buf[39] = '\0';
|
||||
saveNames.push_back(buf);
|
||||
|
||||
uint16 *thumbnailBuf = g_vm->_icons + (READICON + 1 + i) * ICONDX * ICONDY;
|
||||
saveFile->read((void *)thumbnailBuf, ICONDX * ICONDY * sizeof(uint16));
|
||||
g_vm->_graphicsMgr->updatePixelFormat(thumbnailBuf, ICONDX * ICONDY);
|
||||
|
||||
g_vm->_inventory[i] = LASTICON + i;
|
||||
} else if (saveFile && version == SAVE_VERSION_SCUMMVM) {
|
||||
const bool headerRead = MetaEngine::readSavegameHeader(saveFile, &header, false);
|
||||
if (headerRead) {
|
||||
saveNames.push_back(header.description);
|
||||
|
||||
Graphics::Surface *thumbnail = convertScummVMThumbnail(header.thumbnail);
|
||||
uint16 *thumbnailBuf = g_vm->_icons + (READICON + 1 + i) * ICONDX * ICONDY;
|
||||
memcpy(thumbnailBuf, thumbnail->getPixels(), ICONDX * ICONDY * 2);
|
||||
thumbnail->free();
|
||||
delete thumbnail;
|
||||
|
||||
g_vm->_inventory[i] = LASTICON + i;
|
||||
} else {
|
||||
saveNames.push_back(g_vm->_sysText[kMessageEmptySpot]);
|
||||
g_vm->_inventory[i] = iEMPTYSLOT;
|
||||
}
|
||||
} else {
|
||||
saveNames.push_back(g_vm->_sysText[kMessageEmptySpot]);
|
||||
g_vm->_inventory[i] = iEMPTYSLOT;
|
||||
}
|
||||
|
||||
delete saveFile;
|
||||
}
|
||||
|
||||
g_vm->refreshInventory(0, 0);
|
||||
}
|
||||
|
||||
/* -----------------25/10/97 15.16-------------------
|
||||
DataSave
|
||||
--------------------------------------------------*/
|
||||
bool DataSave() {
|
||||
uint8 OldInv[MAXICON], OldIconBase, OldInvLen;
|
||||
char ch;
|
||||
Common::StringArray saveNames;
|
||||
saveNames.reserve(MAXSAVEFILE);
|
||||
uint16 posx, LenText;
|
||||
bool ret = true;
|
||||
|
||||
actorStop();
|
||||
nextStep();
|
||||
|
||||
if (!ConfMan.getBool("originalsaveload")) {
|
||||
GUI::SaveLoadChooser *dialog = new GUI::SaveLoadChooser(_("Save game:"), _("Save"), true);
|
||||
int saveSlot = dialog->runModalWithCurrentTarget();
|
||||
Common::String saveName = dialog->getResultString();
|
||||
bool skipSave = saveSlot == -1;
|
||||
delete dialog;
|
||||
|
||||
// Remove the mouse click event from the save/load dialog
|
||||
g_vm->eventLoop();
|
||||
g_vm->_mouseLeftBtn = g_vm->_mouseRightBtn = false;
|
||||
|
||||
if (!skipSave)
|
||||
g_vm->saveGameState(saveSlot, saveName);
|
||||
|
||||
return !skipSave;
|
||||
}
|
||||
|
||||
for (int a = 0; a < TOP; a++)
|
||||
memset(g_vm->_screenBuffer + MAXX * a, 0, MAXX * 2);
|
||||
|
||||
SDText SText;
|
||||
SText.set(0, TOP - 20, MAXX, CARHEI, 0, 0, MAXX, CARHEI, 0x7FFF, MASKCOL, g_vm->_sysText[kMessageSavePosition]);
|
||||
SText.DText();
|
||||
|
||||
g_vm->_graphicsMgr->copyToScreen(0, 0, MAXX, TOP);
|
||||
|
||||
for (int a = TOP + AREA; a < AREA + 2 * TOP; a++)
|
||||
memset(g_vm->_screenBuffer + MAXX * a, 0, MAXX * 2);
|
||||
g_vm->_graphicsMgr->copyToScreen(0, TOP + AREA, MAXX, TOP);
|
||||
|
||||
g_vm->_gameQueue.initQueue();
|
||||
g_vm->_animQueue.initQueue();
|
||||
g_vm->_characterQueue.initQueue();
|
||||
|
||||
g_vm->FreeKey();
|
||||
|
||||
// Reset the inventory and turn it into save slots
|
||||
memcpy(OldInv, g_vm->_inventory, MAXICON);
|
||||
memset(g_vm->_inventory, 0, MAXICON);
|
||||
OldIconBase = g_vm->_iconBase;
|
||||
g_vm->_iconBase = 0;
|
||||
OldInvLen = g_vm->_inventorySize;
|
||||
g_vm->_inventorySize = MAXSAVEFILE;
|
||||
|
||||
insave:
|
||||
|
||||
int8 CurPos = -1;
|
||||
int8 OldPos = -1;
|
||||
bool skipSave = false;
|
||||
ch = 0;
|
||||
|
||||
loadSaveSlots(saveNames);
|
||||
|
||||
for (;;) {
|
||||
g_vm->checkSystem();
|
||||
|
||||
g_vm->GetKey();
|
||||
|
||||
int16 mx = g_vm->_mouseX;
|
||||
int16 my = g_vm->_mouseY;
|
||||
|
||||
if (my >= FIRSTLINE &&
|
||||
my < FIRSTLINE + ICONDY &&
|
||||
mx >= ICONMARGSX &&
|
||||
mx < MAXX - ICONMARGDX) {
|
||||
OldPos = CurPos;
|
||||
CurPos = ((mx - ICONMARGSX) / ICONDX);
|
||||
|
||||
if (OldPos != CurPos) {
|
||||
for (int a = FIRSTLINE + ICONDY + 10; a < FIRSTLINE + ICONDY + 10 + CARHEI; a++)
|
||||
memset(g_vm->_screenBuffer + MAXX * a, 0, MAXX * 2);
|
||||
|
||||
posx = ICONMARGSX + ((CurPos) * (ICONDX)) + ICONDX / 2;
|
||||
LenText = g_vm->TextLength(saveNames[CurPos].c_str(), 0);
|
||||
|
||||
posx = CLIP(posx - (LenText / 2), 2, MAXX - 2 - LenText);
|
||||
SText.set(posx, FIRSTLINE + ICONDY + 10, LenText, CARHEI, 0, 0, LenText, CARHEI, 0x7FFF, MASKCOL, saveNames[CurPos].c_str());
|
||||
SText.DText();
|
||||
|
||||
g_vm->_graphicsMgr->copyToScreen(0, FIRSTLINE + ICONDY + 10, MAXX, CARHEI);
|
||||
}
|
||||
|
||||
if (g_vm->_mouseLeftBtn)
|
||||
break;
|
||||
} else {
|
||||
if (OldPos != -1) {
|
||||
for (int a = FIRSTLINE + ICONDY + 10; a < FIRSTLINE + ICONDY + 10 + CARHEI; a++)
|
||||
memset(g_vm->_screenBuffer + MAXX * a, 0, MAXX * 2);
|
||||
|
||||
g_vm->_graphicsMgr->copyToScreen(0, FIRSTLINE + ICONDY + 10, MAXX, CARHEI);
|
||||
}
|
||||
|
||||
OldPos = -1;
|
||||
CurPos = -1;
|
||||
|
||||
if (g_vm->_mouseLeftBtn || g_vm->_mouseRightBtn) {
|
||||
skipSave = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!skipSave) {
|
||||
if (g_vm->_inventory[CurPos] == iEMPTYSLOT) {
|
||||
saveNames[CurPos].clear();
|
||||
|
||||
for (int a = FIRSTLINE + ICONDY + 10; a < FIRSTLINE + ICONDY + 10 + CARHEI; a++)
|
||||
memset(g_vm->_screenBuffer + MAXX * a, 0, MAXX * 2);
|
||||
|
||||
g_vm->_graphicsMgr->copyToScreen(0, FIRSTLINE + ICONDY + 10, MAXX, CARHEI);
|
||||
}
|
||||
|
||||
for (;;) {
|
||||
g_vm->_keybInput = true;
|
||||
g_vm->checkSystem();
|
||||
ch = g_vm->GetKey();
|
||||
g_vm->FreeKey();
|
||||
|
||||
g_vm->_keybInput = false;
|
||||
|
||||
if (ch == 0x1B) {
|
||||
ch = 0;
|
||||
for (int a = FIRSTLINE + ICONDY + 10; a < FIRSTLINE + ICONDY + 10 + CARHEI; a++)
|
||||
memset(g_vm->_screenBuffer + MAXX * a, 0, MAXX * 2);
|
||||
|
||||
g_vm->_graphicsMgr->copyToScreen(0, FIRSTLINE + ICONDY + 10, MAXX, CARHEI);
|
||||
|
||||
goto insave;
|
||||
}
|
||||
|
||||
if (ch == 8) // Backspace
|
||||
saveNames[CurPos].deleteLastChar();
|
||||
else if (ch == 13) // Enter
|
||||
break;
|
||||
else if (saveNames[CurPos].size() < 39 && Common::isPrint(ch))
|
||||
saveNames[CurPos] += ch;
|
||||
|
||||
for (int a = FIRSTLINE + ICONDY + 10; a < FIRSTLINE + ICONDY + 10 + CARHEI; a++)
|
||||
memset(g_vm->_screenBuffer + MAXX * a, 0, MAXX * 2);
|
||||
|
||||
saveNames[CurPos] += '_'; // add blinking cursor
|
||||
|
||||
posx = ICONMARGSX + ((CurPos) * (ICONDX)) + ICONDX / 2;
|
||||
LenText = g_vm->TextLength(saveNames[CurPos].c_str(), 0);
|
||||
|
||||
posx = CLIP(posx - (LenText / 2), 2, MAXX - 2 - LenText);
|
||||
SText.set(posx, FIRSTLINE + ICONDY + 10, LenText, CARHEI, 0, 0, LenText, CARHEI, 0x7FFF, MASKCOL, saveNames[CurPos].c_str());
|
||||
|
||||
if ((g_vm->ReadTime() / 8) & 1)
|
||||
BlinkLastDTextChar = 0x0000;
|
||||
|
||||
SText.DText();
|
||||
BlinkLastDTextChar = MASKCOL;
|
||||
|
||||
saveNames[CurPos].deleteLastChar(); // remove blinking cursor
|
||||
|
||||
g_vm->_graphicsMgr->copyToScreen(0, FIRSTLINE + ICONDY + 10, MAXX, CARHEI);
|
||||
}
|
||||
|
||||
for (int a = FIRSTLINE; a < MAXY; a++)
|
||||
memset(g_vm->_screenBuffer + MAXX * a, 0, MAXX * 2);
|
||||
|
||||
ret = false;
|
||||
|
||||
// Restore the inventory
|
||||
memcpy(g_vm->_inventory, OldInv, MAXICON);
|
||||
g_vm->_curInventory = 0;
|
||||
g_vm->_iconBase = OldIconBase;
|
||||
g_vm->_inventorySize = OldInvLen;
|
||||
|
||||
g_vm->saveGameState(CurPos + 1, saveNames[CurPos]);
|
||||
}
|
||||
|
||||
for (int a = FIRSTLINE; a < MAXY; a++)
|
||||
memset(g_vm->_screenBuffer + MAXX * a, 0, MAXX * 2);
|
||||
|
||||
g_vm->_graphicsMgr->copyToScreen(0, FIRSTLINE, MAXX, TOP);
|
||||
|
||||
for (int a = TOP - 20; a < TOP - 20 + CARHEI; a++)
|
||||
memset(g_vm->_screenBuffer + MAXX * a, 0, MAXX * 2);
|
||||
|
||||
g_vm->_graphicsMgr->copyToScreen(0, 0, MAXX, TOP);
|
||||
|
||||
// Restore the inventory
|
||||
memcpy(g_vm->_inventory, OldInv, MAXICON);
|
||||
g_vm->_curInventory = 0;
|
||||
g_vm->_iconBase = OldIconBase;
|
||||
g_vm->_inventorySize = OldInvLen;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*-----------------09/02/96 20.57-------------------
|
||||
DataLoad
|
||||
--------------------------------------------------*/
|
||||
bool DataLoad() {
|
||||
Common::StringArray saveNames;
|
||||
saveNames.reserve(MAXSAVEFILE);
|
||||
bool retval = true;
|
||||
|
||||
if (!ConfMan.getBool("originalsaveload")) {
|
||||
GUI::SaveLoadChooser *dialog = new GUI::SaveLoadChooser(_("Load game:"), _("Load"), false);
|
||||
int saveSlot = dialog->runModalWithCurrentTarget();
|
||||
bool skipLoad = saveSlot == -1;
|
||||
delete dialog;
|
||||
|
||||
// Remove the mouse click event from the save/load dialog
|
||||
g_vm->eventLoop();
|
||||
g_vm->_mouseLeftBtn = g_vm->_mouseRightBtn = false;
|
||||
|
||||
performLoad(saveSlot - 1, skipLoad);
|
||||
|
||||
return !skipLoad;
|
||||
}
|
||||
|
||||
for (int a = 0; a < TOP; a++)
|
||||
memset(g_vm->_screenBuffer + MAXX * a, 0, MAXX * 2);
|
||||
|
||||
g_vm->showCursor();
|
||||
|
||||
SDText SText;
|
||||
SText.set(0, TOP - 20, MAXX, CARHEI, 0, 0, MAXX, CARHEI, 0x7FFF, MASKCOL, g_vm->_sysText[kMessageLoadPosition]);
|
||||
SText.DText();
|
||||
|
||||
g_vm->_graphicsMgr->copyToScreen(0, 0, MAXX, TOP);
|
||||
|
||||
for (int a = TOP + AREA; a < AREA + 2 * TOP; a++)
|
||||
memset(g_vm->_screenBuffer + MAXX * a, 0, MAXX * 2);
|
||||
g_vm->_graphicsMgr->copyToScreen(0, TOP + AREA, MAXX, TOP);
|
||||
|
||||
g_vm->_gameQueue.initQueue();
|
||||
g_vm->_animQueue.initQueue();
|
||||
g_vm->_characterQueue.initQueue();
|
||||
|
||||
g_vm->FreeKey();
|
||||
|
||||
uint8 OldInv[MAXICON];
|
||||
// Reset the inventory and turn it into save slots
|
||||
memcpy(OldInv, g_vm->_inventory, MAXICON);
|
||||
memset(g_vm->_inventory, 0, MAXICON);
|
||||
uint8 OldIconBase = g_vm->_iconBase;
|
||||
g_vm->_iconBase = 0;
|
||||
uint8 OldInvLen = g_vm->_inventorySize;
|
||||
g_vm->_inventorySize = MAXSAVEFILE;
|
||||
|
||||
loadSaveSlots(saveNames);
|
||||
|
||||
bool skipLoad = false;
|
||||
int8 CurPos = -1;
|
||||
int8 OldPos = -1;
|
||||
|
||||
for (;;) {
|
||||
g_vm->checkSystem();
|
||||
g_vm->GetKey();
|
||||
|
||||
if (g_vm->_mouseY >= FIRSTLINE &&
|
||||
g_vm->_mouseY < (FIRSTLINE + ICONDY) &&
|
||||
g_vm->_mouseX >= ICONMARGSX &&
|
||||
(g_vm->_mouseX < (MAXX - ICONMARGDX))) {
|
||||
OldPos = CurPos;
|
||||
CurPos = (g_vm->_mouseX - ICONMARGSX) / ICONDX;
|
||||
|
||||
if (OldPos != CurPos) {
|
||||
for (int a = FIRSTLINE + ICONDY + 10; a < FIRSTLINE + ICONDY + 10 + CARHEI; a++)
|
||||
memset(g_vm->_screenBuffer + MAXX * a, 0, MAXX * 2);
|
||||
|
||||
uint16 posX = ICONMARGSX + ((CurPos) * (ICONDX)) + ICONDX / 2;
|
||||
uint16 lenText = g_vm->TextLength(saveNames[CurPos].c_str(), 0);
|
||||
if (posX - (lenText / 2) < 2)
|
||||
posX = 2;
|
||||
else
|
||||
posX = posX - (lenText / 2);
|
||||
if ((posX + lenText) > MAXX - 2)
|
||||
posX = MAXX - 2 - lenText;
|
||||
|
||||
SText.set(posX, FIRSTLINE + ICONDY + 10, lenText, CARHEI, 0, 0, lenText, CARHEI, 0x7FFF, MASKCOL, saveNames[CurPos].c_str());
|
||||
SText.DText();
|
||||
|
||||
g_vm->_graphicsMgr->copyToScreen(0, FIRSTLINE + ICONDY + 10, MAXX, CARHEI);
|
||||
}
|
||||
|
||||
if (g_vm->_mouseLeftBtn && (g_vm->_inventory[CurPos] != iEMPTYSLOT))
|
||||
break;
|
||||
} else {
|
||||
if (OldPos != -1) {
|
||||
for (int a = FIRSTLINE + ICONDY + 10; a < FIRSTLINE + ICONDY + 10 + CARHEI; a++)
|
||||
memset(g_vm->_screenBuffer + MAXX * a, 0, MAXX * 2);
|
||||
|
||||
g_vm->_graphicsMgr->copyToScreen(0, FIRSTLINE + ICONDY + 10, MAXX, CARHEI);
|
||||
}
|
||||
|
||||
OldPos = -1;
|
||||
CurPos = -1;
|
||||
|
||||
if (g_vm->_mouseLeftBtn || g_vm->_mouseRightBtn) {
|
||||
retval = false;
|
||||
skipLoad = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
performLoad(CurPos, skipLoad);
|
||||
|
||||
if (skipLoad) {
|
||||
// Restore the inventory
|
||||
memcpy(g_vm->_inventory, OldInv, MAXICON);
|
||||
g_vm->_curInventory = 0;
|
||||
g_vm->_iconBase = OldIconBase;
|
||||
g_vm->_inventorySize = OldInvLen;
|
||||
}
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
void performLoad(int slot, bool skipLoad) {
|
||||
if (!skipLoad) {
|
||||
for (int a = FIRSTLINE; a < MAXY; a++)
|
||||
memset(g_vm->_screenBuffer + MAXX * a, 0, MAXX * 2);
|
||||
|
||||
g_vm->loadGameState(slot + 1);
|
||||
|
||||
g_vm->_flagNoPaintScreen = true;
|
||||
g_vm->_curStack = 0;
|
||||
g_vm->_flagscriptactive = false;
|
||||
|
||||
g_vm->_oldRoom = g_vm->_curRoom;
|
||||
doEvent(MC_SYSTEM, ME_CHANGEROOM, MP_SYSTEM, g_vm->_curRoom, 0, 0, 0);
|
||||
}
|
||||
|
||||
actorStop();
|
||||
nextStep();
|
||||
g_vm->checkSystem();
|
||||
|
||||
for (int a = FIRSTLINE; a < MAXY; a++)
|
||||
memset(g_vm->_screenBuffer + MAXX * a, 0, MAXX * 2);
|
||||
|
||||
g_vm->_graphicsMgr->copyToScreen(0, FIRSTLINE, MAXX, TOP);
|
||||
|
||||
for (int a = TOP - 20; a < TOP - 20 + CARHEI; a++)
|
||||
memset(g_vm->_screenBuffer + MAXX * a, 0, MAXX * 2);
|
||||
|
||||
g_vm->_graphicsMgr->copyToScreen(0, 0, MAXX, TOP);
|
||||
|
||||
if (g_vm->_flagscriptactive) {
|
||||
g_vm->hideCursor();
|
||||
}
|
||||
}
|
||||
|
||||
/*-----------------09/02/96 20.57-------------------
|
||||
QuitGame
|
||||
--------------------------------------------------*/
|
||||
|
|
|
@ -44,6 +44,11 @@
|
|||
#include "common/fs.h"
|
||||
#include "graphics/cursorman.h"
|
||||
|
||||
#include "common/savefile.h"
|
||||
#include "common/str.h"
|
||||
#include "common/translation.h"
|
||||
#include "gui/saveload.h"
|
||||
|
||||
namespace Common {
|
||||
class File;
|
||||
}
|
||||
|
@ -175,6 +180,8 @@ TrecisionEngine::TrecisionEngine(OSystem *syst) : Engine(syst) {
|
|||
ObjPointers[i] = nullptr;
|
||||
MaskPointers[i] = nullptr;
|
||||
}
|
||||
|
||||
BlinkLastDTextChar = MASKCOL;
|
||||
}
|
||||
|
||||
TrecisionEngine::~TrecisionEngine() {
|
||||
|
@ -704,6 +711,428 @@ uint16 *TrecisionEngine::readData16(Common::String fileName, int &size) {
|
|||
return buf;
|
||||
}
|
||||
|
||||
void TrecisionEngine::loadSaveSlots(Common::StringArray &saveNames) {
|
||||
Common::SaveFileManager *saveFileMan = g_engine->getSaveFileManager();
|
||||
|
||||
for (int i = 0; i < _inventorySize; i++) {
|
||||
Common::String saveFileName = getSaveStateName(i + 1);
|
||||
Common::InSaveFile *saveFile = saveFileMan->openForLoading(saveFileName);
|
||||
ExtendedSavegameHeader header;
|
||||
|
||||
if (!saveFile) {
|
||||
saveNames.push_back(_sysText[kMessageEmptySpot]);
|
||||
_inventory[i] = iEMPTYSLOT;
|
||||
continue;
|
||||
}
|
||||
|
||||
const byte version = saveFile->readByte();
|
||||
|
||||
if (saveFile && version == SAVE_VERSION_ORIGINAL) {
|
||||
// Original saved game, convert
|
||||
char buf[40];
|
||||
saveFile->read(buf, 40);
|
||||
buf[39] = '\0';
|
||||
saveNames.push_back(buf);
|
||||
|
||||
uint16 *thumbnailBuf = _icons + (READICON + 1 + i) * ICONDX * ICONDY;
|
||||
saveFile->read((void *)thumbnailBuf, ICONDX * ICONDY * sizeof(uint16));
|
||||
_graphicsMgr->updatePixelFormat(thumbnailBuf, ICONDX * ICONDY);
|
||||
|
||||
_inventory[i] = LASTICON + i;
|
||||
}
|
||||
else if (saveFile && version == SAVE_VERSION_SCUMMVM) {
|
||||
const bool headerRead = MetaEngine::readSavegameHeader(saveFile, &header, false);
|
||||
if (headerRead) {
|
||||
saveNames.push_back(header.description);
|
||||
|
||||
Graphics::Surface *thumbnail = convertScummVMThumbnail(header.thumbnail);
|
||||
uint16 *thumbnailBuf = _icons + (READICON + 1 + i) * ICONDX * ICONDY;
|
||||
memcpy(thumbnailBuf, thumbnail->getPixels(), ICONDX * ICONDY * 2);
|
||||
thumbnail->free();
|
||||
delete thumbnail;
|
||||
|
||||
_inventory[i] = LASTICON + i;
|
||||
}
|
||||
else {
|
||||
saveNames.push_back(_sysText[kMessageEmptySpot]);
|
||||
_inventory[i] = iEMPTYSLOT;
|
||||
}
|
||||
}
|
||||
else {
|
||||
saveNames.push_back(_sysText[kMessageEmptySpot]);
|
||||
_inventory[i] = iEMPTYSLOT;
|
||||
}
|
||||
|
||||
delete saveFile;
|
||||
}
|
||||
|
||||
refreshInventory(0, 0);
|
||||
}
|
||||
|
||||
/* -----------------25/10/97 15.16-------------------
|
||||
DataSave
|
||||
--------------------------------------------------*/
|
||||
bool TrecisionEngine::DataSave() {
|
||||
uint8 OldInv[MAXICON], OldIconBase, OldInvLen;
|
||||
char ch;
|
||||
Common::StringArray saveNames;
|
||||
saveNames.reserve(MAXSAVEFILE);
|
||||
uint16 posx, LenText;
|
||||
bool ret = true;
|
||||
|
||||
actorStop();
|
||||
nextStep();
|
||||
|
||||
if (!ConfMan.getBool("originalsaveload")) {
|
||||
GUI::SaveLoadChooser *dialog = new GUI::SaveLoadChooser(_("Save game:"), _("Save"), true);
|
||||
int saveSlot = dialog->runModalWithCurrentTarget();
|
||||
Common::String saveName = dialog->getResultString();
|
||||
bool skipSave = saveSlot == -1;
|
||||
delete dialog;
|
||||
|
||||
// Remove the mouse click event from the save/load dialog
|
||||
eventLoop();
|
||||
_mouseLeftBtn = _mouseRightBtn = false;
|
||||
|
||||
if (!skipSave)
|
||||
saveGameState(saveSlot, saveName);
|
||||
|
||||
return !skipSave;
|
||||
}
|
||||
|
||||
for (int a = 0; a < TOP; a++)
|
||||
memset(_screenBuffer + MAXX * a, 0, MAXX * 2);
|
||||
|
||||
SDText SText;
|
||||
SText.set(0, TOP - 20, MAXX, CARHEI, 0, 0, MAXX, CARHEI, 0x7FFF, MASKCOL, _sysText[kMessageSavePosition]);
|
||||
SText.DText();
|
||||
|
||||
_graphicsMgr->copyToScreen(0, 0, MAXX, TOP);
|
||||
|
||||
for (int a = TOP + AREA; a < AREA + 2 * TOP; a++)
|
||||
memset(_screenBuffer + MAXX * a, 0, MAXX * 2);
|
||||
_graphicsMgr->copyToScreen(0, TOP + AREA, MAXX, TOP);
|
||||
|
||||
_gameQueue.initQueue();
|
||||
_animQueue.initQueue();
|
||||
_characterQueue.initQueue();
|
||||
|
||||
FreeKey();
|
||||
|
||||
// Reset the inventory and turn it into save slots
|
||||
memcpy(OldInv, _inventory, MAXICON);
|
||||
memset(_inventory, 0, MAXICON);
|
||||
OldIconBase = _iconBase;
|
||||
_iconBase = 0;
|
||||
OldInvLen = _inventorySize;
|
||||
_inventorySize = MAXSAVEFILE;
|
||||
|
||||
insave:
|
||||
|
||||
int8 CurPos = -1;
|
||||
int8 OldPos = -1;
|
||||
bool skipSave = false;
|
||||
ch = 0;
|
||||
|
||||
loadSaveSlots(saveNames);
|
||||
|
||||
for (;;) {
|
||||
checkSystem();
|
||||
GetKey();
|
||||
|
||||
int16 mx = _mouseX;
|
||||
int16 my = _mouseY;
|
||||
|
||||
if (my >= FIRSTLINE &&
|
||||
my < FIRSTLINE + ICONDY &&
|
||||
mx >= ICONMARGSX &&
|
||||
mx < MAXX - ICONMARGDX) {
|
||||
OldPos = CurPos;
|
||||
CurPos = ((mx - ICONMARGSX) / ICONDX);
|
||||
|
||||
if (OldPos != CurPos) {
|
||||
for (int a = FIRSTLINE + ICONDY + 10; a < FIRSTLINE + ICONDY + 10 + CARHEI; a++)
|
||||
memset(_screenBuffer + MAXX * a, 0, MAXX * 2);
|
||||
|
||||
posx = ICONMARGSX + ((CurPos) * (ICONDX)) + ICONDX / 2;
|
||||
LenText = TextLength(saveNames[CurPos].c_str(), 0);
|
||||
|
||||
posx = CLIP(posx - (LenText / 2), 2, MAXX - 2 - LenText);
|
||||
SText.set(posx, FIRSTLINE + ICONDY + 10, LenText, CARHEI, 0, 0, LenText, CARHEI, 0x7FFF, MASKCOL, saveNames[CurPos].c_str());
|
||||
SText.DText();
|
||||
|
||||
_graphicsMgr->copyToScreen(0, FIRSTLINE + ICONDY + 10, MAXX, CARHEI);
|
||||
}
|
||||
|
||||
if (_mouseLeftBtn)
|
||||
break;
|
||||
}
|
||||
else {
|
||||
if (OldPos != -1) {
|
||||
for (int a = FIRSTLINE + ICONDY + 10; a < FIRSTLINE + ICONDY + 10 + CARHEI; a++)
|
||||
memset(_screenBuffer + MAXX * a, 0, MAXX * 2);
|
||||
|
||||
_graphicsMgr->copyToScreen(0, FIRSTLINE + ICONDY + 10, MAXX, CARHEI);
|
||||
}
|
||||
|
||||
OldPos = -1;
|
||||
CurPos = -1;
|
||||
|
||||
if (_mouseLeftBtn || _mouseRightBtn) {
|
||||
skipSave = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!skipSave) {
|
||||
if (_inventory[CurPos] == iEMPTYSLOT) {
|
||||
saveNames[CurPos].clear();
|
||||
|
||||
for (int a = FIRSTLINE + ICONDY + 10; a < FIRSTLINE + ICONDY + 10 + CARHEI; a++)
|
||||
memset(_screenBuffer + MAXX * a, 0, MAXX * 2);
|
||||
|
||||
_graphicsMgr->copyToScreen(0, FIRSTLINE + ICONDY + 10, MAXX, CARHEI);
|
||||
}
|
||||
|
||||
for (;;) {
|
||||
_keybInput = true;
|
||||
checkSystem();
|
||||
ch = GetKey();
|
||||
FreeKey();
|
||||
|
||||
_keybInput = false;
|
||||
|
||||
if (ch == 0x1B) {
|
||||
ch = 0;
|
||||
for (int a = FIRSTLINE + ICONDY + 10; a < FIRSTLINE + ICONDY + 10 + CARHEI; a++)
|
||||
memset(_screenBuffer + MAXX * a, 0, MAXX * 2);
|
||||
|
||||
_graphicsMgr->copyToScreen(0, FIRSTLINE + ICONDY + 10, MAXX, CARHEI);
|
||||
|
||||
goto insave;
|
||||
}
|
||||
|
||||
if (ch == 8) // Backspace
|
||||
saveNames[CurPos].deleteLastChar();
|
||||
else if (ch == 13) // Enter
|
||||
break;
|
||||
else if (saveNames[CurPos].size() < 39 && Common::isPrint(ch))
|
||||
saveNames[CurPos] += ch;
|
||||
|
||||
for (int a = FIRSTLINE + ICONDY + 10; a < FIRSTLINE + ICONDY + 10 + CARHEI; a++)
|
||||
memset(_screenBuffer + MAXX * a, 0, MAXX * 2);
|
||||
|
||||
saveNames[CurPos] += '_'; // add blinking cursor
|
||||
|
||||
posx = ICONMARGSX + ((CurPos) * (ICONDX)) + ICONDX / 2;
|
||||
LenText = TextLength(saveNames[CurPos].c_str(), 0);
|
||||
|
||||
posx = CLIP(posx - (LenText / 2), 2, MAXX - 2 - LenText);
|
||||
SText.set(posx, FIRSTLINE + ICONDY + 10, LenText, CARHEI, 0, 0, LenText, CARHEI, 0x7FFF, MASKCOL, saveNames[CurPos].c_str());
|
||||
|
||||
if ((ReadTime() / 8) & 1)
|
||||
BlinkLastDTextChar = 0x0000;
|
||||
|
||||
SText.DText();
|
||||
BlinkLastDTextChar = MASKCOL;
|
||||
|
||||
saveNames[CurPos].deleteLastChar(); // remove blinking cursor
|
||||
|
||||
_graphicsMgr->copyToScreen(0, FIRSTLINE + ICONDY + 10, MAXX, CARHEI);
|
||||
}
|
||||
|
||||
for (int a = FIRSTLINE; a < MAXY; a++)
|
||||
memset(_screenBuffer + MAXX * a, 0, MAXX * 2);
|
||||
|
||||
ret = false;
|
||||
|
||||
// Restore the inventory
|
||||
memcpy(_inventory, OldInv, MAXICON);
|
||||
_curInventory = 0;
|
||||
_iconBase = OldIconBase;
|
||||
_inventorySize = OldInvLen;
|
||||
|
||||
saveGameState(CurPos + 1, saveNames[CurPos]);
|
||||
}
|
||||
|
||||
for (int a = FIRSTLINE; a < MAXY; a++)
|
||||
memset(_screenBuffer + MAXX * a, 0, MAXX * 2);
|
||||
|
||||
_graphicsMgr->copyToScreen(0, FIRSTLINE, MAXX, TOP);
|
||||
|
||||
for (int a = TOP - 20; a < TOP - 20 + CARHEI; a++)
|
||||
memset(_screenBuffer + MAXX * a, 0, MAXX * 2);
|
||||
|
||||
_graphicsMgr->copyToScreen(0, 0, MAXX, TOP);
|
||||
|
||||
// Restore the inventory
|
||||
memcpy(_inventory, OldInv, MAXICON);
|
||||
_curInventory = 0;
|
||||
_iconBase = OldIconBase;
|
||||
_inventorySize = OldInvLen;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*-----------------09/02/96 20.57-------------------
|
||||
DataLoad
|
||||
--------------------------------------------------*/
|
||||
bool TrecisionEngine::DataLoad() {
|
||||
Common::StringArray saveNames;
|
||||
saveNames.reserve(MAXSAVEFILE);
|
||||
bool retval = true;
|
||||
|
||||
if (!ConfMan.getBool("originalsaveload")) {
|
||||
GUI::SaveLoadChooser *dialog = new GUI::SaveLoadChooser(_("Load game:"), _("Load"), false);
|
||||
int saveSlot = dialog->runModalWithCurrentTarget();
|
||||
bool skipLoad = saveSlot == -1;
|
||||
delete dialog;
|
||||
|
||||
// Remove the mouse click event from the save/load dialog
|
||||
eventLoop();
|
||||
_mouseLeftBtn = _mouseRightBtn = false;
|
||||
|
||||
performLoad(saveSlot - 1, skipLoad);
|
||||
|
||||
return !skipLoad;
|
||||
}
|
||||
|
||||
for (int a = 0; a < TOP; a++)
|
||||
memset(_screenBuffer + MAXX * a, 0, MAXX * 2);
|
||||
|
||||
showCursor();
|
||||
|
||||
SDText SText;
|
||||
SText.set(0, TOP - 20, MAXX, CARHEI, 0, 0, MAXX, CARHEI, 0x7FFF, MASKCOL, _sysText[kMessageLoadPosition]);
|
||||
SText.DText();
|
||||
|
||||
_graphicsMgr->copyToScreen(0, 0, MAXX, TOP);
|
||||
|
||||
for (int a = TOP + AREA; a < AREA + 2 * TOP; a++)
|
||||
memset(_screenBuffer + MAXX * a, 0, MAXX * 2);
|
||||
_graphicsMgr->copyToScreen(0, TOP + AREA, MAXX, TOP);
|
||||
|
||||
_gameQueue.initQueue();
|
||||
_animQueue.initQueue();
|
||||
_characterQueue.initQueue();
|
||||
|
||||
FreeKey();
|
||||
|
||||
uint8 OldInv[MAXICON];
|
||||
// Reset the inventory and turn it into save slots
|
||||
memcpy(OldInv, _inventory, MAXICON);
|
||||
memset(_inventory, 0, MAXICON);
|
||||
uint8 OldIconBase = _iconBase;
|
||||
_iconBase = 0;
|
||||
uint8 OldInvLen = _inventorySize;
|
||||
_inventorySize = MAXSAVEFILE;
|
||||
|
||||
loadSaveSlots(saveNames);
|
||||
|
||||
bool skipLoad = false;
|
||||
int8 CurPos = -1;
|
||||
int8 OldPos = -1;
|
||||
|
||||
for (;;) {
|
||||
checkSystem();
|
||||
GetKey();
|
||||
|
||||
if (_mouseY >= FIRSTLINE &&
|
||||
_mouseY < (FIRSTLINE + ICONDY) &&
|
||||
_mouseX >= ICONMARGSX &&
|
||||
(_mouseX < (MAXX - ICONMARGDX))) {
|
||||
OldPos = CurPos;
|
||||
CurPos = (_mouseX - ICONMARGSX) / ICONDX;
|
||||
|
||||
if (OldPos != CurPos) {
|
||||
for (int a = FIRSTLINE + ICONDY + 10; a < FIRSTLINE + ICONDY + 10 + CARHEI; a++)
|
||||
memset(_screenBuffer + MAXX * a, 0, MAXX * 2);
|
||||
|
||||
uint16 posX = ICONMARGSX + ((CurPos) * (ICONDX)) + ICONDX / 2;
|
||||
uint16 lenText = TextLength(saveNames[CurPos].c_str(), 0);
|
||||
if (posX - (lenText / 2) < 2)
|
||||
posX = 2;
|
||||
else
|
||||
posX = posX - (lenText / 2);
|
||||
if ((posX + lenText) > MAXX - 2)
|
||||
posX = MAXX - 2 - lenText;
|
||||
|
||||
SText.set(posX, FIRSTLINE + ICONDY + 10, lenText, CARHEI, 0, 0, lenText, CARHEI, 0x7FFF, MASKCOL, saveNames[CurPos].c_str());
|
||||
SText.DText();
|
||||
|
||||
_graphicsMgr->copyToScreen(0, FIRSTLINE + ICONDY + 10, MAXX, CARHEI);
|
||||
}
|
||||
|
||||
if (_mouseLeftBtn && (_inventory[CurPos] != iEMPTYSLOT))
|
||||
break;
|
||||
}
|
||||
else {
|
||||
if (OldPos != -1) {
|
||||
for (int a = FIRSTLINE + ICONDY + 10; a < FIRSTLINE + ICONDY + 10 + CARHEI; a++)
|
||||
memset(_screenBuffer + MAXX * a, 0, MAXX * 2);
|
||||
|
||||
_graphicsMgr->copyToScreen(0, FIRSTLINE + ICONDY + 10, MAXX, CARHEI);
|
||||
}
|
||||
|
||||
OldPos = -1;
|
||||
CurPos = -1;
|
||||
|
||||
if (_mouseLeftBtn || _mouseRightBtn) {
|
||||
retval = false;
|
||||
skipLoad = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
performLoad(CurPos, skipLoad);
|
||||
|
||||
if (skipLoad) {
|
||||
// Restore the inventory
|
||||
memcpy(_inventory, OldInv, MAXICON);
|
||||
_curInventory = 0;
|
||||
_iconBase = OldIconBase;
|
||||
_inventorySize = OldInvLen;
|
||||
}
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
void TrecisionEngine::performLoad(int slot, bool skipLoad) {
|
||||
if (!skipLoad) {
|
||||
for (int a = FIRSTLINE; a < MAXY; a++)
|
||||
memset(_screenBuffer + MAXX * a, 0, MAXX * 2);
|
||||
|
||||
loadGameState(slot + 1);
|
||||
|
||||
_flagNoPaintScreen = true;
|
||||
_curStack = 0;
|
||||
_flagscriptactive = false;
|
||||
|
||||
_oldRoom = _curRoom;
|
||||
doEvent(MC_SYSTEM, ME_CHANGEROOM, MP_SYSTEM, _curRoom, 0, 0, 0);
|
||||
}
|
||||
|
||||
actorStop();
|
||||
nextStep();
|
||||
checkSystem();
|
||||
|
||||
for (int a = FIRSTLINE; a < MAXY; a++)
|
||||
memset(_screenBuffer + MAXX * a, 0, MAXX * 2);
|
||||
|
||||
_graphicsMgr->copyToScreen(0, FIRSTLINE, MAXX, TOP);
|
||||
|
||||
for (int a = TOP - 20; a < TOP - 20 + CARHEI; a++)
|
||||
memset(_screenBuffer + MAXX * a, 0, MAXX * 2);
|
||||
|
||||
_graphicsMgr->copyToScreen(0, 0, MAXX, TOP);
|
||||
|
||||
if (_flagscriptactive) {
|
||||
hideCursor();
|
||||
}
|
||||
}
|
||||
|
||||
SActor::SActor(TrecisionEngine *vm) : _vm(vm) {
|
||||
_vertex = nullptr;
|
||||
_face = nullptr;
|
||||
|
|
|
@ -24,9 +24,6 @@
|
|||
#define TRECISION_TRECISION_H
|
||||
|
||||
#include "engines/engine.h"
|
||||
#include "common/keyboard.h"
|
||||
#include "common/serializer.h"
|
||||
#include "graphics/surface.h"
|
||||
|
||||
#include "trecision/nl/3d/3dinc.h"
|
||||
#include "trecision/nl/ll/llinc.h"
|
||||
|
@ -34,6 +31,13 @@
|
|||
#include "trecision/fastfile.h"
|
||||
#include "trecision/video.h"
|
||||
|
||||
#include "common/str-array.h"
|
||||
#include "common/keyboard.h"
|
||||
#include "common/serializer.h"
|
||||
#include "graphics/surface.h"
|
||||
#include "common/str.h"
|
||||
|
||||
|
||||
namespace Trecision {
|
||||
class AnimManager;
|
||||
class GraphicsManager;
|
||||
|
@ -46,6 +50,7 @@ class SoundManager;
|
|||
#define MAXROOMS 100 // Game rooms
|
||||
#define MAXOBJ 1400 // Game objects
|
||||
#define MAXINVENTORY 150 // Inventory Items
|
||||
#define MAXSAVEFILE 12
|
||||
|
||||
enum TrecisionMessageIds {
|
||||
kMessageSavePosition = 9,
|
||||
|
@ -66,6 +71,8 @@ class TrecisionEngine : public Engine {
|
|||
void openDataFiles();
|
||||
void initNames();
|
||||
void LoadAll();
|
||||
void loadSaveSlots(Common::StringArray &saveNames);
|
||||
Graphics::Surface *convertScummVMThumbnail(Graphics::Surface *thumbnail);
|
||||
|
||||
public:
|
||||
TrecisionEngine(OSystem *syst);
|
||||
|
@ -119,7 +126,6 @@ public:
|
|||
uint32 ReadTime();
|
||||
bool CheckMask(uint16 mx, uint16 my);
|
||||
|
||||
|
||||
// Text
|
||||
void addText(uint16 x, uint16 y, const char *text, uint16 tcol, uint16 scol);
|
||||
void clearText();
|
||||
|
@ -133,7 +139,10 @@ public:
|
|||
bool isCursorVisible();
|
||||
void showCursor();
|
||||
void hideCursor();
|
||||
|
||||
bool DataSave();
|
||||
bool DataLoad();
|
||||
void performLoad(int slot, bool skipLoad);
|
||||
|
||||
Graphics::Surface _thumbnail;
|
||||
|
||||
uint16 _curRoom;
|
||||
|
@ -261,6 +270,8 @@ public:
|
|||
|
||||
uint16 *ObjPointers[MAXOBJINROOM];
|
||||
uint8 *MaskPointers[MAXOBJINROOM];
|
||||
|
||||
uint16 BlinkLastDTextChar;
|
||||
};
|
||||
|
||||
extern TrecisionEngine *g_vm;
|
||||
|
|
|
@ -325,6 +325,18 @@ bool TrecisionEngine::CheckMask(uint16 mx, uint16 my) {
|
|||
return false;
|
||||
}
|
||||
|
||||
Graphics::Surface *TrecisionEngine::convertScummVMThumbnail(Graphics::Surface *thumbnail) {
|
||||
Graphics::Surface *thumbnailConverted = thumbnail->convertTo(g_system->getScreenFormat());
|
||||
Graphics::Surface *result = thumbnailConverted->scale(ICONDX, ICONDY);
|
||||
|
||||
thumbnailConverted->free();
|
||||
delete thumbnailConverted;
|
||||
thumbnail->free();
|
||||
delete thumbnail;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
|
||||
} // End of namespace Trecision
|
||||
|
|
|
@ -27,6 +27,7 @@
|
|||
|
||||
#include "common/file.h"
|
||||
#include "video/smk_decoder.h"
|
||||
#include "common/serializer.h"
|
||||
|
||||
namespace Trecision {
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue