TRECISION: Move save/load code to main class

This commit is contained in:
Strangerke 2021-04-21 19:55:59 +02:00 committed by SupSuper
parent 9e7dd6ab75
commit 980a41072b
8 changed files with 464 additions and 447 deletions

View file

@ -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);
}

View file

@ -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);

View file

@ -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();

View file

@ -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
--------------------------------------------------*/

View file

@ -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;

View file

@ -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;

View file

@ -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

View file

@ -27,6 +27,7 @@
#include "common/file.h"
#include "video/smk_decoder.h"
#include "common/serializer.h"
namespace Trecision {