aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
Diffstat (limited to 'engines')
-rw-r--r--engines/startrek/awaymission.cpp237
-rw-r--r--engines/startrek/awaymission.h40
-rw-r--r--engines/startrek/graphics.cpp23
-rw-r--r--engines/startrek/graphics.h7
-rw-r--r--engines/startrek/module.mk1
-rw-r--r--engines/startrek/object.h5
-rw-r--r--engines/startrek/room.cpp5
-rw-r--r--engines/startrek/room.h11
-rw-r--r--engines/startrek/startrek.cpp98
-rw-r--r--engines/startrek/startrek.h53
10 files changed, 434 insertions, 46 deletions
diff --git a/engines/startrek/awaymission.cpp b/engines/startrek/awaymission.cpp
new file mode 100644
index 0000000000..73526eeaa2
--- /dev/null
+++ b/engines/startrek/awaymission.cpp
@@ -0,0 +1,237 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "startrek/startrek.h"
+
+namespace StarTrek {
+
+void StarTrekEngine::initAwayMission() {
+ _awayMission = AwayMission(); // Initialize members to 0
+
+ // memset(bitmapBuffer->pixels, 0, 0xfa00);
+ // sub_15ab1("ground");
+ // sub_23a60();
+ _sound->loadMusicFile("ground");
+
+ loadRoom(_missionToLoad, _roomIndexToLoad);
+
+ // Load crew positions for beaming in
+ initAwayCrewPositions(4);
+}
+
+void StarTrekEngine::runAwayMission() {
+ while (true) {
+ handleAwayMissionEvents();
+
+ Common::Point mousePos = _gfx->getMousePos();
+ _awayMission.mouseX = mousePos.x;
+ _awayMission.mouseY = mousePos.y;
+
+ assert(_commandQueue.size() <= 16);
+ if (!_commandQueue.empty()) {
+ // sub_200e7();
+ // sub_20118();
+ runAwayMissionCycle();
+ }
+ }
+}
+
+void StarTrekEngine::cleanupAwayMission() {
+ // TODO
+}
+
+void StarTrekEngine::loadRoom(const Common::String &missionName, int roomIndex) {
+ if (_room != nullptr)
+ delete _room;
+
+ _keyboardControlsMouse = true;
+
+ _missionName = _missionToLoad;
+ _roomIndex = _roomIndexToLoad;
+
+ _roomFrameCounter = 0;
+ _awayMission.field1d = 0;
+
+ _gfx->fadeoutScreen();
+ _sound->stopAllVocSounds();
+
+ _screenName = _missionName + (char)(_roomIndex + '0');
+
+ _gfx->setBackgroundImage(_gfx->loadBitmap(_screenName));
+ _gfx->loadPri(_screenName + ".pri");
+ _gfx->loadPalette("palette");
+ _gfx->copyBackgroundScreen();
+
+ _room = new Room(this, _screenName);
+
+ // Original sets up bytes 0-3 of rdf file as "remote function caller"
+
+ // Load map file
+ _awayMission.mapFileLoaded = 1;
+ _mapFilename = _screenName;
+ _mapFile = loadFile(_mapFilename + ".map");
+ // loadIWFile(_mapFilename);
+
+ objectFunc1();
+ initObjects();
+
+ double num = _room->readRdfWord(0x0c) - _room->readRdfWord(0x0a);
+ double den = _room->readRdfWord(0x06) - _room->readRdfWord(0x08) + 1;
+ _playerObjectScale = (int32)(num * 256 / den);
+
+ // TODO: RDF vars 1e/1f and 20/21; relates to BAN files?
+
+ _commandQueue.clear();
+}
+
+void StarTrekEngine::initAwayCrewPositions(int warpEntryIndex) {
+ _sound->stopAllVocSounds();
+
+ memset(_awayMission.field25, 0xff, 4);
+
+ switch (warpEntryIndex) {
+ case 0:
+ break;
+ case 1:
+ break;
+ case 2:
+ break;
+ case 3:
+ break;
+ case 4: // Crew is beaming in.
+ warpEntryIndex -= 4;
+ 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);
+ }
+ _kirkObject->field64 = 1;
+ _kirkObject->field66 = 0xff;
+ _awayMission.field1d = 1;
+ playSoundEffectIndex(0x09);
+ // word_466f2 = 0;
+ break;
+ case 5:
+ break;
+ case 6:
+ break;
+ }
+}
+
+void StarTrekEngine::handleAwayMissionEvents() {
+ TrekEvent event;
+
+ if (popNextEvent(&event)) {
+ switch (event.type) {
+ case TREKEVENT_TICK:
+ updateObjectAnimations();
+ // sub_236bb();
+ // sub_2325d();
+ // doSomethingWithBanData1();
+ _gfx->drawAllSprites();
+ // doSomethingWithBanData2();
+ // updateMusic(); // Is this needed?
+ // sub_22de0();
+ _frameIndex++;
+ _roomFrameCounter++;
+ // sub_20099(0, _roomFrameCounter & 0xff, (_roomFrameCounter >> 8) & 0xff, 0);
+ if (_roomFrameCounter >= 2)
+ _gfx->incPaletteFadeLevel();
+ break;
+ case TREKEVENT_LBUTTONDOWN:
+ if (_awayMission.field1d != 0)
+ break;
+ switch (_awayMission.mapFileLoaded) {
+ case 0:
+ 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;
+
+ // findObjectClickedOn();
+ // ...
+
+ _kirkObject->sprite.drawMode = 0;
+ _spockObject->sprite.drawMode = 0;
+ _mccoyObject->sprite.drawMode = 0;
+ _redshirtObject->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);
+ }
+ break;
+ case 1:
+ break;
+ case 2:
+ break;
+ case 3:
+ break;
+ case 4:
+ break;
+ case 5:
+ break;
+ }
+ break;
+ case TREKEVENT_MOUSEMOVE:
+ break;
+ case TREKEVENT_RBUTTONDOWN:
+ break;
+ case TREKEVENT_KEYDOWN:
+ break;
+ default:
+ break;
+ }
+ }
+}
+
+/**
+ * Similar to loadObjectAnim, 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);
+}
+
+uint16 StarTrekEngine::getObjectScaleAtPosition(int16 y) {
+ int16 var06 = _room->getVar06();
+ int16 var08 = _room->getVar08();
+ int16 var0a = _room->getVar0a();
+
+ if (var06 < y)
+ y = var06;
+ if (var08 > y)
+ y = var08;
+
+ return ((_playerObjectScale * (y - var08)) >> 8) + var0a;
+}
+
+Room *StarTrekEngine::getRoom() {
+ return _room;
+}
+
+void StarTrekEngine::runAwayMissionCycle() {
+}
+
+}
diff --git a/engines/startrek/awaymission.h b/engines/startrek/awaymission.h
new file mode 100644
index 0000000000..290e5e39f5
--- /dev/null
+++ b/engines/startrek/awaymission.h
@@ -0,0 +1,40 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef STARTREK_AWAYMISSION_H
+#define STARTREK_AWAYMISSION_H
+
+// All variables here get cleared to 0 upon starting an away mission.
+struct AwayMission {
+ int16 mouseX;
+ int16 mouseY;
+ byte field1c;
+ byte field1d;
+ bool redshirtDead;
+ byte mapFileLoaded;
+ int8 field25[4];
+
+ bool rdfRunNextCommand;
+};
+// Size: 0x129 bytes
+
+#endif
diff --git a/engines/startrek/graphics.cpp b/engines/startrek/graphics.cpp
index c94d9f7b1f..2a9902560e 100644
--- a/engines/startrek/graphics.cpp
+++ b/engines/startrek/graphics.cpp
@@ -44,8 +44,6 @@ Graphics::Graphics(StarTrekEngine *vm) : _vm(vm), _egaMode(false) {
if (_vm->getGameType() == GType_ST25 && _vm->getPlatform() == Common::kPlatformDOS)
_font = new Font(_vm);
- _backgroundImage = loadBitmap("DEMON0");
-
_numSprites = 0;
_textDisplayMode = TEXTDISPLAY_WAIT;
_textboxVar2 = 0;
@@ -142,7 +140,22 @@ void Graphics::setPaletteFadeLevel(byte *palData, int fadeLevel) {
_vm->_system->updateScreen();
}
-void Graphics::loadPri(const char *priFile) {
+void Graphics::incPaletteFadeLevel() {
+ if (_paletteFadeLevel < 100) {
+ _paletteFadeLevel += 10;
+ setPaletteFadeLevel(_palData, _paletteFadeLevel);
+ }
+}
+
+void Graphics::decPaletteFadeLevel() {
+ if (_paletteFadeLevel > 0) {
+ _paletteFadeLevel -= 10;
+ setPaletteFadeLevel(_palData, _paletteFadeLevel);
+ }
+}
+
+
+void Graphics::loadPri(const Common::String &priFile) {
SharedPtr<Common::SeekableReadStream> priStream = _vm->loadFile(priFile);
priStream->read(_priData, SCREEN_WIDTH * SCREEN_HEIGHT / 2);
}
@@ -468,6 +481,10 @@ void Graphics::delSprite(Sprite *sprite) {
}
+void Graphics::copyBackgroundScreen() {
+ drawDirectToScreen(_backgroundImage);
+}
+
void Graphics::drawDirectToScreen(SharedPtr<Bitmap> bitmap) {
int xoffset = bitmap->xoffset;
int yoffset = bitmap->yoffset;
diff --git a/engines/startrek/graphics.h b/engines/startrek/graphics.h
index c50a39fdb5..f7d94020d9 100644
--- a/engines/startrek/graphics.h
+++ b/engines/startrek/graphics.h
@@ -76,8 +76,10 @@ public:
void fadeinScreen();
void fadeoutScreen();
void setPaletteFadeLevel(byte *palData, int fadeLevel);
+ void incPaletteFadeLevel();
+ void decPaletteFadeLevel();
- void loadPri(const char *priFile);
+ void loadPri(const Common::String &priFile);
void clearPri();
byte getPriValue(int x, int y);
@@ -94,6 +96,7 @@ public:
void delSprite(Sprite *sprite);
+ void copyBackgroundScreen();
void drawDirectToScreen(SharedPtr<Bitmap> bitmap);
void loadEGAData(const char *egaFile);
void drawBackgroundImage(const char *filename);
@@ -106,7 +109,7 @@ private:
byte *_egaData;
byte *_palData;
byte *_lutData;
- byte _priData[SCREEN_WIDTH*SCREEN_HEIGHT / 2];
+ byte _priData[SCREEN_WIDTH * SCREEN_HEIGHT / 2];
int16 _paletteFadeLevel;
diff --git a/engines/startrek/module.mk b/engines/startrek/module.mk
index 3b93fbc439..b79126a794 100644
--- a/engines/startrek/module.mk
+++ b/engines/startrek/module.mk
@@ -1,6 +1,7 @@
MODULE := engines/startrek
MODULE_OBJS = \
+ awaymission.o \
bitmap.o \
common.o \
detection.o \
diff --git a/engines/startrek/object.h b/engines/startrek/object.h
index 41bf1f96c2..d9b16da875 100644
--- a/engines/startrek/object.h
+++ b/engines/startrek/object.h
@@ -44,7 +44,7 @@ struct Object {
uint16 numAnimFrames;
uint16 animFrame;
uint32 frameToStartNextAnim;
- uint16 field5e;
+ Common::Point pos;
uint16 field60;
uint16 field62;
uint16 field64;
@@ -67,7 +67,8 @@ struct Object {
uint16 field8c;
uint16 field8e;
uint16 field90;
- uint16 field92;
+ byte field92;
+ char direction; // Can 'n', 's', 'e', 'w', or 0 for uninitialized?
uint16 field94;
uint16 field96;
char animationString[9];
diff --git a/engines/startrek/room.cpp b/engines/startrek/room.cpp
index a68737454f..8cef65d13a 100644
--- a/engines/startrek/room.cpp
+++ b/engines/startrek/room.cpp
@@ -46,4 +46,9 @@ uint16 Room::readRdfWord(int offset) {
return _rdfData[offset] | (_rdfData[offset+1]<<8);
}
+Common::Point Room::getBeamInPosition(int crewmanIndex) {
+ int base = 0xaa + crewmanIndex * 4;
+ return Common::Point(readRdfWord(base), readRdfWord(base + 2));
+}
+
}
diff --git a/engines/startrek/room.h b/engines/startrek/room.h
index afe366b8de..a06d2af94f 100644
--- a/engines/startrek/room.h
+++ b/engines/startrek/room.h
@@ -17,11 +17,13 @@
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
*/
#ifndef STARTREK_ROOM_H
#define STARTREK_ROOM_H
+#include "common/rect.h"
#include "common/ptr.h"
#include "common/str.h"
@@ -38,8 +40,17 @@ public:
Room(StarTrekEngine *vm, Common::String name);
~Room();
+ // Helper stuff for RDF access
uint16 readRdfWord(int offset);
+ // Scale-related stuff (rename these later)
+ int16 getVar06() { return readRdfWord(0x06); }
+ int16 getVar08() { return readRdfWord(0x08); }
+ int16 getVar0a() { return readRdfWord(0x0a); }
+ int16 getVar0c() { return readRdfWord(0x0c); }
+
+ Common::Point getBeamInPosition(int crewmanIndex);
+
byte *_rdfData;
private:
diff --git a/engines/startrek/startrek.cpp b/engines/startrek/startrek.cpp
index 7c3f728518..346cb91081 100644
--- a/engines/startrek/startrek.cpp
+++ b/engines/startrek/startrek.cpp
@@ -55,8 +55,6 @@ StarTrekEngine::StarTrekEngine(OSystem *syst, const StarTrekGameDescription *gam
_macResFork = nullptr;
_room = nullptr;
- _redshirtDead = false;
-
_clockTicks = 0;
_musicEnabled = true;
@@ -70,6 +68,9 @@ StarTrekEngine::StarTrekEngine(OSystem *syst, const StarTrekGameDescription *gam
_keyboardControlsMouse = true;
_inQuitGameMenu = false;
+
+ _missionToLoad = "DEMON";
+ _roomIndexToLoad = 0;
}
StarTrekEngine::~StarTrekEngine() {
@@ -140,11 +141,11 @@ Common::Error StarTrekEngine::runGameMode(int mode) {
// Cleanup previous game mode
switch (_lastGameMode) {
case GAMEMODE_BRIDGE:
- //cleanupBridgeMode();
+ //cleanupBridge();
break;
case GAMEMODE_AWAYMISSION:
- //cleanupAwayMissionMode();
+ cleanupAwayMission();
break;
case GAMEMODE_BEAMDOWN:
@@ -162,11 +163,11 @@ Common::Error StarTrekEngine::runGameMode(int mode) {
break;
case GAMEMODE_AWAYMISSION:
- //initAwayMission();
+ initAwayMission();
break;
case GAMEMODE_BEAMDOWN:
- _redshirtDead = false;
+ _awayMission.redshirtDead = false;
_sound->loadMusicFile("ground");
runTransportSequence("teled");
_gameMode = GAMEMODE_AWAYMISSION;
@@ -190,9 +191,7 @@ Common::Error StarTrekEngine::runGameMode(int mode) {
break;
case GAMEMODE_AWAYMISSION:
- popNextEvent(&event);
- _system->updateScreen();
- //runAwayMission();
+ runAwayMission();
break;
case GAMEMODE_BEAMDOWN:
@@ -225,29 +224,29 @@ void StarTrekEngine::runTransportSequence(const Common::String &name) {
_gfx->drawDirectToScreen(bgImage);
_system->updateScreen();
- for (int i = 0; i < (_redshirtDead ? 3 : 4); i++) {
+ for (int i = 0; i < (_awayMission.redshirtDead ? 3 : 4); i++) {
Common::String filename = getCrewmanAnimFilename(i, name);
int x = crewmanTransportPositions[i][0];
int y = crewmanTransportPositions[i][1];
- loadAnimationForObject(i, filename, x, y, 256);
+ loadObjectAnim(i, filename, x, y, 256);
_objectList[i].animationString[0] = '\0';
}
if (_missionToLoad.equalsIgnoreCase("feather") && name[4] == 'b') {
- loadAnimationForObject(9, "qteleb", 0x61, 0x79, 0x100);
+ loadObjectAnim(9, "qteleb", 0x61, 0x79, 0x100);
}
else if (_missionToLoad.equalsIgnoreCase("trial")) {
if (name[4] == 'd') {
- loadAnimationForObject(9, "qteled", 0x61, 0x79, 0x100);
+ loadObjectAnim(9, "qteled", 0x61, 0x79, 0x100);
}
/* TODO
else if (word_51156 >= 3) {
- loadAnimationForObject(9, "qteleb", 0x61, 0x79, 0x100);
+ loadObjectAnim(9, "qteleb", 0x61, 0x79, 0x100);
}
*/
}
- loadAnimationForObject(8, "transc", 0, 0, 0x100);
+ loadObjectAnim(8, "transc", 0, 0, 0x100);
// TODO: redraw mouse and sprite_52c4e?
@@ -281,10 +280,6 @@ void StarTrekEngine::runTransportSequence(const Common::String &name) {
initObjects();
}
-Room *StarTrekEngine::getRoom() {
- return _room;
-}
-
void StarTrekEngine::playSoundEffectIndex(int index) {
switch (index) {
case 0x04:
@@ -358,7 +353,10 @@ void StarTrekEngine::initObjects() {
strcpy(_redshirtObject->animationString, "rstnd");
}
-int StarTrekEngine::loadAnimationForObject(int objectIndex, const Common::String &animName, uint16 x, uint16 y, uint16 scale) {
+/**
+ * Set an object's animation, position, and scale.
+ */
+int StarTrekEngine::loadObjectAnim(int objectIndex, const Common::String &animName, int16 x, int16 y, uint16 scale) {
debugC(6, kDebugGraphics, "Load animation '%s' on object %d", animName.c_str(), objectIndex);
Object *object;
@@ -412,10 +410,8 @@ void StarTrekEngine::updateObjectAnimations() {
if (object->animFrame >= object->numAnimFrames) {
if (object->animationString[0] == '\0')
removeObjectFromScreen(i);
- /*
- else // TODO
+ else
initStandAnim(i);
- */
}
else {
Sprite *sprite = &object->sprite;
@@ -434,9 +430,9 @@ void StarTrekEngine::updateObjectAnimations() {
uint16 basePriority = object->animFile->readUint16();
uint16 frames = object->animFile->readUint16();
- sprite->pos.x = xOffset + object->field5e;
- sprite->pos.y = yOffset + object->field60;
- sprite->drawPriority = _gfx->getPriValue(0, yOffset + object->field60) + basePriority;
+ 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->bitmapChanged = true;
object->frameToStartNextAnim = frames + _frameIndex;
@@ -491,8 +487,8 @@ void StarTrekEngine::drawObjectToScreen(Object *object, const Common::String &_a
object->animFile = loadFile(animFilename + ".anm");
object->numAnimFrames = object->animFile->size() / 22;
object->animFrame = 0;
- object->field5e = x;
- object->field60 = y;
+ object->pos.x = x;
+ object->pos.y = y;
object->field62 = 0;
object->scale = scale;
@@ -518,9 +514,9 @@ void StarTrekEngine::drawObjectToScreen(Object *object, const Common::String &_a
uint16 yOffset = object->animFile->readUint16();
uint16 basePriority = object->animFile->readUint16();
- sprite->pos.x = xOffset + object->field5e;
- sprite->pos.y = yOffset + object->field60;
- sprite->drawPriority = _gfx->getPriValue(0, yOffset + object->field60) + basePriority;
+ 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->bitmapChanged = true;
object->spriteDrawn = 1;
@@ -537,13 +533,44 @@ void StarTrekEngine::releaseAnim(Object *object) {
warning("Unimplemented anim type %d", object->animType);
break;
default:
- error("Invalid anim type.");
+ error("Invalid anim type");
break;
}
object->spriteDrawn = 0;
}
+void StarTrekEngine::initStandAnim(int objectIndex) {
+ Object *object = &_objectList[objectIndex];
+
+ if (!object->spriteDrawn)
+ error("initStandAnim: dead anim");
+
+ ////////////////////
+ // sub_239d2
+ const char *directions = "nsew";
+
+ if (objectIndex >= 0 && objectIndex <= 3) {
+ int8 dir = _awayMission.field25[objectIndex];
+ if (dir != -1) {
+ object->direction = directions[dir];
+ _awayMission.field25[objectIndex] = -1;
+ }
+ }
+ // end of sub_239d2
+ ////////////////////
+
+ Common::String animName;
+ if (object->direction != 0)
+ animName = Common::String(object->animationString) + (char)object->direction;
+ else // Default to facing south
+ animName = Common::String(object->animationString) + 's';
+
+ uint16 scale = getObjectScaleAtPosition(object->pos.y);
+ loadObjectAnim(objectIndex, animName, object->pos.x, object->pos.y, scale);
+ object->animType = 0;
+}
+
SharedPtr<Bitmap> StarTrekEngine::loadAnimationFrame(const Common::String &filename, uint16 scale) {
SharedPtr<Bitmap> bitmapToReturn;
@@ -581,13 +608,13 @@ SharedPtr<Bitmap> StarTrekEngine::loadAnimationFrame(const Common::String &filen
// Change uniform color
int16 colorShift;
switch (c) {
- case 'k':
+ case 'k': // Kirk
colorShift = 8;
break;
- case 'r':
+ case 'r': // Redshirt
colorShift = -8;
break;
- case 's':
+ case 's': // Spock
colorShift = 0;
break;
}
@@ -727,6 +754,7 @@ SharedPtr<Bitmap> StarTrekEngine::scaleBitmap(SharedPtr<Bitmap> bitmap, uint16 s
}
/**
+ * This takes a row of an unscaled bitmap, and copies it to a row of a scaled bitmap.
* This was heavily optimized in the original game (manually constructed an unrolled
* loop).
*/
diff --git a/engines/startrek/startrek.h b/engines/startrek/startrek.h
index 67c2c8080f..52157f4a0c 100644
--- a/engines/startrek/startrek.h
+++ b/engines/startrek/startrek.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
*/
#ifndef STARTREK_H
@@ -34,6 +35,7 @@
#include "engines/engine.h"
+#include "startrek/awaymission.h"
#include "startrek/filestream.h"
#include "startrek/graphics.h"
#include "startrek/object.h"
@@ -95,6 +97,18 @@ struct TrekEvent {
uint32 tick;
};
+enum Commands {
+ COMMAND_TICK = 0,
+ COMMAND_CLICKED_ON_OBJECT
+};
+
+struct Command {
+ byte type;
+ byte b1; // These depend on command type?
+ byte b2;
+ byte b3;
+};
+
const int MAX_OBJECTS = 0x20;
struct StarTrekGameDescription;
@@ -108,6 +122,23 @@ protected:
private:
// Game modes
Common::Error runGameMode(int mode);
+
+ // Away missions
+ void initAwayMission();
+ void runAwayMission();
+ void cleanupAwayMission();
+ void loadRoom(const Common::String &missionName, int roomIndex);
+ void initAwayCrewPositions(int warpEntryIndex);
+ void handleAwayMissionEvents();
+ int loadObjectAnimWithRoomScaling(int objectIndex, const Common::String &animName, int16 x, int16 y);
+ uint16 getObjectScaleAtPosition(int16 y);
+ void runAwayMissionCycle();
+
+public:
+ Room *getRoom();
+
+private:
+ // Transporter room
void runTransportSequence(const Common::String &name);
public:
@@ -115,20 +146,20 @@ public:
virtual ~StarTrekEngine();
// Running the game
- Room *getRoom();
-
void playSoundEffectIndex(int index);
void playSpeech(const Common::String &filename);
void stopPlayingSpeech();
// Objects
void initObjects();
- int loadAnimationForObject(int objectIndex, const Common::String &animName, uint16 x, uint16 y, uint16 arg8);
+ int loadObjectAnim(int objectIndex, const Common::String &animName, int16 x, int16 y, uint16 arg8);
+ bool objectWalkToPosition(int objectIndex, Common::Point src, Common::Point dest);
void updateObjectAnimations();
void removeObjectFromScreen(int objectIndex);
void objectFunc1();
void drawObjectToScreen(Object *object, const Common::String &animName, uint16 field5e, uint16 field60, uint16 arg8, bool addSprite);
void releaseAnim(Object *object);
+ void initStandAnim(int objectIndex);
SharedPtr<Bitmap> loadAnimationFrame(const Common::String &filename, uint16 arg2);
Common::String getCrewmanAnimFilename(int objectIndex, const Common::String &basename);
@@ -179,8 +210,21 @@ public:
public:
int _gameMode;
int _lastGameMode;
- bool _redshirtDead;
+
Common::String _missionToLoad;
+ int _roomIndexToLoad;
+
+ Common::String _missionName;
+ int _roomIndex;
+ Common::String _screenName; // _screenName = _missionName + _roomIndex
+ Common::String _mapFilename; // Similar to _screenName, but used for .map files?
+ SharedPtr<FileStream> _mapFile;
+ int32 _playerObjectScale;
+
+ // Queue of "commands" (ie. next frame, clicked on object) for away mission or bridge
+ Common::Queue<Command> _commandQueue;
+
+ AwayMission _awayMission;
Object _objectList[MAX_OBJECTS];
Object * const _kirkObject;
@@ -196,6 +240,7 @@ public:
// Updates 18.206 times every second.
uint32 _clockTicks;
uint32 _frameIndex;
+ uint32 _roomFrameCounter; // Resets to 0 on loading a room
bool _musicEnabled;
bool _sfxEnabled;