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

View File

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