SUPERNOVA: Adds room specific game logic

This is the game logic for the first act of the game.
It will see restructuring to remove gotos/jumps and hardcoded
differences in game behavior depending on settings (e.g. sound on/off).
This commit is contained in:
Joseph-Eugene Winzer 2017-06-21 13:09:55 +02:00 committed by Thierry Crozat
parent e6802ed633
commit 932b3669d3
4 changed files with 1007 additions and 17 deletions

View file

@ -5,6 +5,7 @@ MODULE_OBJS := \
detection.o \
graphics.o \
supernova.o \
rooms.o
MODULE_DIRS += \
engines/supernova

986
engines/supernova/rooms.cpp Normal file
View file

@ -0,0 +1,986 @@
#include "common/system.h"
#include "supernova/supernova.h"
namespace Supernova {
bool ShipCorridor::interact(Action verb, Object &obj1, Object &obj2) {
if ((verb == ACTION_PRESS) && (obj1._id == BUTTON)) {
if (_objectState[6].hasProperty(OPENED)) {
_vm->playSound(54, 24020);
_objectState[6].disableProperty(OPENED);
_vm->renderImage(_gm->_currentRoom->getFileNumber(), 8);
_shown[9] = false;
_gm->wait2(2);
_vm->renderImage(_gm->_currentRoom->getFileNumber(), 7);
_shown[8] = false;
_gm->wait2(2);
_vm->renderImage(_gm->_currentRoom->getFileNumber(), _gm->invertSection(7));
} else {
_vm->playSound(54, 24020);
_objectState[6].setProperty(OPENED);
_vm->renderImage(_gm->_currentRoom->getFileNumber(), 7);
_gm->wait2(2);
_vm->renderImage(_gm->_currentRoom->getFileNumber(), 8);
_shown[7] = false;
_gm->wait2(2);
_vm->renderImage(_gm->_currentRoom->getFileNumber(), 9);
_shown[8] = false;
}
return true;
}
return false;
}
bool ShipHall::interact(Action verb, Object &obj1, Object &obj2) {
if ((verb == ACTION_OPEN) && (obj1._id == KITCHEN_HATCH)) {
_vm->renderMessage("In der Küche warst du schon|oft genug, im Moment hast|du keinen Appetit.");
} else if ((verb == ACTION_USE) && Object::combine(obj1,obj2,KEYCARD2,SLEEP_SLOT)) {
if (_objectState[2].hasProperty(OPENED)) {
_objectState[2].disableProperty(OPENED);
_vm->renderImage(_gm->_currentRoom->getFileNumber(), 3);
_shown[4] = false;
_gm->wait2(2);
_vm->renderImage(_gm->_currentRoom->getFileNumber(), 2);
_shown[3] = false;
_gm->wait2(2);
_vm->renderImage(_gm->_currentRoom->getFileNumber(), _gm->invertSection(2));
} else {
_objectState[2].setProperty(OPENED);
_vm->renderImage(_gm->_currentRoom->getFileNumber(), 2);
_gm->wait2(2);
_vm->renderImage(_gm->_currentRoom->getFileNumber(), 3);
_shown[2] = false;
_gm->wait2(2);
_vm->renderImage(_gm->_currentRoom->getFileNumber(), 4);
_shown[3] = false;
_gm->great(1);
}
} else {
return false;
}
return true;
}
bool ShipSleepCabin::interact(Action verb, Object &obj1, Object &obj2) {
char input[31];
static char codeword_DE[] = "ZWEIUNDVIERZIG";
static char codeword_EN[] = "FORTYTWO";
int32 l,*energy;
Room *r;
if (((verb == ACTION_LOOK) || (verb == ACTION_USE)) && (obj1._id == COMPUTER)) {
_shown[kMaxSection - 1] = true;
_shown[4] = false;
_vm->renderBox(0,0,320,200,kColorDarkBlue);
if (_gm->_state.time == 0) {
// Destination reached
_vm->renderText("Flugziel erreicht", 60, 95, kColorWhite99);
_gm->mouseInput2();
} else if (_gm->_state.powerOff) {
// Energy depleted
_vm->renderText("Energie erschöpft",60,95,kColorWhite99);
// Artificial coma interrupted
_vm->renderText("Tiefschlafprozess abgebrochen",60,115,kColorWhite99);
_gm->mouseInput2();
} else if (_shown[5]) {
// Sleep duration in days
_vm->renderText("Schlafdauer in Tagen:",30,85,kColorWhite99);
_vm->renderText(Common::String::format("%d",_gm->_state.timeSleep).c_str(),
150,85,kColorWhite99);
_vm->renderText("Bitte legen Sie sich in die angezeigte Schlafkammer.",
30,105,kColorWhite99);
_gm->mouseInput2();
} else {
_vm->renderText("Bitte Passwort eingeben:",100,85,kColorWhite99);
input[0] = 0;
do {
_gm->edit(input,100,105,30);
} while ((_gm->_key != Common::ASCII_RETURN) && (_gm->_key != Common::ASCII_ESCAPE));
if (_gm->_key == Common::ASCII_ESCAPE) {
goto escape;
}
for (int i = 0; i < 30; ++i) {
if ((input[i] >= 'a') && (input[i] <= 'z')) {
input[i] -= 'a' - 'A';
}
}
if (strcmp(input,codeword_DE) != 0) {
_vm->renderText("Falsches Passwort",100,125,kColorLightRed);
_gm->wait2(18);
goto escape;
}
_gm->great(6);
_vm->renderBox(0,0,320,200,kColorDarkBlue);
_vm->renderText("Schlafdauer in Tagen:",30,85,kColorWhite99);
do {
_vm->renderBox(150,85,150,8,kColorDarkBlue);
input[0] = 0;
do {
_gm->edit(input,150,85,10);
} while ((_gm->_key != Common::ASCII_RETURN) && (_gm->_key != Common::ASCII_ESCAPE));
if (_gm->_key == Common::ASCII_ESCAPE) {
goto escape;
}
l = atol(input);
for (size_t i = 0; i < strlen(input); i++) {
if ((input[i] < '0') || (input[i] > '9')) {
l = 0;
}
}
} while (l == 0);
_gm->_state.timeSleep = l;
_vm->renderText("Bitte legen Sie sich in die angezeigte Schlafkammer.",30,105,kColorWhite99);
_gm->wait2(18);
_shown[5] = true;
}
escape:
_vm->renderRoom(*this);
_gm->showMenu();
_gm->drawMapExits();
_gm->palette();
_shown[kMaxSection - 1] = false;
} else if (((verb == ACTION_WALK) || (verb == ACTION_USE)) &&
((obj1._id == CABINS) || (obj1._id == CABIN))) {
r = &_gm->_rooms[AIRLOCK];
if (!(obj1._id == CABIN) || !(_shown[5])) {
_vm->renderMessage("Es würde wenig bringen,|sich in eine Schlafkammer zu legen,|die nicht eingeschaltet ist.");
} else if (r->getObject(5)->hasProperty(WORN)) {
_vm->renderMessage("Dazu mußt du erst den Raumanzug ausziehen.");
} else {
_vm->paletteFadeOut();
_vm->renderImage(_gm->_currentRoom->getFileNumber(), _gm->invertSection(5));
_vm->renderImage(_gm->_currentRoom->getFileNumber(), _gm->invertSection(4));
r = &_gm->_rooms[GENERATOR];
if (r->isSectionVisible(9)) {
energy = &_gm->_state.landingModuleEnergy;
} else {
energy = &_gm->_state.shipEnergy;
}
if (_gm->_state.timeSleep > _gm->_state.time) {
_gm->_state.timeSleep = _gm->_state.time;
}
if (_gm->_state.timeSleep >= *energy) {
_gm->_state.timeSleep = *energy;
if (r->isSectionVisible(9)) {
r = &_gm->_rooms[LANDINGMODULE]; // Monitors off
r->setSectionVisible(2, false);
r->setSectionVisible(7, false);
r->setSectionVisible(8, false);
r->setSectionVisible(9, false);
r->setSectionVisible(10, false);
}
}
if (_gm->_state.timeSleep == _gm->_state.time) {
_vm->renderImage(_gm->_currentRoom->getFileNumber(), 3); // landed
r = &_gm->_rooms[COCKPIT];
r->setSectionVisible(23, true);
r = &_gm->_rooms[CABIN_R2];
r->setSectionVisible(5, false);
r->setSectionVisible(6, true);
r->getObject(2)->_click = 10;
r = &_gm->_rooms[HOLD];
r->setSectionVisible(0, false);
r->setSectionVisible(1, true);
r->getObject(1)->_click = 255;
r->getObject(3)->_click = 255;
r = &_gm->_rooms[GENERATOR];
r->setSectionVisible(6, false);
r->setSectionVisible(7, true);
r->getObject(1)->_click = 14;
if (r->isSectionVisible(1)) {
r->setSectionVisible(10, true);
}
if (r->isSectionVisible(12)) {
r->setSectionVisible(12, false);
r->setSectionVisible(11, true);
}
}
_gm->_state.time -= _gm->_state.timeSleep;
*energy -= _gm->_state.timeSleep;
_gm->_state.timeStarting = _vm->getDOSTicks() - 786520; // 12pm
_gm->_state.timeAlarmSystem = _gm->_state.timeAlarm + _gm->_state.timeStarting;
_gm->_state.alarmOn = (_gm->_state.timeAlarmSystem > _vm->getDOSTicks());
if (!*energy) {
_gm->turnOff();
r = &_gm->_rooms[GENERATOR];
r->setSectionVisible(4, r->isSectionVisible(2));
}
if (_gm->_state.time == 0) {
_gm->saveTime();
if (!_gm->saveGame(-2))
_gm->errorTemp();
_gm->_state.dream = true;
_gm->loadTime();
}
_gm->wait2(18);
_vm->paletteFadeIn();
if (_gm->_state.time == 0) {
_vm->playSound(45);
_gm->screenShake();
_gm->wait2(18);
_vm->renderMessage("Was war das?");
}
}
} else {
return false;
}
return true;
}
void ShipSleepCabin::animation() {
static char color;
if (this->isSectionVisible(kMaxSection - 1)) {
if (color) {
color = kColorBlack;
_gm->_timer2 = 5;
} else {
color = kColorLightYellow;
_gm->_timer2 = 10;
}
_vm->renderText("Achtung: Triebwerke funktionsunfähig",50,145,color);
} else {
if (this->isSectionVisible(21)) {
_vm->renderImage(this->getFileNumber(), _gm->invertSection(21));
_gm->_timer2 = 5;
} else {
_vm->renderImage(this->getFileNumber(), 21);
_gm->_timer2 = 10;
}
}
if (_gm->_state.powerOff) {
if (this->isSectionVisible(kMaxSection - 1)) {
_vm->renderText("Energievorrat erschöpft",97,165,color);
_vm->renderText("Notstromversorgung aktiv",97,175,color);
} else {
if (this->isSectionVisible(21)) {
_vm->renderImage(this->getFileNumber(), 22);
} else {
_vm->renderImage(this->getFileNumber(), _gm->invertSection(22));
}
}
}
}
void ShipSleepCabin::onEntrance() {
if (_gm->_state.dream && (_gm->_rooms[CAVE].getObject(1)->_exitRoom == MEETUP3)) {
_vm->renderMessage("Du wachst mit brummendem Schädel auf|und merkst, daß du nur geträumt hast.");
_gm->mouseWait(_gm->_timer1);
_vm->removeMessage();
_vm->renderMessage("Beim Aufprall des Raumschiffs|mußt du mit dem Kopf aufgeschlagen|und bewußtlos geworden sein.");
_gm->mouseWait(_gm->_timer1);
_vm->removeMessage();
_vm->renderMessage("Was steht dir jetzt wohl wirklich bevor?");
_gm->_state.dream = false;
}
}
bool ShipCockpit::interact(Action verb, Object &obj1, Object &obj2) {
char c[2] = {0};
if ((verb == ACTION_LOOK) && (obj1._id == MONITOR)) {
this->setSectionVisible(kMaxSection - 1, true);
_vm->renderBox(0, 0, 320, 200, kColorBlack);
_vm->renderText("Geschwindigkeit: ", 50, 50, kColorLightYellow);
if (_gm->_state.time)
_vm->renderText("8000 hpm");
else
_vm->renderText("0 hpm");
_vm->renderText("Ziel: Arsano 3", 50, 70, kColorLightYellow);
_vm->renderText("Entfernung: ", 50, 90, kColorLightYellow);
_vm->renderText(Common::String::format("%d", _gm->_state.time / 400).c_str());
_vm->renderText(",");
c[0] = (_gm->_state.time / 40) % 10 + '0';
_vm->renderText(c);
c[0] = (_gm->_state.time / 4) % 10 + '0';
_vm->renderText(c);
_vm->renderText(" Lichtjahre");
_vm->renderText("Dauer der Reise bei momentaner Geschwindigkeit:", 50, 110, 14);
_vm->renderText(Common::String::format("%d", _gm->_state.time).c_str(), 50, 120, kColorLightYellow);
_vm->renderText(" Tage");
_gm->mouseInput2();
this->setSectionVisible(kMaxSection - 1, false);
_vm->renderRoom(*this);
_gm->showMenu();
_gm->drawMapExits();
_vm->paletteBrightness();
} else if ((verb == ACTION_USE) && (obj1._id == INSTRUMENTS))
_vm->renderMessage("Vergiá nicht, du bist nur der|Schiffskoch und hast keine Ahnung,|wie man ein Raumschiff fliegt.");
else
return false;
return true;
}
void ShipCockpit::animation() {
static char color;
if (this->isSectionVisible(kMaxSection - 1)) {
if (color) {
color = 0;
_gm->_timer2 = 5;
} else {
color = 14;
_gm->_timer2 = 10;
}
_vm->renderText("Achtung: Triebwerke funktionsunf„hig", 50, 145, color);
} else {
if (this->isSectionVisible(21)) {
_vm->renderImage(this->getFileNumber(), _gm->invertSection(21));
_gm->_timer2 = 5;
} else {
_vm->renderImage(this->getFileNumber(), 21);
_gm->_timer2 = 10;
}
}
if (_gm->_state.powerOff) {
if (this->isSectionVisible(kMaxSection - 1)) {
_vm->renderText("Energievorrat ersch”pft", 97, 165, color);
_vm->renderText("Notstromversorgung aktiv", 97, 175, color);
} else {
if (this->isSectionVisible(21))
_vm->renderImage(this->getFileNumber(), 22);
else
_vm->renderImage(this->getFileNumber(), _gm->invertSection(22));
}
}
}
void ShipCockpit::onEntrance() {
if (!hasSeen())
_vm->renderMessage("Was?! Keiner im Cockpit!|Die sind wohl verrckt!");
setRoomSeen(true);
}
bool ShipCabinL2::interact(Action verb, Object &obj1, Object &obj2) {
if ((verb == ACTION_USE) && Object::combine(obj1, obj2, SLOT_KL1, KEYCARD2)) {
_gm->openLocker(this, this->getObject(4), this->getObject(0), 17);
if (this->getObject(5)->_click == 255)
_vm->renderImage(this->getFileNumber(), 20); // Remove Pistol
_gm->great(2);
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, SLOT_KL2, KEYCARD2)) {
_gm->openLocker(this, this->getObject(6), this->getObject(1), 18);
_gm->great(2);
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, SLOT_KL3, KEYCARD2)) {
_gm->openLocker(this, this->getObject(8), this->getObject(2), 19);
if (this->getObject(9)->_click == 255)
_vm->renderImage(this->getFileNumber(), 21); // Remove cable spool
_gm->great(2);
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, SLOT_KL4, KEYCARD2)) {
_gm->openLocker(this, this->getObject(10), this->getObject(3), 22);
if (this->getObject(11)->_click == 255)
_vm->renderImage(this->getFileNumber(), 23); // Remove book
_gm->great(2);
}
else if ((verb == ACTION_CLOSE) && (obj1._id == SHELF_L1)) {
_gm->closeLocker(this, this->getObject(4), this->getObject(0), 17);
this->setSectionVisible(20, false);
} else if ((verb == ACTION_CLOSE) && (obj1._id == SHELF_L2))
_gm->closeLocker(this, this->getObject(6), this->getObject(1), 18);
else if ((verb == ACTION_CLOSE) && (obj1._id == SHELF_L3)) {
_gm->closeLocker(this, this->getObject(8), this->getObject(2), 19);
this->setSectionVisible(21, false);
} else if ((verb == ACTION_CLOSE) && (obj1._id == SHELF_L4)) {
_gm->closeLocker(this, this->getObject(10), this->getObject(3), 22);
this->setSectionVisible(23, false);
}
else if ((verb == ACTION_TAKE) && (obj1._id == SPOOL) &&
!(obj1.hasProperty(CARRIED))) {
this->getObject(8)->_click = 42; // empty shelf
return false;
} else if ((verb == ACTION_TAKE) && (obj1._id == BOOK2) &&
!(obj1.hasProperty(CARRIED))) {
this->getObject(10)->_click = 47; // empty shelf
return false;
} else
return false;
return true;
}
bool ShipCabinL3::interact(Action verb, Object &obj1, Object &obj2) {
Room *r;
if ((verb == ACTION_USE) && Object::combine(obj1, obj2, RECORD, TURNTABLE)) {
if (this->isSectionVisible(kMaxSection - 1) || this->isSectionVisible(15))
_vm->renderMessage("Du hast die Platte schon aufgelegt.");
else {
if (!this->getObject(4)->hasProperty(CARRIED))
_vm->renderImage(this->getFileNumber(), _gm->invertSection(8));
else
_gm->_inventory.remove(*this->getObject(4));
_vm->renderImage(this->getFileNumber(), 15);
this->getObject(4)->_click = 48;
}
} else if ((verb == ACTION_PRESS) && (obj1._id == TURNTABLE_BUTTON)) {
if (!this->isSectionVisible(15)) {
_vm->renderMessage("Es ist doch gar keine Platte aufgelegt.");
} else if (!this->isSectionVisible(10) &&
!this->isSectionVisible(11) &&
this->isSectionVisible(12)) {
if (_gm->_soundDevice != 2) {
_vm->renderImage(this->getFileNumber(), 14);
this->setSectionVisible(15, false);
for (int i = 3; i; i--) {
_vm->playSound(48, 13530);
if (_gm->_soundDevice) {
do {
if (this->isSectionVisible(13)) {
_vm->renderImage(this->getFileNumber(), 14);
this->setSectionVisible(13, false);
} else {
_vm->renderImage(this->getFileNumber(), 13);
this->setSectionVisible(14, false);
}
_gm->wait2(3);
} while (_gm->_status);
} else {
_gm->wait2(1);
}
}
} else {
for (int i = 10; i; i--) {
_vm->renderImage(this->getFileNumber(), 14);
_gm->wait2(3);
_vm->renderImage(this->getFileNumber(), 13);
_gm->wait2(3);
}
}
_vm->renderImage(this->getFileNumber(), 15);
this->setSectionVisible(14, false);
this->setSectionVisible(13, false);
_vm->renderMessage("Die Platte scheint einen Sprung zu haben.");
}
} else if ((verb == ACTION_TAKE) && (obj1._id == RECORD) &&
(obj1._click != 15)) {
_vm->renderImage(this->getFileNumber(), 9);
this->setSectionVisible(13, false);
this->setSectionVisible(14, false);
this->setSectionVisible(15, false);
obj1._section = 0;
_gm->takeObject(obj1);
} else if ((verb == ACTION_PULL) && (obj1._id == PLUG)) {
_vm->renderImage(this->getFileNumber(), 10);
this->setSectionVisible(7, false);
obj1._click = 21;
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, PLUG, SOCKET)) {
_vm->renderImage(this->getFileNumber(), 7);
this->setSectionVisible(10, false);
this->getObject(10)->_click = 20;
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, KNIFE, WIRE2))
_vm->renderMessage("Schneid doch besser ein|l„ngeres Stck Kabel ab!");
else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, KNIFE, WIRE)) {
r = &_gm->_rooms[AIRLOCK];
if (!this->isSectionVisible(10) && !r->getObject(5)->hasProperty(WORN)) {
_vm->renderImage(this->getFileNumber(), 25);
_gm->shock();
}
_vm->renderImage(this->getFileNumber(), 11);
_vm->renderImage(this->getFileNumber(), 26);
this->setSectionVisible(12, false);
} else if ((verb == ACTION_TAKE) &&
((obj1._id == WIRE) || (obj1._id == WIRE2) || (obj1._id == PLUG))) {
if (this->isSectionVisible(10) && this->isSectionVisible(11)) {
_vm->renderImage(this->getFileNumber(), _gm->invertSection(10));
_vm->renderImage(this->getFileNumber(), _gm->invertSection(11));
this->getObject(8)->_name = "Leitung mit Stecker";
_gm->takeObject(*this->getObject(8));
this->getObject(9)->_click = 255;
this->getObject(10)->_click = 255;
} else {
_vm->renderMessage("Das ist befestigt.");
}
} else {
return false;
}
return true;
}
bool ShipCabinR3::interact(Action verb, Object &obj1, Object &obj2) {
if ((verb == ACTION_USE) && Object::combine(obj1, obj2, SLOT_K1, KEYCARD)) {
_gm->openLocker(this, this->getObject(6), this->getObject(2), 9);
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, SLOT_K2, KEYCARD)) {
_gm->openLocker(this, this->getObject(8), this->getObject(3), 10);
if (this->getObject(9)->_click == 255)
_vm->renderImage(this->getFileNumber(), 12); // Remove rope
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, SLOT_K3, KEYCARD)) {
_gm->openLocker(this, this->getObject(10), this->getObject(4), 11);
if (this->getObject(17)->_click == 255)
_vm->renderImage(this->getFileNumber(), 16); // Remove Discman
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, SLOT_K4, KEYCARD)) {
_gm->openLocker(this, this->getObject(15), this->getObject(5), 13);
if (this->getObject(16)->_click == 255)
_vm->renderImage(this->getFileNumber(), 14); // Remove book
}
else if ((verb == ACTION_CLOSE) && (obj1._id == SHELF1))
_gm->closeLocker(this, this->getObject(6), this->getObject(2), 9);
else if ((verb == ACTION_CLOSE) && (obj1._id == SHELF2)) {
this->setSectionVisible(12, false);
_gm->closeLocker(this, this->getObject(8), this->getObject(3), 10);
} else if ((verb == ACTION_CLOSE) && (obj1._id == SHELF3)) {
this->setSectionVisible(16, false);
_gm->closeLocker(this, this->getObject(10), this->getObject(4), 11);
} else if ((verb == ACTION_CLOSE) && (obj1._id == SHELF4)) {
this->setSectionVisible(14, false);
this->setSectionVisible(14, false);
_gm->closeLocker(this, this->getObject(15), this->getObject(5), 13);
}
else if ((verb == ACTION_TAKE) && (obj1._id == DISCMAN) &&
!_gm->_rooms[0].getObject(3)->hasProperty(CARRIED)) {
this->getObject(10)->_click = 34; // Locker empty
obj1._click = 255;
_gm->takeObject(*_gm->_rooms[0].getObject(3));
_vm->renderImage(this->getFileNumber(), 16);
} else if ((verb == ACTION_TAKE) && (obj1._id == ROPE) &&
obj1.hasProperty(CARRIED)) {
this->getObject(8)->_click = 31; // Shelf empty
return false;
} else if ((verb == ACTION_TAKE) && (obj1._id == BOOK) &&
!obj1.hasProperty(CARRIED)) {
this->getObject(15)->_click = 32; // Shelf empty
return false;
} else
return false;
return true;
}
bool ShipAirlock::interact(Action verb, Object &obj1, Object &obj2) {
Room *r;
if ((verb == ACTION_PRESS) && (obj1._id == BUTTON1)) {
if (!this->getObject(1)->hasProperty(OPENED)) {
_vm->renderImage(this->getFileNumber(), 10);
_vm->playSound(54, 24020);
if (this->getObject(0)->hasProperty(OPENED)) {
this->getObject(0)->disableProperty(OPENED);
_vm->renderImage(this->getFileNumber(), 1);
_gm->wait2(2);
_vm->renderImage(this->getFileNumber(), 2);
this->setSectionVisible(1, false);
_gm->wait2(2);
_vm->renderImage(this->getFileNumber(), 3);
this->setSectionVisible(2, false);
} else {
this->getObject(0)->setProperty(OPENED);
_vm->renderImage(this->getFileNumber(), 2);
this->setSectionVisible(3, false);
_gm->wait2(2);
_vm->renderImage(this->getFileNumber(), 1);
this->setSectionVisible(2, false);
_gm->wait2(2);
_vm->renderImage(this->getFileNumber(), 1 + 128);
}
_vm->renderImage(this->getFileNumber(), _gm->invertSection(10));
}
} else if ((verb == ACTION_PRESS) && (obj1._id == BUTTON2)) {
if (!this->getObject(0)->hasProperty(OPENED)) {
_vm->renderImage(this->getFileNumber(), 11);
if (this->getObject(1)->hasProperty(OPENED)) {
_vm->playSound(54, 24020);
this->getObject(1)->disableProperty(OPENED);
_vm->renderImage(this->getFileNumber(), 4);
_gm->wait2(2);
_vm->renderImage(this->getFileNumber(), 5);
this->setSectionVisible(4, false);
_gm->wait2(2);
_vm->renderImage(this->getFileNumber(), 6);
this->setSectionVisible(5, false);
_vm->renderImage(this->getFileNumber(), 16);
this->setSectionVisible(17, false);
_gm->wait2(3);
_vm->renderImage(this->getFileNumber(), 15);
this->setSectionVisible(16, false);
_gm->wait2(3);
_vm->renderImage(this->getFileNumber(), 14);
this->setSectionVisible(15, false);
_gm->wait2(3);
_vm->renderImage(this->getFileNumber(), 13);
this->setSectionVisible(14, false);
_gm->wait2(3);
_vm->renderImage(this->getFileNumber(), 12);
this->setSectionVisible(13, false);
_gm->wait2(3);
_vm->renderImage(this->getFileNumber(), _gm->invertSection(12));
} else {
this->getObject(1)->setProperty(OPENED);
_vm->renderImage(this->getFileNumber(), 12);
_gm->wait2(3);
_vm->renderImage(this->getFileNumber(), 13);
this->setSectionVisible(12, false);
_gm->wait2(3);
_vm->renderImage(this->getFileNumber(), 14);
this->setSectionVisible(13, false);
_gm->wait2(3);
_vm->renderImage(this->getFileNumber(), 15);
this->setSectionVisible(14, false);
_gm->wait2(3);
_vm->renderImage(this->getFileNumber(), 16);
this->setSectionVisible(15, false);
_gm->wait2(3);
_vm->renderImage(this->getFileNumber(), 17);
this->setSectionVisible(16, false);
_vm->playSound(54, 24020);
_vm->renderImage(this->getFileNumber(), 5);
this->setSectionVisible(6, false);
_gm->wait2(2);
_vm->renderImage(this->getFileNumber(), 4);
this->setSectionVisible(5, false);
_gm->wait2(2);
_vm->renderImage(this->getFileNumber(), _gm->invertSection(4));
r = &_gm->_rooms[AIRLOCK];
if (!r->getObject(4)->hasProperty(WORN) ||
!r->getObject(5)->hasProperty(WORN) ||
!r->getObject(6)->hasProperty(WORN)) {
// longjmp(dead, "Zu niedriger Luftdruck soll ungesund sein.");
}
}
_vm->renderImage(this->getFileNumber(), 11 + 128);
}
} else if ((verb == ACTION_LOOK) && (obj1._id == MANOMETER)) {
if (this->getObject(1)->hasProperty(OPENED))
_vm->renderMessage("Er zeigt Null an.");
else
_vm->renderMessage("Er zeigt Normaldruck an.");
} else
return false;
return true;
}
void ShipAirlock::onEntrance() {
if (!this->hasSeen())
_vm->renderMessage("Komisch, es ist nur|noch ein Raumanzug da.");
this->setRoomSeen(true);
}
bool ShipHold::interact(Action verb, Object &obj1, Object &obj2) {
static char beschr2[] = "Ein Stck Schrott.";
Room *r;
if ((verb == ACTION_LOOK) && (obj1._id == SCRAP_LK) &&
(obj1._description != beschr2)) {
_vm->renderMessage(obj1._description);
obj1._description = beschr2;
_gm->takeObject(*this->getObject(2));
} else if (((verb == ACTION_OPEN) || (verb == ACTION_CLOSE)) &&
(obj1._id == OUTERHATCH_TOP)) {
_vm->renderMessage("Du muát erst hingehen.");
} else if ((verb == ACTION_CLOSE) && (obj1._id == LANDINGMOD_HATCH) &&
(this->isSectionVisible(4) || this->isSectionVisible(6)))
_vm->renderMessage("Das Kabel ist im Weg.");
else if (((verb == ACTION_TAKE) && (obj1._id == HOLD_WIRE)) ||
((verb == ACTION_USE) && Object::combine(obj1, obj2, HOLD_WIRE, LANDINGMOD_HATCH)))
_vm->renderMessage("Das Kabel ist schon ganz|richtig an dieser Stelle.");
else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, TERMINALSTRIP, HOLD_WIRE)) {
this->getObject(0)->_name = "Leitung mit Lsterklemme";
_gm->_inventory.remove(*this->getObject(2));
_gm->_state.terminalStripConnected = true;
_gm->_state.terminalStripWire = true;
_vm->renderMessage("Ok.");
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, HOLD_WIRE, SPOOL)) {
if (!_gm->_state.terminalStripConnected)
_vm->renderMessage("Womit denn?");
else {
_vm->renderImage(this->getFileNumber(), 5);
this->getObject(0)->_name = "langes Kabel mit Stecker";
this->getObject(0)->_click = 10;
r = &_gm->_rooms[CABIN_L2];
_gm->_inventory.remove(*this->getObject(9));
}
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, HOLD_WIRE, GENERATOR_TOP)) {
if (this->isSectionVisible(5)) {
r = &_gm->_rooms[GENERATOR];
r->getObject(0)->_click = 15;
r->getObject(1)->_click = 13;
r->setSectionVisible(6, false);
r->setSectionVisible(8, false);
_vm->renderImage(this->getFileNumber(), _gm->invertSection(5));
_vm->renderImage(this->getFileNumber(), 6);
this->setSectionVisible(4, false);
this->getObject(0)->_click = 11;
} else {
_vm->renderMessage("Die Leitung ist zu kurz.");
}
} else {
return false;
}
return true;
}
void ShipHold::onEntrance() {
if (!this->hasSeen())
_vm->renderMessage("Was ist denn das fr ein Chaos?|Und auáerdem fehlt das Notraumschiff!|Jetzt wird mir einiges klar.|Die anderen sind geflchtet,|und ich habe es verpennt.");
this->setRoomSeen(true);
_gm->_rooms[COCKPIT].setRoomSeen(true);
}
bool ShipLandingModule::interact(Action verb, Object &obj1, Object &obj2) {
Room *r;
if ((verb == ACTION_PRESS) && (obj1._id == LANDINGMOD_BUTTON))
_vm->renderMessage(obj1._description);
else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, PEN, LANDINGMOD_BUTTON)) {
if (_gm->_state.landingModuleEnergy) {
r = &_gm->_rooms[GENERATOR];
if (this->isSectionVisible(7)) {
_vm->renderImage(this->getFileNumber(), _gm->invertSection(9));
_vm->renderImage(this->getFileNumber(), _gm->invertSection(2));
_vm->renderImage(this->getFileNumber(), _gm->invertSection(8));
_vm->renderImage(this->getFileNumber(), _gm->invertSection(7));
_vm->renderImage(this->getFileNumber(), _gm->invertSection(10));
if (r->isSectionVisible(9))
_gm->_state.powerOff = true;
_gm->roomBrightness();
_vm->paletteBrightness();
} else {
_vm->renderImage(this->getFileNumber(), 7);
if (r->isSectionVisible(9))
_gm->_state.powerOff = false;
// load("MSN_DATA.025");
_gm->roomBrightness();
_vm->paletteBrightness();
r = &_gm->_rooms[SLEEP];
r->setSectionVisible(1, false);
r->setSectionVisible(2, false);
_gm->wait2(2);
_vm->renderImage(this->getFileNumber(), 2);
_gm->wait2(3);
_vm->renderImage(this->getFileNumber(), 8);
_gm->wait2(2);
_vm->renderImage(this->getFileNumber(), 9);
_gm->wait2(1);
_vm->renderImage(this->getFileNumber(), 10);
}
}
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, KNIFE, LANDINGMOD_BUTTON))
_vm->renderMessage("Es ist nicht spitz genug.");
else if ((verb == ACTION_LOOK) && (obj1._id == LANDINGMOD_MONITOR) &&
this->isSectionVisible(7))
_vm->renderMessage("Du wirst aus den Anzeigen nicht schlau.");
else if ((verb == ACTION_USE) && (obj1._id == KEYBOARD))
_vm->renderMessage("Laá lieber die Finger davon!");
else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, WIRE, LANDINGMOD_SOCKET)) {
r = &_gm->_rooms[CABIN_L3];
_gm->_inventory.remove(*r->getObject(8));
this->getObject(4)->_name = r->getObject(8)->_name;
_vm->renderImage(this->getFileNumber(), 4);
if (_gm->_state.cableConnected) {
_vm->renderImage(this->getFileNumber(), 5);
this->getObject(4)->_click = 6;
} else {
this->getObject(4)->_click = 5;
if (_gm->_state.terminalStripWire)
_vm->renderImage(this->getFileNumber(), 11);
}
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, SPOOL, LANDINGMOD_SOCKET))
_vm->renderMessage("An dem Kabel ist doch gar kein Stecker.");
else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, LANDINGMOD_WIRE, TERMINALSTRIP)) {
_vm->renderImage(this->getFileNumber(), 11);
this->getObject(4)->_name = "Leitung mit Lsterklemme";
r = &_gm->_rooms[HOLD];
_gm->_inventory.remove(*r->getObject(2));
_gm->_state.terminalStripConnected = true;
_gm->_state.terminalStripWire = true;
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, LANDINGMOD_WIRE, SPOOL)) {
if (!_gm->_state.terminalStripConnected)
_vm->renderMessage("Womit denn?");
else {
_vm->renderImage(this->getFileNumber(), 5);
this->getObject(4)->_name = "langes Kabel mit Stecker";
this->getObject(4)->_click = 6;
r = &_gm->_rooms[CABIN_L2];
_gm->_inventory.remove(*r->getObject(9));
}
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, LANDINGMOD_WIRE, LANDINGMOD_HATCH)) {
if (this->getObject(5)->hasProperty(OPENED)) {
r = &_gm->_rooms[HOLD];
if (this->isSectionVisible(5)) {
_gm->_rooms[HOLD].setSectionVisible(5, false);
r->getObject(0)->_click = 10;
} else
r->getObject(0)->_click = 9;
_gm->_rooms[HOLD].setSectionVisible(4, false);
r->getObject(0)->_name = this->getObject(4)->_name;
_vm->renderImage(this->getFileNumber(), _gm->invertSection(5));
_vm->renderImage(this->getFileNumber(), _gm->invertSection(4));
this->setSectionVisible(11, false);
_vm->renderImage(this->getFileNumber(), 6);
this->getObject(4)->_click = 7;
} else {
_vm->renderMessage("Du solltest die Luke vielleicht erst ”ffnen.");
}
} else if ((verb == ACTION_CLOSE) && (obj1._id == LANDINGMOD_HATCH) &&
this->isSectionVisible(6)) {
_vm->renderMessage("Das Kabel ist im Weg.");
} else if (((verb == ACTION_TAKE) || (verb == ACTION_PULL)) &&
(obj1._id == LANDINGMOD_WIRE)) {
_vm->renderMessage("Das Kabel ist schon ganz|richtig an dieser Stelle.");
} else {
return false;
}
return true;
}
bool ShipGenerator::interact(Action verb, Object &obj1, Object &obj2) {
Room *r;
if ((verb == ACTION_OPEN) && (obj1._id == OUTERHATCH)) {
if (obj1.hasProperty(OPENED))
return false;
_vm->playSound(54, 24020);
_vm->renderImage(this->getFileNumber(), 1);
if (this->isSectionVisible(7))
_vm->renderImage(this->getFileNumber(), 10);
if (this->isSectionVisible(13))
_vm->renderImage(this->getFileNumber(), 13);
_gm->_rooms[HOLD].setSectionVisible(3, true);
obj1.setProperty(OPENED);
obj1._click = 2;
_vm->playSound(54, 30030);
} else if ((verb == ACTION_CLOSE) && (obj1._id == OUTERHATCH)) {
if (!obj1.hasProperty(OPENED))
return false;
if (this->isSectionVisible(11) || this->isSectionVisible(12)) {
_vm->renderMessage("Das Seil ist im Weg.");
} else {
_vm->playSound(54, 24020);
_vm->renderImage(this->getFileNumber(), _gm->invertSection(1));
this->setSectionVisible(10, false);
if (this->isSectionVisible(13))
_vm->renderImage(this->getFileNumber(), 13);
_gm->_rooms[HOLD].setSectionVisible(3, false);
obj1.disableProperty(OPENED);
obj1._click = 1;
_vm->playSound(54, 31040);
}
} else if ((verb == ACTION_WALK) && (obj1._id == OUTERHATCH) &&
this->isSectionVisible(7)) {
if (!obj1.hasProperty(OPENED))
_vm->renderMessage("Das ist geschlossen.");
else if (!this->isSectionVisible(11))
_vm->renderMessage("Das geht nicht.|Die Luke ist mindestens|5 Meter ber dem Boden.");
else {
obj1._exitRoom = ROCKS;
return false;
}
} else if ((verb == ACTION_TAKE) && (obj1._id == KEYCARD2)) {
obj1._name = "Keycard des Commanders";
return false;
} else if ((verb == ACTION_TAKE) && (obj1._id == GENERATOR_WIRE))
_vm->renderMessage("Das Kabel ist schon ganz|richtig an dieser Stelle.");
else if ((verb == ACTION_PULL) && (obj1._id == SHORT_WIRE) &&
(obj1._click != 11)) {
_vm->renderImage(this->getFileNumber(), 3);
_vm->renderImage(this->getFileNumber(), 4);
obj1._click = 11;
_gm->turnOff();
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, SHORT_WIRE, CLIP) &&
(this->getObject(11)->_click == 11) && !this->isSectionVisible(9)) {
_vm->renderImage(this->getFileNumber(), 2);
this->setSectionVisible(3, false);
this->setSectionVisible(4, false);
this->getObject(11)->_click = 10;
if (_gm->_state.shipEnergy)
_gm->turnOn();
else
_vm->renderImage(this->getFileNumber(), 4);
} else if ((verb == ACTION_OPEN) && (obj1._id == TRAP)) {
_vm->playSound(54, 24020);
_vm->renderImage(this->getFileNumber(), 2);
if (this->getObject(11)->_click == 11)
_vm->renderImage(this->getFileNumber(), 3);
if (_gm->_state.powerOff)
_vm->renderImage(this->getFileNumber(), 4);
obj1.setProperty(OPENED);
obj1._click = 6;
obj1._click2 = 5;
_vm->playSound(54, 30030);
} else if ((verb == ACTION_CLOSE) && (obj1._id == TRAP)) {
if (this->isSectionVisible(9))
_vm->renderMessage("Das Kabel ist im Weg.");
else {
this->setSectionVisible(3, false);
return false;
}
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, GENERATOR_WIRE, CLIP) &&
this->isSectionVisible(3) && (this->getObject(0)->_click != 16)) {
_vm->renderImage(this->getFileNumber(), _gm->invertSection(8));
_vm->renderImage(this->getFileNumber(), 2);
this->setSectionVisible(4, false);
_vm->renderImage(this->getFileNumber(), 3);
_vm->renderImage(this->getFileNumber(), 9);
this->getObject(0)->_click = 16;
r = &_gm->_rooms[LANDINGMODULE];
if (_gm->_state.landingModuleEnergy && r->isSectionVisible(7))
_gm->turnOn();
else
_vm->renderImage(this->getFileNumber(), 4);
_gm->_rooms[HOLD].setSectionVisible(7, true);
_gm->great(3);
} else if ((verb == ACTION_PULL) && (obj1._id == GENERATOR_WIRE) &&
(obj1._click == 16)) {
_vm->renderImage(this->getFileNumber(), _gm->invertSection(9));
_vm->renderImage(this->getFileNumber(), 2);
_vm->renderImage(this->getFileNumber(), 3);
_vm->renderImage(this->getFileNumber(), 4);
_vm->renderImage(this->getFileNumber(), 8);
obj1._click = 15;
_gm->turnOff();
_gm->_rooms[HOLD].setSectionVisible(7, false);
} else if ((verb == ACTION_USE) &&
(Object::combine(obj1, obj2, WIRE, CLIP) ||
Object::combine(obj1, obj2, SPOOL, CLIP)) &&
this->isSectionVisible(3)) {
_vm->renderMessage("Was ntzt dir der Anschluá|ohne eine Stromquelle?!");
} else if ((verb == ACTION_LOOK) && (obj1._id == VOLTMETER)) {
if (_gm->_state.powerOff)
_vm->renderMessage("Die Spannung ist auf Null abgesunken.");
else
_vm->renderMessage("Es zeigt volle Spannung an.");
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, LADDER, ROPE)) {
_vm->renderImage(this->getFileNumber(), 13);
r = &_gm->_rooms[CABIN_R3];
_gm->_inventory.remove(*r->getObject(9));
this->getObject(3)->_click = 18;
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, OUTERHATCH, GENERATOR_ROPE)) {
if (!this->isSectionVisible(1))
_vm->renderMessage("Du muát die Luke erst ”ffnen.");
else {
_vm->renderImage(this->getFileNumber(), _gm->invertSection(13));
_vm->renderImage(this->getFileNumber(), 1);
if (this->isSectionVisible(7)) {
_vm->renderImage(this->getFileNumber(), 10);
_vm->renderImage(this->getFileNumber(), 11);
} else {
_vm->renderImage(this->getFileNumber(), 12);
}
r = &_gm->_rooms[OUTSIDE];
r->setSectionVisible(1, true);
r->getObject(1)->_click = 1;
this->getObject(3)->_click = 17;
}
} else if ((verb == ACTION_TAKE) && (obj1._id == GENERATOR_ROPE)) {
_vm->renderMessage("Das Seil ist hier schon ganz richtig.");
} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, OUTERHATCH, GENERATOR_WIRE) &&
this->isSectionVisible(1)) {
_vm->renderMessage("Das Kabel ist zu kurz.");
} else {
return false;
}
return true;
}
}

