mirror of
https://github.com/libretro/scummvm.git
synced 2025-01-31 07:53:36 +00:00
put all 'bam' related stuff in a class and allow load/save during a 'bam' scene
svn-id: r11759
This commit is contained in:
parent
dae474e86d
commit
b7a5d97207
@ -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 },
|
||||
|
@ -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
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user