put all 'bam' related stuff in a class and allow load/save during a 'bam' scene

svn-id: r11759
This commit is contained in:
Gregory Montoir 2003-12-19 09:22:20 +00:00
parent dae474e86d
commit b7a5d97207
6 changed files with 158 additions and 151 deletions

View File

@ -26,6 +26,7 @@
#include "queen/logic.h"
#include "queen/queen.h"
#include "queen/resource.h"
#include "queen/sound.h"
namespace Queen {
@ -598,10 +599,12 @@ void Graphics::bobCustomParallax(uint16 roomNum) {
}
break;
case ROOM_CAR_CHASE:
updateCarBamScene();
_vm->bam()->updateCarAnimation();
// updateCarBamScene();
break;
case ROOM_FINAL_FIGHT:
updateFightBamScene();
_vm->bam()->updateFightAnimation();
// updateFightBamScene();
break;
case ROOM_INTRO_RITA_JOE_HEADS: // CR 2 - CD-Rom pan right while Rita talks...
_cameraBob = -1;
@ -735,49 +738,32 @@ void Graphics::loadPanel() {
}
void Graphics::initCarBamScene() {
void BamScene::updateCarAnimation() {
bobClear(5);
_bobs[5].active = true;
bobClear(6);
_bobs[6].active = true;
bobClear(7);
_bobs[7].active = true;
_bam.flag = 1;
_bam.index = 0;
}
void Graphics::updateCarBamScene() {
if (_bam.flag) {
const BamDataBlock *bdb = &_bam._carData[_bam.index];
BobSlot *pbob;
if (_flag != F_STOP) {
const BamDataBlock *bdb = &_carData[_index];
// Truck
pbob = &_bobs[5];
pbob->curPos(bdb->obj1.x, bdb->obj1.y);
pbob->frameNum = 40 + bdb->obj1.frame;
_obj1->curPos(bdb->obj1.x, bdb->obj1.y);
_obj1->frameNum = 40 + bdb->obj1.frame;
// Rico
pbob = &_bobs[6];
pbob->curPos(bdb->obj2.x, bdb->obj2.y);
pbob->frameNum = 30 + bdb->obj2.frame;
_obj2->curPos(bdb->obj2.x, bdb->obj2.y);
_obj2->frameNum = 30 + bdb->obj2.frame;
// FX
pbob = &_bobs[7];
pbob->curPos(bdb->fx.x, bdb->fx.y);
pbob->frameNum = 41 + bdb->fx.frame;
_objfx->curPos(bdb->fx.x, bdb->fx.y);
_objfx->frameNum = 41 + bdb->fx.frame;
if (bdb->sfx < 0) {
// XXX playsong(-bdb->sfx);
_vm->sound()->playSong(-bdb->sfx);
}
if (bdb->sfx == 99) {
_bam.index = 0;
_index = 0;
}
else {
++_bam.index;
++_index;
}
// Play BKG SFX
// XXX if(bamsfx==2 && SFXTOGGLE) sfxplay(NULLstr);
@ -785,69 +771,41 @@ void Graphics::updateCarBamScene() {
}
void Graphics::cleanupCarBamScene(uint16 oilBobNum) {
void BamScene::updateFightAnimation() {
_bam.flag = 0;
//CR 2 - Turn off big oil splat and gun shots!
_bobs[oilBobNum].active = false;
_bobs[7].active = false;
}
void Graphics::initFightBamScene() {
bobClear(5);
_bobs[5].active = true;
bobClear(6);
_bobs[6].active = true;
bobClear(7);
_bobs[7].active = true;
_bam.flag = 1;
_bam.index = 0;
_bam._screenShaked = false;
_bam._fightData = _bam._fight1Data;
}
void Graphics::updateFightBamScene() {
if (_bam.flag) {
const BamDataBlock *bdb = &_bam._fightData[_bam.index];
BobSlot *pbob;
if (_flag != F_STOP) {
const BamDataBlock *bdb = &_fightData[_index];
// Frank
pbob = &_bobs[5];
pbob->curPos(bdb->obj1.x, bdb->obj1.y);
pbob->frameNum = 40 + ABS(bdb->obj1.frame);
pbob->xflip = (bdb->obj1.frame < 0);
_obj1->curPos(bdb->obj1.x, bdb->obj1.y);
_obj1->frameNum = 40 + ABS(bdb->obj1.frame);
_obj1->xflip = (bdb->obj1.frame < 0);
// Robot
pbob = &_bobs[6];
pbob->curPos(bdb->obj2.x, bdb->obj2.y);
pbob->frameNum = 40 + ABS(bdb->obj2.frame);
pbob->xflip = (bdb->obj2.frame < 0);
_obj2->curPos(bdb->obj2.x, bdb->obj2.y);
_obj2->frameNum = 40 + ABS(bdb->obj2.frame);
_obj2->xflip = (bdb->obj2.frame < 0);
// FX
pbob = &_bobs[7];
pbob->curPos(bdb->fx.x, bdb->fx.y);
pbob->frameNum = 40 + ABS(bdb->fx.frame);
pbob->xflip = (bdb->fx.frame < 0);
_objfx->curPos(bdb->fx.x, bdb->fx.y);
_objfx->frameNum = 40 + ABS(bdb->fx.frame);
_objfx->xflip = (bdb->fx.frame < 0);
if (bdb->sfx < 0) {
// XXX playsong(-bdb->sfx);
_vm->sound()->playSong(-bdb->sfx);
}
++_bam.index;
++_index;
switch (bdb->sfx) {
case 0: // nothing, so reset shaked screen if necessary
if (_bam._screenShaked) {
if (_screenShaked) {
OSystem::instance()->set_shake_pos(0);
_bam._screenShaked = false;
_screenShaked = false;
}
break;
case 1: // shake screen
OSystem::instance()->set_shake_pos(3);
_bam._screenShaked = true;
_screenShaked = true;
break;
case 2: // play background sfx
// XXX if(SFXTOGGLE) sfxplay(NULLstr);
@ -855,18 +813,18 @@ void Graphics::updateFightBamScene() {
case 3: // play background sfx and shake screen
// XXX if(SFXTOGGLE) sfxplay(NULLstr);
OSystem::instance()->set_shake_pos(3);
_bam._screenShaked = true;
_screenShaked = true;
break;
case 99: // end of BAM data
_bam.index = 0;
_index = 0;
const BamDataBlock *data[] = {
_bam._fight1Data,
_bam._fight2Data,
_bam._fight3Data
_fight1Data,
_fight2Data,
_fight3Data
};
_bam._fightData = data[_vm->randomizer.getRandomNumber(2)];
if (_bam.flag == 2) {
_bam.flag = 0;
_fightData = data[_vm->randomizer.getRandomNumber(2)];
if (_flag == F_REQ_STOP) {
_flag = F_STOP;
}
break;
}
@ -1008,7 +966,30 @@ int Graphics::textCenterX(const char *text) const {
const BamDataBlock BamData::_carData[] = {
BamScene::BamScene(QueenEngine *vm)
: _flag(F_STOP), _screenShaked(false), _fightData(_fight1Data), _vm(vm) {
}
void BamScene::prepareAnimation() {
_obj1 = _vm->graphics()->bob(BOB_OBJ1);
_vm->graphics()->bobClear(BOB_OBJ1);
_obj1->active = true;
_obj2 = _vm->graphics()->bob(BOB_OBJ2);
_vm->graphics()->bobClear(BOB_OBJ2);
_obj2->active = true;
_objfx = _vm->graphics()->bob(BOB_FX);
_vm->graphics()->bobClear(BOB_FX);
_objfx->active = true;
_index = 0;
}
const BamDataBlock BamScene::_carData[] = {
{ { 310, 105, 1 }, { 314, 106, 17 }, { 366, 101, 1 }, 0 },
{ { 303, 105, 1 }, { 307, 106, 17 }, { 214, 0, 10 }, 0 },
{ { 297, 104, 1 }, { 301, 105, 17 }, { 214, 0, 10 }, 0 },
@ -1086,7 +1067,7 @@ const BamDataBlock BamData::_carData[] = {
{ { 310, 110, 1 }, { 314, 111, 17 }, { 214, 0, 10 }, 99 }
};
const BamDataBlock BamData::_fight1Data[] = {
const BamDataBlock BamScene::_fight1Data[] = {
{ { 75, 96, 1 }, { 187, 96, -23 }, { 58, 37, 46 }, 0 },
{ { 75, 96, 2 }, { 187, 96, -23 }, { 58, 37, 46 }, 0 },
{ { 75, 96, 3 }, { 187, 96, -23 }, { 58, 37, 46 }, 0 },
@ -1135,7 +1116,7 @@ const BamDataBlock BamData::_fight1Data[] = {
{ { 75, 96, 1 }, { 187, 96, -23 }, { 0, 0, 0 }, 99 }
};
const BamDataBlock BamData::_fight2Data[] = {
const BamDataBlock BamScene::_fight2Data[] = {
{ { 75, 96, 1 }, { 187, 96, -23 }, { 150, 45, 35 }, 0 },
{ { 78, 96, 2 }, { 187, 96, -23 }, { 150, 45, 35 }, 0 },
{ { 81, 96, 3 }, { 189, 96, -18 }, { 150, 45, 35 }, 0 },
@ -1193,7 +1174,7 @@ const BamDataBlock BamData::_fight2Data[] = {
{ { 75, 96, 5 }, { 187, 96, -23 }, { 224, 53, 53 }, 99 }
};
const BamDataBlock BamData::_fight3Data[] = {
const BamDataBlock BamScene::_fight3Data[] = {
{ { 75, 96, 1 }, { 187, 96, -23 }, { 150, 45, 35 }, 0 },
{ { 77, 96, 2 }, { 187, 96, -22 }, { 150, 45, 35 }, 0 },
{ { 80, 96, 3 }, { 185, 96, -17 }, { 150, 45, 35 }, 0 },

View File

@ -102,34 +102,6 @@ struct TextSlot {
};
struct BamDataObj {
int16 x, y;
int16 frame;
};
struct BamDataBlock {
BamDataObj obj1; // truck / Frank
BamDataObj obj2; // Rico / robot
BamDataObj fx;
int16 sfx;
};
struct BamData {
BamData() : flag(0), index(0) {}
int16 flag;
int16 index;
bool _screenShaked;
const BamDataBlock *_fightData;
static const BamDataBlock _carData[];
static const BamDataBlock _fight1Data[];
static const BamDataBlock _fight2Data[];
static const BamDataBlock _fight3Data[];
};
class QueenEngine;
class Graphics {
@ -182,15 +154,6 @@ public:
void cameraBob(int bobNum) { _cameraBob = bobNum; }
int cameraBob() const { return _cameraBob; }
BamData *bamData() { return &_bam; }
void initCarBamScene();
void updateCarBamScene();
void cleanupCarBamScene(uint16 i);
void initFightBamScene();
void updateFightBamScene();
void update(uint16 room);
enum {
@ -233,9 +196,59 @@ private:
int _cameraBob;
BamData _bam;
QueenEngine *_vm;
};
struct BamDataObj {
int16 x, y;
int16 frame;
};
struct BamDataBlock {
BamDataObj obj1; // truck / Frank
BamDataObj obj2; // Rico / robot
BamDataObj fx;
int16 sfx;
};
class BamScene {
public:
BamScene(QueenEngine *vm);
void prepareAnimation();
void updateCarAnimation();
void updateFightAnimation();
enum {
BOB_OBJ1 = 5,
BOB_OBJ2 = 6,
BOB_FX = 7
};
enum {
F_STOP = 0,
F_PLAY = 1,
F_REQ_STOP = 2
};
uint16 _flag, _index;
private:
BobSlot *_obj1;
BobSlot *_obj2;
BobSlot *_objfx;
bool _screenShaked;
const BamDataBlock *_fightData;
QueenEngine *_vm;
static const BamDataBlock _carData[];
static const BamDataBlock _fight1Data[];
static const BamDataBlock _fight2Data[];
static const BamDataBlock _fight3Data[];
};
} // End of namespace Queen

View File

@ -2297,7 +2297,7 @@ bool Logic::gameSave(uint16 slot, const char *desc) {
_walkOffData[i].writeTo(ptr);
WRITE_BE_UINT16(ptr, _joe.facing); ptr += 2;
WRITE_BE_UINT16(ptr, 0); ptr += 2; //TODO: tmpbamflag
WRITE_BE_UINT16(ptr, _vm->bam()->_flag); ptr += 2;
WRITE_BE_UINT16(ptr, 0); ptr += 2; //TODO: lastoverride
//TODO: lastmerge, lastalter, altmrgpri
@ -2365,7 +2365,7 @@ bool Logic::gameLoad(uint16 slot) {
_walkOffData[i].readFrom(ptr);
joeFacing(READ_BE_UINT16(ptr)); ptr += 2;
READ_BE_UINT16(ptr); ptr += 2; //TODO: tmpbamflag
_vm->bam()->_flag = READ_BE_UINT16(ptr); ptr += 2;
READ_BE_UINT16(ptr); ptr += 2; //TODO: lastoverride
//_vm->sound()->playSound(_vm->sound()->lastOverride())
@ -2379,6 +2379,10 @@ bool Logic::gameLoad(uint16 slot) {
return false;
}
if (_vm->bam()->_flag != BamScene::F_STOP) {
_vm->bam()->prepareAnimation();
}
joeCutFacing(joeFacing());
joeFace();
@ -2389,19 +2393,19 @@ bool Logic::gameLoad(uint16 slot) {
_entryObj = 0;
switch (gameState(VAR_DRESSING_MODE)) {
case 0:
joeUseClothes(false);
break;
case 1:
joeUseUnderwear();
break;
case 2:
joeUseDress(false);
break;
case 0:
joeUseClothes(false);
break;
case 1:
joeUseUnderwear();
break;
case 2:
joeUseDress(false);
break;
}
inventoryRefresh();
//bamflag = ..
delete[] saveData;
return true;
}
@ -2680,21 +2684,25 @@ void Logic::asmSwitchToNormalPalette() {
void Logic::asmStartCarAnimation() {
// Carbam background animation - room 74
_vm->graphics()->initCarBamScene();
_vm->bam()->_flag = BamScene::F_PLAY;
_vm->bam()->prepareAnimation();
}
void Logic::asmStopCarAnimation() {
// CR 2 - Turn off big oil splat and gun shots!
_vm->graphics()->cleanupCarBamScene(findBob(594)); // Oil object
_vm->bam()->_flag = BamScene::F_STOP;
//CR 2 - Turn off big oil splat and gun shots!
_vm->graphics()->bob(findBob(594))->active = false; // Oil object
_vm->graphics()->bob(7)->active = false;
}
void Logic::asmStartFightAnimation() {
// Fight1 background animation - room 69
_vm->graphics()->initFightBamScene();
_vm->bam()->_flag = BamScene::F_PLAY;
_vm->bam()->prepareAnimation();
gameState(148, 1);
}
@ -2702,8 +2710,8 @@ void Logic::asmStartFightAnimation() {
void Logic::asmWaitForFrankPosition() {
// c69e.cut
_vm->graphics()->bamData()->flag = 2;
while (_vm->graphics()->bamData()->flag) {
_vm->bam()->_flag = BamScene::F_REQ_STOP;
while (_vm->bam()->_flag != BamScene::F_STOP) {
update();
}
}
@ -2775,8 +2783,8 @@ void Logic::asmEndGame() {
for (i = 0; i < 40; ++i) {
update();
}
OSystem::instance()->quit();
debug(0, "Game completed");
OSystem::instance()->quit();
}
@ -3032,7 +3040,7 @@ void Logic::asmScaleEnding() {
void Logic::asmWaitForCarPosition() {
// Wait for car to reach correct position before pouring oil
while (_vm->graphics()->bamData()->index != 60) {
while (_vm->bam()->_index != 60) {
update();
}
}

View File

@ -102,6 +102,7 @@ QueenEngine::QueenEngine(GameDetector *detector, OSystem *syst)
QueenEngine::~QueenEngine() {
_timer->removeTimerProc(&timerHandler);
delete _bam;
delete _resource;
delete _command;
delete _display;
@ -159,6 +160,7 @@ void QueenEngine::go() {
void QueenEngine::initialise(void) {
_bam = new BamScene(this);
_resource = new Resource(_gameDataPath, _system->get_savefile_manager(), getSavePath());
_command = new Command(this);
_display = new Display(this, _resource->getLanguage(), _system);

View File

@ -28,6 +28,7 @@ class GameDetector;
namespace Queen {
class BamScene;
class Command;
class Display;
class Graphics;
@ -44,6 +45,7 @@ public:
QueenEngine(GameDetector *detector, OSystem *syst);
virtual ~QueenEngine();
BamScene *bam() const { return _bam; }
Command *command() const { return _command; }
Display *display() const { return _display; }
Graphics *graphics() const { return _graphics; }
@ -67,6 +69,7 @@ protected:
static void timerHandler(void *ptr);
void gotTimerTick();
BamScene *_bam;
Command *_command;
Display *_display;
Graphics *_graphics;

View File

@ -232,8 +232,8 @@ A_FILE_MAX Logic::_numAFile
ACTOR_DATA_MAX Logic::_numActors
AREA Logic::_area
AREAMAX Logic::_areaMax
bamflag Graphics::_bam.flag
bamindex Graphics::_bam.index
bamflag BamScene::_flag
bamindex BamScene::_index
DESCTOT Logic::_numDescriptions
ENTRY_OBJ Logic::_entryObj
FMAX Logic::_numFurnitureStatic
@ -343,7 +343,6 @@ oldsn Sound::_previousSongNum
LASTSONG Sound::_previousSong
CURRSONG Sound::_currentSong
SFXNAME Sound::_sfxName
tmpbamflag
VOLUME
@ -497,3 +496,4 @@ TEMPstr
WORDstr
JOE2str,PERSON2str // locals in Talk::initialTalk
SUBJECT
tmpbamflag