mirror of
https://github.com/libretro/scummvm.git
synced 2025-03-07 02:39:56 +00:00
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:
parent
f9047bb83d
commit
aab3930779
@ -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:
|
||||
|
||||
|
@ -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();
|
||||
|
@ -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();
|
||||
|
@ -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 {
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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();
|
||||
|
Loading…
x
Reference in New Issue
Block a user