GNAP: Add savegames (not fully working yet)
This commit is contained in:
parent
66f5610c74
commit
f1738f457f
5 changed files with 360 additions and 203 deletions
|
@ -76,11 +76,10 @@ public:
|
|||
|
||||
bool GnapMetaEngine::hasFeature(MetaEngineFeature f) const {
|
||||
return
|
||||
false;
|
||||
#if 0
|
||||
(f == kSupportsListSaves) ||
|
||||
(f == kSupportsLoadingDuringStartup) ||
|
||||
(f == kSupportsDeleteSave) ||
|
||||
(f == kSupportsDeleteSave);
|
||||
#if 0
|
||||
(f == kSavesSupportMetaInfo) ||
|
||||
(f == kSavesSupportThumbnail) ||
|
||||
(f == kSavesSupportCreationDate);
|
||||
|
@ -97,49 +96,39 @@ int GnapMetaEngine::getMaximumSaveSlot() const { return 99; }
|
|||
SaveStateList GnapMetaEngine::listSaves(const char *target) const {
|
||||
Common::SaveFileManager *saveFileMan = g_system->getSavefileManager();
|
||||
Common::StringArray filenames;
|
||||
Common::String pattern = target;
|
||||
pattern += ".???";
|
||||
Common::String saveDesc;
|
||||
Common::String pattern = Common::String::format("%s.0##", target);
|
||||
Gnap::GnapSavegameHeader header;
|
||||
|
||||
filenames = saveFileMan->listSavefiles(pattern);
|
||||
sort(filenames.begin(), filenames.end()); // Sort (hopefully ensuring we are sorted numerically..)
|
||||
|
||||
SaveStateList saveList;
|
||||
#if 0
|
||||
int slotNum = 0;
|
||||
for (Common::StringArray::const_iterator filename = filenames.begin(); filename != filenames.end(); ++filename) {
|
||||
// Obtain the last 3 digits of the filename, since they correspond to the save slot
|
||||
slotNum = atoi(filename->c_str() + filename->size() - 3);
|
||||
for (Common::StringArray::const_iterator file = filenames.begin(); file != filenames.end(); ++file) {
|
||||
const char *ext = strrchr(file->c_str(), '.');
|
||||
int slot = ext ? atoi(ext + 1) : -1;
|
||||
|
||||
if (slotNum >= 0 && slotNum <= 99) {
|
||||
Common::InSaveFile *file = saveFileMan->openForLoading(*filename);
|
||||
if (file) {
|
||||
int32 version = file->readSint32BE();
|
||||
if (version != GNAP_SAVEGAME_VERSION) {
|
||||
delete file;
|
||||
continue;
|
||||
if (slot >= 0 && slot < getMaximumSaveSlot()) {
|
||||
Common::InSaveFile *in = g_system->getSavefileManager()->openForLoading(*file);
|
||||
|
||||
if (in) {
|
||||
Gnap::GnapEngine::readSavegameHeader(in, header);
|
||||
saveList.push_back(SaveStateDescriptor(slot, header._saveName));
|
||||
|
||||
if (header._thumbnail) {
|
||||
header._thumbnail->free();
|
||||
delete header._thumbnail;
|
||||
}
|
||||
delete in;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// read name
|
||||
uint16 nameSize = file->readUint16BE();
|
||||
if (nameSize >= 255) {
|
||||
delete file;
|
||||
continue;
|
||||
}
|
||||
char name[256];
|
||||
file->read(name, nameSize);
|
||||
name[nameSize] = 0;
|
||||
|
||||
saveList.push_back(SaveStateDescriptor(slotNum, name));
|
||||
delete file;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
// Sort saves based on slot number.
|
||||
Common::sort(saveList.begin(), saveList.end(), SaveStateDescriptorSlotComparator());
|
||||
return saveList;
|
||||
}
|
||||
|
||||
SaveStateDescriptor GnapMetaEngine::querySaveMetaInfos(const char *target, int slot) const {
|
||||
#if 0
|
||||
Common::String fileName = Common::String::format("%s.%03d", target, slot);
|
||||
Common::InSaveFile *file = g_system->getSavefileManager()->openForLoading(fileName);
|
||||
if (file) {
|
||||
|
@ -177,7 +166,7 @@ SaveStateDescriptor GnapMetaEngine::querySaveMetaInfos(const char *target, int s
|
|||
delete file;
|
||||
return desc;
|
||||
}
|
||||
#endif
|
||||
|
||||
return SaveStateDescriptor();
|
||||
}
|
||||
|
||||
|
|
|
@ -300,6 +300,18 @@ void GameSys::drawTextToSurface(Graphics::Surface *surface, int x, int y, byte r
|
|||
|
||||
}
|
||||
|
||||
int GameSys::getTextHeight(const char *text) {
|
||||
byte height = 0;
|
||||
for (const char *cp = text; *cp != 0; ++cp) {
|
||||
byte c = *cp;
|
||||
if (c < 32 || c > 127)
|
||||
c = (byte)'_';
|
||||
c -= 32;
|
||||
height = MAX(height, _dejaVuSans9ptCharDescriptors[c]._width);
|
||||
}
|
||||
return height;
|
||||
}
|
||||
|
||||
int GameSys::getTextWidth(const char *text) {
|
||||
int width = 0;
|
||||
for (const char *cp = text; *cp != 0; ++cp) {
|
||||
|
|
|
@ -119,6 +119,7 @@ public:
|
|||
Graphics::Surface *createSurface(int resourceId);
|
||||
void drawSpriteToSurface(Graphics::Surface *surface, int x, int y, int resourceId);
|
||||
void drawTextToSurface(Graphics::Surface *surface, int x, int y, byte r, byte g, byte b, const char *text);
|
||||
int getTextHeight(const char *text);
|
||||
int getTextWidth(const char *text);
|
||||
void fillSurface(Graphics::Surface *surface, int x, int y, int width, int height, byte r, byte g, byte b);
|
||||
void setAnimation(int sequenceId, int id, int animationIndex);
|
||||
|
|
|
@ -28,6 +28,8 @@
|
|||
#include "common/file.h"
|
||||
#include "common/memstream.h"
|
||||
#include "common/random.h"
|
||||
#include "common/savefile.h"
|
||||
#include "common/serializer.h"
|
||||
#include "common/str.h"
|
||||
#include "common/substream.h"
|
||||
#include "common/system.h"
|
||||
|
@ -49,6 +51,8 @@ class SpriteResource;
|
|||
class GameSys;
|
||||
class SoundMan;
|
||||
|
||||
#define GNAP_SAVEGAME_VERSION 1
|
||||
|
||||
struct MouseButtonState {
|
||||
bool _left;
|
||||
bool _right;
|
||||
|
@ -244,6 +248,14 @@ enum Facing {
|
|||
kDirUpRight = 7
|
||||
};
|
||||
|
||||
struct GnapSavegameHeader {
|
||||
uint8 _version;
|
||||
Common::String _saveName;
|
||||
Graphics::Surface *_thumbnail;
|
||||
int _year, _month, _day;
|
||||
int _hour, _minute;
|
||||
};
|
||||
|
||||
class GnapEngine : public Engine {
|
||||
protected:
|
||||
Common::Error run();
|
||||
|
@ -334,6 +346,12 @@ public:
|
|||
|
||||
int readSavegameDescription(int savegameNum, Common::String &description);
|
||||
int loadSavegame(int savegameNum);
|
||||
Common::Error saveGameState(int slot, const Common::String &desc);
|
||||
Common::Error loadGameState(int slot);
|
||||
Common::String generateSaveName(int slot);
|
||||
void synchronize(Common::Serializer &s);
|
||||
void writeSavegameHeader(Common::OutSaveFile *out, GnapSavegameHeader &header);
|
||||
static bool readSavegameHeader(Common::InSaveFile *in, GnapSavegameHeader &header);
|
||||
|
||||
void delayTicks(int a1);
|
||||
void delayTicksCursor(int a1);
|
||||
|
|
|
@ -20,6 +20,12 @@
|
|||
*
|
||||
*/
|
||||
|
||||
#include "common/config-manager.h"
|
||||
#include "common/savefile.h"
|
||||
#include "common/translation.h"
|
||||
|
||||
#include "gui/saveload.h"
|
||||
|
||||
#include "gnap/gnap.h"
|
||||
#include "gnap/datarchive.h"
|
||||
#include "gnap/gamesys.h"
|
||||
|
@ -452,6 +458,7 @@ void GnapEngine::updateMenuStatusMainMenu() {
|
|||
if (_sceneClickedHotspot != 1 && _sceneClickedHotspot != 0) {
|
||||
if (_sceneClickedHotspot != 2 && _hotspotsCount - 1 != _sceneClickedHotspot) {
|
||||
if (_sceneClickedHotspot == 3) {
|
||||
// Quit
|
||||
_timers[2] = 10;
|
||||
playSound(0x108F4, 0);
|
||||
_gameSys->removeSpriteDrawItem(_menuSprite1, 262);
|
||||
|
@ -461,13 +468,13 @@ void GnapEngine::updateMenuStatusMainMenu() {
|
|||
_menuQuitQuerySprite = _gameSys->createSurface(0x104FC);
|
||||
_gameSys->insertSpriteDrawItem(_menuQuitQuerySprite, 254, 93, 262);
|
||||
} else if (_sceneClickedHotspot == 4) {
|
||||
// Pause ?
|
||||
playSound(0x108F4, 0);
|
||||
Common::Rect dirtyRect(0, 0, 799, 599);
|
||||
hideCursor();
|
||||
_largeSprite = _gameSys->allocSurface(800, 600);
|
||||
|
||||
for (int i = 0; i < 3; ++i) {
|
||||
|
||||
_timers[2] = 10;
|
||||
|
||||
if (i == 0) {
|
||||
|
@ -502,6 +509,7 @@ void GnapEngine::updateMenuStatusMainMenu() {
|
|||
deleteSurface(&_largeSprite);
|
||||
showCursor();
|
||||
} else if (_hotspotsCount - 3 == _sceneClickedHotspot) {
|
||||
// Button
|
||||
_timers[2] = 10;
|
||||
playSound(0x108F4, 0);
|
||||
initMenuHotspots1();
|
||||
|
@ -517,20 +525,51 @@ void GnapEngine::updateMenuStatusMainMenu() {
|
|||
_gameSys->insertDirtyRect(dirtyRect);
|
||||
}
|
||||
} else {
|
||||
// Resume
|
||||
playSound(0x108F5, 0);
|
||||
_menuDone = true;
|
||||
}
|
||||
} else {
|
||||
// Save / Load
|
||||
_timers[2] = 10;
|
||||
playSound(0x108F4, 0);
|
||||
|
||||
if (_sceneClickedHotspot == 1) {
|
||||
GUI::SaveLoadChooser *dialog = new GUI::SaveLoadChooser(_("Save game:"), _("Save"), true);
|
||||
int16 savegameId = dialog->runModalWithCurrentTarget();
|
||||
Common::String savegameDescription = dialog->getResultString();
|
||||
delete dialog;
|
||||
|
||||
if (savegameId != -1) {
|
||||
saveGameState(savegameId, savegameDescription);
|
||||
}
|
||||
} else {
|
||||
GUI::SaveLoadChooser *dialog = new GUI::SaveLoadChooser(_("Restore game:"), _("Restore"), false);
|
||||
int16 savegameId = dialog->runModalWithCurrentTarget();
|
||||
delete dialog;
|
||||
|
||||
if (savegameId != -1) {
|
||||
loadGameState(savegameId);
|
||||
_wasSavegameLoaded = true;
|
||||
_menuDone = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#if 0
|
||||
// Original Code
|
||||
_timers[2] = 10;
|
||||
playSound(0x108F4, 0);
|
||||
_gameSys->removeSpriteDrawItem(_menuSprite1, 262);
|
||||
if (_menuSaveLoadSprite)
|
||||
deleteSurface(&_menuSaveLoadSprite);
|
||||
if (_sceneClickedHotspot == 1) {
|
||||
// Save
|
||||
_menuStatus = 2;
|
||||
initSaveLoadHotspots();
|
||||
_menuSaveLoadSprite = _gameSys->createSurface(0x104FB);
|
||||
} else {
|
||||
// Load
|
||||
_menuStatus = 3;
|
||||
initSaveLoadHotspots();
|
||||
_menuSaveLoadSprite = _gameSys->createSurface(0x104FA);
|
||||
|
@ -550,179 +589,277 @@ void GnapEngine::updateMenuStatusMainMenu() {
|
|||
}
|
||||
_savegameIndex = -1;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
Common::Error GnapEngine::saveGameState(int slot, const Common::String &desc) {
|
||||
Common::OutSaveFile *out = g_system->getSavefileManager()->openForSaving(
|
||||
generateSaveName(slot));
|
||||
if (!out)
|
||||
return Common::kCreatingFileFailed;
|
||||
|
||||
GnapSavegameHeader header;
|
||||
header._saveName = desc;
|
||||
writeSavegameHeader(out, header);
|
||||
|
||||
Common::Serializer s(nullptr, out);
|
||||
synchronize(s);
|
||||
|
||||
out->finalize();
|
||||
delete out;
|
||||
|
||||
return Common::kNoError;
|
||||
}
|
||||
|
||||
void GnapEngine::synchronize(Common::Serializer &s) {
|
||||
s.syncAsSint32LE(_newSceneNum);
|
||||
s.syncAsSint32LE(_currentSceneNum);
|
||||
s.syncAsSint32LE(_newCursorValue);
|
||||
s.syncAsUint32LE(_inventory);
|
||||
s.syncAsUint32LE(_gameFlags);
|
||||
|
||||
if (s.isLoading() && isFlag(24)) {
|
||||
_timers[9] = 600;
|
||||
}
|
||||
}
|
||||
|
||||
const char *const SAVEGAME_STR = "GNAP";
|
||||
#define SAVEGAME_STR_SIZE 4
|
||||
void GnapEngine::writeSavegameHeader(Common::OutSaveFile *out, GnapSavegameHeader &header) {
|
||||
// Write out a savegame header
|
||||
out->write(SAVEGAME_STR, SAVEGAME_STR_SIZE + 1);
|
||||
|
||||
out->writeByte(GNAP_SAVEGAME_VERSION);
|
||||
|
||||
// Write savegame name
|
||||
out->writeString(header._saveName);
|
||||
out->writeByte('\0');
|
||||
|
||||
// TODO: Add thumbnail
|
||||
|
||||
// Write out the save date/time
|
||||
TimeDate td;
|
||||
g_system->getTimeAndDate(td);
|
||||
out->writeSint16LE(td.tm_year + 1900);
|
||||
out->writeSint16LE(td.tm_mon + 1);
|
||||
out->writeSint16LE(td.tm_mday);
|
||||
out->writeSint16LE(td.tm_hour);
|
||||
out->writeSint16LE(td.tm_min);
|
||||
}
|
||||
|
||||
bool GnapEngine::readSavegameHeader(Common::InSaveFile *in, GnapSavegameHeader &header) {
|
||||
char saveIdentBuffer[SAVEGAME_STR_SIZE + 1];
|
||||
header._thumbnail = nullptr;
|
||||
|
||||
// Validate the header Id
|
||||
in->read(saveIdentBuffer, SAVEGAME_STR_SIZE + 1);
|
||||
if (strncmp(saveIdentBuffer, SAVEGAME_STR, SAVEGAME_STR_SIZE))
|
||||
return false;
|
||||
|
||||
header._version = in->readByte();
|
||||
if (header._version > GNAP_SAVEGAME_VERSION)
|
||||
return false;
|
||||
|
||||
// Read in the string
|
||||
header._saveName.clear();
|
||||
char ch;
|
||||
while ((ch = (char)in->readByte()) != '\0')
|
||||
header._saveName += ch;
|
||||
|
||||
// TODO: Get the thumbnail
|
||||
header._thumbnail = nullptr;
|
||||
|
||||
// Read in save date/time
|
||||
header._year = in->readSint16LE();
|
||||
header._month = in->readSint16LE();
|
||||
header._day = in->readSint16LE();
|
||||
header._hour = in->readSint16LE();
|
||||
header._minute = in->readSint16LE();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
Common::Error GnapEngine::loadGameState(int slot) {
|
||||
Common::InSaveFile *saveFile = g_system->getSavefileManager()->openForLoading(
|
||||
generateSaveName(slot));
|
||||
if (!saveFile)
|
||||
return Common::kReadingFailed;
|
||||
|
||||
Common::Serializer s(saveFile, nullptr);
|
||||
|
||||
// Load the savegame header
|
||||
GnapSavegameHeader header;
|
||||
if (!readSavegameHeader(saveFile, header))
|
||||
error("Invalid savegame");
|
||||
|
||||
if (header._thumbnail) {
|
||||
header._thumbnail->free();
|
||||
delete header._thumbnail;
|
||||
}
|
||||
|
||||
synchronize(s);
|
||||
delete saveFile;
|
||||
|
||||
return Common::kNoError;
|
||||
}
|
||||
|
||||
Common::String GnapEngine::generateSaveName(int slot) {
|
||||
return Common::String::format("%s.%03d", _targetName.c_str(), slot);
|
||||
}
|
||||
|
||||
void GnapEngine::updateMenuStatusSaveGame() {
|
||||
#if 0 // TODO
|
||||
_hotspots[0].x1 = 288;
|
||||
_hotspots[0].y1 = 74;
|
||||
_hotspots[0].x2 = 379;
|
||||
_hotspots[0].y2 = 96;
|
||||
#if 1 // TODO
|
||||
char v43[30];
|
||||
int v46;
|
||||
v43[0] = '\0';
|
||||
_hotspots[0]._x1 = 288;
|
||||
_hotspots[0]._y1 = 74;
|
||||
_hotspots[0]._x2 = 379;
|
||||
_hotspots[0]._y2 = 96;
|
||||
_sceneClickedHotspot = -1;
|
||||
|
||||
if (!_timers[2])
|
||||
_sceneClickedHotspot = getClickedHotspotId();
|
||||
if (_hotspotsCount - 3 == _sceneClickedHotspot)
|
||||
{
|
||||
|
||||
if (_hotspotsCount - 3 == _sceneClickedHotspot) {
|
||||
// Button
|
||||
_timers[2] = 10;
|
||||
playSound(0x108F4, 0);
|
||||
_menuStatus = 1;
|
||||
writeSavegame(_savegameIndex + 1, (int)&_savegameFilenames[30 * _savegameIndex], 1);
|
||||
}
|
||||
else if (_hotspotsCount - 4 == _sceneClickedHotspot)
|
||||
{
|
||||
warning("writeSavegame(_savegameIndex + 1, (int)&_savegameFilenames[30 * _savegameIndex], 1);");
|
||||
} else if (_hotspotsCount - 4 == _sceneClickedHotspot) {
|
||||
// Cancel
|
||||
_timers[2] = 10;
|
||||
playSound(0x108F5, 0);
|
||||
_menuStatus = 1;
|
||||
if (strcmp(&v43, &_savegameFilenames[30 * _savegameIndex]) && _savegameIndex != -1)
|
||||
{
|
||||
strcpy((char *)&_savegameFilenames[30 * _savegameIndex], &v43);
|
||||
if (_savegameSprites[_savegameIndex] != -1)
|
||||
{
|
||||
if (strcmp(v43, _savegameFilenames[_savegameIndex]) && _savegameIndex != -1) {
|
||||
strcpy(_savegameFilenames[_savegameIndex], v43);
|
||||
if (_savegameSprites[_savegameIndex] != nullptr) {
|
||||
_gameSys->removeSpriteDrawItem(_savegameSprites[_savegameIndex], 263);
|
||||
delayTicksCursor(5);
|
||||
memFreeHandle(_savegameSprites[_savegameIndex]);
|
||||
warning("memFreeHandle(_savegameSprites[_savegameIndex]);");
|
||||
}
|
||||
v16 = getSpriteWidthById(0x104F9);
|
||||
_savegameSprites[_savegameIndex] = allocSprite(v16, 40, 128, 0);
|
||||
int v16 = _gameSys->getSpriteWidthById(0x104F9);
|
||||
warning("_savegameSprites[_savegameIndex] = allocSprite(v16, 40, 128, 0);");
|
||||
}
|
||||
}
|
||||
else if (_hotspotsCount - 5 == _sceneClickedHotspot)
|
||||
{
|
||||
} else if (_hotspotsCount - 5 == _sceneClickedHotspot) {
|
||||
// OK
|
||||
_timers[2] = 10;
|
||||
playSound(0x108F4, 0);
|
||||
if ((signed int)_savegameIndex > -1)
|
||||
writeSavegame(_savegameIndex + 1, (int)&_savegameFilenames[30 * _savegameIndex], 1);
|
||||
if (_savegameIndex != -1)
|
||||
warning("writeSavegame(_savegameIndex + 1, (int)&_savegameFilenames[30 * _savegameIndex], 1);");
|
||||
_menuStatus = 1;
|
||||
}
|
||||
else if (_hotspotsCount - 1 == _sceneClickedHotspot)
|
||||
{
|
||||
} else if (_hotspotsCount - 1 == _sceneClickedHotspot) {
|
||||
// in background
|
||||
_menuDone = true;
|
||||
}
|
||||
else if (_sceneClickedHotspot != -1 && _hotspotsCount - 2 != _sceneClickedHotspot)
|
||||
{
|
||||
} else if (_sceneClickedHotspot != -1 && _hotspotsCount - 2 != _sceneClickedHotspot) {
|
||||
// Savegame name
|
||||
_timers[2] = 10;
|
||||
playSound(0x108F4, 0);
|
||||
v17 = strcmp(&v43, &_savegameFilenames[30 * _savegameIndex]);
|
||||
if (!v17)
|
||||
LOBYTE(v17) = 0;
|
||||
if ((unsigned int8)v17 & (_savegameIndex < 0xFFFFFFFF))
|
||||
{
|
||||
strcpy((char *)&_savegameFilenames[30 * _savegameIndex], &v43);
|
||||
if (_savegameSprites[_savegameIndex] != -1)
|
||||
{
|
||||
if (strcmp(v43, _savegameFilenames[_savegameIndex]) & (_savegameIndex != -1)) {
|
||||
strcpy(_savegameFilenames[_savegameIndex], v43);
|
||||
if (_savegameSprites[_savegameIndex] != nullptr) {
|
||||
_gameSys->removeSpriteDrawItem(_savegameSprites[_savegameIndex], 263);
|
||||
delayTicksCursor(5);
|
||||
memFreeHandle(_savegameSprites[_savegameIndex]);
|
||||
warning("memFreeHandle(_savegameSprites[_savegameIndex]);");
|
||||
}
|
||||
v18 = getSpriteWidthById(0x104F9);
|
||||
_savegameSprites[_savegameIndex] = allocSprite(v18, 40, 128, 0);
|
||||
drawTextToSurface(_savegameSprites[_savegameIndex], 0, 0, 255, 0, 0, &_savegameFilenames[30 * _savegameIndex]);
|
||||
insertSpriteDrawItem(_savegameSprites[_savegameIndex], 288, _hotspots[_savegameIndex].y1, 263);
|
||||
int v18 = _gameSys->getSpriteWidthById(0x104F9);
|
||||
_savegameSprites[_savegameIndex] = _gameSys->allocSurface(v18, 40);
|
||||
_gameSys->drawTextToSurface(_savegameSprites[_savegameIndex], 0, 0, 255, 0, 0, _savegameFilenames[_savegameIndex]);
|
||||
_gameSys->insertSpriteDrawItem(_savegameSprites[_savegameIndex], 288, _hotspots[_savegameIndex]._y1, 263);
|
||||
}
|
||||
_savegameIndex = _sceneClickedHotspot;
|
||||
v46 = strlen(&_savegameFilenames[30 * _sceneClickedHotspot]);
|
||||
strcpy(&v43, &_savegameFilenames[30 * _sceneClickedHotspot]);
|
||||
if (_cursorSprite == -1)
|
||||
{
|
||||
v19 = getTextHeight("_");
|
||||
v20 = getTextWidth("_");
|
||||
_cursorSprite = allocSprite(v20, v19, 128, 0);
|
||||
drawTextToSurface(_cursorSprite, 0, 0, 255, 0, 0, "_");
|
||||
}
|
||||
else
|
||||
{
|
||||
v46 = strlen(_savegameFilenames[_sceneClickedHotspot]);
|
||||
strcpy(v43, _savegameFilenames[_sceneClickedHotspot]);
|
||||
if (_cursorSprite == nullptr) {
|
||||
int v19 = _gameSys->getTextHeight("_");
|
||||
int v20 = _gameSys->getTextWidth("_");
|
||||
_cursorSprite = _gameSys->allocSurface(v20, v19);
|
||||
_gameSys->drawTextToSurface(_cursorSprite, 0, 0, 255, 0, 0, "_");
|
||||
} else {
|
||||
_gameSys->removeSpriteDrawItem(_cursorSprite, 264);
|
||||
}
|
||||
v21 = _hotspots[_savegameIndex].x2;
|
||||
v22 = v21 - getTextWidth("_");
|
||||
if (v22 > getTextWidth(&_savegameFilenames[30 * _savegameIndex]) + 288)
|
||||
{
|
||||
v25 = getTextWidth(&_savegameFilenames[30 * _savegameIndex]) + 288;
|
||||
insertSpriteDrawItem(_cursorSprite, v25, _hotspots[_savegameIndex].y1, 264);
|
||||
}
|
||||
else
|
||||
{
|
||||
v23 = _hotspots[_savegameIndex].x2;
|
||||
v24 = v23 - getTextWidth("_");
|
||||
insertSpriteDrawItem(_cursorSprite, v24, _hotspots[_savegameIndex].y1, 264);
|
||||
int v21 = _hotspots[_savegameIndex]._x2;
|
||||
int v22 = v21 - _gameSys->getTextWidth("_");
|
||||
if (v22 > _gameSys->getTextWidth(_savegameFilenames[_savegameIndex]) + 288) {
|
||||
int v25 = _gameSys->getTextWidth(_savegameFilenames[_savegameIndex]) + 288;
|
||||
_gameSys->insertSpriteDrawItem(_cursorSprite, v25, _hotspots[_savegameIndex]._y1, 264);
|
||||
} else {
|
||||
int v23 = _hotspots[_savegameIndex]._x2;
|
||||
int v24 = v23 - _gameSys->getTextWidth("_");
|
||||
_gameSys->insertSpriteDrawItem(_cursorSprite, v24, _hotspots[_savegameIndex]._y1, 264);
|
||||
}
|
||||
}
|
||||
if ((signed int)_savegameIndex > -1 && keybChar)
|
||||
{
|
||||
if ((keybChar < 'A' || keybChar > 'Z') && (keybChar < '0' || keybChar > '9') && keybChar != ' ')
|
||||
{
|
||||
if (keybChar == 8)
|
||||
{
|
||||
if ((signed int)v46 > 0)
|
||||
|
||||
updateEvents();
|
||||
Common::Event event;
|
||||
_eventMan->pollEvent(event);
|
||||
|
||||
Common::KeyCode keycode = event.kbd.keycode;
|
||||
if (_savegameIndex != -1 && keycode) {
|
||||
if ((keycode < Common::KEYCODE_a || keycode > Common::KEYCODE_z) && (keycode < Common::KEYCODE_0 || keycode > Common::KEYCODE_9) && keycode != Common::KEYCODE_SPACE) {
|
||||
if (keycode == Common::KEYCODE_BACKSPACE) {
|
||||
if (v46 > 0)
|
||||
--v46;
|
||||
*(&_savegameFilenames[30 * _savegameIndex] + v46) = 0;
|
||||
if (_savegameSprites[_savegameIndex] != -1)
|
||||
{
|
||||
_savegameFilenames[_savegameIndex][v46] = '\0';
|
||||
if (_savegameSprites[_savegameIndex] != nullptr) {
|
||||
_gameSys->removeSpriteDrawItem(_savegameSprites[_savegameIndex], 263);
|
||||
memFreeHandle(_savegameSprites[_savegameIndex]);
|
||||
warning("memFreeHandle(_savegameSprites[_savegameIndex]);");
|
||||
}
|
||||
v32 = getSpriteWidthById(0x104F9);
|
||||
_savegameSprites[_savegameIndex] = allocSprite(v32, 40, 128, 0);
|
||||
drawTextToSurface(_savegameSprites[_savegameIndex], 0, 0, 255, 0, 0, &_savegameFilenames[30 * _savegameIndex]);
|
||||
insertSpriteDrawItem(_savegameSprites[_savegameIndex], 288, _hotspots[_savegameIndex].y1, 263);
|
||||
int v32 = _gameSys->getSpriteWidthById(0x104F9);
|
||||
_savegameSprites[_savegameIndex] = _gameSys->allocSurface(v32, 40);
|
||||
_gameSys->drawTextToSurface(_savegameSprites[_savegameIndex], 0, 0, 255, 0, 0, _savegameFilenames[_savegameIndex]);
|
||||
_gameSys->insertSpriteDrawItem(_savegameSprites[_savegameIndex], 288, _hotspots[_savegameIndex]._y1, 263);
|
||||
_gameSys->removeSpriteDrawItem(_cursorSprite, 264);
|
||||
v33 = _hotspots[_savegameIndex].y1;
|
||||
v34 = getTextWidth(&_savegameFilenames[30 * _savegameIndex]);
|
||||
insertSpriteDrawItem(_cursorSprite, LOWORD(_hotspots[_savegameIndex].x1) + v34, v33, 264);
|
||||
}
|
||||
else if (keybChar == 13)
|
||||
{
|
||||
int v33 = _hotspots[_savegameIndex]._y1;
|
||||
int v34 = _gameSys->getTextWidth(_savegameFilenames[_savegameIndex]);
|
||||
_gameSys->insertSpriteDrawItem(_cursorSprite, _hotspots[_savegameIndex]._x1 + v34, v33, 264);
|
||||
} else if (keycode == Common::KEYCODE_RETURN) {
|
||||
_menuStatus = 1;
|
||||
writeSavegame(_savegameIndex + 1, (int)&_savegameFilenames[30 * _savegameIndex], 1);
|
||||
warning("writeSavegame(_savegameIndex + 1, (int)&_savegameFilenames[30 * _savegameIndex], 1);");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
*(&_savegameFilenames[30 * _savegameIndex] + v46) = keybChar;
|
||||
if ((signed int)v46 < 28)
|
||||
} else {
|
||||
_savegameFilenames[_savegameIndex][v46] = event.kbd.ascii;
|
||||
if (v46 < 28)
|
||||
++v46;
|
||||
*(&_savegameFilenames[30 * _savegameIndex] + v46) = 0;
|
||||
if (getTextWidth(&_savegameFilenames[30 * _savegameIndex]) > 91)
|
||||
{
|
||||
_savegameFilenames[_savegameIndex][v46] = '\0';
|
||||
if (_gameSys->getTextWidth(_savegameFilenames[_savegameIndex]) > 91) {
|
||||
--v46;
|
||||
*(&_savegameFilenames[30 * _savegameIndex] + v46) = 0;
|
||||
_savegameFilenames[_savegameIndex][v46] = '\0';
|
||||
}
|
||||
drawTextToSurface(_savegameSprites[_savegameIndex], 0, 0, 255, 0, 0, &_savegameFilenames[30 * _savegameIndex]);
|
||||
v26 = getTextWidth(&_savegameFilenames[30 * _savegameIndex]);
|
||||
rect.right = _hotspots[_savegameIndex].x1 + v26;
|
||||
v27 = rect.right;
|
||||
rect.left = v27 - 2 * getTextWidth("W");
|
||||
rect.top = _hotspots[_savegameIndex].y1;
|
||||
rect.bottom = _hotspots[_savegameIndex].y2;
|
||||
insertDirtyRect(&rect);
|
||||
_gameSys->drawTextToSurface(_savegameSprites[_savegameIndex], 0, 0, 255, 0, 0, _savegameFilenames[_savegameIndex]);
|
||||
int v26 = _gameSys->getTextWidth(_savegameFilenames[_savegameIndex]);
|
||||
Common::Rect rect;
|
||||
rect.right = _hotspots[_savegameIndex]._x1 + v26;
|
||||
int v27 = rect.right;
|
||||
rect.left = v27 - 2 * _gameSys->getTextWidth("W");
|
||||
rect.top = _hotspots[_savegameIndex]._y1;
|
||||
rect.bottom = _hotspots[_savegameIndex]._y2;
|
||||
_gameSys->insertDirtyRect(rect);
|
||||
_gameSys->removeSpriteDrawItem(_cursorSprite, 264);
|
||||
v28 = _hotspots[_savegameIndex].x2;
|
||||
v29 = getTextWidth("_");
|
||||
int v28 = _hotspots[_savegameIndex]._x2;
|
||||
int v29 = _gameSys->getTextWidth("_");
|
||||
if (v28 - v29 > rect.right)
|
||||
{
|
||||
insertSpriteDrawItem(_cursorSprite, SLOWORD(rect.right), SLOWORD(rect.top), 264);
|
||||
}
|
||||
else
|
||||
{
|
||||
v30 = _hotspots[_savegameIndex].x2;
|
||||
v31 = v30 - getTextWidth("_");
|
||||
insertSpriteDrawItem(_cursorSprite, v31, SLOWORD(rect.top), 264);
|
||||
_gameSys->insertSpriteDrawItem(_cursorSprite, rect.right, rect.top, 264);
|
||||
else {
|
||||
int v30 = _hotspots[_savegameIndex]._x2;
|
||||
int v31 = v30 - _gameSys->getTextWidth("_");
|
||||
_gameSys->insertSpriteDrawItem(_cursorSprite, v31, rect.top, 264);
|
||||
}
|
||||
clearKeyStatus1(8);
|
||||
}
|
||||
}
|
||||
keybChar = 0;
|
||||
if (_menuStatus == 1 || _menuDone)
|
||||
{
|
||||
|
||||
// warning("keybChar = 0;");
|
||||
if (_menuStatus == 1 || _menuDone) {
|
||||
_gameSys->removeSpriteDrawItem(_menuSprite2, 262);
|
||||
_gameSys->removeSpriteDrawItem(_menuSaveLoadSprite, 262);
|
||||
for (i = 0; i < 7; ++i)
|
||||
for (int i = 0; i < 7; ++i)
|
||||
_gameSys->removeSpriteDrawItem(_savegameSprites[i], 263);
|
||||
_gameSys->removeSpriteDrawItem(_cursorSprite, 264);
|
||||
if (!_menuDone)
|
||||
{
|
||||
if (!_menuDone) {
|
||||
initMenuHotspots2();
|
||||
insertSpriteDrawItem(_menuSprite1, 288, 79, 262);
|
||||
_gameSys->insertSpriteDrawItem(_menuSprite1, 288, 79, 262);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue