diff options
Diffstat (limited to 'engines')
-rw-r--r-- | engines/xeen/locations.cpp | 259 | ||||
-rw-r--r-- | engines/xeen/locations.h | 10 |
2 files changed, 268 insertions, 1 deletions
diff --git a/engines/xeen/locations.cpp b/engines/xeen/locations.cpp index cb5d1a29d9..9e6bfc9e5f 100644 --- a/engines/xeen/locations.cpp +++ b/engines/xeen/locations.cpp @@ -1132,8 +1132,265 @@ void CutsceneLocation::setNewLocation() { /*------------------------------------------------------------------------*/ +const int16 REAPER_X1[2][14] = { + { 0, -10, -20, -30, -40, -49, -49, -49, -49, -49, -49, -49, -49, -49 }, + { 0, 2, 6, 8, 11, 14, 17, 21, 27, 35, 43, 51, 60, 67 } +}; +const int16 REAPER_Y1[2][14] = { + { 0, 12, 25, 37, 45, 50, 56, 61, 67, 72, 78, 83, 89, 94 }, + { 0, 6, 12, 17, 23, 29, 36, 42, 49, 54, 61, 68, 73, 77 } +}; +const int16 REAPER_X2[14] = { + 160, 152, 146, 138, 131, 124, 117, 111, 107, 105, 103, 101, 100, 97 +}; +const int16 REAPER_X3[14] = { + 0, -3, -4, -7, -9, -11, -13, -14, -13, -10, -7, -4, 0, -1 +}; + ReaperCutscene::ReaperCutscene() : CutsceneLocation(REAPER) { - // TODO +} + +int ReaperCutscene::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 ? "tower1.zom" : "tower.vga"); + SpriteResource sprites2(_isDarkCc ? "tower2.zom" : "freap.vga"); + + Graphics::ManagedSurface savedBg; + savedBg.copyFrom(screen); + + for (int idx = 13; idx >= 0; --idx) { + sprites1.draw(0, 0, Common::Point(REAPER_X1[_isDarkCc][idx], REAPER_Y1[_isDarkCc][idx])); + if (_isDarkCc) { + sprites1.draw(0, 1, Common::Point(REAPER_X2[idx], REAPER_Y1[1][idx])); + sprites1.draw(0, party._isNight ? 3 : 2, Common::Point(REAPER_X3[idx], REAPER_Y1[1][idx])); + } + + windows[0].update(); + events.wait(1); + } + + if (_isDarkCc) { + for (int idx = -200; idx < 0; idx += 16) { + sprites1.draw(0, 0, Common::Point(0, 0)); + sprites1.draw(0, 1, Common::Point(160, 0)); + sprites1.draw(0, 2, Common::Point(0, 0)); + sprites2.draw(0, 0, Common::Point(idx, 0), SPRFLAG_800); + sprites2.draw(0, 5, Common::Point(160 + idx, 0), SPRFLAG_800); + + windows[0].update(); + events.wait(1); + } + } else { + for (int idx = 200; idx >= 0; idx -= 16) { + sprites1.draw(0, 0, Common::Point(0, 0)); + sprites2.draw(0, 0, Common::Point(idx, 0), SPRFLAG_800); + + windows[0].update(); + events.wait(1); + } + } + + sound.setMusicVolume(48); + sprites1.draw(0, 0, Common::Point(0, 0)); + if (_isDarkCc) { + sprites1.draw(0, 1, Common::Point(160, 0)); + sprites1.draw(0, party._isNight ? 3 : 2); + } + + sound.playSound(_mazeFlag ? "reaper12.voc" : "reaper14.voc"); + + do { + int frame = g_vm->getRandomNumber(4); + if (_isDarkCc) { + sprites2.draw(0, frame, Common::Point(0, 0)); + sprites2.draw(0, frame + 5, Common::Point(160, 0)); + } else { + sprites2.draw(0, 0, Common::Point(0, 0)); + sprites2.draw(0, frame, Common::Point(160, 0)); + } + + cutsceneAnimUpdate(); + events.wait(2); + } while (!g_vm->shouldQuit() && (sound.isPlaying() || _animCtr)); + + sprites2.draw(0, 0, Common::Point(0, 0)); + if (_isDarkCc) + sprites2.draw(0, 5, Common::Point(160, 0)); + windows[0].update(); + events.wait(7); + + sound.playSound(_mazeFlag ? "reaper12.voc" : "reaper14.voc"); + if (_mazeFlag) + sound.playSound(_isDarkCc ? "goin1.voc" : "reaper13.voc"); + else + sound.playSound(_isDarkCc ? "needkey1.voc" : "reaper15.voc"); + + do { + int frame = g_vm->getRandomNumber(4); + if (_isDarkCc) { + sprites2.draw(0, frame, Common::Point(0, 0)); + sprites2.draw(0, frame + 5, Common::Point(160, 0)); + } else { + sprites2.draw(0, 0, Common::Point(0, 0)); + sprites2.draw(0, frame, Common::Point(160, 0)); + } + + windows[0].update(); + events.wait(2); + } while (!g_vm->shouldQuit() && sound.isPlaying()); + + sprites2.draw(0, 0, Common::Point(0, 0)); + if (_isDarkCc) + sprites2.draw(0, 5, Common::Point(160, 0)); + windows[0].update(); + events.wait(1); + + if (_mazeFlag) { + for (int idx = 0; idx < 14; ++idx) { + screen.blitFrom(savedBg); + sprites1.draw(0, 0, Common::Point(REAPER_X1[_isDarkCc][idx], REAPER_Y1[_isDarkCc][idx])); + + if (_isDarkCc) { + sprites1.draw(0, 1, Common::Point(REAPER_X2[idx], REAPER_Y1[1][idx])); + sprites1.draw(0, party._isNight ? 3 : 2, Common::Point(REAPER_X3[idx], REAPER_Y1[1][idx])); + } + + windows[0].update(); + events.wait(1); + } + + screen.blitFrom(savedBg); + windows[0].update(); + } + + screen.blitFrom(savedBg); + windows[0].update(); + + setNewLocation(); + + // Restore game screen + sound.setMusicVolume(95); + screen.loadBackground("back.raw"); + intf.drawParty(false); + intf.draw3d(false, false); + + events.clearEvents(); + return 0; +} + +void ReaperCutscene::getNewLocation() { + Map &map = *g_vm->_map; + Party &party = *g_vm->_party; + + if (_isDarkCc) { + switch (party._mazeId) { + case 3: + if (party._questItems[40]) { + _mazeId = 57; + _mazePos = Common::Point(11, 8); + _mazeDir = DIR_WEST; + _mazeFlag = true; + } + break; + + case 12: + if (party._questItems[3]) { + _mazeId = 55; + _mazePos = Common::Point(3, 8); + _mazeDir = DIR_EAST; + _mazeFlag = true; + } + break; + + case 13: + if (party._questItems[43]) { + _mazeId = 69; + _mazePos = Common::Point(7, 4); + _mazeDir = DIR_NORTH; + _mazeFlag = true; + } + break; + + case 23: + if (party._questItems[42]) { + _mazeId = 65; + _mazePos = Common::Point(3, 8); + _mazeDir = DIR_EAST; + _mazeFlag = true; + } + break; + + case 29: + if (party._questItems[44]) { + _mazeId = 53; + _mazePos = Common::Point(11, 8); + _mazeDir = DIR_WEST; + _mazeFlag = true; + } + break; + + default: + break; + } + } else { + switch (party._mazeId) { + case 7: + if (party._questItems[30]) { + map._loadDarkSide = true; + _mazeId = 113; + _mazePos = Common::Point(7, 4); + _mazeDir = DIR_NORTH; + _mazeFlag = true; + } + break; + + case 12: + if (party._questItems[3]) { + _mazeId = 55; + _mazePos = Common::Point(3, 8); + _mazeDir = DIR_EAST; + _mazeFlag = true; + } + break; + + case 13: + if (party._questItems[29]) { + map._loadDarkSide = true; + _mazeId = 117; + _mazePos = Common::Point(7, 4); + _mazeDir = DIR_NORTH; + _mazeFlag = true; + } + break; + + case 15: + if (party._questItems[2]) { + _mazeId = 59; + _mazePos = Common::Point(11, 8); + _mazeDir = DIR_WEST; + _mazeFlag = true; + } + break; + + case 24: + if (party._questItems[1]) { + _mazeId = 51; + _mazePos = Common::Point(7, 12); + _mazeDir = DIR_SOUTH; + _mazeFlag = true; + } + break; + + default: + break; + } + } } /*------------------------------------------------------------------------*/ diff --git a/engines/xeen/locations.h b/engines/xeen/locations.h index 8e3afbd358..89be896d39 100644 --- a/engines/xeen/locations.h +++ b/engines/xeen/locations.h @@ -264,9 +264,19 @@ public: }; class ReaperCutscene : public CutsceneLocation { +private: + /** + * Get the new location + */ + void getNewLocation(); public: ReaperCutscene(); virtual ~ReaperCutscene() {} + + /** + * Show the town location + */ + virtual int show(); }; class GolemCutscene : public CutsceneLocation { |