aboutsummaryrefslogtreecommitdiff
path: root/engines/avalanche
diff options
context:
space:
mode:
Diffstat (limited to 'engines/avalanche')
-rw-r--r--engines/avalanche/animation.cpp40
-rw-r--r--engines/avalanche/animation.h3
-rw-r--r--engines/avalanche/avalanche.cpp86
-rw-r--r--engines/avalanche/avalanche.h5
-rw-r--r--engines/avalanche/avalot.cpp18
-rw-r--r--engines/avalanche/background.cpp1
-rw-r--r--engines/avalanche/detection.cpp4
-rw-r--r--engines/avalanche/dialogs.cpp19
-rw-r--r--engines/avalanche/graphics.cpp1
-rw-r--r--engines/avalanche/menu.cpp14
-rw-r--r--engines/avalanche/menu.h1
-rw-r--r--engines/avalanche/parser.cpp19
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;