Uniformed the interface of Parallaction class (and its hierarchy) with regards of gui code, which is now independent of engine version.

svn-id: r34219
This commit is contained in:
Nicola Mettifogo 2008-08-31 05:18:25 +00:00
parent 805a46b229
commit 983863bef3
9 changed files with 98 additions and 78 deletions

View File

@ -318,7 +318,7 @@ DECLARE_COMMAND_OPCODE(stop) {
}
void Parallaction_ns::drawAnimations() {
void Parallaction::drawAnimations() {
debugC(9, kDebugExec, "Parallaction_ns::drawAnimations()\n");
uint16 layer = 0, scale = 100;

View File

@ -40,11 +40,11 @@ protected:
Palette blackPal;
Palette pal;
Parallaction_br *_vm;
Parallaction *_vm;
int _fadeSteps;
public:
SplashInputState_BR(Parallaction_br *vm, const Common::String &name, MenuInputHelper *helper) : MenuInputState(name, helper), _vm(vm) {
SplashInputState_BR(Parallaction *vm, const Common::String &name, MenuInputHelper *helper) : MenuInputState(name, helper), _vm(vm) {
}
virtual MenuInputState* run() {
@ -150,6 +150,8 @@ class MainMenuInputState_BR : public MenuInputState {
static const char *_menuStrings[NUM_MENULINES];
static const MenuOptions _options[NUM_MENULINES];
static const char *_firstLocation[];
int _availItems;
int _selection;
@ -173,7 +175,7 @@ class MainMenuInputState_BR : public MenuInputState {
break;
default:
_vm->startPart(selectedItem);
_vm->scheduleLocationSwitch(_firstLocation[selectedItem]);
}
}
@ -218,9 +220,11 @@ public:
}
_vm->showSlide("tbra", x, y);
// TODO: load progress from savefile
int progress = 3;
_availItems = 4 + progress;
_availItems = 4;
bool complete[3];
_vm->getGamePartProgress(complete, 3);
for (int i = 0; i < 3 && complete[i]; i++, _availItems++) ;
// TODO: keep track of and destroy menu item frames/surfaces
int i;
@ -236,6 +240,14 @@ public:
};
const char *MainMenuInputState_BR::_firstLocation[] = {
"intro.0",
"museo.1",
"start.2",
"bolscoi.3",
"treno.4"
};
const char *MainMenuInputState_BR::_menuStrings[NUM_MENULINES] = {
"SEE INTRO",
"NEW GAME",

View File

@ -41,10 +41,10 @@ protected:
Common::String _nextState;
uint32 _startTime;
Parallaction_ns *_vm;
Parallaction *_vm;
public:
SplashInputState_NS(Parallaction_ns *vm, const Common::String &name, MenuInputHelper *helper) : MenuInputState(name, helper), _vm(vm) {
SplashInputState_NS(Parallaction *vm, const Common::String &name, MenuInputHelper *helper) : MenuInputState(name, helper), _vm(vm) {
}
virtual MenuInputState* run() {
@ -66,7 +66,7 @@ public:
class SplashInputState0_NS : public SplashInputState_NS {
public:
SplashInputState0_NS(Parallaction_ns *vm, MenuInputHelper *helper) : SplashInputState_NS(vm, "intro0", helper) {
SplashInputState0_NS(Parallaction *vm, MenuInputHelper *helper) : SplashInputState_NS(vm, "intro0", helper) {
_slideName = "intro";
_timeOut = 2000;
_nextState = "intro1";
@ -76,7 +76,7 @@ public:
class SplashInputState1_NS : public SplashInputState_NS {
public:
SplashInputState1_NS(Parallaction_ns *vm, MenuInputHelper *helper) : SplashInputState_NS(vm, "intro1", helper) {
SplashInputState1_NS(Parallaction *vm, MenuInputHelper *helper) : SplashInputState_NS(vm, "intro1", helper) {
_slideName = "minintro";
_timeOut = 2000;
_nextState = "chooselanguage";
@ -111,10 +111,10 @@ class ChooseLanguageInputState_NS : public MenuInputState {
static const Common::Rect _amigaLanguageSelectBlocks[4];
const Common::Rect *_blocks;
Parallaction_ns *_vm;
Parallaction *_vm;
public:
ChooseLanguageInputState_NS(Parallaction_ns *vm, MenuInputHelper *helper) : MenuInputState("chooselanguage", helper), _vm(vm) {
ChooseLanguageInputState_NS(Parallaction *vm, MenuInputHelper *helper) : MenuInputState("chooselanguage", helper), _vm(vm) {
_allowChoice = false;
_nextState = "selectgame";
@ -203,13 +203,13 @@ class SelectGameInputState_NS : public MenuInputState {
uint _labels[2];
Parallaction_ns *_vm;
Parallaction *_vm;
static const char *newGameMsg[4];
static const char *loadGameMsg[4];
public:
SelectGameInputState_NS(Parallaction_ns *vm, MenuInputHelper *helper) : MenuInputState("selectgame", helper), _vm(vm) {
SelectGameInputState_NS(Parallaction *vm, MenuInputHelper *helper) : MenuInputState("selectgame", helper), _vm(vm) {
_choice = 0;
_oldChoice = -1;
@ -271,10 +271,10 @@ const char *SelectGameInputState_NS::loadGameMsg[4] = {
class LoadGameInputState_NS : public MenuInputState {
bool _result;
Parallaction_ns *_vm;
Parallaction *_vm;
public:
LoadGameInputState_NS(Parallaction_ns *vm, MenuInputHelper *helper) : MenuInputState("loadgame", helper), _vm(vm) { }
LoadGameInputState_NS(Parallaction *vm, MenuInputHelper *helper) : MenuInputState("loadgame", helper), _vm(vm) { }
virtual MenuInputState* run() {
if (!_result) {
@ -291,12 +291,12 @@ public:
class NewGameInputState_NS : public MenuInputState {
Parallaction_ns *_vm;
Parallaction *_vm;
static const char *introMsg3[4];
public:
NewGameInputState_NS(Parallaction_ns *vm, MenuInputHelper *helper) : MenuInputState("newgame", helper), _vm(vm) {
NewGameInputState_NS(Parallaction *vm, MenuInputHelper *helper) : MenuInputState("newgame", helper), _vm(vm) {
}
virtual MenuInputState* run() {
@ -344,10 +344,10 @@ const char *NewGameInputState_NS::introMsg3[4] = {
class StartDemoInputState_NS : public MenuInputState {
Parallaction_ns *_vm;
Parallaction *_vm;
public:
StartDemoInputState_NS(Parallaction_ns *vm, MenuInputHelper *helper) : MenuInputState("startdemo", helper), _vm(vm) {
StartDemoInputState_NS(Parallaction *vm, MenuInputHelper *helper) : MenuInputState("startdemo", helper), _vm(vm) {
}
virtual MenuInputState* run() {
@ -372,7 +372,7 @@ class SelectCharacterInputState_NS : public MenuInputState {
static const Common::Rect codeSelectBlocks[9];
static const Common::Rect codeTrueBlocks[9];
Parallaction_ns *_vm;
Parallaction *_vm;
int guiGetSelectedBlock(const Common::Point &p) {
@ -425,7 +425,7 @@ class SelectCharacterInputState_NS : public MenuInputState {
public:
SelectCharacterInputState_NS(Parallaction_ns *vm, MenuInputHelper *helper) : MenuInputState("selectcharacter", helper), _vm(vm) {
SelectCharacterInputState_NS(Parallaction *vm, MenuInputHelper *helper) : MenuInputState("selectcharacter", helper), _vm(vm) {
_keys = (_vm->getPlatform() == Common::kPlatformAmiga && (_vm->getFeatures() & GF_LANG_MULT)) ? _amigaKeys : _pcKeys;
_block.create(BLOCK_WIDTH, BLOCK_HEIGHT, 1);
}
@ -509,7 +509,6 @@ public:
error("If you read this, either your CPU or transivity is broken (we believe the former).");
}
_vm->_inTestResult = false;
_vm->cleanupGame();
_vm->scheduleLocationSwitch(_charStartLocation[character]);
}
@ -621,7 +620,7 @@ const Common::Rect SelectCharacterInputState_NS::codeTrueBlocks[9] = {
class ShowCreditsInputState_NS : public MenuInputState {
Parallaction_ns *_vm;
Parallaction *_vm;
int _current;
uint32 _startTime;
@ -633,7 +632,7 @@ class ShowCreditsInputState_NS : public MenuInputState {
static const Credit _credits[6];
public:
ShowCreditsInputState_NS(Parallaction_ns *vm, MenuInputHelper *helper) : MenuInputState("showcredits", helper), _vm(vm) {
ShowCreditsInputState_NS(Parallaction *vm, MenuInputHelper *helper) : MenuInputState("showcredits", helper), _vm(vm) {
}
void drawCurrentLabel() {
@ -686,11 +685,11 @@ const ShowCreditsInputState_NS::Credit ShowCreditsInputState_NS::_credits[6] = {
};
class EndIntroInputState_NS : public MenuInputState {
Parallaction_ns *_vm;
Parallaction *_vm;
bool _isDemo;
public:
EndIntroInputState_NS(Parallaction_ns *vm, MenuInputHelper *helper) : MenuInputState("endintro", helper), _vm(vm) {
EndIntroInputState_NS(Parallaction *vm, MenuInputHelper *helper) : MenuInputState("endintro", helper), _vm(vm) {
_isDemo = (_vm->getFeatures() & GF_DEMO) != 0;
}
@ -723,7 +722,7 @@ public:
class EndPartInputState_NS : public MenuInputState {
Parallaction_ns *_vm;
Parallaction *_vm;
bool _allPartsComplete;
// part completion messages
@ -739,7 +738,7 @@ class EndPartInputState_NS : public MenuInputState {
public:
EndPartInputState_NS(Parallaction_ns *vm, MenuInputHelper *helper) : MenuInputState("endpart", helper), _vm(vm) {
EndPartInputState_NS(Parallaction *vm, MenuInputHelper *helper) : MenuInputState("endpart", helper), _vm(vm) {
}
virtual MenuInputState* run() {
@ -759,7 +758,9 @@ public:
}
virtual void enter() {
_allPartsComplete = _vm->allPartsComplete();
bool completed[3];
_vm->getGamePartProgress(completed, 3);
_allPartsComplete = (completed[0] && completed[1] && completed[2]);
_vm->_input->setMouseState(MOUSE_DISABLED);
uint id[4];

View File

@ -269,7 +269,15 @@ void Parallaction::freeLocation() {
return;
}
void Parallaction::showSlide(const char *name, int x, int y) {
BackgroundInfo *info = new BackgroundInfo;
_disk->loadSlide(*info, name);
info->x = (x == CENTER_LABEL_HORIZONTAL) ? ((_vm->_screenWidth - info->width) >> 1) : x;
info->y = (y == CENTER_LABEL_VERTICAL) ? ((_vm->_screenHeight - info->height) >> 1) : y;
_gfx->setBackground(kBackgroundSlide, info);
}
void Parallaction::freeBackground() {

View File

@ -333,12 +333,16 @@ public:
void updateDoor(ZonePtr z, bool close);
virtual void drawAnimations() = 0;
void drawAnimations();
void beep();
void showSlide(const char *name, int x = 0, int y = 0);
ZonePtr _zoneTrap;
virtual void cleanupGame() = 0;
virtual void getGamePartProgress(bool *complete, int size) = 0;
public:
void highlightInventoryItem(ItemPosition pos);
int16 getHoverInventoryItem(int16 x, int16 y);
@ -443,14 +447,13 @@ public:
bool saveGame();
void switchBackground(const char* background, const char* mask);
void showSlide(const char *name, int x = 0, int y = 0);
// TODO: this should be private!!!!!!!
bool _inTestResult;
void cleanupGame();
bool allPartsComplete();
void getGamePartProgress(bool *complete, int size);
private:
bool _inTestResult;
LocationParser_ns *_locationParser;
ProgramParser_ns *_programParser;
@ -528,7 +531,6 @@ private:
const Callable *_callables;
protected:
void drawAnimations();
void parseLocation(const char *filename);
void loadProgram(AnimationPtr a, const char *filename);
@ -558,6 +560,7 @@ public:
void setupSubtitles(char *s, char *s2, int y);
void clearSubtitles();
void getGamePartProgress(bool *complete, int size);
public:
Table *_countersNames;
@ -565,7 +568,6 @@ public:
const char **_audioCommandsNamesRes;
int _part;
int _progress;
#if 0 // disabled since I couldn't find any references to lip sync in the scripts
int16 _lipSyncVal;
@ -579,7 +581,6 @@ public:
int32 _counters[32];
uint32 _zoneFlags[NUM_LOCATIONS][NUM_ZONES];
void startPart(uint part);
private:
LocationParser_br *_locationParser;
ProgramParser_br *_programParser;

View File

@ -41,14 +41,6 @@ const char *Parallaction_br::_partNames[] = {
"PART4"
};
const char *partFirstLocation[] = {
"intro",
"museo",
"start",
"bolscoi",
"treno"
};
int Parallaction_br::init() {
_screenWidth = 640;
@ -112,7 +104,7 @@ int Parallaction_br::go() {
while ((_engineFlags & kEngineQuit) == 0) {
if (getFeatures() & GF_DEMO) {
startPart(1);
scheduleLocationSwitch("camalb.1");
_input->_inputMode = Input::kInputModeGame;
} else {
startGui(splash);
@ -174,23 +166,6 @@ void Parallaction_br::freePart() {
_countersNames = 0;
}
void Parallaction_br::startPart(uint part) {
_part = part;
_disk->selectArchive(_partNames[_part]);
initPart();
if (getFeatures() & GF_DEMO) {
strcpy(_location._name, "camalb");
} else {
strcpy(_location._name, partFirstLocation[_part]);
}
parseLocation("common");
changeLocation(_location._name);
}
void Parallaction_br::runPendingZones() {
ZonePtr z;
@ -245,6 +220,24 @@ void Parallaction_br::freeLocation() {
void Parallaction_br::changeLocation(char *location) {
char *partStr = strrchr(location, '.');
if (partStr) {
int n = partStr - location;
strncpy(_location._name, location, n);
_location._name[n] = '\0';
_part = atoi(++partStr);
if (getFeatures() & GF_DEMO) {
assert(_part == 1);
} else {
assert(_part >= 0 && _part <= 4);
}
_disk->selectArchive(_partNames[_part]);
initPart();
parseLocation("common");
}
freeLocation();
// load new location
parseLocation(location);

View File

@ -220,16 +220,6 @@ void Parallaction_ns::switchBackground(const char* background, const char* mask)
}
void Parallaction_ns::showSlide(const char *name, int x, int y) {
BackgroundInfo *info = new BackgroundInfo;
_disk->loadSlide(*info, name);
info->x = (x == CENTER_LABEL_HORIZONTAL) ? ((_vm->_screenWidth - info->width) >> 1) : x;
info->y = (y == CENTER_LABEL_VERTICAL) ? ((_vm->_screenHeight - info->height) >> 1) : y;
_gfx->setBackground(kBackgroundSlide, info);
}
void Parallaction_ns::runPendingZones() {
if (_activeZone) {
ZonePtr z = _activeZone; // speak Zone or sound
@ -395,6 +385,7 @@ void Parallaction_ns::changeCharacter(const char *name) {
}
void Parallaction_ns::cleanupGame() {
_inTestResult = false;
_engineFlags &= ~kEngineTransformedDonna;

View File

@ -27,6 +27,7 @@
#define PARALLACTION_PARSER_H
#include "common/stream.h"
#include "common/stack.h"
#include "parallaction/objects.h"
#include "parallaction/walk.h"

View File

@ -445,14 +445,27 @@ void Parallaction_ns::setPartComplete(const Character& character) {
return;
}
bool Parallaction_ns::allPartsComplete() {
char buf[30];
void Parallaction_ns::getGamePartProgress(bool *complete, int size) {
assert(complete && size >= 3);
char buf[30];
Common::InSaveFile *inFile = getInSaveFile(SPECIAL_SAVESLOT);
inFile->readLine(buf, 29);
delete inFile;
return strstr(buf, "dino") && strstr(buf, "donna") && strstr(buf, "dough");
complete[0] = strstr(buf, "dino");
complete[1] = strstr(buf, "donna");
complete[2] = strstr(buf, "dough");
}
void Parallaction_br::getGamePartProgress(bool *complete, int size) {
assert(complete && size >= 3);
// TODO: implement progress loading
complete[0] = true;
complete[1] = true;
complete[2] = true;
}
void Parallaction_ns::renameOldSavefiles() {