diff options
Diffstat (limited to 'engines/startrek/rooms/lovea.cpp')
-rw-r--r-- | engines/startrek/rooms/lovea.cpp | 253 |
1 files changed, 253 insertions, 0 deletions
diff --git a/engines/startrek/rooms/lovea.cpp b/engines/startrek/rooms/lovea.cpp new file mode 100644 index 0000000000..59e0bb7eff --- /dev/null +++ b/engines/startrek/rooms/lovea.cpp @@ -0,0 +1,253 @@ +/* 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. + * + */ + +// Common code for all rooms in LOVE mission. +// TODO: from a cursory glance, this seems to be different in the floppy version? + +#include "startrek/room.h" + +namespace StarTrek { + +// Mccoy or Ferris say something under effects of laughing gas +void Room::loveaTimer0Expired() { + const TextRef ferrisText[] = { + TX_LOV0_039, + TX_LOV0_048, + TX_LOV0_045, + TX_LOV0_040, + TX_LOV0_042, + TX_LOV0_050, + TX_LOV0_043, + TX_LOV0_041, + TX_LOV0_047, + TX_LOV0_046, + TX_LOV0_039 + }; + + const TextRef mccoyText[] = { + TX_LOV0_011, + TX_LOV0_020, + TX_LOV0_016, + TX_LOV0_012, + TX_LOV0_014, + TX_LOV0_022, + TX_LOV0_015, + TX_LOV0_021, + TX_LOV0_013, + TX_LOV0_019, + TX_LOV0_017 + }; + + // BUGFIX: should range from 0-1, not 0-2. Original had "get name errors" when it + // rolled a 2. + byte randomVal = getRandomWordInRange(0, 1); + TextRef speaker; + + const TextRef *textTable; + + if (randomVal == 0 || _vm->_awayMission.redshirtDead) { + speaker = TX_SPEAKER_MCCOY; + textTable = mccoyText; + } + else { + speaker = TX_SPEAKER_FERRIS; + textTable = ferrisText; + } + + randomVal = getRandomWordInRange(0, 10); + + showText(speaker, textTable[randomVal]); + + if (!_vm->_awayMission.love.releasedRomulanLaughingGas) { + const int spockText[] = { + TX_LOV0_029, + TX_LOV0_033, + TX_LOV0_026, + TX_LOV0_124 + }; + showText(TX_SPEAKER_SPOCK, spockText[getRandomWordInRange(0, 3)]); + + // BUG(?): This is in an if statement, meaning the human crewmen stop talking from + // laughing gas if Spock is under laughing gas effects. Might be intentional, to + // reduce "spamming" of text? + _vm->_awayMission.timers[0] = getRandomWordInRange(200, 400); + } +} + +// Spock says something under effects of laughing gas +void Room::loveaTimer1Expired() { + const int spockText[] = { + TX_LOV0_025, + TX_LOV0_101, + TX_LOV0_102, + TX_LOV0_103, + TX_LOV0_104, + TX_LOV0_105, + TX_LOV0_106, + TX_LOV0_107 + }; + + showText(TX_SPEAKER_SPOCK, spockText[getRandomWordInRange(0, 7)]); + + _vm->_awayMission.timers[1] = getRandomWordInRange(200, 400); +} + +void Room::loveaUseMedkitOnSpock() { + if (_vm->_awayMission.love.spockCured) + showText(TX_SPEAKER_MCCOY, TX_LOV5_015); + else + showText(TX_SPEAKER_MCCOY, TX_LOV5_019); +} + +void Room::loveaUseCureSampleOnSpock() { + if (_vm->_awayMission.love.spockCured) { + walkCrewman(OBJECT_SPOCK, _roomVar.love.cmnXPosToCureSpock, _roomVar.love.cmnYPosToCureSpock, 99); + walkCrewman(OBJECT_MCCOY, _roomVar.love.cmnXPosToCureSpock, _roomVar.love.cmnYPosToCureSpock + 10, 99); + } + else + showText(TX_SPEAKER_MCCOY, TX_LOVA_F55); +} + + +void Room::loveaUseCureOnSpock() { + if (_vm->_awayMission.love.spockCured) + showText(TX_SPEAKER_MCCOY, TX_LOV5_015); + else { + walkCrewman(OBJECT_SPOCK, _roomVar.love.cmnXPosToCureSpock, _roomVar.love.cmnYPosToCureSpock, 99); + walkCrewman(OBJECT_MCCOY, _roomVar.love.cmnXPosToCureSpock, _roomVar.love.cmnYPosToCureSpock + 10, 99); + } +} + +void Room::loveaSpockOrMccoyInPositionToUseCure() { + _roomVar.love.spockAndMccoyReadyToUseCure++; + if (_roomVar.love.spockAndMccoyReadyToUseCure == 2) + loadActorAnim2(OBJECT_MCCOY, "musemn", -1, -1, 99); +} + +void Room::loveaFinishedCuringSpock() { + showText(TX_SPEAKER_MCCOY, TX_LOV5_030); + showText(TX_SPEAKER_SPOCK, TX_LOV5_038); + showText(TX_SPEAKER_MCCOY, TX_LOV5_027); + showText(TX_SPEAKER_SPOCK, TX_LOV5C001); +} + + +// Timer 2 counts down the time until Spock and the Romulans succumb to the virus. +// BUG(-ish): once Spock is cured, the romulans will never succumb to the virus. +void Room::loveaTimer2Expired() { + if (!_vm->_awayMission.love.spockCured) { + _vm->_awayMission.love.spockInfectionCounter++; + if (_vm->_awayMission.love.spockInfectionCounter >= 100) { // Spock succumbs, game over + loadActorAnim(OBJECT_SPOCK, "sgetdn", -1, -1, 0); + playMidiMusicTracks(2, -1); // FIXME: assembly had no second parameter...? + showText(TX_GENER004); + showGameOverMenu(); + } + else if (_vm->_awayMission.love.spockInfectionCounter == 15) { + showText(TX_SPEAKER_SPOCK, TX_SPOKCOFF); + _vm->_awayMission.love.spockInfectionCounter++; + } + else if (_vm->_awayMission.love.spockInfectionCounter == 30) { + showText(TX_SPEAKER_MCCOY, TX_LOVA_F08); + _vm->_awayMission.love.spockInfectionCounter++; + } + else if (_vm->_awayMission.love.spockInfectionCounter == 45) { + showText(TX_SPEAKER_SPOCK, TX_SPOKCOFF); + _vm->_awayMission.love.spockInfectionCounter++; + } + else if (_vm->_awayMission.love.spockInfectionCounter == 60) { + showText(TX_SPEAKER_SPOCK, TX_LOVA_F54); + _vm->_awayMission.love.romulansUnconsciousFromVirus = true; + _vm->_awayMission.love.spockInfectionCounter++; + } + } + + _vm->_awayMission.timers[2] = 200; +} + +void Room::loveaUseMTricorderOnSpock() { + // Mccoy doesn't do his animation, I guess because he doesn't know which way to face? + // (possible future enhancement?) + playSoundEffectIndex(SND_TRICORDER); + + if (_vm->_awayMission.love.spockCured) + showText(TX_SPEAKER_MCCOY, TX_LOVA_F01); + else if (!_vm->_awayMission.love.knowAboutVirus) + showText(TX_SPEAKER_MCCOY, TX_LOVA_F02); + else if (_vm->_awayMission.love.spockInfectionCounter < 10) + showText(TX_SPEAKER_MCCOY, TX_LOVA_F04); + else if (_vm->_awayMission.love.spockInfectionCounter < 30) + showText(TX_SPEAKER_MCCOY, TX_LOVA_F03); + else if (_vm->_awayMission.love.spockInfectionCounter < 50) + showText(TX_SPEAKER_MCCOY, TX_LOVA_F08); + else if (_vm->_awayMission.love.spockInfectionCounter < 70) // BUGFIX: < 70 instead of == 70 + showText(TX_SPEAKER_MCCOY, TX_TUG2_010); + else if (_vm->_awayMission.love.spockInfectionCounter < 100) + showText(TX_SPEAKER_MCCOY, TX_LOVA_F10); + else + showText(TX_SPEAKER_MCCOY, TX_LOVA_100); +} + +void Room::loveaUseMTricorderOnHuman() { + playSoundEffectIndex(SND_TRICORDER); + showText(TX_SPEAKER_MCCOY, TX_LOVA_F07); +} + +void Room::loveaUseRomulanLaughingGas() { + showText(TX_LOV2N005); + _vm->_awayMission.love.releasedRomulanLaughingGas = true; + loseItem(OBJECT_IRLG); + + // BUGFIX: start the effects immediately + _vm->_awayMission.timers[1] = getRandomWordInRange(200, 400); +} + +void Room::loveaUseHumanLaughingGas() { + showText(TX_LOV2N005); + showText(TX_SPEAKER_SPOCK, TX_MUD2_040); + _vm->_awayMission.love.releasedHumanLaughingGas = true; + loseItem(OBJECT_IN2O); + playMidiMusicTracks(3, -1); // FIXME: assembly had no second parameter...? + + // BUGFIX: start the effects immediately + _vm->_awayMission.timers[0] = getRandomWordInRange(200, 400); +} + +void Room::loveaUseAmmonia() { + showText(TX_LOV2N005); + // TODO: redshirt says something in floppy edition only + loseItem(OBJECT_INH3); +} + +void Room::loveaUseCommunicator() { + // There were originally number of branches here, based on whether we've got the cure + // and whether we've contacted the enterprise already; but all of them branch to the + // exact same code. + // TODO: perhaps the floppy edition had different text for each case. + + showText(TX_SPEAKER_KIRK, TX_MUD4_018); + showText(TX_SPEAKER_UHURA, TX_BRIDU146); + showText(TX_SPEAKER_KIRK, TX_VENA_F41); + _vm->_awayMission.love.contactedEnterpriseBeforeCure = true; +} + +} |