diff options
author | Matthew Stewart | 2018-05-19 14:58:16 -0400 |
---|---|---|
committer | Eugene Sandulenko | 2018-08-09 08:37:30 +0200 |
commit | f66b77d9fd34e4845a214e1c1ff42e5e2211c991 (patch) | |
tree | 83cacbc8a008bf0bc98f47c569280df3e8b0b11d | |
parent | ec2306f8b03f4ebfc0cc65b506ec3c1b9135481f (diff) | |
download | scummvm-rg350-f66b77d9fd34e4845a214e1c1ff42e5e2211c991.tar.gz scummvm-rg350-f66b77d9fd34e4845a214e1c1ff42e5e2211c991.tar.bz2 scummvm-rg350-f66b77d9fd34e4845a214e1c1ff42e5e2211c991.zip |
STARTREK: Rename objects to actors
-rw-r--r-- | engines/startrek/awaymission.cpp | 58 | ||||
-rw-r--r-- | engines/startrek/items.h | 2 | ||||
-rw-r--r-- | engines/startrek/object.h | 33 | ||||
-rw-r--r-- | engines/startrek/startrek.cpp | 478 | ||||
-rw-r--r-- | engines/startrek/startrek.h | 61 |
5 files changed, 327 insertions, 305 deletions
diff --git a/engines/startrek/awaymission.cpp b/engines/startrek/awaymission.cpp index ae05485dcd..e0499240be 100644 --- a/engines/startrek/awaymission.cpp +++ b/engines/startrek/awaymission.cpp @@ -89,12 +89,12 @@ void StarTrekEngine::loadRoom(const Common::String &missionName, int roomIndex) _mapFile = loadFile(_mapFilename + ".map"); _iwFile = SharedPtr<IWFile>(new IWFile(this, _mapFilename + ".iw")); - objectFunc1(); - initObjects(); + actorFunc1(); + initActors(); double num = _room->getVar0c() - _room->getVar0a(); double den = _room->getVar06() - _room->getVar08() + 1; - _playerObjectScale = (int32)(num * 256 / den); + _playerActorScale = (int32)(num * 256 / den); // TODO: RDF vars 1e/1f and 20/21; relates to BAN files? @@ -121,11 +121,11 @@ void StarTrekEngine::initAwayCrewPositions(int warpEntryIndex) { int16 destX = _room->readRdfWord(rdfOffset + 4); // Position to walk to int16 destY = _room->readRdfWord(rdfOffset + 6); - objectWalkToPosition(i, anim, srcX, srcY, destX, destY); + actorWalkToPosition(i, anim, srcX, srcY, destX, destY); } - _kirkObject->walkingIntoRoom = 1; - _kirkObject->field66 = 0xff; + _kirkActor->walkingIntoRoom = 1; + _kirkActor->field66 = 0xff; _awayMission.transitioningIntoRoom = 1; _warpHotspotsActive = false; break; @@ -134,10 +134,10 @@ void StarTrekEngine::initAwayCrewPositions(int warpEntryIndex) { for (int i = 0; i < (_awayMission.redshirtDead ? 3 : 4); i++) { Common::String animFilename = getCrewmanAnimFilename(i, "tele"); Common::Point warpPos = _room->getBeamInPosition(i); - loadObjectAnimWithRoomScaling(i, animFilename, warpPos.x, warpPos.y); + loadActorAnimWithRoomScaling(i, animFilename, warpPos.x, warpPos.y); } - _kirkObject->walkingIntoRoom = 1; - _kirkObject->field66 = 0xff; + _kirkActor->walkingIntoRoom = 1; + _kirkActor->field66 = 0xff; _awayMission.transitioningIntoRoom = 1; playSoundEffectIndex(0x09); _warpHotspotsActive = false; @@ -155,7 +155,7 @@ void StarTrekEngine::handleAwayMissionEvents() { if (popNextEvent(&event)) { switch (event.type) { case TREKEVENT_TICK: - updateObjectAnimations(); + updateActorAnimations(); // sub_236bb(); updateMouseBitmap(); // doSomethingWithBanData1(); @@ -177,22 +177,22 @@ void StarTrekEngine::handleAwayMissionEvents() { switch (_awayMission.activeAction) { case ACTION_WALK: if (_awayMission.field1c == 0) { - _kirkObject->sprite.drawMode = 1; // Hide these objects for function call below? - _spockObject->sprite.drawMode = 1; - _mccoyObject->sprite.drawMode = 1; - _redshirtObject->sprite.drawMode = 1; + _kirkActor->sprite.drawMode = 1; // Hide these objects for function call below? + _spockActor->sprite.drawMode = 1; + _mccoyActor->sprite.drawMode = 1; + _redshirtActor->sprite.drawMode = 1; - // findObjectClickedOn(); + // findActorClickedOn(); // ... - _kirkObject->sprite.drawMode = 0; - _spockObject->sprite.drawMode = 0; - _mccoyObject->sprite.drawMode = 0; - _redshirtObject->sprite.drawMode = 0; + _kirkActor->sprite.drawMode = 0; + _spockActor->sprite.drawMode = 0; + _mccoyActor->sprite.drawMode = 0; + _redshirtActor->sprite.drawMode = 0; Common::String animFilename = getCrewmanAnimFilename(0, "walk"); Common::Point mousePos = _gfx->getMousePos(); - objectWalkToPosition(0, animFilename, _kirkObject->pos.x, _kirkObject->pos.y, mousePos.x, mousePos.y); + actorWalkToPosition(0, animFilename, _kirkActor->pos.x, _kirkActor->pos.y, mousePos.x, mousePos.y); } break; @@ -276,21 +276,21 @@ void StarTrekEngine::handleAwayMissionEvents() { void StarTrekEngine::unloadRoom() { _gfx->fadeoutScreen(); // sub_2394b(); // TODO - objectFunc1(); + actorFunc1(); _room.reset(); _mapFile.reset(); } /** - * Similar to loadObjectAnim, but scale is determined by the y-position in the room. The + * Similar to loadActorAnim, but scale is determined by the y-position in the room. The * further up (away) the object is, the smaller it is. */ -int StarTrekEngine::loadObjectAnimWithRoomScaling(int objectIndex, const Common::String &animName, int16 x, int16 y) { - uint16 scale = getObjectScaleAtPosition(y); - return loadObjectAnim(objectIndex, animName, x, y, scale); +int StarTrekEngine::loadActorAnimWithRoomScaling(int actorIndex, const Common::String &animName, int16 x, int16 y) { + uint16 scale = getActorScaleAtPosition(y); + return loadActorAnim(actorIndex, animName, x, y, scale); } -uint16 StarTrekEngine::getObjectScaleAtPosition(int16 y) { +uint16 StarTrekEngine::getActorScaleAtPosition(int16 y) { int16 var06 = _room->getVar06(); int16 var08 = _room->getVar08(); int16 var0a = _room->getVar0a(); @@ -300,7 +300,7 @@ uint16 StarTrekEngine::getObjectScaleAtPosition(int16 y) { if (var08 > y) y = var08; - return ((_playerObjectScale * (y - var08)) >> 8) + var0a; + return ((_playerActorScale * (y - var08)) >> 8) + var0a; } SharedPtr<Room> StarTrekEngine::getRoom() { @@ -316,12 +316,12 @@ void StarTrekEngine::addCommand(const Command &command) { void StarTrekEngine::handleAwayMissionCommand() { Command command = _commandQueue.pop(); - if ((command.type == COMMAND_FINISHED_BEAMING_IN || command.type == FINISHED_ENTERING_ROOM) && command.b1 == 0xff) { + if ((command.type == COMMAND_FINISHED_BEAMING_IN || command.type == COMMAND_FINISHED_ENTERING_ROOM) && command.b1 == 0xff) { _awayMission.transitioningIntoRoom = 0; _warpHotspotsActive = true; return; } - else if (command.type == FINISHED_ENTERING_ROOM && command.b1 >= 0xe0) { // TODO + else if (command.type == COMMAND_FINISHED_ENTERING_ROOM && command.b1 >= 0xe0) { // TODO return; } diff --git a/engines/startrek/items.h b/engines/startrek/items.h index 6ef69cf8ab..913ec7dfc6 100644 --- a/engines/startrek/items.h +++ b/engines/startrek/items.h @@ -177,7 +177,7 @@ const Item g_itemList[] = { { false, 0x00, "", 0x00 }, }; -const int NUM_ITEMS = sizeof(g_itemList) / sizeof(struct Item); +const int NUM_ITEMS = sizeof(g_itemList) / sizeof(struct Item) - 0x40; // 0x49 } diff --git a/engines/startrek/object.h b/engines/startrek/object.h index 8885390f60..71c9f8448c 100644 --- a/engines/startrek/object.h +++ b/engines/startrek/object.h @@ -24,6 +24,7 @@ #define STARTREK_OBJECT_H #include "startrek/common.h" +#include "startrek/items.h" #include "startrek/sprite.h" #include "common/scummsys.h" @@ -34,7 +35,37 @@ class StarTrekEngine; class FileStream; -struct Object { +// Objects 0-31 are "actors" that are drawn to the screen, are animated, etc. +// Objects 32-63 are "hotspots" corresponding to specific regions in the screen. +// Objects 64+ are "items". +// All interactions in the game consist of specific object indices interacting with each +// other, ie. object 0 (kirk) interacts with object 32 (a hotspot) via ACTION_LOOK. + +const int ACTORS_START = 0; +const int ACTORS_END = 32; +const int NUM_ACTORS = ACTORS_END - ACTORS_START; + +const int HOTSPOTS_START = 32; +const int HOTSPOTS_END = 64; +const int NUM_HOTSPOTS = HOTSPOTS_END - HOTSPOTS_START; + +const int ITEMS_START = 64; +const int ITEMS_END = ITEMS_START + NUM_ITEMS; // See items.h + +const int NUM_OBJECTS = ITEMS_END; + + +// Some object indices are reserved (see items.h for item objects) +enum Objects { + OBJECT_KIRK = 0, + OBJECT_SPOCK = 1, + OBJECT_MCCOY = 2, + OBJECT_REDSHIRT = 3, + OBJECT_INVENTORY_ICON = 31 +}; + + +struct Actor { uint16 spriteDrawn; char animationString3[16]; uint16 animType; diff --git a/engines/startrek/startrek.cpp b/engines/startrek/startrek.cpp index efde236580..8df22ead12 100644 --- a/engines/startrek/startrek.cpp +++ b/engines/startrek/startrek.cpp @@ -44,10 +44,10 @@ StarTrekEngine::StarTrekEngine(OSystem *syst, const StarTrekGameDescription *gam Engine(syst), _gameDescription(gamedesc), _randomSource("Star Trek"), - _kirkObject(&_objectList[0]), - _spockObject(&_objectList[1]), - _mccoyObject(&_objectList[2]), - _redshirtObject(&_objectList[3]) { + _kirkActor(&_actorList[0]), + _spockActor(&_actorList[1]), + _mccoyActor(&_actorList[2]), + _redshirtActor(&_actorList[3]) { DebugMan.addDebugChannel(kDebugSound, "sound", "Sound"); DebugMan.addDebugChannel(kDebugGraphics, "graphics", "Graphics"); @@ -79,7 +79,7 @@ StarTrekEngine::StarTrekEngine(OSystem *syst, const StarTrekGameDescription *gam _missionToLoad = "DEMON"; _roomIndexToLoad = 0; - for (int i = 0; i < NUM_ITEMS; i++) + for (int i = 0; i < NUM_OBJECTS; i++) _itemList[i] = g_itemList[i]; } @@ -202,8 +202,8 @@ void StarTrekEngine::runTransportSequence(const Common::String &name) { _sound->stopAllVocSounds(); _gfx->fadeoutScreen(); - objectFunc1(); - initObjects(); + actorFunc1(); + initActors(); SharedPtr<Bitmap> bgImage = _gfx->loadBitmap("transprt"); _gfx->setBackgroundImage(bgImage); @@ -216,25 +216,25 @@ void StarTrekEngine::runTransportSequence(const Common::String &name) { Common::String filename = getCrewmanAnimFilename(i, name); int x = crewmanTransportPositions[i][0]; int y = crewmanTransportPositions[i][1]; - loadObjectAnim(i, filename, x, y, 256); - _objectList[i].animationString[0] = '\0'; + loadActorAnim(i, filename, x, y, 256); + _actorList[i].animationString[0] = '\0'; } if (_missionToLoad.equalsIgnoreCase("feather") && name[4] == 'b') { - loadObjectAnim(9, "qteleb", 0x61, 0x79, 0x100); + loadActorAnim(9, "qteleb", 0x61, 0x79, 0x100); } else if (_missionToLoad.equalsIgnoreCase("trial")) { if (name[4] == 'd') { - loadObjectAnim(9, "qteled", 0x61, 0x79, 0x100); + loadActorAnim(9, "qteled", 0x61, 0x79, 0x100); } /* TODO else if (word_51156 >= 3) { - loadObjectAnim(9, "qteleb", 0x61, 0x79, 0x100); + loadActorAnim(9, "qteleb", 0x61, 0x79, 0x100); } */ } - loadObjectAnim(8, "transc", 0, 0, 0x100); + loadActorAnim(8, "transc", 0, 0, 0x100); // TODO: redraw mouse and sprite_52c4e? @@ -248,13 +248,13 @@ void StarTrekEngine::runTransportSequence(const Common::String &name) { else playSoundEffectIndex(0x09); - while (_objectList[0].field62 == 0) { + while (_actorList[0].field62 == 0) { TrekEvent event; if (popNextEvent(&event)) { if (event.type == TREKEVENT_TICK) { // TODO: redraw sprite_52c4e? _frameIndex++; - updateObjectAnimations(); + updateActorAnimations(); _gfx->drawAllSprites(); } } @@ -264,8 +264,8 @@ void StarTrekEngine::runTransportSequence(const Common::String &name) { _gfx->drawAllSprites(); _gfx->fadeoutScreen(); - objectFunc1(); - initObjects(); + actorFunc1(); + initActors(); } void StarTrekEngine::playSoundEffectIndex(int index) { @@ -328,215 +328,215 @@ void StarTrekEngine::stopPlayingSpeech() { _sound->stopPlayingSpeech(); } -void StarTrekEngine::initObjects() { - for (int i = 0; i < MAX_OBJECTS; i++) { - _objectList[i] = Object(); +void StarTrekEngine::initActors() { + for (int i = 0; i < NUM_ACTORS; i++) { + _actorList[i] = Actor(); } - for (int i = 0; i < MAX_OBJECTS / 2; i++) - _objectBanFiles[i].reset(); + for (int i = 0; i < NUM_ACTORS / 2; i++) + _actorBanFiles[i].reset(); - strcpy(_kirkObject->animationString, "kstnd"); - strcpy(_spockObject->animationString, "sstnd"); - strcpy(_mccoyObject->animationString, "mstnd"); - strcpy(_redshirtObject->animationString, "rstnd"); + strcpy(_kirkActor->animationString, "kstnd"); + strcpy(_spockActor->animationString, "sstnd"); + strcpy(_mccoyActor->animationString, "mstnd"); + strcpy(_redshirtActor->animationString, "rstnd"); } /** - * Set an object's animation, position, and scale. + * Set an actor's animation, position, and scale. */ -int StarTrekEngine::loadObjectAnim(int objectIndex, const Common::String &animName, int16 x, int16 y, Fixed16 scale) { - debugC(6, kDebugGraphics, "Load animation '%s' on object %d", animName.c_str(), objectIndex); +int StarTrekEngine::loadActorAnim(int actorIndex, const Common::String &animName, int16 x, int16 y, Fixed16 scale) { + debugC(6, kDebugGraphics, "Load animation '%s' on actor %d", animName.c_str(), actorIndex); - Object *object; + Actor *actor; - if (objectIndex == -1) { + if (actorIndex == -1) { // TODO } else - object = &_objectList[objectIndex]; + actor = &_actorList[actorIndex]; - if (object->spriteDrawn) { - releaseAnim(object); - drawObjectToScreen(object, animName, x, y, scale, false); + if (actor->spriteDrawn) { + releaseAnim(actor); + drawActorToScreen(actor, animName, x, y, scale, false); } else { - drawObjectToScreen(object, animName, x, y, scale, true); + drawActorToScreen(actor, animName, x, y, scale, true); } - object->walkingIntoRoom = 0; - object->field66 = 0; + actor->walkingIntoRoom = 0; + actor->field66 = 0; - return objectIndex; + return actorIndex; } /** - * Tries to make an object walk to a position. + * Tries to make an actor walk to a position. * Returns true if successful in initiating the walk. */ -bool StarTrekEngine::objectWalkToPosition(int objectIndex, const Common::String &animFile, int16 srcX, int16 srcY, int16 destX, int16 destY) { - debugC(6, "Obj %d: walk from (%d,%d) to (%d,%d)", objectIndex, srcX, srcY, destX, destY); +bool StarTrekEngine::actorWalkToPosition(int actorIndex, const Common::String &animFile, int16 srcX, int16 srcY, int16 destX, int16 destY) { + debugC(6, "Obj %d: walk from (%d,%d) to (%d,%d)", actorIndex, srcX, srcY, destX, destY); - Object *object = &_objectList[objectIndex]; + Actor *actor = &_actorList[actorIndex]; - object->walkingIntoRoom = 0; + actor->walkingIntoRoom = 0; if (isPositionSolid(destX, destY)) return false; - if (object->spriteDrawn) - releaseAnim(object); + if (actor->spriteDrawn) + releaseAnim(actor); else - _gfx->addSprite(&object->sprite); + _gfx->addSprite(&actor->sprite); - object->spriteDrawn = true; - object->animType = 1; - object->frameToStartNextAnim = _frameIndex + 1; - strcpy(object->animationString2, animFile.c_str()); + actor->spriteDrawn = true; + actor->animType = 1; + actor->frameToStartNextAnim = _frameIndex + 1; + strcpy(actor->animationString2, animFile.c_str()); - object->dest.x = destX; - object->dest.y = destY; - object->field92 = 0; - object->walkingIntoRoom = 0; + actor->dest.x = destX; + actor->dest.y = destY; + actor->field92 = 0; + actor->walkingIntoRoom = 0; - object->iwDestPosition = -1; - object->iwSrcPosition = -1; + actor->iwDestPosition = -1; + actor->iwSrcPosition = -1; if (directPathExists(srcX, srcY, destX, destY)) { - chooseObjectDirectionForWalking(object, srcX, srcY, destX, destY); - updateObjectPositionWhileWalking(object, (object->granularPosX + 0x8000) >> 16, (object->granularPosY + 0x8000) >> 16); + chooseActorDirectionForWalking(actor, srcX, srcY, destX, destY); + updateActorPositionWhileWalking(actor, (actor->granularPosX + 0x8000) >> 16, (actor->granularPosY + 0x8000) >> 16); return true; } else { - object->iwSrcPosition = _iwFile->getClosestKeyPosition(srcX, srcY); - object->iwDestPosition = _iwFile->getClosestKeyPosition(destX, destY); + actor->iwSrcPosition = _iwFile->getClosestKeyPosition(srcX, srcY); + actor->iwDestPosition = _iwFile->getClosestKeyPosition(destX, destY); - if (object->iwSrcPosition == -1 || object->iwDestPosition == -1) { + if (actor->iwSrcPosition == -1 || actor->iwDestPosition == -1) { // No path exists; face south by default. - strcat(object->animationString2, "S"); - object->direction = 'S'; + strcat(actor->animationString2, "S"); + actor->direction = 'S'; - updateObjectPositionWhileWalking(object, srcX, srcY); - initStandAnim(objectIndex); + updateActorPositionWhileWalking(actor, srcX, srcY); + initStandAnim(actorIndex); return false; } else { - Common::Point iwSrc = _iwFile->_keyPositions[object->iwSrcPosition]; - chooseObjectDirectionForWalking(object, srcX, srcY, iwSrc.x, iwSrc.y); - updateObjectPositionWhileWalking(object, (object->granularPosX + 0x8000) >> 16, (object->granularPosY + 0x8000) >> 16); + Common::Point iwSrc = _iwFile->_keyPositions[actor->iwSrcPosition]; + chooseActorDirectionForWalking(actor, srcX, srcY, iwSrc.x, iwSrc.y); + updateActorPositionWhileWalking(actor, (actor->granularPosX + 0x8000) >> 16, (actor->granularPosY + 0x8000) >> 16); return true; } } } -void StarTrekEngine::updateObjectAnimations() { - for (int i = 0; i < MAX_OBJECTS; i++) { - Object *object = &_objectList[i]; - if (!object->spriteDrawn) +void StarTrekEngine::updateActorAnimations() { + for (int i = 0; i < NUM_ACTORS; i++) { + Actor *actor = &_actorList[i]; + if (!actor->spriteDrawn) continue; - switch (object->animType) { + switch (actor->animType) { case 0: // Not walking? case 2: - if (_frameIndex >= object->frameToStartNextAnim) { + if (_frameIndex >= actor->frameToStartNextAnim) { int nextAnimIndex = getRandomWord() & 3; - object->animFile->seek(18 + nextAnimIndex + object->animFrame * 22, SEEK_SET); - byte nextAnimFrame = object->animFile->readByte(); - - if (object->animFrame != nextAnimFrame) { - if (nextAnimFrame == object->numAnimFrames - 1) { - object->field62++; - if (object->walkingIntoRoom != 0) { - addCommand(Command(COMMAND_FINISHED_BEAMING_IN, object->field66, 0, 0)); + actor->animFile->seek(18 + nextAnimIndex + actor->animFrame * 22, SEEK_SET); + byte nextAnimFrame = actor->animFile->readByte(); + + if (actor->animFrame != nextAnimFrame) { + if (nextAnimFrame == actor->numAnimFrames - 1) { + actor->field62++; + if (actor->walkingIntoRoom != 0) { + addCommand(Command(COMMAND_FINISHED_BEAMING_IN, actor->field66, 0, 0)); } } } - object->animFrame = nextAnimFrame; - if (object->animFrame >= object->numAnimFrames) { - if (object->animationString[0] == '\0') - removeObjectFromScreen(i); + actor->animFrame = nextAnimFrame; + if (actor->animFrame >= actor->numAnimFrames) { + if (actor->animationString[0] == '\0') + removeActorFromScreen(i); else initStandAnim(i); } else { - Sprite *sprite = &object->sprite; + Sprite *sprite = &actor->sprite; - object->animFile->seek(object->animFrame * 22, SEEK_SET); + actor->animFile->seek(actor->animFrame * 22, SEEK_SET); char animFrameFilename[16]; - object->animFile->read(animFrameFilename, 16); - sprite->setBitmap(loadAnimationFrame(animFrameFilename, object->scale)); + actor->animFile->read(animFrameFilename, 16); + sprite->setBitmap(loadAnimationFrame(animFrameFilename, actor->scale)); - memset(object->animationString4, 0, 10); - strncpy(object->animationString4, animFrameFilename, 9); + memset(actor->animationString4, 0, 10); + strncpy(actor->animationString4, animFrameFilename, 9); - object->animFile->seek(10 + object->animFrame * 22, SEEK_SET); - uint16 xOffset = object->animFile->readUint16(); - uint16 yOffset = object->animFile->readUint16(); - uint16 basePriority = object->animFile->readUint16(); - uint16 frames = object->animFile->readUint16(); + actor->animFile->seek(10 + actor->animFrame * 22, SEEK_SET); + uint16 xOffset = actor->animFile->readUint16(); + uint16 yOffset = actor->animFile->readUint16(); + uint16 basePriority = actor->animFile->readUint16(); + uint16 frames = actor->animFile->readUint16(); - sprite->pos.x = xOffset + object->pos.x; - sprite->pos.y = yOffset + object->pos.y; - sprite->drawPriority = _gfx->getPriValue(0, yOffset + object->pos.y) + basePriority; + sprite->pos.x = xOffset + actor->pos.x; + sprite->pos.y = yOffset + actor->pos.y; + sprite->drawPriority = _gfx->getPriValue(0, yOffset + actor->pos.y) + basePriority; sprite->bitmapChanged = true; - object->frameToStartNextAnim = frames + _frameIndex; + actor->frameToStartNextAnim = frames + _frameIndex; } } break; case 1: // Walking - if (_frameIndex < object->frameToStartNextAnim) + if (_frameIndex < actor->frameToStartNextAnim) break; if (i == 0) // Kirk only - checkTouchedLoadingZone(object->pos.x, object->pos.y); - if (object->field90 != 0) { - Sprite *sprite = &object->sprite; + checkTouchedLoadingZone(actor->pos.x, actor->pos.y); + if (actor->field90 != 0) { + Sprite *sprite = &actor->sprite; int loops; - if (getObjectScaleAtPosition((object->granularPosY + 0x8000) >> 16) < 0xa0) + if (getActorScaleAtPosition((actor->granularPosY + 0x8000) >> 16) < 0xa0) loops = 1; else loops = 2; for (int k = 0; k < loops; k++) { - if (object->field90 == 0) + if (actor->field90 == 0) break; - object->field90--; - uint32 newX = object->granularPosX + object->speedX; - uint32 newY = object->granularPosY + object->speedY; - if ((object->field90 & 3) == 0) { + actor->field90--; + uint32 newX = actor->granularPosX + actor->speedX; + uint32 newY = actor->granularPosY + actor->speedY; + if ((actor->field90 & 3) == 0) { sprite->bitmap.reset(); - updateObjectPositionWhileWalking(object, (newX + 0x8000) >> 16, (newY + 0x8000) >> 16); - object->field92++; + updateActorPositionWhileWalking(actor, (newX + 0x8000) >> 16, (newY + 0x8000) >> 16); + actor->field92++; } - object->granularPosX = newX; - object->granularPosY = newY; - object->frameToStartNextAnim = _frameIndex; + actor->granularPosX = newX; + actor->granularPosY = newY; + actor->frameToStartNextAnim = _frameIndex; } } - else { // object->field90 == 0 - if (object->iwSrcPosition == -1) { - if (object->walkingIntoRoom != 0) { - object->walkingIntoRoom = 0; - addCommand(Command(FINISHED_ENTERING_ROOM, object->field66 & 0xff, 0, 0)); + else { // actor->field90 == 0 + if (actor->iwSrcPosition == -1) { + if (actor->walkingIntoRoom != 0) { + actor->walkingIntoRoom = 0; + addCommand(Command(COMMAND_FINISHED_ENTERING_ROOM, actor->field66 & 0xff, 0, 0)); } - object->sprite.bitmap.reset(); - updateObjectPositionWhileWalking(object, (object->granularPosX + 0x8000) >> 16, (object->granularPosY + 0x8000) >> 16); + actor->sprite.bitmap.reset(); + updateActorPositionWhileWalking(actor, (actor->granularPosX + 0x8000) >> 16, (actor->granularPosY + 0x8000) >> 16); initStandAnim(i); } - else { // object->iwSrcPosition != -1 - if (object->iwSrcPosition == object->iwDestPosition) { - object->animationString2[strlen(object->animationString2) - 1] = '\0'; - object->iwDestPosition = -1; - object->iwSrcPosition = -1; - chooseObjectDirectionForWalking(object, object->pos.x, object->pos.y, object->dest.x, object->dest.y); + else { // actor->iwSrcPosition != -1 + if (actor->iwSrcPosition == actor->iwDestPosition) { + actor->animationString2[strlen(actor->animationString2) - 1] = '\0'; + actor->iwDestPosition = -1; + actor->iwSrcPosition = -1; + chooseActorDirectionForWalking(actor, actor->pos.x, actor->pos.y, actor->dest.x, actor->dest.y); } else { - int index = _iwFile->_iwEntries[object->iwSrcPosition][object->iwDestPosition]; - object->iwSrcPosition = index; - Common::Point dest = _iwFile->_keyPositions[object->iwSrcPosition]; - object->animationString2[strlen(object->animationString2) - 1] = '\0'; - chooseObjectDirectionForWalking(object, object->pos.x, object->pos.y, dest.x, dest.y); + int index = _iwFile->_iwEntries[actor->iwSrcPosition][actor->iwDestPosition]; + actor->iwSrcPosition = index; + Common::Point dest = _iwFile->_keyPositions[actor->iwSrcPosition]; + actor->animationString2[strlen(actor->animationString2) - 1] = '\0'; + chooseActorDirectionForWalking(actor, actor->pos.x, actor->pos.y, dest.x, dest.y); } } } @@ -548,154 +548,154 @@ void StarTrekEngine::updateObjectAnimations() { } } -void StarTrekEngine::removeObjectFromScreen(int objectIndex) { - Object *object = &_objectList[objectIndex]; +void StarTrekEngine::removeActorFromScreen(int actorIndex) { + Actor *actor = &_actorList[actorIndex]; - if (object->spriteDrawn != 1) + if (actor->spriteDrawn != 1) return; - debugC(6, kDebugGraphics, "Stop drawing object %d", objectIndex); + debugC(6, kDebugGraphics, "Stop drawing actor %d", actorIndex); - Sprite *sprite = &object->sprite; + Sprite *sprite = &actor->sprite; sprite->field16 = true; sprite->bitmapChanged = true; _gfx->drawAllSprites(); _gfx->delSprite(sprite); - releaseAnim(object); + releaseAnim(actor); } -void StarTrekEngine::objectFunc1() { - for (int i = 0; i < MAX_OBJECTS; i++) { - if (_objectList[i].spriteDrawn == 1) { - removeObjectFromScreen(i); +void StarTrekEngine::actorFunc1() { + for (int i = 0; i < NUM_ACTORS; i++) { + if (_actorList[i].spriteDrawn == 1) { + removeActorFromScreen(i); } } - for (int i = 0; i < MAX_OBJECTS / 2; i++) { - _objectBanFiles[i].reset(); + for (int i = 0; i < NUM_ACTORS / 2; i++) { + _actorBanFiles[i].reset(); } } -void StarTrekEngine::drawObjectToScreen(Object *object, const Common::String &_animName, int16 x, int16 y, Fixed16 scale, bool addSprite) { +void StarTrekEngine::drawActorToScreen(Actor *actor, const Common::String &_animName, int16 x, int16 y, Fixed16 scale, bool addSprite) { Common::String animFilename = _animName; if (_animName.hasPrefixIgnoreCase("stnd") /* && word_45d20 == -1 */) // TODO animFilename += 'j'; - memcpy(object->animationString3, _animName.c_str(), sizeof(object->animationString3)); + memcpy(actor->animationString3, _animName.c_str(), sizeof(actor->animationString3)); - object->animType = 2; - object->animFile = loadFile(animFilename + ".anm"); - object->numAnimFrames = object->animFile->size() / 22; - object->animFrame = 0; - object->pos.x = x; - object->pos.y = y; - object->field62 = 0; - object->scale = scale; + actor->animType = 2; + actor->animFile = loadFile(animFilename + ".anm"); + actor->numAnimFrames = actor->animFile->size() / 22; + actor->animFrame = 0; + actor->pos.x = x; + actor->pos.y = y; + actor->field62 = 0; + actor->scale = scale; - object->animFile->seek(16, SEEK_SET); - object->frameToStartNextAnim = object->animFile->readUint16() + _frameIndex; + actor->animFile->seek(16, SEEK_SET); + actor->frameToStartNextAnim = actor->animFile->readUint16() + _frameIndex; char firstFrameFilename[10]; - object->animFile->seek(0, SEEK_SET); - object->animFile->read(firstFrameFilename, 10); + actor->animFile->seek(0, SEEK_SET); + actor->animFile->read(firstFrameFilename, 10); - Sprite *sprite = &object->sprite; + Sprite *sprite = &actor->sprite; if (addSprite) _gfx->addSprite(sprite); sprite->setBitmap(loadAnimationFrame(firstFrameFilename, scale)); - memset(object->animationString4, 0, sizeof(char) * 10); - strncpy(object->animationString4, firstFrameFilename, sizeof(char) * 9); + memset(actor->animationString4, 0, sizeof(char) * 10); + strncpy(actor->animationString4, firstFrameFilename, sizeof(char) * 9); - object->scale = scale; + actor->scale = scale; - object->animFile->seek(10, SEEK_SET); - uint16 xOffset = object->animFile->readUint16(); - uint16 yOffset = object->animFile->readUint16(); - uint16 basePriority = object->animFile->readUint16(); + actor->animFile->seek(10, SEEK_SET); + uint16 xOffset = actor->animFile->readUint16(); + uint16 yOffset = actor->animFile->readUint16(); + uint16 basePriority = actor->animFile->readUint16(); - sprite->pos.x = xOffset + object->pos.x; - sprite->pos.y = yOffset + object->pos.y; - sprite->drawPriority = _gfx->getPriValue(0, yOffset + object->pos.y) + basePriority; + sprite->pos.x = xOffset + actor->pos.x; + sprite->pos.y = yOffset + actor->pos.y; + sprite->drawPriority = _gfx->getPriValue(0, yOffset + actor->pos.y) + basePriority; sprite->bitmapChanged = true; - object->spriteDrawn = 1; + actor->spriteDrawn = 1; } -void StarTrekEngine::releaseAnim(Object *object) { - switch (object->animType) { +void StarTrekEngine::releaseAnim(Actor *actor) { + switch (actor->animType) { case 0: case 2: - object->sprite.bitmap.reset(); - object->animFile.reset(); + actor->sprite.bitmap.reset(); + actor->animFile.reset(); break; case 1: - object->sprite.bitmap.reset(); + actor->sprite.bitmap.reset(); break; default: error("Invalid anim type"); break; } - object->spriteDrawn = 0; + actor->spriteDrawn = 0; } -void StarTrekEngine::initStandAnim(int objectIndex) { - Object *object = &_objectList[objectIndex]; +void StarTrekEngine::initStandAnim(int actorIndex) { + Actor *actor = &_actorList[actorIndex]; - if (!object->spriteDrawn) + if (!actor->spriteDrawn) error("initStandAnim: dead anim"); //////////////////// // sub_239d2 const char *directions = "nsew"; - if (objectIndex >= 0 && objectIndex <= 3) { - int8 dir = _awayMission.field25[objectIndex]; + if (actorIndex >= 0 && actorIndex <= 3) { + int8 dir = _awayMission.field25[actorIndex]; if (dir != -1) { - object->direction = directions[dir]; - _awayMission.field25[objectIndex] = -1; + actor->direction = directions[dir]; + _awayMission.field25[actorIndex] = -1; } } // end of sub_239d2 //////////////////// Common::String animName; - if (object->direction != 0) - animName = Common::String(object->animationString) + (char)object->direction; + if (actor->direction != 0) + animName = Common::String(actor->animationString) + (char)actor->direction; else // Default to facing south - animName = Common::String(object->animationString) + 's'; + animName = Common::String(actor->animationString) + 's'; - uint16 scale = getObjectScaleAtPosition(object->pos.y); - loadObjectAnim(objectIndex, animName, object->pos.x, object->pos.y, scale); - object->animType = 0; + uint16 scale = getActorScaleAtPosition(actor->pos.y); + loadActorAnim(actorIndex, animName, actor->pos.x, actor->pos.y, scale); + actor->animType = 0; } -void StarTrekEngine::updateObjectPositionWhileWalking(Object *object, int16 x, int16 y) { - object->scale = getObjectScaleAtPosition(y); - Common::String animName = Common::String::format("%s%02d", object->animationString2, object->field92 & 7); - object->sprite.setBitmap(loadAnimationFrame(animName, object->scale)); +void StarTrekEngine::updateActorPositionWhileWalking(Actor *actor, int16 x, int16 y) { + actor->scale = getActorScaleAtPosition(y); + Common::String animName = Common::String::format("%s%02d", actor->animationString2, actor->field92 & 7); + actor->sprite.setBitmap(loadAnimationFrame(animName, actor->scale)); - memset(object->animationString4, 0, 10); - strncpy(object->animationString4, animName.c_str(), 9); + memset(actor->animationString4, 0, 10); + strncpy(actor->animationString4, animName.c_str(), 9); - Sprite *sprite = &object->sprite; + Sprite *sprite = &actor->sprite; sprite->drawPriority = _gfx->getPriValue(0, y); sprite->pos.x = x; sprite->pos.y = y; sprite->bitmapChanged = true; - object->frameToStartNextAnim = _frameIndex; - object->pos.x = x; - object->pos.y = y; + actor->frameToStartNextAnim = _frameIndex; + actor->pos.x = x; + actor->pos.y = y; } /** - * Chooses a value for the object's speed and direction, based on a source position and + * Chooses a value for the actor's speed and direction, based on a source position and * a destination position it's walking to. */ -void StarTrekEngine::chooseObjectDirectionForWalking(Object *object, int16 srcX, int16 srcY, int16 destX, int16 destY) { - object->granularPosX = srcX << 16; - object->granularPosY = srcY << 16; +void StarTrekEngine::chooseActorDirectionForWalking(Actor *actor, int16 srcX, int16 srcY, int16 destX, int16 destY) { + actor->granularPosX = srcX << 16; + actor->granularPosY = srcY << 16; int16 distX = destX - srcX; int16 distY = destY - srcY; @@ -710,19 +710,19 @@ void StarTrekEngine::chooseObjectDirectionForWalking(Object *object, int16 srcX, d = 'W'; // Append direction to animation string - object->animationString2[strlen(object->animationString2) + 1] = '\0'; - object->animationString2[strlen(object->animationString2)] = d; + actor->animationString2[strlen(actor->animationString2) + 1] = '\0'; + actor->animationString2[strlen(actor->animationString2)] = d; - object->direction = d; - object->field90 = absDistX; + actor->direction = d; + actor->field90 = absDistX; if (distX != 0) { if (distX > 0) - object->speedX = 1 << 16; + actor->speedX = 1 << 16; else - object->speedX = -1 << 16; // 0xffff0000 + actor->speedX = -1 << 16; // 0xffff0000 - object->speedY = (distY << 16) / absDistX; + actor->speedY = (distY << 16) / absDistX; } } else { @@ -733,25 +733,25 @@ void StarTrekEngine::chooseObjectDirectionForWalking(Object *object, int16 srcX, d = 'N'; // Append direction to animation string - object->animationString2[strlen(object->animationString2) + 1] = '\0'; - object->animationString2[strlen(object->animationString2)] = d; + actor->animationString2[strlen(actor->animationString2) + 1] = '\0'; + actor->animationString2[strlen(actor->animationString2)] = d; - object->direction = d; - object->field90 = absDistY; + actor->direction = d; + actor->field90 = absDistY; if (distY != 0) { if (distY > 0) - object->speedY = 1 << 16; + actor->speedY = 1 << 16; else - object->speedY = -1 << 16; // 0xffff0000 + actor->speedY = -1 << 16; // 0xffff0000 - object->speedX = (distX << 16) / absDistY; + actor->speedX = (distX << 16) / absDistY; } } } /** - * Returns true if an object can walk directly from a source position to a destination + * Returns true if an actor can walk directly from a source position to a destination * position without running into unwalkable terrain. */ bool StarTrekEngine::directPathExists(int16 srcX, int16 srcY, int16 destX, int16 destY) { @@ -817,9 +817,9 @@ int StarTrekEngine::findObjectAt(int x, int y) { else if (sprite == &_itemIconSprite) return _awayMission.activeItem; - for (int i = 0; i < MAX_OBJECTS; i++) { - Object *object = &_objectList[i]; - if (sprite == &object->sprite) + for (int i = 0; i < NUM_ACTORS; i++) { + Actor *actor = &_actorList[i]; + if (sprite == &actor->sprite) return i; } @@ -834,11 +834,11 @@ int StarTrekEngine::findObjectAt(int x, int y) { uint16 word = _room->readRdfWord(offset); if (word & 0x8000) { if ((word & actionBit) && isPointInPolygon((int16 *)(_room->_rdfData + offset + 6), x, y)) { - int objectIndex = _room->readRdfWord(offset + 6); + int actorIndex = _room->readRdfWord(offset + 6); // word_4b418 = 1; // word_4a792 = _room->readRdfWord(offset + 2); // word_4a796 = _room->readRdfWord(offset + 4); // TODO - return objectIndex; + return actorIndex; } int numVertices = _room->readRdfWord(offset + 8); @@ -846,8 +846,8 @@ int StarTrekEngine::findObjectAt(int x, int y) { } else { if (isPointInPolygon((int16 *)(_room->_rdfData + offset), x, y)) { - int objectIndex = _room->readRdfWord(offset); - return objectIndex; + int actorIndex = _room->readRdfWord(offset); + return actorIndex; } int numVertices = _room->readRdfWord(offset + 2); @@ -957,10 +957,10 @@ SharedPtr<Bitmap> StarTrekEngine::loadAnimationFrame(const Common::String &filen return bitmapToReturn; } -Common::String StarTrekEngine::getCrewmanAnimFilename(int objectIndex, const Common::String &basename) { +Common::String StarTrekEngine::getCrewmanAnimFilename(int actorIndex, const Common::String &basename) { const char *crewmanChars = "ksmr"; - assert(objectIndex >= 0 && objectIndex < 4); - return crewmanChars[objectIndex] + basename; + assert(actorIndex >= 0 && actorIndex < 4); + return crewmanChars[actorIndex] + basename; } /** @@ -974,7 +974,7 @@ void StarTrekEngine::updateMouseBitmap() { true, // ACTION_LOOK true // ACTION_TALK }; - const bool worksOnObjects[] = { // True if the action reacts with other objects + const bool worksOnActors[] = { // True if the action reacts with other objects false, // ACTION_WALK true, // ACTION_USE true, // ACTION_GET @@ -998,9 +998,9 @@ void StarTrekEngine::updateMouseBitmap() { if (selected >= 0 && selected <= 3 && worksOnCrewmen[action - 1]) withRedOutline = true; - else if (selected > 3 && selected < MAX_OBJECTS && worksOnObjects[action - 1]) + else if (selected > 3 && selected < NUM_ACTORS && worksOnActors[action - 1]) withRedOutline = true; - else if (selected >= MAX_OBJECTS && selected < MAX_OBJECTS_2 && worksOnHotspots[action - 1]) + else if (selected >= NUM_ACTORS && selected < HOTSPOTS_END && worksOnHotspots[action - 1]) withRedOutline = true; else withRedOutline = false; @@ -1082,11 +1082,11 @@ int StarTrekEngine::showInventoryMenu(int x, int y, bool restoreMouse) { int itemIndex = 0; int numItems = 0; - char itemNames[NUM_ITEMS][10]; - Common::Point itemPositions[NUM_ITEMS]; - int16 itemIndices[NUM_ITEMS]; + char itemNames[NUM_OBJECTS][10]; + Common::Point itemPositions[NUM_OBJECTS]; + int16 itemIndices[NUM_OBJECTS]; - while (itemIndex < NUM_ITEMS) { + while (itemIndex < NUM_OBJECTS) { if (_itemList[itemIndex].have) { strcpy(itemNames[numItems], _itemList[itemIndex].name); @@ -1100,7 +1100,7 @@ int StarTrekEngine::showInventoryMenu(int x, int y, bool restoreMouse) { itemIndex++; } - Sprite itemSprites[NUM_ITEMS]; + Sprite itemSprites[NUM_OBJECTS]; for (int i = 0; i < numItems; i++) { _gfx->addSprite(&itemSprites[i]); diff --git a/engines/startrek/startrek.h b/engines/startrek/startrek.h index f1a5176c94..b853809413 100644 --- a/engines/startrek/startrek.h +++ b/engines/startrek/startrek.h @@ -58,8 +58,7 @@ class StarTrekEngine; typedef String (StarTrekEngine::*TextGetterFunc)(int, uintptr, String *); -const int MAX_OBJECTS = 32; -const int MAX_OBJECTS_2 = 64; // TODO: better name; indices 32 and above used for something + const int MAX_MENUBUTTONS = 32; const int TEXTBOX_WIDTH = 26; @@ -106,6 +105,7 @@ struct Menu { }; // Special events that can be returned by handleMenuEvents. +// (Normally it returns the "retval" of a pressed button, which is positive.) enum MenuEvent { MENUEVENT_RCLICK_OFFBUTTON = -4, MENUEVENT_ENABLEINPUT, // Makes buttons selectable (occurs after a delay) @@ -165,7 +165,7 @@ enum Commands { COMMAND_TOUCHED_WARP = 6, COMMAND_7 = 7, // Doors? (Or just hotspots activated by Kirk moving there?) COMMAND_FINISHED_BEAMING_IN = 10, - FINISHED_ENTERING_ROOM = 12 + COMMAND_FINISHED_ENTERING_ROOM = 12 }; struct Command { @@ -188,15 +188,6 @@ enum Acton { ACTION_OPTIONS = 13 // Not really an action, but selectable from action menu }; -// First 4 objects are reserved for crewmen -enum Objects { - OBJECT_KIRK = 0, - OBJECT_SPOCK = 1, - OBJECT_MCCOY = 2, - OBJECT_REDSHIRT = 3, - OBJECT_INVENTORY_ICON = 31 -}; - struct StarTrekGameDescription; class Graphics; @@ -219,8 +210,8 @@ private: void initAwayCrewPositions(int warpEntryIndex); void handleAwayMissionEvents(); void unloadRoom(); - int loadObjectAnimWithRoomScaling(int objectIndex, const Common::String &animName, int16 x, int16 y); - uint16 getObjectScaleAtPosition(int16 y); + int loadActorAnimWithRoomScaling(int actorIndex, const Common::String &animName, int16 x, int16 y); + uint16 getActorScaleAtPosition(int16 y); void addCommand(const Command &command); void handleAwayMissionCommand(); @@ -244,24 +235,24 @@ public: void playSpeech(const Common::String &filename); void stopPlayingSpeech(); - // Objects - void initObjects(); - int loadObjectAnim(int objectIndex, const Common::String &animName, int16 x, int16 y, Fixed16 scale); - bool objectWalkToPosition(int objectIndex, const Common::String &animFile, int16 srcX, int16 srcY, int16 destX, int16 destY); - void updateObjectAnimations(); - void removeObjectFromScreen(int objectIndex); - void objectFunc1(); - void drawObjectToScreen(Object *object, const Common::String &animName, int16 x, int16 y, Fixed16 scale, bool addSprite); - void releaseAnim(Object *object); - void initStandAnim(int objectIndex); - void updateObjectPositionWhileWalking(Object *object, int16 x, int16 y); - void chooseObjectDirectionForWalking(Object *object, int16 srcX, int16 srcY, int16 destX, int16 destY); + // Actors + void initActors(); + int loadActorAnim(int actorIndex, const Common::String &animName, int16 x, int16 y, Fixed16 scale); + bool actorWalkToPosition(int actorIndex, const Common::String &animFile, int16 srcX, int16 srcY, int16 destX, int16 destY); + void updateActorAnimations(); + void removeActorFromScreen(int actorIndex); + void actorFunc1(); + void drawActorToScreen(Actor *actor, const Common::String &animName, int16 x, int16 y, Fixed16 scale, bool addSprite); + void releaseAnim(Actor *actor); + void initStandAnim(int actorIndex); + void updateActorPositionWhileWalking(Actor *actor, int16 x, int16 y); + void chooseActorDirectionForWalking(Actor *actor, int16 srcX, int16 srcY, int16 destX, int16 destY); bool directPathExists(int16 srcX, int16 srcY, int16 destX, int16 destY); int findObjectAt(int x, int y); int findObjectAt(Common::Point p) { return findObjectAt(p.x, p.y); } SharedPtr<Bitmap> loadAnimationFrame(const Common::String &filename, Fixed16 scale); - Common::String getCrewmanAnimFilename(int objectIndex, const Common::String &basename); + Common::String getCrewmanAnimFilename(int actorIndex, const Common::String &basename); void updateMouseBitmap(); void showInventoryIcons(bool showItem); void hideInventoryIcons(); @@ -382,7 +373,7 @@ public: Common::String _screenName; // _screenName = _missionName + _roomIndex Common::String _mapFilename; // Similar to _screenName, but used for .map files? SharedPtr<FileStream> _mapFile; - int32 _playerObjectScale; + int32 _playerActorScale; // Queue of "commands" (ie. next frame, clicked on object) for away mission or bridge Common::Queue<Command> _commandQueue; @@ -395,14 +386,14 @@ public: Item _itemList[NUM_ITEMS]; - Object _objectList[MAX_OBJECTS]; - Object * const _kirkObject; - Object * const _spockObject; - Object * const _mccoyObject; - Object * const _redshirtObject; + Actor _actorList[NUM_ACTORS]; + Actor * const _kirkActor; + Actor * const _spockActor; + Actor * const _mccoyActor; + Actor * const _redshirtActor; - SharedPtr<FileStream> _objectBanFiles[MAX_OBJECTS / 2]; - uint16 _objectBanVar2[MAX_OBJECTS / 2]; // TODO: initialize? + SharedPtr<FileStream> _actorBanFiles[NUM_ACTORS / 2]; + uint16 _actorBanVar2[NUM_ACTORS / 2]; // TODO: initialize? Sprite _inventoryIconSprite; Sprite _itemIconSprite; |