View file

@ -562,23 +562,23 @@ static const char *timeToString(int t) {
}
GameManager::GameManager(SupernovaEngine *vm, Common::Event *event) {
// _rooms[INTRO] = StartingItems();
// _rooms[CORRIDOR] = ShipCorridor();
// _rooms[HALL] = ShipHall();
// _rooms[SLEEP] = ShipSleepCabin();
// _rooms[COCKPIT] = ShipCockpit();
// _rooms[AIRLOCK] = ShipAirlock();
// _rooms[HOLD] = ShipHold();
// _rooms[LANDINGMODULE] = ShipLandingModule();
// _rooms[GENERATOR] = ShipGenerator();
// _rooms[OUTSIDE] = ShipOuterSpace();
// _rooms[CABIN_R1] = ShipCabinR1();
// _rooms[CABIN_R2] = ShipCabinR2();
// _rooms[CABIN_R3] = ShipCabinR3();
// _rooms[CABIN_L1] = ShipCabinL1();
// _rooms[CABIN_L2] = ShipCabinL2();
// _rooms[CABIN_L3] = ShipCabinL3();
// _rooms[BATHROOM] = ShipCabinBathroom();
_rooms[INTRO] = StartingItems(vm, this);
_rooms[CORRIDOR] = ShipCorridor(vm, this);
_rooms[HALL] = ShipHall(vm, this);
_rooms[SLEEP] = ShipSleepCabin(vm, this);
_rooms[COCKPIT] = ShipCockpit(vm, this);
_rooms[AIRLOCK] = ShipAirlock(vm, this);
_rooms[HOLD] = ShipHold(vm, this);
_rooms[LANDINGMODULE] = ShipLandingModule(vm, this);
_rooms[GENERATOR] = ShipGenerator(vm, this);
_rooms[OUTSIDE] = ShipOuterSpace(vm, this);
_rooms[CABIN_R1] = ShipCabinR1(vm, this);
_rooms[CABIN_R2] = ShipCabinR2(vm, this);
_rooms[CABIN_R3] = ShipCabinR3(vm, this);
_rooms[CABIN_L1] = ShipCabinL1(vm, this);
_rooms[CABIN_L2] = ShipCabinL2(vm, this);
_rooms[CABIN_L3] = ShipCabinL3(vm, this);
_rooms[BATHROOM] = ShipCabinBathroom(vm, this);
// _rooms[ROCKS]
// _rooms[CAVE]

View file

@ -146,6 +146,7 @@ public:
Room _rooms[kRoomsNum];
Inventory _inventory;
GameState _state;
int _status;
Action _inputVerb;
Object _inputObject[2];
bool _waitEvent;
@ -153,6 +154,8 @@ public:
bool _newOverlay;
int _timer1;
int _timer2;
// 0 PC Speaker | 1 SoundBlaster | 2 No Sound
int _soundDevice;
void takeObject(Object &obj);