diff options
author | Paul Gilbert | 2017-12-11 22:14:58 -0500 |
---|---|---|
committer | Paul Gilbert | 2017-12-11 22:14:58 -0500 |
commit | 9b14b844bb110a78f12b43eeac8832d41f890a79 (patch) | |
tree | 1bcfddfc02578b88893bc5cfc2f766a9cf49a5fd /engines | |
parent | 171a86acc71713a0d25d0858c7a9d3e5c8f64289 (diff) | |
download | scummvm-rg350-9b14b844bb110a78f12b43eeac8832d41f890a79.tar.gz scummvm-rg350-9b14b844bb110a78f12b43eeac8832d41f890a79.tar.bz2 scummvm-rg350-9b14b844bb110a78f12b43eeac8832d41f890a79.zip |
XEEN: Added logic for Dwarf cutscene
Diffstat (limited to 'engines')
-rw-r--r-- | engines/xeen/town.cpp | 245 | ||||
-rw-r--r-- | engines/xeen/town.h | 16 |
2 files changed, 258 insertions, 3 deletions
diff --git a/engines/xeen/town.cpp b/engines/xeen/town.cpp index 1ebd683826..34d19da70f 100644 --- a/engines/xeen/town.cpp +++ b/engines/xeen/town.cpp @@ -33,15 +33,18 @@ namespace Xeen { TownLocation::TownLocation(TownAction action) : ButtonContainer(g_vm), _townActionId(action), _isDarkCc(g_vm->_files->_isDarkCc), _vocName("hello1.voc") { - _townMaxId = Res.TOWN_MAXES[_isDarkCc][action]; - _songName = Res.TOWN_ACTION_MUSIC[_isDarkCc][action]; - _townSprites.resize(Res.TOWN_ACTION_FILES[_isDarkCc][action]); + _townMaxId = (action >= SPHINX) ? 0 : Res.TOWN_MAXES[_isDarkCc][action]; + if (action < NO_ACTION) { + _songName = Res.TOWN_ACTION_MUSIC[_isDarkCc][action]; + _townSprites.resize(Res.TOWN_ACTION_FILES[_isDarkCc][action]); + } _animFrame = 0; _drawFrameIndex = 0; _farewellTime = 0; _drawCtr1 = _drawCtr2 = 0; _townPos = Common::Point(8, 8); + _animCtr = 0; } TownLocation::~TownLocation() { @@ -288,6 +291,10 @@ int TownLocation::wait() { return _buttonValue; } +void TownLocation::animUpdate() { + // TODO +} + /*------------------------------------------------------------------------*/ BankLocation::BankLocation() : TownLocation(BANK) { @@ -963,6 +970,7 @@ TrainingLocation::TrainingLocation() : TownLocation(TRAINING) { Common::fill(&_charsTrained[0], &_charsTrained[6], 0); _maxLevel = 0; _experienceToNextLevel = 0; + _charIndex = 0; _icons1.load("train.icn"); addButton(Common::Rect(281, 108, 305, 128), Common::KEYCODE_ESCAPE, &_icons1); @@ -1116,8 +1124,239 @@ GolemLocation::GolemLocation() : TownLocation(GOLEM) { /*------------------------------------------------------------------------*/ +const int16 DWARF_X0[2][13] = { + { 0, -5, -7, -8, -11, -9, -3, 1, 6, 10, 15, 18, 23 }, + { 0, 4, 6, 8, 11, 12, 15, 17, 19, 22, 25, 0, 0 } +}; +const int DWARF_X1[2][13] = { + { 160, 145, 133, 122, 109, 101, 97, 91, 86, 80, 75, 68, 63 }, + { 160, 154, 146, 138, 131, 122, 115, 107, 99, 92, 85, 0, 0 } +}; +const int DWARF_X2[13] = { + 0, -1, -4, -7, -9, -13, -15, -18, -21, -23, -25, 0, 0 +}; +const int16 DWARF_Y[2][13] = { + { 0, 0, 4, 9, 13, 15, 20, 24, 30, 37, 45, 51, 58 }, + { 0, 12, 25, 36, 38, 40, 41, 42, 44, 45, 50, 0, 0 } +}; +const int16 DWARF2_X[2][16] = { + { 0, -2, -4, -6, -8, -10, -12, -14, -16, -18, -20, -20, -20, -20, -20, -20 }, + { 0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150 } +}; +const int16 DWARF2_Y[2][16] = { + { 0, 12, 25, 37, 50, 62, 75, 87, 100, 112, 125, 137, 150, 162, 175, 187 }, + { 0, 12, 25, 37, 50, 62, 75, 87, 100, 112, 125, 137, 150, 162, 175, 186 } +}; + DwarfLocation::DwarfLocation(bool isDwarf) : TownLocation(NO_ACTION) { _townMaxId = Res.TOWN_MAXES[_isDarkCc][isDwarf ? DWARF1 : DWARF2]; + loadStrings("special.bin"); +} + +int DwarfLocation::show() { + EventsManager &events = *g_vm->_events; + Interface &intf = *g_vm->_interface; + Party &party = *g_vm->_party; + Screen &screen = *g_vm->_screen; + Sound &sound = *g_vm->_sound; + Windows &windows = *g_vm->_windows; + + SpriteResource sprites1(_isDarkCc ? "town1.zom" : "dwarf1.vga"); + SpriteResource sprites2(_isDarkCc ? "town2.zom" : "dwarf2.vga"); + SpriteResource sprites3(_isDarkCc ? "town3.zom" : "dwarf3.vga"); + SpriteResource boxSprites("box.vga"); + bool mazeFlag = setNewLocation(); + + // Save the screen contents + Graphics::ManagedSurface savedBg; + savedBg.copyFrom(screen); + + for (int idx = 0; idx < (_isDarkCc ? 10 : 12); ++idx) { + screen.copyFrom(savedBg); + sprites1.draw(0, 0, + Common::Point(DWARF_X0[_isDarkCc][idx], DWARF_Y[_isDarkCc][idx])); + sprites1.draw(0, 1, + Common::Point(DWARF_X1[_isDarkCc][idx], DWARF_Y[_isDarkCc][idx])); + if (_isDarkCc) + sprites1.draw(0, 2, + Common::Point(DWARF_X2[idx], DWARF_Y[_isDarkCc][idx])); + + windows[0].update(); + events.wait(1); + } + + savedBg.copyFrom(screen); + for (int idx = 15; idx >= 0; --idx) { + screen.copyFrom(savedBg); + sprites2.draw(0, 0, Common::Point(DWARF2_X[_isDarkCc][idx], DWARF2_Y[_isDarkCc][idx])); + windows[0].update(); + events.wait(1); + } + + sound.setMusicVolume(48); + screen.copyFrom(savedBg); + sprites2.draw(0, 0); + windows[0].update(); + + for (int idx = 0; idx < (_isDarkCc ? 2 : 3); ++idx) { + switch (idx) { + case 0: + sound.playSound(_isDarkCc ? "pass2.voc" : "dwarf10.voc"); + break; + + case 1: + if (_isDarkCc) { + sprites2.draw(0, 0); + sprites3.draw(0, 0); + animUpdate(); + + events.timeMark5(); + while (!g_vm->shouldQuit() && events.timeElapsed5() < 7) + events.pollEventsAndWait(); + + sound.playSound(mazeFlag ? "ok2.voc" : "back2.voc"); + } else { + sound.playSound("dwarf11.voc"); + } + break; + + case 2: + sound.playSound("dwarf12.voc"); + break; + } + + events.updateGameCounter(); + do { + sprites2.draw(0, 0); + sprites3.draw(0, g_vm->getRandomNumber(_isDarkCc ? 8 : 9)); + animUpdate(); + + events.timeMark5(); + while (!g_vm->shouldQuit() && events.timeElapsed5() < 2) + events.pollEventsAndWait(); + } while (!g_vm->shouldQuit() && (sound.isPlaying() || _animCtr)); + + while (!g_vm->shouldQuit() && events.timeElapsed() < 3) + events.pollEventsAndWait(); + } + + sprites2.draw(0, 0); + if (!_isDarkCc) + sprites3.draw(0, 1); + windows[0].update(); + + // Restore game screen + sound.setMusicVolume(95); + screen.loadBackground("back.raw"); + intf.drawParty(false); + intf.draw3d(false, false); + + events.clearEvents(); + return 0; +} + +bool DwarfLocation::setNewLocation() { + Map &map = *g_vm->_map; + Party &party = *g_vm->_party; + Common::Point mazePos; + Direction mazeDir = DIR_NORTH; + int mazeId = 0; + bool mazeFlag = false; + + // Set + if (_isDarkCc) { + switch (party._mazeId) { + case 4: + if (party._questItems[35]) { + mazeId = 29; + mazePos = Common::Point(15, 31); + mazeDir = DIR_SOUTH; + } + break; + + case 6: + if (party._questItems[38]) { + mazeId = 35; + mazePos = Common::Point(15, 8); + mazeDir = DIR_WEST; + } + break; + + case 19: + if (party._questItems[36]) { + mazeId = 31; + mazePos = Common::Point(31, 16); + mazeDir = DIR_WEST; + } + break; + + case 22: + if (party._questItems[37]) { + mazeId = 33; + mazePos = Common::Point(0, 3); + mazeDir = DIR_EAST; + } + break; + + case 98: + if (party._questItems[39]) { + mazeId = 37; + mazePos = Common::Point(7, 0); + mazeDir = DIR_NORTH; + } + break; + + default: + break; + } + + mazeFlag = mazeId != 0; + if (!mazeFlag) { + mazeId = party._mazeId; + mazePos = party._mazePosition; + mazeDir = party._mazeDirection; + } + } else { + switch (party._mazeId) { + case 14: + mazeId = 37; + mazePos = Common::Point(1, 4); + mazeDir = DIR_EAST; + break; + + case 18: + if (party._mazePosition.x == 9) { + mazeId = 35; + mazePos = Common::Point(1, 12); + mazeDir = DIR_EAST; + } else { + mazeId = 36; + mazePos = Common::Point(7, 1); + mazeDir = DIR_NORTH; + } + break; + + case 23: + if (party._mazePosition.x == 5) { + mazeId = 33; + mazePos = Common::Point(7, 1); + mazeDir = DIR_NORTH; + } else { + mazeId = 34; + mazePos = Common::Point(7, 30); + mazeDir = DIR_SOUTH; + } + break; + + default: + break; + } + } + + map.load(mazeId); + party._mazePosition = mazePos; + party._mazeDirection = mazeDir; + return mazeFlag; } /*------------------------------------------------------------------------*/ diff --git a/engines/xeen/town.h b/engines/xeen/town.h index 1f2728be13..b4b70fa499 100644 --- a/engines/xeen/town.h +++ b/engines/xeen/town.h @@ -53,6 +53,7 @@ protected: int _drawFrameIndex; uint _farewellTime; int _drawCtr1, _drawCtr2; + int _animCtr; protected: /** * Draw the window @@ -65,6 +66,11 @@ protected: int wait(); /** + * Handles animation updates for Sphinx, Golem, Repear, and Dwarf events + */ + void animUpdate(); + + /** * Generates the display text for the location, for a given character */ virtual Common::String createLocationText(Character &ch) { return ""; } @@ -253,9 +259,19 @@ public: }; class DwarfLocation : public TownLocation { +private: + /** + * Set the new location + */ + bool setNewLocation(); public: DwarfLocation(bool isDwarf1); virtual ~DwarfLocation() {} + + /** + * Show the town location + */ + virtual int show(); }; class SphinxLocation : public TownLocation { |