diff options
Diffstat (limited to 'engines/avalanche')
-rw-r--r-- | engines/avalanche/animation.cpp | 40 | ||||
-rw-r--r-- | engines/avalanche/animation.h | 3 | ||||
-rw-r--r-- | engines/avalanche/avalanche.cpp | 86 | ||||
-rw-r--r-- | engines/avalanche/avalanche.h | 5 | ||||
-rw-r--r-- | engines/avalanche/avalot.cpp | 18 | ||||
-rw-r--r-- | engines/avalanche/background.cpp | 1 | ||||
-rw-r--r-- | engines/avalanche/detection.cpp | 4 | ||||
-rw-r--r-- | engines/avalanche/dialogs.cpp | 19 | ||||
-rw-r--r-- | engines/avalanche/graphics.cpp | 1 | ||||
-rw-r--r-- | engines/avalanche/menu.cpp | 14 | ||||
-rw-r--r-- | engines/avalanche/menu.h | 1 | ||||
-rw-r--r-- | engines/avalanche/parser.cpp | 19 |
12 files changed, 186 insertions, 25 deletions
diff --git a/engines/avalanche/animation.cpp b/engines/avalanche/animation.cpp index ef30faa87c..6bce59ddc0 100644 --- a/engines/avalanche/animation.cpp +++ b/engines/avalanche/animation.cpp @@ -48,6 +48,37 @@ const int32 Animation::kCatacombMap[8][8] = { AnimationType::AnimationType(Animation *anim) { _anim = anim; + + _xLength = 0; + _yLength = 0; + for (int i = 0; i < 24; i++) { + _mani[i] = nullptr; + _sil[i] = nullptr; + } + _frameNum = 0; + _seq = 0; + _characterId = 0; + _count = 0; + _facingDir = kDirNone; + _stepNum = 0; + _x = 0; + _y = 0; + _moveX = 0; + _moveY = 0; + _quick = false; + _visible = false; + _homing = false; + _doCheck = false; + _homingX = 0; + _homingY = 0; + _speedX = 0; + _speedY = 0; + _vanishIfStill = false; + _callEachStepFl = false; + _eachStepProc = Animation::kProcNone; + _fgBubbleCol = kColorWhite; + _bgBubbleCol = kColorBlack; + _id = 177; } /** @@ -370,6 +401,13 @@ Animation::Animation(AvalancheEngine *vm) { for (int16 i = 0; i < kSpriteNumbMax; i++) { _sprites[i] = new AnimationType(this); } + + _direction = kDirNone; + _oldDirection = kDirNone; + _arrowTriggered = false; + _geidaSpin = 0; + _geidaTime = 0; + _sayWhat = 0; } Animation::~Animation() { @@ -1202,6 +1240,8 @@ void Animation::animLink() { case kProcGeida : geidaProcs(i); break; + default: + break; } } } diff --git a/engines/avalanche/animation.h b/engines/avalanche/animation.h index 33f6ab02a6..3223615985 100644 --- a/engines/avalanche/animation.h +++ b/engines/avalanche/animation.h @@ -97,7 +97,8 @@ public: static const byte kSpriteNumbMax = 5; // current max no. of sprites enum Proc { - kProcFollowAvvyY = 1, + kProcNone = 0, + kProcFollowAvvyY, kProcBackAndForth, kProcFaceAvvy, kProcArrow, diff --git a/engines/avalanche/avalanche.cpp b/engines/avalanche/avalanche.cpp index 43e99945dc..e373ab58c3 100644 --- a/engines/avalanche/avalanche.cpp +++ b/engines/avalanche/avalanche.cpp @@ -41,17 +41,24 @@ AvalancheEngine::AvalancheEngine(OSystem *syst, const AvalancheGameDescription * TimeDate time; _system->getTimeAndDate(time); _rnd->setSeed(time.tm_sec + time.tm_min + time.tm_hour); - - // Needed because of Lucerna::load_also() - for (int i = 0; i < 31; i++) { - for (int j = 0; j < 2; j++) - _also[i][j] = nullptr; - } - - _totalTime = 0; _showDebugLines = false; - - memset(_fxPal, 0, 16 * 16 * 3); + + _clock = nullptr; + _graphics = nullptr; + _parser = nullptr; + _pingo = nullptr; + _dialogs = nullptr; + _background = nullptr; + _sequence = nullptr; + _timer = nullptr; + _animation = nullptr; + _menu = nullptr; + _closing = nullptr; + _sound = nullptr; + + _platform = gd->desc.platform; + + initVariables(); } AvalancheEngine::~AvalancheEngine() { @@ -82,6 +89,65 @@ AvalancheEngine::~AvalancheEngine() { } } +void AvalancheEngine::initVariables() { + resetVariables(); + + for (int i = 0; i < 31; i++) { + _also[i][0] = nullptr; + _also[i][1] = nullptr; + } + + _totalTime = 0; + + memset(_fxPal, 0, 16 * 16 * 3); + + for (int i = 0; i < 15; i++) { + _peds[i]._direction = kDirNone; + _peds[i]._x = 0; + _peds[i]._y = 0; + _magics[i]._operation = kMagicNothing; + _magics[i]._data = 0; + } + + for (int i = 0; i < 7; i++) { + _portals[i]._operation = kMagicNothing; + _portals[i]._data = 0; + } + + for (int i = 0; i < 30; i++) { + _fields[i]._x1 = 0; + _fields[i]._y1 = 0; + _fields[i]._x2 = 0; + _fields[i]._y2 = 0; + } + + _fieldNum = 0; + _cp = 0; + _ledStatus = 177; + _alive = false; + _subjectNum = 0; + _him = kPeoplePardon; + _her = kPeoplePardon; + _it = Parser::kPardon; + _roomTime = 0; + _doingSpriteRun = false; + _isLoaded = false; + _soundFx = true; + _holdTheDawn = false; + + _lineNum = 0; + for (int i = 0; i < 50; i++) + _lines[i]._color = kColorWhite; + _dropsOk = false; + _cheat = false; + _letMeOut = false; + _thinks = 2; + _thinkThing = true; + _seeScroll = false; + _currentMouse = 177; + _holdLeftMouse = false; +} + Common::ErrorCode AvalancheEngine::initialize() { _graphics = new GraphicManager(this); _parser = new Parser(this); diff --git a/engines/avalanche/avalanche.h b/engines/avalanche/avalanche.h index cff0970d22..b6e168f830 100644 --- a/engines/avalanche/avalanche.h +++ b/engines/avalanche/avalanche.h @@ -55,7 +55,9 @@ class RandomSource; namespace Avalanche { -struct AvalancheGameDescription; +struct AvalancheGameDescription { + ADGameDescription desc; +}; static const int kSavegameVersion = 1; @@ -316,6 +318,7 @@ private: Common::String readAlsoStringFromFile(Common::File &file); void runAvalot(); void init(); + void initVariables(); void setup(); void scram(Common::String &str); void unScramble(); diff --git a/engines/avalanche/avalot.cpp b/engines/avalanche/avalot.cpp index 072ad00ed6..36ce16d09c 100644 --- a/engines/avalanche/avalot.cpp +++ b/engines/avalanche/avalot.cpp @@ -118,10 +118,13 @@ Room AvalancheEngine::_whereIs[29] = { Clock::Clock(AvalancheEngine *vm) { _vm = vm; + // Magic value to determine if we just created the instance _oldHour = _oldHourAngle = _oldMinute = 17717; + _hour = _minute = _second = 0; + _hourAngle = 0; } -void Clock::update() { // TODO: Move variables from Gyro to here (or at least somewhere nearby), rename them. +void Clock::update() { TimeDate t; _vm->_system->getTimeAndDate(t); _hour = t.tm_hour; @@ -177,7 +180,9 @@ void Clock::plotHands() { } void Clock::chime() { - if ((_oldHour == 17717) || (!_vm->_soundFx)) // Too high - must be first time around + // Too high - must be first time around + // Mute - skip the sound generation + if ((_oldHour == 17717) || (!_vm->_soundFx)) return; byte hour = _hour % 12; @@ -1564,10 +1569,12 @@ Common::String AvalancheEngine::getName(People whose) { static const char lasses[4][15] = {"Arkata", "Geida", "\0xB1", "the Wise Woman"}; - if (whose < kPeopleArkata) + if (whose <= kPeopleJacques) return Common::String(lads[whose - kPeopleAvalot]); - else + else if ((whose >= kPeopleArkata) && (whose <= kPeopleWisewoman)) return Common::String(lasses[whose - kPeopleArkata]); + else + error("getName() - Unexpected character id %d", (byte) whose); } Common::String AvalancheEngine::getItem(byte which) { @@ -1674,6 +1681,9 @@ void AvalancheEngine::flipRoom(Room room, byte ped) { if (_room == kRoomLustiesRoom) _enterCatacombsFromLustiesRoom = true; + if (room > kRoomMap) + return; + enterRoom(room, ped); _animation->appearPed(0, ped - 1); _enterCatacombsFromLustiesRoom = false; diff --git a/engines/avalanche/background.cpp b/engines/avalanche/background.cpp index c84c049c8f..4d71550213 100644 --- a/engines/avalanche/background.cpp +++ b/engines/avalanche/background.cpp @@ -37,6 +37,7 @@ const int16 Background::kOnDisk = -1; Background::Background(AvalancheEngine *vm) { _vm = vm; _spriteNum = 0; + _nextBell = 0; } Background::~Background() { diff --git a/engines/avalanche/detection.cpp b/engines/avalanche/detection.cpp index 428e71f35a..048b0fe148 100644 --- a/engines/avalanche/detection.cpp +++ b/engines/avalanche/detection.cpp @@ -35,10 +35,6 @@ namespace Avalanche { -struct AvalancheGameDescription { - ADGameDescription desc; -}; - uint32 AvalancheEngine::getFeatures() const { return _gameDescription->desc.flags; } diff --git a/engines/avalanche/dialogs.cpp b/engines/avalanche/dialogs.cpp index e121141a2a..4b6cacf569 100644 --- a/engines/avalanche/dialogs.cpp +++ b/engines/avalanche/dialogs.cpp @@ -59,6 +59,19 @@ const QuasipedType Dialogs::kQuasipeds[16] = { Dialogs::Dialogs(AvalancheEngine *vm) { _vm = vm; _noError = true; + + _aboutBox = false; + _talkX = 0; + _talkY = 0; + _maxLineNum = 0; + _scReturn = false; + _currentFont = kFontStyleRoman; + _param = 0; + _useIcon = 0; + _scrollBells = 0; + _underScroll = 0; + _shadowBoxX = 0; + _shadowBoxY = 0; } void Dialogs::init() { @@ -689,6 +702,7 @@ void Dialogs::displayText(Common::String text) { if (_param == 0) setBubbleStateNatural(); else if ((1 <= _param) && (_param <= 9)) { + assert(_param - 1 < _vm->_animation->kSpriteNumbMax); AnimationType *spr = _vm->_animation->_sprites[_param - 1]; if ((_param > _vm->_animation->kSpriteNumbMax) || (!spr->_quick)) { // Not valid. _vm->errorLed(); @@ -699,6 +713,7 @@ void Dialogs::displayText(Common::String text) { // Quasi-peds. (This routine performs the same // thing with QPs as triptype.chatter does with the // sprites.) + assert(_param - 10 < 16); PedType *quasiPed = &_vm->_peds[kQuasipeds[_param - 10]._whichPed]; _talkX = quasiPed->_x; _talkY = quasiPed->_y; // Position. @@ -1164,7 +1179,9 @@ void Dialogs::sayThanks(byte thing) { Common::String tmpStr = personSpeaks(); tmpStr += Common::String::format("Hey, thanks!%c(But now, you've lost it!)", kControlSpeechBubble); displayText(tmpStr); - _vm->_objects[thing] = false; + + if (thing < kObjectNum) + _vm->_objects[thing] = false; } /** diff --git a/engines/avalanche/graphics.cpp b/engines/avalanche/graphics.cpp index 25b01d65f3..d7c32cb1fc 100644 --- a/engines/avalanche/graphics.cpp +++ b/engines/avalanche/graphics.cpp @@ -49,6 +49,7 @@ const MouseHotspotType GraphicManager::kMouseHotSpots[9] = { GraphicManager::GraphicManager(AvalancheEngine *vm) { _vm = vm; + setDialogColor(kColorBlack, kColorWhite); } GraphicManager::~GraphicManager() { diff --git a/engines/avalanche/menu.cpp b/engines/avalanche/menu.cpp index bba8e862a9..7c37b79bc8 100644 --- a/engines/avalanche/menu.cpp +++ b/engines/avalanche/menu.cpp @@ -207,6 +207,11 @@ void MenuItem::parseKey(char c) { _menu->_vm->_sound->blip(); } +MenuBar::MenuBar() { + _menuNum = 0; + _menu = nullptr; +} + void MenuBar::init(Menu *menu) { _menu = menu; _menuNum = 0; @@ -261,6 +266,9 @@ Menu::Menu(AvalancheEngine *vm) { _vm = vm; _activeMenuItem.init(this); _menuBar.init(this); + + _menuActive = false; + _lastPerson = kPeopleNone; } void Menu::findWhatYouCanDoWithIt() { @@ -782,10 +790,12 @@ byte Menu::getNameChar(People whose) { static const char ladChar[] = "ASCDMTRwLfgeIyPu"; static const char lassChar[] = "kG\0xB1o"; - if (whose < kPeopleArkata) + if (whose <= kPeopleJacques) return ladChar[whose - kPeopleAvalot]; - else + else if ((whose >= kPeopleArkata) && (whose <= kPeopleWisewoman)) return lassChar[whose - kPeopleArkata]; + else + error("getName() - Unexpected character id %d", (byte) whose); } Common::String Menu::getThing(byte which) { diff --git a/engines/avalanche/menu.h b/engines/avalanche/menu.h index a7ec8bf2db..b7674fbb9d 100644 --- a/engines/avalanche/menu.h +++ b/engines/avalanche/menu.h @@ -102,6 +102,7 @@ public: HeadType _menuItems[8]; byte _menuNum; + MenuBar(); void init(Menu *menu); void createMenuItem(char trig, Common::String title, char altTrig, MenuFunc setupFunc, MenuFunc chooseFunc); void draw(); diff --git a/engines/avalanche/parser.cpp b/engines/avalanche/parser.cpp index 297f27ffb8..9b6b841c8a 100644 --- a/engines/avalanche/parser.cpp +++ b/engines/avalanche/parser.cpp @@ -37,6 +37,21 @@ const char *Parser::kVersionNum = "1.30"; Parser::Parser(AvalancheEngine *vm) { _vm = vm; + + _verb = kVerbCodePardon; + _thing = kPardon; + _person = kPeopleNone; + _polite = false; + _inputTextPos = 0; + _quote = false; + _cursorState = false; + _weirdWord = false; + _wearing = kNothing; + _thing2 = 0; + _sworeNum = 0; + _alcoholLevel = 0; + _playedNim = 0; + _boughtOnion = false; } void Parser::init() { @@ -1013,7 +1028,7 @@ bool Parser::isHolding() { bool holdingResult = false; - if (_thing > 100) + if (_thing >= 100) _vm->_dialogs->displayText("Be reasonable!"); else if (_thing <= kObjectNum) { if (!_vm->_objects[_thing - 1]) @@ -2457,7 +2472,7 @@ void Parser::doVerb(VerbCode id) { } void Parser::resetVariables() { - _wearing = 0; + _wearing = kNothing; _sworeNum = 0; _alcoholLevel = 0; _playedNim = 0; |