Skip to content

Commit

Permalink
STARTREK: Default text for undefined actions
Browse files Browse the repository at this point in the history
  • Loading branch information
Stewmath authored and sev- committed Aug 9, 2018
1 parent 0c28fd9 commit 41997eb
Show file tree
Hide file tree
Showing 6 changed files with 143 additions and 17 deletions.
121 changes: 107 additions & 14 deletions engines/startrek/awaymission.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -37,11 +37,11 @@ void StarTrekEngine::initAwayMission() {
// sub_23a60(); // TODO
_sound->loadMusicFile("ground");

loadRoom(_missionToLoad, _roomIndexToLoad);
loadRoom(_missionToLoad, 1); // FIXME
_roomIndexToLoad = -1;

// Load crew positions for beaming in
initAwayCrewPositions(4);
initAwayCrewPositions(1);
}

void StarTrekEngine::runAwayMission() {
Expand Down Expand Up @@ -432,40 +432,133 @@ void StarTrekEngine::handleAwayMissionAction() {
}
break;

case ACTION_USE: // TODO
warning("Unhandled use action: %d %d %d", action.b1, action.b2, action.b3);
case ACTION_USE:
if (action.activeObject() != action.passiveObject()) {
switch (action.activeObject()) {
case OBJECT_KIRK:
if (!_room->handleAction(ACTION_WALK, action.passiveObject(), 0, 0)
&& !_room->handleAction(ACTION_GET, action.passiveObject(), 0, 0)) {
showTextbox("Capt. Kirk", getLoadedText(GROUNDTX_KIRK_USE), 20, 20, TEXTCOLOR_YELLOW, 0);
}
break;

case OBJECT_SPOCK:
if (!_room->handleAction(ACTION_USE, OBJECT_ISTRICOR, action.passiveObject(), 0)) {
// BUGFIX: Original game has just "Spock" instead of "Mr. Spock" as the
// speaker. That's inconsistent.
// Same applies to other parts of this function.
showTextbox("Mr. Spock", getLoadedText(GROUNDTX_SPOCK_USE), 20, 20, TEXTCOLOR_BLUE, 0);
}
break;

case OBJECT_MCCOY:
if (!_room->handleAction(ACTION_USE, OBJECT_IMEDKIT, action.passiveObject(), 0)
&& !_room->handleAction(ACTION_USE, OBJECT_IMTRICOR, action.passiveObject(), 0)) {
// BUGFIX: Original game has just "McCoy" instead of "Dr. McCoy".
showTextbox("Dr. McCoy", getLoadedText(GROUNDTX_MCCOY_USE), 20, 20, TEXTCOLOR_BLUE, 0);
}
break;

case OBJECT_REDSHIRT:
showTextbox(nullptr, getLoadedText(GROUNDTX_REDSHIRT_USE), 20, 20, TEXTCOLOR_YELLOW, 0);
break;

case OBJECT_IPHASERS:
case OBJECT_IPHASERK:
if (action.passiveObject() == OBJECT_SPOCK) {
int text = GROUNDTX_PHASER_ON_SPOCK + getRandomWord() % 8;
showTextbox("Dr. McCoy", getLoadedText(text), 20, 20, TEXTCOLOR_BLUE, 0);
}
else if (action.passiveObject() == OBJECT_MCCOY) {
int text = GROUNDTX_PHASER_ON_MCCOY + getRandomWord() % 8;
showTextbox("Mr. Spock", getLoadedText(text), 20, 20, TEXTCOLOR_BLUE, 0);
}
else if (action.passiveObject() == OBJECT_REDSHIRT) {
Common::String text = getLoadedText(GROUNDTX_PHASER_ON_REDSHIRT + getRandomWord() % 8);
// Replace audio filename with start of mission name (to load the
// audio for the crewman specific to the mission))
text.setChar(_missionName[0], 6);
text.setChar(_missionName[1], 7);
text.setChar(_missionName[2], 8);
showTextbox("Security Officer", text, 20, 20, TEXTCOLOR_RED, 0);
// TODO: replace "Security Officer" string with their actual name as
// an enhancement?
}
else if (!_room->handleActionWithBitmask(action)) {
int index = getRandomWord() % 7;
if (index & 1)
showTextbox("Dr. McCoy", getLoadedText(GROUNDTX_PHASER_ANYWHERE + index), 20, 20, TEXTCOLOR_BLUE, 0);
else
showTextbox("Mr. Spock", getLoadedText(GROUNDTX_PHASER_ANYWHERE + index), 20, 20, TEXTCOLOR_BLUE, 0);
}
break;

case OBJECT_ISTRICOR:
showTextbox("Mr. Spock", getLoadedText(GROUNDTX_SPOCK_SCAN), 20, 20, TEXTCOLOR_BLUE, 0);
break;

case OBJECT_IMTRICOR:
showTextbox("Dr. McCoy", getLoadedText(GROUNDTX_MCCOY_SCAN), 20, 20, TEXTCOLOR_BLUE, 0);
break;

case OBJECT_ICOMM:
if (!_room->handleAction(ACTION_USE, OBJECT_ICOMM, -1, 0))
showTextbox("Lt. Uhura", getLoadedText(GROUNDTX_USE_COMMUNICATOR), 20, 20, TEXTCOLOR_RED, 0);
break;

case OBJECT_IMEDKIT:
showTextbox("Dr. McCoy", getLoadedText(GROUNDTX_USE_MEDKIT), 20, 20, TEXTCOLOR_BLUE, 0);
break;

default:
if (!_room->handleActionWithBitmask(action.type, action.b1, action.b2, action.b3))
showTextbox("", getLoadedText(GROUNDTX_NOTHING_HAPPENS), 20, 20, TEXTCOLOR_YELLOW, 0);
}
}
break;

case ACTION_GET: // TODO
warning("Unhandled get action: %d %d %d", action.b1, action.b2, action.b3);
case ACTION_GET:
if (!_room->handleActionWithBitmask(action.type, action.b1, action.b2, action.b3))
showTextbox("", getLoadedText(GROUNDTX_FAIL_TO_OBTAIN_ANYTHING), 20, 20, TEXTCOLOR_YELLOW, 0);
break;

case ACTION_LOOK:
if (action.activeObject() >= ITEMS_START && action.activeObject() < ITEMS_END) {
int i = action.activeObject() - ITEMS_START;
Common::String text = getItemDescription(_itemList[i].textIndex);
Common::String text = getLoadedText(_itemList[i].textIndex);
showTextbox("", text, 20, 20, TEXTCOLOR_YELLOW, 0);
}
else if (action.activeObject() == OBJECT_KIRK)
showTextbox("", getItemDescription(0x49), 20, 20, TEXTCOLOR_YELLOW, 0);
showTextbox("", getLoadedText(GROUNDTX_LOOK_KIRK), 20, 20, TEXTCOLOR_YELLOW, 0);
else if (action.activeObject() == OBJECT_SPOCK)
showTextbox("", getItemDescription(0x4a), 20, 20, TEXTCOLOR_YELLOW, 0);
showTextbox("", getLoadedText(GROUNDTX_LOOK_SPOCK), 20, 20, TEXTCOLOR_YELLOW, 0);
else if (action.activeObject() == OBJECT_MCCOY)
showTextbox("", getItemDescription(0x4b), 20, 20, TEXTCOLOR_YELLOW, 0);
showTextbox("", getLoadedText(GROUNDTX_LOOK_MCCOY), 20, 20, TEXTCOLOR_YELLOW, 0);
else {
if (action.activeObject() == OBJECT_REDSHIRT)
showTextbox("", getItemDescription(0x4c), 20, 20, TEXTCOLOR_YELLOW, 0);
showTextbox("", getLoadedText(GROUNDTX_LOOK_REDSHIRT), 20, 20, TEXTCOLOR_YELLOW, 0);

// Show generic "nothing of note" text.
// BUG? This text is also shown after looking at the redshirt. However, his
// text is normally overridden on a per-mission basis, so perhaps this bug
// never manifests itself?
showTextbox("", getItemDescription(0x4d), 20, 20, TEXTCOLOR_YELLOW, 0);
showTextbox("", getLoadedText(GROUNDTX_LOOK_ANYWHERE), 20, 20, TEXTCOLOR_YELLOW, 0);
}
break;

case ACTION_TALK: // TODO
warning("Unhandled talk action: %d %d %d", action.b1, action.b2, action.b3);
case ACTION_TALK:
switch (action.activeObject()) {
case OBJECT_KIRK:
case OBJECT_SPOCK:
case OBJECT_MCCOY:
case OBJECT_REDSHIRT:
showTextbox("", getLoadedText(GROUNDTX_TALK_TO_CREWMAN), 20, 20, TEXTCOLOR_YELLOW, 0);
break;

default:
showTextbox("", getLoadedText(GROUNDTX_NO_RESPONSE), 20, 20, TEXTCOLOR_YELLOW, 0);
break;
}
break;

case ACTION_TOUCHED_WARP:
Expand Down
2 changes: 1 addition & 1 deletion engines/startrek/room.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,7 @@ bool Room::handleActionWithBitmask(const Action &action) {
int n = _numRoomActions;

while (n-- > 0) {
uint32 bitmask = action.getBitmask();
uint32 bitmask = roomActionPtr->action.getBitmask();
if ((action.toUint32() & bitmask) == (roomActionPtr->action.toUint32() & bitmask)) {
_vm->_awayMission.rdfStillDoDefaultAction = false;
(this->*(roomActionPtr->funcPtr))();
Expand Down
2 changes: 2 additions & 0 deletions engines/startrek/room.h
Original file line number Diff line number Diff line change
Expand Up @@ -69,9 +69,11 @@ class Room {
// That code is instead rewritten on a per-room basis.
bool actionHasCode(const Action &action);
bool handleAction(const Action &action);
bool handleAction(byte type, byte b1, byte b2, byte b3) { return handleAction(Action(type, b1, b2, b3)); };

// Same as above, but if any byte in the action is -1 (0xff), it matches any value.
bool handleActionWithBitmask(const Action &action);
bool handleActionWithBitmask(byte type, byte b1, byte b2, byte b3) { return handleActionWithBitmask(Action(type, b1, b2, b3)); };

uint16 getFirstHotspot() { return readRdfWord(0x12); }
uint16 getHotspotEnd() { return readRdfWord(0x14); }
Expand Down
2 changes: 1 addition & 1 deletion engines/startrek/startrek.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1851,7 +1851,7 @@ uint16 StarTrekEngine::getRandomWord() {
* ".txt" files are just lists of strings. This traverses the file to get a particular
* string index.
*/
Common::String StarTrekEngine::getItemDescription(int itemIndex) {
Common::String StarTrekEngine::getLoadedText(int itemIndex) {
SharedPtr<FileStream> txtFile = loadFile(_txtFilename + ".txt");

byte *data = txtFile->_data;
Expand Down
2 changes: 1 addition & 1 deletion engines/startrek/startrek.h
Original file line number Diff line number Diff line change
Expand Up @@ -395,7 +395,7 @@ class StarTrekEngine : public ::Engine {

// Misc
uint16 getRandomWord();
Common::String getItemDescription(int itemIndex);
Common::String getLoadedText(int itemIndex);


public:
Expand Down
31 changes: 31 additions & 0 deletions engines/startrek/text.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,37 @@

namespace StarTrek {

// Text that's loaded from "GROUND.TXT". First 0x40 pieces of text are for items.
enum GroundTextIDs {
// Generic "perform undefined action" text (ie. look at nothing, talk to wall)
GROUNDTX_LOOK_KIRK = 0x49,
GROUNDTX_LOOK_SPOCK = 0x4a,
GROUNDTX_LOOK_MCCOY = 0x4b,
GROUNDTX_LOOK_REDSHIRT = 0x4c,
GROUNDTX_LOOK_ANYWHERE = 0x4d,
GROUNDTX_TALK_TO_CREWMAN = 0x4e,
GROUNDTX_NO_RESPONSE = 0x4f,

GROUNDTX_KIRK_USE = 0x50,
GROUNDTX_SPOCK_USE = 0x51,
GROUNDTX_MCCOY_USE = 0x52,
GROUNDTX_REDSHIRT_USE = 0x53,
GROUNDTX_SPOCK_SCAN = 0x54,
GROUNDTX_MCCOY_SCAN = 0x55,
GROUNDTX_USE_MEDKIT = 0x56,

GROUNDTX_PHASER_ON_MCCOY = 0x57, // 8 variations
GROUNDTX_PHASER_ON_SPOCK = 0x5f, // 8 variations
GROUNDTX_PHASER_ON_REDSHIRT = 0x67, // 8 variations
GROUNDTX_PHASER_ANYWHERE = 0x6f, // 7 variations

GROUNDTX_USE_COMMUNICATOR = 0x76,
GROUNDTX_NOTHING_HAPPENS = 0x77,
GROUNDTX_FAIL_TO_OBTAIN_ANYTHING = 0x78
};

// Text that's hardcoded into "RDF" files, and copied into here for a sane referencing
// scheme.
enum GameStringIDs {
TX_NULL,
TX_BLANK,
Expand Down

0 comments on commit 41997eb

Please sign in to comment.