AVALANCHE: Implement loading from the Launcher. Upgrade saveGame(), loadGame() in, add expandDate() to AvalancheEngine. Revise Avalot::setup(). Repair Lucerna::load() and triptype::init().

This commit is contained in:
uruk 2013-08-20 19:23:24 +02:00
parent f9047bb83d
commit aab3930779
6 changed files with 105 additions and 50 deletions

View File

@ -108,7 +108,6 @@ Common::ErrorCode AvalancheEngine::initialize() {
_lucerna->init();
_acci->init();
_basher->init();
return Common::kNoError;
}
@ -337,10 +336,6 @@ void AvalancheEngine::synchronize(Common::Serializer &sz) {
_trip->tr[i].appear(_trip->tr[i].x, _trip->tr[i].y, _trip->tr[i].face);
}
//groi = 177;
//blockwrite(f, groi, 1);
@ -380,6 +375,12 @@ bool AvalancheEngine::saveGame(const int16 slot, const Common::String &desc) {
f->write(desc.c_str(), desc.size());
TimeDate t;
_system->getTimeAndDate(t);
f->writeSint16LE(t.tm_mday);
f->writeSint16LE(t.tm_mon);
f->writeSint16LE(t.tm_year);
Common::Serializer sz(NULL, f);
synchronize(sz);
@ -423,9 +424,19 @@ bool AvalancheEngine::loadGame(const int16 slot) {
if (signature != "AVAL")
return false;
// We dont care about the description here.
// Read the description.
uint32 descSize = f->readUint32LE();
f->skip(descSize);
Common::String description;
for (uint32 i = 0; i < descSize; i++) {
char actChar = f->readByte();
description += actChar;
}
description.toUppercase();
TimeDate t;
t.tm_mday = f->readSint16LE();
t.tm_mon = f->readSint16LE();
t.tm_year = f->readSint16LE();
Common::Serializer sz(f, NULL);
@ -444,6 +455,8 @@ bool AvalancheEngine::loadGame(const int16 slot) {
_lucerna->minor_redraw();
_dropdown->standard_bar();
_gyro->whereis[0] = _gyro->dna.room;
_gyro->alive = true;
@ -454,9 +467,49 @@ bool AvalancheEngine::loadGame(const int16 slot) {
_lucerna->showrw();
_gyro->ontoolbar = false;
_trip->trippancy_link();
_celer->pics_link();
_scrolls->display(Common::String(_scrolls->kControlItalic) + "Loaded: " + _scrolls->kControlRoman + description + ".ASG"
+ _scrolls->kControlCenter + _scrolls->kControlNewLine + _scrolls->kControlNewLine
+ _gyro->roomname + _scrolls->kControlNewLine + _scrolls->kControlNewLine
+ "saved on " + expandDate(t.tm_mday, t.tm_mon, t.tm_year) + '.');
if (_trip->tr[0].quick && _trip->tr[0].visible)
_trip->rwsp(0, _gyro->dna.rw);
return true;
}
Common::String AvalancheEngine::expandDate(int d, int m, int y) {
const Common::String months[12] = {
"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"
};
Common::String month = months[m];
Common::String day = _gyro->strf(d);
if (((1 <= d) && (d <= 9)) || ((21 <= d) && (d <= 31)))
switch (d % 10) {
case 1:
day = day + "st";
break;
case 2:
day = day + "nd";
break;
case 3:
day = day + "rd";
break;
default:
day = day + "th";
}
return day + ' ' + month + ' ' + _gyro->strf(y + 1900);
}
void AvalancheEngine::updateEvents() {
@ -620,7 +673,7 @@ Common::Error AvalancheEngine::run() {
if (err != Common::kNoError)
return err;
// From bootstrp:

View File

@ -127,6 +127,8 @@ public:
virtual bool canLoadGameStateCurrently();
Common::Error loadGameState(int slot);
bool loadGame(const int16 slot);
Common::String expandDate(int d, int m, int y);
void updateEvents();

View File

@ -50,6 +50,7 @@
#include "common/str.h"
#include "common/textconsole.h"
#include "common/config-manager.h"
@ -167,7 +168,6 @@ void Avalot::setup() {
_vm->_gyro->enid_filename = ""; /* undefined. */
_vm->_lucerna->toolbar();
_vm->_scrolls->state(2);
_vm->_graphics->refreshScreen(); //_vm->_pingo->copy03(); Replace it with refreshScreen() since they 'almost' have the same functionality.
for (byte i = 0; i < 3; i++)
_vm->_gyro->lastscore[i] = -1; /* impossible digits */
@ -178,35 +178,6 @@ void Avalot::setup() {
_vm->_trip->loadtrip();
_vm->_gyro->reloaded = false; // TODO: Remove it later: when SAVE/LOAD system is implemented. Until then: we always start a new game.
if ((_vm->_gyro->filetoload.empty()) && (! _vm->_gyro->reloaded))
_vm->_gyro->newgame(); /* no game was requested- load the default */
else {
if (! _vm->_gyro->reloaded)
_vm->_enid->avvy_background();
_vm->_dropdown->standard_bar();
_vm->_lucerna->sprite_run();
if (_vm->_gyro->reloaded)
_vm->_enid->edna_reload();
else {
/* Filename given on the command line (or loadfirst) */
_vm->_enid->edna_load(_vm->_gyro->filetoload);
if (_vm->_enid->there_was_a_problem()) {
_vm->_scrolls->display("So let's start from the beginning instead...");
_vm->_gyro->holdthedawn = true;
_vm->_lucerna->dusk();
_vm->_gyro->newgame();
}
}
}
if (! _vm->_gyro->reloaded) {
_vm->_gyro->soundfx = ! _vm->_gyro->soundfx;
_vm->_lucerna->fxtoggle();
_vm->_lucerna->thinkabout(_vm->_gyro->money, _vm->_gyro->a_thing);
}
_vm->_trip->get_back_loretta();
//gm = getpixel(0: 0);
//setcolor(7);
@ -216,13 +187,34 @@ void Avalot::setup() {
_vm->_parser->cursorOn();
_vm->_trip->newspeed();
if (! _vm->_gyro->reloaded)
int16 loadSlot = Common::ConfigManager::instance().getInt("save_slot");
if (loadSlot >= 0) {
_vm->loadGame(loadSlot);
_vm->_gyro->reloaded = true;
} else
_vm->_gyro->reloaded = false;
if (!_vm->_gyro->reloaded) {
_vm->_gyro->newgame(); // No game was requested- load the default.
_vm->_gyro->soundfx = ! _vm->_gyro->soundfx;
_vm->_lucerna->fxtoggle();
_vm->_lucerna->thinkabout(_vm->_gyro->money, _vm->_gyro->a_thing);
_vm->_visa->dixi('q', 83); // Info on the game, etc.
}
}
void Avalot::run(Common::String arg) {
setup();
do {
uint32 beginLoop = _vm->_system->getMillis();
@ -249,6 +241,11 @@ void Avalot::run(Common::String arg) {
if (delay <= 55)
_vm->_system->delayMillis(55 - delay); // Replaces _vm->_gyro->slowdown(); 55 comes from 18.2 Hz (B Flight).
} while (! _vm->_gyro->lmo);
//restorecrtmode();

View File

@ -96,7 +96,7 @@ bool AvalancheMetaEngine::createInstance(OSystem *syst, Engine **engine, const A
}
bool AvalancheMetaEngine::hasFeature(MetaEngineFeature f) const {
return (f == kSupportsListSaves) || (f == kSupportsDeleteSave);
return (f == kSupportsListSaves) || (f == kSupportsDeleteSave) || (f == kSupportsLoadingDuringStartup);
}
SaveStateList AvalancheMetaEngine::listSaves(const char *target) const {

View File

@ -229,8 +229,13 @@ void Lucerna::load(byte n) { /* Load2, actually */
}
f.seek(146);
for (byte i = 0; i < 30; i++)
_vm->_gyro->roomname += f.readByte();
if (!_vm->_gyro->roomname.empty())
_vm->_gyro->roomname.clear();
for (byte i = 0; i < 30; i++) {
char actChar = f.readByte();
if ((32 <= actChar) && (actChar <= 126))
_vm->_gyro->roomname += actChar;
}
/* Compression method byte follows this... */
f.seek(177);
@ -254,16 +259,13 @@ void Lucerna::load(byte n) { /* Load2, actually */
_vm->_graphics->drawPicture(_vm->_graphics->_background, 0, 10);
_vm->_graphics->refreshScreen();
f.close();
load_also(xx);
_vm->_celer->load_chunks(xx);
_vm->_graphics->refreshScreen(); // _vm->_pingo->copy03(); - See Avalot::setup()
_vm->_celer->load_chunks(xx);
bit = *_vm->_graphics->getPixel(0,0);
@ -948,11 +950,11 @@ void Lucerna::fxtoggle() {
void Lucerna::objectlist() {
_vm->_gyro->dna.carrying = 0;
if (_vm->_gyro->thinkthing && ! _vm->_gyro->dna.obj[_vm->_gyro->thinks])
if (_vm->_gyro->thinkthing && !_vm->_gyro->dna.obj[_vm->_gyro->thinks])
thinkabout(_vm->_gyro->money, _vm->_gyro->a_thing); /* you always have money */
for (byte fv = 0; fv < numobjs; fv ++)
for (byte fv = 0; fv < numobjs; fv++)
if (_vm->_gyro->dna.obj[fv]) {
_vm->_gyro->dna.carrying ++;
_vm->_gyro->dna.carrying++;
_vm->_gyro->objlist[_vm->_gyro->dna.carrying] = fv + 1;
}
}

View File

@ -79,7 +79,8 @@ void triptype::init(byte spritenum, bool do_check, Trip *tr) {
inf.skip(2); // Replace variable named 'soa' in the original code.
//inf.skip(1); // We don't need to read the size of the string as in the original code.
if (!a.name.empty())
a.name.clear();
byte nameSize = inf.readByte();
for (byte i = 0; i < nameSize; i++)
a.name += inf.readByte();