/* 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 "common/system.h"

#include "supernova/supernova.h"
#include "supernova/state.h"

namespace Supernova {

void StartingItems::onEntrance() {
	for (int i = 0; i < 3; ++i)
		_gm->_inventory.add(*getObject(i));

	setRoomSeen(true);
	_gm->changeRoom(CABIN_R3);
}

bool ShipCorridor::interact(Action verb, Object &obj1, Object &obj2) {
	if ((verb == ACTION_PRESS) && (obj1._id == BUTTON)) {
		if (_objectState[6].hasProperty(OPENED)) {
			_vm->playSound(kAudioDoorSound);
			_objectState[6].disableProperty(OPENED);
			_gm->drawImage(8);
			setSectionVisible(9, false);
			_gm->wait2(2);
			_gm->drawImage(7);
			setSectionVisible(8, false);
			_gm->wait2(2);
			_gm->drawImage(_gm->invertSection(7));
		} else {
			_vm->playSound(kAudioDoorSound);
			_objectState[6].setProperty(OPENED);
			_gm->drawImage(7);
			_gm->wait2(2);
			_gm->drawImage(8);
			setSectionVisible(7, false);
			_gm->wait2(2);
			_gm->drawImage(9);
			setSectionVisible(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);
			_gm->drawImage(3);
			setSectionVisible(4, false);
			_gm->wait2(2);
			_gm->drawImage(2);
			setSectionVisible(3, false);
			_gm->wait2(2);
			_gm->drawImage(_gm->invertSection(2));
		} else {
			_objectState[2].setProperty(OPENED);
			_gm->drawImage(2);
			_gm->wait2(2);
			_gm->drawImage(3);
			setSectionVisible(2, false);
			_gm->wait2(2);
			_gm->drawImage(4);
			setSectionVisible(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)) {
		setSectionVisible(kMaxSection - 1, true);
		setSectionVisible(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 (isSectionVisible(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 (uint 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);
			setSectionVisible(5, true);
		}
        escape:
		_vm->renderRoom(*this);
		_gm->showMenu();
		_gm->drawMapExits();
		_gm->palette();
		setSectionVisible(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) || !isSectionVisible(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();
			_gm->drawImage(_gm->invertSection(5));
			_gm->drawImage(_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) {
				_gm->drawImage(3);
				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(kAudioCrash);
				_gm->screenShake();
				_gm->wait2(18);
				_vm->renderMessage("Was war das?");
			}
		}
	} else {
		return false;
	}

	return true;
}

void ShipSleepCabin::animation() {
	static char color;

	if (!_gm->_guiEnabled) {
		if (color) {
			color = kColorBlack;
			_gm->setAnimationTimer(5);
		} else {
			color = kColorLightYellow;
			_gm->setAnimationTimer(10);
		}
		_vm->renderText("Achtung: Triebwerke funktionsunfähig",50,145,color);
	} else {
		if (isSectionVisible(21)) {
			_gm->drawImage(_gm->invertSection(21));
			_gm->setAnimationTimer(5);
		} else {
			_gm->drawImage(21);
			_gm->setAnimationTimer(10);
		}
	}
	if (_gm->_state.powerOff) {
		if (!_gm->_guiEnabled) {
			_vm->renderText("Energievorrat erschöpft",97,165,color);
			_vm->renderText("Notstromversorgung aktiv",97,175,color);
		} else {
			if (isSectionVisible(21)) {
				_gm->drawImage(22);
			} else {
				_gm->drawImage(_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;
	}
	setRoomSeen(true);
}

bool ShipCockpit::interact(Action verb, Object &obj1, Object &obj2) {
	// TODO: distance and remaining time not accurate
	char c[2] = {0};

	if ((verb == ACTION_LOOK) && (obj1._id == MONITOR)) {
		_gm->_guiEnabled = false;
		    _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.timeStarting / 7200000).c_str());
			_vm->renderText(",");
			c[0] = (_gm->_state.timeStarting / 720000) % 10 + '0';
			_vm->renderText(c);
			c[0] = (_gm->_state.timeStarting / 72000) % 10 + '0';
			_vm->renderText(c);
			_vm->renderText(" Lichtjahre");
			_vm->renderText("Dauer der Reise bei momentaner Geschwindigkeit:", 50, 110, kColorLightYellow);
			_vm->renderText(Common::String::format("%d", _gm->_state.timeStarting / 18000).c_str(), 50, 120, kColorLightYellow);
			_vm->renderText(" Tage");

		while (!_gm->_guiEnabled) {
			_vm->updateEvents();
			if (_gm->_key || _gm->_mouseClicked) {
				_gm->_guiEnabled = true;
			}
			g_system->updateScreen();
			g_system->delayMillis(_vm->_delay);
		}
	} 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 byte color;

	if (!_gm->_guiEnabled) {
		if (color) {
			color = kColorBlack;
			_gm->setAnimationTimer(5);
		} else {
			color = kColorLightYellow;
			_gm->setAnimationTimer(10);
		}
		_vm->renderText("Achtung: Triebwerke funktionsunf„hig", 50, 145, color);
	} else {
		if (isSectionVisible(21)) {
			_gm->drawImage(_gm->invertSection(21));
			_gm->setAnimationTimer(5);
		} else {
			_gm->drawImage(21);
			_gm->setAnimationTimer(10);
		}
	}
	if (_gm->_state.powerOff) {
		if (!_gm->_guiEnabled) {
			_vm->renderText("Energievorrat ersch”pft", 97, 165, color);
			_vm->renderText("Notstromversorgung aktiv", 97, 175, color);
		} else {
			if (isSectionVisible(21))
				_gm->drawImage(22);
			else
				_gm->drawImage(_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, getObject(4), getObject(0), 17);
		if (getObject(5)->_click == 255)
			_gm->drawImage(20); // Remove Pistol
		_gm->great(2);
	} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, SLOT_KL2, KEYCARD2)) {
		_gm->openLocker(this, getObject(6), getObject(1), 18);
		_gm->great(2);
	} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, SLOT_KL3, KEYCARD2)) {
		_gm->openLocker(this, getObject(8), getObject(2), 19);
		if (getObject(9)->_click == 255)
			_gm->drawImage(21); // Remove cable spool
		_gm->great(2);
	} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, SLOT_KL4, KEYCARD2)) {
		_gm->openLocker(this, getObject(10), getObject(3), 22);
		if (getObject(11)->_click == 255)
			_gm->drawImage(23); // Remove book
		_gm->great(2);
	}

	else if ((verb == ACTION_CLOSE) && (obj1._id == SHELF_L1)) {
		_gm->closeLocker(this, getObject(4), getObject(0), 17);
		setSectionVisible(20, false);
	} else if ((verb == ACTION_CLOSE) && (obj1._id == SHELF_L2))
		_gm->closeLocker(this, getObject(6), getObject(1), 18);
	else if ((verb == ACTION_CLOSE) && (obj1._id == SHELF_L3)) {
		_gm->closeLocker(this, getObject(8), getObject(2), 19);
		setSectionVisible(21, false);
	} else if ((verb == ACTION_CLOSE) && (obj1._id == SHELF_L4)) {
		_gm->closeLocker(this, getObject(10), getObject(3), 22);
		setSectionVisible(23, false);
	}

	else if ((verb == ACTION_TAKE) && (obj1._id == SPOOL) &&
	         !(obj1.hasProperty(CARRIED))) {
		getObject(8)->_click = 42;  // empty shelf
		return false;
	} else if ((verb == ACTION_TAKE) && (obj1._id == BOOK2) &&
	           !(obj1.hasProperty(CARRIED))) {
		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 (isSectionVisible(kMaxSection - 1) || isSectionVisible(15))
			_vm->renderMessage("Du hast die Platte schon aufgelegt.");
		else {
			if (!getObject(4)->hasProperty(CARRIED))
				_gm->drawImage(_gm->invertSection(8));
			else
				_gm->_inventory.remove(*getObject(4));
			_gm->drawImage(15);
			getObject(4)->_click = 48;
		}
	} else if ((verb == ACTION_PRESS) && (obj1._id == TURNTABLE_BUTTON)) {
		if (!isSectionVisible(15)) {
			_vm->renderMessage("Es ist doch gar keine Platte aufgelegt.");
		} else if (!isSectionVisible(10) &&
		           !isSectionVisible(11) &&
		            isSectionVisible(12)) {
			if (_gm->_soundDevice != 2) {
				_gm->drawImage(14);
				setSectionVisible(15, false);
				for (int i = 3; i; i--) {
					_vm->playSound(kAudioTurntable);
					if (_gm->_soundDevice) {
						do {
							if (isSectionVisible(13)) {
								_gm->drawImage(14);
								setSectionVisible(13, false);
							} else {
								_gm->drawImage(13);
								setSectionVisible(14, false);
							}
							_gm->wait2(3);
						} while (_gm->_status);
					} else {
						_gm->wait2(1);
					}
				}
			} else {
				for (int i = 10; i; i--) {
					_gm->drawImage(14);
					_gm->wait2(3);
					_gm->drawImage(13);
					_gm->wait2(3);
				}
			}
			_gm->drawImage(15);
			setSectionVisible(14, false);
			setSectionVisible(13, false);
			_vm->renderMessage("Die Platte scheint einen Sprung zu haben.");
		}
	} else if ((verb == ACTION_TAKE) && (obj1._id == RECORD) &&
	           (obj1._click != 15)) {
		_gm->drawImage(9);
		setSectionVisible(13, false);
		setSectionVisible(14, false);
		setSectionVisible(15, false);
		obj1._section = 0;
		_gm->takeObject(obj1);
	} else if ((verb == ACTION_PULL) && (obj1._id == PLUG)) {
		_gm->drawImage(10);
		setSectionVisible(7, false);
		obj1._click = 21;
	} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, PLUG, SOCKET)) {
		_gm->drawImage(7);
		setSectionVisible(10, false);
		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 (!isSectionVisible(10) && !r->getObject(5)->hasProperty(WORN)) {
			_gm->drawImage(25);
			_gm->shock();
		}
		_gm->drawImage(11);
		_gm->drawImage(26);
		setSectionVisible(12, false);
	} else if ((verb == ACTION_TAKE) &&
	           ((obj1._id == WIRE) || (obj1._id == WIRE2) || (obj1._id == PLUG))) {
		if (isSectionVisible(10) && isSectionVisible(11)) {
			_gm->drawImage(_gm->invertSection(10));
			_gm->drawImage(_gm->invertSection(11));
			getObject(8)->_name = "Leitung mit Stecker";
			_gm->takeObject(*getObject(8));
			getObject(9)->_click = 255;
			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, getObject(6), getObject(2), 9);
	} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, SLOT_K2, KEYCARD)) {
		_gm->openLocker(this, getObject(8), getObject(3), 10);
		if (getObject(9)->_click == 255)
			_gm->drawImage(12); // Remove rope
	} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, SLOT_K3, KEYCARD)) {
		_gm->openLocker(this, getObject(10), getObject(4), 11);
		if (getObject(17)->_click == 255)
			_gm->drawImage(16); // Remove Discman
	} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, SLOT_K4, KEYCARD)) {
		_gm->openLocker(this, getObject(15), getObject(5), 13);
		if (getObject(16)->_click == 255)
			_gm->drawImage(14); // Remove Book
	}

	else if ((verb == ACTION_CLOSE) && (obj1._id == SHELF1))
		_gm->closeLocker(this, getObject(6), getObject(2), 9);
	else if ((verb == ACTION_CLOSE) && (obj1._id == SHELF2)) {
		setSectionVisible(12, false);
		_gm->closeLocker(this, getObject(8), getObject(3), 10);
	} else if ((verb == ACTION_CLOSE) && (obj1._id == SHELF3)) {
		setSectionVisible(16, false);
		_gm->closeLocker(this, getObject(10), getObject(4), 11);
	} else if ((verb == ACTION_CLOSE) && (obj1._id == SHELF4)) {
		setSectionVisible(14, false);
		setSectionVisible(14, false);
		_gm->closeLocker(this, getObject(15), getObject(5), 13);
	}

	else if ((verb == ACTION_TAKE) && (obj1._id == DISCMAN) &&
	         !_gm->_rooms[0]->getObject(3)->hasProperty(CARRIED)) {
		getObject(10)->_click = 34; // Locker empty
		obj1._click = 255;
		_gm->takeObject(*_gm->_rooms[0]->getObject(3));
		_gm->drawImage(16);
	} else if ((verb == ACTION_TAKE) && (obj1._id == ROPE) &&
	           obj1.hasProperty(CARRIED)) {
		getObject(8)->_click = 31; // Shelf empty
		return false;
	} else if ((verb == ACTION_TAKE) && (obj1._id == BOOK) &&
	           !obj1.hasProperty(CARRIED)) {
		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 (!getObject(1)->hasProperty(OPENED)) {
			_gm->drawImage(10);
			_vm->playSound(kAudioDoorSound);
			if (getObject(0)->hasProperty(OPENED)) {
				getObject(0)->disableProperty(OPENED);
				_gm->drawImage(1);
				_gm->wait2(2);
				_gm->drawImage(2);
				setSectionVisible(1, false);
				_gm->wait2(2);
				_gm->drawImage(3);
				setSectionVisible(2, false);
			} else {
				getObject(0)->setProperty(OPENED);
				_gm->drawImage(2);
				setSectionVisible(3, false);
				_gm->wait2(2);
				_gm->drawImage(1);
				setSectionVisible(2, false);
				_gm->wait2(2);
				_gm->drawImage(_gm->invertSection(1));
			}
			_gm->drawImage(_gm->invertSection(10));
		}
	} else if ((verb == ACTION_PRESS) && (obj1._id == BUTTON2)) {
		if (!getObject(0)->hasProperty(OPENED)) {
			_gm->drawImage(11);
			if (getObject(1)->hasProperty(OPENED)) {
				_vm->playSound(kAudioDoorSound);
				getObject(1)->disableProperty(OPENED);
				_gm->drawImage(4);
				_gm->wait2(2);
				_gm->drawImage(5);
				setSectionVisible(4, false);
				_gm->wait2(2);
				_gm->drawImage(6);
				setSectionVisible(5, false);
				_gm->drawImage(16);
				setSectionVisible(17, false);
				_gm->wait2(3);
				_gm->drawImage(15);
				setSectionVisible(16, false);
				_gm->wait2(3);
				_gm->drawImage(14);
				setSectionVisible(15, false);
				_gm->wait2(3);
				_gm->drawImage(13);
				setSectionVisible(14, false);
				_gm->wait2(3);
				_gm->drawImage(12);
				setSectionVisible(13, false);
				_gm->wait2(3);
				_gm->drawImage(_gm->invertSection(12));
			} else {
				getObject(1)->setProperty(OPENED);
				_gm->drawImage(12);
				_gm->wait2(3);
				_gm->drawImage(13);
				setSectionVisible(12, false);
				_gm->wait2(3);
				_gm->drawImage(14);
				setSectionVisible(13, false);
				_gm->wait2(3);
				_gm->drawImage(15);
				setSectionVisible(14, false);
				_gm->wait2(3);
				_gm->drawImage(16);
				setSectionVisible(15, false);
				_gm->wait2(3);
				_gm->drawImage(17);
				setSectionVisible(16, false);
				_vm->playSound(kAudioDoorSound);
				_gm->drawImage(5);
				setSectionVisible(6, false);
				_gm->wait2(2);
				_gm->drawImage(4);
				setSectionVisible(5, false);
				_gm->wait2(2);
				_gm->drawImage(_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.");
				}
			}
			_gm->drawImage(_gm->invertSection(11));
		}
	} else if ((verb == ACTION_LOOK) && (obj1._id == MANOMETER)) {
		if (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 (!hasSeen())
		_vm->renderMessage("Komisch, es ist nur|noch ein Raumanzug da.");

	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(*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) &&
	           (isSectionVisible(4) || 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)) {
		getObject(0)->_name = "Leitung mit Lsterklemme";
		_gm->_inventory.remove(*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 {
			_gm->drawImage(5);
			getObject(0)->_name = "langes Kabel mit Stecker";
			getObject(0)->_click = 10;
			r = _gm->_rooms[CABIN_L2];
			_gm->_inventory.remove(*getObject(9));
		}
	} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, HOLD_WIRE, GENERATOR_TOP)) {
		if (isSectionVisible(5)) {
			r = _gm->_rooms[GENERATOR];
			r->getObject(0)->_click = 15;
			r->getObject(1)->_click = 13;
			r->setSectionVisible(6, false);
			r->setSectionVisible(8, false);
			_gm->drawImage(_gm->invertSection(5));
			_gm->drawImage(6);
			setSectionVisible(4, false);
			getObject(0)->_click = 11;
		} else {
			_vm->renderMessage("Die Leitung ist zu kurz.");
		}
	} else {
		return false;
	}

	return true;
}

void ShipHold::onEntrance() {
	if (!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.");
	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 (isSectionVisible(7)) {
				_gm->drawImage(_gm->invertSection(9));
				_gm->drawImage(_gm->invertSection(2));
				_gm->drawImage(_gm->invertSection(8));
				_gm->drawImage(_gm->invertSection(7));
				_gm->drawImage(_gm->invertSection(10));
				if (r->isSectionVisible(9))
					_gm->_state.powerOff = true;
				_gm->roomBrightness();
				_vm->paletteBrightness();
			} else {
				_gm->drawImage(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);
				_gm->drawImage(2);
				_gm->wait2(3);
				_gm->drawImage(8);
				_gm->wait2(2);
				_gm->drawImage(9);
				_gm->wait2(1);
				_gm->drawImage(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) &&
	         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));
		getObject(4)->_name = r->getObject(8)->_name;
		_gm->drawImage(4);
		if (_gm->_state.cableConnected) {
			_gm->drawImage(5);
			getObject(4)->_click = 6;
		} else {
			getObject(4)->_click = 5;
			if (_gm->_state.terminalStripWire)
				_gm->drawImage(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)) {
		_gm->drawImage(11);
		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 {
			_gm->drawImage(5);
			getObject(4)->_name = "langes Kabel mit Stecker";
			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 (getObject(5)->hasProperty(OPENED)) {
			r = _gm->_rooms[HOLD];
			if (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 = getObject(4)->_name;
			_gm->drawImage(_gm->invertSection(4));
			_gm->drawImage(_gm->invertSection(5));
			setSectionVisible(11, false);
			_gm->drawImage(6);
			getObject(4)->_click = 7;
		} else {
			_vm->renderMessage("Du solltest die Luke vielleicht erst ”ffnen.");
		}
	} else if ((verb == ACTION_CLOSE) && (obj1._id == LANDINGMOD_HATCH) &&
	           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(kAudioDoorSound);
		_gm->drawImage(1);
		if (isSectionVisible(7))
			_gm->drawImage(10);
		if (isSectionVisible(13))
			_gm->drawImage(13);
		_gm->_rooms[HOLD]->setSectionVisible(3, true);
		obj1.setProperty(OPENED);
		obj1._click = 2;
		_vm->playSound(kAudioDoorOpen);
	} else if ((verb == ACTION_CLOSE) && (obj1._id == OUTERHATCH)) {
		if (!obj1.hasProperty(OPENED))
			return false;
		if (isSectionVisible(11) || isSectionVisible(12)) {
			_vm->renderMessage("Das Seil ist im Weg.");
		} else {
			_vm->playSound(kAudioDoorSound);
			_gm->drawImage(_gm->invertSection(1));
			setSectionVisible(10, false);
			if (isSectionVisible(13))
				_gm->drawImage(13);
			_gm->_rooms[HOLD]->setSectionVisible(3, false);
			obj1.disableProperty(OPENED);
			obj1._click = 1;
			_vm->playSound(kAudioDoorClose);
		}
	} else if ((verb == ACTION_WALK) && (obj1._id == OUTERHATCH) &&
	           isSectionVisible(7)) {
		if (!obj1.hasProperty(OPENED))
			_vm->renderMessage("Das ist geschlossen.");
		else if (!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)) {
		_gm->drawImage(3);
		_gm->drawImage(4);
		obj1._click = 11;
		_gm->turnOff();
	} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, SHORT_WIRE, CLIP) &&
	           (getObject(11)->_click == 11) && !isSectionVisible(9)) {
		_gm->drawImage(2);
		setSectionVisible(3, false);
		setSectionVisible(4, false);
		getObject(11)->_click = 10;
		if (_gm->_state.shipEnergy)
			_gm->turnOn();
		else
			_gm->drawImage(4);
	} else if ((verb == ACTION_OPEN) && (obj1._id == TRAP)) {
		_vm->playSound(kAudioDoorSound);
		_gm->drawImage(2);
		if (getObject(11)->_click == 11)
			_gm->drawImage(3);
		if (_gm->_state.powerOff)
			_gm->drawImage(4);
		obj1.setProperty(OPENED);
		obj1._click = 6;

		obj1._click2 = 5;
		_vm->playSound(kAudioDoorOpen);
	} else if ((verb == ACTION_CLOSE) && (obj1._id == TRAP)) {
		if (isSectionVisible(9))
			_vm->renderMessage("Das Kabel ist im Weg.");
		else {
			setSectionVisible(3, false);
			return false;
		}
	} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, GENERATOR_WIRE, CLIP) &&
	           isSectionVisible(3) && (getObject(0)->_click != 16)) {
		_gm->drawImage(_gm->invertSection(8));
		_gm->drawImage(2);
		setSectionVisible(4, false);
		_gm->drawImage(3);
		_gm->drawImage(9);
		getObject(0)->_click = 16;
		r = _gm->_rooms[LANDINGMODULE];
		if (_gm->_state.landingModuleEnergy && r->isSectionVisible(7))
			_gm->turnOn();
		else
		_gm->drawImage(4);
		_gm->_rooms[HOLD]->setSectionVisible(7, true);
		_gm->great(3);
	} else if ((verb == ACTION_PULL) && (obj1._id == GENERATOR_WIRE) &&
	           (obj1._click == 16)) {
		_gm->drawImage(_gm->invertSection(9));
		_gm->drawImage(2);
		_gm->drawImage(3);
		_gm->drawImage(4);
		_gm->drawImage(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)) &&
	           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)) {
		_gm->drawImage(13);
		r = _gm->_rooms[CABIN_R3];
		_gm->_inventory.remove(*r->getObject(9));
		getObject(3)->_click = 18;
	} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, OUTERHATCH, GENERATOR_ROPE)) {
		if (!isSectionVisible(1))
			_vm->renderMessage("Du muát die Luke erst ”ffnen.");
		else {
			_gm->drawImage(_gm->invertSection(13));
			_gm->drawImage(1);
			if (isSectionVisible(7)) {
				_gm->drawImage(10);
				_gm->drawImage(11);
			} else {
				_gm->drawImage(12);
			}
			r = _gm->_rooms[OUTSIDE];
			r->setSectionVisible(1, true);
			r->getObject(1)->_click = 1;
			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) &&
	           isSectionVisible(1)) {
		_vm->renderMessage("Das Kabel ist zu kurz.");
	} else {
		return false;
	}

	return true;
}

// Arsano
void ArsanoRocks::onEntrance() {

}

bool ArsanoRocks::interact(Action verb, Object &obj1, Object &obj2) {

}

void ArsanoMeetup::onEntrance() {

}

void ArsanoMeetup::animation() {

}

bool ArsanoMeetup::interact(Action verb, Object &obj1, Object &obj2) {

}

void ArsanoEntrance::animation() {

}

bool ArsanoEntrance::interact(Action verb, Object &obj1, Object &obj2) {

}

void ArsanoRemaining::animation() {

}

void ArsanoRoger::onEntrance() {

}

void ArsanoRoger::animation() {

}

bool ArsanoRoger::interact(Action verb, Object &obj1, Object &obj2) {

}

void ArsanoGlider::onEntrance() {

}

void ArsanoGlider::animation() {

}

void ArsanoMeetup2::onEntrance() {

}

bool ArsanoMeetup2::interact(Action verb, Object &obj1, Object &obj2) {

}

bool ArsanoMeetup3::interact(Action verb, Object &obj1, Object &obj2) {

}

void AxacussCell::onEntrance() {

}

void AxacussCell::animation() {

}

bool AxacussCell::interact(Action verb, Object &obj1, Object &obj2) {

}

void AxacussCorridor1::onEntrance() {

}

void AxacussCorridor2::onEntrance() {

}

void AxacussCorridor3::onEntrance() {

}

void AxacussCorridor4::onEntrance() {

}

void AxacussCorridor4::animation() {

}

bool AxacussCorridor4::interact(Action verb, Object &obj1, Object &obj2) {

}

void AxacussCorridor5::onEntrance() {

}

bool AxacussCorridor5::interact(Action verb, Object &obj1, Object &obj2) {

}

void AxacussCorridor6::onEntrance() {

}

bool AxacussCorridor6::interact(Action verb, Object &obj1, Object &obj2) {

}

void AxacussCorridor7::onEntrance() {

}

void AxacussCorridor8::onEntrance() {

}

bool AxacussCorridor8::interact(Action verb, Object &obj1, Object &obj2) {

}

void AxacussCorridor9::onEntrance() {

}

bool AxacussCorridor9::interact(Action verb, Object &obj1, Object &obj2) {

}

void AxacussBcorridor::onEntrance() {

}

bool AxacussBcorridor::interact(Action verb, Object &obj1, Object &obj2) {

}

bool AxacussIntersection::interact(Action verb, Object &obj1, Object &obj2) {

}

bool AxacussExit::interact(Action verb, Object &obj1, Object &obj2) {

}

bool AxacussOffice1::interact(Action verb, Object &obj1, Object &obj2) {

}

bool AxacussOffice2::interact(Action verb, Object &obj1, Object &obj2) {

}

bool AxacussOffice3::interact(Action verb, Object &obj1, Object &obj2) {

}

bool AxacussOffice4::interact(Action verb, Object &obj1, Object &obj2) {

}

void AxacussOffice5::onEntrance() {

}

bool AxacussOffice5::interact(Action verb, Object &obj1, Object &obj2) {

}

bool AxacussElevator::interact(Action verb, Object &obj1, Object &obj2) {

}

bool AxacussStation::interact(Action verb, Object &obj1, Object &obj2) {

}

bool AxacussSign::interact(Action verb, Object &obj1, Object &obj2) {

}

}