Skip to content
Permalink
Browse files

XEEN: Implement changes needed for World of Xeen 2 CD talkie

  • Loading branch information
dreammaster committed Apr 28, 2018
1 parent d253354 commit c2cdb2808d720e09ee6641e9a50c2e0a34f5bef8
@@ -61,6 +61,10 @@ Common::Platform XeenEngine::getPlatform() const {
return _gameDescription->desc.platform;
}

bool XeenEngine::getIsCD() const {
return getFeatures() & ADGF_CD;
}

} // End of namespace Xeen

static const PlainGameDescriptor XeenGames[] = {
@@ -73,7 +73,7 @@ static const XeenGameDescription gameDescriptions[] = {
},
Common::EN_ANY,
Common::kPlatformDOS,
ADGF_UNSTABLE | ADGF_CD,
ADGF_TESTING | ADGF_CD,
GUIO2(GAMEOPTION_SHOW_ITEM_COSTS, GAMEOPTION_DURABLE_ARMOR)
},
GType_WorldOfXeen,
@@ -21,6 +21,7 @@
*/

#include "common/config-manager.h"
#include "backends/audiocd/audiocd.h"
#include "xeen/scripts.h"
#include "xeen/dialogs/dialogs_copy_protection.h"
#include "xeen/dialogs/dialogs_input.h"
@@ -1466,7 +1467,14 @@ bool Scripts::cmdFlipWorld(ParamsIterator &params) {
return true;
}

bool Scripts::cmdPlayCD(ParamsIterator &params) { error("TODO"); }
bool Scripts::cmdPlayCD(ParamsIterator &params) {
int trackNum = params.readByte();
int start = params.readUint16LE();
int finish = params.readUint16LE();

g_system->getAudioCDManager()->play(trackNum, 1, start, finish);
return true;
}

