XEEN: Create CutsceneLocation base class for cutscene locations

This commit is contained in:
Paul Gilbert 2017-12-12 20:08:51 -05:00
parent e4882f6057
commit a5590a3755
2 changed files with 180 additions and 118 deletions

View File

@ -30,7 +30,7 @@
namespace Xeen {
TownLocation::TownLocation(TownAction action) : ButtonContainer(g_vm),
BaseLocation::BaseLocation(TownAction action) : ButtonContainer(g_vm),
_townActionId(action), _isDarkCc(g_vm->_files->_isDarkCc),
_vocName("hello1.voc") {
_townMaxId = (action >= SPHINX) ? 0 : Res.TOWN_MAXES[_isDarkCc][action];
@ -44,10 +44,9 @@ TownLocation::TownLocation(TownAction action) : ButtonContainer(g_vm),
_farewellTime = 0;
_drawCtr1 = _drawCtr2 = 0;
_townPos = Common::Point(8, 8);
_animCtr = 0;
}
TownLocation::~TownLocation() {
BaseLocation::~BaseLocation() {
Interface &intf = *g_vm->_interface;
for (uint idx = 0; idx < _townSprites.size(); ++idx)
@ -55,7 +54,7 @@ TownLocation::~TownLocation() {
intf.mainIconsPrint();
}
int TownLocation::show() {
int BaseLocation::show() {
Map &map = *g_vm->_map;
Party &party = *g_vm->_party;
Sound &sound = *g_vm->_sound;
@ -110,7 +109,7 @@ int TownLocation::show() {
return result;
}
void TownLocation::drawBackground() {
void BaseLocation::drawBackground() {
Interface &intf = *g_vm->_interface;
intf._face1UIFrame = intf._face2UIFrame = 0;
@ -120,7 +119,7 @@ void TownLocation::drawBackground() {
_townSprites[_drawFrameIndex / 8].draw(0, _drawFrameIndex % 8, _townPos);
}
void TownLocation::drawWindow() {
void BaseLocation::drawWindow() {
Interface &intf = *g_vm->_interface;
Party &party = *g_vm->_party;
Windows &windows = *g_vm->_windows;
@ -138,7 +137,7 @@ void TownLocation::drawWindow() {
intf.highlightChar(0);
}
void TownLocation::drawAnim(bool flag) {
void BaseLocation::drawAnim(bool flag) {
Interface &intf = *g_vm->_interface;
Sound &sound = *g_vm->_sound;
Windows &windows = *g_vm->_windows;
@ -273,7 +272,7 @@ void TownLocation::drawAnim(bool flag) {
_animFrame = 2;
}
int TownLocation::wait() {
int BaseLocation::wait() {
EventsManager &events = *g_vm->_events;
Windows &windows = *g_vm->_windows;
@ -291,13 +290,9 @@ int TownLocation::wait() {
return _buttonValue;
}
void TownLocation::animUpdate() {
// TODO
}
/*------------------------------------------------------------------------*/
BankLocation::BankLocation() : TownLocation(BANK) {
BankLocation::BankLocation() : BaseLocation(BANK) {
_icons1.load("bank.icn");
_icons2.load("bank2.icn");
addButton(Common::Rect(234, 108, 259, 128), Common::KEYCODE_d, &_icons1);
@ -440,7 +435,7 @@ void BankLocation::depositWithdrawl(PartyBank whereId) {
/*------------------------------------------------------------------------*/
BlacksmithLocation::BlacksmithLocation() : TownLocation(BLACKSMITH) {
BlacksmithLocation::BlacksmithLocation() : BaseLocation(BLACKSMITH) {
_icons1.load("esc.icn");
addButton(Common::Rect(261, 108, 285, 128), Common::KEYCODE_ESCAPE, &_icons1);
addButton(Common::Rect(234, 54, 308, 62), 0);
@ -487,7 +482,7 @@ void BlacksmithLocation::farewell() {
/*------------------------------------------------------------------------*/
GuildLocation::GuildLocation() : TownLocation(GUILD) {
GuildLocation::GuildLocation() : BaseLocation(GUILD) {
loadStrings("spldesc.bin");
_icons1.load("esc.icn");
addButton(Common::Rect(261, 108, 285, 128), Common::KEYCODE_ESCAPE, &_icons1);
@ -540,7 +535,7 @@ Character *GuildLocation::doOptions(Character *c) {
/*------------------------------------------------------------------------*/
TavernLocation::TavernLocation() : TownLocation(TAVERN) {
TavernLocation::TavernLocation() : BaseLocation(TAVERN) {
_v21 = 0;
_v22 = 0;
_v23 = 0;
@ -781,7 +776,7 @@ void TavernLocation::farewell() {
/*------------------------------------------------------------------------*/
TempleLocation::TempleLocation() : TownLocation(TEMPLE) {
TempleLocation::TempleLocation() : BaseLocation(TEMPLE) {
_currentCharLevel = 0;
_donation = 0;
_healCost = 0;
@ -966,7 +961,7 @@ Character *TempleLocation::doOptions(Character *c) {
/*------------------------------------------------------------------------*/
TrainingLocation::TrainingLocation() : TownLocation(TRAINING) {
TrainingLocation::TrainingLocation() : BaseLocation(TRAINING) {
Common::fill(&_charsTrained[0], &_charsTrained[6], 0);
_maxLevel = 0;
_experienceToNextLevel = 0;
@ -1106,19 +1101,41 @@ Character *TrainingLocation::doOptions(Character *c) {
/*------------------------------------------------------------------------*/
ArenaLocation::ArenaLocation() : TownLocation(ARENA) {
ArenaLocation::ArenaLocation() : BaseLocation(ARENA) {
// TODO
}
/*------------------------------------------------------------------------*/
ReaperLocation::ReaperLocation() : TownLocation(REAPER) {
CutsceneLocation::CutsceneLocation(TownAction action) : BaseLocation(action),
_animCtr(0), _mazeFlag(false) {
Party &party = *g_vm->_party;
_mazeId = party._mazeId;
_mazePos = party._mazePosition;
_mazeDir = party._mazeDirection;
}
void CutsceneLocation::cutsceneAnimUpdate() {
// TODO
}
void CutsceneLocation::setNewLocation() {
Map &map = *g_vm->_map;
Party &party = *g_vm->_party;
map.load(_mazeId);
party._mazePosition = _mazePos;
party._mazeDirection = _mazeDir;
}
/*------------------------------------------------------------------------*/
ReaperCutscene::ReaperCutscene() : CutsceneLocation(REAPER) {
// TODO
}
/*------------------------------------------------------------------------*/
GolemLocation::GolemLocation() : TownLocation(GOLEM) {
GolemCutscene::GolemCutscene() : CutsceneLocation(GOLEM) {
// TODO
}
@ -1148,15 +1165,13 @@ const int16 DWARF2_Y[2][16] = {
{ 0, 12, 25, 37, 50, 62, 75, 87, 100, 112, 125, 137, 150, 162, 175, 186 }
};
DwarfLocation::DwarfLocation(bool isDwarf) : TownLocation(NO_ACTION) {
DwarfCutscene::DwarfCutscene(bool isDwarf) : CutsceneLocation(NO_ACTION) {
_townMaxId = Res.TOWN_MAXES[_isDarkCc][isDwarf ? DWARF1 : DWARF2];
loadStrings("special.bin");
}
int DwarfLocation::show() {
int DwarfCutscene::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;
@ -1165,7 +1180,7 @@ int DwarfLocation::show() {
SpriteResource sprites2(_isDarkCc ? "town2.zom" : "dwarf2.vga");
SpriteResource sprites3(_isDarkCc ? "town3.zom" : "dwarf3.vga");
SpriteResource boxSprites("box.vga");
bool mazeFlag = setNewLocation();
getNewLocation();
// Save the screen contents
Graphics::ManagedSurface savedBg;
@ -1208,13 +1223,13 @@ int DwarfLocation::show() {
if (_isDarkCc) {
sprites2.draw(0, 0);
sprites3.draw(0, 0);
animUpdate();
cutsceneAnimUpdate();
events.timeMark5();
while (!g_vm->shouldQuit() && events.timeElapsed5() < 7)
events.pollEventsAndWait();
sound.playSound(mazeFlag ? "ok2.voc" : "back2.voc");
sound.playSound(_mazeFlag ? "ok2.voc" : "back2.voc");
} else {
sound.playSound("dwarf11.voc");
}
@ -1229,7 +1244,7 @@ int DwarfLocation::show() {
do {
sprites2.draw(0, 0);
sprites3.draw(0, g_vm->getRandomNumber(_isDarkCc ? 8 : 9));
animUpdate();
cutsceneAnimUpdate();
events.timeMark5();
while (!g_vm->shouldQuit() && events.timeElapsed5() < 2)
@ -1245,6 +1260,8 @@ int DwarfLocation::show() {
sprites3.draw(0, 1);
windows[0].update();
setNewLocation();
// Restore game screen
sound.setMusicVolume(95);
screen.loadBackground("back.raw");
@ -1255,54 +1272,48 @@ int DwarfLocation::show() {
return 0;
}
bool DwarfLocation::setNewLocation() {
Map &map = *g_vm->_map;
void DwarfCutscene::getNewLocation() {
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;
_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;
_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;
_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;
_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;
_mazeId = 37;
_mazePos = Common::Point(7, 0);
_mazeDir = DIR_NORTH;
}
break;
@ -1310,41 +1321,36 @@ bool DwarfLocation::setNewLocation() {
break;
}
mazeFlag = mazeId != 0;
if (!mazeFlag) {
mazeId = party._mazeId;
mazePos = party._mazePosition;
mazeDir = party._mazeDirection;
}
_mazeFlag = _mazeId != 0;
} else {
switch (party._mazeId) {
case 14:
mazeId = 37;
mazePos = Common::Point(1, 4);
mazeDir = DIR_EAST;
_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;
_mazeId = 35;
_mazePos = Common::Point(1, 12);
_mazeDir = DIR_EAST;
} else {
mazeId = 36;
mazePos = Common::Point(7, 1);
mazeDir = DIR_NORTH;
_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;
_mazeId = 33;
_mazePos = Common::Point(7, 1);
_mazeDir = DIR_NORTH;
} else {
mazeId = 34;
mazePos = Common::Point(7, 30);
mazeDir = DIR_SOUTH;
_mazeId = 34;
_mazePos = Common::Point(7, 30);
_mazeDir = DIR_SOUTH;
}
break;
@ -1352,22 +1358,57 @@ bool DwarfLocation::setNewLocation() {
break;
}
}
map.load(mazeId);
party._mazePosition = mazePos;
party._mazeDirection = mazeDir;
return mazeFlag;
}
/*------------------------------------------------------------------------*/
SphinxLocation::SphinxLocation() : TownLocation(SPHINX) {
SphinxCutscene::SphinxCutscene() : CutsceneLocation(SPHINX) {
SpriteResource sprites1("sphinx.vga");
_boxSprites.load("box.vga");
// TODO
}
void SphinxCutscene::getNewLocation() {
Map &map = *g_vm->_map;
Party &party = *g_vm->_party;
switch (party._mazeId) {
case 2:
if (party._questItems[51]) {
map._loadDarkSide = true;
_mazeId = 125;
_mazePos = Common::Point(7, 6);
_mazeDir = DIR_NORTH;
_mazeFlag = true;
}
break;
case 5:
if (party._questItems[4]) {
_mazeId = 82;
_mazePos = Common::Point(7, 5);
_mazeDir = DIR_NORTH;
_mazeFlag = true;
}
break;
default:
break;
}
if (!_mazeFlag) {
_mazeId = party._mazeId;
_mazePos = party._mazePosition;
_mazeDir = party._mazeDirection;
}
}
/*------------------------------------------------------------------------*/
PyramidLocation::PyramidLocation() : TownLocation(PYRAMID) {
PyramidLocation::PyramidLocation() : BaseLocation(PYRAMID) {
}
int PyramidLocation::show() {
@ -1450,19 +1491,19 @@ int Town::townAction(TownAction actionId) {
_location = new ArenaLocation();
break;
case REAPER:
_location = new ReaperLocation();
_location = new ReaperCutscene();
break;
case GOLEM:
_location = new GolemLocation();
_location = new GolemCutscene();
break;
case DWARF1:
_location = new DwarfLocation(true);
_location = new DwarfCutscene(true);
break;
case DWARF2:
_location = new DwarfLocation(false);
_location = new DwarfCutscene(false);
break;
case SPHINX:
_location = new SphinxLocation();
_location = new SphinxCutscene();
break;
case PYRAMID:
_location = new PyramidLocation();

View File

@ -40,7 +40,7 @@ enum TownAction {
class XeenEngine;
class TownMessage;
class TownLocation : public ButtonContainer {
class BaseLocation : public ButtonContainer {
protected:
TownAction _townActionId;
Common::Array<SpriteResource> _townSprites;
@ -53,7 +53,6 @@ protected:
int _drawFrameIndex;
uint _farewellTime;
int _drawCtr1, _drawCtr2;
int _animCtr;
protected:
/**
* Draw the window
@ -65,11 +64,6 @@ 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
*/
@ -90,8 +84,8 @@ protected:
*/
virtual void farewell() {}
public:
TownLocation(TownAction action);
virtual ~TownLocation();
BaseLocation(TownAction action);
virtual ~BaseLocation();
/**
* Show the town location
@ -104,7 +98,7 @@ public:
void drawAnim(bool flag);
};
class BankLocation : public TownLocation {
class BankLocation : public BaseLocation {
private:
/**
* Handles deposits or withdrawls fro the bank
@ -130,7 +124,7 @@ public:
virtual ~BankLocation() {}
};
class BlacksmithLocation : public TownLocation {
class BlacksmithLocation : public BaseLocation {
protected:
/**
* Generates the display text for the location, for a given character
@ -151,7 +145,7 @@ public:
virtual ~BlacksmithLocation() {}
};
class GuildLocation : public TownLocation {
class GuildLocation : public BaseLocation {
protected:
/**
* Generates the display text for the location, for a given character
@ -167,7 +161,7 @@ public:
virtual ~GuildLocation() {}
};
class TavernLocation : public TownLocation {
class TavernLocation : public BaseLocation {
private:
int _v21;
uint _v22;
@ -193,7 +187,7 @@ public:
virtual ~TavernLocation() {}
};
class TempleLocation : public TownLocation {
class TempleLocation : public BaseLocation {
private:
int _currentCharLevel;
int _donation;
@ -219,7 +213,7 @@ public:
virtual ~TempleLocation() {}
};
class TrainingLocation : public TownLocation {
class TrainingLocation : public BaseLocation {
private:
int _charIndex;
bool _charsTrained[MAX_ACTIVE_PARTY];
@ -240,33 +234,55 @@ public:
virtual ~TrainingLocation() {}
};
class ArenaLocation : public TownLocation {
class ArenaLocation : public BaseLocation {
public:
ArenaLocation();
virtual ~ArenaLocation() {}
};
class ReaperLocation : public TownLocation {
class CutsceneLocation : public BaseLocation {
protected:
int _animCtr;
SpriteResource _boxSprites;
int _mazeId;
Direction _mazeDir;
Common::Point _mazePos;
bool _mazeFlag;
protected:
/**
* Handles cutscene animation update
*/
void cutsceneAnimUpdate();
/**
* Sets the new location
*/
void setNewLocation();
public:
ReaperLocation();
virtual ~ReaperLocation() {}
CutsceneLocation(TownAction action);
};
class GolemLocation : public TownLocation {
class ReaperCutscene : public CutsceneLocation {
public:
GolemLocation();
virtual ~GolemLocation() {}
ReaperCutscene();
virtual ~ReaperCutscene() {}
};
class DwarfLocation : public TownLocation {
class GolemCutscene : public CutsceneLocation {
public:
GolemCutscene();
virtual ~GolemCutscene() {}
};
class DwarfCutscene : public CutsceneLocation {
private:
/**
* Set the new location
* Get the new location
*/
bool setNewLocation();
void getNewLocation();
public:
DwarfLocation(bool isDwarf1);
virtual ~DwarfLocation() {}
DwarfCutscene(bool isDwarf1);
virtual ~DwarfCutscene() {}
/**
* Show the town location
@ -274,13 +290,18 @@ public:
virtual int show();
};
class SphinxLocation : public TownLocation {
class SphinxCutscene : public CutsceneLocation {
private:
/**
* Get the new location
*/
void getNewLocation();
public:
SphinxLocation();
virtual ~SphinxLocation() {}
SphinxCutscene();
virtual ~SphinxCutscene() {}
};
class PyramidLocation : public TownLocation {
class PyramidLocation : public BaseLocation {
public:
PyramidLocation();
virtual ~PyramidLocation() {}
@ -293,7 +314,7 @@ public:
class Town {
private:
TownLocation *_location;
BaseLocation *_location;
private:
int townWait();
@ -327,11 +348,11 @@ public:
void drawAnim(bool flag);
};
class TownMessage : public TownLocation {
class TownMessage : public BaseLocation {
private:
SpriteResource _iconSprites;
TownMessage() : TownLocation(NO_ACTION) {}
TownMessage() : BaseLocation(NO_ACTION) {}
bool execute(int portrait, const Common::String &name,
const Common::String &text, int confirm);