mirror of
https://github.com/scummvm/scummvm.git
synced 2026-06-20 05:45:29 +00:00
311 lines
8.6 KiB
C++
311 lines
8.6 KiB
C++
/* 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/room.h"
|
|
|
|
#define OBJECT_MUDD 8
|
|
#define OBJECT_ALIENDV 9
|
|
#define OBJECT_DOOR 10
|
|
|
|
#define HOTSPOT_MEMORY_DISK_BOX 0x20
|
|
#define HOTSPOT_LENSE 0x21
|
|
#define HOTSPOT_DEGRIMER_BOX 0x22
|
|
#define HOTSPOT_FOOD_BOX 0x23
|
|
#define HOTSPOT_COMPONENT_BOX 0x24
|
|
#define HOTSPOT_DOOR 0x25
|
|
#define HOTSPOT_BOTTOM_OF_ROOM 0x26
|
|
|
|
// BUG-ish: Sometimes when looking at Mudd, Kirk walks toward him, but not always. Does
|
|
// this happen in original?
|
|
|
|
namespace StarTrek {
|
|
|
|
void Room::mudd0Tick1() {
|
|
playVoc("MUD0LOOP");
|
|
|
|
// NOTE: Using the floppy version's code here; Mudd disappears from this room after
|
|
// the first meeting. Fixes an issue where Mudd appears in the first room when he's
|
|
// supposed to be in the medbay.
|
|
// TODO: verify this matches with floppy version's code
|
|
if (_awayMission->mudd.muddFirstRoomState != 0)
|
|
_awayMission->mudd.muddFirstRoomState = 2;
|
|
else {
|
|
_awayMission->disableInput = 2;
|
|
loadActorAnim(OBJECT_MUDD, "s4cbhr", 0xa2, 0xa9, 0);
|
|
}
|
|
}
|
|
|
|
void Room::mudd0Tick50() {
|
|
if (!_awayMission->mudd.enteredRoom0ForFirstTime) {
|
|
playMidiMusicTracks(3);
|
|
_awayMission->mudd.enteredRoom0ForFirstTime = true;
|
|
}
|
|
}
|
|
|
|
void Room::mudd0Tick60() {
|
|
if (_awayMission->mudd.muddFirstRoomState == 0) {
|
|
// ENHANCEMENT: Move this into if statement (related to above enhancement)
|
|
_awayMission->disableInput = false;
|
|
|
|
_awayMission->mudd.muddFirstRoomState++;
|
|
|
|
showText(TX_SPEAKER_MUDD, TX_MUD0_037);
|
|
showText(TX_SPEAKER_KIRK, TX_MUD0_009);
|
|
showText(TX_SPEAKER_MUDD, TX_MUD0_028);
|
|
showText(TX_SPEAKER_MCCOY, TX_MUD0_017);
|
|
showText(TX_SPEAKER_MUDD, TX_MUD0_026);
|
|
showText(TX_SPEAKER_KIRK, TX_MUD0_006);
|
|
showText(TX_SPEAKER_MUDD, TX_MUD0_033);
|
|
showText(TX_SPEAKER_KIRK, TX_MUD0_005);
|
|
showText(TX_SPEAKER_MUDD, TX_MUD0_029);
|
|
}
|
|
}
|
|
|
|
void Room::mudd0UsePhaserOnMudd() {
|
|
showText(TX_SPEAKER_MUDD, TX_MUD0_025);
|
|
}
|
|
|
|
void Room::mudd0UseCommunicator() {
|
|
showText(TX_SPEAKER_KIRK, TX_MUD0_001);
|
|
showText(TX_SPEAKER_UHURA, TX_STATICU1);
|
|
}
|
|
|
|
void Room::mudd0LookAtFoodBox() {
|
|
_awayMission->crewDirectionsAfterWalk[OBJECT_KIRK] = DIR_S;
|
|
loadActorStandAnim(OBJECT_KIRK);
|
|
showDescription(TX_MUD0N012);
|
|
}
|
|
|
|
void Room::mudd0LookAtComponentBox() {
|
|
_awayMission->crewDirectionsAfterWalk[OBJECT_KIRK] = DIR_S;
|
|
loadActorStandAnim(OBJECT_KIRK);
|
|
showDescription(TX_MUD0N013);
|
|
}
|
|
|
|
void Room::mudd0LookAnywhere() {
|
|
showDescription(TX_MUD0N019);
|
|
}
|
|
|
|
void Room::mudd0LookAtMemoryDiskBox() {
|
|
_awayMission->crewDirectionsAfterWalk[OBJECT_KIRK] = DIR_N;
|
|
loadActorStandAnim(OBJECT_KIRK);
|
|
showDescription(TX_MUD0N010);
|
|
}
|
|
|
|
void Room::mudd0LookAtDegrimerBox() {
|
|
_awayMission->crewDirectionsAfterWalk[OBJECT_KIRK] = DIR_W;
|
|
loadActorStandAnim(OBJECT_KIRK);
|
|
showDescription(TX_MUD0N008);
|
|
}
|
|
|
|
void Room::mudd0LookAtLense() {
|
|
_awayMission->crewDirectionsAfterWalk[OBJECT_KIRK] = DIR_E;
|
|
loadActorStandAnim(OBJECT_KIRK);
|
|
showDescription(TX_MUD0N014);
|
|
}
|
|
|
|
void Room::mudd0UseSTricorderAnywhere() {
|
|
// Narrator says something, not Spock (so we don't use "spockScan" function)
|
|
loadActorAnim2(OBJECT_SPOCK, "sscans", -1, -1, 0);
|
|
playSoundEffectIndex(SND_TRICORDER);
|
|
showDescription(TX_MUD0N015);
|
|
}
|
|
|
|
void Room::mudd0UseMTricorderAnywhere() {
|
|
// Narrator says something, not Mccoy (so we don't use "mccoyScan" function)
|
|
// BUGFIX-ish: original game had "McCoy" as the speaker, which is inconsistent with
|
|
// above.
|
|
loadActorAnim2(OBJECT_MCCOY, "mscans", -1, -1, 0);
|
|
playSoundEffectIndex(SND_TRICORDER);
|
|
showDescription(TX_MUD0N015);
|
|
}
|
|
|
|
void Room::mudd0UseSTricorderOnMemoryDiskBox() {
|
|
spockScan(DIR_N, TX_MUD0_021, true);
|
|
}
|
|
|
|
void Room::mudd0UseSTricorderOnDegrimerBox() {
|
|
// Narrator says something, not Spock (so we don't use "spockScan" function)
|
|
_awayMission->crewDirectionsAfterWalk[OBJECT_SPOCK] = DIR_W;
|
|
loadActorAnim2(OBJECT_SPOCK, "sscanw", -1, -1, 0);
|
|
playSoundEffectIndex(SND_TRICORDER);
|
|
showDescription(TX_MUD0N000);
|
|
}
|
|
|
|
void Room::mudd0UseMTricorderOnLense() {
|
|
if (_awayMission->mudd.discoveredLenseAndDegrimerFunction)
|
|
mccoyScan(DIR_E, TX_MUD0_012, true);
|
|
else
|
|
mccoyScan(DIR_E, TX_MUD0_013, true);
|
|
}
|
|
|
|
void Room::mudd0GetLense() {
|
|
if (_awayMission->mudd.gotLense)
|
|
showDescription(TX_MUD0N016);
|
|
else {
|
|
_awayMission->mudd.gotLense = true;
|
|
_awayMission->mudd.missionScore++;
|
|
giveItem(OBJECT_ILENSES);
|
|
_awayMission->crewDirectionsAfterWalk[OBJECT_KIRK] = DIR_E;
|
|
loadActorAnim2(OBJECT_KIRK, "s5r1kg", -1, -1);
|
|
_awayMission->timers[1] = 27;
|
|
}
|
|
}
|
|
|
|
void Room::mudd0GetMemoryDisk() {
|
|
if (_awayMission->mudd.gotMemoryDisk)
|
|
showDescription(TX_MUD0N016);
|
|
else {
|
|
_awayMission->mudd.gotMemoryDisk = true;
|
|
_awayMission->mudd.missionScore++;
|
|
giveItem(OBJECT_IDISKS);
|
|
_awayMission->crewDirectionsAfterWalk[OBJECT_KIRK] = DIR_N;
|
|
loadActorAnimC(OBJECT_KIRK, "kuseln", -1, -1, &Room::mudd0PickedUpItem);
|
|
}
|
|
}
|
|
|
|
void Room::mudd0GetDegrimer() {
|
|
if (_awayMission->mudd.gotDegrimer)
|
|
showDescription(TX_MUD0N016);
|
|
else {
|
|
_awayMission->mudd.gotDegrimer = true;
|
|
_awayMission->mudd.missionScore++;
|
|
giveItem(OBJECT_IDEGRIME);
|
|
_awayMission->crewDirectionsAfterWalk[OBJECT_KIRK] = DIR_S;
|
|
loadActorAnimC(OBJECT_KIRK, "kusemw", -1, -1, &Room::mudd0PickedUpItem);
|
|
}
|
|
}
|
|
|
|
// Timer 1 expired
|
|
void Room::mudd0PickedUpLense() {
|
|
loadActorStandAnim(OBJECT_KIRK);
|
|
mudd0PickedUpItem();
|
|
}
|
|
|
|
void Room::mudd0PickedUpItem() {
|
|
_awayMission->disableInput = false; // NOTE: this was never set to true
|
|
showDescription(TX_LOV1N007);
|
|
}
|
|
|
|
|
|
void Room::mudd0WalkToSouthDoor() {
|
|
_roomVar.mudd.walkingToDoor = true;
|
|
_awayMission->disableInput = true;
|
|
walkCrewman(OBJECT_KIRK, 0x5a, 0xc7);
|
|
}
|
|
|
|
void Room::mudd0TouchedHotspot1() { // Trigger bottom door opening
|
|
if (_roomVar.mudd.walkingToDoor)
|
|
playVoc("SMADOOR3");
|
|
}
|
|
|
|
void Room::mudd0WalkToNorthDoor() {
|
|
_roomVar.mudd.walkingToDoor = true;
|
|
_awayMission->disableInput = true;
|
|
walkCrewman(OBJECT_KIRK, 0xa0, 0x68);
|
|
}
|
|
|
|
void Room::mudd0TouchedHotspot0() { // Trigger top door opening
|
|
if (_roomVar.mudd.walkingToDoor) {
|
|
playVoc("SMADOOR3");
|
|
loadActorAnim2(OBJECT_DOOR, "s4cbdo", 0xa0, 0x6b);
|
|
}
|
|
}
|
|
|
|
void Room::mudd0UseMedkit() {
|
|
showText(TX_SPEAKER_MCCOY, TX_MUD0_011);
|
|
}
|
|
|
|
void Room::mudd0LookAtKirk() {
|
|
showDescription(TX_MUD0N004);
|
|
}
|
|
|
|
void Room::mudd0LookAtSpock() {
|
|
showDescription(TX_MUD0N007);
|
|
}
|
|
|
|
void Room::mudd0LookAtMccoy() {
|
|
showDescription(TX_MUD0N001);
|
|
}
|
|
|
|
void Room::mudd0LookAtRedshirt() {
|
|
showDescription(TX_MUD0N005);
|
|
}
|
|
|
|
void Room::mudd0LookAtMudd() {
|
|
showDescription(TX_MUD0N003);
|
|
}
|
|
|
|
void Room::mudd0TalkToKirk() {
|
|
if (_awayMission->mudd.muddFirstRoomState == 2)
|
|
showText(TX_SPEAKER_KIRK, TX_MUD0_010);
|
|
else {
|
|
showText(TX_SPEAKER_KIRK, TX_MUD0_010);
|
|
showText(TX_SPEAKER_MUDD, TX_MUD0_031);
|
|
showText(TX_SPEAKER_KIRK, TX_MUD0_007);
|
|
}
|
|
}
|
|
|
|
void Room::mudd0TalkToSpock() {
|
|
if (_awayMission->mudd.muddFirstRoomState == 2)
|
|
showText(TX_SPEAKER_SPOCK, TX_MUD0_022);
|
|
else {
|
|
showText(TX_SPEAKER_SPOCK, TX_MUD0_022);
|
|
showText(TX_SPEAKER_MUDD, TX_MUD0_034);
|
|
showText(TX_SPEAKER_SPOCK, TX_MUD0_023);
|
|
showText(TX_SPEAKER_MCCOY, TX_MUD0_015);
|
|
showText(TX_SPEAKER_MUDD, TX_MUD0_038);
|
|
}
|
|
}
|
|
|
|
void Room::mudd0TalkToMccoy() {
|
|
if (_awayMission->mudd.muddFirstRoomState == 2)
|
|
showText(TX_SPEAKER_MCCOY, TX_MUD0_016);
|
|
else {
|
|
showText(TX_SPEAKER_MCCOY, TX_MUD0_016);
|
|
showText(TX_SPEAKER_KIRK, TX_MUD0_003);
|
|
showText(TX_SPEAKER_MUDD, TX_MUD0_027);
|
|
showText(TX_SPEAKER_MCCOY, TX_MUD0_014);
|
|
}
|
|
}
|
|
|
|
void Room::mudd0TalkToRedshirt() {
|
|
if (_awayMission->mudd.muddFirstRoomState == 2) {
|
|
showText(TX_SPEAKER_BUCHERT, TX_MUD0_039);
|
|
showText(TX_SPEAKER_KIRK, TX_MUD0_008);
|
|
} else {
|
|
showText(TX_SPEAKER_BUCHERT, TX_MUD0_040);
|
|
showText(TX_SPEAKER_MUDD, TX_MUD0_030);
|
|
showText(TX_SPEAKER_BUCHERT, TX_MUD0_041);
|
|
showText(TX_SPEAKER_MUDD, TX_MUD0_036);
|
|
}
|
|
}
|
|
|
|
void Room::mudd0TalkToMudd() {
|
|
showText(TX_SPEAKER_MUDD, TX_MUD0_032);
|
|
showText(TX_SPEAKER_SPOCK, TX_MUD0_024);
|
|
showText(TX_SPEAKER_MUDD, TX_MUD0_035);
|
|
showText(TX_SPEAKER_KIRK, TX_MUD0_004);
|
|
}
|
|
|
|
}
|