void Scripts::doCloudsEnding() {
g_vm->_party->_cloudsCompleted = true;
@@ -41,7 +41,10 @@ void MainMenuContainer::show() {
menu = new DarkSideMainMenuContainer();
break;
case GType_WorldOfXeen:
menu = new WorldOfXeenMainMenuContainer();
if (g_vm->getIsCD())
menu = new WorldOfXeenCDMainMenuContainer();
else
menu = new WorldOfXeenMainMenuContainer();
break;
default:
error("Invalid game");
@@ -51,10 +54,20 @@ void MainMenuContainer::show() {
delete menu;
}

MainMenuContainer::MainMenuContainer(const Common::String &spritesName, uint frameCount) :
_frameCount(frameCount), _animateCtr(0), _dialog(nullptr) {
MainMenuContainer::MainMenuContainer(const char *spritesName1, const char *spritesName2, const char *spritesName3) :
_animateCtr(0), _dialog(nullptr) {
g_vm->_files->setGameCc(g_vm->getGameID() == GType_Clouds ? 0 : 1);
_backgroundSprites.load(spritesName);

_backgroundSprites.resize(1 + (spritesName2 ? 1 : 0) + (spritesName3 ? 1 : 0));
_backgroundSprites[0].load(spritesName1);
if (spritesName2)
_backgroundSprites[1].load(spritesName2);
if (spritesName3)
_backgroundSprites[0].load(spritesName3);

_frameCount = 0;
for (uint idx = 0; idx < _backgroundSprites.size(); ++idx)
_frameCount += _backgroundSprites[idx].size();
}

MainMenuContainer::~MainMenuContainer() {
@@ -67,7 +80,17 @@ MainMenuContainer::~MainMenuContainer() {
void MainMenuContainer::draw() {
g_vm->_screen->restoreBackground();
_animateCtr = (_animateCtr + 1) % _frameCount;
_backgroundSprites.draw(0, _animateCtr);

// Draw the next background frame
uint frameNum = _animateCtr;
for (uint idx = 0; idx < _backgroundSprites.size(); ++idx) {
if (frameNum < _backgroundSprites[idx].size()) {
_backgroundSprites[idx].draw(0, frameNum);
return;
} else {
frameNum -= _backgroundSprites[idx].size();
}
}
}

void MainMenuContainer::execute() {
@@ -123,7 +146,7 @@ void MainMenuContainer::execute() {

/*------------------------------------------------------------------------*/

CloudsMainMenuContainer::CloudsMainMenuContainer() : MainMenuContainer("intro.vga", 9) {
CloudsMainMenuContainer::CloudsMainMenuContainer() : MainMenuContainer("intro.vga") {
}

void CloudsMainMenuContainer::display() {
@@ -148,7 +171,7 @@ void CloudsMainMenuContainer::showMenuDialog() {

/*------------------------------------------------------------------------*/

DarkSideMainMenuContainer::DarkSideMainMenuContainer() : MainMenuContainer("title2a.int", 10) {
DarkSideMainMenuContainer::DarkSideMainMenuContainer() : MainMenuContainer("title2a.int") {
Screen &screen = *g_vm->_screen;
Sound &sound = *g_vm->_sound;
screen.loadPalette("dark.pal");
@@ -184,7 +207,7 @@ void DarkSideMainMenuContainer::showMenuDialog() {

/*------------------------------------------------------------------------*/

WorldOfXeenMainMenuContainer::WorldOfXeenMainMenuContainer() : MainMenuContainer("world.int", 5) {
WorldOfXeenMainMenuContainer::WorldOfXeenMainMenuContainer() : MainMenuContainer("world.int") {
}

void WorldOfXeenMainMenuContainer::display() {
@@ -209,6 +232,31 @@ void WorldOfXeenMainMenuContainer::showMenuDialog() {

/*------------------------------------------------------------------------*/

WorldOfXeenCDMainMenuContainer::WorldOfXeenCDMainMenuContainer() : MainMenuContainer("world0.int", "world1.int", "world2.int") {
}

void WorldOfXeenCDMainMenuContainer::display() {
FileManager &files = *g_vm->_files;
Screen &screen = *g_vm->_screen;
Sound &sound = *g_vm->_sound;

sound._musicSide = 1;
files.setGameCc(1);

screen.loadPalette("dark.pal");
screen.loadBackground("world.raw");
screen.saveBackground();

if (!sound.isMusicPlaying())
sound.playSong("newbrigh.m");
}

void WorldOfXeenCDMainMenuContainer::showMenuDialog() {
setOwner(new WorldMenuDialog(this));
}

/*------------------------------------------------------------------------*/

bool MainMenuDialog::handleEvents() {
checkEvents(g_vm);
int difficulty;
@@ -25,6 +25,7 @@

#include "xeen/xeen.h"
#include "xeen/dialogs/dialogs.h"
#include "common/array.h"

namespace Xeen {
namespace WorldOfXeen {
@@ -35,7 +36,7 @@ class MainMenuContainer {
private:
uint _animateCtr;
uint _frameCount;
SpriteResource _backgroundSprites;
Common::Array<SpriteResource> _backgroundSprites;
MenuContainerDialog *_dialog;
protected:
/**
@@ -61,7 +62,7 @@ class MainMenuContainer {
/**
* Constructor
*/
MainMenuContainer(const Common::String &spritesName, uint frameCount);
MainMenuContainer(const char *spritesName1, const char *spritesName2 = nullptr, const char *spritesName3 = nullptr);

/**
* Destructor
@@ -128,6 +129,21 @@ class WorldOfXeenMainMenuContainer : public MainMenuContainer {
WorldOfXeenMainMenuContainer();
};

class WorldOfXeenCDMainMenuContainer : public MainMenuContainer {
protected:
/**
* Called when the menu screen is first shown
*/
virtual void display();

/**
* Shows the main menu dialog
*/
virtual void showMenuDialog();
public:
WorldOfXeenCDMainMenuContainer();
};

class MenuContainerDialog : public ButtonContainer {
protected:
MainMenuContainer *_owner;
@@ -211,6 +211,7 @@ class XeenEngine : public Engine {
uint16 getVersion() const;
uint32 getGameID() const;
uint32 getGameFeatures() const;
bool getIsCD() const;

int getRandomNumber(int maxNumber);

0 comments on commit c2cdb28

Please sign in to comment.
You can’t perform that action at this time.