[Scummvm-git-logs] scummvm master -> 4bcec43eae8d25e4466d055adbe1b62736ade13b

sev- noreply at scummvm.org
Mon Jun 16 21:12:53 UTC 2025


This automated email contains information about 82 new commits which have been
pushed to the 'scummvm' repo located at https://api.github.com/repos/scummvm/scummvm .

Summary:
6e198f7723 LASTEXPRESS: Rewrite engine
787c013e03 LASTEXPRESS: Add support for demo
b5f33424eb LASTEXPRESS: Remove old engine code
3c4eeaeec6 LASTEXPRESS: Fix trivial MSVC warnings
77835fc7e8 LASTEXPRESS: Rewrite Master logic
6d0f5b1524 LASTEXPRESS: Clean up more code
4b0f18e4eb LASTEXPRESS: Clean up tables (ha-ha.)
11fe839e47 LASTEXPRESS: Clean up Yasmin logic
5acd485cb8 LASTEXPRESS: Clean up Hadija logic
03f08f3732 LASTEXPRESS: Clean up Clerk logic
66c968f5da LASTEXPRESS: Clean up Max logic
01357febf6 LASTEXPRESS: Clean up Sophie logic
dafdbe320d LASTEXPRESS: Clean up Police logic
78277791b9 LASTEXPRESS: Clean up Salko logic
e47afa2820 LASTEXPRESS: Clean up Anna logic
2ca65f1379 LASTEXPRESS: Clean up Mitchell logic
52cf72d4e9 LASTEXPRESS: Clean up Cook logic
00c39cabf2 LASTEXPRESS: Clean up Monsieur logic
e25704807e LASTEXPRESS: Clean up Alouan logic
2f22a8586a LASTEXPRESS: Clean up Vassili logic
8c0ebf3e17 LASTEXPRESS: Clean up August logic
3879c98188 LASTEXPRESS: Clean up Abbot logic
1361402186 LASTEXPRESS: Clean up Alexei logic
c93bd74078 LASTEXPRESS: Add experimental support for Gold Edition
1c9f84a625 LASTEXPRESS: Clean up Cond1 logic
8cc7437fc0 LASTEXPRESS: Clean up Cond2 logic
5e5578449c LASTEXPRESS: Clean up François logic
29d373e5fb LASTEXPRESS: Clean up HeadWait logic
7f75090fff LASTEXPRESS: Clean up Ivo logic
2e3622d3a1 LASTEXPRESS: Clean up Kronos logic
9af209d418 LASTEXPRESS: Clean up Mahmud logic
2fa6388835 LASTEXPRESS: Clean up Master logic
714b0e4d76 LASTEXPRESS: Clean up Kahina logic
b80ecda5e3 LASTEXPRESS: Clean up Waiter1 logic
023913f0ed LASTEXPRESS: Clean up Waiter2 logic
1e5e445251 LASTEXPRESS: Clean up TrainM logic
f0db0084de LASTEXPRESS: Clean up Madame logic
11b223fe17 LASTEXPRESS: Clean up Milos logic
7f1fe3eab3 LASTEXPRESS: Clean up Vesna logic
5521c7ecb5 LASTEXPRESS: Clean up Tatiana logic
e4752d4a34 LASTEXPRESS: Clean up Rebecca logic
3d071e9a93 LASTEXPRESS: Add myself to credits
51fde2f649 LASTEXPRESS: Clean up sprites.h/.cpp
d53d6f851d LASTEXPRESS: More clean-up
3515db6a9d LASTEXPRESS: Fix some wrongly cleaned up code for TrainM
11e77d1c75 LASTEXPRESS: DEBUG: Differentiate train structure between chapters
c22a88182a LASTEXPRESS: Fix remaining character logic issues
76075eda6c LASTEXPRESS: Remove leftover warning message
512b746e71 LASTEXPRESS: Fix non-virtual dtor warning
ec7d62296c LASTEXPRESS: Fix some trivial warnings
cf38031f56 LASTEXPRESS: Fix some more trivial warnings
208a61abed LASTEXPRESS: Fix Alexei parentheses warnings
d42de93a67 LASTEXPRESS: Fix Anna parentheses warnings
dc3d3a7a80 LASTEXPRESS: Fix August parentheses warnings
376bac3a15 LASTEXPRESS: Fix Clerk parentheses warnings
74d546a7e1 LASTEXPRESS: Fix Cond1 parentheses warnings
bf9fc68b5c LASTEXPRESS: Fix Cond2 parentheses warnings
27d7be2ff1 LASTEXPRESS: Fix Kahina parentheses warnings
87ca7f357f LASTEXPRESS: Fix Mahmud parentheses warnings
8172656789 LASTEXPRESS: Fix Milos parentheses warnings
4bd4e55864 LASTEXPRESS: Fix Police parentheses warnings
b4d936d7fd LASTEXPRESS: Fix Rebecca parentheses warnings
2da59e68c1 LASTEXPRESS: Fix Salko parentheses warnings
bd6aa554fb LASTEXPRESS: Fix Sophie parentheses warnings
c9615ff131 LASTEXPRESS: Fix Tatiana parentheses warnings
5c0603461b LASTEXPRESS: Fix TrainM parentheses warnings
cfd1da0278 LASTEXPRESS: Fix Vassili parentheses warnings
ed4a01d282 LASTEXPRESS: Fix Vesna parentheses warnings
3d22a3bfc2 LASTEXPRESS: Fix TableC parentheses warnings
186cdcb63b LASTEXPRESS: Fix action.cpp parentheses warnings
d7fd0f3130 LASTEXPRESS: Fix navigation.cpp parentheses warnings
22ff3be497 LASTEXPRESS: Fix most logic.cpp parentheses warnings
a090b7ebda LASTEXPRESS: Fix otis.cpp parentheses warnings
226dce5292 LASTEXPRESS: SOUND: Fix some dialogs stopping after first frame
0ccb25781f LASTEXPRESS: Fix warning in comparison of walkCounter
57fdfd45bb LASTEXPRESS: Fix last parentheses warning in logic.cpp
ef7e38e37a LASTEXPRESS: DETECTION: Set engine as ready for public testing
db7783ab35 LASTEXPRESS: Fix typo in Tatiana's logic
c4c053bba3 LASTEXPRESS: Finish the EVENT_QUIT handling
0c1f5c7f2f LASTEXPRESS: Properly handle exit from menu button
3eed404fea LASTEXPRESS: Add MouseFlags enum and relabel some flags accordingly
4bcec43eae LASTEXPRESS: Remove "imgui" flag from required engine components


Commit: 6e198f7723e40148b41fd32dd3032ebd69478109
    https://github.com/scummvm/scummvm/commit/6e198f7723e40148b41fd32dd3032ebd69478109
Author: AndywinXp (andywinxp at gmail.com)
Date: 2025-06-16T23:12:18+02:00

Commit Message:
LASTEXPRESS: Rewrite engine

Changed paths:
  A engines/lastexpress/characters/abbot.cpp
  A engines/lastexpress/characters/alexei.cpp
  A engines/lastexpress/characters/alouan.cpp
  A engines/lastexpress/characters/anna.cpp
  A engines/lastexpress/characters/august.cpp
  A engines/lastexpress/characters/clerk.cpp
  A engines/lastexpress/characters/cond1.cpp
  A engines/lastexpress/characters/cond2.cpp
  A engines/lastexpress/characters/cook.cpp
  A engines/lastexpress/characters/francois.cpp
  A engines/lastexpress/characters/hadija.cpp
  A engines/lastexpress/characters/headwait.cpp
  A engines/lastexpress/characters/ivo.cpp
  A engines/lastexpress/characters/kahina.cpp
  A engines/lastexpress/characters/kronos.cpp
  A engines/lastexpress/characters/madame.cpp
  A engines/lastexpress/characters/mahmud.cpp
  A engines/lastexpress/characters/master.cpp
  A engines/lastexpress/characters/max.cpp
  A engines/lastexpress/characters/milos.cpp
  A engines/lastexpress/characters/mitchell.cpp
  A engines/lastexpress/characters/monsieur.cpp
  A engines/lastexpress/characters/police.cpp
  A engines/lastexpress/characters/rebecca.cpp
  A engines/lastexpress/characters/salko.cpp
  A engines/lastexpress/characters/sophie.cpp
  A engines/lastexpress/characters/tablea.cpp
  A engines/lastexpress/characters/tableb.cpp
  A engines/lastexpress/characters/tablec.cpp
  A engines/lastexpress/characters/tabled.cpp
  A engines/lastexpress/characters/tablee.cpp
  A engines/lastexpress/characters/tablef.cpp
  A engines/lastexpress/characters/tatiana.cpp
  A engines/lastexpress/characters/trainm.cpp
  A engines/lastexpress/characters/vassili.cpp
  A engines/lastexpress/characters/vesna.cpp
  A engines/lastexpress/characters/waiter1.cpp
  A engines/lastexpress/characters/waiter2.cpp
  A engines/lastexpress/characters/yasmin.cpp
  A engines/lastexpress/data/cvcrfile.cpp
  A engines/lastexpress/data/cvcrfile.h
  A engines/lastexpress/data/sprites.cpp
  A engines/lastexpress/data/sprites.h
  A engines/lastexpress/fight/fighter_cath.cpp
  A engines/lastexpress/fight/opponent.cpp
  A engines/lastexpress/fight/opponent_ivo.cpp
  A engines/lastexpress/fight/opponent_milos.cpp
  A engines/lastexpress/fight/opponent_salko.cpp
  A engines/lastexpress/fight/opponent_vesna1.cpp
  A engines/lastexpress/fight/opponent_vesna2.cpp
  A engines/lastexpress/game/credits.cpp
  A engines/lastexpress/game/events.cpp
  A engines/lastexpress/game/events.h
  A engines/lastexpress/game/navigation.cpp
  A engines/lastexpress/game/nis.cpp
  A engines/lastexpress/game/nis.h
  A engines/lastexpress/game/otis.cpp
  A engines/lastexpress/game/otis.h
  A engines/lastexpress/game/vcr.cpp
  A engines/lastexpress/game/vcr.h
  A engines/lastexpress/memory.cpp
  A engines/lastexpress/memory.h
  A engines/lastexpress/sound/driver.cpp
  A engines/lastexpress/sound/mixer.cpp
  A engines/lastexpress/sound/mixer.h
  A engines/lastexpress/sound/slot.cpp
  A engines/lastexpress/sound/slot.h
  A engines/lastexpress/sound/subtitle.cpp
  A engines/lastexpress/sound/subtitle.h
  A engines/lastexpress/strings.h
  R engines/lastexpress/fight/fighter_anna.cpp
  R engines/lastexpress/fight/fighter_anna.h
  R engines/lastexpress/fight/fighter_ivo.cpp
  R engines/lastexpress/fight/fighter_ivo.h
  R engines/lastexpress/fight/fighter_milos.cpp
  R engines/lastexpress/fight/fighter_milos.h
  R engines/lastexpress/fight/fighter_salko.cpp
  R engines/lastexpress/fight/fighter_salko.h
  R engines/lastexpress/fight/fighter_vesna.cpp
  R engines/lastexpress/fight/fighter_vesna.h
    engines/lastexpress/configure.engine
    engines/lastexpress/data/archive.cpp
    engines/lastexpress/data/archive.h
    engines/lastexpress/data/scene.h
    engines/lastexpress/data/sequence.h
    engines/lastexpress/data/subtitle.cpp
    engines/lastexpress/data/subtitle.h
    engines/lastexpress/debug.cpp
    engines/lastexpress/debug.h
    engines/lastexpress/entities/abbot.cpp
    engines/lastexpress/entities/abbot.h
    engines/lastexpress/entities/alexei.cpp
    engines/lastexpress/entities/alexei.h
    engines/lastexpress/entities/alouan.cpp
    engines/lastexpress/entities/alouan.h
    engines/lastexpress/entities/anna.cpp
    engines/lastexpress/entities/anna.h
    engines/lastexpress/entities/august.cpp
    engines/lastexpress/entities/august.h
    engines/lastexpress/entities/boutarel.cpp
    engines/lastexpress/entities/boutarel.h
    engines/lastexpress/entities/chapters.cpp
    engines/lastexpress/entities/chapters.h
    engines/lastexpress/entities/cooks.cpp
    engines/lastexpress/entities/cooks.h
    engines/lastexpress/entities/coudert.cpp
    engines/lastexpress/entities/coudert.h
    engines/lastexpress/entities/entity.cpp
    engines/lastexpress/entities/entity.h
    engines/lastexpress/entities/entity39.cpp
    engines/lastexpress/entities/francois.cpp
    engines/lastexpress/entities/francois.h
    engines/lastexpress/entities/gendarmes.cpp
    engines/lastexpress/entities/gendarmes.h
    engines/lastexpress/entities/hadija.cpp
    engines/lastexpress/entities/hadija.h
    engines/lastexpress/entities/ivo.cpp
    engines/lastexpress/entities/ivo.h
    engines/lastexpress/entities/kahina.cpp
    engines/lastexpress/entities/kahina.h
    engines/lastexpress/entities/kronos.cpp
    engines/lastexpress/entities/kronos.h
    engines/lastexpress/entities/mahmud.cpp
    engines/lastexpress/entities/mahmud.h
    engines/lastexpress/entities/max.cpp
    engines/lastexpress/entities/max.h
    engines/lastexpress/entities/mertens.cpp
    engines/lastexpress/entities/mertens.h
    engines/lastexpress/entities/milos.cpp
    engines/lastexpress/entities/milos.h
    engines/lastexpress/entities/mmeboutarel.cpp
    engines/lastexpress/entities/mmeboutarel.h
    engines/lastexpress/entities/pascale.cpp
    engines/lastexpress/entities/pascale.h
    engines/lastexpress/entities/rebecca.cpp
    engines/lastexpress/entities/rebecca.h
    engines/lastexpress/entities/salko.cpp
    engines/lastexpress/entities/salko.h
    engines/lastexpress/entities/sophie.cpp
    engines/lastexpress/entities/sophie.h
    engines/lastexpress/entities/tables.cpp
    engines/lastexpress/entities/tables.h
    engines/lastexpress/entities/tatiana.cpp
    engines/lastexpress/entities/tatiana.h
    engines/lastexpress/entities/train.cpp
    engines/lastexpress/entities/vassili.cpp
    engines/lastexpress/entities/vassili.h
    engines/lastexpress/entities/verges.cpp
    engines/lastexpress/entities/verges.h
    engines/lastexpress/entities/vesna.cpp
    engines/lastexpress/entities/vesna.h
    engines/lastexpress/entities/waiter1.cpp
    engines/lastexpress/entities/waiter1.h
    engines/lastexpress/entities/waiter2.cpp
    engines/lastexpress/entities/waiter2.h
    engines/lastexpress/entities/yasmin.cpp
    engines/lastexpress/entities/yasmin.h
    engines/lastexpress/fight/fight.cpp
    engines/lastexpress/fight/fight.h
    engines/lastexpress/fight/fighter.cpp
    engines/lastexpress/fight/fighter.h
    engines/lastexpress/game/action.cpp
    engines/lastexpress/game/action.h
    engines/lastexpress/game/beetle.cpp
    engines/lastexpress/game/beetle.h
    engines/lastexpress/game/entities.cpp
    engines/lastexpress/game/entities.h
    engines/lastexpress/game/inventory.cpp
    engines/lastexpress/game/logic.cpp
    engines/lastexpress/game/logic.h
    engines/lastexpress/game/object.cpp
    engines/lastexpress/game/object.h
    engines/lastexpress/game/savegame.cpp
    engines/lastexpress/game/savegame.h
    engines/lastexpress/game/savepoint.cpp
    engines/lastexpress/game/savepoint.h
    engines/lastexpress/game/scenes.cpp
    engines/lastexpress/game/scenes.h
    engines/lastexpress/game/state.h
    engines/lastexpress/graphics.cpp
    engines/lastexpress/graphics.h
    engines/lastexpress/helpers.h
    engines/lastexpress/lastexpress.cpp
    engines/lastexpress/lastexpress.h
    engines/lastexpress/menu/clock.cpp
    engines/lastexpress/menu/clock.h
    engines/lastexpress/menu/menu.cpp
    engines/lastexpress/menu/menu.h
    engines/lastexpress/metaengine.cpp
    engines/lastexpress/module.mk
    engines/lastexpress/shared.h
    engines/lastexpress/sound/entry.cpp
    engines/lastexpress/sound/entry.h
    engines/lastexpress/sound/queue.cpp
    engines/lastexpress/sound/queue.h
    engines/lastexpress/sound/sound.cpp
    engines/lastexpress/sound/sound.h


diff --git a/engines/lastexpress/characters/abbot.cpp b/engines/lastexpress/characters/abbot.cpp
new file mode 100644
index 00000000000..5f6c32284c0
--- /dev/null
+++ b/engines/lastexpress/characters/abbot.cpp
@@ -0,0 +1,2339 @@
+/* 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 3 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, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "lastexpress/lastexpress.h"
+#include "lastexpress/game/logic.h"
+
+namespace LastExpress {
+
+void LogicManager::CONS_Abbot(int chapter) {
+	switch (chapter) {
+	case 0:
+		_engine->getMessageManager()->setMessageHandle(
+			kCharacterAbbot,
+			_functionsAbbot[getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall]]
+		);
+
+		break;
+	case 1:
+		CONS_Abbot_Birth(0, 0, 0, 0);
+		break;
+	case 2:
+		CONS_Abbot_StartPart2(0, 0, 0, 0);
+		break;
+	case 3:
+		CONS_Abbot_StartPart3(0, 0, 0, 0);
+		break;
+	case 4:
+		CONS_Abbot_StartPart4(0, 0, 0, 0);
+		break;
+	case 5:
+		CONS_Abbot_StartPart5(0, 0, 0, 0);
+		break;
+	default:
+		return;
+	}
+}
+
+void LogicManager::AbbotCall(CALL_PARAMS) {
+	getCharacter(kCharacterAbbot).currentCall++;
+
+	(this->*functionPointer)(param1, param2, param3, param4);
+}
+
+void LogicManager::CONS_Abbot_DebugWalks(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAbbot).callParams[getCharacter(kCharacterAbbot).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, &LogicManager::HAND_Abbot_DebugWalks);
+	getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall] = 1;
+
+	params->clear();
+
+	fedEx(kCharacterAbbot, kCharacterAbbot, 12, 0);
+}
+
+void LogicManager::HAND_Abbot_DebugWalks(HAND_PARAMS) {
+	if (msg->action) {
+		if (msg->action == 12) {
+			getCharacter(kCharacterAbbot).characterPosition.position = 0;
+			getCharacter(kCharacterAbbot).characterPosition.location = 0;
+			getCharacter(kCharacterAbbot).characterPosition.car = kCarGreenSleeping;
+			getCharacterCurrentParams(kCharacterAbbot)[0] = 10000;
+		}
+	} else if (walk(kCharacterAbbot, kCarGreenSleeping, getCharacterCurrentParams(kCharacterAbbot)[0])) {
+		if (getCharacterCurrentParams(kCharacterAbbot)[0] == 10000) {
+			getCharacterCurrentParams(kCharacterAbbot)[0] = 0;
+		} else {
+			getCharacterCurrentParams(kCharacterAbbot)[0] = 10000;
+		}
+	}
+}
+
+void LogicManager::CONS_Abbot_DoSeqOtis(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAbbot).callParams[getCharacter(kCharacterAbbot).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, &LogicManager::HAND_Abbot_DoSeqOtis);
+	getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall] = 2;
+
+	params->clear();
+
+	strncpy((char *)&params->parameters[0], param1.stringParam, 12);
+
+	fedEx(kCharacterAbbot, kCharacterAbbot, 12, 0);
+}
+
+void LogicManager::HAND_Abbot_DoSeqOtis(HAND_PARAMS) {
+	if (msg->action == 3) {
+		getCharacter(kCharacterAbbot).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, _functionsAbbot[getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall]]);
+		fedEx(kCharacterAbbot, kCharacterAbbot, 18, 0);
+	} else if (msg->action == 12) {
+		startSeqOtis(kCharacterAbbot, (char *)&getCharacterCurrentParams(kCharacterAbbot)[0]);
+	}
+}
+
+void LogicManager::CONS_Abbot_DoCorrOtis(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAbbot).callParams[getCharacter(kCharacterAbbot).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, &LogicManager::HAND_Abbot_DoCorrOtis);
+	getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall] = 3;
+
+	params->clear();
+
+	strncpy((char *)&params->parameters[0], param1.stringParam, 12);
+
+	params->parameters[3] = param2.intParam;
+
+	fedEx(kCharacterAbbot, kCharacterAbbot, 12, 0);
+}
+
+void LogicManager::HAND_Abbot_DoCorrOtis(HAND_PARAMS) {
+	if (msg->action == 3) {
+		releaseAtDoor(kCharacterAbbot, getCharacterCurrentParams(kCharacterAbbot)[3]);
+
+		getCharacter(kCharacterAbbot).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, _functionsAbbot[getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall]]);
+
+		fedEx(kCharacterAbbot, kCharacterAbbot, 18, 0);
+	} else if (msg->action == 12) {
+		startSeqOtis(kCharacterAbbot, (char *)&getCharacterCurrentParams(kCharacterAbbot)[0]);
+		blockAtDoor(kCharacterAbbot, getCharacterCurrentParams(kCharacterAbbot)[3]);
+	}
+}
+
+void LogicManager::CONS_Abbot_DoEnterCorrOtis(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAbbot).callParams[getCharacter(kCharacterAbbot).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, &LogicManager::HAND_Abbot_DoEnterCorrOtis);
+	getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall] = 4;
+
+	params->clear();
+
+	strncpy((char *)&params->parameters[0], param1.stringParam, 12);
+
+	params->parameters[3] = param2.intParam;
+
+	fedEx(kCharacterAbbot, kCharacterAbbot, 12, 0);
+}
+
+void LogicManager::HAND_Abbot_DoEnterCorrOtis(HAND_PARAMS) {
+	if (msg->action == 3) {
+		releaseAtDoor(kCharacterAbbot, getCharacterCurrentParams(kCharacterAbbot)[3]);
+		getCharacter(kCharacterAbbot).characterPosition.position = 6470;
+		getCharacter(kCharacterAbbot).characterPosition.location = 1;
+
+		getCharacter(kCharacterAbbot).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, _functionsAbbot[getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall]]);
+
+		fedEx(kCharacterAbbot, kCharacterAbbot, 18, 0);
+	} else if (msg->action == 12) {
+		startSeqOtis(kCharacterAbbot, (char *)&getCharacterCurrentParams(kCharacterAbbot)[0]);
+		blockAtDoor(kCharacterAbbot, getCharacterCurrentParams(kCharacterAbbot)[3]);
+		getCharacter(kCharacterAbbot).characterPosition.location = 1;
+
+		if (inComp(kCharacterCath, kCarRedSleeping, 6470) || inComp(kCharacterCath, kCarRedSleeping, 6130)) {
+			if (isNight()) {
+				playNIS(kEventCathTurningNight);
+			} else {
+				playNIS(kEventCathTurningDay);
+			}
+			
+			playDialog(kCharacterCath, "BUMP", -1, 0);
+			bumpCathFDoor(34);
+		}
+	}
+}
+
+void LogicManager::CONS_Abbot_FinishSeqOtis(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAbbot).callParams[getCharacter(kCharacterAbbot).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, &LogicManager::HAND_Abbot_FinishSeqOtis);
+	getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall] = 5;
+
+	params->clear();
+
+	fedEx(kCharacterAbbot, kCharacterAbbot, 12, 0);
+}
+
+void LogicManager::HAND_Abbot_FinishSeqOtis(HAND_PARAMS) {
+	if (msg->action == 3 || (msg->action == 0 && getCharacter(kCharacterAbbot).direction != 4)) {
+		getCharacter(kCharacterAbbot).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, _functionsAbbot[getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall]]);
+		fedEx(kCharacterAbbot, kCharacterAbbot, 18, 0);
+	}
+}
+
+void LogicManager::CONS_Abbot_DoComplexSeqOtis(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAbbot).callParams[getCharacter(kCharacterAbbot).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, &LogicManager::HAND_Abbot_DoComplexSeqOtis);
+	getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall] = 6;
+
+	params->clear();
+
+	strncpy((char *)&params->parameters[0], param1.stringParam, 12);
+	strncpy((char *)&params->parameters[3], param2.stringParam, 12);
+
+	params->parameters[6] = param3.intParam;
+
+	fedEx(kCharacterAbbot, kCharacterAbbot, 12, 0);
+}
+
+void LogicManager::HAND_Abbot_DoComplexSeqOtis(HAND_PARAMS) {
+	if (msg->action == 3) {
+		getCharacter(kCharacterAbbot).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, _functionsAbbot[getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall]]);
+
+		fedEx(kCharacterAbbot, kCharacterAbbot, 18, 0);
+	} else if (msg->action == 12) {
+		startSeqOtis(kCharacterAbbot, (char *)&getCharacterCurrentParams(kCharacterAbbot)[0]);
+		startSeqOtis(getCharacterCurrentParams(kCharacterAbbot)[6], (char *)&getCharacterCurrentParams(kCharacterAbbot)[3]);
+	}
+}
+
+void LogicManager::CONS_Abbot_DoWait(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAbbot).callParams[getCharacter(kCharacterAbbot).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, &LogicManager::HAND_Abbot_DoWait);
+	getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall] = 7;
+
+	params->clear();
+
+	params->parameters[0] = param1.intParam;
+
+	fedEx(kCharacterAbbot, kCharacterAbbot, 12, 0);
+}
+
+void LogicManager::HAND_Abbot_DoWait(HAND_PARAMS) {
+	if (msg->action == 0) {
+		if (getCharacterCurrentParams(kCharacterAbbot)[1]) {
+			if (getCharacterCurrentParams(kCharacterAbbot)[1] >= _gameTime)
+				return;
+
+			getCharacterCurrentParams(kCharacterAbbot)[1] = 0x7FFFFFFF;
+		} else {
+			getCharacterCurrentParams(kCharacterAbbot)[1] = _gameTime + getCharacterCurrentParams(kCharacterAbbot)[0];
+
+			if (_gameTime + getCharacterCurrentParams(kCharacterAbbot)[0] == 0)
+				return;
+
+			if (getCharacterCurrentParams(kCharacterAbbot)[1] >= _gameTime)
+				return;
+
+			getCharacterCurrentParams(kCharacterAbbot)[1] = 0x7FFFFFFF;
+		}
+
+		getCharacter(kCharacterAbbot).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, _functionsAbbot[getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall]]);
+
+		fedEx(kCharacterAbbot, kCharacterAbbot, 18, 0);
+	}
+}
+
+void LogicManager::CONS_Abbot_DoWaitReal(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAbbot).callParams[getCharacter(kCharacterAbbot).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, &LogicManager::HAND_Abbot_DoWaitReal);
+	getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall] = 8;
+
+	params->clear();
+
+	params->parameters[0] = param1.intParam;
+
+	fedEx(kCharacterAbbot, kCharacterAbbot, 12, 0);
+}
+
+void LogicManager::HAND_Abbot_DoWaitReal(HAND_PARAMS) {
+	if (msg->action == 0) {
+		if (getCharacterCurrentParams(kCharacterAbbot)[1]) {
+			if (getCharacterCurrentParams(kCharacterAbbot)[1] >= _currentGameSessionTicks)
+				return;
+
+			getCharacterCurrentParams(kCharacterAbbot)[1] = 0x7FFFFFFF;
+		} else {
+			getCharacterCurrentParams(kCharacterAbbot)[1] = _currentGameSessionTicks + getCharacterCurrentParams(kCharacterAbbot)[0];
+
+			if (_currentGameSessionTicks + getCharacterCurrentParams(kCharacterAbbot)[0] == 0)
+				return;
+
+			if (getCharacterCurrentParams(kCharacterAbbot)[1] >= _currentGameSessionTicks)
+				return;
+
+			getCharacterCurrentParams(kCharacterAbbot)[1] = 0x7FFFFFFF;
+		}
+
+		getCharacter(kCharacterAbbot).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, _functionsAbbot[getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall]]);
+
+		fedEx(kCharacterAbbot, kCharacterAbbot, 18, 0);
+	}
+}
+
+void LogicManager::CONS_Abbot_DoDialog(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAbbot).callParams[getCharacter(kCharacterAbbot).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, &LogicManager::HAND_Abbot_DoDialog);
+	getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall] = 9;
+
+	params->clear();
+
+	strncpy((char *)&params->parameters[0], param1.stringParam, 12);
+
+	fedEx(kCharacterAbbot, kCharacterAbbot, 12, 0);
+}
+
+void LogicManager::HAND_Abbot_DoDialog(HAND_PARAMS) {
+	if (msg->action == 2) {
+		getCharacter(kCharacterAbbot).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, _functionsAbbot[getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall]]);
+
+		fedEx(kCharacterAbbot, kCharacterAbbot, 18, 0);
+	} else if (msg->action == 12) {
+		playDialog(kCharacterAbbot, (char *)&getCharacterCurrentParams(kCharacterAbbot)[0], -1, 0);
+	}
+}
+
+void LogicManager::CONS_Abbot_SaveGame(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAbbot).callParams[getCharacter(kCharacterAbbot).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, &LogicManager::HAND_Abbot_SaveGame);
+	getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall] = 10;
+
+	params->clear();
+
+	params->parameters[0] = param1.intParam;
+	params->parameters[1] = param2.intParam;
+
+	fedEx(kCharacterAbbot, kCharacterAbbot, 12, 0);
+}
+
+void LogicManager::HAND_Abbot_SaveGame(HAND_PARAMS) {
+	if (msg->action == 0) {
+		getCharacter(kCharacterAbbot).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, _functionsAbbot[getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall]]);
+
+		fedEx(kCharacterAbbot, kCharacterAbbot, 18, 0);
+	} else if (msg->action == 12) {
+		save(
+			kCharacterAbbot,
+			getCharacterCurrentParams(kCharacterAbbot)[0],
+			getCharacterCurrentParams(kCharacterAbbot)[1]
+		);
+
+		getCharacter(kCharacterAbbot).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, _functionsAbbot[getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall]]);
+
+		fedEx(kCharacterAbbot, kCharacterAbbot, 18, 0);
+	} 
+}
+
+void LogicManager::CONS_Abbot_DoWalk(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAbbot).callParams[getCharacter(kCharacterAbbot).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, &LogicManager::HAND_Abbot_DoWalk);
+	getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall] = 11;
+
+	params->clear();
+
+	params->parameters[0] = param1.intParam;
+	params->parameters[1] = param2.intParam;
+
+	fedEx(kCharacterAbbot, kCharacterAbbot, 12, 0);
+}
+
+void LogicManager::HAND_Abbot_DoWalk(HAND_PARAMS) {
+	switch (msg->action) {
+	case 0:
+		if (walk(kCharacterAbbot, getCharacterCurrentParams(kCharacterAbbot)[0], getCharacterCurrentParams(kCharacterAbbot)[1])) {
+			getCharacter(kCharacterAbbot).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, _functionsAbbot[getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall]]);
+			fedEx(kCharacterAbbot, kCharacterAbbot, 18, 0);
+		}
+
+		break;
+	case 5:
+		if (checkCathDir(kCarGreenSleeping, 18) || checkCathDir(kCarRedSleeping, 18)) {
+			playChrExcuseMe(kCharacterAbbot, kCharacterCath, 0);
+			break;
+		}
+
+		if (_gameEvents[kEventAbbotIntroduction]) {
+			playDialog(kCharacterCath, "CAT1013", -1, 0);
+		} else {
+			playCathExcuseMe();
+		}
+
+		break;
+	case 6:
+		playChrExcuseMe(kCharacterAbbot, kCharacterCath, 0);
+		break;
+	case 12:
+		if (walk(kCharacterAbbot, getCharacterCurrentParams(kCharacterAbbot)[0], getCharacterCurrentParams(kCharacterAbbot)[1])) {
+
+			getCharacter(kCharacterAbbot).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, _functionsAbbot[getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall]]);
+			fedEx(kCharacterAbbot, kCharacterAbbot, 18, 0);
+		}
+
+		break;
+	default:
+		break;
+	}
+}
+
+void LogicManager::CONS_Abbot_DoJoinedSeqOtis(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAbbot).callParams[getCharacter(kCharacterAbbot).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, &LogicManager::HAND_Abbot_DoJoinedSeqOtis);
+	getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall] = 12;
+
+	params->clear();
+
+	strncpy((char *)&params->parameters[0], param1.stringParam, 12);
+
+	params->parameters[3] = param2.intParam;
+	params->parameters[4] = param3.intParam;
+
+	strncpy((char *)&params->parameters[5], param4.stringParam, 12);
+
+	fedEx(kCharacterAbbot, kCharacterAbbot, 12, 0);
+}
+
+void LogicManager::HAND_Abbot_DoJoinedSeqOtis(HAND_PARAMS) {
+	switch (msg->action) {
+	case 3:
+		if (!getCharacterCurrentParams(kCharacterAbbot)[8])
+			fedEx(kCharacterAbbot, getCharacterCurrentParams(kCharacterAbbot)[3], getCharacterCurrentParams(kCharacterAbbot)[4], getCharacterCurrentParams(kCharacterAbbot)[5]);
+
+		getCharacter(kCharacterAbbot).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, _functionsAbbot[getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall]]);
+		fedEx(kCharacterAbbot, kCharacterAbbot, 18, 0);
+
+		break;
+	case 10:
+		if (!getCharacterCurrentParams(kCharacterAbbot)[8]) {
+			fedEx(kCharacterAbbot, getCharacterCurrentParams(kCharacterAbbot)[3], getCharacterCurrentParams(kCharacterAbbot)[4], getCharacterCurrentParams(kCharacterAbbot)[5]);
+			getCharacterCurrentParams(kCharacterAbbot)[8] = 1;
+		}
+
+		break;
+	case 12:
+		startSeqOtis(kCharacterAbbot, (char *)&getCharacterCurrentParams(kCharacterAbbot));
+		break;
+	}
+}
+
+void LogicManager::CONS_Abbot_DoBlockSeqOtis(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAbbot).callParams[getCharacter(kCharacterAbbot).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, &LogicManager::HAND_Abbot_DoBlockSeqOtis);
+	getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall] = 13;
+
+	params->clear();
+
+	strncpy((char *)&params->parameters[0], param1.stringParam, 12);
+
+	params->parameters[3] = param2.intParam;
+	params->parameters[4] = param3.intParam;
+
+	fedEx(kCharacterAbbot, kCharacterAbbot, 12, 0);
+}
+
+void LogicManager::HAND_Abbot_DoBlockSeqOtis(HAND_PARAMS) {
+	if (msg->action == 3) {
+		releaseView(kCharacterAbbot, getCharacterCurrentParams(kCharacterAbbot)[3], getCharacterCurrentParams(kCharacterAbbot)[4]);
+		getCharacter(kCharacterAbbot).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, _functionsAbbot[getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall]]);
+		fedEx(kCharacterAbbot, kCharacterAbbot, 18, 0);
+	} else if (msg->action == 12) {
+		startSeqOtis(kCharacterAbbot, (char *)&getCharacterCurrentParams(kCharacterAbbot));
+		blockView(kCharacterAbbot, getCharacterCurrentParams(kCharacterAbbot)[3], getCharacterCurrentParams(kCharacterAbbot)[4]);
+	}
+}
+
+void LogicManager::CONS_Abbot_WaitRCClear(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAbbot).callParams[getCharacter(kCharacterAbbot).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, &LogicManager::HAND_Abbot_WaitRCClear);
+	getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall] = 14;
+
+	params->clear();
+
+	fedEx(kCharacterAbbot, kCharacterAbbot, 12, 0);
+}
+
+void LogicManager::HAND_Abbot_WaitRCClear(HAND_PARAMS) {
+	if ((msg->action == 12 && rcClear()) || (msg->action == 0 && rcClear())) {
+		getCharacter(kCharacterAbbot).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, _functionsAbbot[getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall]]);
+
+		fedEx(kCharacterAbbot, kCharacterAbbot, 18, 0);
+	}
+}
+
+void LogicManager::CONS_Abbot_Birth(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAbbot).callParams[getCharacter(kCharacterAbbot).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, &LogicManager::HAND_Abbot_Birth);
+	getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall] = 15;
+
+	params->clear();
+
+	fedEx(kCharacterAbbot, kCharacterAbbot, 12, 0);
+}
+
+void LogicManager::HAND_Abbot_Birth(HAND_PARAMS) {
+	if (msg->action == 12)
+		autoMessage(kCharacterAbbot, 203073664, 0);
+}
+
+void LogicManager::CONS_Abbot_StartPart2(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAbbot).callParams[getCharacter(kCharacterAbbot).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, &LogicManager::HAND_Abbot_StartPart2);
+	getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall] = 16;
+
+	params->clear();
+
+	fedEx(kCharacterAbbot, kCharacterAbbot, 12, 0);
+}
+
+void LogicManager::HAND_Abbot_StartPart2(HAND_PARAMS) {
+	if (msg->action == 12)
+		endGraphics(kCharacterAbbot);
+}
+
+void LogicManager::CONS_Abbot_StartPart3(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAbbot).callParams[getCharacter(kCharacterAbbot).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, &LogicManager::HAND_Abbot_StartPart3);
+	getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall] = 17;
+
+	params->clear();
+
+	fedEx(kCharacterAbbot, kCharacterAbbot, 12, 0);
+}
+
+void LogicManager::HAND_Abbot_StartPart3(HAND_PARAMS) {
+	if (msg->action == 0) {
+		CONS_Abbot_InKitchen(0, 0, 0, 0);
+	} else if (msg->action == 12) {
+		endGraphics(kCharacterAbbot);
+
+		getCharacter(kCharacterAbbot).characterPosition.location = 1;
+		getCharacter(kCharacterAbbot).characterPosition.car = kCarRestaurant;
+		getCharacter(kCharacterAbbot).characterPosition.position = 5900;
+		getCharacter(kCharacterAbbot).inventoryItem = 0;
+		getCharacter(kCharacterAbbot).clothes = 0;
+	}
+}
+
+void LogicManager::CONS_Abbot_InKitchen(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAbbot).callParams[getCharacter(kCharacterAbbot).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, &LogicManager::HAND_Abbot_InKitchen);
+	getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall] = 18;
+
+	params->clear();
+
+	fedEx(kCharacterAbbot, kCharacterAbbot, 12, 0);
+}
+
+void LogicManager::HAND_Abbot_InKitchen(HAND_PARAMS) {
+	if (msg->action == 18) {
+		switch (getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8]) {
+		case 1:
+			getCharacter(kCharacterAbbot).characterPosition.position = 5800;
+			getCharacter(kCharacterAbbot).characterPosition.location = 0;
+			getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 2;
+
+			AbbotCall(&LogicManager::CONS_Abbot_DoSeqOtis, "804DD", 0, 0, 0);
+
+			break;
+		case 2:
+			send(kCharacterAbbot, kCharacterCook, 236976550, 0);
+			startSeqOtis(kCharacterAbbot, "804DS");
+
+			if (inDiningRoom(kCharacterCath))
+				advanceFrame(kCharacterAbbot);
+
+			getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 3;
+
+			AbbotCall(&LogicManager::CONS_Abbot_FinishSeqOtis, 0, 0, 0, 0);
+
+			break;
+		case 3:
+			getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 4;
+
+			AbbotCall(&LogicManager::CONS_Abbot_DoWalk, 4, 6470, 0, 0);
+
+			break;
+		case 4:
+			setDoor(34, kCharacterCath, 1, 255, 255);
+			getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 5;
+
+			AbbotCall(&LogicManager::CONS_Abbot_DoCorrOtis, "617AC", 34, 0, 0);
+
+			break;
+		case 5:
+			setDoor(34, kCharacterCath, 2, 255, 255);
+			getCharacter(kCharacterAbbot).characterPosition.position = 6470;
+			getCharacter(kCharacterAbbot).characterPosition.location = 1;
+
+			CONS_Abbot_OpenComp(0, 0, 0, 0);
+
+			break;
+		default:
+			return;
+		}
+	} else if (msg->action == 192054567) {
+		getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 1;
+		AbbotCall(&LogicManager::CONS_Abbot_WaitRCClear, 0, 0, 0, 0);
+	}
+}
+
+void LogicManager::CONS_Abbot_OpenComp(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAbbot).callParams[getCharacter(kCharacterAbbot).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, &LogicManager::HAND_Abbot_OpenComp);
+	getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall] = 19;
+
+	params->clear();
+
+	fedEx(kCharacterAbbot, kCharacterAbbot, 12, 0);
+}
+
+void LogicManager::HAND_Abbot_OpenComp(HAND_PARAMS) {
+	if (msg->action == 0) {
+		if (_gameTime > 1953000 && !getCharacterCurrentParams(kCharacterAbbot)[0]) {
+			getCharacterCurrentParams(kCharacterAbbot)[0] = 1;
+			getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 3;
+			AbbotCall(&LogicManager::CONS_Abbot_DoDialog, "MrB3010", 0, 0, 0);
+		}
+	} else if (msg->action == 12) {
+		startCycOtis(kCharacterAbbot, "508A");
+		send(kCharacterAbbot, kCharacterMonsieur, 122358304, 0);
+		getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 1;
+		AbbotCall(&LogicManager::CONS_Abbot_DoDialog, "Abb3010", 0, 0, 0);
+	} else if (msg->action == 18) {
+		switch (getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8]) {
+		case 1:
+			getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 2;
+			AbbotCall(&LogicManager::CONS_Abbot_DoWait, 900, 0, 0, 0);
+			break;
+		case 2:
+			startCycOtis(kCharacterAbbot, "508B");
+			break;
+		case 3:
+			send(kCharacterAbbot, kCharacterMonsieur, 122288808, 0);
+			CONS_Abbot_AloneComp(0, 0, 0, 0);
+			break;
+		}
+	}
+}
+
+void LogicManager::CONS_Abbot_AloneComp(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAbbot).callParams[getCharacter(kCharacterAbbot).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, &LogicManager::HAND_Abbot_AloneComp);
+	getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall] = 20;
+
+	params->clear();
+
+	fedEx(kCharacterAbbot, kCharacterAbbot, 12, 0);
+}
+
+void LogicManager::HAND_Abbot_AloneComp(HAND_PARAMS) {
+	if (msg->action == 0) {
+		if (_gameTime > 1966500 && inDiningRoom(kCharacterMonsieur)) {
+			CONS_Abbot_GoLunch(0, 0, 0, 0);
+		}
+	} else if (msg->action == 12) {
+		startCycOtis(kCharacterAbbot, "509A");
+	}
+}
+
+void LogicManager::CONS_Abbot_GoLunch(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAbbot).callParams[getCharacter(kCharacterAbbot).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, &LogicManager::HAND_Abbot_GoLunch);
+	getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall] = 21;
+
+	params->clear();
+
+	fedEx(kCharacterAbbot, kCharacterAbbot, 12, 0);
+}
+
+void LogicManager::HAND_Abbot_GoLunch(HAND_PARAMS) {
+	switch (msg->action) {
+	case 12:
+		getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 1;
+		AbbotCall(&LogicManager::CONS_Abbot_DoSeqOtis, "509B", 0, 0, 0);
+		break;
+	case 18:
+		switch (getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8]) {
+		case 1:
+			setDoor(34, getCharacter(kCharacterAbbot).currentCall, 0, 10, 9);
+			setDoor(50, getCharacter(kCharacterAbbot).currentCall, 0, 10, 9);
+			getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 2;
+			AbbotCall(&LogicManager::CONS_Abbot_DoCorrOtis, "617Mc", 34, 0, 0);
+			break;
+		case 2:
+			getCharacter(kCharacterAbbot).characterPosition.location = 0;
+			getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 3;
+			AbbotCall(&LogicManager::CONS_Abbot_DoWalk, 5, 850, 0, 0);
+			break;
+		case 3:
+			getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 4;
+			AbbotCall(&LogicManager::CONS_Abbot_WaitRCClear, 0, 0, 0, 0);
+			break;
+		case 4:
+			getCharacter(kCharacterAbbot).characterPosition.position = 1540;
+			getCharacter(kCharacterAbbot).characterPosition.location = 0;
+			getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 5;
+			AbbotCall(&LogicManager::CONS_Abbot_DoSeqOtis, "804US", 0, 0, 0);
+			break;
+		case 5:
+			startSeqOtis(kCharacterAbbot, "029J");
+			if (inSalon(kCharacterCath))
+				advanceFrame(kCharacterAbbot);
+			getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 6;
+			AbbotCall(&LogicManager::CONS_Abbot_FinishSeqOtis, 0, 0, 0, 0);
+			break;
+		case 6:
+			startCycOtis(kCharacterAbbot, "029H");
+			send(kCharacterAbbot, kCharacterHeadWait, 207769280, 0);
+			break;
+		case 7:
+			CONS_Abbot_EatingLunch(0, 0, 0, 0);
+			break;
+		default:
+			return;
+		}
+		break;
+	case 122288808:
+		send(kCharacterAbbot, kCharacterTableE, 136455232, 0);
+		getCharacter(kCharacterAbbot).characterPosition.location = 1;
+		getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 7;
+		AbbotCall(&LogicManager::CONS_Abbot_DoSeqOtis, "029B", 0, 0, 0);
+		break;
+	}
+}
+
+void LogicManager::CONS_Abbot_EatingLunch(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAbbot).callParams[getCharacter(kCharacterAbbot).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, &LogicManager::HAND_Abbot_EatingLunch);
+	getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall] = 22;
+
+	params->clear();
+
+	fedEx(kCharacterAbbot, kCharacterAbbot, 12, 0);
+}
+
+void LogicManager::HAND_Abbot_EatingLunch(HAND_PARAMS) {
+	switch (msg->action) {
+	case 0:
+		if (_gameTime > 1971000 && !getCharacterCurrentParams(kCharacterAbbot)[0]) {
+			getCharacterCurrentParams(kCharacterAbbot)[0] = 1;
+			send(kCharacterAbbot, kCharacterWaiter1, 218586752, 0);
+		}
+
+		if (_gameTime > 1989000 && rcClear()) {
+			getCharacter(kCharacterAbbot).inventoryItem = 0;
+			CONS_Abbot_LeaveLunch(0, 0, 0, 0);
+		}
+
+		break;
+	case 1:
+		getCharacter(kCharacterAbbot).inventoryItem = kItemNone;
+		getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 1;
+		AbbotCall(&LogicManager::CONS_Abbot_SaveGame, 2, 110, 0, 0);
+		break;
+	case 12:
+		startCycOtis(kCharacterAbbot, "029E");
+
+		if (!_gameEvents[kEventAbbotIntroduction])
+			getCharacter(kCharacterAbbot).inventoryItem = kItemInvalid;
+
+		break;
+	case 18:
+		if (getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] == 1) {
+			playNIS(kEventAbbotIntroduction);
+			playDialog(0, "LIB036", -1, 0);
+			bumpCath(kCarRestaurant, 61, 255);
+		}
+
+		break;
+	case 122288808:
+		startCycOtis(kCharacterAbbot, "029E");
+		break;
+	case 122358304:
+		startCycOtis(kCharacterAbbot, "BLANK");
+		break;
+	default:
+		break;
+	}
+}
+
+void LogicManager::CONS_Abbot_LeaveLunch(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAbbot).callParams[getCharacter(kCharacterAbbot).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, &LogicManager::HAND_Abbot_LeaveLunch);
+	getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall] = 23;
+
+	params->clear();
+
+	fedEx(kCharacterAbbot, kCharacterAbbot, 12, 0);
+}
+
+void LogicManager::HAND_Abbot_LeaveLunch(HAND_PARAMS) {
+	if (msg->action == 12) {
+		getCharacter(kCharacterAbbot).characterPosition.location = 0;
+		blockView(kCharacterAbbot, kCarRestaurant, 67);
+		getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 1;
+		AbbotCall(&LogicManager::CONS_Abbot_DoJoinedSeqOtis, "029F", 37, 103798704, "029G");
+	} else if (msg->action == 18) {
+		switch (getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8]) {
+		case 1:
+			releaseView(kCharacterAbbot, kCarRestaurant, 67);
+			send(kCharacterAbbot, kCharacterWaiter1, 270068760, 0);
+			send(kCharacterAbbot, kCharacterAnna, 238936000, 0);
+			startSeqOtis(kCharacterAbbot, "804DS");
+
+			if (inDiningRoom(kCharacterCath))
+				advanceFrame(kCharacterAbbot);
+
+			getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 2;
+			AbbotCall(&LogicManager::CONS_Abbot_FinishSeqOtis, 0, 0, 0, 0);
+			break;
+		case 2:
+			getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 3;
+			AbbotCall(&LogicManager::CONS_Abbot_DoWalk, 4, 6470, 0, 0);
+			break;
+		case 3:
+			getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 4;
+			AbbotCall(&LogicManager::CONS_Abbot_DoEnterCorrOtis, "617Cc", 34, 0, 0);
+			break;
+		case 4:
+			getCharacter(kCharacterAbbot).characterPosition.location = 1;
+			CONS_Abbot_ClosedComp(0, 0, 0, 0);
+			break;
+		default:
+			return;
+		}
+	}
+}
+
+void LogicManager::CONS_Abbot_ClosedComp(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAbbot).callParams[getCharacter(kCharacterAbbot).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, &LogicManager::HAND_Abbot_ClosedComp);
+	getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall] = 24;
+
+	params->clear();
+
+	fedEx(kCharacterAbbot, kCharacterAbbot, 12, 0);
+}
+
+void LogicManager::HAND_Abbot_ClosedComp(HAND_PARAMS) {
+	switch (msg->action) {
+	case 0:
+		if (getCharacterCurrentParams(kCharacterAbbot)[0] || (getCharacterCurrentParams(kCharacterAbbot)[0] = _gameTime + 900, _gameTime != -900)) {
+			if (getCharacterCurrentParams(kCharacterAbbot)[0] >= _gameTime)
+				return;
+
+			getCharacterCurrentParams(kCharacterAbbot)[0] = 0x7FFFFFFF;
+		}
+
+		CONS_Abbot_GoSalon1(0, 0, 0, 0);
+		break;
+	case 8:
+	case 9:
+		setDoor(34, kCharacterAbbot, 1, 0, 0);
+		setDoor(50, kCharacterAbbot, 1, 0, 0);
+
+		if (msg->action == 8) {
+			getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 1;
+			AbbotCall(&LogicManager::CONS_Abbot_DoDialog, "LIB012", 0, 0, 0);
+		} else {
+			getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 2;
+			AbbotCall(&LogicManager::CONS_Abbot_DoDialog, "LIB013", 0, 0, 0);
+		}
+
+		break;
+	case 12:
+		endGraphics(kCharacterAbbot);
+		setDoor(34, kCharacterAbbot, 0, 10, 9);
+		setDoor(50, kCharacterAbbot, 0, 10, 9);
+		break;
+	case 18:
+		if (getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8]) {
+			if (getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] <= 2) {
+				getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 3;
+				AbbotCall(&LogicManager::CONS_Abbot_DoDialog, "Abb3001", 0, 0, 0);
+			} else if (getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] == 3) {
+				setDoor(34, kCharacterAbbot, 1, 10, 9);
+				setDoor(50, kCharacterAbbot, 1, 10, 9);
+			}
+		}
+
+		break;
+	default:
+		return;
+	}
+}
+
+void LogicManager::CONS_Abbot_GoSalon1(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAbbot).callParams[getCharacter(kCharacterAbbot).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, &LogicManager::HAND_Abbot_GoSalon1);
+	getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall] = 25;
+
+	params->clear();
+
+	fedEx(kCharacterAbbot, kCharacterAbbot, 12, 0);
+}
+
+void LogicManager::HAND_Abbot_GoSalon1(HAND_PARAMS) {
+	if (msg->action == 12) {
+		getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 1;
+		AbbotCall(&LogicManager::CONS_Abbot_DoCorrOtis, "617Dc", 34, 0, 0);
+	} else if (msg->action == 18) {
+		switch (getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8]) {
+		case 1:
+			getCharacter(kCharacterAbbot).characterPosition.location = 0;
+			setDoor(34, kCharacterCath, 0, 10, 9);
+			setDoor(50, kCharacterCath, 0, 10, 9);
+			getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 2;
+			AbbotCall(&LogicManager::CONS_Abbot_DoWalk, 5, 850, 0, 0);
+			break;
+		case 2:
+			getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 3;
+			AbbotCall(&LogicManager::CONS_Abbot_WaitRCClear, 0, 0, 0, 0);
+			break;
+		case 3:
+			getCharacter(kCharacterAbbot).characterPosition.position = 1540;
+			getCharacter(kCharacterAbbot).characterPosition.location = 0;
+			getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 4;
+			AbbotCall(&LogicManager::CONS_Abbot_DoBlockSeqOtis, "115A", 5, 56, 0);
+			break;
+		case 4:
+			getCharacter(kCharacterAbbot).characterPosition.location = 1;
+			takeItem(kItem3);
+			CONS_Abbot_InSalon(0, 0, 0, 0);
+			break;
+		default:
+			return;
+		}
+	}
+}
+
+void LogicManager::CONS_Abbot_InSalon(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAbbot).callParams[getCharacter(kCharacterAbbot).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, &LogicManager::HAND_Abbot_InSalon);
+	getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall] = 26;
+
+	params->clear();
+
+	fedEx(kCharacterAbbot, kCharacterAbbot, 12, 0);
+}
+
+void LogicManager::HAND_Abbot_InSalon(HAND_PARAMS) {
+	if (msg->action == 0) {
+		if (getCharacterCurrentParams(kCharacterAbbot)[0]) {
+			if ((!getCharacterCurrentParams(kCharacterAbbot)[1] &&
+				 (getCharacterCurrentParams(kCharacterAbbot)[1] = _gameTime + 4500, _gameTime == -4500)) ||
+				getCharacterCurrentParams(kCharacterAbbot)[1] < _gameTime) {
+				if (rcClear())
+					CONS_Abbot_GoComp(0, 0, 0, 0);
+			}
+		}
+	} else if (msg->action == 12) {
+		send(kCharacterAbbot, kCharacterKronos, 157159392, 0);
+		startCycOtis(kCharacterAbbot, "115B");
+	} else if (msg->action == 101169422) {
+		getCharacterCurrentParams(kCharacterAbbot)[0] = 1;
+	}
+}
+
+void LogicManager::CONS_Abbot_GoComp(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAbbot).callParams[getCharacter(kCharacterAbbot).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, &LogicManager::HAND_Abbot_GoComp);
+	getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall] = 27;
+
+	params->clear();
+
+	fedEx(kCharacterAbbot, kCharacterAbbot, 12, 0);
+}
+
+void LogicManager::HAND_Abbot_GoComp(HAND_PARAMS) {
+	if (msg->action == 12) {
+		getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 1;
+		AbbotCall(&LogicManager::CONS_Abbot_WaitRCClear, 0, 0, 0, 0);
+	} else if (msg->action == 18) {
+		switch (getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8]) {
+		case 1:
+			getCharacter(kCharacterAbbot).characterPosition.location = 0;
+			getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 2;
+			AbbotCall(&LogicManager::CONS_Abbot_DoBlockSeqOtis, "115C", 5, 56, 0);
+			break;
+		case 2:
+			dropItem(kItem3, 1);
+			getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 3;
+			AbbotCall(&LogicManager::CONS_Abbot_DoWalk, 4, 6470, 0, 0);
+			break;
+		case 3:
+			setDoor(34, kCharacterCath, 1, 255, 255);
+			getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 4;
+			AbbotCall(&LogicManager::CONS_Abbot_DoCorrOtis, "617Ac", 34, 0, 0);
+			break;
+		case 4:
+			setDoor(34, kCharacterCath, 2, 255, 255);
+			getCharacter(kCharacterAbbot).characterPosition.position = 6470;
+			getCharacter(kCharacterAbbot).characterPosition.location = 1;
+			CONS_Abbot_OpenComp2(0, 0, 0, 0);
+			break;
+		default:
+			return;
+		}
+	}
+}
+
+void LogicManager::CONS_Abbot_OpenComp2(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAbbot).callParams[getCharacter(kCharacterAbbot).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, &LogicManager::HAND_Abbot_OpenComp2);
+	getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall] = 28;
+
+	params->clear();
+
+	fedEx(kCharacterAbbot, kCharacterAbbot, 12, 0);
+}
+
+void LogicManager::HAND_Abbot_OpenComp2(HAND_PARAMS) {
+	if (msg->action == 0) {
+		if (_gameTime > 2052000 && !getCharacterCurrentParams(kCharacterAbbot)[0]) {
+			getCharacterCurrentParams(kCharacterAbbot)[0] = 1;
+			getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 2;
+			AbbotCall(&LogicManager::CONS_Abbot_GoWander, 0, 0, 0, 0);
+		}
+	} else if (msg->action == 12) {
+		send(kCharacterAbbot, kCharacterMonsieur, 122358304, 0);
+		startCycOtis(kCharacterAbbot, "508A");
+		getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 1;
+		AbbotCall(&LogicManager::CONS_Abbot_DoDialog, "Abb3013", 0, 0, 0);
+	} else if (msg->action == 18) {
+		if (getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] == 1)
+			startCycOtis(kCharacterAbbot, "508B");
+	} else if (msg->action == 222609266) {
+		CONS_Abbot_GoSalon2(0, 0, 0, 0);
+	}
+}
+
+void LogicManager::CONS_Abbot_GoWander(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAbbot).callParams[getCharacter(kCharacterAbbot).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, &LogicManager::HAND_Abbot_GoWander);
+	getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall] = 29;
+
+	params->clear();
+
+	fedEx(kCharacterAbbot, kCharacterAbbot, 12, 0);
+}
+
+void LogicManager::HAND_Abbot_GoWander(HAND_PARAMS) {
+	if (msg->action == 12) {
+		send(kCharacterAbbot, kCharacterMonsieur, 122288808, 0);
+		setDoor(34, kCharacterCath, 1, 255, 255);
+		getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 1;
+		AbbotCall(&LogicManager::CONS_Abbot_DoCorrOtis, "617Bc", 34, 0, 0);
+	} else if (msg->action == 18) {
+		switch (getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8]) {
+		case 1:
+			setDoor(34, kCharacterCath, 2, 255, 255);
+			getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 2;
+			AbbotCall(&LogicManager::CONS_Abbot_DoWalk, 4, 9460, 0, 0);
+			break;
+		case 2:
+			getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 3;
+			AbbotCall(&LogicManager::CONS_Abbot_DoWaitReal, 450, 0, 0, 0);
+			break;
+		case 3:
+			getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 4;
+			AbbotCall(&LogicManager::CONS_Abbot_DoWalk, 3, 540, 0, 0);
+			break;
+		case 4:
+			getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 5;
+			AbbotCall(&LogicManager::CONS_Abbot_DoWait, 225, 0, 0, 0);
+			break;
+		case 5:
+			getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 6;
+			AbbotCall(&LogicManager::CONS_Abbot_DoWalk, 4, 6470, 0, 0);
+			break;
+		case 6:
+			setDoor(34, kCharacterCath, 1, 255, 255);
+			getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 7;
+			AbbotCall(&LogicManager::CONS_Abbot_DoCorrOtis, "617Ac", 34, 0, 0);
+			break;
+		case 7:
+			setDoor(34, kCharacterCath, 2, 255, 255);
+			send(kCharacterAbbot, kCharacterMonsieur, 122358304, 0);
+			startCycOtis(13, "508B");
+
+			getCharacter(kCharacterAbbot).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, _functionsAbbot[getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall]]);
+
+			fedEx(kCharacterAbbot, kCharacterAbbot, 18, 0);
+			break;
+		default:
+			return;
+		}
+	}
+}
+
+void LogicManager::CONS_Abbot_GoSalon2(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAbbot).callParams[getCharacter(kCharacterAbbot).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, &LogicManager::HAND_Abbot_GoSalon2);
+	getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall] = 30;
+
+	params->clear();
+
+	fedEx(kCharacterAbbot, kCharacterAbbot, 12, 0);
+}
+
+void LogicManager::HAND_Abbot_GoSalon2(HAND_PARAMS) {
+	if (msg->action == 12) {
+		getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 1;
+		AbbotCall(&LogicManager::CONS_Abbot_DoDialog, "Abb3030", 0, 0, 0);
+	} else if (msg->action == 18) {
+		switch (getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8]) {
+		case 1:
+			send(kCharacterAbbot, kCharacterMonsieur, 122288808, 0);
+			setDoor(34, kCharacterCath, 1, 255, 255);
+			getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 2;
+			AbbotCall(&LogicManager::CONS_Abbot_DoCorrOtis, "617Bc", 0x22, 0, 0);
+			break;
+		case 2:
+			setDoor(34, kCharacterCath, 2, 255, 255);
+			getCharacter(kCharacterAbbot).characterPosition.location = 0;
+			getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 3;
+			AbbotCall(&LogicManager::CONS_Abbot_DoWalk, 5, 850, 0, 0);
+			break;
+		case 3:
+			getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 4;
+			AbbotCall(&LogicManager::CONS_Abbot_WaitRCClear, 0, 0, 0, 0);
+			break;
+		case 4:
+			getCharacter(kCharacterAbbot).characterPosition.position = 1540;
+			getCharacter(kCharacterAbbot).characterPosition.location = 0;
+			getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 5;
+			AbbotCall(&LogicManager::CONS_Abbot_DoBlockSeqOtis, "115A", 5, 56, 0);
+			break;
+		case 5:
+			takeItem(kItem3);
+			getCharacter(kCharacterAbbot).characterPosition.location = 1;
+			CONS_Abbot_InSalon2(0, 0, 0, 0);
+			break;
+		default:
+			return;
+		}
+	}
+}
+
+void LogicManager::CONS_Abbot_InSalon2(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAbbot).callParams[getCharacter(kCharacterAbbot).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, &LogicManager::HAND_Abbot_InSalon2);
+	getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall] = 31;
+
+	params->clear();
+
+	fedEx(kCharacterAbbot, kCharacterAbbot, 12, 0);
+}
+
+void LogicManager::HAND_Abbot_InSalon2(HAND_PARAMS) {
+	if (msg->action) {
+		if (msg->action == 12) {
+			getCharacterCurrentParams(kCharacterAbbot)[1] = _gameTime + 4500;
+			getCharacterCurrentParams(kCharacterAbbot)[2] = _gameTime + 18000;
+			startCycOtis(kCharacterAbbot, "115B");
+		} else if (msg->action == 18) {
+			switch (getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8]) {
+			case 1:
+				getCharacter(kCharacterAbbot).characterPosition.location = 0;
+				getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 2;
+				AbbotCall(&LogicManager::CONS_Abbot_DoBlockSeqOtis, "115E", 5, 56, 0);
+				break;
+			case 2:
+				dropItem(kItem3, 1);
+				send(kCharacterAbbot, kCharacterAlexei, 122358304, 0);
+				playDialog(kCharacterAbbot, "Abb3020", -1, 0);
+				getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 3;
+				AbbotCall(&LogicManager::CONS_Abbot_DoBlockSeqOtis, "125A", 5, 52, 0);
+				break;
+			case 3:
+				getCharacter(kCharacterAbbot).characterPosition.location = 1;
+				startCycOtis(kCharacterAbbot, "125B");
+				getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 4;
+				AbbotCall(&LogicManager::CONS_Abbot_DoDialog, "Abb3021", 0, 0, 0);
+				break;
+			case 4:
+				playDialog(kCharacterAbbot, "Abb3023", -1, 0);
+				blockView(kCharacterAbbot, kCarRestaurant, 52);
+				getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 5;
+				AbbotCall(&LogicManager::CONS_Abbot_DoComplexSeqOtis, "125C1", "125C2", 12, 0);
+				break;
+			case 5:
+				releaseView(kCharacterAbbot, kCarRestaurant, 52);
+				startCycOtis(kCharacterAbbot, "125D");
+				send(kCharacterAbbot, kCharacterAlexei, 122288808, 0);
+				getCharacterCurrentParams(kCharacterAbbot)[0] = 1;
+				goto LABEL_21;
+			case 6:
+				getCharacter(kCharacterAbbot).characterPosition.location = 0;
+				getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 7;
+				AbbotCall(&LogicManager::CONS_Abbot_DoBlockSeqOtis, "125E", 5, 52, 0);
+				break;
+			case 7:
+				CONS_Abbot_GoComp3(0, 0, 0, 0);
+				break;
+			default:
+				return;
+			}
+		}
+
+		return;
+	}
+
+	if (getCharacterCurrentParams(kCharacterAbbot)[3] != 0x7FFFFFFF && getCharacterCurrentParams(kCharacterAbbot)[1] < _gameTime) {
+		if (getCharacterCurrentParams(kCharacterAbbot)[2] < _gameTime)
+			goto LABEL_12;
+
+		if (!inSalon(kCharacterCath) || !getCharacterCurrentParams(kCharacterAbbot)[3]) {
+			getCharacterCurrentParams(kCharacterAbbot)[3] = _gameTime + 450;
+			if (_gameTime == -450)
+				goto LABEL_13;
+		}
+
+		if (getCharacterCurrentParams(kCharacterAbbot)[3] < _gameTime) {
+		LABEL_12:
+			getCharacterCurrentParams(kCharacterAbbot)[3] = 0x7FFFFFFF;
+		LABEL_13:
+			getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 1;
+			AbbotCall(&LogicManager::CONS_Abbot_WaitRCClear, 0, 0, 0, 0);
+			return;
+		}
+	}
+
+LABEL_21:
+	if (!getCharacterCurrentParams(kCharacterAbbot)[0])
+		return;
+
+	if (getCharacterCurrentParams(kCharacterAbbot)[4] || (getCharacterCurrentParams(kCharacterAbbot)[4] = _gameTime + 450, _gameTime != -450)) {
+		if (getCharacterCurrentParams(kCharacterAbbot)[4] >= _gameTime)
+			return;
+
+		getCharacterCurrentParams(kCharacterAbbot)[4] = 0x7FFFFFFF;
+	}
+
+	getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 6;
+	AbbotCall(&LogicManager::CONS_Abbot_WaitRCClear, 0, 0, 0, 0);
+}
+
+void LogicManager::CONS_Abbot_GoComp3(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAbbot).callParams[getCharacter(kCharacterAbbot).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, &LogicManager::HAND_Abbot_GoComp3);
+	getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall] = 32;
+
+	params->clear();
+
+	fedEx(kCharacterAbbot, kCharacterAbbot, 12, 0);
+}
+
+void LogicManager::HAND_Abbot_GoComp3(HAND_PARAMS) {
+	if (msg->action == 12) {
+		getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 1;
+		AbbotCall(&LogicManager::CONS_Abbot_DoWalk, 4, 6470, 0, 0);
+	} else if (msg->action == 18) {
+		if (getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] == 1) {
+			setDoor(34, kCharacterCath, 1, 255, 255);
+			getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 2;
+			AbbotCall(&LogicManager::CONS_Abbot_DoCorrOtis, "617Ac", 34, 0, 0);
+		} else if (getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] == 2) {
+			setDoor(34, kCharacterCath, 2, 255, 255);
+			getCharacter(kCharacterAbbot).characterPosition.position = 6470;
+			getCharacter(kCharacterAbbot).characterPosition.location = 1;
+			send(kCharacterAbbot, kCharacterMonsieur, 122358304, 0);
+			CONS_Abbot_OpenComp3(0, 0, 0, 0);
+		}
+	}
+}
+
+void LogicManager::CONS_Abbot_OpenComp3(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAbbot).callParams[getCharacter(kCharacterAbbot).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, &LogicManager::HAND_Abbot_OpenComp3);
+	getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall] = 33;
+
+	params->clear();
+
+	fedEx(kCharacterAbbot, kCharacterAbbot, 12, 0);
+}
+
+void LogicManager::HAND_Abbot_OpenComp3(HAND_PARAMS) {
+	if (msg->action == 0) {
+		if (getCharacterCurrentParams(kCharacterAbbot)[0] != 0x7FFFFFFF && _gameTime > 2115000) {
+			if (_gameTime <= 2124000) {
+				if (!nearChar(kCharacterAbbot, kCharacterCath, 2000) || !getCharacterCurrentParams(kCharacterAbbot)[0]) {
+					getCharacterCurrentParams(kCharacterAbbot)[0] = _gameTime;
+					if (!_gameTime) {
+						getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 1;
+						AbbotCall(&LogicManager::CONS_Abbot_DoDialog, "Abb3014", 0, 0, 0);
+						return;
+					}
+				}
+
+				if (getCharacterCurrentParams(kCharacterAbbot)[0] >= _gameTime)
+					return;
+			}
+
+			getCharacterCurrentParams(kCharacterAbbot)[0] = 0x7FFFFFFF;
+			getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 1;
+
+			AbbotCall(&LogicManager::CONS_Abbot_DoDialog, "Abb3014", 0, 0, 0);
+		}
+	} else if (msg->action == 12) {
+		startCycOtis(kCharacterAbbot, "508A");
+	} else if (msg->action == 18) {
+		if (getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] == 1)
+			startCycOtis(kCharacterAbbot, "508B");
+	} else if (msg->action == 123712592) {
+		CONS_Abbot_GoSalon3(0, 0, 0, 0);
+	}
+}
+
+void LogicManager::CONS_Abbot_GoSalon3(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAbbot).callParams[getCharacter(kCharacterAbbot).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, &LogicManager::HAND_Abbot_GoSalon3);
+	getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall] = 34;
+
+	params->clear();
+
+	fedEx(kCharacterAbbot, kCharacterAbbot, 12, 0);
+}
+
+void LogicManager::HAND_Abbot_GoSalon3(HAND_PARAMS) {
+	if (msg->action == 12) {
+		getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 1;
+		AbbotCall(&LogicManager::CONS_Abbot_DoDialog, "Abb3031", 0, 0, 0);
+	} else if (msg->action == 18) {
+		switch (getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8]) {
+		case 1:
+			send(kCharacterAbbot, kCharacterMonsieur, 122288808, 0);
+			setDoor(34, kCharacterCath, 1, 255, 255);
+			getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 2;
+			AbbotCall(&LogicManager::CONS_Abbot_DoCorrOtis, "617Bc", 34, 0, 0);
+			break;
+		case 2:
+			setDoor(34, kCharacterCath, 2, 255, 255);
+			getCharacter(kCharacterAbbot).characterPosition.location = 0;
+			getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 3;
+			AbbotCall(&LogicManager::CONS_Abbot_DoWalk, 5, 850, 0, 0);
+			break;
+		case 3:
+			getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 4;
+			AbbotCall(&LogicManager::CONS_Abbot_WaitRCClear, 0, 0, 0, 0);
+			break;
+		case 4:
+			getCharacter(kCharacterAbbot).characterPosition.position = 1540;
+			getCharacter(kCharacterAbbot).characterPosition.location = 0;
+			getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 5;
+			AbbotCall(&LogicManager::CONS_Abbot_DoBlockSeqOtis, "115A", 5, 56, 0);
+			break;
+		case 5:
+			takeItem(kItem3);
+			getCharacter(kCharacterAbbot).characterPosition.location = 1;
+			CONS_Abbot_InSalon3(0, 0, 0, 0);
+			break;
+		default:
+			break;
+		}
+	}
+}
+
+void LogicManager::CONS_Abbot_InSalon3(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAbbot).callParams[getCharacter(kCharacterAbbot).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, &LogicManager::HAND_Abbot_InSalon3);
+	getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall] = 35;
+
+	params->clear();
+
+	fedEx(kCharacterAbbot, kCharacterAbbot, 12, 0);
+}
+
+void LogicManager::HAND_Abbot_InSalon3(HAND_PARAMS) {
+	switch (msg->action) {
+	case 0:
+		if (getCharacterCurrentParams(kCharacterAbbot)[1] == 0x7FFFFFFF || !_gameTime)
+			return;
+
+		if (getCharacterCurrentParams(kCharacterAbbot)[0] >= _gameTime) {
+			if (!inSalon(kCharacterCath) || !getCharacterCurrentParams(kCharacterAbbot)[1]) {
+				getCharacterCurrentParams(kCharacterAbbot)[1] = _gameTime + 450;
+				if (_gameTime == -450) {
+					send(kCharacterAbbot, kCharacterAugust, 136196244, 0);
+					getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 1;
+					AbbotCall(&LogicManager::CONS_Abbot_DoWait, 0, 0, 0, 0);
+					return;
+				}
+			}
+
+			if (getCharacterCurrentParams(kCharacterAbbot)[1] >= _gameTime)
+				return;
+		}
+
+		getCharacterCurrentParams(kCharacterAbbot)[1] = 0x7FFFFFFF;
+		send(kCharacterAbbot, kCharacterAugust, 136196244, 0);
+		getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 1;
+		AbbotCall(&LogicManager::CONS_Abbot_DoWait, 0, 0, 0, 0);
+		return;
+	case 12:
+		startCycOtis(kCharacterAbbot, "115B");
+		getCharacterCurrentParams(kCharacterAbbot)[0] = _gameTime + 9000;
+		break;
+	case 18:
+		switch (getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8]) {
+		case 1:
+			getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 2;
+			AbbotCall(&LogicManager::CONS_Abbot_WaitRCClear, 0, 0, 0, 0);
+			break;
+		case 2:
+			getCharacter(kCharacterAbbot).characterPosition.location = 0;
+			playDialog(kCharacterAbbot, "Abb3040", -1, 45);
+			blockView(kCharacterAbbot, kCarRestaurant, 57);
+			getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 3;
+			AbbotCall(&LogicManager::CONS_Abbot_DoJoinedSeqOtis, "121A", 2, 122358304u, "BOGUS");
+			break;
+		case 3:
+			releaseView(kCharacterAbbot, kCarRestaurant, 57);
+			dropItem(kItem3, 1);
+			getCharacter(kCharacterAbbot).characterPosition.location = 1;
+			CONS_Abbot_WithAugust(0, 0, 0, 0);
+			break;
+		}
+
+		break;
+	}
+}
+
+void LogicManager::CONS_Abbot_WithAugust(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAbbot).callParams[getCharacter(kCharacterAbbot).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, &LogicManager::HAND_Abbot_WithAugust);
+	getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall] = 36;
+
+	params->clear();
+
+	fedEx(kCharacterAbbot, kCharacterAbbot, 12, 0);
+}
+
+void LogicManager::HAND_Abbot_WithAugust(HAND_PARAMS) {
+	switch (msg->action) {
+	case 0:
+		switch (getCharacterCurrentParams(kCharacterAbbot)[1]) {
+		case 1:
+			if (getCharacterCurrentParams(kCharacterAbbot)[2] == 0x7FFFFFFF || !_gameTime)
+				return;
+
+			if (getCharacterCurrentParams(kCharacterAbbot)[0] >= _gameTime) {
+				if (!inSalon(kCharacterCath) || !getCharacterCurrentParams(kCharacterAbbot)[2]) {
+					getCharacterCurrentParams(kCharacterAbbot)[2] = _gameTime + 675;
+					if (_gameTime == -675) {
+						playDialog(kCharacterAbbot, "Abb3041", -1, 0);
+						return;
+					}
+				}
+
+				if (getCharacterCurrentParams(kCharacterAbbot)[2] >= _gameTime)
+					return;
+			}
+
+			getCharacterCurrentParams(kCharacterAbbot)[2] = 0x7FFFFFFF;
+			playDialog(kCharacterAbbot, "Abb3041", -1, 0);
+			break;
+		case 2:
+			if (getCharacterCurrentParams(kCharacterAbbot)[3] || (getCharacterCurrentParams(kCharacterAbbot)[3] = _gameTime + 900, _gameTime != -900)) {
+				if (getCharacterCurrentParams(kCharacterAbbot)[3] >= _gameTime)
+					return;
+
+				getCharacterCurrentParams(kCharacterAbbot)[3] = 0x7FFFFFFF;
+			}
+
+			playDialog(kCharacterAbbot, "Abb3042", -1, 0);
+			break;
+		case 3:
+			playDialog(kCharacterAbbot, "Abb3043", -1, 0);
+			blockView(kCharacterAbbot, kCarRestaurant, 57);
+			getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 1;
+			AbbotCall(&LogicManager::CONS_Abbot_DoJoinedSeqOtis, "121D", 2, 122288808, "BOGUS");
+			break;
+		}
+
+		break;
+	case 2:
+		getCharacterCurrentParams(kCharacterAbbot)[1]++;
+		break;
+	case 12:
+		getCharacterCurrentParams(kCharacterAbbot)[0] = _gameTime + 4500;
+		startCycOtis(kCharacterAbbot, "121B");
+		break;
+	case 17:
+		if (checkCathDir(kCarRestaurant, 57)) {
+			bumpCath(kCarRestaurant, 50, 255);
+		}
+
+		break;
+	case 18:
+		if (getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] == 1) {
+			releaseView(kCharacterAbbot, kCarRestaurant, 57);
+			CONS_Abbot_GoComp4(0, 0, 0, 0);
+		}
+
+		break;
+	default:
+		break;
+	}
+}
+
+void LogicManager::CONS_Abbot_GoComp4(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAbbot).callParams[getCharacter(kCharacterAbbot).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, &LogicManager::HAND_Abbot_GoComp4);
+	getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall] = 37;
+
+	params->clear();
+
+	fedEx(kCharacterAbbot, kCharacterAbbot, 12, 0);
+}
+
+void LogicManager::HAND_Abbot_GoComp4(HAND_PARAMS) {
+	if (msg->action == 12) {
+		getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 1;
+		AbbotCall(&LogicManager::CONS_Abbot_DoWalk, 4, 6470, 0, 0);
+	} else if (msg->action == 18) {
+		if (getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] == 1) {
+			setDoor(34, kCharacterCath, 1, 255, 255);
+			getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 2;
+			AbbotCall(&LogicManager::CONS_Abbot_DoCorrOtis, "617Ac", 34, 0, 0);
+		} else if (getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] == 2) {
+			setDoor(34, kCharacterCath, 2, 255, 255);
+			getCharacter(kCharacterAbbot).characterPosition.position = 6470;
+			getCharacter(kCharacterAbbot).characterPosition.location = 1;
+			send(kCharacterAbbot, kCharacterMonsieur, 122358304, 0);
+			CONS_Abbot_InComp4(0, 0, 0, 0);
+		}
+	}
+}
+
+void LogicManager::CONS_Abbot_InComp4(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAbbot).callParams[getCharacter(kCharacterAbbot).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, &LogicManager::HAND_Abbot_InComp4);
+	getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall] = 38;
+
+	params->clear();
+
+	fedEx(kCharacterAbbot, kCharacterAbbot, 12, 0);
+}
+
+void LogicManager::HAND_Abbot_InComp4(HAND_PARAMS) {
+	if (msg->action == 12) {
+		startCycOtis(kCharacterAbbot, "508A");
+		getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 1;
+		AbbotCall(&LogicManager::CONS_Abbot_DoDialog, "Abb3014A", 0, 0, 0);
+	} else if (msg->action == 18) {
+		if (getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] == 1) {
+			startCycOtis(kCharacterAbbot, "508B");
+		}
+	}
+}
+
+void LogicManager::CONS_Abbot_StartPart4(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAbbot).callParams[getCharacter(kCharacterAbbot).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, &LogicManager::HAND_Abbot_StartPart4);
+	getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall] = 39;
+
+	params->clear();
+
+	fedEx(kCharacterAbbot, kCharacterAbbot, 12, 0);
+}
+
+void LogicManager::HAND_Abbot_StartPart4(HAND_PARAMS) {
+	if (msg->action == 0) {
+		CONS_Abbot_AtDinner(0, 0, 0, 0);
+	} else if (msg->action == 12) {
+		endGraphics(13);
+		getCharacter(kCharacterAbbot).inventoryItem = 0;
+		getCharacter(kCharacterAbbot).characterPosition.car = kCarRestaurant;
+		getCharacterParams(kCharacterAbbot, 8)[0] = 0;
+	}
+}
+
+void LogicManager::CONS_Abbot_DoWalkSearchingForCath(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAbbot).callParams[getCharacter(kCharacterAbbot).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, &LogicManager::HAND_Abbot_DoWalkSearchingForCath);
+	getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall] = 40;
+
+	params->clear();
+
+	params->parameters[0] = param1.intParam;
+	params->parameters[1] = param2.intParam;
+
+	fedEx(kCharacterAbbot, kCharacterAbbot, 12, 0);
+}
+
+void LogicManager::HAND_Abbot_DoWalkSearchingForCath(HAND_PARAMS) {
+	if (msg->action == 0) {
+		if (walk(kCharacterAbbot, getCharacterCurrentParams(kCharacterAbbot)[0], getCharacterCurrentParams(kCharacterAbbot)[1])) {
+			getCharacter(kCharacterAbbot).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, _functionsAbbot[getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall]]);
+			fedEx(kCharacterAbbot, kCharacterAbbot, 18, 0);
+		} else if (!_gameEvents[kEventAbbotInvitationDrink] && nearChar(kCharacterAbbot, kCharacterCath, 1000) && !inComp(kCharacterCath) && !whoOutside(kCharacterCath)) {
+			if (getCharacter(kCharacterAbbot).characterPosition.car == 3 || getCharacter(kCharacterAbbot).characterPosition.car == 4) {
+				getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 1;
+				AbbotCall(&LogicManager::CONS_Abbot_SaveGame, 2, 113, 0, 0);
+			}
+		}
+	} else if (msg->action == 12) {
+		if (walk(kCharacterAbbot, getCharacterCurrentParams(kCharacterAbbot)[0], getCharacterCurrentParams(kCharacterAbbot)[1])) {
+			getCharacter(kCharacterAbbot).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, _functionsAbbot[getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall]]);
+			fedEx(kCharacterAbbot, kCharacterAbbot, 18, 0);
+		}
+	} else if (msg->action == 18 && getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] == 1) {
+		playNIS(kEventAbbotInvitationDrink);
+
+		if (getCharacter(kCharacterAbbot).direction == 1) {
+			bumpCathFx(getCharacter(kCharacterAbbot).characterPosition.car, getCharacter(kCharacterAbbot).characterPosition.position - 750);
+		} else {
+			bumpCathRx(getCharacter(kCharacterAbbot).characterPosition.car, getCharacter(kCharacterAbbot).characterPosition.position + 750);
+		}
+	}
+}
+
+void LogicManager::CONS_Abbot_AtDinner(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAbbot).callParams[getCharacter(kCharacterAbbot).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, &LogicManager::HAND_Abbot_AtDinner);
+	getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall] = 41;
+
+	params->clear();
+
+	fedEx(kCharacterAbbot, kCharacterAbbot, 12, 0);
+}
+
+void LogicManager::HAND_Abbot_AtDinner(HAND_PARAMS) {
+	if (msg->action == 0) {
+		if (_gameTime > 2358000 && !getCharacterCurrentParams(kCharacterAbbot)[0]) {
+			getCharacterCurrentParams(kCharacterAbbot)[0] = 1;
+			send(kCharacterAbbot, kCharacterWaiter1, 218128129, 0);
+		}
+		if (_gameTime > 2389500) {
+			if (rcClear())
+				CONS_Abbot_LeaveDinner(0, 0, 0, 0);
+		}
+	} else if (msg->action == 12) {
+		send(kCharacterAbbot, kCharacterTableE, 136455232, 0);
+		startCycOtis(kCharacterAbbot, "029E");
+		getCharacter(kCharacterAbbot).characterPosition.location = 1;
+	} else if (msg->action == 122288808) {
+		startCycOtis(kCharacterAbbot, "029E");
+	} else if (msg->action == 122358304) {
+		startCycOtis(kCharacterAbbot, "BLANK");
+	}
+}
+
+void LogicManager::CONS_Abbot_LeaveDinner(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAbbot).callParams[getCharacter(kCharacterAbbot).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, &LogicManager::HAND_Abbot_LeaveDinner);
+	getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall] = 42;
+
+	params->clear();
+
+	fedEx(kCharacterAbbot, kCharacterAbbot, 12, 0);
+}
+
+void LogicManager::HAND_Abbot_LeaveDinner(HAND_PARAMS) {
+	if (msg->action == 12) {
+		getCharacter(kCharacterAbbot).characterPosition.location = 0;
+		blockView(kCharacterAbbot, kCarRestaurant, 67);
+		getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 1;
+		AbbotCall(&LogicManager::CONS_Abbot_DoJoinedSeqOtis, "029F", 37, 103798704, "029G");
+	} else if (msg->action == 18) {
+		switch (getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8]) {
+		case 1:
+			releaseView(kCharacterAbbot, kCarRestaurant, 67);
+			send(kCharacterAbbot, kCharacterWaiter1, 270068760, 0);
+			startSeqOtis(kCharacterAbbot, "804DS");
+			if (inDiningRoom(kCharacterCath))
+				advanceFrame(kCharacterAbbot);
+			getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 2;
+			AbbotCall(&LogicManager::CONS_Abbot_FinishSeqOtis, 0, 0, 0, 0);
+			break;
+		case 2:
+			getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 3;
+			AbbotCall(&LogicManager::CONS_Abbot_DoWalk, 4, 6470, 0, 0);
+			break;
+		case 3:
+			getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 4;
+			AbbotCall(&LogicManager::CONS_Abbot_DoEnterCorrOtis, "617Cc", 34, 0, 0);
+			break;
+		case 4:
+			getCharacter(kCharacterAbbot).characterPosition.location = 1;
+			endGraphics(kCharacterAbbot);
+			CONS_Abbot_InComp(0, 0, 0, 0);
+			break;
+		default:
+			return;
+		}
+	}
+}
+
+void LogicManager::CONS_Abbot_InComp(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAbbot).callParams[getCharacter(kCharacterAbbot).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, &LogicManager::HAND_Abbot_InComp);
+	getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall] = 43;
+
+	params->clear();
+
+	fedEx(kCharacterAbbot, kCharacterAbbot, 12, 0);
+}
+
+void LogicManager::HAND_Abbot_InComp(HAND_PARAMS) {
+	if (msg->action > 9) {
+		if (msg->action > 17) {
+			switch (msg->action) {
+			case 18:
+				switch (getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8]) {
+				case 1:
+					if (_gameTime > 2466000 && !getCharacterCurrentParams(kCharacterAbbot)[4]) {
+						getCharacterCurrentParams(kCharacterAbbot)[4] = 1;
+						CONS_Abbot_Asleep4(0, 0, 0, 0);
+						return;
+					}
+
+					if (getCharacterCurrentParams(kCharacterAbbot)[2]) {
+						if (getCharacterCurrentParams(kCharacterAbbot)[5] || (getCharacterCurrentParams(kCharacterAbbot)[5] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
+							if (getCharacterCurrentParams(kCharacterAbbot)[5] >= _currentGameSessionTicks)
+								return;
+
+							getCharacterCurrentParams(kCharacterAbbot)[5] = 0x7FFFFFFF;
+						}
+
+						getCharacterCurrentParams(kCharacterAbbot)[2] = 0;
+						getCharacterCurrentParams(kCharacterAbbot)[1] = 1;
+
+						setDoor(34, kCharacterAbbot, 1, 0, 0);
+						setDoor(50, kCharacterAbbot, 1, 0, 0);
+
+						getCharacterCurrentParams(kCharacterAbbot)[5] = 0;
+					} else {
+						getCharacterCurrentParams(kCharacterAbbot)[5] = 0;
+					}
+
+					break;
+				case 2:
+				case 3:
+					getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 4;
+					AbbotCall(&LogicManager::CONS_Abbot_DoDialog, "Abb3001", 0, 0, 0);
+					break;
+				case 4:
+					setDoor(34, kCharacterAbbot, 1, 14, 0);
+					setDoor(50, kCharacterAbbot, 1, 14, 0);
+					getCharacterCurrentParams(kCharacterAbbot)[2] = 1;
+					break;
+				case 5:
+				case 6:
+					getCharacterCurrentParams(kCharacterAbbot)[2] = 0;
+					getCharacterCurrentParams(kCharacterAbbot)[1] = 1;
+					break;
+				default:
+					return;
+				}
+				break;
+			case 101687594:
+				getCharacterCurrentParams(kCharacterAbbot)[0] = 1;
+				break;
+			case 159003408:
+				getCharacterCurrentParams(kCharacterAbbot)[0] = 0;
+				break;
+			}
+		} else if (msg->action == 17) {
+			if (getCharacterCurrentParams(kCharacterAbbot)[1] || getCharacterCurrentParams(kCharacterAbbot)[2]) {
+				setDoor(34, kCharacterAbbot, 1, 10, 9);
+				setDoor(50, kCharacterAbbot, 1, 10, 9);
+				getCharacterCurrentParams(kCharacterAbbot)[1] = 0;
+				getCharacterCurrentParams(kCharacterAbbot)[2] = 0;
+			}
+		} else if (msg->action == 12) {
+			setDoor(34, kCharacterAbbot, 1, 10, 9);
+			setDoor(50, kCharacterAbbot, 1, 10, 9);
+		}
+	} else if (msg->action >= 8) {
+		if (getCharacterCurrentParams(kCharacterAbbot)[2]) {
+			setDoor(34, kCharacterAbbot, 1, 0, 0);
+			setDoor(50, kCharacterAbbot, 1, 0, 0);
+
+			if (msg->param.intParam == 50) {
+				getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 5;
+				AbbotCall(&LogicManager::CONS_Abbot_DoDialog, getCathWCDialog(), 0, 0, 0);
+			} else {
+				getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 6;
+				AbbotCall(&LogicManager::CONS_Abbot_DoDialog, getCathSorryDialog(), 0, 0, 0);
+			}
+		} else {
+			setDoor(34, kCharacterAbbot, 1, 0, 0);
+			setDoor(50, kCharacterAbbot, 1, 0, 0);
+
+			if (msg->action == 8) {
+				getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 2;
+				AbbotCall(&LogicManager::CONS_Abbot_DoDialog, "LIB012", 0, 0, 0);
+			} else {
+				getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 3;
+				AbbotCall(&LogicManager::CONS_Abbot_DoDialog, "LIB013", 0, 0, 0);
+			}
+		}
+	} else if (msg->action == 0) {
+		if (getCharacterCurrentParams(kCharacterAbbot)[0] && getCharacterCurrentParams(kCharacterAbbot)[3] != 0x7FFFFFFF && _gameTime) {
+			if (_gameTime > 2452500) {
+				getCharacterCurrentParams(kCharacterAbbot)[3] = 0x7FFFFFFF;
+				getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 1;
+				AbbotCall(&LogicManager::CONS_Abbot_DoDialog, "Abb4002", 0, 0, 0);
+				return;
+			}
+
+			if (!nearChar(kCharacterAbbot, kCharacterCath, 1000) || whoRunningDialog(kCharacterMonsieur) || !getCharacterCurrentParams(kCharacterAbbot)[3]) {
+				getCharacterCurrentParams(kCharacterAbbot)[3] = _gameTime;
+
+				if (!_gameTime) {
+					getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 1;
+					AbbotCall(&LogicManager::CONS_Abbot_DoDialog, "Abb4002", 0, 0, 0);
+					return;
+				}
+			}
+
+			if (getCharacterCurrentParams(kCharacterAbbot)[3] < _gameTime) {
+				getCharacterCurrentParams(kCharacterAbbot)[3] = 0x7FFFFFFF;
+				getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 1;
+				AbbotCall(&LogicManager::CONS_Abbot_DoDialog, "Abb4002", 0, 0, 0);
+				return;
+			}
+		}
+
+		if (_gameTime > 2466000 && !getCharacterCurrentParams(kCharacterAbbot)[4]) {
+			getCharacterCurrentParams(kCharacterAbbot)[4] = 1;
+			CONS_Abbot_Asleep4(0, 0, 0, 0);
+			return;
+		}
+
+		if (getCharacterCurrentParams(kCharacterAbbot)[2]) {
+			if (getCharacterCurrentParams(kCharacterAbbot)[5] || (getCharacterCurrentParams(kCharacterAbbot)[5] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
+				if (getCharacterCurrentParams(kCharacterAbbot)[5] >= _currentGameSessionTicks)
+					return;
+
+				getCharacterCurrentParams(kCharacterAbbot)[5] = 0x7FFFFFFF;
+			}
+
+			getCharacterCurrentParams(kCharacterAbbot)[2] = 0;
+			getCharacterCurrentParams(kCharacterAbbot)[1] = 1;
+
+			setDoor(34, kCharacterAbbot, 1, 0, 0);
+			setDoor(50, kCharacterAbbot, 1, 0, 0);
+
+			getCharacterCurrentParams(kCharacterAbbot)[5] = 0;
+		} else {
+			getCharacterCurrentParams(kCharacterAbbot)[5] = 0;
+		}
+	}
+}
+
+void LogicManager::CONS_Abbot_Asleep4(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAbbot).callParams[getCharacter(kCharacterAbbot).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, &LogicManager::HAND_Abbot_Asleep4);
+	getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall] = 44;
+
+	params->clear();
+
+	fedEx(kCharacterAbbot, kCharacterAbbot, 12, 0);
+}
+
+void LogicManager::HAND_Abbot_Asleep4(HAND_PARAMS) {
+
+	if (msg->action == 12) {
+		getCharacter(kCharacterAbbot).characterPosition.car = kCarRedSleeping;
+		getCharacter(kCharacterAbbot).characterPosition.position = 6470;
+		getCharacter(kCharacterAbbot).characterPosition.location = 1;
+
+		endGraphics(kCharacterAbbot);
+
+		setDoor(34, kCharacterCath, 1, 10, 9);
+		setDoor(50, kCharacterCath, 1, 10, 9);
+	} else if (msg->action == 104060776) {
+		CONS_Abbot_Conferring(0, 0, 0, 0);
+	}
+}
+
+void LogicManager::CONS_Abbot_Conferring(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAbbot).callParams[getCharacter(kCharacterAbbot).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, &LogicManager::HAND_Abbot_Conferring);
+	getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall] = 45;
+
+	params->clear();
+
+	fedEx(kCharacterAbbot, kCharacterAbbot, 12, 0);
+}
+
+void LogicManager::HAND_Abbot_Conferring(HAND_PARAMS) {
+	if (msg->action == 12) {
+		getCharacter(kCharacterAbbot).characterPosition.position = 6471;
+		getCharacter(kCharacterAbbot).characterPosition.location = 0;
+		getCharacter(kCharacterAbbot).characterPosition.car = kCarRedSleeping;
+
+		forceJump(kCharacterTrainM, &LogicManager::CONS_TrainM_Conferring);
+		startCycOtis(kCharacterAbbot, "617Ec");
+		softBlockAtDoor(kCharacterAbbot, 34);
+
+		getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 1;
+
+		AbbotCall(&LogicManager::CONS_Abbot_DoDialog, "Abb4010", 0, 0, 0);
+	} else if (msg->action == 18) {
+		if (getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] == 1) {
+			getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 2;
+			AbbotCall(&LogicManager::CONS_Abbot_DoCorrOtis, "617Kc", 34, 0, 0);
+		} else if (getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] == 2) {
+			softReleaseAtDoor(kCharacterAbbot, 34);
+			send(kCharacterAbbot, kCharacterTrainM, 125233040, 0);
+
+			CONS_Abbot_GoSalon4(0, 0, 0, 0);
+		}
+	}
+}
+
+void LogicManager::CONS_Abbot_GoSalon4(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAbbot).callParams[getCharacter(kCharacterAbbot).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, &LogicManager::HAND_Abbot_GoSalon4);
+	getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall] = 46;
+
+	params->clear();
+
+	fedEx(kCharacterAbbot, kCharacterAbbot, 12, 0);
+}
+
+void LogicManager::HAND_Abbot_GoSalon4(HAND_PARAMS) {
+	if (msg->action == 12) {
+		getCharacter(kCharacterAbbot).characterPosition.position = 6471;
+		getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 1;
+		AbbotCall(&LogicManager::CONS_Abbot_DoWalkSearchingForCath, 5, 850, 0, 0);
+	} else if (msg->action == 18) {
+		if (getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] == 1) {
+			CONS_Abbot_BeforeBomb(0, 0, 0, 0);
+		}
+	}
+}
+
+void LogicManager::CONS_Abbot_BeforeBomb(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAbbot).callParams[getCharacter(kCharacterAbbot).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, &LogicManager::HAND_Abbot_BeforeBomb);
+	getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall] = 47;
+
+	params->clear();
+
+	fedEx(kCharacterAbbot, kCharacterAbbot, 12, 0);
+}
+
+void LogicManager::HAND_Abbot_BeforeBomb(HAND_PARAMS) {
+	switch (msg->action) {
+	case 1:
+		getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 3;
+		AbbotCall(&LogicManager::CONS_Abbot_SaveGame, 2, 114, 0, 0);
+		break;
+	case 12:
+		getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 1;
+		AbbotCall(&LogicManager::CONS_Abbot_WaitRCClear, 0, 0, 0, 0);
+		break;
+	case 18:
+		switch (getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8]) {
+		case 1:
+			getCharacter(kCharacterAbbot).characterPosition.position = 1540;
+			getCharacter(kCharacterAbbot).characterPosition.location = 0;
+			getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 2;
+			AbbotCall(&LogicManager::CONS_Abbot_DoSeqOtis, "126A", 0, 0, 0);
+			break;
+		case 2:
+			getCharacter(kCharacterAbbot).characterPosition.location = 1;
+			startCycOtis(kCharacterAbbot, "126B");
+			getCharacter(kCharacterAbbot).inventoryItem = 16;
+			break;
+		case 3:
+			playNIS(kEventAbbotDrinkGiveDetonator);
+			endGame(0, 1, 0, true);
+			break;
+		}
+
+		break;
+	}
+}
+
+void LogicManager::CONS_Abbot_AfterBomb(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAbbot).callParams[getCharacter(kCharacterAbbot).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, &LogicManager::HAND_Abbot_AfterBomb);
+	getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall] = 48;
+
+	params->clear();
+
+	fedEx(kCharacterAbbot, kCharacterAbbot, 12, 0);
+}
+
+void LogicManager::HAND_Abbot_AfterBomb(HAND_PARAMS) {
+	switch (msg->action) {
+	case 0:
+		if (getCharacterParams(kCharacterAbbot, 8)[0])
+			getCharacter(kCharacterAbbot).inventoryItem = kItemInvalid;
+
+		if (!getCharacterCurrentParams(kCharacterAbbot)[0]) {
+			getCharacterCurrentParams(kCharacterAbbot)[0] = _gameTime + 1800;
+
+			if (_gameTime == -1800) {
+				getCharacter(kCharacterAbbot).inventoryItem = 0;
+				getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 4;
+				AbbotCall(&LogicManager::CONS_Abbot_DoBlockSeqOtis, "126C", 5, 52, 0);
+				return;
+			}
+		}
+
+		if (getCharacterCurrentParams(kCharacterAbbot)[0] < _gameTime) {
+			getCharacterCurrentParams(kCharacterAbbot)[0] = 0x7FFFFFFF;
+			getCharacter(kCharacterAbbot).inventoryItem = 0;
+			getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 4;
+			AbbotCall(&LogicManager::CONS_Abbot_DoBlockSeqOtis, "126C", 5, 52, 0);
+		} else if (_gameTime > 2533500 && !getCharacterCurrentParams(kCharacterAbbot)[1]) {
+			getCharacterCurrentParams(kCharacterAbbot)[1] = 1;
+			getCharacter(kCharacterAbbot).inventoryItem = 0;
+			getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 5;
+			AbbotCall(&LogicManager::CONS_Abbot_WaitRCClear, 0, 0, 0, 0);
+		}
+
+		break;
+	case 1:
+		getCharacter(kCharacterAbbot).inventoryItem = 0;
+		getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 9;
+		AbbotCall(&LogicManager::CONS_Abbot_SaveGame, 2, 117, 0, 0);
+		break;
+	case 12:
+		getCharacter(kCharacterAbbot).characterPosition.position = 850;
+		getCharacter(kCharacterAbbot).characterPosition.location = 0;
+		getCharacter(kCharacterAbbot).characterPosition.car = kCarRedSleeping;
+		getCharacter(kCharacterAbbot).inventoryItem = 0;
+		send(kCharacterAbbot, kCharacterTrainM, 125233040, 0);
+		getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 1;
+		AbbotCall(&LogicManager::CONS_Abbot_DoWalk, 5, 850, 0, 0);
+		break;
+	case 18:
+		switch (getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8]) {
+		case 1:
+			getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 2;
+			AbbotCall(&LogicManager::CONS_Abbot_WaitRCClear, 0, 0, 0, 0);
+			break;
+		case 2:
+			getCharacter(kCharacterAbbot).characterPosition.position = 1540;
+			getCharacter(kCharacterAbbot).characterPosition.location = 0;
+			getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 3;
+			AbbotCall(&LogicManager::CONS_Abbot_DoBlockSeqOtis, "126A", 5, 52, 0);
+			break;
+		case 3:
+			getCharacter(kCharacterAbbot).characterPosition.location = 1;
+			startCycOtis(13, "126B");
+			break;
+		case 4:
+			if (!_gameEvents[kEventAbbotDrinkDefuse] && getCharacterParams(kCharacterAbbot, 8)[0])
+				getCharacter(kCharacterAbbot).inventoryItem = kItemInvalid;
+
+			startCycOtis(kCharacterAbbot, "126B");
+			getCharacterCurrentParams(kCharacterAbbot)[0] = 0;
+
+			if (_gameTime > 2533500 && !getCharacterCurrentParams(kCharacterAbbot)[1]) {
+				getCharacterCurrentParams(kCharacterAbbot)[1] = 1;
+				getCharacter(kCharacterAbbot).inventoryItem = 0;
+				getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 5;
+				AbbotCall(&LogicManager::CONS_Abbot_WaitRCClear, 0, 0, 0, 0);
+			}
+
+			break;
+		case 5:
+			getCharacter(kCharacterAbbot).characterPosition.location = 1;
+			getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 6;
+			AbbotCall(&LogicManager::CONS_Abbot_DoBlockSeqOtis, "126D", 5, 52, 0);
+			break;
+		case 6:
+			getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 7;
+			AbbotCall(&LogicManager::CONS_Abbot_DoWalk, 4, 6470, 0, 0);
+			break;
+		case 7:
+			getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 8;
+			AbbotCall(&LogicManager::CONS_Abbot_DoEnterCorrOtis, "617Cc", 34, 0, 0);
+			break;
+		case 8:
+			getCharacter(kCharacterAbbot).characterPosition.location = 1;
+			endGraphics(kCharacterAbbot);
+			CONS_Abbot_Asleep4(0, 0, 0, 0);
+			break;
+		case 9:
+			playNIS(kEventAbbotDrinkDefuse);
+			startCycOtis(kCharacterAbbot, "126B");
+			send(kCharacterAbbot, kCharacterAnna, 100969180, 0);
+			bumpCath(kCarRestaurant, 58, 255);
+			break;
+		default:
+			break;
+		}
+
+		break;
+	default:
+		break;
+	}
+}
+
+void LogicManager::CONS_Abbot_CatchCath(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAbbot).callParams[getCharacter(kCharacterAbbot).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, &LogicManager::HAND_Abbot_CatchCath);
+	getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall] = 49;
+
+	params->clear();
+
+	fedEx(kCharacterAbbot, kCharacterAbbot, 12, 0);
+}
+
+void LogicManager::HAND_Abbot_CatchCath(HAND_PARAMS) {
+	if (msg->action == 0) {
+		if (getCharacterCurrentParams(kCharacterAbbot)[0] || (getCharacterCurrentParams(kCharacterAbbot)[0] = _currentGameSessionTicks + 150, _currentGameSessionTicks != -150)) {
+			if (getCharacterCurrentParams(kCharacterAbbot)[0] >= _currentGameSessionTicks)
+				return;
+
+			getCharacterCurrentParams(kCharacterAbbot)[0] = 0x7FFFFFFF;
+		}
+
+		send(kCharacterAbbot, kCharacterAbbot, 157489665, 0);
+	} else if (msg->action == 8) {
+		if (!cathRunningDialog("LIB012"))
+			playDialog(0, "LIB012", -1, 0);
+	} else if (msg->action == 9) {
+		send(kCharacterAbbot, kCharacterTatiana, 238790488, 0);
+		setDoor(2, kCharacterCath, 0, 10, 9);
+		setDoor(18, kCharacterCath, 0, 10, 9);
+		getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 1;
+		AbbotCall(&LogicManager::CONS_Abbot_SaveGame, 2, 111, 0, 0);
+	} else if (msg->action == 12) {
+		getCharacter(kCharacterAbbot).characterPosition.car = kCarGreenSleeping;
+		getCharacter(kCharacterAbbot).characterPosition.position = 7500;
+		getCharacter(kCharacterAbbot).characterPosition.location = 1;
+		fedEx(kCharacterAbbot, kCharacterTableE, 103798704, "029G");
+		send(kCharacterAbbot, kCharacterWaiter1, 270068760, 0);
+		send(kCharacterAbbot, kCharacterMonsieur, 125039808, 0);
+		setDoor(2, kCharacterAbbot, 1, 10, 9);
+		setDoor(18, kCharacterAbbot, 1, 10, 9);
+	} else if (msg->action == 18) {
+		switch (getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8]) {
+		case 1:
+			if (getModel(2) == 1) {
+				playNIS(kEventAbbotWrongCompartmentBed);
+			} else {
+				playNIS(kEventAbbotWrongCompartment);
+			}
+
+			walk(kCharacterAbbot, kCarRedSleeping, 6470u);
+			playDialog(0, "LIB015", -1, 0);
+			bumpCathFDoor(2);
+			getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 2;
+			AbbotCall(&LogicManager::CONS_Abbot_DoWalk, 4, 6470, 0, 0);
+			break;
+		case 2:
+			getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 3;
+			AbbotCall(&LogicManager::CONS_Abbot_DoEnterCorrOtis, "617Cc", 34, 0, 0);
+			break;
+		case 3:
+			getCharacter(kCharacterAbbot).characterPosition.location = 1;
+			endGraphics(kCharacterAbbot);
+			setDoor(34, kCharacterAbbot, 1, 10, 9);
+			CONS_Abbot_InComp(0, 0, 0, 0);
+			break;
+		}
+	} else if (msg->action == 157489665) {
+		send(kCharacterAbbot, kCharacterTatiana, 238790488, 0);
+		setDoor(2, kCharacterCath, 0, 10, 9);
+		setDoor(18, kCharacterCath, 0, 10, 9);
+		getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 1;
+		AbbotCall(&LogicManager::CONS_Abbot_SaveGame, 2, 111, 0, 0);
+	}
+}
+
+void LogicManager::CONS_Abbot_StartPart5(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAbbot).callParams[getCharacter(kCharacterAbbot).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, &LogicManager::HAND_Abbot_StartPart5);
+	getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall] = 50;
+
+	params->clear();
+
+	fedEx(kCharacterAbbot, kCharacterAbbot, 12, 0);
+}
+
+void LogicManager::HAND_Abbot_StartPart5(HAND_PARAMS) {
+	if (msg->action == 0) {
+		CONS_Abbot_Prisoner(0, 0, 0, 0);
+	} else if (msg->action == 12) {
+		endGraphics(kCharacterAbbot);
+
+		getCharacter(kCharacterAbbot).characterPosition.location = 1;
+		getCharacter(kCharacterAbbot).characterPosition.position = 3969;
+		getCharacter(kCharacterAbbot).characterPosition.car = kCarRestaurant;
+		getCharacter(kCharacterAbbot).inventoryItem = 0;
+		getCharacter(kCharacterAbbot).clothes = 0;
+	}
+}
+
+void LogicManager::CONS_Abbot_Prisoner(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAbbot).callParams[getCharacter(kCharacterAbbot).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, &LogicManager::HAND_Abbot_Prisoner);
+	getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall] = 51;
+
+	params->clear();
+
+	fedEx(kCharacterAbbot, kCharacterAbbot, 12, 0);
+}
+
+void LogicManager::HAND_Abbot_Prisoner(HAND_PARAMS) {
+	if (msg->action == 70549068)
+		CONS_Abbot_Free(0, 0, 0, 0);
+}
+
+void LogicManager::CONS_Abbot_Free(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAbbot).callParams[getCharacter(kCharacterAbbot).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, &LogicManager::HAND_Abbot_Free);
+	getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall] = 52;
+
+	params->clear();
+
+	fedEx(kCharacterAbbot, kCharacterAbbot, 12, 0);
+}
+
+void LogicManager::HAND_Abbot_Free(HAND_PARAMS) {
+	if (msg->action == 12) {
+		endGraphics(kCharacterAbbot);
+		getCharacter(kCharacterAbbot).characterPosition.car = kCarNone;
+		getCharacter(kCharacterAbbot).characterPosition.position = 0;
+		getCharacter(kCharacterAbbot).characterPosition.location = 0;
+	} else if (msg->action == 135600432) {
+		CONS_Abbot_RunningTrain(0, 0, 0, 0);
+	}
+}
+
+void LogicManager::CONS_Abbot_RunningTrain(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAbbot).callParams[getCharacter(kCharacterAbbot).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, &LogicManager::HAND_Abbot_RunningTrain);
+	getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall] = 53;
+
+	params->clear();
+
+	fedEx(kCharacterAbbot, kCharacterAbbot, 12, 0);
+}
+
+void LogicManager::HAND_Abbot_RunningTrain(HAND_PARAMS) {
+	if (msg->action == 12) {
+		dropItem(kItem25, 1);
+		send(kCharacterAbbot, kCharacterAnna, 158480160, 0);
+	} else if (msg->action == 18) {
+		if (getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] == 1) {
+			playNIS(kEventLocomotiveAbbotGetSomeRest);
+			cleanNIS();
+		} else if (getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] == 2) {
+			playNIS(kEventLocomotiveAbbotShoveling);
+			cleanNIS();
+		}
+	} else if (msg->action == 168646401) {
+		if (!_gameEvents[kEventLocomotiveAbbotGetSomeRest]) {
+			getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 1;
+			AbbotCall(&LogicManager::CONS_Abbot_SaveGame, 2, 194, 0, 0);
+		} else if (!_gameEvents[kEventLocomotiveAbbotShoveling]) {
+			getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 2;
+			AbbotCall(&LogicManager::CONS_Abbot_SaveGame, 2, 195, 0, 0);
+		} else {
+			playNIS(kEventLocomotiveAbbotShoveling);
+			cleanNIS();
+		}
+	}
+}
+
+void (LogicManager::*LogicManager::_functionsAbbot[])(HAND_PARAMS) = {
+	nullptr,
+	&LogicManager::HAND_Abbot_DebugWalks,
+	&LogicManager::HAND_Abbot_DoSeqOtis,
+	&LogicManager::HAND_Abbot_DoCorrOtis,
+	&LogicManager::HAND_Abbot_DoEnterCorrOtis,
+	&LogicManager::HAND_Abbot_FinishSeqOtis,
+	&LogicManager::HAND_Abbot_DoComplexSeqOtis,
+	&LogicManager::HAND_Abbot_DoWait,
+	&LogicManager::HAND_Abbot_DoWaitReal,
+	&LogicManager::HAND_Abbot_DoDialog,
+	&LogicManager::HAND_Abbot_SaveGame,
+	&LogicManager::HAND_Abbot_DoWalk,
+	&LogicManager::HAND_Abbot_DoJoinedSeqOtis,
+	&LogicManager::HAND_Abbot_DoBlockSeqOtis,
+	&LogicManager::HAND_Abbot_WaitRCClear,
+	&LogicManager::HAND_Abbot_Birth,
+	&LogicManager::HAND_Abbot_StartPart2,
+	&LogicManager::HAND_Abbot_StartPart3,
+	&LogicManager::HAND_Abbot_InKitchen,
+	&LogicManager::HAND_Abbot_OpenComp,
+	&LogicManager::HAND_Abbot_AloneComp,
+	&LogicManager::HAND_Abbot_GoLunch,
+	&LogicManager::HAND_Abbot_EatingLunch,
+	&LogicManager::HAND_Abbot_LeaveLunch,
+	&LogicManager::HAND_Abbot_ClosedComp,
+	&LogicManager::HAND_Abbot_GoSalon1,
+	&LogicManager::HAND_Abbot_InSalon,
+	&LogicManager::HAND_Abbot_GoComp,
+	&LogicManager::HAND_Abbot_OpenComp2,
+	&LogicManager::HAND_Abbot_GoWander,
+	&LogicManager::HAND_Abbot_GoSalon2,
+	&LogicManager::HAND_Abbot_InSalon2,
+	&LogicManager::HAND_Abbot_GoComp3,
+	&LogicManager::HAND_Abbot_OpenComp3,
+	&LogicManager::HAND_Abbot_GoSalon3,
+	&LogicManager::HAND_Abbot_InSalon3,
+	&LogicManager::HAND_Abbot_WithAugust,
+	&LogicManager::HAND_Abbot_GoComp4,
+	&LogicManager::HAND_Abbot_InComp4,
+	&LogicManager::HAND_Abbot_StartPart4,
+	&LogicManager::HAND_Abbot_DoWalkSearchingForCath,
+	&LogicManager::HAND_Abbot_AtDinner,
+	&LogicManager::HAND_Abbot_LeaveDinner,
+	&LogicManager::HAND_Abbot_InComp,
+	&LogicManager::HAND_Abbot_Asleep4,
+	&LogicManager::HAND_Abbot_Conferring,
+	&LogicManager::HAND_Abbot_GoSalon4,
+	&LogicManager::HAND_Abbot_BeforeBomb,
+	&LogicManager::HAND_Abbot_AfterBomb,
+	&LogicManager::HAND_Abbot_CatchCath,
+	&LogicManager::HAND_Abbot_StartPart5,
+	&LogicManager::HAND_Abbot_Prisoner,
+	&LogicManager::HAND_Abbot_Free,
+	&LogicManager::HAND_Abbot_RunningTrain
+};
+
+
+} // End of namespace LastExpress
diff --git a/engines/lastexpress/characters/alexei.cpp b/engines/lastexpress/characters/alexei.cpp
new file mode 100644
index 00000000000..acde40960d4
--- /dev/null
+++ b/engines/lastexpress/characters/alexei.cpp
@@ -0,0 +1,2190 @@
+/* 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 3 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, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "lastexpress/lastexpress.h"
+#include "lastexpress/game/logic.h"
+
+namespace LastExpress {
+
+void LogicManager::CONS_Alexei(int chapter) {
+	switch (chapter) {
+	case 0:
+		_engine->getMessageManager()->setMessageHandle(
+			kCharacterAlexei,
+			_functionsAlexei[getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall]]
+		);
+
+		break;
+	case 1:
+		CONS_Alexei_Birth(0, 0, 0, 0);
+		break;
+	case 2:
+		CONS_Alexei_StartPart2(0, 0, 0, 0);
+		break;
+	case 3:
+		CONS_Alexei_StartPart3(0, 0, 0, 0);
+		break;
+	case 4:
+		CONS_Alexei_StartPart4(0, 0, 0, 0);
+		break;
+	case 5:
+		CONS_Alexei_StartPart5(0, 0, 0, 0);
+		break;
+	default:
+		return;
+	}
+}
+
+void LogicManager::AlexeiCall(CALL_PARAMS) {
+	getCharacter(kCharacterAlexei).currentCall++;
+
+	(this->*functionPointer)(param1, param2, param3, param4);
+}
+
+void LogicManager::CONS_Alexei_DebugWalks(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAlexei).callParams[getCharacter(kCharacterAlexei).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAlexei, &LogicManager::HAND_Alexei_DebugWalks);
+	getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall] = 1;
+
+	params->clear();
+
+	fedEx(kCharacterAlexei, kCharacterAlexei, 12, 0);
+}
+
+void LogicManager::HAND_Alexei_DebugWalks(HAND_PARAMS) {
+	if (msg->action) {
+		if (msg->action == 12) {
+			getCharacter(kCharacterAlexei).characterPosition.position = 0;
+			getCharacter(kCharacterAlexei).characterPosition.location = 0;
+			getCharacter(kCharacterAlexei).characterPosition.car = kCarGreenSleeping;
+			getCharacterCurrentParams(kCharacterAlexei)[0] = 10000;
+		}
+	} else if (walk(kCharacterAlexei, kCarGreenSleeping, getCharacterCurrentParams(kCharacterAlexei)[0])) {
+		if (getCharacterCurrentParams(kCharacterAlexei)[0] == 10000)
+			getCharacterCurrentParams(kCharacterAlexei)[0] = 0;
+		else
+			getCharacterCurrentParams(kCharacterAlexei)[0] = 10000;
+	}
+}
+
+void LogicManager::CONS_Alexei_DoDialog(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAlexei).callParams[getCharacter(kCharacterAlexei).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAlexei, &LogicManager::HAND_Alexei_DoDialog);
+	getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall] = 2;
+
+	params->clear();
+
+	strncpy((char *)&params->parameters[0], param1.stringParam, 12);
+
+	fedEx(kCharacterAlexei, kCharacterAlexei, 12, 0);
+}
+
+void LogicManager::HAND_Alexei_DoDialog(HAND_PARAMS) {
+	if (msg->action == 2) {
+		getCharacter(kCharacterAlexei).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterAlexei, _functionsAlexei[getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall]]);
+		fedEx(kCharacterAlexei, kCharacterAlexei, 18, 0);
+	} else if (msg->action == 12) {
+		playDialog(kCharacterAlexei, (char *)&getCharacterCurrentParams(kCharacterAlexei)[0], -1, 0);
+	}
+}
+
+void LogicManager::CONS_Alexei_DoWait(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAlexei).callParams[getCharacter(kCharacterAlexei).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAlexei, &LogicManager::HAND_Alexei_DoWait);
+	getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall] = 3;
+
+	params->clear();
+
+	params->parameters[0] = param1.intParam;
+
+	fedEx(kCharacterAlexei, kCharacterAlexei, 12, 0);
+}
+
+void LogicManager::HAND_Alexei_DoWait(HAND_PARAMS) {
+	if (msg->action == 0) {
+		if (getCharacterCurrentParams(kCharacterAlexei)[1] ||
+			(getCharacterCurrentParams(kCharacterAlexei)[1] = _gameTime + getCharacterCurrentParams(kCharacterAlexei)[0], _gameTime + getCharacterCurrentParams(kCharacterAlexei)[0] != 0)) {
+			if (getCharacterCurrentParams(kCharacterAlexei)[1] >= _gameTime)
+				return;
+
+			getCharacterCurrentParams(kCharacterAlexei)[1] = 0x7FFFFFFF;
+		}
+
+		getCharacter(kCharacterAlexei).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterAlexei, _functionsAlexei[getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall]]);
+		fedEx(kCharacterAlexei, kCharacterAlexei, 18, 0);
+	}
+}
+
+void LogicManager::CONS_Alexei_DoSeqOtis(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAlexei).callParams[getCharacter(kCharacterAlexei).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAlexei, &LogicManager::HAND_Alexei_DoSeqOtis);
+	getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall] = 4;
+
+	params->clear();
+
+	strncpy((char *)&params->parameters[0], param1.stringParam, 12);
+
+	fedEx(kCharacterAlexei, kCharacterAlexei, 12, 0);
+}
+
+void LogicManager::HAND_Alexei_DoSeqOtis(HAND_PARAMS) {
+	if (msg->action == 3) {
+		getCharacter(kCharacterAlexei).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterAlexei, _functionsAlexei[getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall]]);
+		fedEx(kCharacterAlexei, kCharacterAlexei, 18, 0);
+	} else if (msg->action == 12) {
+		startSeqOtis(kCharacterAlexei, (char *)&getCharacterCurrentParams(kCharacterAlexei)[0]);
+	}
+}
+
+void LogicManager::CONS_Alexei_DoBlockSeqOtis(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAlexei).callParams[getCharacter(kCharacterAlexei).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAlexei, &LogicManager::HAND_Alexei_DoBlockSeqOtis);
+	getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall] = 5;
+
+	params->clear();
+
+	strncpy((char *)&params->parameters[0], param1.stringParam, 12);
+
+	params->parameters[3] = param2.intParam;
+	params->parameters[4] = param3.intParam;
+
+	fedEx(kCharacterAlexei, kCharacterAlexei, 12, 0);
+}
+
+void LogicManager::HAND_Alexei_DoBlockSeqOtis(HAND_PARAMS) {
+	if (msg->action == 3) {
+		releaseView(kCharacterAlexei, getCharacterCurrentParams(kCharacterAlexei)[3], getCharacterCurrentParams(kCharacterAlexei)[4]);
+
+		getCharacter(kCharacterAlexei).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterAlexei, _functionsAlexei[getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall]]);
+		fedEx(kCharacterAlexei, kCharacterAlexei, 18, 0);
+	} else if (msg->action == 12) {
+		startSeqOtis(kCharacterAlexei, (char *)&getCharacterCurrentParams(kCharacterAlexei)[0]);
+		blockView(kCharacterAlexei, getCharacterCurrentParams(kCharacterAlexei)[3], getCharacterCurrentParams(kCharacterAlexei)[4]);
+	}
+}
+
+void LogicManager::CONS_Alexei_DoCorrOtis(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAlexei).callParams[getCharacter(kCharacterAlexei).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAlexei, &LogicManager::HAND_Alexei_DoCorrOtis);
+	getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall] = 6;
+
+	params->clear();
+
+	strncpy((char *)&params->parameters[0], param1.stringParam, 12);
+
+	params->parameters[3] = param2.intParam;
+
+	fedEx(kCharacterAlexei, kCharacterAlexei, 12, 0);
+}
+
+void LogicManager::HAND_Alexei_DoCorrOtis(HAND_PARAMS) {
+	if (msg->action == 3) {
+		releaseAtDoor(kCharacterAlexei, getCharacterCurrentParams(kCharacterAlexei)[3]);
+
+		getCharacter(kCharacterAlexei).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterAlexei, _functionsAlexei[getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall]]);
+		fedEx(kCharacterAlexei, kCharacterAlexei, 18, 0);
+	} else if (msg->action == 12) {
+		startSeqOtis(kCharacterAlexei, (char *)&getCharacterCurrentParams(kCharacterAlexei)[0]);
+		blockAtDoor(kCharacterAlexei, getCharacterCurrentParams(kCharacterAlexei)[3]);
+	}
+}
+
+void LogicManager::CONS_Alexei_FinishSeqOtis(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAlexei).callParams[getCharacter(kCharacterAlexei).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAlexei, &LogicManager::HAND_Alexei_FinishSeqOtis);
+	getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall] = 7;
+
+	params->clear();
+
+	fedEx(kCharacterAlexei, kCharacterAlexei, 12, 0);
+}
+
+void LogicManager::HAND_Alexei_FinishSeqOtis(HAND_PARAMS) {
+	if (msg->action == 0) {
+		if (getCharacter(kCharacterAlexei).direction == 4)
+			return;
+		goto LABEL_5;
+	}
+	if (msg->action == 3) {
+	LABEL_5:
+		getCharacter(kCharacterAlexei).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterAlexei, _functionsAlexei[getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall]]);
+		fedEx(kCharacterAlexei, kCharacterAlexei, 18, 0);
+	}
+}
+
+void LogicManager::CONS_Alexei_DoJoinedSeqOtis(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAlexei).callParams[getCharacter(kCharacterAlexei).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAlexei, &LogicManager::HAND_Alexei_DoJoinedSeqOtis);
+	getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall] = 8;
+
+	params->clear();
+
+	strncpy((char *)&params->parameters[0], param1.stringParam, 12);
+
+	params->parameters[3] = param2.intParam;
+	params->parameters[4] = param3.intParam;
+
+	strncpy((char *)&params->parameters[5], param4.stringParam, 12);
+
+	fedEx(kCharacterAlexei, kCharacterAlexei, 12, 0);
+}
+
+void LogicManager::HAND_Alexei_DoJoinedSeqOtis(HAND_PARAMS) {
+	switch (msg->action) {
+	case 3:
+		if (!getCharacterCurrentParams(kCharacterAlexei)[8])
+			fedEx(kCharacterAlexei, getCharacterCurrentParams(kCharacterAlexei)[3], getCharacterCurrentParams(kCharacterAlexei)[4], (char *)&getCharacterCurrentParams(kCharacterAlexei)[5]);
+
+		getCharacter(kCharacterAlexei).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterAlexei, _functionsAlexei[getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall]]);
+		fedEx(kCharacterAlexei, kCharacterAlexei, 18, 0);
+		break;
+	case 10:
+		if (!getCharacterCurrentParams(kCharacterAlexei)[8]) {
+			fedEx(kCharacterAlexei, getCharacterCurrentParams(kCharacterAlexei)[3], getCharacterCurrentParams(kCharacterAlexei)[4], (char *)&getCharacterCurrentParams(kCharacterAlexei)[5]);
+			getCharacterCurrentParams(kCharacterAlexei)[8] = 1;
+		}
+		break;
+	case 12:
+		startSeqOtis(kCharacterAlexei, (char *)&getCharacterCurrentParams(kCharacterAlexei)[0]);
+		break;
+	}
+}
+
+void LogicManager::CONS_Alexei_SaveGame(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAlexei).callParams[getCharacter(kCharacterAlexei).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAlexei, &LogicManager::HAND_Alexei_SaveGame);
+	getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall] = 9;
+
+	params->clear();
+
+	params->parameters[0] = param1.intParam;
+	params->parameters[1] = param2.intParam;
+
+	fedEx(kCharacterAlexei, kCharacterAlexei, 12, 0);
+}
+
+void LogicManager::HAND_Alexei_SaveGame(HAND_PARAMS) {
+	if (msg->action) {
+		if (msg->action == 12) {
+			save(
+				kCharacterAlexei,
+				getCharacterCurrentParams(kCharacterAlexei)[0],
+				getCharacterCurrentParams(kCharacterAlexei)[1]
+			);
+
+			getCharacter(kCharacterAlexei).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterAlexei, _functionsAlexei[getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall]]);
+			fedEx(kCharacterAlexei, kCharacterAlexei, 18, 0);
+		}
+	} else {
+		getCharacter(kCharacterAlexei).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterAlexei, _functionsAlexei[getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall]]);
+		fedEx(kCharacterAlexei, kCharacterAlexei, 18, 0);
+	}
+}
+
+void LogicManager::CONS_Alexei_DoWalk(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAlexei).callParams[getCharacter(kCharacterAlexei).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAlexei, &LogicManager::HAND_Alexei_DoWalk);
+	getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall] = 10;
+
+	params->clear();
+
+	params->parameters[0] = param1.intParam;
+	params->parameters[1] = param2.intParam;
+
+	fedEx(kCharacterAlexei, kCharacterAlexei, 12, 0);
+}
+
+void LogicManager::HAND_Alexei_DoWalk(HAND_PARAMS) {
+	switch (msg->action) {
+	case 0:
+		if (walk(kCharacterAlexei, getCharacterCurrentParams(kCharacterAlexei)[0], getCharacterCurrentParams(kCharacterAlexei)[1]))
+			goto LABEL_16;
+		break;
+	case 5:
+		if (checkCathDir(kCarGreenSleeping, 18) || checkCathDir(kCarRedSleeping, 18))
+			goto LABEL_14;
+		if (_gameEvents[kEventAlexeiSalonVassili] || _gameEvents[kEventTatianaAskMatchSpeakRussian] && cathHasItem(kItemPassengerList)) {
+			if (rnd(2) == 0) {
+				playDialog(kCharacterCath, "CAT1012A", -1, 0);
+			} else {
+				playDialog(kCharacterCath, "CAT1012", -1, 0);
+			}			
+		} else {
+			playCathExcuseMe();
+		}
+		break;
+	case 6:
+	LABEL_14:
+		playChrExcuseMe(kCharacterAlexei, kCharacterCath, 0);
+		break;
+	case 12:
+		getCharacter(kCharacterAlexei).inventoryItem = 0;
+		if (walk(kCharacterAlexei, getCharacterCurrentParams(kCharacterAlexei)[0], getCharacterCurrentParams(kCharacterAlexei)[1])) {
+		LABEL_16:
+			getCharacter(kCharacterAlexei).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterAlexei, _functionsAlexei[getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall]]);
+			fedEx(kCharacterAlexei, kCharacterAlexei, 18, 0);
+		}
+		break;
+	default:
+		return;
+	}
+}
+
+void LogicManager::CONS_Alexei_DoComplexSeqOtis(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAlexei).callParams[getCharacter(kCharacterAlexei).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAlexei, &LogicManager::HAND_Alexei_DoComplexSeqOtis);
+	getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall] = 11;
+
+	params->clear();
+
+	fedEx(kCharacterAlexei, kCharacterAlexei, 12, 0);
+}
+
+void LogicManager::HAND_Alexei_DoComplexSeqOtis(HAND_PARAMS) {
+	if (msg->action == 3) {
+		getCharacter(kCharacterAlexei).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterAlexei, _functionsAlexei[getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall]]);
+		fedEx(kCharacterAlexei, kCharacterAlexei, 18, 0);
+	} else if (msg->action == 12) {
+		startSeqOtis(kCharacterAlexei, (char *)&getCharacterCurrentParams(kCharacterAlexei)[0]);
+		startSeqOtis(getCharacterCurrentParams(kCharacterAlexei)[6], (char *)&getCharacterCurrentParams(kCharacterAlexei)[3]);
+	}
+}
+
+void LogicManager::CONS_Alexei_WaitRCClear(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAlexei).callParams[getCharacter(kCharacterAlexei).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAlexei, &LogicManager::HAND_Alexei_WaitRCClear);
+	getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall] = 12;
+
+	params->clear();
+
+	fedEx(kCharacterAlexei, kCharacterAlexei, 12, 0);
+}
+
+void LogicManager::HAND_Alexei_WaitRCClear(HAND_PARAMS) {
+	if (msg->action == 0) {
+		if (!rcClear())
+			return;
+		goto LABEL_7;
+	}
+	if (msg->action == 12 && rcClear()) {
+	LABEL_7:
+		getCharacter(kCharacterAlexei).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterAlexei, _functionsAlexei[getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall]]);
+		fedEx(kCharacterAlexei, kCharacterAlexei, 18, 0);
+	}
+}
+
+void LogicManager::CONS_Alexei_EnterComp(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAlexei).callParams[getCharacter(kCharacterAlexei).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAlexei, &LogicManager::HAND_Alexei_EnterComp);
+	getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall] = 13;
+
+	params->clear();
+
+	fedEx(kCharacterAlexei, kCharacterAlexei, 12, 0);
+}
+
+void LogicManager::HAND_Alexei_EnterComp(HAND_PARAMS) {
+	switch (msg->action) {
+	case 12:
+		getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 1;
+		AlexeiCall(&LogicManager::CONS_Alexei_DoWalk, 3, 7500, 0, 0);
+		break;
+	case 18:
+		if (getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] == 1) {
+			send(kCharacterAlexei, kCharacterCond1, 302614416, 0);
+			startCycOtis(kCharacterAlexei, "602DB");
+			softBlockAtDoor(kCharacterAlexei, 2);
+			getCharacter(kCharacterAlexei).characterPosition.location = 1;
+			if (inComp(kCharacterCath, kCarGreenSleeping, 7500)) {
+				playNIS((kEventCathTurningNight - !isNight()));
+				playDialog(0, "BUMP", -1, 0);
+				bumpCathFDoor(2);
+			}
+		} else if (getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] == 2) {
+			softReleaseAtDoor(kCharacterAlexei, 2);
+			getCharacter(kCharacterAlexei).characterPosition.location = 1;
+			getCharacter(kCharacterAlexei).characterPosition.position = 7500;
+			endGraphics(kCharacterAlexei);
+
+			getCharacter(kCharacterAlexei).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterAlexei, _functionsAlexei[getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall]]);
+			fedEx(kCharacterAlexei, kCharacterAlexei, 18, 0);
+		}
+		break;
+	case 135664192:
+		getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 2;
+		AlexeiCall(&LogicManager::CONS_Alexei_DoCorrOtis, "602Eb", 2, 0, 0);
+		break;
+	}
+}
+
+void LogicManager::CONS_Alexei_ExitComp(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAlexei).callParams[getCharacter(kCharacterAlexei).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAlexei, &LogicManager::HAND_Alexei_ExitComp);
+	getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall] = 14;
+
+	params->clear();
+
+	fedEx(kCharacterAlexei, kCharacterAlexei, 12, 0);
+}
+
+void LogicManager::HAND_Alexei_ExitComp(HAND_PARAMS) {
+	switch (msg->action) {
+	case 12:
+		getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 1;
+		AlexeiCall(&LogicManager::CONS_Alexei_DoCorrOtis, "602Fb", 2, 0, 0);
+		break;
+	case 18:
+		if (getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] == 1) {
+			getCharacter(kCharacterAlexei).characterPosition.location = 0;
+			send(kCharacterAlexei, kCharacterCond1, 302614416, 0);
+			startCycOtis(kCharacterAlexei, "602DB");
+			softBlockAtDoor(kCharacterAlexei, 2);
+		}
+		break;
+	case 135664192:
+		setDoor(2, 0, 1, 10, 9);
+		softReleaseAtDoor(kCharacterAlexei, 2);
+
+		getCharacter(kCharacterAlexei).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterAlexei, _functionsAlexei[getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall]]);
+		fedEx(kCharacterAlexei, kCharacterAlexei, 18, 0);
+		break;
+	}
+}
+
+void LogicManager::CONS_Alexei_PacingAtWindow(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAlexei).callParams[getCharacter(kCharacterAlexei).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAlexei, &LogicManager::HAND_Alexei_PacingAtWindow);
+	getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall] = 15;
+
+	params->clear();
+
+	fedEx(kCharacterAlexei, kCharacterAlexei, 12, 0);
+}
+
+void LogicManager::HAND_Alexei_PacingAtWindow(HAND_PARAMS) {
+	if (msg->action) {
+		if (msg->action == 12) {
+			getCharacterCurrentParams(kCharacterAlexei)[0] = 5 * (3 * rnd(60) + 90);
+			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 1;
+			AlexeiCall(&LogicManager::CONS_Alexei_WaitRCClear, 0, 0, 0, 0);
+		} else if (msg->action == 18) {
+			switch (getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8]) {
+			case 1:
+				getCharacter(kCharacterAlexei).characterPosition.location = 0;
+				getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 2;
+				AlexeiCall(&LogicManager::CONS_Alexei_DoBlockSeqOtis, "103C", 5, 0x34, 0);
+				break;
+			case 2:
+				getCharacter(kCharacterAlexei).characterPosition.location = 1;
+				startCycOtis(kCharacterAlexei, "103E");
+				break;
+			case 3:
+				getCharacter(kCharacterAlexei).characterPosition.location = 1;
+				startCycOtis(kCharacterAlexei, "103B");
+
+				getCharacter(kCharacterAlexei).currentCall--;
+				_engine->getMessageManager()->setMessageHandle(kCharacterAlexei, _functionsAlexei[getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall]]);
+				fedEx(kCharacterAlexei, kCharacterAlexei, 18, 0);
+				break;
+			}
+		}
+	} else if (!getCharacterCurrentParams(kCharacterAlexei)[1] &&
+				   (getCharacterCurrentParams(kCharacterAlexei)[1] = _gameTime + getCharacterCurrentParams(kCharacterAlexei)[0], _gameTime + getCharacterCurrentParams(kCharacterAlexei)[0] == 0) ||
+			   getCharacterCurrentParams(kCharacterAlexei)[1] < _gameTime) {
+		if (rcClear()) {
+			getCharacter(kCharacterAlexei).characterPosition.location = 0;
+			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 3;
+			AlexeiCall(&LogicManager::CONS_Alexei_DoBlockSeqOtis, "103D", 5, 52, 0);
+		}
+	}
+}
+
+void LogicManager::CONS_Alexei_CompLogic(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAlexei).callParams[getCharacter(kCharacterAlexei).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAlexei, &LogicManager::HAND_Alexei_CompLogic);
+	getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall] = 16;
+
+	params->clear();
+
+	params->parameters[0] = param1.intParam;
+
+	strncpy((char *)&params->parameters[1], param2.stringParam, 12);
+
+	fedEx(kCharacterAlexei, kCharacterAlexei, 12, 0);
+}
+
+void LogicManager::HAND_Alexei_CompLogic(HAND_PARAMS) {
+	if (msg->action > 9) {
+		if (msg->action > 17) {
+			switch (msg->action) {
+			case 18:
+				switch (getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8]) {
+				case 1:
+				case 2:
+					getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 3;
+					AlexeiCall(&LogicManager::CONS_Alexei_DoDialog, "ALX1134A", 0, 0, 0);
+					break;
+				case 3:
+					setDoor(2, 12, 1, 14, 0);
+					setDoor(18, 12, 1, 14, 0);
+					getCharacterCurrentParams(kCharacterAlexei)[4] = 1;
+					break;
+				case 4:
+				case 5:
+				case 6:
+					getCharacterCurrentParams(kCharacterAlexei)[4] = 0;
+					getCharacterCurrentParams(kCharacterAlexei)[5] = 1;
+					break;
+				case 7:
+					getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 8;
+					AlexeiCall(&LogicManager::CONS_Alexei_DoWait, 0x12C, 0, 0, 0);
+					break;
+				case 8:
+					getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 9;
+					AlexeiCall(&LogicManager::CONS_Alexei_DoCorrOtis, "602Gb", 2, 0, 0);
+					break;
+				case 9:
+					getCharacter(kCharacterAlexei).characterPosition.location = 0;
+					send(kCharacterAlexei, kCharacterCond1, 156567128, 0);
+					startCycOtis(kCharacterAlexei, "602Hb");
+					softBlockAtDoor(kCharacterAlexei, 2);
+					break;
+				case 10:
+					softReleaseAtDoor(kCharacterAlexei, 2);
+					getCharacter(kCharacterAlexei).characterPosition.location = 1;
+					getCharacter(kCharacterAlexei).characterPosition.position = 7500;
+					startCycOtis(kCharacterAlexei, (char *)&getCharacterCurrentParams(kCharacterAlexei)[1]);
+					setDoor(2, 12, 1, 10, 9);
+					setDoor(18, 12, 1, 10, 9);
+					getCharacterCurrentParams(kCharacterAlexei)[6] = 0;
+					break;
+				default:
+					return;
+				}
+				break;
+			case 124697504:
+				getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 10;
+				AlexeiCall(&LogicManager::CONS_Alexei_DoCorrOtis, "602Ib", 2, 0, 0);
+				break;
+			case 221617184:
+				getCharacterCurrentParams(kCharacterAlexei)[6] = 1;
+				send(kCharacterAlexei, kCharacterCond1, 100906246, 0);
+				getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 7;
+				AlexeiCall(&LogicManager::CONS_Alexei_DoDialog, "CON1024", 0, 0, 0);
+				break;
+			}
+		} else if (msg->action == 17) {
+			if (getCharacterCurrentParams(kCharacterAlexei)[5] || getCharacterCurrentParams(kCharacterAlexei)[4]) {
+				setDoor(2, 12, 1, 10, 9);
+				setDoor(18, 12, 1, 10, 9);
+				getCharacterCurrentParams(kCharacterAlexei)[5] = 0;
+				getCharacterCurrentParams(kCharacterAlexei)[4] = 0;
+			}
+		} else if (msg->action == 12) {
+			startCycOtis(kCharacterAlexei, (char *)&getCharacterCurrentParams(kCharacterAlexei)[1]);
+			setDoor(2, 12, 1, 10, 9);
+			setDoor(18, 12, 1, 10, 9);
+		}
+	} else if (msg->action >= 8) {
+		if (getCharacterCurrentParams(kCharacterAlexei)[4]) {
+			setDoor(2, 12, 1, 0, 0);
+			setDoor(18, 12, 1, 0, 0);
+			if (msg->param.intParam == 18) {
+				getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 4;
+				AlexeiCall(&LogicManager::CONS_Alexei_DoDialog, getCathWCDialog(), 0, 0, 0);
+			} else if (cathHasItem(kItemPassengerList)) {
+				getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 5;
+
+				if (rnd(2) != 0) {
+					AlexeiCall(&LogicManager::CONS_Alexei_DoDialog, getCathSorryDialog(), 0, 0, 0);
+				} else {
+					AlexeiCall(&LogicManager::CONS_Alexei_DoDialog, "CAT1503", 0, 0, 0);
+				}		
+			} else {
+				getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 6;
+				AlexeiCall(&LogicManager::CONS_Alexei_DoDialog, getCathSorryDialog(), 0, 0, 0);
+			}
+		} else {
+			setDoor(2, 12, 1, 0, 0);
+			setDoor(18, 12, 1, 0, 0);
+			if (msg->action == 8) {
+				getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 1;
+				AlexeiCall(&LogicManager::CONS_Alexei_DoDialog, "LIB012", 0, 0, 0);
+			} else {
+				getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 2;
+				AlexeiCall(&LogicManager::CONS_Alexei_DoDialog, "LIB013", 0, 0, 0);
+			}
+		}
+	} else if (msg->action == 0) {
+		if (!getCharacterCurrentParams(kCharacterAlexei)[6] && getCharacterCurrentParams(kCharacterAlexei)[0] < _gameTime && !getCharacterCurrentParams(kCharacterAlexei)[7]) {
+			getCharacterCurrentParams(kCharacterAlexei)[7] = 1;
+			setDoor(2, 0, 1, 10, 9);
+			setDoor(18, 0, 1, 10, 9);
+
+			getCharacter(kCharacterAlexei).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterAlexei, _functionsAlexei[getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall]]);
+			fedEx(kCharacterAlexei, kCharacterAlexei, 18, 0);
+			return;
+		}
+		if (getCharacterCurrentParams(kCharacterAlexei)[4]) {
+			if (getCharacterCurrentParams(kCharacterAlexei)[8] || (getCharacterCurrentParams(kCharacterAlexei)[8] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
+				if (getCharacterCurrentParams(kCharacterAlexei)[8] >= _currentGameSessionTicks)
+					return;
+				getCharacterCurrentParams(kCharacterAlexei)[8] = 0x7FFFFFFF;
+			}
+			getCharacterCurrentParams(kCharacterAlexei)[4] = 0;
+			getCharacterCurrentParams(kCharacterAlexei)[5] = 1;
+			setDoor(2, 12, 1, 0, 0);
+			setDoor(18, 12, 1, 0, 0);
+			getCharacterCurrentParams(kCharacterAlexei)[8] = 0;
+		} else {
+			getCharacterCurrentParams(kCharacterAlexei)[8] = 0;
+		}
+	}
+}
+
+void LogicManager::CONS_Alexei_Birth(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAlexei).callParams[getCharacter(kCharacterAlexei).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAlexei, &LogicManager::HAND_Alexei_Birth);
+	getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall] = 17;
+
+	params->clear();
+
+	fedEx(kCharacterAlexei, kCharacterAlexei, 12, 0);
+}
+
+void LogicManager::HAND_Alexei_Birth(HAND_PARAMS) {
+	if (msg->action) {
+		if (msg->action == 12) {
+			setDoor(2, 0, 1, 10, 9);
+			setDoor(10, 0, 0, 255, 255);
+			setDoor(18, 0, 1, 10, 9);
+			getCharacter(kCharacterAlexei).characterPosition.position = 3969;
+			getCharacter(kCharacterAlexei).characterPosition.location = 1;
+			getCharacter(kCharacterAlexei).characterPosition.car = 5;
+		}
+	} else if (_gameTime > 1062000 && !getCharacterCurrentParams(kCharacterAlexei)[0]) {
+		getCharacterCurrentParams(kCharacterAlexei)[0] = 1;
+		CONS_Alexei_AtDinner(0, 0, 0, 0);
+	}
+}
+
+void LogicManager::CONS_Alexei_AtDinner(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAlexei).callParams[getCharacter(kCharacterAlexei).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAlexei, &LogicManager::HAND_Alexei_AtDinner);
+	getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall] = 18;
+
+	params->clear();
+
+	fedEx(kCharacterAlexei, kCharacterAlexei, 12, 0);
+}
+
+void LogicManager::HAND_Alexei_AtDinner(HAND_PARAMS) {
+	if (msg->action > 12) {
+		if (msg->action > 168046720) {
+			if (msg->action == 168627977) {
+				getCharacter(kCharacterAlexei).inventoryItem = getCharacterCurrentParams(kCharacterAlexei)[1];
+			} else if (msg->action == 225182640) {
+				getCharacter(kCharacterAlexei).inventoryItem = 0;
+			}
+		} else {
+			switch (msg->action) {
+			case 168046720:
+				getCharacter(kCharacterAlexei).inventoryItem = 0;
+				break;
+			case 17:
+				getCharacterCurrentParams(kCharacterAlexei)[0] = checkCathDir(kCarRestaurant, 63);
+				break;
+			case 18:
+				if (getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] == 1) {
+					releaseView(kCharacterAlexei, kCarRestaurant, 63);
+					CONS_Alexei_ReturnComp(0, 0, 0, 0);
+				} else if (getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] == 2) {
+					if (_gameProgress[kProgressJacket] == 2)
+						playNIS(kEventAlexeiDiner);
+					else
+						playNIS(kEventAlexeiDinerOriginalJacket);
+					send(kCharacterAlexei, kCharacterTableB, 103798704, "005E");
+					getCharacter(kCharacterAlexei).characterPosition.position = 3650;
+					getCharacter(kCharacterAlexei).characterPosition.location = 0;
+					endGraphics(kCharacterAlexei);
+					_gameInventory[kItem17].location = 1;
+					bumpCath(kCarRestaurant, 63, 255);
+					CONS_Alexei_ReturnComp(0, 0, 0, 0);
+				}
+				break;
+			}
+		}
+	} else if (msg->action == 12) {
+		send(kCharacterAlexei, kCharacterTableB, 136455232, 0);
+		startCycOtis(kCharacterAlexei, "005B");
+		getCharacterCurrentParams(kCharacterAlexei)[1] = 128;
+		getCharacter(kCharacterAlexei).inventoryItem = 0x80;
+	} else if (msg->action) {
+		if (msg->action == 1) {
+			getCharacterCurrentParams(kCharacterAlexei)[1] = 0;
+			getCharacter(kCharacterAlexei).inventoryItem = 0;
+			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 2;
+			AlexeiCall(&LogicManager::CONS_Alexei_SaveGame, 2, kEventAlexeiDiner, 0, 0);
+		}
+	} else {
+		if (_gameTime > 1089000 && rcClear()) {
+			getCharacter(kCharacterAlexei).characterPosition.location = 0;
+			getCharacterCurrentParams(kCharacterAlexei)[1] = 0;
+			getCharacter(kCharacterAlexei).inventoryItem = 0;
+			blockView(kCharacterAlexei, kCarRestaurant, 63);
+			dropItem(kItem17, 1);
+			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 1;
+			AlexeiCall(&LogicManager::CONS_Alexei_DoJoinedSeqOtis, "005D", 34, 103798704, "005E");
+			return;
+		}
+		if (getCharacterCurrentParams(kCharacterAlexei)[0]) {
+			if (getCharacterCurrentParams(kCharacterAlexei)[2] || (getCharacterCurrentParams(kCharacterAlexei)[2] = _currentGameSessionTicks + 90, _currentGameSessionTicks != -90)) {
+				if (getCharacterCurrentParams(kCharacterAlexei)[2] >= _currentGameSessionTicks)
+					return;
+				getCharacterCurrentParams(kCharacterAlexei)[2] = 0x7FFFFFFF;
+			}
+			bumpCath(kCarRestaurant, 61, 255);
+		} else {
+			getCharacterCurrentParams(kCharacterAlexei)[2] = 0;
+		}
+	}
+}
+
+void LogicManager::CONS_Alexei_ReturnComp(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAlexei).callParams[getCharacter(kCharacterAlexei).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAlexei, &LogicManager::HAND_Alexei_ReturnComp);
+	getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall] = 19;
+
+	params->clear();
+
+	fedEx(kCharacterAlexei, kCharacterAlexei, 12, 0);
+}
+
+void LogicManager::HAND_Alexei_ReturnComp(HAND_PARAMS) {
+	if (msg->action == 12) {
+		getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 1;
+		AlexeiCall(&LogicManager::CONS_Alexei_DoSeqOtis, "811DS", 0, 0, 0);
+	} else if (msg->action == 18) {
+		switch (getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8]) {
+		case 1:
+			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 2;
+			AlexeiCall(&LogicManager::CONS_Alexei_DoWalk, 3, 9460, 0, 0);
+			break;
+		case 2:
+			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 3;
+			AlexeiCall(&LogicManager::CONS_Alexei_DoWalk, 5, 850, 0, 0);
+			break;
+		case 3:
+			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 4;
+			AlexeiCall(&LogicManager::CONS_Alexei_WaitRCClear, 0, 0, 0, 0);
+			break;
+		case 4:
+			getCharacter(kCharacterAlexei).characterPosition.position = 1540;
+			getCharacter(kCharacterAlexei).characterPosition.location = 0;
+			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 5;
+			AlexeiCall(&LogicManager::CONS_Alexei_DoSeqOtis, "811US", 0, 0, 0);
+			break;
+		case 5:
+			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 6;
+			AlexeiCall(&LogicManager::CONS_Alexei_DoSeqOtis, "933", 0, 0, 0);
+			break;
+		case 6:
+			blockView(kCharacterAlexei, kCarRestaurant, 63);
+			takeItem(kItem17);
+			send(kCharacterAlexei, kCharacterTableB, 136455232, 0);
+			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 7;
+			AlexeiCall(&LogicManager::CONS_Alexei_DoJoinedSeqOtis, "005F", 34, 103798704, "005G");
+			break;
+		case 7:
+			releaseView(kCharacterAlexei, kCarRestaurant, 63);
+			send(kCharacterAlexei, kCharacterWaiter2, 302996448, 0);
+			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 8;
+			AlexeiCall(&LogicManager::CONS_Alexei_DoSeqOtis, "934", 0, 0, 0);
+			break;
+		case 8:
+			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 9;
+			AlexeiCall(&LogicManager::CONS_Alexei_DoSeqOtis, "811DS", 0, 0, 0);
+			break;
+		case 9:
+			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 10;
+			AlexeiCall(&LogicManager::CONS_Alexei_EnterComp, 0, 0, 0, 0);
+			break;
+		case 10:
+			if (checkCathDir(kCarGreenSleeping, 61))
+				bumpCath(kCarGreenSleeping, 49, 255);
+			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 11;
+			AlexeiCall(&LogicManager::CONS_Alexei_CompLogic, 1098000, "411", 0, 0);
+			break;
+		case 11:
+			CONS_Alexei_GoSalon(0, 0, 0, 0);
+			break;
+		default:
+			return;
+		}
+	}
+}
+
+void LogicManager::CONS_Alexei_GoSalon(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAlexei).callParams[getCharacter(kCharacterAlexei).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAlexei, &LogicManager::HAND_Alexei_GoSalon);
+	getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall] = 20;
+
+	params->clear();
+
+	fedEx(kCharacterAlexei, kCharacterAlexei, 12, 0);
+}
+
+void LogicManager::HAND_Alexei_GoSalon(HAND_PARAMS) {
+	if (msg->action == 12) {
+		getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 1;
+		AlexeiCall(&LogicManager::CONS_Alexei_ExitComp, 0, 0, 0, 0);
+	} else if (msg->action == 18) {
+		switch (getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8]) {
+		case 1:
+			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 2;
+			AlexeiCall(&LogicManager::CONS_Alexei_DoWalk, 5, 850, 0, 0);
+			break;
+		case 2:
+			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 3;
+			AlexeiCall(&LogicManager::CONS_Alexei_WaitRCClear, 0, 0, 0, 0);
+			break;
+		case 3:
+			getCharacter(kCharacterAlexei).characterPosition.position = 1540;
+			getCharacter(kCharacterAlexei).characterPosition.location = 0;
+			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 4;
+			AlexeiCall(&LogicManager::CONS_Alexei_DoBlockSeqOtis, "103A", 5, 52, 0);
+			break;
+		case 4:
+			getCharacter(kCharacterAlexei).characterPosition.location = 1;
+			CONS_Alexei_Sitting(0, 0, 0, 0);
+			break;
+		default:
+			return;
+		}
+	}
+}
+
+void LogicManager::CONS_Alexei_Sitting(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAlexei).callParams[getCharacter(kCharacterAlexei).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAlexei, &LogicManager::HAND_Alexei_Sitting);
+	getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall] = 21;
+
+	params->clear();
+
+	fedEx(kCharacterAlexei, kCharacterAlexei, 12, 0);
+}
+
+void LogicManager::HAND_Alexei_Sitting(HAND_PARAMS) {
+	switch (msg->action) {
+	case 0:
+		if (!getCharacterCurrentParams(kCharacterAlexei)[1] && (getCharacterCurrentParams(kCharacterAlexei)[1] = _gameTime + getCharacterCurrentParams(kCharacterAlexei)[0], _gameTime + getCharacterCurrentParams(kCharacterAlexei)[0] == 0) || getCharacterCurrentParams(kCharacterAlexei)[1] < _gameTime) {
+			if (rcClear()) {
+				getCharacter(kCharacterAlexei).characterPosition.location = 0;
+				getCharacter(kCharacterAlexei).inventoryItem = 0;
+				getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 1;
+				AlexeiCall(&LogicManager::CONS_Alexei_DoBlockSeqOtis, "103C", 5, 52, 0);
+			}
+		}
+		break;
+	case 1:
+		getCharacter(kCharacterAlexei).inventoryItem = 0;
+		getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 2;
+		AlexeiCall(&LogicManager::CONS_Alexei_SaveGame, 2, kEventAlexeiSalonPoem, 0, 0);
+		break;
+	case 12:
+		startCycOtis(kCharacterAlexei, "103B");
+		getCharacterCurrentParams(kCharacterAlexei)[0] = 225 * (4 * rnd(3) + 4);
+		if (!_gameEvents[kEventAlexeiSalonPoem])
+			getCharacter(kCharacterAlexei).inventoryItem = 10;
+		break;
+	case 18:
+		switch (getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8]) {
+		case 1:
+			getCharacter(kCharacterAlexei).characterPosition.location = 1;
+			CONS_Alexei_StandingAtWindow(0, 0, 0, 0);
+			break;
+		case 2:
+			playNIS(kEventAlexeiSalonPoem);
+			getCharacter(kCharacterAlexei).characterPosition.location = 0;
+			startSeqOtis(kCharacterAlexei, "103D");
+			bumpCath(kCarRestaurant, 55, 255);
+			blockView(kCharacterAlexei, kCarRestaurant, 52);
+			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 3;
+			AlexeiCall(&LogicManager::CONS_Alexei_FinishSeqOtis, 0, 0, 0, 0);
+			break;
+		case 3:
+			startCycOtis(kCharacterAlexei, "103B");
+			releaseView(kCharacterAlexei, kCarRestaurant, 52);
+			getCharacter(kCharacterAlexei).characterPosition.location = 1;
+			break;
+		}
+		break;
+	default:
+		return;
+	}
+}
+
+void LogicManager::CONS_Alexei_StandingAtWindow(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAlexei).callParams[getCharacter(kCharacterAlexei).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAlexei, &LogicManager::HAND_Alexei_StandingAtWindow);
+	getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall] = 22;
+
+	params->clear();
+
+	fedEx(kCharacterAlexei, kCharacterAlexei, 12, 0);
+}
+
+void LogicManager::HAND_Alexei_StandingAtWindow(HAND_PARAMS) {
+	switch (msg->action) {
+	case 0:
+		if (!getCharacterCurrentParams(kCharacterAlexei)[1] &&
+				(getCharacterCurrentParams(kCharacterAlexei)[1] = _gameTime + getCharacterCurrentParams(kCharacterAlexei)[0], _gameTime + getCharacterCurrentParams(kCharacterAlexei)[0] == 0) ||
+			getCharacterCurrentParams(kCharacterAlexei)[1] < _gameTime) {
+			if (rcClear()) {
+				getCharacter(kCharacterAlexei).characterPosition.location = 0;
+				getCharacter(kCharacterAlexei).inventoryItem = 0;
+				getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 1;
+				AlexeiCall(&LogicManager::CONS_Alexei_DoBlockSeqOtis, "103D", 5, 52, 0);
+				return;
+			}
+		}
+		if (getCharacterCurrentParams(kCharacterAlexei)[2] == 0x7FFFFFFF || _gameTime <= 1111500)
+			return;
+		if (_gameTime > 1138500)
+			goto LABEL_16;
+		if ((inSalon(kCharacterCath) || inDiningRoom(kCharacterCath)) && getCharacterCurrentParams(kCharacterAlexei)[2] || (getCharacterCurrentParams(kCharacterAlexei)[2] = _gameTime, _gameTime)) {
+			if (getCharacterCurrentParams(kCharacterAlexei)[2] >= _gameTime)
+				return;
+		LABEL_16:
+			getCharacterCurrentParams(kCharacterAlexei)[2] = 0x7FFFFFFF;
+		}
+		getCharacter(kCharacterAlexei).inventoryItem = 0;
+		CONS_Alexei_WaitingForTat(0, 0, 0, 0);
+		return;
+	case 1:
+		getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 2;
+		AlexeiCall(&LogicManager::CONS_Alexei_SaveGame, 2, kEventAlexeiSalonPoem, 0, 0);
+		return;
+	case 12:
+		getCharacterCurrentParams(kCharacterAlexei)[0] = 225 * (4 * rnd(4) + 8);
+		startCycOtis(kCharacterAlexei, "103E");
+		if (!_gameEvents[80])
+			getCharacter(kCharacterAlexei).inventoryItem = 10;
+		return;
+	case 18:
+		switch (getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8]) {
+		case 1:
+			getCharacter(kCharacterAlexei).characterPosition.location = 1;
+			CONS_Alexei_Sitting(0, 0, 0, 0);
+			break;
+		case 2:
+			playNIS(kEventAlexeiSalonPoem);
+			getCharacter(kCharacterAlexei).inventoryItem = 0;
+			getCharacter(kCharacterAlexei).characterPosition.location = 0;
+			startSeqOtis(kCharacterAlexei, "103D");
+			blockView(kCharacterAlexei, kCarRestaurant, 52);
+			bumpCath(kCarRestaurant, 55, 255);
+			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 3;
+			AlexeiCall(&LogicManager::CONS_Alexei_FinishSeqOtis, 0, 0, 0, 0);
+			break;
+		case 3:
+			releaseView(kCharacterAlexei, kCarRestaurant, 52);
+			getCharacter(kCharacterAlexei).characterPosition.location = 1;
+			CONS_Alexei_Sitting(0, 0, 0, 0);
+			break;
+		}
+		return;
+	default:
+		return;
+	}
+}
+
+void LogicManager::CONS_Alexei_WaitingForTat(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAlexei).callParams[getCharacter(kCharacterAlexei).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAlexei, &LogicManager::HAND_Alexei_WaitingForTat);
+	getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall] = 23;
+
+	params->clear();
+
+	fedEx(kCharacterAlexei, kCharacterAlexei, 12, 0);
+}
+
+void LogicManager::HAND_Alexei_WaitingForTat(HAND_PARAMS) {
+	if (msg->action <= 12) {
+		if (msg->action == 12) {
+			getCharacter(kCharacterAlexei).characterPosition.location = 1;
+			send(kCharacterAlexei, kCharacterTatiana, 124973510, 0);
+		} else if (msg->action) {
+			if (msg->action == 1) {
+				getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 2;
+				AlexeiCall(&LogicManager::CONS_Alexei_SaveGame, 2, kEventAlexeiSalonPoem, 0, 0);
+			}
+		} else if (!inDiningRoom(kCharacterTatiana) || _gameEvents[kEventAlexeiSalonPoem]) {
+			getCharacter(kCharacterAlexei).inventoryItem = 0;
+		} else {
+			getCharacter(kCharacterAlexei).inventoryItem = 10;
+		}
+		return;
+	}
+	if (msg->action != 18) {
+		if (msg->action == 157159392) {
+			if (inSalon(kCharacterCath)) {
+				getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 1;
+				AlexeiCall(&LogicManager::CONS_Alexei_SaveGame, 2, kEventAlexeiSalonVassili, 0, 0);
+				return;
+			}
+		} else if (msg->action != 188784532) {
+			return;
+		}
+	LABEL_24:
+		CONS_Alexei_Upset(0, 0, 0, 0);
+		return;
+	}
+
+	if (getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] == 1) {
+		playNIS(kEventAlexeiSalonVassili);
+		getCharacter(kCharacterAlexei).characterPosition.location = 0;
+		startCycOtis(kCharacterAlexei, "103F");
+		cleanNIS();
+		goto LABEL_24;
+	}
+	if (getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] == 2) {
+		playNIS(kEventAlexeiSalonPoem);
+		getCharacter(kCharacterAlexei).inventoryItem = 0;
+		bumpCath(kCarRestaurant, 55, 255);
+	}
+}
+
+void LogicManager::CONS_Alexei_Upset(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAlexei).callParams[getCharacter(kCharacterAlexei).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAlexei, &LogicManager::HAND_Alexei_Upset);
+	getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall] = 24;
+
+	params->clear();
+
+	fedEx(kCharacterAlexei, kCharacterAlexei, 12, 0);
+}
+
+void LogicManager::HAND_Alexei_Upset(HAND_PARAMS) {
+	if (msg->action > 12) {
+		if (msg->action == 18) {
+			if (getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] == 1) {
+				playNIS(kEventAlexeiSalonCath);
+				getCharacter(kCharacterAlexei).characterPosition.car = 4;
+				getCharacter(kCharacterAlexei).characterPosition.position = 9460;
+				endGraphics(kCharacterAlexei);
+				bumpCath(kCarRestaurant, 55, 255);
+				CONS_Alexei_ReturnCompNight(0, 0, 0, 0);
+			} else if (getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] == 2) {
+				CONS_Alexei_ReturnCompNight(0, 0, 0, 0);
+			}
+		} else if (msg->action == 135854208) {
+			getCharacter(kCharacterAlexei).inventoryItem = 0;
+			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 2;
+			AlexeiCall(&LogicManager::CONS_Alexei_DoSeqOtis, "103G", 0, 0, 0);
+		}
+	} else if (msg->action == 12) {
+		if (_gameEvents[kEventAlexeiSalonVassili])
+			getCharacter(kCharacterAlexei).inventoryItem = 0x80;
+	} else if (msg->action == 1) {
+		getCharacter(kCharacterAlexei).inventoryItem = 0;
+		getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 1;
+		AlexeiCall(&LogicManager::CONS_Alexei_SaveGame, 2, 79, 0, 0);
+	}
+}
+
+void LogicManager::CONS_Alexei_ReturnCompNight(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAlexei).callParams[getCharacter(kCharacterAlexei).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAlexei, &LogicManager::HAND_Alexei_ReturnCompNight);
+	getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall] = 25;
+
+	params->clear();
+
+	fedEx(kCharacterAlexei, kCharacterAlexei, 12, 0);
+}
+
+void LogicManager::HAND_Alexei_ReturnCompNight(HAND_PARAMS) {
+	if (msg->action == 12) {
+		getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 1;
+		AlexeiCall(&LogicManager::CONS_Alexei_EnterComp, 0, 0, 0, 0);
+	} else if (msg->action == 18) {
+		switch (getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8]) {
+		case 1:
+			if (checkCathDir(kCarGreenSleeping, 61))
+				bumpCath(kCarGreenSleeping, 49, 255);
+			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 2;
+			AlexeiCall(&LogicManager::CONS_Alexei_CompLogic, 1179000, "411", 0, 0);
+			break;
+		case 2:
+			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 3;
+			AlexeiCall(&LogicManager::CONS_Alexei_CompLogic, 1323000, "412", 0, 0);
+			break;
+		case 3:
+			CONS_Alexei_Asleep(0, 0, 0, 0);
+			break;
+		}
+	}
+}
+
+void LogicManager::CONS_Alexei_Asleep(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAlexei).callParams[getCharacter(kCharacterAlexei).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAlexei, &LogicManager::HAND_Alexei_Asleep);
+	getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall] = 26;
+
+	params->clear();
+
+	fedEx(kCharacterAlexei, kCharacterAlexei, 12, 0);
+}
+
+void LogicManager::HAND_Alexei_Asleep(HAND_PARAMS) {
+	if (msg->action) {
+		if (msg->action == 12) {
+			getCharacter(kCharacterAlexei).characterPosition.car = 3;
+			getCharacter(kCharacterAlexei).characterPosition.position = 7500;
+			getCharacter(kCharacterAlexei).characterPosition.location = 1;
+			setDoor(2, 0, 1, 10, 9);
+			setDoor(18, 0, 1, 10, 9);
+			setDoor(10, 0, 1, 255, 255);
+
+			if (checkCathDir(kCarGreenSleeping, 61))
+				bumpCath(kCarGreenSleeping, 66, 255);
+
+			endGraphics(kCharacterAlexei);
+		}
+	} else if (_gameTime > 1512000 && !getCharacterCurrentParams(kCharacterAlexei)[0]) {
+		getCharacterCurrentParams(kCharacterAlexei)[0] = 1;
+		CONS_Alexei_WakeUp(0, 0, 0, 0);
+	}
+}
+
+void LogicManager::CONS_Alexei_WakeUp(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAlexei).callParams[getCharacter(kCharacterAlexei).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAlexei, &LogicManager::HAND_Alexei_WakeUp);
+	getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall] = 27;
+
+	params->clear();
+
+	fedEx(kCharacterAlexei, kCharacterAlexei, 12, 0);
+}
+
+void LogicManager::HAND_Alexei_WakeUp(HAND_PARAMS) {
+	if (msg->action == 12) {
+		setDoor(10, 0, 0, 255, 255);
+		if (checkCathDir(kCarGreenSleeping, 66))
+			bumpCath(kCarGreenSleeping, 49, 255);
+		startCycOtis(kCharacterAlexei, "412");
+	}
+}
+
+void LogicManager::CONS_Alexei_StartPart2(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAlexei).callParams[getCharacter(kCharacterAlexei).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAlexei, &LogicManager::HAND_Alexei_StartPart2);
+	getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall] = 28;
+
+	params->clear();
+
+	fedEx(kCharacterAlexei, kCharacterAlexei, 12, 0);
+}
+
+void LogicManager::HAND_Alexei_StartPart2(HAND_PARAMS) {
+	if (msg->action) {
+		if (msg->action == 12) {
+			endGraphics(kCharacterAlexei);
+			getCharacter(kCharacterAlexei).characterPosition.car = 3;
+			getCharacter(kCharacterAlexei).characterPosition.position = 7500;
+			getCharacter(kCharacterAlexei).characterPosition.location = 1;
+			getCharacter(kCharacterAlexei).inventoryItem = 0;
+			getCharacter(kCharacterAlexei).clothes = 0;
+			setDoor(2, 12, 1, 10, 9);
+			setDoor(18, 12, 1, 10, 9);
+			setDoor(10, 0, 0, 255, 255);
+		}
+	} else {
+		CONS_Alexei_InComp2(0, 0, 0, 0);
+	}
+}
+
+void LogicManager::CONS_Alexei_InComp2(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAlexei).callParams[getCharacter(kCharacterAlexei).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAlexei, &LogicManager::HAND_Alexei_InComp2);
+	getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall] = 29;
+
+	params->clear();
+
+	fedEx(kCharacterAlexei, kCharacterAlexei, 12, 0);
+}
+
+void LogicManager::HAND_Alexei_InComp2(HAND_PARAMS) {
+	if (msg->action == 12) {
+		getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 1;
+		AlexeiCall(&LogicManager::CONS_Alexei_CompLogic, 1791000, "411", 0, 0);
+	} else if (msg->action == 18) {
+		switch (getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8]) {
+		case 1:
+			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 2;
+			AlexeiCall(&LogicManager::CONS_Alexei_ExitComp, 0, 0, 0, 0);
+			break;
+		case 2:
+			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 3;
+			AlexeiCall(&LogicManager::CONS_Alexei_DoWalk, 5, 850, 0, 0);
+			break;
+		case 3:
+			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 4;
+			AlexeiCall(&LogicManager::CONS_Alexei_WaitRCClear, 0, 0, 0, 0);
+			break;
+		case 4:
+			getCharacter(kCharacterAlexei).characterPosition.position = 1540;
+			getCharacter(kCharacterAlexei).characterPosition.location = 0;
+			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 5;
+			AlexeiCall(&LogicManager::CONS_Alexei_DoSeqOtis, "811US", 0, 0, 0);
+			break;
+		case 5:
+			blockView(kCharacterAlexei, kCarRestaurant, 63);
+			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 6;
+			AlexeiCall(&LogicManager::CONS_Alexei_DoJoinedSeqOtis, "018B", 34, 136455232, "BOGUS");
+			break;
+		case 6:
+			releaseView(kCharacterAlexei, kCarRestaurant, 63);
+			send(kCharacterAlexei, kCharacterTatiana, 290869168, 0);
+			CONS_Alexei_AtBreakfast(0, 0, 0, 0);
+			break;
+		default:
+			return;
+		}
+	}
+}
+
+void LogicManager::CONS_Alexei_AtBreakfast(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAlexei).callParams[getCharacter(kCharacterAlexei).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAlexei, &LogicManager::HAND_Alexei_AtBreakfast);
+	getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall] = 30;
+
+	params->clear();
+
+	fedEx(kCharacterAlexei, kCharacterAlexei, 12, 0);
+}
+
+void LogicManager::HAND_Alexei_AtBreakfast(HAND_PARAMS) {
+	switch (msg->action) {
+	case 12:
+		setDoor(2, 0, 1, 10, 9);
+		getCharacter(kCharacterAlexei).characterPosition.car = 5;
+		getCharacter(kCharacterAlexei).characterPosition.location = 1;
+		startCycOtis(kCharacterAlexei, "018C");
+		send(kCharacterAlexei, kCharacterTableB, 136455232, 0);
+		break;
+	case 18:
+		switch (getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8]) {
+		case 1:
+			releaseView(kCharacterAlexei, kCarRestaurant, 63);
+			send(kCharacterAlexei, kCharacterTatiana, 156444784, 0);
+			startCycOtis(kCharacterAlexei, "018E");
+			if (inDiningRoom(kCharacterCath))
+				_gameProgress[kProgressField68] = 1;
+			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 2;
+			AlexeiCall(&LogicManager::CONS_Alexei_DoDialog, "TAT2116", 0, 0, 0);
+			break;
+		case 2:
+			playDialog(kCharacterAlexei, "TAT2116A", -1, 0);
+			blockView(kCharacterAlexei, kCarRestaurant, 63);
+			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 3;
+			AlexeiCall(&LogicManager::CONS_Alexei_DoJoinedSeqOtis, "018F", 10, 123857088, "BOGUS");
+			break;
+		case 3:
+			releaseView(kCharacterAlexei, kCarRestaurant, 63);
+			CONS_Alexei_ReturnCompPart2(0, 0, 0, 0);
+			break;
+		}
+		break;
+	case 236053296:
+		startSeqOtis(kCharacterAlexei, "018D1");
+		startSeqOtis(kCharacterTatiana, "018D2");
+		blockView(kCharacterAlexei, kCarRestaurant, 63);
+
+		if (msg->param.intParam)
+			bumpCath(kCarRestaurant, msg->param.intParam, 255);
+
+		getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 1;
+		AlexeiCall(&LogicManager::CONS_Alexei_FinishSeqOtis, 0, 0, 0, 0);
+		break;
+	}
+}
+
+void LogicManager::CONS_Alexei_ReturnCompPart2(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAlexei).callParams[getCharacter(kCharacterAlexei).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAlexei, &LogicManager::HAND_Alexei_ReturnCompPart2);
+	getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall] = 31;
+
+	params->clear();
+
+	fedEx(kCharacterAlexei, kCharacterAlexei, 12, 0);
+}
+
+void LogicManager::HAND_Alexei_ReturnCompPart2(HAND_PARAMS) {
+	if (msg->action == 12) {
+		startSeqOtis(kCharacterAlexei, "811DS");
+		if (inDiningRoom(kCharacterCath))
+			advanceFrame(kCharacterAlexei);
+		getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 1;
+		AlexeiCall(&LogicManager::CONS_Alexei_FinishSeqOtis, 0, 0, 0, 0);
+	} else if (msg->action == 18) {
+		if (getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] == 1) {
+			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 2;
+			AlexeiCall(&LogicManager::CONS_Alexei_EnterComp, 0, 0, 0, 0);
+		} else if (getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] == 2) {
+			if (checkCathDir(kCarGreenSleeping, 61))
+				bumpCath(kCarGreenSleeping, 49, 255);
+			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 3;
+			AlexeiCall(&LogicManager::CONS_Alexei_CompLogic, 15803100, "411", 0, 0);
+		}
+	}
+}
+
+void LogicManager::CONS_Alexei_StartPart3(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAlexei).callParams[getCharacter(kCharacterAlexei).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAlexei, &LogicManager::HAND_Alexei_StartPart3);
+	getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall] = 32;
+
+	params->clear();
+
+	fedEx(kCharacterAlexei, kCharacterAlexei, 12, 0);
+}
+
+void LogicManager::HAND_Alexei_StartPart3(HAND_PARAMS) {
+	if (msg->action) {
+		if (msg->action == 12) {
+			endGraphics(kCharacterAlexei);
+			getCharacter(kCharacterAlexei).characterPosition.car = 5;
+			getCharacter(kCharacterAlexei).characterPosition.location = 1;
+			getCharacter(kCharacterAlexei).inventoryItem = 0;
+			getCharacter(kCharacterAlexei).clothes = 0;
+			setDoor(2, 0, 1, 10, 9);
+			setDoor(18, 0, 1, 10, 9);
+			setDoor(10, 0, 0, 255, 255);
+		}
+	} else {
+		CONS_Alexei_PlayingChess(0, 0, 0, 0);
+	}
+}
+
+void LogicManager::CONS_Alexei_PlayingChess(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAlexei).callParams[getCharacter(kCharacterAlexei).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAlexei, &LogicManager::HAND_Alexei_PlayingChess);
+	getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall] = 33;
+
+	params->clear();
+
+	fedEx(kCharacterAlexei, kCharacterAlexei, 12, 0);
+}
+
+void LogicManager::HAND_Alexei_PlayingChess(HAND_PARAMS) {
+	switch (msg->action) {
+	case 18:
+		if (getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] == 1)
+			CONS_Alexei_InPart3(0, 0, 0, 0);
+		break;
+	case 122288808:
+		getCharacter(kCharacterAlexei).characterPosition.car = 4;
+		getCharacter(kCharacterAlexei).characterPosition.location = 0;
+		getCharacter(kCharacterAlexei).characterPosition.position = 9270;
+		getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 1;
+		AlexeiCall(&LogicManager::CONS_Alexei_EnterComp, 0, 0, 0, 0);
+		break;
+	case 122358304:
+		startCycOtis(kCharacterAlexei, "BLANK");
+		break;
+	}
+}
+
+void LogicManager::CONS_Alexei_InPart3(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAlexei).callParams[getCharacter(kCharacterAlexei).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAlexei, &LogicManager::HAND_Alexei_InPart3);
+	getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall] = 34;
+
+	params->clear();
+
+	fedEx(kCharacterAlexei, kCharacterAlexei, 12, 0);
+}
+
+void LogicManager::HAND_Alexei_InPart3(HAND_PARAMS) {
+	if (msg->action == 12) {
+		if (checkCathDir(kCarGreenSleeping, 61))
+			bumpCath(kCarGreenSleeping, 49, 255);
+		getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 1;
+		AlexeiCall(&LogicManager::CONS_Alexei_CompLogic, 2083500, "411", 0, 0);
+	} else if (msg->action == 18) {
+		switch (getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8]) {
+		case 1:
+			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 2;
+			AlexeiCall(&LogicManager::CONS_Alexei_ExitComp, 0, 0, 0, 0);
+			break;
+		case 2:
+			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 3;
+			AlexeiCall(&LogicManager::CONS_Alexei_DoWalk, 5, 850, 0, 0);
+			break;
+		case 3:
+			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 4;
+			AlexeiCall(&LogicManager::CONS_Alexei_WaitRCClear, 0, 0, 0, 0);
+			break;
+		case 4:
+			getCharacter(kCharacterAlexei).characterPosition.position = 1540;
+			getCharacter(kCharacterAlexei).characterPosition.location = 0;
+			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 5;
+			AlexeiCall(&LogicManager::CONS_Alexei_DoBlockSeqOtis, "103A", 5, 52, 0);
+			break;
+		case 5:
+			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 6;
+			AlexeiCall(&LogicManager::CONS_Alexei_Pacing3, 0, 0, 0, 0);
+			break;
+		case 6:
+			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 7;
+			AlexeiCall(&LogicManager::CONS_Alexei_EnterComp, 0, 0, 0, 0);
+			break;
+		case 7:
+			setDoor(10, 0, 1, 255, 255);
+			if (checkCathDir(kCarGreenSleeping, 61))
+				bumpCath(kCarGreenSleeping, 66, 255);
+			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 8;
+			AlexeiCall(&LogicManager::CONS_Alexei_CompLogic, 2124000, "NONE", 0, 0);
+			break;
+		case 8:
+			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 9;
+			AlexeiCall(&LogicManager::CONS_Alexei_ExitComp, 0, 0, 0, 0);
+			break;
+		case 9:
+			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 10;
+			AlexeiCall(&LogicManager::CONS_Alexei_GoSalon3, 0, 0, 0, 0);
+			break;
+		case 0xA:
+			setDoor(10, 0, 0, 255, 255);
+			if (checkCathDir(kCarGreenSleeping, 66))
+				bumpCath(kCarGreenSleeping, 49, 255);
+			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 11;
+			AlexeiCall(&LogicManager::CONS_Alexei_CompLogic, 16451100, "411", 0, 0);
+			break;
+		default:
+			return;
+		}
+	}
+}
+
+void LogicManager::CONS_Alexei_Pacing3(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAlexei).callParams[getCharacter(kCharacterAlexei).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAlexei, &LogicManager::HAND_Alexei_Pacing3);
+	getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall] = 35;
+
+	params->clear();
+
+	fedEx(kCharacterAlexei, kCharacterAlexei, 12, 0);
+}
+
+void LogicManager::HAND_Alexei_Pacing3(HAND_PARAMS) {
+	if (msg->action) {
+		if (msg->action == 12) {
+			getCharacterCurrentParams(kCharacterAlexei)[0] = 15 * rnd(120);
+			startCycOtis(kCharacterAlexei, "103B");
+			getCharacter(kCharacterAlexei).characterPosition.location = 1;
+		} else if (msg->action == 18) {
+			switch (getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8]) {
+			case 1:
+				getCharacter(kCharacterAlexei).characterPosition.location = 0;
+				getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 2;
+				AlexeiCall(&LogicManager::CONS_Alexei_DoBlockSeqOtis, "124C", 5, 52, 0);
+				break;
+			case 2:
+			case 5:
+				getCharacter(kCharacterAlexei).currentCall--;
+				_engine->getMessageManager()->setMessageHandle(kCharacterAlexei, _functionsAlexei[getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall]]);
+				fedEx(kCharacterAlexei, kCharacterAlexei, 18, 0);
+				break;
+			case 3:
+				getCharacterCurrentParams(kCharacterAlexei)[0] = 15 * rnd(120);
+				getCharacterCurrentParams(kCharacterAlexei)[2] = 0;
+				goto LABEL_20;
+			case 4:
+				getCharacter(kCharacterAlexei).characterPosition.location = 0;
+				getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 5;
+				AlexeiCall(&LogicManager::CONS_Alexei_DoBlockSeqOtis, "124C", 5, 52, 0);
+				break;
+			default:
+				return;
+			}
+		}
+	} else {
+		if (inSalon(kCharacterCath)) {
+			if (!getCharacterCurrentParams(kCharacterAlexei)[1] && (getCharacterCurrentParams(kCharacterAlexei)[1] = _gameTime + 2700, _gameTime == -2700) || getCharacterCurrentParams(kCharacterAlexei)[1] < _gameTime) {
+				getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 1;
+				AlexeiCall(&LogicManager::CONS_Alexei_WaitRCClear, 0, 0, 0, 0);
+				return;
+			}
+		} else {
+			getCharacterCurrentParams(kCharacterAlexei)[1] = 0;
+		}
+		if (!getCharacterCurrentParams(kCharacterAlexei)[2] && (getCharacterCurrentParams(kCharacterAlexei)[2] = _gameTime + getCharacterCurrentParams(kCharacterAlexei)[0], _gameTime + getCharacterCurrentParams(kCharacterAlexei)[0] == 0) || getCharacterCurrentParams(kCharacterAlexei)[2] < _gameTime) {
+			if (rcClear()) {
+				getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 3;
+				AlexeiCall(&LogicManager::CONS_Alexei_PacingAtWindow, 0, 0, 0, 0);
+				return;
+			}
+		}
+	LABEL_20:
+		if (getCharacterCurrentParams(kCharacterAlexei)[3] || (getCharacterCurrentParams(kCharacterAlexei)[3] = _gameTime + 9000, _gameTime != -9000)) {
+			if (getCharacterCurrentParams(kCharacterAlexei)[3] >= _gameTime)
+				return;
+			getCharacterCurrentParams(kCharacterAlexei)[3] = 0x7FFFFFFF;
+		}
+		getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 4;
+		AlexeiCall(&LogicManager::CONS_Alexei_WaitRCClear, 0, 0, 0, 0);
+	}
+}
+
+void LogicManager::CONS_Alexei_GoSalon3(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAlexei).callParams[getCharacter(kCharacterAlexei).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAlexei, &LogicManager::HAND_Alexei_GoSalon3);
+	getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall] = 36;
+
+	params->clear();
+
+	fedEx(kCharacterAlexei, kCharacterAlexei, 12, 0);
+}
+
+void LogicManager::HAND_Alexei_GoSalon3(HAND_PARAMS) {
+	if (msg->action > 3) {
+		if (msg->action > 18) {
+			if (msg->action == 122288808) {
+				getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 4;
+				AlexeiCall(&LogicManager::CONS_Alexei_EnterComp, 0, 0, 0, 0);
+			} else if (msg->action == 122358304) {
+				startCycOtis(kCharacterAlexei, "BLANK");
+				getCharacterCurrentParams(kCharacterAlexei)[2] = 1;
+			}
+		} else if (msg->action == 18) {
+			switch (getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8]) {
+			case 1:
+				getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 2;
+				AlexeiCall(&LogicManager::CONS_Alexei_WaitRCClear, 0, 0, 0, 0);
+				break;
+			case 2:
+				send(kCharacterAlexei, kCharacterAbbot, 222609266, 0);
+				getCharacter(kCharacterAlexei).characterPosition.position = 1540;
+				getCharacter(kCharacterAlexei).characterPosition.location = 0;
+				getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 3;
+				AlexeiCall(&LogicManager::CONS_Alexei_DoBlockSeqOtis, "103A", 5, 52, 0);
+				break;
+			case 3:
+				getCharacter(kCharacterAlexei).characterPosition.location = 1;
+				startCycOtis(kCharacterAlexei, "124A");
+				break;
+			case 4:
+				getCharacter(kCharacterAlexei).currentCall--;
+				_engine->getMessageManager()->setMessageHandle(kCharacterAlexei, _functionsAlexei[getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall]]);
+				fedEx(kCharacterAlexei, kCharacterAlexei, 18, 0);
+				break;
+			default:
+				return;
+			}
+		} else if (msg->action == 12) {
+			getCharacterCurrentParams(kCharacterAlexei)[0] = 5 * (3 * rnd(15) + 15);
+			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 1;
+			AlexeiCall(&LogicManager::CONS_Alexei_DoWalk, 5, 850, 0, 0);
+		}
+	} else if (msg->action == 3) {
+		if (getCharacterCurrentParams(kCharacterAlexei)[1]) {
+			startCycOtis(kCharacterAlexei, "124A");
+			getCharacterCurrentParams(kCharacterAlexei)[0] = 5 * (3 * rnd(15) + 15);
+			getCharacterCurrentParams(kCharacterAlexei)[1] = 0;
+		}
+	} else if (msg->action == 0 && !getCharacterCurrentParams(kCharacterAlexei)[2] && !getCharacterCurrentParams(kCharacterAlexei)[1]) {
+		if (getCharacterCurrentParams(kCharacterAlexei)[3] || (getCharacterCurrentParams(kCharacterAlexei)[3] = _currentGameSessionTicks + getCharacterCurrentParams(kCharacterAlexei)[0],
+															   _currentGameSessionTicks + getCharacterCurrentParams(kCharacterAlexei)[0] != 0)) {
+			if (getCharacterCurrentParams(kCharacterAlexei)[3] >= _currentGameSessionTicks)
+				return;
+			getCharacterCurrentParams(kCharacterAlexei)[3] = 0x7FFFFFFF;
+		}
+		startSeqOtis(kCharacterAlexei, "124B");
+		getCharacterCurrentParams(kCharacterAlexei)[1] = 1;
+		getCharacterCurrentParams(kCharacterAlexei)[3] = 0;
+	}
+}
+
+void LogicManager::CONS_Alexei_StartPart4(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAlexei).callParams[getCharacter(kCharacterAlexei).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAlexei, &LogicManager::HAND_Alexei_StartPart4);
+	getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall] = 37;
+
+	params->clear();
+
+	fedEx(kCharacterAlexei, kCharacterAlexei, 12, 0);
+}
+
+void LogicManager::HAND_Alexei_StartPart4(HAND_PARAMS) {
+	if (msg->action) {
+		if (msg->action == 12) {
+			endGraphics(kCharacterAlexei);
+			getCharacter(kCharacterAlexei).characterPosition.position = 7500;
+			getCharacter(kCharacterAlexei).characterPosition.location = 1;
+			getCharacter(kCharacterAlexei).characterPosition.car = 3;
+			getCharacter(kCharacterAlexei).inventoryItem = 0;
+			setDoor(2, 0, 1, 10, 9);
+			setDoor(18, 0, 1, 10, 9);
+			setDoor(10, 0, 0, 255, 255);
+		}
+	} else {
+		CONS_Alexei_InComp4(0, 0, 0, 0);
+	}
+}
+
+void LogicManager::CONS_Alexei_InComp4(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAlexei).callParams[getCharacter(kCharacterAlexei).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAlexei, &LogicManager::HAND_Alexei_InComp4);
+	getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall] = 38;
+
+	params->clear();
+
+	fedEx(kCharacterAlexei, kCharacterAlexei, 12, 0);
+}
+
+void LogicManager::HAND_Alexei_InComp4(HAND_PARAMS) {
+	if (msg->action == 12) {
+		getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 1;
+		AlexeiCall(&LogicManager::CONS_Alexei_CompLogic, 2354400, "411", 0, 0);
+	} else if (msg->action == 18 && getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] == 1) {
+		CONS_Alexei_MeetTat(0, 0, 0, 0);
+	}
+}
+
+void LogicManager::CONS_Alexei_MeetTat(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAlexei).callParams[getCharacter(kCharacterAlexei).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAlexei, &LogicManager::HAND_Alexei_MeetTat);
+	getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall] = 39;
+
+	params->clear();
+
+	fedEx(kCharacterAlexei, kCharacterAlexei, 12, 0);
+}
+
+void LogicManager::HAND_Alexei_MeetTat(HAND_PARAMS) {
+	if (msg->action > 3) {
+		if (msg->action > 17) {
+			switch (msg->action) {
+			case 18:
+				if (getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] == 1) {
+					setDoor(2, 0, 0, 10, 9);
+					getCharacter(kCharacterAlexei).characterPosition.location = 0;
+					getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 2;
+					AlexeiCall(&LogicManager::CONS_Alexei_DoWalk, 3, 540, 0, 0);
+				} else if (getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] == 2) {
+					endGraphics(kCharacterAlexei);
+					if (onLowPlatform(kCharacterCath)) {
+						playChrExcuseMe(kCharacterAlexei, kCharacterCath, 0);
+						if (checkCathDir(kCarGreenSleeping, 62))
+							bumpCath(kCarGreenSleeping, 72, 255);
+					}
+					blockView(kCharacterAlexei, kCarGreenSleeping, 70);
+					blockView(kCharacterAlexei, kCarGreenSleeping, 71);
+				}
+				break;
+			case 123536024:
+				getCharacterCurrentParams(kCharacterAlexei)[1] = 1;
+				break;
+			case 123712592:
+				endGraphics(kCharacterAlexei);
+				getCharacterCurrentParams(kCharacterAlexei)[0] = 1;
+				break;
+			}
+		} else {
+			if (msg->action == 17) {
+				if (!checkCathDir(kCarGreenSleeping, 62))
+					return;
+				if (getCharacterCurrentParams(kCharacterAlexei)[0]) {
+					if (!getCharacterCurrentParams(kCharacterAlexei)[1])
+						return;
+				} else if (!getCharacterCurrentParams(kCharacterAlexei)[1]) {
+					startSeqOtis(kCharacterAlexei, "306A");
+					return;
+				}
+				goto LABEL_37;
+			}
+			if (msg->action == 12) {
+				getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 1;
+				AlexeiCall(&LogicManager::CONS_Alexei_DoCorrOtis, "602FB", 2, 0, 0);
+			}
+		}
+	} else if (msg->action == 3) {
+		if (!getCharacterCurrentParams(kCharacterAlexei)[0] && !getCharacterCurrentParams(kCharacterAlexei)[1])
+			startCycOtis(kCharacterAlexei, "306F");
+	} else if (msg->action == 0 && getCharacterCurrentParams(kCharacterAlexei)[1]) {
+		if (!getCharacterCurrentParams(kCharacterAlexei)[3]) {
+			getCharacterCurrentParams(kCharacterAlexei)[2] = _gameTime + 4500;
+			getCharacterCurrentParams(kCharacterAlexei)[3] = _gameTime + 9000;
+		}
+		if (getCharacterCurrentParams(kCharacterAlexei)[4] != 0x7FFFFFFF && getCharacterCurrentParams(kCharacterAlexei)[2] < _gameTime) {
+			if (getCharacterCurrentParams(kCharacterAlexei)[3] >= _gameTime) {
+				if (onLowPlatform(kCharacterCath) || !getCharacterCurrentParams(kCharacterAlexei)[4]) {
+					getCharacterCurrentParams(kCharacterAlexei)[4] = _gameTime;
+					if (!_gameTime)
+						goto LABEL_24;
+				}
+				if (getCharacterCurrentParams(kCharacterAlexei)[4] >= _gameTime)
+					return;
+			}
+			getCharacterCurrentParams(kCharacterAlexei)[4] = 0x7FFFFFFF;
+		LABEL_24:
+			releaseView(kCharacterAlexei, kCarGreenSleeping, 70);
+			releaseView(kCharacterAlexei, kCarGreenSleeping, 71);
+			if (onLowPlatform(kCharacterCath)) {
+				playChrExcuseMe(kCharacterAlexei, kCharacterCath, 0);
+				if (checkCathDir(kCarGreenSleeping, 62))
+					bumpCath(kCarGreenSleeping, 72, 255);
+			}
+		LABEL_37:
+			CONS_Alexei_LeavePlat(0, 0, 0, 0);
+		}
+	}
+}
+
+void LogicManager::CONS_Alexei_LeavePlat(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAlexei).callParams[getCharacter(kCharacterAlexei).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAlexei, &LogicManager::HAND_Alexei_LeavePlat);
+	getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall] = 40;
+
+	params->clear();
+
+	fedEx(kCharacterAlexei, kCharacterAlexei, 12, 0);
+}
+
+void LogicManager::HAND_Alexei_LeavePlat(HAND_PARAMS) {
+	if (msg->action == 12) {
+		getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 1;
+		AlexeiCall(&LogicManager::CONS_Alexei_DoWalk, 3, 7500, 0, 0);
+	} else if (msg->action == 18) {
+		if (getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] == 1) {
+			startSeqOtis(kCharacterAlexei, "602Eb");
+			blockAtDoor(kCharacterAlexei, 2);
+			getCharacter(kCharacterAlexei).characterPosition.location = 1;
+			if (inComp(kCharacterCath, kCarGreenSleeping, 7500)) {
+				playNIS((kEventCathTurningNight - !isNight()));
+				playDialog(0, "BUMP", -1, 0);
+				bumpCathRDoor(2);
+			}
+			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 2;
+			AlexeiCall(&LogicManager::CONS_Alexei_FinishSeqOtis, 0, 0, 0, 0);
+		} else if (getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] == 2) {
+			releaseAtDoor(kCharacterAlexei, 2);
+			getCharacter(kCharacterAlexei).characterPosition.position = 7500;
+			getCharacter(kCharacterAlexei).characterPosition.location = 1;
+			endGraphics(kCharacterAlexei);
+			CONS_Alexei_InCompAgain(0, 0, 0, 0);
+		}
+	}
+}
+
+void LogicManager::CONS_Alexei_InCompAgain(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAlexei).callParams[getCharacter(kCharacterAlexei).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAlexei, &LogicManager::HAND_Alexei_InCompAgain);
+	getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall] = 41;
+
+	params->clear();
+
+	fedEx(kCharacterAlexei, kCharacterAlexei, 12, 0);
+}
+
+void LogicManager::HAND_Alexei_InCompAgain(HAND_PARAMS) {
+	if (msg->action == 12) {
+		if (checkCathDir(kCarGreenSleeping, 66))
+			bumpCath(kCarGreenSleeping, 49, 255);
+		getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 1;
+		AlexeiCall(&LogicManager::CONS_Alexei_CompLogic, 2403000, "411", 0, 0);
+	} else if (msg->action == 18 && getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] == 1) {
+		CONS_Alexei_GoSalon4(0, 0, 0, 0);
+	}
+}
+
+void LogicManager::CONS_Alexei_GoSalon4(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAlexei).callParams[getCharacter(kCharacterAlexei).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAlexei, &LogicManager::HAND_Alexei_GoSalon4);
+	getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall] = 42;
+
+	params->clear();
+
+	fedEx(kCharacterAlexei, kCharacterAlexei, 12, 0);
+}
+
+void LogicManager::HAND_Alexei_GoSalon4(HAND_PARAMS) {
+	if (msg->action == 12) {
+		getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 1;
+		AlexeiCall(&LogicManager::CONS_Alexei_ExitComp, 0, 0, 0, 0);
+	} else if (msg->action == 18) {
+		switch (getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8]) {
+		case 1:
+			send(kCharacterAlexei, kCharacterTatiana, 191198209, 0);
+			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 2;
+			AlexeiCall(&LogicManager::CONS_Alexei_DoWalk, 5, 850, 0, 0);
+			break;
+		case 2:
+			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 3;
+			AlexeiCall(&LogicManager::CONS_Alexei_DoBlockSeqOtis, "103A", 5, 52, 0);
+			break;
+		case 3:
+			getCharacter(kCharacterAlexei).characterPosition.location = 1;
+			CONS_Alexei_Pacing(0, 0, 0, 0);
+			break;
+		}
+	}
+}
+
+void LogicManager::CONS_Alexei_Pacing(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAlexei).callParams[getCharacter(kCharacterAlexei).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAlexei, &LogicManager::HAND_Alexei_Pacing);
+	getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall] = 43;
+
+	params->clear();
+
+	fedEx(kCharacterAlexei, kCharacterAlexei, 12, 0);
+}
+
+void LogicManager::HAND_Alexei_Pacing(HAND_PARAMS) {
+	switch (msg->action) {
+	case 0:
+		if (_gameTime < 1806300) {
+			if (!getCharacterCurrentParams(kCharacterAlexei)[1] && (getCharacterCurrentParams(kCharacterAlexei)[1] = _gameTime + getCharacterCurrentParams(kCharacterAlexei)[0], _gameTime + getCharacterCurrentParams(kCharacterAlexei)[0] == 0) || getCharacterCurrentParams(kCharacterAlexei)[1] < _gameTime) {
+				if (rcClear()) {
+					getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 1;
+					AlexeiCall(&LogicManager::CONS_Alexei_PacingAtWindow, 0, 0, 0, 0);
+					return;
+				}
+			}
+		}
+		if (_gameTime > 2457000 && !getCharacterCurrentParams(kCharacterAlexei)[2]) {
+			getCharacterCurrentParams(kCharacterAlexei)[2] = 1;
+			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 2;
+			AlexeiCall(&LogicManager::CONS_Alexei_WaitRCClear, 0, 0, 0, 0);
+		}
+		return;
+	case 12:
+		getCharacterCurrentParams(kCharacterAlexei)[0] = 5 * (3 * rnd(120) + 180);
+		startCycOtis(kCharacterAlexei, "103B");
+		return;
+	case 18:
+		if (getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] != 1) {
+			if (getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] == 2) {
+				getCharacter(kCharacterAlexei).characterPosition.location = 0;
+				getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 3;
+				AlexeiCall(&LogicManager::CONS_Alexei_DoBlockSeqOtis, "124C", 5, 52, 0);
+			} else if (getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] == 3) {
+				CONS_Alexei_GoToPlatform(0, 0, 0, 0);
+			}
+			return;
+		}
+		getCharacterCurrentParams(kCharacterAlexei)[0] = 5 * (3 * rnd(120) + 180);
+		getCharacterCurrentParams(kCharacterAlexei)[1] = 0;
+		if (_gameTime > 2457000 && !getCharacterCurrentParams(kCharacterAlexei)[2]) {
+			getCharacterCurrentParams(kCharacterAlexei)[2] = 1;
+			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 2;
+			AlexeiCall(&LogicManager::CONS_Alexei_WaitRCClear, 0, 0, 0, 0);
+		}
+		return;
+	}
+}
+
+void LogicManager::CONS_Alexei_GoToPlatform(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAlexei).callParams[getCharacter(kCharacterAlexei).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAlexei, &LogicManager::HAND_Alexei_GoToPlatform);
+	getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall] = 44;
+
+	params->clear();
+
+	fedEx(kCharacterAlexei, kCharacterAlexei, 12, 0);
+}
+
+void LogicManager::HAND_Alexei_GoToPlatform(HAND_PARAMS) {
+	switch (msg->action) {
+	case 0:
+		if (_gameTime > 2475000 && !getCharacterCurrentParams(kCharacterAlexei)[0]) {
+			getCharacterCurrentParams(kCharacterAlexei)[0] = 1;
+			releaseView(kCharacterAlexei, kCarGreenSleeping, 70);
+			releaseView(kCharacterAlexei, kCarGreenSleeping, 71);
+			if (onLowPlatform(kCharacterCath)) {
+				playChrExcuseMe(kCharacterAlexei, kCharacterCath, 0);
+				if (checkCathDir(kCarGreenSleeping, 62))
+					bumpCath(kCarGreenSleeping, 72, 255);
+			}
+			CONS_Alexei_ReturnComp4(0, 0, 0, 0);
+		}
+		break;
+	case 12:
+		getCharacter(kCharacterAlexei).characterPosition.car = 4;
+		getCharacter(kCharacterAlexei).characterPosition.location = 0;
+		getCharacter(kCharacterAlexei).characterPosition.position = 9460;
+		getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 1;
+		AlexeiCall(&LogicManager::CONS_Alexei_DoWalk, 3, 540, 0, 0);
+		break;
+	case 17:
+		if (checkCathDir(kCarGreenSleeping, 62)) {
+			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 2;
+			AlexeiCall(&LogicManager::CONS_Alexei_DoSeqOtis, "306A", 0, 0, 0);
+		}
+		break;
+	case 18:
+		if (getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] == 1) {
+			endGraphics(kCharacterAlexei);
+			if (onLowPlatform(kCharacterCath)) {
+				playChrExcuseMe(kCharacterAlexei, kCharacterCath, 0);
+				if (checkCathDir(kCarGreenSleeping, 62))
+					bumpCath(kCarGreenSleeping, 72, 255);
+			}
+			blockView(kCharacterAlexei, kCarGreenSleeping, 70);
+			blockView(kCharacterAlexei, kCarGreenSleeping, 71);
+		} else if (getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] == 2) {
+			startCycOtis(kCharacterAlexei, "306F");
+		}
+		break;
+	default:
+		return;
+	}
+}
+
+void LogicManager::CONS_Alexei_ReturnComp4(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAlexei).callParams[getCharacter(kCharacterAlexei).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAlexei, &LogicManager::HAND_Alexei_ReturnComp4);
+	getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall] = 45;
+
+	params->clear();
+
+	fedEx(kCharacterAlexei, kCharacterAlexei, 12, 0);
+}
+
+void LogicManager::HAND_Alexei_ReturnComp4(HAND_PARAMS) {
+	if (msg->action == 12) {
+		getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 1;
+		AlexeiCall(&LogicManager::CONS_Alexei_EnterComp, 0, 0, 0, 0);
+	} else if (msg->action == 18 && getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] == 1) {
+		if (checkCathDir(kCarGreenSleeping, 66))
+			bumpCath(kCarGreenSleeping, 49, 255);
+		if (cathHasItem(kItemBomb)) {
+			CONS_Alexei_BombPlanB(0, 0, 0, 0);
+		} else {
+			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 2;
+			AlexeiCall(&LogicManager::CONS_Alexei_CompLogic, 15803100, "412", 0, 0);
+		}
+	}
+}
+
+void LogicManager::CONS_Alexei_BombPlanB(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAlexei).callParams[getCharacter(kCharacterAlexei).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAlexei, &LogicManager::HAND_Alexei_BombPlanB);
+	getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall] = 46;
+
+	params->clear();
+
+	fedEx(kCharacterAlexei, kCharacterAlexei, 12, 0);
+}
+
+void LogicManager::HAND_Alexei_BombPlanB(HAND_PARAMS) {
+	if (msg->action) {
+		if (msg->action == 12) {
+			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 1;
+			AlexeiCall(&LogicManager::CONS_Alexei_CompLogic, 2488500, "411", 0, 0);
+		} else if (msg->action == 18) {
+			switch (getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8]) {
+			case 1:
+				getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 2;
+				AlexeiCall(&LogicManager::CONS_Alexei_ExitComp, 0, 0, 0, 0);
+				break;
+			case 2:
+				getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 3;
+				AlexeiCall(&LogicManager::CONS_Alexei_DoWalk, 4, 0x24F4, 0, 0);
+				break;
+			case 4:
+				if (checkCathDir(kCarGreenSleeping, 66))
+					bumpCath(kCarGreenSleeping, 49, 255);
+				getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 5;
+				AlexeiCall(&LogicManager::CONS_Alexei_CompLogic, 2507400, "412", 0, 0);
+				break;
+			case 5:
+				getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 6;
+				AlexeiCall(&LogicManager::CONS_Alexei_DoCorrOtis, "602Fb", 2, 0, 0);
+				break;
+			case 6:
+				setDoor(2, 0, 0, 10, 9);
+				getCharacter(kCharacterAlexei).characterPosition.location = 0;
+				getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 7;
+				AlexeiCall(&LogicManager::CONS_Alexei_DoWalk, 4, 7500, 0, 0);
+				break;
+			case 7:
+				startSeqOtis(kCharacterAlexei, "602Eb");
+				blockAtDoor(kCharacterAlexei, 33);
+				getCharacter(kCharacterAlexei).characterPosition.location = 1;
+				if (inSuite(kCharacterCath, kCarRedSleeping, 7850)) {
+					playNIS((158 - !isNight()));
+					playDialog(0, "BUMP", -1, 0);
+					bumpCathRDoor(33);
+				}
+				getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 8;
+				AlexeiCall(&LogicManager::CONS_Alexei_FinishSeqOtis, 0, 0, 0, 0);
+				break;
+			case 8:
+				releaseAtDoor(kCharacterAlexei, 33);
+				endGraphics(kCharacterAlexei);
+				getCharacter(kCharacterAlexei).characterPosition.position = 8200;
+				getCharacter(kCharacterAlexei).characterPosition.location = 1;
+				setDoor(32, 0, 1, 0, 0);
+				setDoor(48, 0, 1, 0, 0);
+				getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 9;
+				AlexeiCall(&LogicManager::CONS_Alexei_DoDialog, "TAT4167", 0, 0, 0);
+				break;
+			case 9:
+				send(kCharacterAlexei, kCharacterMaster, 156435676, 0);
+				CONS_Alexei_Dead(0, 0, 0, 0);
+				break;
+			default:
+				return;
+			}
+		}
+		return;
+	}
+	if (getCharacterCurrentParams(kCharacterAlexei)[0] == 0x7FFFFFFF || !_gameTime)
+		return;
+	if (_gameTime <= 2493000) {
+		if (inSalon(kCharacterCath) || inSalon(kCharacterAugust) || !getCharacterCurrentParams(kCharacterAlexei)[0]) {
+			getCharacterCurrentParams(kCharacterAlexei)[0] = _gameTime;
+			if (!_gameTime)
+				goto LABEL_14;
+		}
+		if (getCharacterCurrentParams(kCharacterAlexei)[0] >= _gameTime)
+			return;
+	}
+	getCharacterCurrentParams(kCharacterAlexei)[0] = 0x7FFFFFFF;
+LABEL_14:
+	takeItem(kItem22);
+	if (inSalon(kCharacterCath)) {
+		playChrExcuseMe(kCharacterAlexei, kCharacterCath, 0);
+		bumpCath(kCarRestaurant, checkCathDir(), 255);
+	}
+	getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 4;
+	AlexeiCall(&LogicManager::CONS_Alexei_EnterComp, 0, 0, 0, 0);
+}
+
+void LogicManager::CONS_Alexei_Dead(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAlexei).callParams[getCharacter(kCharacterAlexei).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAlexei, &LogicManager::HAND_Alexei_Dead);
+	getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall] = 47;
+
+	params->clear();
+
+	fedEx(kCharacterAlexei, kCharacterAlexei, 12, 0);
+}
+
+void LogicManager::HAND_Alexei_Dead(HAND_PARAMS) {
+	if (msg->action == 12) {
+		endGraphics(kCharacterAlexei);
+		getCharacter(kCharacterAlexei).characterPosition.car = kCarLocomotive;
+		getCharacter(kCharacterAlexei).characterPosition.position = 0;
+		getCharacter(kCharacterAlexei).characterPosition.location = 0;
+		setDoor(2, 0, 0, 10, 9);
+		setDoor(18, 0, 0, 10, 9);
+	}
+}
+
+void LogicManager::CONS_Alexei_StartPart5(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAlexei).callParams[getCharacter(kCharacterAlexei).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAlexei, &LogicManager::HAND_Alexei_StartPart5);
+	getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall] = 48;
+
+	params->clear();
+
+	fedEx(kCharacterAlexei, kCharacterAlexei, 12, 0);
+}
+
+void LogicManager::HAND_Alexei_StartPart5(HAND_PARAMS) {
+	if (msg->action == 12)
+		endGraphics(kCharacterAlexei);
+}
+
+void (LogicManager::*LogicManager::_functionsAlexei[])(HAND_PARAMS) = {
+	nullptr,
+	&LogicManager::HAND_Alexei_DebugWalks,
+	&LogicManager::HAND_Alexei_DoDialog,
+	&LogicManager::HAND_Alexei_DoWait,
+	&LogicManager::HAND_Alexei_DoSeqOtis,
+	&LogicManager::HAND_Alexei_DoBlockSeqOtis,
+	&LogicManager::HAND_Alexei_DoCorrOtis,
+	&LogicManager::HAND_Alexei_FinishSeqOtis,
+	&LogicManager::HAND_Alexei_DoJoinedSeqOtis,
+	&LogicManager::HAND_Alexei_SaveGame,
+	&LogicManager::HAND_Alexei_DoWalk,
+	&LogicManager::HAND_Alexei_DoComplexSeqOtis,
+	&LogicManager::HAND_Alexei_WaitRCClear,
+	&LogicManager::HAND_Alexei_EnterComp,
+	&LogicManager::HAND_Alexei_ExitComp,
+	&LogicManager::HAND_Alexei_PacingAtWindow,
+	&LogicManager::HAND_Alexei_CompLogic,
+	&LogicManager::HAND_Alexei_Birth,
+	&LogicManager::HAND_Alexei_AtDinner,
+	&LogicManager::HAND_Alexei_ReturnComp,
+	&LogicManager::HAND_Alexei_GoSalon,
+	&LogicManager::HAND_Alexei_Sitting,
+	&LogicManager::HAND_Alexei_StandingAtWindow,
+	&LogicManager::HAND_Alexei_WaitingForTat,
+	&LogicManager::HAND_Alexei_Upset,
+	&LogicManager::HAND_Alexei_ReturnCompNight,
+	&LogicManager::HAND_Alexei_Asleep,
+	&LogicManager::HAND_Alexei_WakeUp,
+	&LogicManager::HAND_Alexei_StartPart2,
+	&LogicManager::HAND_Alexei_InComp2,
+	&LogicManager::HAND_Alexei_AtBreakfast,
+	&LogicManager::HAND_Alexei_ReturnCompPart2,
+	&LogicManager::HAND_Alexei_StartPart3,
+	&LogicManager::HAND_Alexei_PlayingChess,
+	&LogicManager::HAND_Alexei_InPart3,
+	&LogicManager::HAND_Alexei_Pacing3,
+	&LogicManager::HAND_Alexei_GoSalon3,
+	&LogicManager::HAND_Alexei_StartPart4,
+	&LogicManager::HAND_Alexei_InComp4,
+	&LogicManager::HAND_Alexei_MeetTat,
+	&LogicManager::HAND_Alexei_LeavePlat,
+	&LogicManager::HAND_Alexei_InCompAgain,
+	&LogicManager::HAND_Alexei_GoSalon4,
+	&LogicManager::HAND_Alexei_Pacing,
+	&LogicManager::HAND_Alexei_GoToPlatform,
+	&LogicManager::HAND_Alexei_ReturnComp4,
+	&LogicManager::HAND_Alexei_BombPlanB,
+	&LogicManager::HAND_Alexei_Dead,
+	&LogicManager::HAND_Alexei_StartPart5
+};
+
+
+} // End of namespace LastExpress
diff --git a/engines/lastexpress/characters/alouan.cpp b/engines/lastexpress/characters/alouan.cpp
new file mode 100644
index 00000000000..e77d3ea019a
--- /dev/null
+++ b/engines/lastexpress/characters/alouan.cpp
@@ -0,0 +1,858 @@
+/* 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 3 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, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "lastexpress/lastexpress.h"
+
+namespace LastExpress {
+
+void LogicManager::CONS_Alouan(int chapter) {
+	switch (chapter) {
+	case 0:
+		_engine->getMessageManager()->setMessageHandle(
+			kCharacterAlouan,
+			_functionsAlouan[getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall]]
+		);
+
+		break;
+	case 1:
+		CONS_Alouan_Birth(0, 0, 0, 0);
+		break;
+	case 2:
+		CONS_Alouan_StartPart2(0, 0, 0, 0);
+		break;
+	case 3:
+		CONS_Alouan_StartPart3(0, 0, 0, 0);
+		break;
+	case 4:
+		CONS_Alouan_StartPart4(0, 0, 0, 0);
+		break;
+	case 5:
+		CONS_Alouan_StartPart5(0, 0, 0, 0);
+		break;
+	default:
+		return;
+	}
+}
+
+void LogicManager::AlouanCall(CALL_PARAMS) {
+	getCharacter(kCharacterAlouan).currentCall++;
+
+	(this->*functionPointer)(param1, param2, param3, param4);
+}
+
+void LogicManager::CONS_Alouan_DebugWalks(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAlouan).callParams[getCharacter(kCharacterAlouan).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAlouan, &LogicManager::HAND_Alouan_DebugWalks);
+	getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall] = 1;
+
+	params->clear();
+
+	fedEx(kCharacterAlouan, kCharacterAlouan, 12, 0);
+}
+
+void LogicManager::HAND_Alouan_DebugWalks(HAND_PARAMS) {
+	if (msg->action) {
+		if (msg->action == 12) {
+			getCharacter(kCharacterAlouan).characterPosition.position = 0;
+			getCharacter(kCharacterAlouan).characterPosition.location = 0;
+			getCharacter(kCharacterAlouan).characterPosition.car = kCarGreenSleeping;
+			getCharacterCurrentParams(kCharacterAlouan)[0] = 10000;
+		}
+	} else if (walk(kCharacterAlouan, kCarGreenSleeping, getCharacterCurrentParams(kCharacterAlouan)[0])) {
+		if (getCharacterCurrentParams(kCharacterAlouan)[0] == 10000)
+			getCharacterCurrentParams(kCharacterAlouan)[0] = 0;
+		else
+			getCharacterCurrentParams(kCharacterAlouan)[0] = 10000;
+	}
+}
+
+void LogicManager::CONS_Alouan_DoCorrOtis(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAlouan).callParams[getCharacter(kCharacterAlouan).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAlouan, &LogicManager::HAND_Alouan_DoCorrOtis);
+	getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall] = 2;
+
+	params->clear();
+
+	strncpy((char *)&params->parameters[0], param1.stringParam, 12);
+
+	params->parameters[3] = param2.intParam;
+
+	fedEx(kCharacterAlouan, kCharacterAlouan, 12, 0);
+}
+
+void LogicManager::HAND_Alouan_DoCorrOtis(HAND_PARAMS) {
+	if (msg->action == 3) {
+		releaseAtDoor(kCharacterAlouan, getCharacterCurrentParams(kCharacterAlouan)[3]);
+		getCharacter(kCharacterAlouan).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterAlouan, _functionsAlouan[getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall]]);
+		fedEx(kCharacterAlouan, kCharacterAlouan, 18, 0);
+	} else if (msg->action == 12) {
+		startSeqOtis(kCharacterAlouan, (char *)&getCharacterCurrentParams(kCharacterAlouan)[0]);
+		blockAtDoor(kCharacterAlouan, getCharacterCurrentParams(kCharacterAlouan)[3]);
+	}
+}
+
+void LogicManager::CONS_Alouan_DoDialog(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAlouan).callParams[getCharacter(kCharacterAlouan).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAlouan, &LogicManager::HAND_Alouan_DoDialog);
+	getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall] = 3;
+
+	params->clear();
+
+	strncpy((char *)&params->parameters[0], param1.stringParam, 12);
+
+	fedEx(kCharacterAlouan, kCharacterAlouan, 12, 0);
+}
+
+void LogicManager::HAND_Alouan_DoDialog(HAND_PARAMS) {
+	if (msg->action == 2) {
+		getCharacter(kCharacterAlouan).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterAlouan, _functionsAlouan[getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall]]);
+		fedEx(kCharacterAlouan, kCharacterAlouan, 18, 0);
+	} else if (msg->action == 12) {
+		playDialog(kCharacterAlouan, (char *)&getCharacterCurrentParams(kCharacterAlouan)[0], -1, 0);
+	}
+}
+
+void LogicManager::CONS_Alouan_DoWait(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAlouan).callParams[getCharacter(kCharacterAlouan).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAlouan, &LogicManager::HAND_Alouan_DoWait);
+	getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall] = 4;
+
+	params->clear();
+
+	params->parameters[0] = param1.intParam;
+
+	fedEx(kCharacterAlouan, kCharacterAlouan, 12, 0);
+}
+
+void LogicManager::HAND_Alouan_DoWait(HAND_PARAMS) {
+	if (msg->action == 0) {
+		if (getCharacterCurrentParams(kCharacterAlouan)[1] || (getCharacterCurrentParams(kCharacterAlouan)[1] = _gameTime + getCharacterCurrentParams(kCharacterAlouan)[0], _gameTime + getCharacterCurrentParams(kCharacterAlouan)[0] != 0)) {
+			if (getCharacterCurrentParams(kCharacterAlouan)[1] >= _gameTime)
+				return;
+
+			getCharacterCurrentParams(kCharacterAlouan)[1] = 0x7FFFFFFF;
+		}
+
+		getCharacter(kCharacterAlouan).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterAlouan, _functionsAlouan[getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall]]);
+		fedEx(kCharacterAlouan, kCharacterAlouan, 18, 0);
+	}
+}
+
+void LogicManager::CONS_Alouan_DoWalk(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAlouan).callParams[getCharacter(kCharacterAlouan).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAlouan, &LogicManager::HAND_Alouan_DoWalk);
+	getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall] = 5;
+
+	params->clear();
+
+	params->parameters[0] = param1.intParam;
+	params->parameters[1] = param2.intParam;
+
+	fedEx(kCharacterAlouan, kCharacterAlouan, 12, 0);
+}
+
+void LogicManager::HAND_Alouan_DoWalk(HAND_PARAMS) {
+	switch (msg->action) {
+	case 0:
+		if (walk(kCharacterAlouan, getCharacterCurrentParams(kCharacterAlouan)[0], getCharacterCurrentParams(kCharacterAlouan)[1])) {
+			getCharacter(kCharacterAlouan).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterAlouan, _functionsAlouan[getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall]]);
+			fedEx(kCharacterAlouan, kCharacterAlouan, 18, 0);
+		}
+
+		break;
+	case 5:
+		playCathExcuseMe();
+		break;
+	case 6:
+		playChrExcuseMe(kCharacterAlouan, kCharacterCath, 0);
+		break;
+	case 12:
+		if (walk(kCharacterAlouan, getCharacterCurrentParams(kCharacterAlouan)[0], getCharacterCurrentParams(kCharacterAlouan)[1])) {
+			getCharacter(kCharacterAlouan).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterAlouan, _functionsAlouan[getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall]]);
+			fedEx(kCharacterAlouan, kCharacterAlouan, 18, 0);
+		}
+
+		break;
+	default:
+		break;
+	}
+}
+
+void LogicManager::CONS_Alouan_PeekF(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAlouan).callParams[getCharacter(kCharacterAlouan).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAlouan, &LogicManager::HAND_Alouan_PeekF);
+	getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall] = 6;
+
+	params->clear();
+
+	fedEx(kCharacterAlouan, kCharacterAlouan, 12, 0);
+}
+
+void LogicManager::HAND_Alouan_PeekF(HAND_PARAMS) {
+	if (msg->action == 12) {
+		getCharacter(kCharacterAlouan).characterPosition.position = 4070;
+		getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] = 1;
+		AlouanCall(&LogicManager::CONS_Alouan_DoCorrOtis, "621Cf", 6, 0, 0);
+	} else if (msg->action == 18) {
+		if (getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] == 1) {
+			getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] = 2;
+			AlouanCall(&LogicManager::CONS_Alouan_DoCorrOtis, "621Df", 6, 0, 0);
+		} else if (getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] == 2) {
+			getCharacter(kCharacterAlouan).characterPosition.position = 4070;
+			endGraphics(kCharacterAlouan);
+			getCharacter(kCharacterAlouan).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterAlouan, _functionsAlouan[getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall]]);
+			fedEx(kCharacterAlouan, kCharacterAlouan, 18, 0);
+		}
+	}
+}
+
+void LogicManager::CONS_Alouan_PeekH(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAlouan).callParams[getCharacter(kCharacterAlouan).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAlouan, &LogicManager::HAND_Alouan_PeekH);
+	getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall] = 7;
+
+	params->clear();
+
+	fedEx(kCharacterAlouan, kCharacterAlouan, 12, 0);
+}
+
+void LogicManager::HAND_Alouan_PeekH(HAND_PARAMS) {
+	if (msg->action == 12) {
+		getCharacter(kCharacterAlouan).characterPosition.position = 2740;
+		getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] = 1;
+		AlouanCall(&LogicManager::CONS_Alouan_DoCorrOtis, "621Ch", 8, 0, 0);
+	} else if (msg->action == 18) {
+		if (getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] == 1) {
+			getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] = 2;
+			AlouanCall(&LogicManager::CONS_Alouan_DoCorrOtis, "621Dh", 8, 0, 0);
+		} else if (getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] == 2) {
+			getCharacter(kCharacterAlouan).characterPosition.position = 2740;
+			endGraphics(kCharacterAlouan);
+			getCharacter(kCharacterAlouan).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterAlouan, _functionsAlouan[getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall]]);
+			fedEx(kCharacterAlouan, kCharacterAlouan, 18, 0);
+		}
+	}
+}
+
+void LogicManager::CONS_Alouan_GoFtoH(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAlouan).callParams[getCharacter(kCharacterAlouan).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAlouan, &LogicManager::HAND_Alouan_GoFtoH);
+	getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall] = 8;
+
+	params->clear();
+
+	fedEx(kCharacterAlouan, kCharacterAlouan, 12, 0);
+}
+
+void LogicManager::HAND_Alouan_GoFtoH(HAND_PARAMS) {
+	if (msg->action == 12) {
+		getCharacter(kCharacterAlouan).characterPosition.position = 4070;
+		getCharacter(kCharacterAlouan).characterPosition.location = 0;
+		getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] = 1;
+		AlouanCall(&LogicManager::CONS_Alouan_DoCorrOtis, "621Bf", 6, 0, 0);
+	} else if (msg->action == 18) {
+		switch (getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8]) {
+		case 1:
+			getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] = 2;
+			AlouanCall(&LogicManager::CONS_Alouan_DoWalk, 3, 2740, 0, 0);
+			break;
+		case 2:
+			getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] = 3;
+			AlouanCall(&LogicManager::CONS_Alouan_DoCorrOtis, "621Ah", 8, 0, 0);
+			break;
+		case 3:
+			getCharacter(kCharacterAlouan).characterPosition.location = 1;
+			endGraphics(kCharacterAlouan);
+
+			getCharacter(kCharacterAlouan).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterAlouan, _functionsAlouan[getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall]]);
+			fedEx(kCharacterAlouan, kCharacterAlouan, 18, 0);
+			break;
+		}
+	}
+}
+
+void LogicManager::CONS_Alouan_GoHtoF(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAlouan).callParams[getCharacter(kCharacterAlouan).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAlouan, &LogicManager::HAND_Alouan_GoHtoF);
+	getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall] = 9;
+
+	params->clear();
+
+	fedEx(kCharacterAlouan, kCharacterAlouan, 12, 0);
+}
+
+void LogicManager::HAND_Alouan_GoHtoF(HAND_PARAMS) {
+	if (msg->action == 12) {
+		getCharacter(kCharacterAlouan).characterPosition.position = 2740;
+		getCharacter(kCharacterAlouan).characterPosition.location = 0;
+		getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] = 1;
+		AlouanCall(&LogicManager::CONS_Alouan_DoCorrOtis, "621Bh", 8, 0, 0);
+	} else if (msg->action == 18) {
+		switch (getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8]) {
+		case 1:
+			getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] = 2;
+			AlouanCall(&LogicManager::CONS_Alouan_DoWalk, 3, 4070, 0, 0);
+			break;
+		case 2:
+			getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] = 3;
+			AlouanCall(&LogicManager::CONS_Alouan_DoCorrOtis, "621Af", 6, 0, 0);
+			break;
+		case 3:
+			getCharacter(kCharacterAlouan).characterPosition.location = 1;
+			endGraphics(kCharacterAlouan);
+
+			getCharacter(kCharacterAlouan).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterAlouan, _functionsAlouan[getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall]]);
+			fedEx(kCharacterAlouan, kCharacterAlouan, 18, 0);
+			break;
+		}
+	}
+}
+
+void LogicManager::CONS_Alouan_Birth(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAlouan).callParams[getCharacter(kCharacterAlouan).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAlouan, &LogicManager::HAND_Alouan_Birth);
+	getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall] = 10;
+
+	params->clear();
+
+	fedEx(kCharacterAlouan, kCharacterAlouan, 12, 0);
+}
+
+void LogicManager::HAND_Alouan_Birth(HAND_PARAMS) {
+	if (msg->action) {
+		if (msg->action == 12) {
+			getCharacter(kCharacterAlouan).characterPosition.position = 2740;
+			getCharacter(kCharacterAlouan).characterPosition.location = 1;
+			getCharacter(kCharacterAlouan).characterPosition.car = kCarGreenSleeping;
+		}
+	} else if (_gameTime > 1062000 && !getCharacterCurrentParams(kCharacterAlouan)[0]) {
+		getCharacterCurrentParams(kCharacterAlouan)[0] = 1;
+		CONS_Alouan_Part1(0, 0, 0, 0);
+	}
+}
+
+void LogicManager::CONS_Alouan_Part1(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAlouan).callParams[getCharacter(kCharacterAlouan).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAlouan, &LogicManager::HAND_Alouan_Part1);
+	getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall] = 11;
+
+	params->clear();
+
+	fedEx(kCharacterAlouan, kCharacterAlouan, 12, 0);
+}
+
+void LogicManager::HAND_Alouan_Part1(HAND_PARAMS) {
+	if (msg->action) {
+		if (msg->action != 18 || getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] != 1)
+			return;
+
+		getCharacter(kCharacterAlouan).characterPosition.position = 4840;
+	} else if (_gameTime > 1096200 && !getCharacterCurrentParams(kCharacterAlouan)[0]) {
+		getCharacterCurrentParams(kCharacterAlouan)[0] = 1;
+		getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] = 1;
+		AlouanCall(&LogicManager::CONS_Alouan_GoHtoF, 0, 0, 0, 0);
+		return;
+	}
+	if (_gameTime > 1162800 && !getCharacterCurrentParams(kCharacterAlouan)[1]) {
+		getCharacterCurrentParams(kCharacterAlouan)[1] = 1;
+		send(kCharacterAlouan, kCharacterClerk, 191070912, 4070);
+		getCharacter(kCharacterAlouan).characterPosition.position = 4070;
+	}
+	if (_gameTime > 1179000 && !getCharacterCurrentParams(kCharacterAlouan)[2]) {
+		getCharacterCurrentParams(kCharacterAlouan)[2] = 1;
+		send(kCharacterAlouan, kCharacterClerk, 191070912, 4840);
+		getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] = 2;
+		AlouanCall(&LogicManager::CONS_Alouan_GoFtoH, 0, 0, 0, 0);
+	}
+}
+
+void LogicManager::CONS_Alouan_Asleep(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAlouan).callParams[getCharacter(kCharacterAlouan).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAlouan, &LogicManager::HAND_Alouan_Asleep);
+	getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall] = 12;
+
+	params->clear();
+
+	fedEx(kCharacterAlouan, kCharacterAlouan, 12, 0);
+}
+
+void LogicManager::HAND_Alouan_Asleep(HAND_PARAMS) {
+	if (msg->action == 12) {
+		setDoor(7, kCharacterCath, 3, 10, 9);
+		setDoor(5, kCharacterCath, 3, 10, 9);
+		getCharacter(kCharacterAlouan).characterPosition.position = 4070;
+		getCharacter(kCharacterAlouan).characterPosition.location = 1;
+		getCharacter(kCharacterAlouan).characterPosition.car = kCarGreenSleeping;
+		endGraphics(kCharacterAlouan);
+	}
+}
+
+void LogicManager::CONS_Alouan_StartPart2(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAlouan).callParams[getCharacter(kCharacterAlouan).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAlouan, &LogicManager::HAND_Alouan_StartPart2);
+	getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall] = 13;
+
+	params->clear();
+
+	fedEx(kCharacterAlouan, kCharacterAlouan, 12, 0);
+}
+
+void LogicManager::HAND_Alouan_StartPart2(HAND_PARAMS) {
+	if (msg->action == 12) {
+		endGraphics(kCharacterAlouan);
+		getCharacter(kCharacterAlouan).characterPosition.position = 2740;
+		getCharacter(kCharacterAlouan).characterPosition.location = 1;
+		getCharacter(kCharacterAlouan).characterPosition.car = kCarGreenSleeping;
+		getCharacter(kCharacterAlouan).clothes = 0;
+		getCharacter(kCharacterAlouan).inventoryItem = kItemNone;
+		CONS_Alouan_Part2(0, 0, 0, 0);
+	}
+}
+
+void LogicManager::CONS_Alouan_Part2(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAlouan).callParams[getCharacter(kCharacterAlouan).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAlouan, &LogicManager::HAND_Alouan_Part2);
+	getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall] = 14;
+
+	params->clear();
+
+	fedEx(kCharacterAlouan, kCharacterAlouan, 12, 0);
+}
+
+void LogicManager::HAND_Alouan_Part2(HAND_PARAMS) {
+	if (msg->action > 12) {
+		if (msg->action == 18) {
+			switch (getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8]) {
+			case 3:
+				getCharacterCurrentParams(kCharacterAlouan)[0] = 0;
+				getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] = 4;
+				AlouanCall(&LogicManager::CONS_Alouan_DoDialog, "Har2011", 0, 0, 0);
+				break;
+			case 4:
+				getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] = 5;
+				AlouanCall(&LogicManager::CONS_Alouan_DoWait, 900, 0, 0, 0);
+				break;
+			case 5:
+				send(kCharacterAlouan, kCharacterFrancois, 190219584, 0);
+				break;
+			}
+		} else if (msg->action == 189489753) {
+			getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] = 3;
+			AlouanCall(&LogicManager::CONS_Alouan_GoHtoF, 0, 0, 0, 0);
+		}
+	} else {
+		if (msg->action == 12) {
+			send(kCharacterAlouan, kCharacterClerk, 191070912, 4840);
+			getCharacterCurrentParams(kCharacterAlouan)[0] = 1;
+			return;
+		}
+		if (msg->action == 0 && getCharacterCurrentParams(kCharacterAlouan)[1] != 0x7FFFFFFF && _gameTime) {
+			if (_gameTime <= 1777500) {
+				if (!cathInCorridor(kCarGreenSleeping) || !getCharacterCurrentParams(kCharacterAlouan)[1]) {
+					getCharacterCurrentParams(kCharacterAlouan)[1] = _gameTime + 75;
+					if (_gameTime == -75)
+						goto LABEL_16;
+				}
+				if (getCharacterCurrentParams(kCharacterAlouan)[1] >= _gameTime)
+					return;
+			}
+			getCharacterCurrentParams(kCharacterAlouan)[1] = 0x7FFFFFFF;
+		LABEL_16:
+			if (getCharacterCurrentParams(kCharacterAlouan)[0]) {
+				getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] = 1;
+				AlouanCall(&LogicManager::CONS_Alouan_PeekH, 0, 0, 0, 0);
+			} else {
+				getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] = 2;
+				AlouanCall(&LogicManager::CONS_Alouan_PeekF, 0, 0, 0, 0);
+			}
+		}
+	}
+}
+
+void LogicManager::CONS_Alouan_StartPart3(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAlouan).callParams[getCharacter(kCharacterAlouan).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAlouan, &LogicManager::HAND_Alouan_StartPart3);
+	getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall] = 15;
+
+	params->clear();
+
+	fedEx(kCharacterAlouan, kCharacterAlouan, 12, 0);
+}
+
+void LogicManager::HAND_Alouan_StartPart3(HAND_PARAMS) {
+	if (msg->action == 0) {
+		CONS_Alouan_Part3(0, 0, 0, 0);
+	} else if (msg->action == 12) {
+		endGraphics(kCharacterAlouan);
+		getCharacter(kCharacterAlouan).characterPosition.position = 2740;
+		getCharacter(kCharacterAlouan).characterPosition.location = 1;
+		getCharacter(kCharacterAlouan).characterPosition.car = kCarGreenSleeping;
+	}
+}
+
+void LogicManager::CONS_Alouan_Part3(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAlouan).callParams[getCharacter(kCharacterAlouan).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAlouan, &LogicManager::HAND_Alouan_Part3);
+	getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall] = 16;
+
+	params->clear();
+
+	fedEx(kCharacterAlouan, kCharacterAlouan, 12, 0);
+}
+
+void LogicManager::HAND_Alouan_Part3(HAND_PARAMS) {
+	if (msg->action) {
+		if (msg->action == 12) {
+			send(kCharacterAlouan, kCharacterClerk, 191070912, 4840);
+		} else if (msg->action == 18) {
+			switch (getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8]) {
+			case 1:
+				getCharacter(kCharacterAlouan).characterPosition.position = 4840;
+				goto LABEL_11;
+			case 2:
+				goto LABEL_20;
+			case 3:
+				goto LABEL_23;
+			case 4:
+				goto LABEL_26;
+			default:
+				return;
+			}
+		}
+		return;
+	}
+	if (_gameTime > 1984500 && !getCharacterCurrentParams(kCharacterAlouan)[0]) {
+		getCharacterCurrentParams(kCharacterAlouan)[0] = 1;
+		getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] = 1;
+		AlouanCall(&LogicManager::CONS_Alouan_GoHtoF, 0, 0, 0, 0);
+		return;
+	}
+LABEL_11:
+	if (getCharacterCurrentParams(kCharacterAlouan)[1] != 0x7FFFFFFF && _gameTime > 1989000) {
+		if (_gameTime > 2119500)
+			goto LABEL_18;
+		if (!cathInCorridor(kCarGreenSleeping) || !getCharacterCurrentParams(kCharacterAlouan)[1]) {
+			getCharacterCurrentParams(kCharacterAlouan)[1] = _gameTime + 75;
+			if (_gameTime == -75)
+				goto LABEL_19;
+		}
+		if (getCharacterCurrentParams(kCharacterAlouan)[1] < _gameTime) {
+		LABEL_18:
+			getCharacterCurrentParams(kCharacterAlouan)[1] = 0x7FFFFFFF;
+		LABEL_19:
+			getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] = 2;
+			AlouanCall(&LogicManager::CONS_Alouan_PeekF, 0, 0, 0, 0);
+			return;
+		}
+	}
+LABEL_20:
+	if (_gameTime > 2052000 && !getCharacterCurrentParams(kCharacterAlouan)[2]) {
+		getCharacterCurrentParams(kCharacterAlouan)[2] = 1;
+		getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] = 3;
+		AlouanCall(&LogicManager::CONS_Alouan_DoDialog, "Har1005", 0, 0, 0);
+		return;
+	}
+LABEL_23:
+	if (_gameTime > 2133000 && !getCharacterCurrentParams(kCharacterAlouan)[3]) {
+		getCharacterCurrentParams(kCharacterAlouan)[3] = 1;
+		getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] = 4;
+		AlouanCall(&LogicManager::CONS_Alouan_GoFtoH, 0, 0, 0, 0);
+		return;
+	}
+LABEL_26:
+	if (getCharacterCurrentParams(kCharacterAlouan)[4] != 0x7FFFFFFF && _gameTime > 2151000) {
+		if (_gameTime <= 2241000) {
+			if (!cathInCorridor(kCarGreenSleeping) || !getCharacterCurrentParams(kCharacterAlouan)[4]) {
+				getCharacterCurrentParams(kCharacterAlouan)[4] = _gameTime + 75;
+				if (_gameTime == -75)
+					goto LABEL_34;
+			}
+			if (getCharacterCurrentParams(kCharacterAlouan)[4] >= _gameTime)
+				return;
+		}
+		getCharacterCurrentParams(kCharacterAlouan)[4] = 0x7FFFFFFF;
+	LABEL_34:
+		getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] = 5;
+		AlouanCall(&LogicManager::CONS_Alouan_PeekH, 0, 0, 0, 0);
+	}
+}
+
+void LogicManager::CONS_Alouan_StartPart4(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAlouan).callParams[getCharacter(kCharacterAlouan).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAlouan, &LogicManager::HAND_Alouan_StartPart4);
+	getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall] = 17;
+
+	params->clear();
+
+	fedEx(kCharacterAlouan, kCharacterAlouan, 12, 0);
+}
+
+void LogicManager::HAND_Alouan_StartPart4(HAND_PARAMS) {
+	if (msg->action == 0) {
+		CONS_Alouan_Part4(0, 0, 0, 0);
+	} else if (msg->action == 12) {
+		endGraphics(kCharacterAlouan);
+		getCharacter(kCharacterAlouan).characterPosition.position = 2740;
+		getCharacter(kCharacterAlouan).characterPosition.location = 1;
+		getCharacter(kCharacterAlouan).characterPosition.car = kCarGreenSleeping;
+	}
+}
+
+void LogicManager::CONS_Alouan_Part4(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAlouan).callParams[getCharacter(kCharacterAlouan).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAlouan, &LogicManager::HAND_Alouan_Part4);
+	getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall] = 18;
+
+	params->clear();
+
+	fedEx(kCharacterAlouan, kCharacterAlouan, 12, 0);
+}
+
+void LogicManager::HAND_Alouan_Part4(HAND_PARAMS) {
+	switch (msg->action) {
+	case 0:
+		if (getCharacterCurrentParams(kCharacterAlouan)[0] == 0x7FFFFFFF || !_gameTime)
+			goto LABEL_22;
+
+		if (_gameTime <= 2443500) {
+			if (!cathInCorridor(kCarGreenSleeping) || !getCharacterCurrentParams(kCharacterAlouan)[0]) {
+				getCharacterCurrentParams(kCharacterAlouan)[0] = _gameTime + 75;
+				if (_gameTime == -75)
+					goto LABEL_13;
+			}
+
+			if (getCharacterCurrentParams(kCharacterAlouan)[0] >= _gameTime)
+				goto LABEL_22;
+		}
+
+		getCharacterCurrentParams(kCharacterAlouan)[0] = 0x7FFFFFFF;
+	LABEL_13:
+		getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] = 1;
+		AlouanCall(&LogicManager::CONS_Alouan_PeekH, 0, 0, 0, 0);
+		return;
+	case 12:
+		send(kCharacterAlouan, kCharacterClerk, 191070912, 4840);
+		return;
+	case 18:
+		if (getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] != 1) {
+			if (getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] != 2)
+				return;
+
+			send(kCharacterAlouan, kCharacterClerk, 191070912, 4070);
+			goto LABEL_18;
+		}
+	LABEL_22:
+		if (_gameTime > 2455200 && !getCharacterCurrentParams(kCharacterAlouan)[1]) {
+			getCharacterCurrentParams(kCharacterAlouan)[1] = 1;
+			getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] = 2;
+			AlouanCall(&LogicManager::CONS_Alouan_GoHtoF, 0, 0, 0, 0);
+			return;
+		}
+	LABEL_18:
+		if (_gameTime > 2475000 && !getCharacterCurrentParams(kCharacterAlouan)[2]) {
+			getCharacterCurrentParams(kCharacterAlouan)[2] = 1;
+			send(kCharacterAlouan, kCharacterClerk, 191070912, 4840);
+			getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] = 3;
+			AlouanCall(&LogicManager::CONS_Alouan_GoFtoH, 0, 0, 0, 0);
+		}
+
+		break;
+	}
+}
+
+void LogicManager::CONS_Alouan_Asleep4(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAlouan).callParams[getCharacter(kCharacterAlouan).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAlouan, &LogicManager::HAND_Alouan_Asleep4);
+	getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall] = 19;
+
+	params->clear();
+
+	fedEx(kCharacterAlouan, kCharacterAlouan, 12, 0);
+}
+
+void LogicManager::HAND_Alouan_Asleep4(HAND_PARAMS) {
+	if (msg->action == 12) {
+		setDoor(7, kCharacterCath, 3, 10, 9);
+		setDoor(5, kCharacterCath, 3, 10, 9);
+		getCharacter(kCharacterAlouan).characterPosition.position = 2740;
+		getCharacter(kCharacterAlouan).characterPosition.location = 1;
+		getCharacter(kCharacterAlouan).characterPosition.car = kCarGreenSleeping;
+		endGraphics(kCharacterAlouan);
+	}
+}
+
+void LogicManager::CONS_Alouan_StartPart5(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAlouan).callParams[getCharacter(kCharacterAlouan).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAlouan, &LogicManager::HAND_Alouan_StartPart5);
+	getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall] = 20;
+
+	params->clear();
+
+	fedEx(kCharacterAlouan, kCharacterAlouan, 12, 0);
+}
+
+void LogicManager::HAND_Alouan_StartPart5(HAND_PARAMS) {
+	if (msg->action == 0) {
+		CONS_Alouan_Prisoner(0, 0, 0, 0);
+	} else if (msg->action == 12) {
+		endGraphics(kCharacterAlouan);
+		getCharacter(kCharacterAlouan).characterPosition.car = kCarRestaurant;
+		getCharacter(kCharacterAlouan).characterPosition.position = 3969;
+		getCharacter(kCharacterAlouan).characterPosition.location = 1;
+		getCharacter(kCharacterAlouan).clothes = 0;
+		getCharacter(kCharacterAlouan).inventoryItem = kItemNone;
+	}
+}
+
+void LogicManager::CONS_Alouan_Prisoner(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAlouan).callParams[getCharacter(kCharacterAlouan).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAlouan, &LogicManager::HAND_Alouan_Prisoner);
+	getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall] = 21;
+
+	params->clear();
+
+	fedEx(kCharacterAlouan, kCharacterAlouan, 12, 0);
+}
+
+void LogicManager::HAND_Alouan_Prisoner(HAND_PARAMS) {
+	if (msg->action == 70549068)
+		CONS_Alouan_Free(0, 0, 0, 0);
+}
+
+void LogicManager::CONS_Alouan_Free(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAlouan).callParams[getCharacter(kCharacterAlouan).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAlouan, &LogicManager::HAND_Alouan_Free);
+	getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall] = 22;
+
+	params->clear();
+
+	fedEx(kCharacterAlouan, kCharacterAlouan, 12, 0);
+}
+
+void LogicManager::HAND_Alouan_Free(HAND_PARAMS) {
+	if (msg->action == 0) {
+		if (getCharacterCurrentParams(kCharacterAlouan)[0] ||
+			(getCharacterCurrentParams(kCharacterAlouan)[0] = _gameTime + 2700, _gameTime != -2700)) {
+			if (getCharacterCurrentParams(kCharacterAlouan)[0] >= _gameTime)
+				return;
+
+			getCharacterCurrentParams(kCharacterAlouan)[0] = 0x7FFFFFFF;
+		}
+
+		CONS_Alouan_Hiding(0, 0, 0, 0);
+	} else if (msg->action == 12) {
+		getCharacter(kCharacterAlouan).characterPosition.car = kCarGreenSleeping;
+		getCharacter(kCharacterAlouan).characterPosition.position = 5000;
+		getCharacter(kCharacterAlouan).characterPosition.location = 0;
+
+	} else if (msg->action == 17) {
+		if (checkLoc(kCharacterCath, 3)) {
+			CONS_Alouan_Hiding(0, 0, 0, 0);
+		}
+	}
+}
+
+void LogicManager::CONS_Alouan_Hiding(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAlouan).callParams[getCharacter(kCharacterAlouan).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAlouan, &LogicManager::HAND_Alouan_Hiding);
+	getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall] = 23;
+
+	params->clear();
+
+	fedEx(kCharacterAlouan, kCharacterAlouan, 12, 0);
+}
+
+void LogicManager::HAND_Alouan_Hiding(HAND_PARAMS) {
+	switch (msg->action) {
+	case 12:
+		getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] = 1;
+		AlouanCall(&LogicManager::CONS_Alouan_DoWalk, 3, 4070, 0, 0);
+		break;
+	case 18:
+		if (getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] == 1) {
+			getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] = 2;
+			AlouanCall(&LogicManager::CONS_Alouan_DoCorrOtis, "619AF", 6, 0, 0);
+		} else if (getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] == 2) {
+			endGraphics(kCharacterAlouan);
+			getCharacter(kCharacterAlouan).characterPosition.location = 1;
+			getCharacter(kCharacterAlouan).characterPosition.position = 4070;
+			setDoor(6, kCharacterCath, 1, 10, 9);
+		}
+
+		break;
+	case 135800432:
+		CONS_Alouan_Disappear(0, 0, 0, 0);
+		break;
+	}
+}
+
+void LogicManager::CONS_Alouan_Disappear(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAlouan).callParams[getCharacter(kCharacterAlouan).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAlouan, &LogicManager::HAND_Alouan_Disappear);
+	getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall] = 24;
+
+	params->clear();
+
+	fedEx(kCharacterAlouan, kCharacterAlouan, 12, 0);
+}
+
+void LogicManager::HAND_Alouan_Disappear(HAND_PARAMS) {
+	// No-op
+}
+
+void (LogicManager::*LogicManager::_functionsAlouan[])(HAND_PARAMS) = {
+	nullptr,
+	&LogicManager::HAND_Alouan_DebugWalks,
+	&LogicManager::HAND_Alouan_DoCorrOtis,
+	&LogicManager::HAND_Alouan_DoDialog,
+	&LogicManager::HAND_Alouan_DoWait,
+	&LogicManager::HAND_Alouan_DoWalk,
+	&LogicManager::HAND_Alouan_PeekF,
+	&LogicManager::HAND_Alouan_PeekH,
+	&LogicManager::HAND_Alouan_GoFtoH,
+	&LogicManager::HAND_Alouan_GoHtoF,
+	&LogicManager::HAND_Alouan_Birth,
+	&LogicManager::HAND_Alouan_Part1,
+	&LogicManager::HAND_Alouan_Asleep,
+	&LogicManager::HAND_Alouan_StartPart2,
+	&LogicManager::HAND_Alouan_Part2,
+	&LogicManager::HAND_Alouan_StartPart3,
+	&LogicManager::HAND_Alouan_Part3,
+	&LogicManager::HAND_Alouan_StartPart4,
+	&LogicManager::HAND_Alouan_Part4,
+	&LogicManager::HAND_Alouan_Asleep4,
+	&LogicManager::HAND_Alouan_StartPart5,
+	&LogicManager::HAND_Alouan_Prisoner,
+	&LogicManager::HAND_Alouan_Free,
+	&LogicManager::HAND_Alouan_Hiding,
+	&LogicManager::HAND_Alouan_Disappear
+};
+
+} // End of namespace LastExpress
diff --git a/engines/lastexpress/characters/anna.cpp b/engines/lastexpress/characters/anna.cpp
new file mode 100644
index 00000000000..a24fbaccef0
--- /dev/null
+++ b/engines/lastexpress/characters/anna.cpp
@@ -0,0 +1,4422 @@
+/* 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 3 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, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "lastexpress/lastexpress.h"
+
+namespace LastExpress {
+
+void LogicManager::CONS_Anna(int chapter) {
+	switch (chapter) {
+	case 0:
+		_engine->getMessageManager()->setMessageHandle(
+			kCharacterAnna,
+			_functionsAnna[getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall]]
+		);
+
+		break;
+	case 1:
+		CONS_Anna_Birth(0, 0, 0, 0);
+		break;
+	case 2:
+		CONS_Anna_StartPart2(0, 0, 0, 0);
+		break;
+	case 3:
+		CONS_Anna_StartPart3(0, 0, 0, 0);
+		break;
+	case 4:
+		CONS_Anna_StartPart4(0, 0, 0, 0);
+		break;
+	case 5:
+		CONS_Anna_StartPart5(0, 0, 0, 0);
+		break;
+	default:
+		return;
+	}
+}
+
+void LogicManager::AnnaCall(CALL_PARAMS) {
+	getCharacter(kCharacterAnna).currentCall++;
+
+	(this->*functionPointer)(param1, param2, param3, param4);
+}
+
+void LogicManager::CONS_Anna_DebugWalks(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_Anna_DebugWalks);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 1;
+
+	params->clear();
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_Anna_DebugWalks(HAND_PARAMS) {
+	if (msg->action) {
+		if (msg->action == 1) {
+			getCharacter(kCharacterAnna).clothes++;
+			if (getCharacter(kCharacterAnna).clothes > 3)
+				getCharacter(kCharacterAnna).clothes = 0;
+		} else if (msg->action == 12) {
+			getCharacter(kCharacterAnna).characterPosition.position = 0;
+			getCharacter(kCharacterAnna).characterPosition.location = 0;
+			getCharacter(kCharacterAnna).characterPosition.car = kCarGreenSleeping;
+			getCharacter(kCharacterAnna).inventoryItem = 0x80;
+			getCharacterCurrentParams(kCharacterAnna)[0] = 10000;
+		}
+	} else if (walk(kCharacterAnna, kCarGreenSleeping, getCharacterCurrentParams(kCharacterAnna)[0])) {
+		if (getCharacterCurrentParams(kCharacterAnna)[0] == 10000)
+			getCharacterCurrentParams(kCharacterAnna)[0] = 0;
+		else
+			getCharacterCurrentParams(kCharacterAnna)[0] = 10000;
+	}
+}
+
+void LogicManager::CONS_Anna_DoSeqOtis(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_Anna_DoSeqOtis);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 2;
+
+	params->clear();
+
+	strncpy((char *)&params->parameters[0], param1.stringParam, 12);
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_Anna_DoSeqOtis(HAND_PARAMS) {
+	if (msg->action == 3) {
+		getCharacter(kCharacterAnna).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterAnna, _functionsAnna[getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall]]);
+		fedEx(kCharacterAnna, kCharacterAnna, 18, 0);
+	} else if (msg->action == 12) {
+		startSeqOtis(kCharacterAnna, (char *)&getCharacterCurrentParams(kCharacterAnna)[0]);
+	}
+}
+
+void LogicManager::CONS_Anna_DoBlockSeqOtis(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_Anna_DoBlockSeqOtis);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 3;
+
+	params->clear();
+
+	strncpy((char *)&params->parameters[0], param1.stringParam, 12);
+
+	params->parameters[3] = param2.intParam;
+	params->parameters[4] = param3.intParam;
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_Anna_DoBlockSeqOtis(HAND_PARAMS) {
+	if (msg->action == 3) {
+		releaseView(kCharacterAnna, getCharacterCurrentParams(kCharacterAnna)[3], getCharacterCurrentParams(kCharacterAnna)[4]);
+		getCharacter(kCharacterAnna).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterAnna, _functionsAnna[getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall]]);
+		fedEx(kCharacterAnna, kCharacterAnna, 18, 0);
+	} else if (msg->action == 12) {
+		startSeqOtis(kCharacterAnna, (char *)&getCharacterCurrentParams(kCharacterAnna)[0]);
+		blockView(kCharacterAnna, getCharacterCurrentParams(kCharacterAnna)[3], getCharacterCurrentParams(kCharacterAnna)[4]);
+	}
+}
+
+void LogicManager::CONS_Anna_DoCorrOtis(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_Anna_DoCorrOtis);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 4;
+
+	params->clear();
+
+	strncpy((char *)&params->parameters[0], param1.stringParam, 12);
+
+	params->parameters[3] = param2.intParam;
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_Anna_DoCorrOtis(HAND_PARAMS) {
+	if (msg->action == 3) {
+		releaseAtDoor(kCharacterAnna, getCharacterCurrentParams(kCharacterAnna)[3]);
+		getCharacter(kCharacterAnna).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterAnna, _functionsAnna[getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall]]);
+		fedEx(kCharacterAnna, kCharacterAnna, 18, 0);
+	} else if (msg->action == 12) {
+		startSeqOtis(kCharacterAnna, (char *)&getCharacterCurrentParams(kCharacterAnna)[0]);
+		blockAtDoor(kCharacterAnna, getCharacterCurrentParams(kCharacterAnna)[3]);
+	}
+}
+
+void LogicManager::CONS_Anna_FinishSeqOtis(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_Anna_FinishSeqOtis);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 5;
+
+	params->clear();
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_Anna_FinishSeqOtis(HAND_PARAMS) {
+	if (msg->action == 0) {
+		if (getCharacter(kCharacterAnna).direction == 4)
+			return;
+		goto LABEL_5;
+	}
+	if (msg->action == 3) {
+	LABEL_5:
+		getCharacter(kCharacterAnna).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterAnna, _functionsAnna[getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall]]);
+		fedEx(kCharacterAnna, kCharacterAnna, 18, 0);
+	}
+}
+
+void LogicManager::CONS_Anna_DoJoinedSeqOtis(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_Anna_DoJoinedSeqOtis);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 6;
+
+	params->clear();
+
+	strncpy((char *)&params->parameters[0], param1.stringParam, 12);
+
+	params->parameters[3] = param2.intParam;
+	params->parameters[4] = param3.intParam;
+
+	strncpy((char *)&params->parameters[5], param4.stringParam, 12);
+
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_Anna_DoJoinedSeqOtis(HAND_PARAMS) {
+	switch (msg->action) {
+	case 3:
+		if (!getCharacterCurrentParams(kCharacterAnna)[8])
+			fedEx(kCharacterAnna, getCharacterCurrentParams(kCharacterAnna)[3], getCharacterCurrentParams(kCharacterAnna)[4], (char *)&getCharacterCurrentParams(kCharacterAnna)[5]);
+
+		getCharacter(kCharacterAnna).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterAnna, _functionsAnna[getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall]]);
+		fedEx(kCharacterAnna, kCharacterAnna, 18, 0);
+		break;
+	case 10:
+		if (!getCharacterCurrentParams(kCharacterAnna)[8]) {
+			fedEx(kCharacterAnna, getCharacterCurrentParams(kCharacterAnna)[3], getCharacterCurrentParams(kCharacterAnna)[4], (char *)&getCharacterCurrentParams(kCharacterAnna)[5]);
+			getCharacterCurrentParams(kCharacterAnna)[8] = 1;
+		}
+		break;
+	case 12:
+		startSeqOtis(kCharacterAnna, (char *)&getCharacterCurrentParams(kCharacterAnna)[0]);
+		break;
+	}
+}
+
+void LogicManager::CONS_Anna_DoDialog(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_Anna_DoDialog);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 7;
+
+	params->clear();
+
+	strncpy((char *)&params->parameters[0], param1.stringParam, 12);
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_Anna_DoDialog(HAND_PARAMS) {
+	if (msg->action == 2) {
+		getCharacter(kCharacterAnna).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterAnna, _functionsAnna[getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall]]);
+		fedEx(kCharacterAnna, kCharacterAnna, 18, 0);
+	} else if (msg->action == 12) {
+		playDialog(kCharacterAnna, (char *)&getCharacterCurrentParams(kCharacterAnna)[0], -1, 0);
+	}
+}
+
+void LogicManager::CONS_Anna_WaitRCClear(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_Anna_WaitRCClear);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 8;
+
+	params->clear();
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_Anna_WaitRCClear(HAND_PARAMS) {
+	if (msg->action == 0) {
+		if (!rcClear())
+			return;
+		goto LABEL_7;
+	}
+	if (msg->action == 12 && rcClear()) {
+	LABEL_7:
+		getCharacter(kCharacterAnna).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterAnna, _functionsAnna[getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall]]);
+		fedEx(kCharacterAnna, kCharacterAnna, 18, 0);
+	}
+}
+
+void LogicManager::CONS_Anna_SaveGame(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_Anna_SaveGame);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 9;
+
+	params->clear();
+
+	params->parameters[0] = param1.intParam;
+	params->parameters[1] = param2.intParam;
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_Anna_SaveGame(HAND_PARAMS) {
+	if (msg->action) {
+		if (msg->action == 12) {
+			save(
+				1,
+				getCharacterCurrentParams(kCharacterAnna)[0],
+				getCharacterCurrentParams(kCharacterAnna)[1]
+			);
+
+			getCharacter(kCharacterAnna).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterAnna, _functionsAnna[getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall]]);
+			fedEx(kCharacterAnna, kCharacterAnna, 18, 0);
+		}
+	} else {
+		getCharacter(kCharacterAnna).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterAnna, _functionsAnna[getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall]]);
+		fedEx(kCharacterAnna, kCharacterAnna, 18, 0);
+	}
+}
+
+void LogicManager::CONS_Anna_DoWalk(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_Anna_DoWalk);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 10;
+
+	params->clear();
+
+	params->parameters[0] = param1.intParam;
+	params->parameters[1] = param2.intParam;
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_Anna_DoWalk(HAND_PARAMS) {
+	switch (msg->action) {
+	case 0:
+		if (walk(kCharacterAnna, getCharacterCurrentParams(kCharacterAnna)[0], getCharacterCurrentParams(kCharacterAnna)[1]))
+			goto LABEL_12;
+		break;
+	case 5:
+		if (_gameEvents[kEventAugustPresentAnna] || _gameEvents[kEventAugustPresentAnnaFirstIntroduction] || _gameProgress[kProgressChapter] >= 2) {
+			playDialog(kCharacterCath, "CAT1001", -1, 0);
+		} else {
+			playCathExcuseMe();
+		}
+		break;
+	case 6:
+		playChrExcuseMe(kCharacterAnna, kCharacterCath, 0);
+		break;
+	case 12:
+		if (walk(kCharacterAnna, getCharacterCurrentParams(kCharacterAnna)[0], getCharacterCurrentParams(kCharacterAnna)[1])) {
+		LABEL_12:
+			getCharacter(kCharacterAnna).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterAnna, _functionsAnna[getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall]]);
+			fedEx(kCharacterAnna, kCharacterAnna, 18, 0);
+		}
+		break;
+	default:
+		return;
+	}
+}
+
+void LogicManager::CONS_Anna_DoWait(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_Anna_DoWait);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 11;
+
+	params->clear();
+
+	params->parameters[0] = param1.intParam;
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_Anna_DoWait(HAND_PARAMS) {
+	if (msg->action == 0) {
+		if (getCharacterCurrentParams(kCharacterAnna)[1] ||
+			(getCharacterCurrentParams(kCharacterAnna)[1] = _gameTime + getCharacterCurrentParams(kCharacterAnna)[0], _gameTime + getCharacterCurrentParams(kCharacterAnna)[0] != 0)) {
+			if (getCharacterCurrentParams(kCharacterAnna)[1] >= _gameTime)
+				return;
+
+			getCharacterCurrentParams(kCharacterAnna)[1] = 0x7FFFFFFF;
+		}
+
+		getCharacter(kCharacterAnna).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterAnna, _functionsAnna[getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall]]);
+		fedEx(kCharacterAnna, kCharacterAnna, 18, 0);
+	}
+}
+
+void LogicManager::CONS_Anna_PracticeMusic(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_Anna_PracticeMusic);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 12;
+
+	params->clear();
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_Anna_PracticeMusic(HAND_PARAMS) {
+	switch (msg->action) {
+	case 0:
+		if (!getCharacterCurrentParams(kCharacterAnna)[1] && getCharacterParams(kCharacterAnna, 8)[0])
+			getCharacterCurrentParams(kCharacterAnna)[1] = 1;
+		if (!getCharacterCurrentParams(kCharacterAnna)[5])
+			goto LABEL_11;
+		if (!getCharacterCurrentParams(kCharacterAnna)[6]) {
+			getCharacterCurrentParams(kCharacterAnna)[6] = _currentGameSessionTicks + 75;
+			if (_currentGameSessionTicks == -75)
+				goto LABEL_10;
+		}
+		if (getCharacterCurrentParams(kCharacterAnna)[6] < _currentGameSessionTicks) {
+			getCharacterCurrentParams(kCharacterAnna)[6] = 0x7FFFFFFF;
+		LABEL_10:
+			send(kCharacterAnna, kCharacterAnna, 2, 0);
+			getCharacterCurrentParams(kCharacterAnna)[5] = 0;
+			getCharacterCurrentParams(kCharacterAnna)[6] = 0;
+		}
+	LABEL_11:
+		if (getCharacterCurrentParams(kCharacterAnna)[3]) {
+			if (getCharacterCurrentParams(kCharacterAnna)[7] || (getCharacterCurrentParams(kCharacterAnna)[7] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
+				if (getCharacterCurrentParams(kCharacterAnna)[7] >= _currentGameSessionTicks)
+					return;
+				getCharacterCurrentParams(kCharacterAnna)[7] = 0x7FFFFFFF;
+			}
+			getCharacterCurrentParams(kCharacterAnna)[3] = 0;
+			getCharacterCurrentParams(kCharacterAnna)[4] = 1;
+			setDoor(37, kCharacterAnna, 1, 0, 9);
+			setDoor(53, kCharacterAnna, 1, 0, 9);
+			--getCharacterCurrentParams(kCharacterAnna)[0];
+			send(kCharacterAnna, kCharacterAnna, 2, 0);
+			getCharacterCurrentParams(kCharacterAnna)[7] = 0;
+		} else {
+			getCharacterCurrentParams(kCharacterAnna)[7] = 0;
+		}
+		return;
+	case 2:
+		if (getCharacterCurrentParams(kCharacterAnna)[1]) {
+			getCharacter(kCharacterAnna).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterAnna, _functionsAnna[getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall]]);
+			fedEx(kCharacterAnna, kCharacterAnna, 18, 0);
+		} else {
+			getCharacterCurrentParams(kCharacterAnna)[0]++;
+			switch (getCharacterCurrentParams(kCharacterAnna)[0]) {
+			case 1:
+				goto LABEL_21;
+			case 2:
+				playDialog(kCharacterAnna, "ANN2135B", -1, 0);
+				break;
+			case 3:
+			case 4:
+				playDialog(kCharacterAnna, "ANN2135C", -1, 0);
+				break;
+			case 5:
+			case 12:
+				playDialog(kCharacterAnna, "ANN2135L", -1, 0);
+				break;
+			case 6:
+			case 8:
+				playDialog(kCharacterAnna, "ANN2135K", -1, 0);
+				break;
+			case 7:
+				playDialog(kCharacterAnna, "ANN2135H", -1, 0);
+				break;
+			case 9:
+				playDialog(kCharacterAnna, "ANN2135I", -1, 0);
+				break;
+			case 10:
+				playDialog(kCharacterAnna, "ANN2135J", -1, 0);
+				break;
+			case 11:
+				playDialog(kCharacterAnna, "ANN2135M", -1, 0);
+				break;
+			case 13:
+				setDoor(37, kCharacterAnna, 1, 10, 9);
+				setDoor(53, kCharacterAnna, 1, 10, 9);
+
+				getCharacter(kCharacterAnna).currentCall--;
+				_engine->getMessageManager()->setMessageHandle(kCharacterAnna, _functionsAnna[getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall]]);
+				fedEx(kCharacterAnna, kCharacterAnna, 18, 0);
+				break;
+			default:
+				return;
+			}
+		}
+		return;
+	case 8:
+		if (getCharacterCurrentParams(kCharacterAnna)[3]) {
+			setDoor(37, kCharacterAnna, 1, 0, 9);
+			setDoor(53, kCharacterAnna, 1, 0, 9);
+			if (msg->param.intParam == 53) {
+				playDialog(kCharacterCath, getCathWCDialog(), -1, 0);
+			} else if (cathHasItem(kItemPassengerList)) {
+				if (rnd(2)) {
+					playDialog(kCharacterCath, getCathSorryDialog(), -1, 0);
+				} else {
+					if (rnd(2) == 0) {
+						playDialog(kCharacterCath, "CAT1506A", -1, 0);
+					} else {
+						playDialog(kCharacterCath, "CAT1506", -1, 0);
+					}
+				}
+				
+			} else {
+				playDialog(kCharacterCath, getCathSorryDialog(), -1, 0);
+			}
+
+			getCharacterCurrentParams(kCharacterAnna)[3] = 0;
+			getCharacterCurrentParams(kCharacterAnna)[4] = 1;
+		} else {
+			endDialog(kCharacterAnna);
+			setDoor(37, kCharacterAnna, 1, 0, 0);
+			setDoor(53, kCharacterAnna, 1, 0, 0);
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
+			AnnaCall(&LogicManager::CONS_Anna_DoDialog, "LIB012", 0, 0, 0);
+		}
+		return;
+	case 9:
+		endDialog(kCharacterAnna);
+		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 3;
+		AnnaCall(&LogicManager::CONS_Anna_DoDialog, "LIB013", 0, 0, 0);
+		return;
+	case 12:
+		getCharacterCurrentParams(kCharacterAnna)[0] = 1;
+		setDoor(37, kCharacterAnna, 1, 10, 9);
+		setDoor(53, kCharacterAnna, 1, 10, 9);
+		setDoor(45, kCharacterCath, 0, 255, 255);
+		if (checkCathDir(kCarRedSleeping, 78))
+			bumpCath(kCarRedSleeping, 49, 255);
+		startCycOtis(kCharacterAnna, "418C");
+		if (whoRunningDialog(kCharacterAnna))
+			fadeDialog(kCharacterAnna);
+	LABEL_21:
+		playDialog(kCharacterAnna, "ANN2135A", -1, 0);
+		return;
+	case 17:
+		if (getCharacterCurrentParams(kCharacterAnna)[4] || getCharacterCurrentParams(kCharacterAnna)[3]) {
+			setDoor(37, kCharacterAnna, 1, 10, 9);
+			setDoor(53, kCharacterAnna, 1, 10, 9);
+			getCharacterCurrentParams(kCharacterAnna)[4] = 0;
+			getCharacterCurrentParams(kCharacterAnna)[3] = 0;
+		}
+
+		if (checkCathDir(kCarRedSleeping, 60)) {
+			getCharacterCurrentParams(kCharacterAnna)[2]++;
+			if (getCharacterCurrentParams(kCharacterAnna)[2] == 2) {
+				getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 5;
+				AnnaCall(&LogicManager::CONS_Anna_DoSeqOtis, "418B", 0, 0, 0);
+			}
+		}
+
+		return;
+	case 18:
+		switch (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8]) {
+		case 1:
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 2;
+			AnnaCall(&LogicManager::CONS_Anna_DoDialog, "Ann1016", 0, 0, 0);
+			break;
+		case 2:
+			setDoor(37, kCharacterAnna, 1, 14, 9);
+			setDoor(53, kCharacterAnna, 1, 14, 9);
+			getCharacterCurrentParams(kCharacterAnna)[3] = 1;
+			break;
+		case 3:
+			if (whoRunningDialog(kCharacterMax))
+				goto LABEL_61;
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 4;
+			AnnaCall(&LogicManager::CONS_Anna_DoDialog, "MAX1120", 0, 0, 0);
+			break;
+		case 4:
+		LABEL_61:
+			getCharacterCurrentParams(kCharacterAnna)[0]--;
+			getCharacterCurrentParams(kCharacterAnna)[5] = 1;
+			break;
+		case 5:
+			startCycOtis(kCharacterAnna, "418A");
+			break;
+		default:
+			return;
+		}
+		return;
+	default:
+		return;
+	}
+}
+
+void LogicManager::CONS_Anna_DoComplexSeqOtis(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_Anna_DoComplexSeqOtis);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 13;
+
+	params->clear();
+
+	strncpy((char *)&params->parameters[0], param1.stringParam, 12);
+	strncpy((char *)&params->parameters[3], param2.stringParam, 12);
+
+	params->parameters[6] = param3.intParam;
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_Anna_DoComplexSeqOtis(HAND_PARAMS) {
+	if (msg->action == 3) {
+		getCharacter(kCharacterAnna).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterAnna, _functionsAnna[getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall]]);
+		fedEx(kCharacterAnna, kCharacterAnna, 18, 0);
+	} else if (msg->action == 12) {
+		startSeqOtis(kCharacterAnna, (char *)&getCharacterCurrentParams(kCharacterAnna)[0]);
+		startSeqOtis(getCharacterCurrentParams(kCharacterAnna)[6], (char *)&getCharacterCurrentParams(kCharacterAnna)[3]);
+	}
+}
+
+void LogicManager::CONS_Anna_DoWaitReal(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_Anna_DoWaitReal);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 14;
+
+	params->clear();
+
+	params->parameters[0] = param1.intParam;
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_Anna_DoWaitReal(HAND_PARAMS) {
+	if (msg->action == 0) {
+		if (getCharacterCurrentParams(kCharacterAnna)[1] ||
+			(getCharacterCurrentParams(kCharacterAnna)[1] = _currentGameSessionTicks + getCharacterCurrentParams(kCharacterAnna)[0],
+			_currentGameSessionTicks + getCharacterCurrentParams(kCharacterAnna)[0] != 0)) {
+			if (getCharacterCurrentParams(kCharacterAnna)[1] >= _currentGameSessionTicks)
+				return;
+
+			getCharacterCurrentParams(kCharacterAnna)[1] = 0x7FFFFFFF;
+		}
+
+		getCharacter(kCharacterAnna).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterAnna, _functionsAnna[getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall]]);
+		fedEx(kCharacterAnna, kCharacterAnna, 18, 0);
+	}
+}
+
+void LogicManager::CONS_Anna_CompLogic(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_Anna_CompLogic);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 15;
+
+	params->clear();
+
+	params->parameters[0] = param1.intParam;
+
+	strncpy((char *)&params->parameters[1], param2.stringParam, 12);
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_Anna_CompLogic(HAND_PARAMS) {
+	if (msg->action <= 18) {
+		switch (msg->action) {
+		case 0:
+			if (getCharacterCurrentParams(kCharacterAnna)[0] < _gameTime && !getCharacterCurrentParams(kCharacterAnna)[6]) {
+				getCharacterCurrentParams(kCharacterAnna)[6] = 1;
+				setDoor(37, kCharacterCath, 1, 10, 9);
+				setDoor(53, kCharacterCath, 1, 10, 9);
+
+				getCharacter(kCharacterAnna).currentCall--;
+				_engine->getMessageManager()->setMessageHandle(kCharacterAnna, _functionsAnna[getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall]]);
+				fedEx(kCharacterAnna, kCharacterAnna, 18, 0);
+				return;
+			}
+			if (getCharacterCurrentParams(kCharacterAnna)[4]) {
+				if (getCharacterCurrentParams(kCharacterAnna)[7] || (getCharacterCurrentParams(kCharacterAnna)[7] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
+					if (getCharacterCurrentParams(kCharacterAnna)[7] >= _currentGameSessionTicks)
+						return;
+					getCharacterCurrentParams(kCharacterAnna)[7] = 0x7FFFFFFF;
+				}
+				getCharacterCurrentParams(kCharacterAnna)[4] = 0;
+				getCharacterCurrentParams(kCharacterAnna)[5] = 1;
+
+				setDoor(37, kCharacterAnna, 1, 0, !inComp(kCharacterMax, kCarRedSleeping, 4070) ? 0 : 9);
+				setDoor(53, kCharacterAnna, 1, 0, !inComp(kCharacterMax, kCarRedSleeping, 4070) ? 0 : 9);
+				getCharacterCurrentParams(kCharacterAnna)[7] = 0;
+			} else {
+				getCharacterCurrentParams(kCharacterAnna)[7] = 0;
+			}
+			break;
+		case 8:
+			goto LABEL_26;
+		case 9:
+			if (inComp(kCharacterMax, kCarRedSleeping, 4070)) {
+				setDoor(37, kCharacterAnna, 1, 0, 0);
+				setDoor(53, kCharacterAnna, 1, 0, 0);
+				getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
+				AnnaCall(&LogicManager::CONS_Anna_DoDialog, "LIB013", 0, 0, 0);
+			} else {
+			LABEL_26:
+				if (getCharacterCurrentParams(kCharacterAnna)[4]) {
+					setDoor(37, kCharacterAnna, 1, 0, !inComp(kCharacterMax, kCarRedSleeping, 4070) ? 0 : 9);
+					setDoor(53, kCharacterAnna, 1, 0, !inComp(kCharacterMax, kCarRedSleeping, 4070) ? 0 : 9);
+
+					if (msg->param.intParam == 53) {
+						getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 6;
+						AnnaCall(&LogicManager::CONS_Anna_DoDialog, getCathWCDialog(), 0, 0, 0);
+					} else if (cathHasItem(kItemPassengerList)) {
+						getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 7;
+						if (rnd(2)) {
+							AnnaCall(&LogicManager::CONS_Anna_DoDialog, getCathSorryDialog(), 0, 0, 0);
+						} else {
+							if (rnd(2) == 0) {
+								AnnaCall(&LogicManager::CONS_Anna_DoDialog, "CAT1506A", 0, 0, 0);
+							} else {
+								AnnaCall(&LogicManager::CONS_Anna_DoDialog, "CAT1506", 0, 0, 0);
+							}
+						}
+					} else {
+						getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 8;
+						AnnaCall(&LogicManager::CONS_Anna_DoDialog, getCathSorryDialog(), 0, 0, 0);
+					}
+				} else {
+					setDoor(37, kCharacterAnna, 1, 0, 0);
+					setDoor(53, kCharacterAnna, 1, 0, 0);
+					if (msg->action == 8) {
+						getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 3;
+						AnnaCall(&LogicManager::CONS_Anna_DoDialog, "LIB012", 0, 0, 0);
+					} else {
+						getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 4;
+						AnnaCall(&LogicManager::CONS_Anna_DoDialog, "LIB013", 0, 0, 0);
+					}
+				}
+			}
+			return;
+		case 12:
+			setDoor(37, kCharacterAnna, 1, 10, 9);
+			setDoor(53, kCharacterAnna, 1, 10, 9);
+			startCycOtis(kCharacterAnna, (char *)&getCharacterCurrentParams(kCharacterAnna)[1]);
+			return;
+		case 17:
+			if (getCharacterCurrentParams(kCharacterAnna)[5] || getCharacterCurrentParams(kCharacterAnna)[4]) {
+				setDoor(37, kCharacterAnna, 1, 10, 9);
+				setDoor(53, kCharacterAnna, 1, 10, 9);
+				getCharacterCurrentParams(kCharacterAnna)[5] = 0;
+				getCharacterCurrentParams(kCharacterAnna)[4] = 0;
+			}
+			return;
+		case 18:
+			switch (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8]) {
+			case 1:
+				if (whoRunningDialog(kCharacterMax))
+					goto LABEL_25;
+				getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 2;
+				AnnaCall(&LogicManager::CONS_Anna_DoDialog, "MAX1120", 0, 0, 0);
+				break;
+			case 2:
+			LABEL_25:
+				setDoor(37, kCharacterAnna, 1, 10, 9);
+				setDoor(53, kCharacterAnna, 1, 10, 9);
+				break;
+			case 3:
+			case 4:
+				getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 5;
+				AnnaCall(&LogicManager::CONS_Anna_DoDialog, "ANN1016", 0, 0, 0);
+				break;
+			case 5:
+				setDoor(37, kCharacterAnna, 1, 14, 0);
+				setDoor(53, kCharacterAnna, 1, 14, 0);
+				getCharacterCurrentParams(kCharacterAnna)[4] = 1;
+				break;
+			case 6:
+			case 7:
+			case 8:
+				getCharacterCurrentParams(kCharacterAnna)[4] = 0;
+				getCharacterCurrentParams(kCharacterAnna)[5] = 1;
+				break;
+			default:
+				return;
+			}
+			return;
+		default:
+			return;
+		}
+	}
+}
+
+void LogicManager::CONS_Anna_Birth(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_Anna_Birth);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 16;
+
+	params->clear();
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_Anna_Birth(HAND_PARAMS) {
+	if (msg->action) {
+		if (msg->action == 12) {
+			autoMessage(kCharacterAnna, 291662081, 0);
+			autoMessage(kCharacterAnna, 238936000, 1);
+			setDoor(37, kCharacterCath, 1, 10, 9);
+			setDoor(53, kCharacterCath, 1, 10, 9);
+			setDoor(45, kCharacterCath, 1, 255, 255);
+			getCharacter(kCharacterAnna).characterPosition.position = 8200;
+			getCharacter(kCharacterAnna).characterPosition.location = 1;
+			getCharacter(kCharacterAnna).characterPosition.car = kCarGreenSleeping;
+			getCharacter(kCharacterAnna).clothes = 0;
+		}
+	} else if (_gameTime > 1062000 && !getCharacterCurrentParams(kCharacterAnna)[0]) {
+		getCharacterCurrentParams(kCharacterAnna)[0] = 1;
+		CONS_Anna_FleeTyler(0, 0, 0, 0);
+	}
+}
+
+void LogicManager::CONS_Anna_DoWalkP1(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_Anna_DoWalkP1);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 17;
+
+	params->clear();
+
+	params->parameters[0] = param1.intParam;
+	params->parameters[1] = param2.intParam;
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_Anna_DoWalkP1(HAND_PARAMS) {
+	switch (msg->action) {
+	case 0:
+		if (getCharacterCurrentParams(kCharacterAnna)[2] && nearChar(kCharacterAnna, kCharacterCath, 2000)) {
+			getCharacter(kCharacterAnna).inventoryItem = getCharacterCurrentParams(kCharacterAnna)[2];
+		} else {
+			getCharacter(kCharacterAnna).inventoryItem = 0;
+		}
+
+		if (walk(kCharacterAnna, getCharacterCurrentParams(kCharacterAnna)[0], getCharacterCurrentParams(kCharacterAnna)[1])) {
+			getCharacter(kCharacterAnna).inventoryItem = 0;
+
+			getCharacter(kCharacterAnna).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterAnna, _functionsAnna[getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall]]);
+			fedEx(kCharacterAnna, kCharacterAnna, 18, 0);
+		}
+
+		return;
+	case 1:
+		if (msg->param.intParam == 8) {
+			getCharacter(kCharacterAnna).inventoryItem &= ~8;
+			getCharacterCurrentParams(kCharacterAnna)[2] &= ~8;
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
+			AnnaCall(&LogicManager::CONS_Anna_SaveGame, 2, kEventAnnaGiveScarf, 0, 0);
+		} else {
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 2;
+			AnnaCall(&LogicManager::CONS_Anna_SaveGame, 2, kEventGotALight, 0, 0);
+		}
+
+		return;
+	case 5:
+		if (_gameEvents[kEventAugustPresentAnna] || _gameEvents[kEventAugustPresentAnnaFirstIntroduction] || _gameProgress[kProgressChapter] >= 2) {
+			playDialog(kCharacterCath, "CAT1001", -1, 0);
+		} else {
+			playCathExcuseMe();
+		}
+
+		return;
+	case 6:
+		playChrExcuseMe(kCharacterAnna, kCharacterCath, 0);
+		return;
+	case 12:
+		getCharacter(kCharacterAnna).inventoryItem = 0;
+		if (_gameProgress[kProgressJacket] == 2 && !_gameEvents[kEventGotALight] && !_gameEvents[kEventGotALightD] && !_gameEvents[kEventAugustPresentAnna] && !_gameEvents[kEventAugustPresentAnnaFirstIntroduction]) {
+			getCharacterCurrentParams(kCharacterAnna)[2] = 128;
+		}
+
+		if (_gameProgress[kProgressJacket] == 2 && !getCharacterCurrentParams(kCharacterAnna)[2] && !_gameEvents[kEventAnnaGiveScarfAsk] && !_gameEvents[kEventAnnaGiveScarfDinerAsk] && !_gameEvents[kEventAnnaGiveScarfSalonAsk]) {
+			getCharacterCurrentParams(kCharacterAnna)[2] = 8;
+		}
+
+		if (walk(kCharacterAnna, getCharacterCurrentParams(kCharacterAnna)[0], getCharacterCurrentParams(kCharacterAnna)[1])) {
+			getCharacter(kCharacterAnna).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterAnna, _functionsAnna[getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall]]);
+			fedEx(kCharacterAnna, kCharacterAnna, 18, 0);
+		}
+		return;
+	case 18:
+		if (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 1) {
+			if (_gameEvents[kEventAnnaGiveScarf] || _gameEvents[kEventAnnaGiveScarfDiner] || _gameEvents[kEventAnnaGiveScarfSalon] || _gameEvents[kEventAnnaGiveScarfMonogram] || _gameEvents[kEventAnnaGiveScarfDinerMonogram] || _gameEvents[kEventAnnaGiveScarfSalonMonogram]) {
+				playNIS(kEventAnnaGiveScarfAsk);
+			} else if (_gameEvents[kEventAugustPresentAnna] || _gameEvents[kEventAugustPresentAnnaFirstIntroduction]) {
+				playNIS(kEventAnnaGiveScarfMonogram);
+			} else {
+				playNIS(kEventAnnaGiveScarf);
+			}
+			if (getCharacter(kCharacterAnna).direction != 1) {
+			LABEL_55:
+				bumpCathRx(getCharacter(kCharacterAnna).characterPosition.car, getCharacter(kCharacterAnna).characterPosition.position + 750);
+				return;
+			}
+		} else {
+			if (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] != 2)
+				return;
+
+			if (getCharacter(kCharacterAnna).direction == 1) {
+				playNIS(kEventGotALightD);
+			} else {
+				playNIS(kEventGotALight);
+			}
+
+			getCharacter(kCharacterAnna).inventoryItem &= ~0x80;
+
+			int32 tmp = getCharacterCurrentParams(kCharacterAnna)[2] & 0xFFFFFF7F;
+			getCharacterCurrentParams(kCharacterAnna)[2] = tmp;
+			if (_gameProgress[1] == 2 && !_gameEvents[204] && !_gameEvents[205] && !_gameEvents[206])
+				getCharacterCurrentParams(kCharacterAnna)[2] = tmp | 8;
+			if (getCharacter(kCharacterAnna).direction != 1)
+				goto LABEL_55;
+		}
+		bumpCathFx(getCharacter(kCharacterAnna).characterPosition.car, getCharacter(kCharacterAnna).characterPosition.position - 750);
+		return;
+	default:
+		return;
+	}
+}
+
+void LogicManager::CONS_Anna_DiningLogic(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_Anna_DiningLogic);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 18;
+
+	params->clear();
+
+	params->parameters[0] = param1.intParam;
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_Anna_DiningLogic(HAND_PARAMS) {
+	if (msg->action > 12) {
+		if (msg->action <= 168046720) {
+			switch (msg->action) {
+			case 168046720:
+				getCharacter(kCharacterAnna).inventoryItem = 0;
+				getCharacterCurrentParams(kCharacterAnna)[3] = 1;
+				break;
+			case 17:
+				getCharacterCurrentParams(kCharacterAnna)[2] = checkCathDir(kCarRestaurant, 62);
+				break;
+			case 18:
+				if (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 1) {
+					if (_gameEvents[kEventAnnaGiveScarf] || _gameEvents[kEventAnnaGiveScarfDiner] || _gameEvents[kEventAnnaGiveScarfSalon] || _gameEvents[kEventAnnaGiveScarfMonogram] || _gameEvents[kEventAnnaGiveScarfDinerMonogram] || _gameEvents[kEventAnnaGiveScarfSalonMonogram]) {
+						playNIS(kEventAnnaGiveScarfDinerAsk);
+					} else {
+						if (_gameEvents[kEventAugustPresentAnna] || _gameEvents[kEventAugustPresentAnnaFirstIntroduction])
+							playNIS(kEventAnnaGiveScarfDinerMonogram);
+						else
+							playNIS(kEventAnnaGiveScarfDiner);
+						getCharacterCurrentParams(kCharacterAnna)[4] = 1;
+					}
+					int32 tmp = getCharacterCurrentParams(kCharacterAnna)[1] & 0xFFFFFFF7;
+					getCharacterCurrentParams(kCharacterAnna)[1] = tmp;
+					getCharacter(kCharacterAnna).inventoryItem = tmp;
+					bumpCath(kCarRestaurant, 61, 255);
+				} else if (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 2) {
+					playNIS(kEventDinerMindJoin);
+					int32 tmp = getCharacterCurrentParams(kCharacterAnna)[1] & 0xFFFFFF7F;
+					getCharacterCurrentParams(kCharacterAnna)[1] = tmp;
+					if (_gameProgress[kProgressJacket] == 2 && !_gameEvents[kEventAnnaGiveScarfAsk] && !_gameEvents[kEventAnnaGiveScarfDinerAsk] && !_gameEvents[kEventAnnaGiveScarfSalonAsk]) {
+						getCharacterCurrentParams(kCharacterAnna)[1] = tmp | 8;
+					}
+					getCharacter(kCharacterAnna).inventoryItem = getCharacterCurrentParams(kCharacterAnna)[1];
+					bumpCath(kCarRestaurant, 61, 255);
+				}
+				break;
+			}
+			return;
+		}
+		if (msg->action > 170016384) {
+			if (msg->action != 259136835 && msg->action != 268773672)
+				return;
+		} else if (msg->action != 170016384) {
+			if (msg->action == 168627977) {
+				getCharacter(kCharacterAnna).inventoryItem = getCharacterCurrentParams(kCharacterAnna)[1];
+				getCharacterCurrentParams(kCharacterAnna)[3] = 0;
+			}
+			return;
+		}
+	LABEL_77:
+		getCharacter(kCharacterAnna).inventoryItem = 0;
+
+		getCharacter(kCharacterAnna).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterAnna, _functionsAnna[getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall]]);
+		fedEx(kCharacterAnna, kCharacterAnna, 18, 0);
+		return;
+	}
+	if (msg->action == 12) {
+		if (_gameProgress[kProgressJacket] == 2 && !_gameEvents[kEventDinerMindJoin] && !_gameEvents[kEventAugustPresentAnna] && !_gameEvents[kEventAugustPresentAnnaFirstIntroduction]) {
+			getCharacterCurrentParams(kCharacterAnna)[1] |= 0x80;
+		}
+		if (_gameProgress[kProgressJacket] == 2 && !getCharacterCurrentParams(kCharacterAnna)[1] && !_gameEvents[kEventAnnaGiveScarfAsk] && !_gameEvents[kEventAnnaGiveScarfDinerAsk] && !_gameEvents[kEventAnnaGiveScarfSalonAsk]) {
+			getCharacterCurrentParams(kCharacterAnna)[1] = 8;
+		}
+		getCharacter(kCharacterAnna).inventoryItem = getCharacterCurrentParams(kCharacterAnna)[1];
+		return;
+	}
+	if (msg->action) {
+		if (msg->action == 1) {
+			if (msg->param.intParam == 8) {
+				getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
+				AnnaCall(&LogicManager::CONS_Anna_SaveGame, 2, kEventAnnaGiveScarf, 0, 0);
+			} else {
+				getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 2;
+				AnnaCall(&LogicManager::CONS_Anna_SaveGame, 2, kEventDinerMindJoin, 0, 0);
+			}
+		}
+		return;
+	}
+	if (getCharacterCurrentParams(kCharacterAnna)[0] && _gameTime > getCharacterCurrentParams(kCharacterAnna)[0] && rcClear())
+		goto LABEL_77;
+	if (getCharacterCurrentParams(kCharacterAnna)[4] && !getCharacterCurrentParams(kCharacterAnna)[3]) {
+		if (getCharacterCurrentParams(kCharacterAnna)[5] || (getCharacterCurrentParams(kCharacterAnna)[5] = _gameTime + 900, _gameTime != -900)) {
+			if (getCharacterCurrentParams(kCharacterAnna)[5] >= _gameTime)
+				goto LABEL_28;
+			getCharacterCurrentParams(kCharacterAnna)[5] = 0x7FFFFFFF;
+		}
+		getCharacterCurrentParams(kCharacterAnna)[1] |= 8;
+		getCharacterCurrentParams(kCharacterAnna)[4] = 0;
+		getCharacterCurrentParams(kCharacterAnna)[5] = 0;
+	}
+LABEL_28:
+	if (getCharacterCurrentParams(kCharacterAnna)[2]) {
+		if (getCharacterCurrentParams(kCharacterAnna)[6] || (getCharacterCurrentParams(kCharacterAnna)[6] = _currentGameSessionTicks + 90, _currentGameSessionTicks != -90)) {
+			if (getCharacterCurrentParams(kCharacterAnna)[6] >= _currentGameSessionTicks)
+				return;
+			getCharacterCurrentParams(kCharacterAnna)[6] = 0x7FFFFFFF;
+		}
+		bumpCath(kCarRestaurant, 61, 255);
+	} else {
+		getCharacterCurrentParams(kCharacterAnna)[6] = 0;
+	}
+}
+
+void LogicManager::CONS_Anna_FleeTyler(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_Anna_FleeTyler);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 19;
+
+	params->clear();
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_Anna_FleeTyler(HAND_PARAMS) {
+	if (msg->action == 12) {
+		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
+		AnnaCall(&LogicManager::CONS_Anna_DoCorrOtis, "618Ca", 1, 0, 0);
+	} else if (msg->action == 18) {
+		switch (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8]) {
+		case 1:
+			getCharacter(kCharacterAnna).characterPosition.location = 0;
+			getCharacter(kCharacterAnna).characterPosition.position = 8514;
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 2;
+			AnnaCall(&LogicManager::CONS_Anna_DoWalk, 4, 4070, 0, 0);
+			break;
+		case 2:
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 3;
+			AnnaCall(&LogicManager::CONS_Anna_DoCorrOtis, "618Af", 37, 0, 0);
+			break;
+		case 3:
+			endGraphics(kCharacterAnna);
+			getCharacter(kCharacterAnna).characterPosition.position = 4070;
+			getCharacter(kCharacterAnna).characterPosition.location = 1;
+			CONS_Anna_WaitDinner(0, 0, 0, 0);
+			break;
+		}
+	}
+}
+
+void LogicManager::CONS_Anna_WaitDinner(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_Anna_WaitDinner);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 20;
+
+	params->clear();
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_Anna_WaitDinner(HAND_PARAMS) {
+	if (msg->action == 12) {
+		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
+		AnnaCall(&LogicManager::CONS_Anna_CompLogic, 1093500, "NONE", 0, 0);
+	} else if (msg->action == 18) {
+		if (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 1) {
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 2;
+			AnnaCall(&LogicManager::CONS_Anna_DoCorrOtis, "618Bf", 37, 0, 0);
+		} else if (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 2) {
+			getCharacter(kCharacterAnna).characterPosition.location = 0;
+			send(kCharacterAnna, kCharacterMax, 71277948, 0);
+			CONS_Anna_GoDinner(0, 0, 0, 0);
+		}
+	}
+}
+
+void LogicManager::CONS_Anna_GoDinner(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_Anna_GoDinner);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 21;
+
+	params->clear();
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_Anna_GoDinner(HAND_PARAMS) {
+	if (msg->action == 12) {
+		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
+		AnnaCall(&LogicManager::CONS_Anna_DoWalkP1, 5, 850, 0, 0);
+	} else if (msg->action == 18) {
+		switch (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8]) {
+		case 1:
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 2;
+			AnnaCall(&LogicManager::CONS_Anna_WaitRCClear, 0, 0, 0, 0);
+			break;
+		case 2:
+			getCharacter(kCharacterAnna).characterPosition.position = 1540;
+			getCharacter(kCharacterAnna).characterPosition.location = 0;
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 3;
+			AnnaCall(&LogicManager::CONS_Anna_DoSeqOtis, "801US", 0, 0, 0);
+			break;
+		case 3:
+			startSeqOtis(kCharacterAnna, "001B");
+			if (inSalon(kCharacterCath))
+				advanceFrame(kCharacterAnna);
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 4;
+			AnnaCall(&LogicManager::CONS_Anna_FinishSeqOtis, 0, 0, 0, 0);
+			break;
+		case 4:
+			CONS_Anna_WaitHW(0, 0, 0, 0);
+			break;
+		default:
+			return;
+		}
+	}
+}
+
+void LogicManager::CONS_Anna_WaitHW(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_Anna_WaitHW);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 22;
+
+	params->clear();
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_Anna_WaitHW(HAND_PARAMS) {
+	if (msg->action == 12) {
+		startCycOtis(kCharacterAnna, "001A");
+		send(kCharacterAnna, kCharacterHeadWait, 223262556, 0);
+	} else if (msg->action == 157370960) {
+		getCharacter(kCharacterAnna).characterPosition.location = 1;
+		CONS_Anna_WaitingDinner(0, 0, 0, 0);
+	}
+}
+
+void LogicManager::CONS_Anna_WaitingDinner(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_Anna_WaitingDinner);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 23;
+
+	params->clear();
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_Anna_WaitingDinner(HAND_PARAMS) {
+	if (msg->action == 12) {
+		startCycOtis(kCharacterAnna, "001D");
+		send(kCharacterAnna, kCharacterWaiter1, 270410280, 0);
+		send(kCharacterAnna, kCharacterTableA, 136455232, 0);
+		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
+		AnnaCall(&LogicManager::CONS_Anna_DiningLogic, 0, 0, 0, 0);
+	} else if (msg->action == 18) {
+		switch (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8]) {
+		case 1:
+			startCycOtis(kCharacterAnna, "001E");
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 2;
+			AnnaCall(&LogicManager::CONS_Anna_DoDialog, "ANN1048", 0, 0, 0);
+			break;
+		case 2:
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 3;
+			AnnaCall(&LogicManager::CONS_Anna_DoSeqOtis, "001F", 0, 0, 0);
+			break;
+		case 3:
+			send(kCharacterAnna, kCharacterWaiter1, 203859488, 0);
+			CONS_Anna_WaitingDinner2(0, 0, 0, 0);
+			break;
+		}
+	}
+}
+
+void LogicManager::CONS_Anna_WaitingDinner2(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_Anna_WaitingDinner2);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 24;
+
+	params->clear();
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_Anna_WaitingDinner2(HAND_PARAMS) {
+	if (msg->action == 12) {
+		startCycOtis(kCharacterAnna, "001G");
+		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
+		AnnaCall(&LogicManager::CONS_Anna_DiningLogic, 0, 0, 0, 0);
+	} else if (msg->action == 18) {
+		if (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 1) {
+			startCycOtis(kCharacterAnna, "001H");
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 2;
+			AnnaCall(&LogicManager::CONS_Anna_DoDialog, "ANN1049", 0, 0, 0);
+		} else if (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 2) {
+			send(kCharacterAnna, kCharacterWaiter1, 136702400, 0);
+			CONS_Anna_EatingDinner(0, 0, 0, 0);
+		}
+	}
+}
+
+void LogicManager::CONS_Anna_EatingDinner(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_Anna_EatingDinner);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 25;
+
+	params->clear();
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_Anna_EatingDinner(HAND_PARAMS) {
+	if (msg->action > 18) {
+		if (msg->action == 122358304) {
+			startCycOtis(kCharacterAnna, "BLANK");
+		} else if (msg->action == 201437056) {
+			startCycOtis(kCharacterAnna, "001J");
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 2;
+			AnnaCall(&LogicManager::CONS_Anna_DiningLogic, 1138500, 0, 0, 0);
+		}
+	} else if (msg->action == 18) {
+		if (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 2) {
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 3;
+			AnnaCall(&LogicManager::CONS_Anna_WaitRCClear, 0, 0, 0, 0);
+		} else if (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 3) {
+			CONS_Anna_LeaveDinner(0, 0, 0, 0);
+		}
+	} else if (msg->action == 12) {
+		startCycOtis(kCharacterAnna, "001J");
+		_gameProgress[kProgressField28] = 1;
+		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
+		AnnaCall(&LogicManager::CONS_Anna_DiningLogic, 0, 0, 0, 0);
+	}
+}
+
+void LogicManager::CONS_Anna_LeaveDinner(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_Anna_LeaveDinner);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 26;
+
+	params->clear();
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_Anna_LeaveDinner(HAND_PARAMS) {
+	if (msg->action == 12) {
+		getCharacter(kCharacterAnna).characterPosition.location = 0;
+		blockView(kCharacterAnna, kCarRestaurant, 62);
+		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
+		AnnaCall(&LogicManager::CONS_Anna_DoJoinedSeqOtis, "001L", 33, 103798704, "001M");
+	} else if (msg->action == 18) {
+		switch (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8]) {
+		case 1:
+			releaseView(kCharacterAnna, kCarRestaurant, 62);
+			send(kCharacterAnna, kCharacterWaiter1, 237485916, 0);
+			startSeqOtis(kCharacterAnna, "801DS");
+			if (inDiningRoom(kCharacterCath))
+				advanceFrame(kCharacterAnna);
+
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 2;
+			AnnaCall(&LogicManager::CONS_Anna_FinishSeqOtis, 0, 0, 0, 0);
+			break;
+		case 2:
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 3;
+			AnnaCall(&LogicManager::CONS_Anna_DoWalkP1, 4, 4070, 0, 0);
+			break;
+		case 3:
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 4;
+			AnnaCall(&LogicManager::CONS_Anna_DoCorrOtis, "618Af", 37, 0, 0);
+			break;
+		case 4:
+			endGraphics(kCharacterAnna);
+			getCharacter(kCharacterAnna).characterPosition.position = 4070;
+			getCharacter(kCharacterAnna).characterPosition.location = 1;
+			CONS_Anna_FreshenUp(0, 0, 0, 0);
+			break;
+		default:
+			return;
+		}
+	}
+}
+
+void LogicManager::CONS_Anna_FreshenUp(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_Anna_FreshenUp);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 27;
+
+	params->clear();
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_Anna_FreshenUp(HAND_PARAMS) {
+	if (msg->action == 12) {
+		send(kCharacterAnna, kCharacterMax, 101687594, 0);
+		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
+		AnnaCall(&LogicManager::CONS_Anna_CompLogic, 1156500, "NONE", 0, 0);
+	} else if (msg->action == 18) {
+		if (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 1 ||
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 2) {
+			if (_gameProgress[kProgressField14] == 29) {
+				getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = _gameTime + 900;
+				getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 2;
+				AnnaCall(&LogicManager::CONS_Anna_CompLogic, getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8], "NONE", 0, 0);
+			} else {
+				getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 3;
+				AnnaCall(&LogicManager::CONS_Anna_DoCorrOtis, "618Bf", 37, 0, 0);
+			}
+		} else if (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 3) {
+			getCharacter(kCharacterAnna).characterPosition.location = 0;
+			send(kCharacterAnna, kCharacterMax, 71277948, 0);
+			CONS_Anna_GoSalon(0, 0, 0, 0);
+		}
+	}
+}
+
+void LogicManager::CONS_Anna_GoSalon(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_Anna_GoSalon);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 28;
+
+	params->clear();
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_Anna_GoSalon(HAND_PARAMS) {
+	if (msg->action == 12) {
+		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
+		AnnaCall(&LogicManager::CONS_Anna_DoWalkP1, 5, 850, 0, 0);
+	} else if (msg->action == 18) {
+		switch (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8]) {
+		case 1:
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 2;
+			AnnaCall(&LogicManager::CONS_Anna_WaitRCClear, 0, 0, 0, 0);
+			break;
+		case 2:
+			getCharacter(kCharacterAnna).characterPosition.position = 1540;
+			getCharacter(kCharacterAnna).characterPosition.location = 0;
+			takeItem(kItem3);
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 3;
+			AnnaCall(&LogicManager::CONS_Anna_DoBlockSeqOtis, "104A", 5, 56, 0);
+			break;
+		case 3:
+			getCharacter(kCharacterAnna).characterPosition.location = 1;
+			CONS_Anna_WaitAugust(0, 0, 0, 0);
+			break;
+		}
+	}
+}
+
+void LogicManager::CONS_Anna_WaitAugust(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_Anna_WaitAugust);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 29;
+
+	params->clear();
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_Anna_WaitAugust(HAND_PARAMS) {
+	if (msg->action > 12) {
+		switch (msg->action) {
+		case 17:
+			getCharacterCurrentParams(kCharacterAnna)[0] = checkCathDir(kCarRestaurant, 56);
+			break;
+		case 18:
+			if (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 1) {
+				if (_gameEvents[kEventAnnaGiveScarf] ||
+					_gameEvents[kEventAnnaGiveScarfDiner] ||
+					_gameEvents[kEventAnnaGiveScarfSalon] ||
+					_gameEvents[kEventAnnaGiveScarfMonogram] ||
+					_gameEvents[kEventAnnaGiveScarfDinerMonogram] ||
+					_gameEvents[kEventAnnaGiveScarfSalonMonogram]) {
+					playNIS(kEventAnnaGiveScarfSalonAsk);
+				} else {
+					if (_gameEvents[kEventAugustPresentAnna] || _gameEvents[kEventAugustPresentAnnaFirstIntroduction])
+						playNIS(kEventAnnaGiveScarfSalonMonogram);
+					else
+						playNIS(kEventAnnaGiveScarfSalon);
+					getCharacterCurrentParams(kCharacterAnna)[1] = 1;
+				}
+				getCharacter(kCharacterAnna).inventoryItem &= ~8;
+				bumpCath(kCarRestaurant, 51, 255);
+			} else if (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 2) {
+				if (_gameEvents[kEventAugustPresentAnna] || _gameEvents[kEventAugustPresentAnnaFirstIntroduction])
+					playNIS(kEventAnnaConversationGoodNight);
+				else
+					playNIS(kEventAnnaIntroductionRejected);
+
+				getCharacter(kCharacterAnna).inventoryItem &= ~0x80;
+				if (_gameProgress[kProgressJacket] == 2 &&
+					!_gameEvents[kEventAnnaGiveScarfAsk] &&
+					!_gameEvents[kEventAnnaGiveScarfDinerAsk] &&
+					!_gameEvents[kEventAnnaGiveScarfSalonAsk]) {
+					getCharacter(kCharacterAnna).inventoryItem |= kItemScarf;
+				}
+				bumpCath(kCarRestaurant, 51, 255);
+			}
+			break;
+		case 123712592:
+			getCharacter(kCharacterAnna).inventoryItem = 0;
+			CONS_Anna_FlirtAugust(0, 0, 0, 0);
+			break;
+		}
+		return;
+	}
+	if (msg->action == 12) {
+		getCharacter(kCharacterAnna).inventoryItem = 0;
+		if (_gameProgress[kProgressJacket] == 2 && !_gameEvents[15] && !_gameEvents[14])
+			getCharacter(kCharacterAnna).inventoryItem = 0x80;
+		if (_gameProgress[kProgressJacket] == 2 && !getCharacter(kCharacterAnna).inventoryItem && !_gameEvents[kEventAnnaGiveScarfAsk] && !_gameEvents[kEventAnnaGiveScarfDinerAsk] && !_gameEvents[kEventAnnaGiveScarfSalonAsk]) {
+			getCharacter(kCharacterAnna).inventoryItem = 8;
+		}
+		startCycOtis(kCharacterAnna, "104B");
+		return;
+	}
+	if (msg->action) {
+		if (msg->action == 1) {
+			if (msg->param.intParam == 8) {
+				getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
+				AnnaCall(&LogicManager::CONS_Anna_SaveGame, 2, kEventAnnaGiveScarf, 0, 0);
+			} else {
+				getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 2;
+				AnnaCall(&LogicManager::CONS_Anna_SaveGame, 2, kEventAnnaIntroductionRejected, 0, 0);
+			}
+		}
+		return;
+	}
+	if (getCharacterCurrentParams(kCharacterAnna)[1]) {
+		if (getCharacterCurrentParams(kCharacterAnna)[2] || (getCharacterCurrentParams(kCharacterAnna)[2] = _gameTime + 900, _gameTime != -900)) {
+			if (getCharacterCurrentParams(kCharacterAnna)[2] >= _gameTime)
+				goto LABEL_16;
+			getCharacterCurrentParams(kCharacterAnna)[2] = 0x7FFFFFFF;
+		}
+		getCharacter(kCharacterAnna).inventoryItem |= kItemScarf;
+		getCharacterCurrentParams(kCharacterAnna)[1] = 0;
+		getCharacterCurrentParams(kCharacterAnna)[2] = 0;
+	}
+LABEL_16:
+	if (getCharacterCurrentParams(kCharacterAnna)[0]) {
+		if (getCharacterCurrentParams(kCharacterAnna)[3] || (getCharacterCurrentParams(kCharacterAnna)[3] = _currentGameSessionTicks + 90, _currentGameSessionTicks != -90)) {
+			if (getCharacterCurrentParams(kCharacterAnna)[3] >= _currentGameSessionTicks)
+				return;
+			getCharacterCurrentParams(kCharacterAnna)[3] = 0x7FFFFFFF;
+		}
+		bumpCath(kCarRestaurant, 55, 255);
+	} else {
+		getCharacterCurrentParams(kCharacterAnna)[3] = 0;
+	}
+}
+
+void LogicManager::CONS_Anna_FlirtAugust(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_Anna_FlirtAugust);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 30;
+
+	params->clear();
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_Anna_FlirtAugust(HAND_PARAMS) {
+	switch (msg->action) {
+	case 0:
+		if (getCharacterCurrentParams(kCharacterAnna)[2] == 0x7FFFFFFF || !_gameTime)
+			goto LABEL_12;
+		if (_gameTime > 1188000)
+			goto LABEL_10;
+		if (!inSalon(kCharacterCath) || !getCharacterCurrentParams(kCharacterAnna)[2]) {
+			getCharacterCurrentParams(kCharacterAnna)[2] = _gameTime + 450;
+			if (_gameTime == -450)
+				goto LABEL_11;
+		}
+		if (getCharacterCurrentParams(kCharacterAnna)[2] < _gameTime) {
+		LABEL_10:
+			getCharacterCurrentParams(kCharacterAnna)[2] = 0x7FFFFFFF;
+		LABEL_11:
+			playDialog(kCharacterAnna, "AUG1004", -1, 0);
+		}
+	LABEL_12:
+		if (!getCharacterCurrentParams(kCharacterAnna)[1] || getCharacterCurrentParams(kCharacterAnna)[3] == 0x7FFFFFFF || _gameTime <= 1179000)
+			goto LABEL_22;
+		if (_gameTime > 1192500)
+			goto LABEL_20;
+		if (!inSalon(kCharacterCath) || !getCharacterCurrentParams(kCharacterAnna)[3]) {
+			getCharacterCurrentParams(kCharacterAnna)[3] = _gameTime + 150;
+			if (_gameTime == -150)
+				goto LABEL_21;
+		}
+		if (getCharacterCurrentParams(kCharacterAnna)[3] < _gameTime) {
+		LABEL_20:
+			getCharacterCurrentParams(kCharacterAnna)[3] = 0x7FFFFFFF;
+		LABEL_21:
+			CONS_Anna_LeaveAugust(0, 0, 0, 0);
+			return;
+		}
+	LABEL_22:
+		if (getCharacterCurrentParams(kCharacterAnna)[0]) {
+			if (getCharacterCurrentParams(kCharacterAnna)[4] || (getCharacterCurrentParams(kCharacterAnna)[4] = _currentGameSessionTicks + 90, _currentGameSessionTicks != -90)) {
+				if (getCharacterCurrentParams(kCharacterAnna)[4] >= _currentGameSessionTicks)
+					return;
+				getCharacterCurrentParams(kCharacterAnna)[4] = 0x7FFFFFFF;
+			}
+			bumpCath(kCarRestaurant, 55, 255);
+		} else {
+			getCharacterCurrentParams(kCharacterAnna)[4] = 0;
+		}
+		break;
+	case 2:
+		getCharacterCurrentParams(kCharacterAnna)[1] = 1;
+		return;
+	case 12:
+		send(kCharacterAnna, kCharacterAugust, 122358304, 0);
+		startCycOtis(kCharacterAnna, "106B");
+		return;
+	case 17:
+		getCharacterCurrentParams(kCharacterAnna)[0] = checkCathDir(kCarRestaurant, 56);
+		return;
+	default:
+		return;
+	}
+}
+
+void LogicManager::CONS_Anna_LeaveAugust(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_Anna_LeaveAugust);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 31;
+
+	params->clear();
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_Anna_LeaveAugust(HAND_PARAMS) {
+	if (msg->action == 12) {
+		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
+		AnnaCall(&LogicManager::CONS_Anna_WaitRCClear, 0, 0, 0, 0);
+	} else if (msg->action == 18) {
+		switch (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8]) {
+		case 1:
+			getCharacter(kCharacterAnna).characterPosition.location = 0;
+			playDialog(kCharacterAnna, "AUG1005", -1, 0);
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 2;
+			AnnaCall(&LogicManager::CONS_Anna_DoWaitReal, 0x96, 0, 0, 0);
+			break;
+		case 2:
+			blockView(kCharacterAnna, kCarRestaurant, 56);
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 3;
+			AnnaCall(&LogicManager::CONS_Anna_DoComplexSeqOtis, "106C1", "106C2", 2, 0);
+			break;
+		case 3:
+			releaseView(kCharacterAnna, kCarRestaurant, 56);
+			dropItem(kItem3, 1);
+			send(kCharacterAnna, kCharacterAugust, 159332865, 0);
+			CONS_Anna_ReturnComp(0, 0, 0, 0);
+			break;
+		}
+	}
+}
+
+void LogicManager::CONS_Anna_ReturnComp(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_Anna_ReturnComp);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 32;
+
+	params->clear();
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_Anna_ReturnComp(HAND_PARAMS) {
+	if (msg->action == 12) {
+		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
+		AnnaCall(&LogicManager::CONS_Anna_DoWalkP1, 4, 4070, 0, 0);
+	} else if (msg->action == 18) {
+		if (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 1) {
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 2;
+			AnnaCall(&LogicManager::CONS_Anna_DoCorrOtis, "618Af", 37, 0, 0);
+		} else if (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 2) {
+			endGraphics(kCharacterAnna);
+			getCharacter(kCharacterAnna).characterPosition.position = 4070;
+			getCharacter(kCharacterAnna).characterPosition.location = 1;
+			CONS_Anna_ReadyForBed(0, 0, 0, 0);
+		}
+	}
+}
+
+void LogicManager::CONS_Anna_ReadyForBed(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_Anna_ReadyForBed);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 33;
+
+	params->clear();
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_Anna_ReadyForBed(HAND_PARAMS) {
+	if (msg->action == 12) {
+		send(kCharacterAnna, kCharacterMax, 101687594, 0);
+		getCharacterCurrentParams(kCharacterAnna)[0] = _gameTime + 4500;
+		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
+		AnnaCall(&LogicManager::CONS_Anna_CompLogic, getCharacterCurrentParams(kCharacterAnna)[0], "NONE", 0, 0);
+	} else if (msg->action == 18 && getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 1) {
+		setModel(37, 1);
+		CONS_Anna_Asleep(0, 0, 0, 0);
+	}
+}
+
+void LogicManager::CONS_Anna_Asleep(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_Anna_Asleep);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 34;
+
+	params->clear();
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_Anna_Asleep(HAND_PARAMS) {
+	switch (msg->action) {
+	case 0:
+		if (getCharacterCurrentParams(kCharacterAnna)[0] || !checkCathDir(kCarRedSleeping, 60))
+			goto LABEL_18;
+		if (!getCharacterCurrentParams(kCharacterAnna)[1]) {
+			getCharacterCurrentParams(kCharacterAnna)[1] = _gameTime + 150;
+			if (_gameTime == -150)
+				goto LABEL_9;
+		}
+		if (getCharacterCurrentParams(kCharacterAnna)[1] < _gameTime) {
+			getCharacterCurrentParams(kCharacterAnna)[1] = 0x7FFFFFFF;
+		LABEL_9:
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
+			AnnaCall(&LogicManager::CONS_Anna_DoSeqOtis, "419B", 0, 0, 0);
+			return;
+		}
+	LABEL_18:
+		if (_gameTime > 1489500 && !getCharacterCurrentParams(kCharacterAnna)[2]) {
+			getCharacterCurrentParams(kCharacterAnna)[2] = 1;
+			CONS_Anna_WakeNight(0, 0, 0, 0);
+		}
+		break;
+	case 8:
+	case 9:
+		setDoor(37, kCharacterAnna, 1, 0, 0);
+		setDoor(53, kCharacterAnna, 1, 0, 0);
+		if (msg->action == 8) {
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 2;
+			AnnaCall(&LogicManager::CONS_Anna_DoDialog, "LIB012", 0, 0, 0);
+		} else {
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 3;
+			AnnaCall(&LogicManager::CONS_Anna_DoDialog, "LIB013", 0, 0, 0);
+		}
+		return;
+	case 12:
+		setDoor(37, kCharacterAnna, 1, 10, 9);
+		setDoor(53, kCharacterAnna, 1, 10, 9);
+		setDoor(45, kCharacterCath, 0, 255, 255);
+
+		if (checkCathDir(kCarRedSleeping, 78))
+			bumpCath(kCarRedSleeping, 49, 255);
+
+		getCharacter(kCharacterAnna).characterPosition.car = kCarRedSleeping;
+		getCharacter(kCharacterAnna).characterPosition.position = 4070;
+		getCharacter(kCharacterAnna).characterPosition.location = 0;
+		startCycOtis(kCharacterAnna, "419A");
+		return;
+	case 18:
+		switch (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8]) {
+		case 1:
+			startCycOtis(kCharacterAnna, "419C");
+			getCharacterCurrentParams(kCharacterAnna)[0] = 1;
+			goto LABEL_18;
+		case 2:
+		case 3:
+			if (whoRunningDialog(kCharacterMax))
+				goto LABEL_23;
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 4;
+			AnnaCall(&LogicManager::CONS_Anna_DoDialog, "MAX1120", 0, 0, 0);
+			break;
+		case 4:
+		LABEL_23:
+			setDoor(37, kCharacterAnna, 1, 10, 9);
+			setDoor(53, kCharacterAnna, 1, 10, 9);
+			break;
+		default:
+			return;
+		}
+		return;
+	default:
+		return;
+	}
+}
+
+void LogicManager::CONS_Anna_WakeNight(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_Anna_WakeNight);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 35;
+
+	params->clear();
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_Anna_WakeNight(HAND_PARAMS) {
+	if (msg->action > 9) {
+		if (msg->action > 18) {
+			if (msg->action == 226031488) {
+				if (whoRunningDialog(kCharacterAnna))
+					fadeDialog(kCharacterAnna);
+				send(kCharacterAnna, kCharacterMax, 71277948, 0);
+			} else if (msg->action == 238358920) {
+				getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 2;
+				AnnaCall(&LogicManager::CONS_Anna_DoCorrOtis, "608Cf", 37, 0, 0);
+			}
+		} else if (msg->action == 18) {
+			if (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 1) {
+				playNIS(kEventAnnaVisitToCompartmentGun);
+				playDialog(0, "LIB015", -1, 0);
+				getCharacter(kCharacterAnna).characterPosition.location = 0;
+				getCharacter(kCharacterAnna).characterPosition.position = 4840;
+				walk(kCharacterAnna, kCarRedSleeping, 8200);
+				bumpCathFDoor(37);
+				send(kCharacterAnna, kCharacterVassili, 339669520, 0);
+				send(kCharacterAnna, kCharacterTrainM, 339669520, 0);
+				send(kCharacterAnna, kCharacterCond2, 339669520, 0);
+				send(kCharacterAnna, kCharacterMax, 71277948, 0);
+				CONS_Anna_GoVassili(0, 0, 0, 0);
+			} else if (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 2) {
+				CONS_Anna_GoVassili(0, 0, 0, 0);
+			}
+		} else if (msg->action == 12) {
+			getCharacter(kCharacterAnna).clothes = 1;
+			getCharacterCurrentParams(kCharacterAnna)[0] = 1;
+		}
+	} else if (msg->action >= 8) {
+		if (whoRunningDialog(kCharacterAnna))
+			fadeDialog(kCharacterAnna);
+
+		if (msg->action == 8)
+			playDialog(0, "LIB012", -1, 0);
+
+		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
+		AnnaCall(&LogicManager::CONS_Anna_SaveGame, 2, kEventAnnaVisitToCompartmentGun, 0, 0);
+	} else if (msg->action) {
+		if (msg->action == 2) {
+			getCharacterCurrentParams(kCharacterAnna)[1]++;
+			if (getCharacterCurrentParams(kCharacterAnna)[1] > 3)
+				getCharacterCurrentParams(kCharacterAnna)[1] = 0;
+
+			getCharacterCurrentParams(kCharacterAnna)[0] = 1;
+		}
+	} else {
+		if (!getCharacterCurrentParams(kCharacterAnna)[0])
+			return;
+
+		if (getCharacterCurrentParams(kCharacterAnna)[2] || (getCharacterCurrentParams(kCharacterAnna)[2] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
+			if (getCharacterCurrentParams(kCharacterAnna)[2] >= _currentGameSessionTicks)
+				return;
+
+			getCharacterCurrentParams(kCharacterAnna)[2] = 0x7FFFFFFF;
+		}
+
+		switch (getCharacterCurrentParams(kCharacterAnna)[1]) {
+		case 0:
+			playDialog(kCharacterAnna, "ANN2135E", -1, 0);
+			break;
+		case 1:
+			playDialog(kCharacterAnna, "ANN2135F", -1, 0);
+			break;
+		case 2:
+			playDialog(kCharacterAnna, "ANN2135G", -1, 0);
+			break;
+		case 3:
+			playDialog(kCharacterAnna, "ANN2135D", -1, 0);
+			break;
+		default:
+			break;
+		}
+
+		getCharacterCurrentParams(kCharacterAnna)[2] = 0;
+		getCharacterCurrentParams(kCharacterAnna)[0] = 0;
+	}
+}
+
+void LogicManager::CONS_Anna_GoVassili(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_Anna_GoVassili);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 36;
+
+	params->clear();
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_Anna_GoVassili(HAND_PARAMS) {
+	if (msg->action == 12) {
+		setDoor(37, kCharacterCath, 1, 10, 9);
+		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
+		AnnaCall(&LogicManager::CONS_Anna_DoWalk, 4, 8200, 0, 0);
+	} else if (msg->action == 18) {
+		if (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 1) {
+			setDoor(32, kCharacterCath, 1, 255, 255);
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 2;
+			AnnaCall(&LogicManager::CONS_Anna_DoCorrOtis, "608Aa", 32, 0, 0);
+		} else if (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 2) {
+			setDoor(32, kCharacterCath, 2, 255, 255);
+			getCharacter(kCharacterAnna).characterPosition.location = 1;
+			endGraphics(kCharacterAnna);
+			CONS_Anna_AtSeizure(0, 0, 0, 0);
+		}
+	}
+}
+
+void LogicManager::CONS_Anna_AtSeizure(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_Anna_AtSeizure);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 37;
+
+	params->clear();
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_Anna_AtSeizure(HAND_PARAMS) {
+	if (msg->action == 12) {
+		getCharacter(kCharacterAnna).characterPosition.car = kCarRedSleeping;
+		getCharacter(kCharacterAnna).characterPosition.position = 8200;
+		getCharacter(kCharacterAnna).characterPosition.location = 0;
+	} else if (msg->action == 191477936) {
+		CONS_Anna_SpeakTatiana(0, 0, 0, 0);
+	}
+}
+
+void LogicManager::CONS_Anna_SpeakTatiana(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_Anna_SpeakTatiana);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 38;
+
+	params->clear();
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_Anna_SpeakTatiana(HAND_PARAMS) {
+	if (msg->action == 12) {
+		getCharacter(kCharacterAnna).characterPosition.position = 7500;
+		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
+		AnnaCall(&LogicManager::CONS_Anna_DoDialog, "ANN1010", 0, 0, 0);
+	} else if (msg->action == 18 && getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 1) {
+		playDialog(0, "MUS043", -1, 0);
+		CONS_Anna_LeaveTatiana(0, 0, 0, 0);
+	}
+}
+
+void LogicManager::CONS_Anna_DoWalk1019(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_Anna_DoWalk1019);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 39;
+
+	params->clear();
+
+	params->parameters[0] = param1.intParam;
+	params->parameters[1] = param2.intParam;
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_Anna_DoWalk1019(HAND_PARAMS) {
+	switch (msg->action) {
+	case 0:
+		if (walk(kCharacterAnna, getCharacterCurrentParams(kCharacterAnna)[0], getCharacterCurrentParams(kCharacterAnna)[1]))
+			goto LABEL_4;
+		break;
+	case 1:
+		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
+		AnnaCall(&LogicManager::CONS_Anna_SaveGame, 2, kEventAnnaGoodNight, 0, 0);
+		break;
+	case 6:
+		playDialog(kCharacterAnna, "ANN1107A", -1, 0);
+		break;
+	case 12:
+		getCharacter(kCharacterAnna).inventoryItem = 0;
+		if (!_gameEvents[kEventAnnaGoodNight] && !_gameEvents[kEventAnnaGoodNightInverse])
+			getCharacter(kCharacterAnna).inventoryItem = 0x80;
+		if (walk(kCharacterAnna, getCharacterCurrentParams(kCharacterAnna)[0], getCharacterCurrentParams(kCharacterAnna)[1])) {
+		LABEL_4:
+			getCharacter(kCharacterAnna).inventoryItem = 0;
+
+			getCharacter(kCharacterAnna).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterAnna, _functionsAnna[getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall]]);
+			fedEx(kCharacterAnna, kCharacterAnna, 18, 0);
+		}
+		break;
+	case 18:
+		if (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 1) {
+			playNIS((kEventAnnaGoodNightInverse - (getCharacter(kCharacterAnna).direction == 1)));
+			getCharacter(kCharacterAnna).inventoryItem = 0;
+			if (getCharacter(kCharacterAnna).direction == 1)
+				bumpCathFx(getCharacter(kCharacterAnna).characterPosition.car, getCharacter(kCharacterAnna).characterPosition.position - 750);
+			else
+				bumpCathRx(getCharacter(kCharacterAnna).characterPosition.car, getCharacter(kCharacterAnna).characterPosition.position + 750);
+		}
+		break;
+	default:
+		return;
+	}
+}
+
+void LogicManager::CONS_Anna_LeaveTatiana(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_Anna_LeaveTatiana);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 40;
+
+	params->clear();
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_Anna_LeaveTatiana(HAND_PARAMS) {
+	if (msg->action == 12) {
+		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
+		AnnaCall(&LogicManager::CONS_Anna_DoCorrOtis, "608Cb", 0x21, 0, 0);
+	} else if (msg->action == 18) {
+		switch (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8]) {
+		case 1:
+			getCharacter(kCharacterAnna).characterPosition.location = 0;
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 2;
+			AnnaCall(&LogicManager::CONS_Anna_DoWalk1019, 4, 4070, 0, 0);
+			break;
+		case 2:
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 3;
+			AnnaCall(&LogicManager::CONS_Anna_DoCorrOtis, "608Bf", 37, 0, 0);
+			break;
+		case 3:
+			endGraphics(kCharacterAnna);
+			getCharacter(kCharacterAnna).characterPosition.location = 1;
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 4;
+			AnnaCall(&LogicManager::CONS_Anna_DoWait, 150, 0, 0, 0);
+			break;
+		case 4:
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 5;
+			AnnaCall(&LogicManager::CONS_Anna_DoCorrOtis, "608Cf", 37, 0, 0);
+			break;
+		case 5:
+			getCharacter(kCharacterAnna).characterPosition.location = 0;
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 6;
+			AnnaCall(&LogicManager::CONS_Anna_DoWalk1019, 4, 7500, 0, 0);
+			break;
+		case 6:
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 7;
+			AnnaCall(&LogicManager::CONS_Anna_DoCorrOtis, "608Bb", 33, 0, 0);
+			break;
+		case 7:
+			endGraphics(kCharacterAnna);
+			getCharacter(kCharacterAnna).characterPosition.location = 1;
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 8;
+			AnnaCall(&LogicManager::CONS_Anna_DoWait, 150, 0, 0, 0);
+			break;
+		case 8:
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 9;
+			AnnaCall(&LogicManager::CONS_Anna_DoCorrOtis, "608Cb", 33, 0, 0);
+			break;
+		case 9:
+			getCharacter(kCharacterAnna).characterPosition.location = 0;
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 10;
+			AnnaCall(&LogicManager::CONS_Anna_DoWalk1019, 4, 4070, 0, 0);
+			break;
+		case 10:
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 11;
+			AnnaCall(&LogicManager::CONS_Anna_DoCorrOtis, "608Bf", 37, 0, 0);
+			break;
+		case 11:
+			endGraphics(kCharacterAnna);
+			getCharacter(kCharacterAnna).characterPosition.location = 1;
+			getCharacter(kCharacterAnna).characterPosition.position = 4070;
+			CONS_Anna_GoBackToSleep(0, 0, 0, 0);
+			break;
+		default:
+			return;
+		}
+	}
+}
+
+void LogicManager::CONS_Anna_GoBackToSleep(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_Anna_GoBackToSleep);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 41;
+
+	params->clear();
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_Anna_GoBackToSleep(HAND_PARAMS) {
+	switch (msg->action) {
+	case 0:
+		if (getCharacterCurrentParams(kCharacterAnna)[1] || (getCharacterCurrentParams(kCharacterAnna)[1] = _gameTime + 2700, _gameTime != -2700)) {
+			if (getCharacterCurrentParams(kCharacterAnna)[1] >= _gameTime)
+				return;
+
+			getCharacterCurrentParams(kCharacterAnna)[1] = 0x7FFFFFFF;
+		}
+
+		getCharacterCurrentParams(kCharacterAnna)[0]++;
+		switch (getCharacterCurrentParams(kCharacterAnna)[0]) {
+		case 1:
+			startCycOtis(kCharacterAnna, "419A");
+			break;
+		case 2:
+			startCycOtis(kCharacterAnna, "419B");
+			break;
+		case 3:
+			startCycOtis(kCharacterAnna, "419C");
+			getCharacterCurrentParams(kCharacterAnna)[0] = 0;
+			break;
+		}
+		getCharacterCurrentParams(kCharacterAnna)[1] = 0;
+		return;
+	case 8:
+	case 9:
+		setDoor(37, kCharacterAnna, 1, 0, 0);
+		setDoor(53, kCharacterAnna, 1, 0, 0);
+		if (msg->action == 8) {
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
+			AnnaCall(&LogicManager::CONS_Anna_DoDialog, "LIB012", 0, 0, 0);
+		} else {
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 2;
+			AnnaCall(&LogicManager::CONS_Anna_DoDialog, "LIB013", 0, 0, 0);
+		}
+		return;
+	case 12:
+		send(kCharacterAnna, kCharacterMax, 101687594, 0);
+		setDoor(37, kCharacterAnna, 1, 10, 9);
+		setDoor(53, kCharacterAnna, 1, 10, 9);
+		startCycOtis(kCharacterAnna, "419C");
+		return;
+	case 18:
+		if (!getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8])
+			return;
+		if (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] <= 2) {
+			if (!whoRunningDialog(kCharacterMax)) {
+				getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 3;
+				AnnaCall(&LogicManager::CONS_Anna_DoDialog, "MAX1120", 0, 0, 0);
+				return;
+			}
+		} else if (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] != 3) {
+			return;
+		}
+		setDoor(37, kCharacterAnna, 1, 10, 9);
+		setDoor(53, kCharacterAnna, 1, 10, 9);
+		break;
+	default:
+		return;
+	}
+}
+
+void LogicManager::CONS_Anna_StartPart2(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_Anna_StartPart2);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 42;
+
+	params->clear();
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_Anna_StartPart2(HAND_PARAMS) {
+	if (msg->action) {
+		if (msg->action == 12) {
+			endGraphics(kCharacterAnna);
+			getCharacter(kCharacterAnna).characterPosition.car = kCarRedSleeping;
+			getCharacter(kCharacterAnna).characterPosition.position = 4070;
+			getCharacter(kCharacterAnna).characterPosition.location = 1;
+			getCharacter(kCharacterAnna).inventoryItem = kItemNone;
+			getCharacter(kCharacterAnna).clothes = 1;
+		}
+	} else {
+		CONS_Anna_InPart2(0, 0, 0, 0);
+	}
+}
+
+void LogicManager::CONS_Anna_InPart2(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_Anna_InPart2);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 43;
+
+	params->clear();
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_Anna_InPart2(HAND_PARAMS) {
+	if (msg->action == 12) {
+		setDoor(45, kCharacterCath, 0, 255, 255);
+		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
+		AnnaCall(&LogicManager::CONS_Anna_PracticeMusic, 0, 0, 0, 0);
+	} else if (msg->action == 18) {
+		switch (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8]) {
+		case 1:
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 2;
+			AnnaCall(&LogicManager::CONS_Anna_CompLogic, 1786500, "418C", 0, 0);
+			break;
+		case 2:
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 3;
+			AnnaCall(&LogicManager::CONS_Anna_PracticeMusic, 0, 0, 0, 0);
+			break;
+		case 3:
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 4;
+			AnnaCall(&LogicManager::CONS_Anna_CompLogic, 1818000, "418C", 0, 0);
+			break;
+		case 4:
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 5;
+			AnnaCall(&LogicManager::CONS_Anna_PracticeMusic, 0, 0, 0, 0);
+			break;
+		case 5:
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 6;
+			AnnaCall(&LogicManager::CONS_Anna_CompLogic, 15803100, "418C", 0, 0);
+			break;
+		default:
+			return;
+		}
+	}
+}
+
+void LogicManager::CONS_Anna_StartPart3(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_Anna_StartPart3);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 44;
+
+	params->clear();
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_Anna_StartPart3(HAND_PARAMS) {
+	if (msg->action) {
+		if (msg->action == 12) {
+			endGraphics(kCharacterAnna);
+			getCharacter(kCharacterAnna).characterPosition.car = kCarRedSleeping;
+			getCharacter(kCharacterAnna).characterPosition.position = 4070;
+			getCharacter(kCharacterAnna).characterPosition.location = 1;
+			getCharacter(kCharacterAnna).clothes = 3;
+			getCharacter(kCharacterAnna).inventoryItem = 0;
+			setDoor(37, kCharacterCath, 1, 10, 9);
+			setDoor(45, kCharacterCath, 0, 255, 255);
+			setDoor(53, kCharacterCath, 1, 10, 9);
+		}
+	} else {
+		CONS_Anna_Practicing(0, 0, 0, 0);
+	}
+}
+
+void LogicManager::CONS_Anna_ExitComp(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_Anna_ExitComp);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 45;
+
+	params->clear();
+
+	params->parameters[0] = param1.intParam;
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_Anna_ExitComp(HAND_PARAMS) {
+	switch (msg->action) {
+	case 12:
+		getCharacter(kCharacterAnna).characterPosition.location = 0;
+		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
+		AnnaCall(&LogicManager::CONS_Anna_DoCorrOtis, "625Bf", 37, 0, 0);
+		break;
+	case 18:
+		if (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 1) {
+			if (getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall].parameters[0])
+				send(kCharacterAnna, kCharacterCond2, 185737168, 0);
+			else
+				send(kCharacterAnna, kCharacterCond2, 185671840, 0);
+			playDialog(kCharacterAnna, "Ann3147", -1, 0);
+			startCycOtis(kCharacterAnna, "625EF");
+			softBlockAtDoor(kCharacterAnna, 37);
+		} else if (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 2) {
+			softReleaseAtDoor(kCharacterAnna, 37);
+
+			getCharacter(kCharacterAnna).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterAnna, _functionsAnna[getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall]]);
+			fedEx(kCharacterAnna, kCharacterAnna, 18, 0);
+		}
+		break;
+	case 157894320:
+		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 2;
+		AnnaCall(&LogicManager::CONS_Anna_DoWait, 75, 0, 0, 0);
+		break;
+	}
+}
+
+void LogicManager::CONS_Anna_Practicing(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_Anna_Practicing);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 46;
+
+	params->clear();
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_Anna_Practicing(HAND_PARAMS) {
+	if (msg->action == 12) {
+		if (checkCathDir(kCarRedSleeping, 60))
+			bumpCath(kCarRedSleeping, 49, 255);
+		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
+		AnnaCall(&LogicManager::CONS_Anna_PracticeMusic, 0, 0, 0, 0);
+	} else if (msg->action == 18) {
+		if (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 1 ||
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 2) {
+			if (getCharacterParams(kCharacterAnna, 8)[0]) {
+				CONS_Anna_GoLunch(0, 0, 0, 0);
+			} else {
+				getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 2;
+				AnnaCall(&LogicManager::CONS_Anna_CompLogic, _gameTime + 4500, "418C", 0, 0);
+			}
+		}
+	}
+}
+
+void LogicManager::CONS_Anna_GoLunch(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_Anna_GoLunch);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 47;
+
+	params->clear();
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_Anna_GoLunch(HAND_PARAMS) {
+	if (msg->action == 12) {
+		setDoor(37, kCharacterCath, 1, 10, 9);
+		setDoor(53, kCharacterCath, 1, 10, 9);
+		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
+		AnnaCall(&LogicManager::CONS_Anna_DoCorrOtis, "688Bf", 0x25, 0, 0);
+	} else if (msg->action == 18) {
+		switch (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8]) {
+		case 1:
+			getCharacter(kCharacterAnna).characterPosition.location = 0;
+			send(kCharacterAnna, kCharacterMax, 71277948, 0);
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 2;
+			AnnaCall(&LogicManager::CONS_Anna_DoWalk, 5, 850, 0, 0);
+			break;
+		case 2:
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 3;
+			AnnaCall(&LogicManager::CONS_Anna_WaitRCClear, 0, 0, 0, 0);
+			break;
+		case 3:
+			getCharacter(kCharacterAnna).characterPosition.position = 1540;
+			getCharacter(kCharacterAnna).characterPosition.location = 0;
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 4;
+			AnnaCall(&LogicManager::CONS_Anna_DoSeqOtis, "801VS", 0, 0, 0);
+			break;
+		case 4:
+			if (!_gameEvents[kEventAugustLunch]) {
+				playDialog(kCharacterAnna, "Ann3136A", -1, 30);
+			} else {
+				playDialog(kCharacterAnna, "Ann3136", -1, 30);
+			}
+
+			send(kCharacterAnna, kCharacterAugust, 122358304, 0);
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 5;
+			AnnaCall(&LogicManager::CONS_Anna_DoComplexSeqOtis, "026B1", "026B2", 2, 0);
+			break;
+		case 5:
+			startCycOtis(kCharacterAugust, "BLANK");
+			CONS_Anna_Lunch(0, 0, 0, 0);
+			break;
+		default:
+			return;
+		}
+	}
+}
+
+void LogicManager::CONS_Anna_Lunch(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_Anna_Lunch);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 48;
+
+	params->clear();
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_Anna_Lunch(HAND_PARAMS) {
+	if (msg->action > 12) {
+		switch (msg->action) {
+		case 18:
+			switch (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8]) {
+			case 1:
+				getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 2;
+				AnnaCall(&LogicManager::CONS_Anna_DoDialog, "Ann3137B", 0, 0, 0);
+				break;
+			case 2:
+				send(kCharacterAnna, kCharacterWaiter1, 218983616, 0);
+				break;
+			case 3:
+				getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 4;
+				AnnaCall(&LogicManager::CONS_Anna_DoDialog, "Aug3006A", 0, 0, 0);
+				break;
+			case 4:
+				goto LABEL_29;
+			case 5:
+				getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 6;
+				AnnaCall(&LogicManager::CONS_Anna_DoWait, 900, 0, 0, 0);
+				break;
+			case 6:
+				getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 7;
+				AnnaCall(&LogicManager::CONS_Anna_DoDialog, "Aug3006", 0, 0, 0);
+				break;
+			case 7:
+				getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 8;
+				AnnaCall(&LogicManager::CONS_Anna_DoWait, 2700, 0, 0, 0);
+				break;
+			case 8:
+				startCycOtis(kCharacterAnna, "026H");
+				getCharacterCurrentParams(kCharacterAnna)[0] = 1;
+				break;
+			default:
+				return;
+			}
+			break;
+		case 122288808:
+			startCycOtis(kCharacterAnna, "026C");
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 5;
+			AnnaCall(&LogicManager::CONS_Anna_DoDialog, "Ann3138A", 0, 0, 0);
+			break;
+		case 122358304:
+			startCycOtis(kCharacterAnna, "BLANK");
+			break;
+		}
+	} else {
+		if (msg->action == 12) {
+			startCycOtis(kCharacterAnna, "026c");
+			getCharacter(kCharacterAnna).characterPosition.location = 1;
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
+			AnnaCall(&LogicManager::CONS_Anna_DoWait, 450, 0, 0, 0);
+			return;
+		}
+		if (msg->action == 0 && getCharacterCurrentParams(kCharacterAnna)[0]) {
+			if (getCharacterCurrentParams(kCharacterAnna)[2] != 0x7FFFFFFF && _gameTime > 1969200) {
+				if (_gameTime > 1983600)
+					goto LABEL_18;
+
+				if (!inDiningRoom(kCharacterCath) || whoRunningDialog(kCharacterMonsieur) || !getCharacterCurrentParams(kCharacterAnna)[2]) {
+					getCharacterCurrentParams(kCharacterAnna)[2] = _gameTime + 150;
+					if (_gameTime == -150)
+						goto LABEL_19;
+				}
+				if (getCharacterCurrentParams(kCharacterAnna)[2] < _gameTime) {
+				LABEL_18:
+					getCharacterCurrentParams(kCharacterAnna)[2] = 0x7FFFFFFF;
+				LABEL_19:
+					getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 3;
+					AnnaCall(&LogicManager::CONS_Anna_DoDialog, "Aug3007A", 0, 0, 0);
+					return;
+				}
+			}
+		LABEL_29:
+			if (getCharacterParams(kCharacterAnna, 8)[1]) {
+				if (!getCharacterCurrentParams(kCharacterAnna)[1])
+					getCharacterCurrentParams(kCharacterAnna)[1] = _gameTime + 4500;
+
+				if (getCharacterCurrentParams(kCharacterAnna)[3] != 0x7FFFFFFF && _gameTime) {
+					if (getCharacterCurrentParams(kCharacterAnna)[1] >= _gameTime) {
+						if (!inDiningRoom(kCharacterCath) || !getCharacterCurrentParams(kCharacterAnna)[3]) {
+							getCharacterCurrentParams(kCharacterAnna)[3] = _gameTime + 450;
+							if (_gameTime == -450)
+								goto LABEL_40;
+						}
+
+						if (getCharacterCurrentParams(kCharacterAnna)[3] >= _gameTime)
+							return;
+					}
+
+					getCharacterCurrentParams(kCharacterAnna)[3] = 0x7FFFFFFF;
+				LABEL_40:
+					CONS_Anna_LeaveLunch(0, 0, 0, 0);
+				}
+			}
+		}
+	}
+}
+
+void LogicManager::CONS_Anna_DoOtis5026J(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_Anna_DoOtis5026J);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 49;
+
+	params->clear();
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_Anna_DoOtis5026J(HAND_PARAMS) {
+	if (msg->action == 3) {
+		send(kCharacterAnna, kCharacterTableD, 103798704, "010M");
+		endGraphics(kCharacterAugust);
+
+		getCharacter(kCharacterAnna).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterAnna, _functionsAnna[getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall]]);
+		fedEx(kCharacterAnna, kCharacterAnna, 18, 0);
+	} else if (msg->action == 12) {
+		startSeqOtis(kCharacterTableD, "026J3");
+		startSeqOtis(kCharacterAugust, "026J2");
+		startSeqOtis(kCharacterAnna, "026J1");
+	}
+}
+
+void LogicManager::CONS_Anna_LeaveLunch(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_Anna_LeaveLunch);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 50;
+
+	params->clear();
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_Anna_LeaveLunch(HAND_PARAMS) {
+	if (msg->action == 12) {
+		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
+		AnnaCall(&LogicManager::CONS_Anna_DoDialog, "Ann3141", 0, 0, 0);
+	} else if (msg->action == 18) {
+		switch (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8]) {
+		case 1:
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 2;
+			AnnaCall(&LogicManager::CONS_Anna_WaitRCClear, 0, 0, 0, 0);
+			break;
+		case 2:
+			getCharacter(kCharacterAnna).characterPosition.location = 0;
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 3;
+			AnnaCall(&LogicManager::CONS_Anna_DoOtis5026J, 0, 0, 0, 0);
+			break;
+		case 3:
+			CONS_Anna_AfterLunch(0, 0, 0, 0);
+			break;
+		}
+	}
+}
+
+void LogicManager::CONS_Anna_AfterLunch(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_Anna_AfterLunch);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 51;
+
+	params->clear();
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_Anna_AfterLunch(HAND_PARAMS) {
+	if (msg->action > 12) {
+		if (msg->action > 101169422) {
+			if (msg->action == 122288808) {
+				startCycOtis(kCharacterAnna, "112D");
+				send(kCharacterAnna, kCharacterKronos, 157159392, 0);
+			} else if (msg->action == 122358304) {
+				startCycOtis(kCharacterAnna, "BLANK");
+			}
+		} else if (msg->action == 101169422) {
+			if (_gameEvents[kEventKronosVisit]) {
+				getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 3;
+				AnnaCall(&LogicManager::CONS_Anna_DoBlockSeqOtis, "112J", 5, 0x39, 0);
+			} else {
+			LABEL_22:
+				if (_gameTime >= 2047500) {
+				LABEL_28:
+					getCharacterCurrentParams(kCharacterAnna)[0] = 1;
+				} else {
+					getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 4;
+					AnnaCall(&LogicManager::CONS_Anna_DoDialog, "Ann3142A", 0, 0, 0);
+				}
+			}
+		} else if (msg->action == 18) {
+			switch (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8]) {
+			case 1:
+				getCharacter(kCharacterAnna).characterPosition.location = 1;
+				startCycOtis(kCharacterAnna, "112B");
+				releaseView(kCharacterAnna, kCarRestaurant, 57);
+				send(kCharacterAnna, kCharacterWaiter2, 219377792, 0);
+				break;
+			case 2:
+				send(kCharacterAnna, kCharacterAugust, 122288808, 0);
+				CONS_Anna_ReturnComp3(0, 0, 0, 0);
+				break;
+			case 3:
+				startCycOtis(kCharacterAnna, "112D");
+				goto LABEL_22;
+			case 4:
+				getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 5;
+				AnnaCall(&LogicManager::CONS_Anna_DoWait, 1800, 0, 0, 0);
+				break;
+			case 5:
+				getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 6;
+				AnnaCall(&LogicManager::CONS_Anna_DoDialog, "Aug3007", 0, 0, 0);
+				break;
+			case 6:
+				goto LABEL_28;
+			default:
+				return;
+			}
+		}
+	} else if (msg->action == 12) {
+		playDialog(kCharacterAnna, "Ann3142", -1, 30);
+		blockView(1, 5, 57);
+		startSeqOtis(kCharacterAnna, "112A");
+		if (inDiningRoom(kCharacterCath))
+			advanceFrame(kCharacterAnna);
+		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
+		AnnaCall(&LogicManager::CONS_Anna_FinishSeqOtis, 0, 0, 0, 0);
+	} else if (msg->action == 0 && getCharacterCurrentParams(kCharacterAnna)[0]) {
+		if (rcClear()) {
+			playDialog(kCharacterAnna, "Aug3008", -1, 0);
+			getCharacter(kCharacterAnna).characterPosition.location = 0;
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 2;
+			AnnaCall(&LogicManager::CONS_Anna_DoComplexSeqOtis, "112E1", "112E2", 2, 0);
+		}
+	}
+}
+
+void LogicManager::CONS_Anna_ReturnComp3(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_Anna_ReturnComp3);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 52;
+
+	params->clear();
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_Anna_ReturnComp3(HAND_PARAMS) {
+	if (msg->action == 3) {
+		releaseAtDoor(kCharacterAnna, 37);
+		getCharacter(kCharacterAnna).characterPosition.position = 4070;
+		getCharacter(kCharacterAnna).characterPosition.location = 1;
+		endGraphics(kCharacterAnna);
+		CONS_Anna_Dressing(0, 0, 0, 0);
+	} else if (msg->action == 12) {
+		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
+		AnnaCall(&LogicManager::CONS_Anna_DoWalk, 4, 4070, 0, 0);
+	} else if (msg->action == 18 && getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 1) {
+		startSeqOtis(kCharacterAnna, "688Af");
+		blockAtDoor(kCharacterAnna, 37);
+		getCharacter(kCharacterAnna).characterPosition.location = 1;
+		if (inComp(kCharacterCath, kCarRedSleeping, 4070) || inComp(kCharacterCath, kCarRedSleeping, 4455)) {
+			if (isNight()) {
+				playNIS(kEventCathTurningNight);
+			} else {
+				playNIS(kEventCathTurningDay);
+			}
+			
+			playDialog(0, "BUMP", -1, 0);
+			bumpCathRDoor(37);
+		}
+	}
+}
+
+void LogicManager::CONS_Anna_Dressing(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_Anna_Dressing);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 53;
+
+	params->clear();
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_Anna_Dressing(HAND_PARAMS) {
+	bool tmp;
+
+	switch (msg->action) {
+	case 0:
+		if (!_gameProgress[kProgressField48] || getCharacterCurrentParams(kCharacterAnna)[4] == 0x7FFFFFFF || !_gameTime)
+			goto LABEL_13;
+
+		if (_gameTime > 2065500)
+			goto LABEL_11;
+
+		if (!cathInCorridor(kCarRedSleeping) || !getCharacterCurrentParams(kCharacterAnna)[4]) {
+			getCharacterCurrentParams(kCharacterAnna)[4] = _gameTime + 150;
+			if (_gameTime == -150)
+				goto LABEL_12;
+		}
+		if (getCharacterCurrentParams(kCharacterAnna)[4] < _gameTime) {
+		LABEL_11:
+			getCharacterCurrentParams(kCharacterAnna)[4] = 0x7FFFFFFF;
+		LABEL_12:
+			CONS_Anna_GiveMaxToCond2(0, 0, 0, 0);
+			return;
+		}
+	LABEL_13:
+		if (!getCharacterCurrentParams(kCharacterAnna)[2])
+			goto LABEL_21;
+
+		if (!getCharacterCurrentParams(kCharacterAnna)[5]) {
+			getCharacterCurrentParams(kCharacterAnna)[5] = _gameTime + 9000;
+			if (_gameTime == -9000)
+				goto LABEL_18;
+		}
+
+		if (getCharacterCurrentParams(kCharacterAnna)[5] < _gameTime) {
+			getCharacterCurrentParams(kCharacterAnna)[5] = 0x7FFFFFFF;
+		LABEL_18:
+			tmp = getCharacterCurrentParams(kCharacterAnna)[3] == 0;
+
+			getCharacterCurrentParams(kCharacterAnna)[3] = tmp ? 1 : 0;
+
+			if (!tmp) {
+				startCycOtis(kCharacterAnna, "417B");
+			} else {
+				startCycOtis(kCharacterAnna, "417A");
+			}
+
+			getCharacterCurrentParams(kCharacterAnna)[5] = 0;
+		}
+	LABEL_21:
+		if (getCharacterCurrentParams(kCharacterAnna)[0]) {
+			if (getCharacterCurrentParams(kCharacterAnna)[6] || (getCharacterCurrentParams(kCharacterAnna)[6] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
+				if (getCharacterCurrentParams(kCharacterAnna)[6] >= _currentGameSessionTicks)
+					return;
+
+				getCharacterCurrentParams(kCharacterAnna)[6] = 0x7FFFFFFF;
+			}
+
+			getCharacterCurrentParams(kCharacterAnna)[0] = 0;
+			getCharacterCurrentParams(kCharacterAnna)[1] = 1;
+
+			setDoor(37, kCharacterAnna, 1, 0, !inComp(kCharacterMax, kCarRedSleeping, 4070) ? 0 : 9);
+			setDoor(53, kCharacterAnna, 1, 0, !inComp(kCharacterMax, kCarRedSleeping, 4070) ? 0 : 9);
+			getCharacterCurrentParams(kCharacterAnna)[6] = 0;
+		} else {
+			getCharacterCurrentParams(kCharacterAnna)[6] = 0;
+		}
+		break;
+	case 8:
+		goto LABEL_50;
+	case 9:
+		if (inComp(kCharacterMax, kCarRedSleeping, 4070)) {
+			setDoor(37, kCharacterAnna, 1, 0, 0);
+			setDoor(53, kCharacterAnna, 1, 0, 0);
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
+			AnnaCall(&LogicManager::CONS_Anna_DoDialog, "LIB013", 0, 0, 0);
+		} else {
+		LABEL_50:
+			if (getCharacterCurrentParams(kCharacterAnna)[0]) {
+				setDoor(37, kCharacterAnna, 1, 0, 0);
+				setDoor(53, kCharacterAnna, 1, 0, 0);
+
+				if (msg->param.intParam == 53) {
+					getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 6;
+					AnnaCall(&LogicManager::CONS_Anna_DoDialog, getCathWCDialog(), 0, 0, 0);
+				} else if (cathHasItem(kItemPassengerList)) {
+					getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 7;
+
+					if (rnd(2)) {
+						AnnaCall(&LogicManager::CONS_Anna_DoDialog, getCathSorryDialog(), 0, 0, 0);
+					} else {
+						if (rnd(2) == 0) {
+							AnnaCall(&LogicManager::CONS_Anna_DoDialog, "CAT1506A", 0, 0, 0);
+						} else {
+							AnnaCall(&LogicManager::CONS_Anna_DoDialog, "CAT1506", 0, 0, 0);
+						}
+					}
+						
+				} else {
+					getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 8;
+					AnnaCall(&LogicManager::CONS_Anna_DoDialog, getCathSorryDialog(), 0, 0, 0);
+				}
+			} else {
+				setDoor(37, kCharacterAnna, 1, 0, 0);
+				setDoor(53, kCharacterAnna, 1, 0, 0);
+				if (msg->action == 8) {
+					getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 3;
+					AnnaCall(&LogicManager::CONS_Anna_DoDialog, "LIB012", 0, 0, 0);
+				} else {
+					getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 4;
+					AnnaCall(&LogicManager::CONS_Anna_DoDialog, "LIB013", 0, 0, 0);
+				}
+			}
+		}
+		return;
+	case 12:
+		send(kCharacterAnna, kCharacterMax, 101687594, 0);
+		setDoor(37, kCharacterAnna, 1, 10, 9);
+		setDoor(53, kCharacterAnna, 1, 10, 9);
+		getCharacter(kCharacterAnna).clothes = 2;
+		return;
+	case 17:
+		if (getCharacterCurrentParams(kCharacterAnna)[1] || getCharacterCurrentParams(kCharacterAnna)[0]) {
+			setDoor(37, kCharacterAnna, 1, 10, 9);
+			setDoor(53, kCharacterAnna, 1, 10, 9);
+			getCharacterCurrentParams(kCharacterAnna)[1] = 0;
+			getCharacterCurrentParams(kCharacterAnna)[0] = 0;
+		}
+
+		if (!getCharacterCurrentParams(kCharacterAnna)[2] && (checkCathDir(kCarRedSleeping, 60) || _gameTime > 0x1F0950)) {
+			getCharacterCurrentParams(kCharacterAnna)[2] = 1;
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 9;
+			AnnaCall(&LogicManager::CONS_Anna_DoSeqOtis, "416", 0, 0, 0);
+		}
+
+		return;
+	case 18:
+		switch (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8]) {
+		case 1:
+			if (whoRunningDialog(kCharacterMax))
+				goto LABEL_49;
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 2;
+			AnnaCall(&LogicManager::CONS_Anna_DoDialog, "MAX1120", 0, 0, 0);
+			break;
+		case 2:
+		LABEL_49:
+			setDoor(37, kCharacterAnna, 1, 10, 9);
+			setDoor(53, kCharacterAnna, 1, 10, 9);
+			break;
+		case 3:
+		case 4:
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 5;
+			AnnaCall(&LogicManager::CONS_Anna_DoDialog, "ANN1016", 0, 0, 0);
+			break;
+		case 5:
+			setDoor(37, kCharacterAnna, 1, 14, 0);
+			setDoor(53, kCharacterAnna, 1, 14, 0);
+			getCharacterCurrentParams(kCharacterAnna)[0] = 1;
+			break;
+		case 6:
+		case 7:
+		case 8:
+			if (inComp(kCharacterMax, kCarRedSleeping, 4070)) {
+				setDoor(37, kCharacterAnna, 1, 0, 9);
+				setDoor(53, kCharacterAnna, 1, 0, 9);
+			}
+			getCharacterCurrentParams(kCharacterAnna)[0] = 0;
+			getCharacterCurrentParams(kCharacterAnna)[1] = 1;
+			break;
+		case 9:
+			if (checkCathDir(kCarRedSleeping, 60))
+				bumpCath(kCarRedSleeping, 78, 255);
+			startCycOtis(kCharacterAnna, "417B");
+			break;
+		default:
+			return;
+		}
+		return;
+	default:
+		return;
+	}
+}
+
+void LogicManager::CONS_Anna_GiveMaxToCond2(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_Anna_GiveMaxToCond2);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 54;
+
+	params->clear();
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_Anna_GiveMaxToCond2(HAND_PARAMS) {
+	bool tmp;
+
+	if (msg->action > 8) {
+		if (msg->action > 12) {
+			if (msg->action > 123733488) {
+				if (msg->action == 156049968) {
+					startCycOtis(kCharacterAnna, "629DF");
+					softBlockAtDoor(kCharacterAnna, 37);
+				} else if (msg->action == 253868128) {
+					setDoor(53, kCharacterAnna, 1, 0, 0);
+				}
+			} else {
+				switch (msg->action) {
+				case 123733488:
+					getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 9;
+					AnnaCall(&LogicManager::CONS_Anna_DoCorrOtis, "629Ef", 37, 0, 0);
+					break;
+				case 17:
+					if (getCharacterCurrentParams(kCharacterAnna)[1] || getCharacterCurrentParams(kCharacterAnna)[0]) {
+						setDoor(37, kCharacterAnna, 1, 10, 9);
+						setDoor(53, kCharacterAnna, 1, 10, 9);
+						getCharacterCurrentParams(kCharacterAnna)[1] = 0;
+						getCharacterCurrentParams(kCharacterAnna)[0] = 0;
+					}
+
+					break;
+				case 18:
+					switch (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8]) {
+					case 1:
+						if (whoRunningDialog(kCharacterMax))
+							goto LABEL_54;
+						getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 2;
+						AnnaCall(&LogicManager::CONS_Anna_DoDialog, "MAX1120", 0, 0, 0);
+						break;
+					case 2:
+					LABEL_54:
+						setDoor(37, kCharacterAnna, 1, 10, 9);
+						setDoor(53, kCharacterAnna, 1, 10, 9);
+						break;
+					case 3:
+					case 4:
+						getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 5;
+						AnnaCall(&LogicManager::CONS_Anna_DoDialog, "ANN1016", 0, 0, 0);
+						break;
+					case 5:
+						setDoor(37, kCharacterAnna, 1, 14, 0);
+						setDoor(53, kCharacterAnna, 1, 14, 0);
+						getCharacterCurrentParams(kCharacterAnna)[0] = 1;
+						break;
+					case 6:
+					case 7:
+					case 8:
+						if (inComp(kCharacterMax, kCarRedSleeping, 4070)) {
+							setDoor(37, kCharacterAnna, 1, 0, 9);
+							setDoor(53, kCharacterAnna, 1, 0, 9);
+						}
+
+						getCharacterCurrentParams(kCharacterAnna)[0] = 0;
+						getCharacterCurrentParams(kCharacterAnna)[1] = 1;
+						break;
+					case 9:
+						softReleaseAtDoor(kCharacterAnna, 37);
+						endGraphics(kCharacterAnna);
+						getCharacter(kCharacterAnna).characterPosition.location = kCharacterAnna;
+						getCharacter(kCharacterAnna).characterPosition.position = 4070;
+						getCharacterCurrentParams(kCharacterAnna)[2] = kCharacterAnna;
+						setDoor(45, kCharacterCath, 0, 255, 255);
+						setDoor(53, kCharacterAnna, kCharacterAnna, 10, 9);
+
+						if (checkCathDir(kCarRedSleeping, 78))
+							bumpCath(kCarRedSleeping, 49, 255);
+
+						startCycOtis(kCharacterAnna, "417B");
+						break;
+					default:
+						return;
+					}
+					break;
+				}
+			}
+			return;
+		}
+		if (msg->action == 12) {
+			setDoor(45, kCharacterCath, 1, 255, 255);
+			if (checkCathDir(kCarRedSleeping, 60))
+				bumpCath(kCarRedSleeping, 78, 255);
+
+			send(kCharacterAnna, kCharacterCond2, 189750912, 0);
+			return;
+		}
+		if (msg->action != 9)
+			return;
+		if (inComp(kCharacterMax, kCarRedSleeping, 4070)) {
+			setDoor(37, kCharacterAnna, 1, 0, 0);
+			setDoor(53, kCharacterAnna, 1, 0, 0);
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
+			AnnaCall(&LogicManager::CONS_Anna_DoDialog, "LIB013", 0, 0, 0);
+			return;
+		}
+	LABEL_58:
+		if (getCharacterCurrentParams(kCharacterAnna)[0]) {
+			setDoor(37, kCharacterAnna, 1, 0, 0);
+			setDoor(53, kCharacterAnna, 1, 0, 0);
+			if (msg->param.intParam == 53) {
+				getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 6;
+				AnnaCall(&LogicManager::CONS_Anna_DoDialog, getCathWCDialog(), 0, 0, 0);
+			} else if (cathHasItem(kItemPassengerList)) {
+				getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 7;
+				if (rnd(2)) {
+					AnnaCall(&LogicManager::CONS_Anna_DoDialog, getCathSorryDialog(), 0, 0, 0);
+				} else {
+					if (rnd(2) == 0) {
+						AnnaCall(&LogicManager::CONS_Anna_DoDialog, "CAT1506A", 0, 0, 0);
+					} else {
+						AnnaCall(&LogicManager::CONS_Anna_DoDialog, "CAT1506", 0, 0, 0);
+					}
+				}
+				
+			} else {
+				getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 8;
+				AnnaCall(&LogicManager::CONS_Anna_DoDialog, getCathSorryDialog(), 0, 0, 0);
+			}
+		} else {
+			setDoor(37, kCharacterAnna, 1, 0, 0);
+			setDoor(53, kCharacterAnna, 1, 0, 0);
+			if (msg->action == 8) {
+				getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 3;
+				AnnaCall(&LogicManager::CONS_Anna_DoDialog, "LIB012", 0, 0, 0);
+			} else {
+				getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 4;
+				AnnaCall(&LogicManager::CONS_Anna_DoDialog, "LIB013", 0, 0, 0);
+			}
+		}
+
+		return;
+	}
+
+	if (msg->action == 8)
+		goto LABEL_58;
+
+	if (msg->action)
+		return;
+
+	if (!getCharacterCurrentParams(kCharacterAnna)[2])
+		goto LABEL_28;
+
+	if (_gameTime > 2079000 && !getCharacterCurrentParams(kCharacterAnna)[4]) {
+		getCharacterCurrentParams(kCharacterAnna)[4] = 1;
+		CONS_Anna_GoConcert(0, 0, 0, 0);
+		return;
+	}
+
+	if (getCharacterCurrentParams(kCharacterAnna)[5] || (getCharacterCurrentParams(kCharacterAnna)[5] = _gameTime + 9000, _gameTime != -9000)) {
+		if (getCharacterCurrentParams(kCharacterAnna)[5] >= _gameTime)
+			goto LABEL_28;
+		getCharacterCurrentParams(kCharacterAnna)[5] = 0x7FFFFFFF;
+	}
+
+	tmp = getCharacterCurrentParams(kCharacterAnna)[3] == 0;
+	getCharacterCurrentParams(kCharacterAnna)[3] = tmp ? 1 : 0;
+
+	if (!tmp) {
+		startCycOtis(kCharacterAnna, "417B");
+	} else {
+		startCycOtis(kCharacterAnna, "417A");
+	}
+
+	getCharacterCurrentParams(kCharacterAnna)[5] = 0;
+LABEL_28:
+	if (getCharacterCurrentParams(kCharacterAnna)[0]) {
+		if (getCharacterCurrentParams(kCharacterAnna)[6] || (getCharacterCurrentParams(kCharacterAnna)[6] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
+			if (getCharacterCurrentParams(kCharacterAnna)[6] >= _currentGameSessionTicks)
+				return;
+
+			getCharacterCurrentParams(kCharacterAnna)[6] = 0x7FFFFFFF;
+		}
+
+		getCharacterCurrentParams(kCharacterAnna)[0] = 0;
+		getCharacterCurrentParams(kCharacterAnna)[1] = 1;
+
+		setDoor(37, kCharacterAnna, 1, 0, !inComp(kCharacterMax, kCarRedSleeping, 4070) ? 0 : 9);
+		setDoor(53, kCharacterAnna, 1, 0, !inComp(kCharacterMax, kCarRedSleeping, 4070) ? 0 : 9);
+		getCharacterCurrentParams(kCharacterAnna)[6] = 0;
+	} else {
+		getCharacterCurrentParams(kCharacterAnna)[6] = 0;
+	}
+}
+
+void LogicManager::CONS_Anna_GoConcert(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_Anna_GoConcert);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 55;
+
+	params->clear();
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_Anna_GoConcert(HAND_PARAMS) {
+	if (msg->action == 12) {
+		setDoor(45, kCharacterCath, 2, 255, 255);
+		if (checkCathDir(kCarRedSleeping, 78))
+			bumpCath(kCarRedSleeping, 49, 255);
+
+		setDoor(37, kCharacterCath, 1, 0, 0);
+		setDoor(53, kCharacterCath, 1, 10, 9);
+		dropItem(kItemKey, 1);
+		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
+		AnnaCall(&LogicManager::CONS_Anna_ExitComp, 1, 0, 0, 0);
+	} else if (msg->action == 18) {
+		if (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 1) {
+			setDoor(37, kCharacterCath, 1, 10, 9);
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 2;
+			AnnaCall(&LogicManager::CONS_Anna_DoWalk, 2, 9270, 0, 0);
+		} else if (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 2) {
+			CONS_Anna_Concert(0, 0, 0, 0);
+		}
+	}
+}
+
+void LogicManager::CONS_Anna_Concert(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_Anna_Concert);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 56;
+
+	params->clear();
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_Anna_Concert(HAND_PARAMS) {
+	if (msg->action == 12) {
+		endGraphics(kCharacterAnna);
+		getCharacter(kCharacterAnna).characterPosition.car = kCarKronos;
+		getCharacter(kCharacterAnna).characterPosition.position = 6000;
+		getCharacter(kCharacterAnna).characterPosition.location = 1;
+	} else if (msg->action == 191668032) {
+		COND_Anna_LeaveConcert(0, 0, 0, 0);
+	}
+}
+
+void LogicManager::COND_Anna_LeaveConcert(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_Anna_LeaveConcert);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 57;
+
+	params->clear();
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_Anna_LeaveConcert(HAND_PARAMS) {
+	if (msg->action > 18) {
+		if (msg->action == 123712592) {
+			startCycOtis(kCharacterAnna, "628Af");
+		LABEL_16:
+			if (whoRunningDialog(kCharacterAugust)) {
+				getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 4;
+				AnnaCall(&LogicManager::CONS_Anna_DoWait, 75, 0, 0, 0);
+			} else {
+				getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 5;
+				AnnaCall(&LogicManager::CONS_Anna_DoDialog, "Aug3009", 0, 0, 0);
+			}
+		} else if (msg->action == 192063264) {
+			if (inComp(kCharacterCath, kCarRedSleeping, 4070) || inComp(kCharacterCath, kCarRedSleeping, 4455)) {
+				softReleaseAtDoor(kCharacterAnna, 37);
+				CONS_Anna_LeaveConcertCathInComp(0, 0, 0, 0);
+			} else {
+				getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 3;
+				AnnaCall(&LogicManager::CONS_Anna_DoCorrOtis, "625Ff", 37, 0, 0);
+			}
+		}
+	} else if (msg->action == 18) {
+		switch (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8]) {
+		case 1:
+			send(kCharacterAnna, kCharacterAugust, 191668032, 0);
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 2;
+			AnnaCall(&LogicManager::CONS_Anna_DoWalk, 4, 4070, 0, 0);
+			break;
+		case 2:
+			setDoor(37, 0, 1, 0, 0);
+			send(kCharacterAnna, kCharacterCond2, 205033696, 0);
+			startCycOtis(kCharacterAnna, "625Ef");
+			softBlockAtDoor(kCharacterAnna, 37);
+			break;
+		case 3:
+			startCycOtis(kCharacterAnna, "625Gf");
+			softBlockAtDoor(kCharacterAnna, 37);
+			send(kCharacterAnna, kCharacterAugust, 169032608, 0);
+			break;
+		case 4:
+			goto LABEL_16;
+		case 5:
+			playDialog(kCharacterAnna, "Aug3009A", -1, 0);
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 6;
+			AnnaCall(&LogicManager::CONS_Anna_DoCorrOtis, "628Bf", 37, 0, 0);
+			break;
+		case 6:
+			softReleaseAtDoor(kCharacterAnna, 37);
+			send(kCharacterAnna, kCharacterAugust, 122288808, 0);
+			CONS_Anna_AfterConcert(0, 0, 0, 0);
+			break;
+		default:
+			return;
+		}
+	} else if (msg->action == 12) {
+		getCharacter(kCharacterAnna).characterPosition.car = kCarGreenSleeping;
+		getCharacter(kCharacterAnna).characterPosition.position = 850;
+		getCharacter(kCharacterAnna).characterPosition.location = 0;
+		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
+		AnnaCall(&LogicManager::CONS_Anna_DoWalk, 3, 5790, 0, 0);
+	}
+}
+
+void LogicManager::CONS_Anna_LeaveConcertCathInComp(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_Anna_LeaveConcertCathInComp);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 58;
+
+	params->clear();
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_Anna_LeaveConcertCathInComp(HAND_PARAMS) {
+	if (msg->action == 12) {
+		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
+		AnnaCall(&LogicManager::CONS_Anna_SaveGame, 2, kEventAnnaSearchingCompartment, 0, 0);
+	} else if (msg->action == 18 && getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 1) {
+		playNIS(kEventAnnaSearchingCompartment);
+		endGraphics(kCharacterAnna);
+		bumpCath(kCarRedSleeping, 8, 255);
+		playDialog(kCharacterAnna, "lib015", -1, 0);
+		send(kCharacterAnna, kCharacterAugust, 122288808, 0);
+		CONS_Anna_AfterConcert(0, 0, 0, 0);
+	}
+}
+
+void LogicManager::CONS_Anna_AfterConcert(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_Anna_AfterConcert);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 59;
+
+	params->clear();
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_Anna_AfterConcert(HAND_PARAMS) {
+	if (msg->action > 9) {
+		if (msg->action > 17) {
+			if (msg->action > 156622016) {
+				if (msg->action == 236241630) {
+					setDoor(37, 1, 1, 0, 0);
+					setDoor(53, 1, 1, 0, 0);
+					getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 7;
+					AnnaCall(&LogicManager::CONS_Anna_DoDialog, "Ann1016A", 0, 0, 0);
+				} else if (msg->action == 236517970) {
+					getCharacterCurrentParams(kCharacterAnna)[2] = 1;
+					setDoor(37, 1, 1, 10, 9);
+					setDoor(53, 1, 1, 10, 9);
+				}
+			} else if (msg->action == 156622016) {
+				if (getCharacterCurrentParams(kCharacterAnna)[2]) {
+					getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 8;
+					AnnaCall(&LogicManager::CONS_Anna_GiveMaxBack, 0, 0, 0, 0);
+				}
+			} else if (msg->action == 18) {
+				switch (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8]) {
+				case 1:
+				case 2:
+					getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 3;
+					AnnaCall(&LogicManager::CONS_Anna_DoDialog, "ANN1016", 0, 0, 0);
+					break;
+				case 3:
+					setDoor(37, kCharacterAnna, 1, 14, 0);
+					setDoor(53, kCharacterAnna, 1, 14, 0);
+					getCharacterCurrentParams(kCharacterAnna)[0] = 1;
+					break;
+				case 4:
+				case 5:
+				case 6:
+					getCharacterCurrentParams(kCharacterAnna)[0] = 0;
+					getCharacterCurrentParams(kCharacterAnna)[1] = 1;
+					break;
+				case 7:
+					send(kCharacterAnna, kCharacterTatiana, 100906246, 0);
+					break;
+				default:
+					return;
+				}
+			}
+		} else if (msg->action == 17) {
+			if (getCharacterCurrentParams(kCharacterAnna)[1] || getCharacterCurrentParams(kCharacterAnna)[0]) {
+				setDoor(37, kCharacterAnna, 1, 10, 9);
+				setDoor(53, kCharacterAnna, 1, 10, 9);
+				getCharacterCurrentParams(kCharacterAnna)[1] = 0;
+				getCharacterCurrentParams(kCharacterAnna)[0] = 0;
+			}
+		} else if (msg->action == 12) {
+			getCharacter(kCharacterAnna).characterPosition.position = 4070;
+			getCharacter(kCharacterAnna).characterPosition.location = 1;
+			endGraphics(kCharacterAnna);
+			setDoor(107, kCharacterCath, 2, 255, 255);
+			setDoor(45, kCharacterCath, 1, 255, 255);
+			setDoor(37, kCharacterAnna, 1, 10, 9);
+			setDoor(53, kCharacterAnna, 1, 10, 9);
+
+			if (checkCathDir(kCarRedSleeping, 60))
+				bumpCath(kCarRedSleeping, 78, 255);
+		}
+	} else if (msg->action >= 8) {
+		if (getCharacterCurrentParams(kCharacterAnna)[0]) {
+			setDoor(37, kCharacterAnna, 1, 0, 0);
+			setDoor(53, kCharacterAnna, 1, 0, 0);
+			if (msg->param.intParam == 53) {
+				getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 4;
+				AnnaCall(&LogicManager::CONS_Anna_DoDialog, getCathWCDialog(), 0, 0, 0);
+			} else if (cathHasItem(kItemPassengerList)) {
+				getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 5;
+
+				if (rnd(2)) {
+					AnnaCall(&LogicManager::CONS_Anna_DoDialog, getCathSorryDialog(), 0, 0, 0);
+				} else {
+					if (rnd(2) == 0) {
+						AnnaCall(&LogicManager::CONS_Anna_DoDialog, "CAT1506A", 0, 0, 0);
+					} else {
+						AnnaCall(&LogicManager::CONS_Anna_DoDialog, "CAT1506", 0, 0, 0);
+					}
+				}
+			} else {
+				getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 6;
+				AnnaCall(&LogicManager::CONS_Anna_DoDialog, getCathSorryDialog(), 0, 0, 0);
+			}
+		} else {
+			setDoor(37, kCharacterAnna, 1, 0, 0);
+			setDoor(53, kCharacterAnna, 1, 0, 0);
+			if (msg->action == 8) {
+				getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
+				AnnaCall(&LogicManager::CONS_Anna_DoDialog, "LIB012", 0, 0, 0);
+			} else {
+				getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 2;
+				AnnaCall(&LogicManager::CONS_Anna_DoDialog, "LIB013", 0, 0, 0);
+			}
+		}
+	} else {
+		if (msg->action)
+			return;
+
+		if (cathHasItem(kItemKey) && getCharacterCurrentParams(kCharacterAnna)[3] != 0x7FFFFFFF && _gameTime > 2218500) {
+			if (_gameTime > 2248200)
+				goto LABEL_27;
+			if (!getCharacterCurrentParams(kCharacterAnna)[2] || !cathInCorridor(kCarRedSleeping) && !inSalon(kCharacterCath) && !inDiningRoom(kCharacterCath) || !getCharacterCurrentParams(kCharacterAnna)[3]) {
+				getCharacterCurrentParams(kCharacterAnna)[3] = _gameTime;
+				if (!getCharacterCurrentParams(kCharacterAnna)[3])
+					goto LABEL_28;
+			}
+
+			if (getCharacterCurrentParams(kCharacterAnna)[3] < _gameTime) {
+			LABEL_27:
+				getCharacterCurrentParams(kCharacterAnna)[3] = 0x7FFFFFFF;
+			LABEL_28:
+				CONS_Anna_GoBagg(0, 0, 0, 0);
+				return;
+			}
+		}
+
+		if (getCharacterCurrentParams(kCharacterAnna)[0]) {
+			if (getCharacterCurrentParams(kCharacterAnna)[4] || (getCharacterCurrentParams(kCharacterAnna)[4] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
+				if (getCharacterCurrentParams(kCharacterAnna)[4] >= _currentGameSessionTicks)
+					return;
+
+				getCharacterCurrentParams(kCharacterAnna)[4] = 0x7FFFFFFF;
+			}
+
+			getCharacterCurrentParams(kCharacterAnna)[0] = 0;
+			getCharacterCurrentParams(kCharacterAnna)[1] = 1;
+
+			setDoor(37, kCharacterAnna, 1, 0, !inComp(kCharacterMax, kCarRedSleeping, 4070) ? 0 : 9);
+			setDoor(53, kCharacterAnna, 1, 0, !inComp(kCharacterMax, kCarRedSleeping, 4070) ? 0 : 9);
+			getCharacterCurrentParams(kCharacterAnna)[4] = 0;
+		} else {
+			getCharacterCurrentParams(kCharacterAnna)[4] = 0;
+		}
+	}
+}
+
+void LogicManager::CONS_Anna_GiveMaxBack(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_Anna_GiveMaxBack);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 60;
+
+	params->clear();
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_Anna_GiveMaxBack(HAND_PARAMS) {
+	switch (msg->action) {
+	case 12:
+		send(kCharacterAnna, kCharacterMax, 122358304, 0);
+
+		if (rnd(2) == 0) {
+			playDialog(kCharacterAnna, "Ann3127", -1, 0);
+		} else {
+			playDialog(kCharacterAnna, "Ann3126", -1, 0);
+		}
+
+		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
+		AnnaCall(&LogicManager::CONS_Anna_DoCorrOtis, "630Cf", 37, 0, 0);
+		break;
+	case 18:
+		switch (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8]) {
+		case 1:
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 2;
+			AnnaCall(&LogicManager::CONS_Anna_DoCorrOtis, "630Df", 37, 0, 0);
+			break;
+		case 2:
+			endGraphics(kCharacterAnna);
+			send(kCharacterAnna, kCharacterCond2, 189026624, 0);
+			break;
+		case 3:
+			getCharacter(kCharacterAnna).characterPosition.position = 4070;
+			getCharacter(kCharacterAnna).characterPosition.location = 1;
+			endGraphics(kCharacterAnna);
+
+			getCharacter(kCharacterAnna).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterAnna, _functionsAnna[getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall]]);
+			fedEx(kCharacterAnna, kCharacterAnna, 18, 0);
+			break;
+		}
+		break;
+	case 156049968:
+		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 3;
+		AnnaCall(&LogicManager::CONS_Anna_DoCorrOtis, "629EF", 37, 0, 0);
+		break;
+	}
+}
+
+void LogicManager::CONS_Anna_GoBagg(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_Anna_GoBagg);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 61;
+
+	params->clear();
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_Anna_GoBagg(HAND_PARAMS) {
+	if (msg->action == 12) {
+		_gameTimeTicksDelta = 3;
+		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
+		AnnaCall(&LogicManager::CONS_Anna_SaveGame, 1, 0, 0, 0);
+	} else if (msg->action == 18) {
+		switch (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8]) {
+		case 1:
+			setDoor(53, kCharacterCath, 1, 10, 9);
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 2;
+			AnnaCall(&LogicManager::CONS_Anna_ExitComp, 0, 0, 0, 0);
+			break;
+		case 2:
+			setDoor(37, kCharacterCath, 1, 10, 9);
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 3;
+			AnnaCall(&LogicManager::CONS_Anna_DoWalk, 5, 850, 0, 0);
+			break;
+		case 3:
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 4;
+			AnnaCall(&LogicManager::CONS_Anna_WaitRCClear, 0, 0, 0, 0);
+			break;
+		case 4:
+			getCharacter(kCharacterAnna).characterPosition.position = 1540;
+			getCharacter(kCharacterAnna).characterPosition.location = 0;
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 5;
+			AnnaCall(&LogicManager::CONS_Anna_DoSeqOtis, "802US", 0, 0, 0);
+			break;
+		case 5:
+			startSeqOtis(kCharacterAnna, "802UD");
+			if (inSalon(kCharacterCath))
+				advanceFrame(kCharacterAnna);
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 6;
+			AnnaCall(&LogicManager::CONS_Anna_FinishSeqOtis, 0, 0, 0, 0);
+			break;
+		case 6:
+			endGraphics(kCharacterAnna);
+			CONS_Anna_InBagg(0, 0, 0, 0);
+			break;
+		default:
+			return;
+		}
+	}
+}
+
+void LogicManager::CONS_Anna_InBagg(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_Anna_InBagg);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 62;
+
+	params->clear();
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_Anna_InBagg(HAND_PARAMS) {
+	if (msg->action) {
+		if (msg->action == 12) {
+			getCharacter(kCharacterAnna).characterPosition.car = kCarBaggage;
+			_gameProgress[kProgressField54] = 1;
+		} else if (msg->action == 235856512) {
+			getCharacterCurrentParams(kCharacterAnna)[0] = 1;
+		}
+	} else if (getCharacterCurrentParams(kCharacterAnna)[0] && _gameTime > 2259000 && !getCharacterCurrentParams(kCharacterAnna)[1]) {
+		getCharacterCurrentParams(kCharacterAnna)[1] = 1;
+		send(kCharacterAnna, kCharacterVesna, 189299008, 0);
+		CONS_Anna_DeadBagg(0, 0, 0, 0);
+	}
+}
+
+void LogicManager::CONS_Anna_DeadBagg(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_Anna_DeadBagg);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 63;
+
+	params->clear();
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_Anna_DeadBagg(HAND_PARAMS) {
+	switch (msg->action) {
+	case 12:
+		send(kCharacterAnna, kCharacterMaster, 171843264, 0);
+		break;
+	case 18:
+		if (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 1) {
+			playNIS(kEventAnnaKilled);
+			endGame(1, 2250000, 58, 1);
+		}
+
+		break;
+	case 272177921:
+		if (dialogRunning("MUS012"))
+			fadeDialog("MUS012");
+
+		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
+		AnnaCall(&LogicManager::CONS_Anna_SaveGame, 2, kEventAnnaKilled, 0, 0);
+		break;
+	}
+}
+
+void LogicManager::CONS_Anna_BaggageFight(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_Anna_BaggageFight);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 64;
+
+	params->clear();
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_Anna_BaggageFight(HAND_PARAMS) {
+	if (msg->action == 12) {
+		endGraphics(kCharacterAnna);
+		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
+		AnnaCall(&LogicManager::CONS_Anna_SaveGame, 2, kEventAnnaBaggageArgument, 0, 0);
+	} else if (msg->action == 18) {
+		switch (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8]) {
+		case 1:
+			playNIS(kEventAnnaBaggageArgument);
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 2;
+			AnnaCall(&LogicManager::CONS_Anna_SaveGame, 1, 0, 0, 0);
+			break;
+		case 2:
+			getCharacterCurrentParams(kCharacterAnna)[0] = playFight(2002);
+			if (getCharacterCurrentParams(kCharacterAnna)[0]) {
+				endGame(0, 0, 0, getCharacterCurrentParams(kCharacterAnna)[0] == 1);
+			} else {
+				_gameTime += 1800;
+				getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 3;
+				AnnaCall(&LogicManager::CONS_Anna_SaveGame, 2, kEventAnnaBagagePart2, 0, 0);
+			}
+			break;
+		case 3:
+			playNIS(kEventAnnaBagagePart2);
+			bumpCath(kCarBaggage, 96, 255);
+			_gameProgress[kProgressField54] = 0;
+			forceJump(kCharacterVesna, &LogicManager::CONS_Vesna_InComp);
+			_gameTime = 2266200;
+			CONS_Anna_PrepareVienna(0, 0, 0, 0);
+			break;
+		}
+	}
+}
+
+void LogicManager::CONS_Anna_PrepareVienna(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_Anna_PrepareVienna);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 65;
+
+	params->clear();
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_Anna_PrepareVienna(HAND_PARAMS) {
+	if (msg->action == 12) {
+		getCharacter(kCharacterAnna).characterPosition.car = kCarRedSleeping;
+		getCharacter(kCharacterAnna).characterPosition.position = 4070;
+		getCharacter(kCharacterAnna).characterPosition.location = 1;
+		getCharacter(kCharacterAnna).clothes = 3;
+		getCharacter(kCharacterAnna).inventoryItem = 0;
+		setDoor(45, kCharacterCath, 1, 255, 255);
+		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
+		AnnaCall(&LogicManager::CONS_Anna_CompLogic, 15803100, "NONE", 0, 0);
+	}
+}
+
+void LogicManager::CONS_Anna_StartPart4(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_Anna_StartPart4);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 66;
+
+	params->clear();
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_Anna_StartPart4(HAND_PARAMS) {
+	if (msg->action) {
+		if (msg->action == 12) {
+			endGraphics(kCharacterAnna);
+			getCharacter(kCharacterAnna).characterPosition.car = kCarRedSleeping;
+			getCharacter(kCharacterAnna).characterPosition.position = 4070;
+			getCharacter(kCharacterAnna).characterPosition.location = 1;
+			getCharacter(kCharacterAnna).clothes = 2;
+			getCharacter(kCharacterAnna).inventoryItem = 0;
+		}
+	} else {
+		CONS_Anna_Reading(0, 0, 0, 0);
+	}
+}
+
+void LogicManager::CONS_Anna_Reading(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_Anna_Reading);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 67;
+
+	params->clear();
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_Anna_Reading(HAND_PARAMS) {
+	if (msg->action > 9) {
+		if (msg->action > 17) {
+			switch (msg->action) {
+			case 18:
+				switch (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8]) {
+				case 1:
+					playNIS(kEventAnnaConversation_34);
+					playDialog(0, "LIB015", -1, 0);
+					bumpCath(kCarRedSleeping, 8, 255);
+					CONS_Anna_Sulking(0, 0, 0, 0);
+					break;
+				case 2:
+				case 3:
+					getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 4;
+					AnnaCall(&LogicManager::CONS_Anna_DoDialog, "ANN1016", 0, 0, 0);
+					break;
+				case 4:
+					setDoor(53, kCharacterAnna, 1, 14, 0);
+					getCharacterCurrentParams(kCharacterAnna)[0] = 1;
+					break;
+				case 5:
+					getCharacterCurrentParams(kCharacterAnna)[0] = 0;
+					getCharacterCurrentParams(kCharacterAnna)[1] = 1;
+					break;
+				default:
+					return;
+				}
+				break;
+			case 191001984:
+				setDoor(37, kCharacterCath, 0, 10, 9);
+				getCharacter(kCharacterAnna).inventoryItem = 0;
+				CONS_Anna_GoSalon4(0, 0, 0, 0);
+				break;
+			case 219971920:
+				getCharacterCurrentParams(kCharacterAnna)[2] = 1;
+				getCharacter(kCharacterAnna).inventoryItem = 0x80;
+				break;
+			}
+		} else if (msg->action == 17) {
+			if (getCharacterCurrentParams(kCharacterAnna)[1] || getCharacterCurrentParams(kCharacterAnna)[0]) {
+				setDoor(53, kCharacterAnna, 1, 10, 9);
+				getCharacterCurrentParams(kCharacterAnna)[1] = 0;
+				getCharacterCurrentParams(kCharacterAnna)[0] = 0;
+			}
+		} else if (msg->action == 12) {
+			setDoor(37, kCharacterCath, 2, 0, 0);
+			setDoor(45, kCharacterCath, 1, 255, 255);
+			setDoor(53, kCharacterAnna, 1, 10, 9);
+			startCycOtis(kCharacterAnna, "511B");
+		}
+
+		return;
+	}
+
+	if (msg->action >= 8) {
+		if (getCharacterCurrentParams(kCharacterAnna)[0]) {
+			setDoor(53, kCharacterAnna, 1, 0, 0);
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 5;
+			AnnaCall(&LogicManager::CONS_Anna_DoDialog, getCathWCDialog(), 0, 0, 0);
+		} else {
+			setDoor(53, kCharacterAnna, 1, 0, 0);
+
+			if (msg->action == 8) {
+				getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 2;
+				AnnaCall(&LogicManager::CONS_Anna_DoDialog, "LIB012", 0, 0, 0);
+			} else {
+				getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 3;
+				AnnaCall(&LogicManager::CONS_Anna_DoDialog, "LIB013", 0, 0, 0);
+			}
+		}
+
+		return;
+	}
+
+	if (msg->action) {
+		if (msg->action == 1) {
+			getCharacter(kCharacterAnna).inventoryItem = 0;
+			getCharacter(kCharacterCath).characterPosition.location = 1;
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
+			AnnaCall(&LogicManager::CONS_Anna_SaveGame, 2, 34, 0, 0);
+		}
+
+		return;
+	}
+
+	if (checkCathDir(kCarRedSleeping, 46)) {
+		if (getCharacterCurrentParams(kCharacterAnna)[3] || (getCharacterCurrentParams(kCharacterAnna)[3] = _currentGameSessionTicks + 30, _currentGameSessionTicks != -30)) {
+			if (getCharacterCurrentParams(kCharacterAnna)[3] >= _currentGameSessionTicks)
+				goto LABEL_21;
+
+			getCharacterCurrentParams(kCharacterAnna)[3] = 0x7FFFFFFF;
+		}
+
+		bumpCath(kCarRedSleeping, 8, 255);
+	}
+
+	getCharacterCurrentParams(kCharacterAnna)[3] = 0;
+LABEL_21:
+	if (getCharacterCurrentParams(kCharacterAnna)[0]) {
+		if (getCharacterCurrentParams(kCharacterAnna)[4] || (getCharacterCurrentParams(kCharacterAnna)[4] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
+			if (getCharacterCurrentParams(kCharacterAnna)[4] >= _currentGameSessionTicks)
+				return;
+
+			getCharacterCurrentParams(kCharacterAnna)[4] = 0x7FFFFFFF;
+		}
+
+		getCharacterCurrentParams(kCharacterAnna)[0] = 0;
+		getCharacterCurrentParams(kCharacterAnna)[1] = 1;
+
+		setDoor(53, kCharacterAnna, 1, 0, !inComp(kCharacterMax, kCarRedSleeping, 4070) ? 0 : 9);
+		getCharacterCurrentParams(kCharacterAnna)[4] = 0;
+	} else {
+		getCharacterCurrentParams(kCharacterAnna)[4] = 0;
+	}
+}
+
+void LogicManager::CONS_Anna_Sulking(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_Anna_Sulking);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 68;
+
+	params->clear();
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_Anna_Sulking(HAND_PARAMS) {
+	if (msg->action > 12) {
+		if (msg->action != 18) {
+			if (msg->action == 191001984) {
+				setDoor(37, kCharacterCath, 0, 10, 9);
+				CONS_Anna_GoSalon4(0, 0, 0, 0);
+			} else if (msg->action == 201431954) {
+				getCharacterCurrentParams(kCharacterAnna)[0] = 1;
+			}
+		}
+	} else if (msg->action == 12) {
+		setDoor(37, kCharacterCath, 1, 10, 9);
+		setDoor(53, kCharacterCath, 1, 10, 9);
+		getCharacter(kCharacterAnna).characterPosition.car = 4;
+		getCharacter(kCharacterAnna).characterPosition.position = 4070;
+		getCharacter(kCharacterAnna).characterPosition.location = 1;
+	} else if (msg->action == 0 && !getCharacterCurrentParams(kCharacterAnna)[0]) {
+		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
+		AnnaCall(&LogicManager::CONS_Anna_CompLogic, 2511900, "NONE", 0, 0);
+	}
+}
+
+void LogicManager::CONS_Anna_GoSalon4(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_Anna_GoSalon4);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 69;
+
+	params->clear();
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_Anna_GoSalon4(HAND_PARAMS) {
+	if (msg->action > 12) {
+		if (msg->action > 100969180) {
+			if (msg->action == 122288808) {
+				startCycOtis(kCharacterAnna, "127E");
+				send(kCharacterAnna, kCharacterAbbot, 203073664, 0);
+			} else if (msg->action == 122358304) {
+				startCycOtis(kCharacterAnna, "BLANK");
+			}
+		} else {
+			switch (msg->action) {
+			case 100969180:
+				endGraphics(kCharacterAnna);
+				getCharacterCurrentParams(kCharacterAnna)[0] = 1;
+				break;
+			case 17:
+				if (getCharacterCurrentParams(kCharacterAnna)[0] && checkLoc(kCharacterCath, kCarRedSleeping)) {
+					getCharacter(kCharacterAnna).characterPosition.car = kCarRedSleeping;
+					getCharacter(kCharacterAnna).characterPosition.position = 8200;
+					getCharacter(kCharacterAnna).characterPosition.location = 0;
+					CONS_Anna_ReturnToComp4(0, 0, 0, 0);
+				}
+				break;
+			case 18:
+				switch (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8]) {
+				case 1:
+					getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 2;
+					AnnaCall(&LogicManager::CONS_Anna_WaitRCClear, 0, 0, 0, 0);
+					break;
+				case 2:
+					getCharacter(kCharacterAnna).characterPosition.position = 1540;
+					getCharacter(kCharacterAnna).characterPosition.location = 0;
+					getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 3;
+					AnnaCall(&LogicManager::CONS_Anna_DoBlockSeqOtis, "127A", 5, 56, 0);
+					break;
+				case 3:
+					getCharacter(kCharacterAnna).characterPosition.location = 1;
+					startCycOtis(kCharacterAnna, "127B");
+					send(kCharacterAnna, kCharacterWaiter2, 258136010, 0);
+					break;
+				case 4:
+					getCharacter(kCharacterAnna).characterPosition.location = 0;
+					getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 5;
+					AnnaCall(&LogicManager::CONS_Anna_DoBlockSeqOtis, "127G", 5, 56, 0);
+					break;
+				case 5:
+					CONS_Anna_ReturnToComp4(0, 0, 0, 0);
+					break;
+				default:
+					return;
+				}
+				break;
+			}
+		}
+	} else if (msg->action == 12) {
+		getCharacter(kCharacterAnna).characterPosition.car = kCarRedSleeping;
+		getCharacter(kCharacterAnna).characterPosition.position = 4070;
+		getCharacter(kCharacterAnna).characterPosition.location = 0;
+		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
+		AnnaCall(&LogicManager::CONS_Anna_DoWalk, 5, 850, 0, 0);
+	} else if (msg->action == 0) {
+		if (getCharacterCurrentParams(kCharacterAnna)[0]) {
+			if (getCharacterCurrentParams(kCharacterAnna)[1] || (getCharacterCurrentParams(kCharacterAnna)[1] = _gameTime + 4500, _gameTime != -4500)) {
+				if (getCharacterCurrentParams(kCharacterAnna)[1] >= _gameTime)
+					return;
+
+				getCharacterCurrentParams(kCharacterAnna)[1] = 0x7FFFFFFF;
+			}
+
+			getCharacter(kCharacterAnna).characterPosition.car = kCarRedSleeping;
+			getCharacter(kCharacterAnna).characterPosition.position = 9270;
+			getCharacter(kCharacterAnna).characterPosition.location = 0;
+			CONS_Anna_ReturnToComp4(0, 0, 0, 0);
+		} else if (_gameTime > 2535300 && !getCharacterCurrentParams(kCharacterAnna)[2]) {
+			getCharacterCurrentParams(kCharacterAnna)[2] = 1;
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 4;
+			AnnaCall(&LogicManager::CONS_Anna_WaitRCClear, 0, 0, 0, 0);
+		}
+	}
+}
+
+void LogicManager::CONS_Anna_ReturnToComp4(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_Anna_ReturnToComp4);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 70;
+
+	params->clear();
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_Anna_ReturnToComp4(HAND_PARAMS) {
+	if (msg->action == 12) {
+		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
+		AnnaCall(&LogicManager::CONS_Anna_DoWalkCathFollowsAnna, 4, 4070, 0, 0);
+	} else if (msg->action == 18) {
+		if (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 1) {
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 2;
+			AnnaCall(&LogicManager::CONS_Anna_EnterCompCathFollowsAnna, 0, 0, 0, 0);
+		} else if (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 2) {
+			getCharacter(kCharacterAnna).characterPosition.location = 0;
+			endGraphics(kCharacterAnna);
+			CONS_Anna_LetDownHair(0, 0, 0, 0);
+		}
+	}
+}
+
+void LogicManager::CONS_Anna_EnterCompCathFollowsAnna(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_Anna_EnterCompCathFollowsAnna);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 71;
+
+	params->clear();
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_Anna_EnterCompCathFollowsAnna(HAND_PARAMS) {
+	switch (msg->action) {
+	case 3:
+		releaseAtDoor(kCharacterAnna, 37);
+		getCharacter(kCharacterAnna).characterPosition.position = 4070;
+
+		getCharacter(kCharacterAnna).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterAnna, _functionsAnna[getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall]]);
+		fedEx(kCharacterAnna, kCharacterAnna, 18, 0);
+		break;
+	case 12:
+		startSeqOtis(kCharacterAnna, "625Af");
+		if (checkCathDir(kCarRedSleeping, 7) || checkCathDir(kCarRedSleeping, 28) || checkCathDir(kCarRedSleeping, 56)) {
+			smartBumpCath();
+		}
+
+		blockAtDoor(kCharacterAnna, 37);
+		getCharacter(kCharacterAnna).characterPosition.location = 1;
+
+		if (inComp(kCharacterCath, kCarRedSleeping, 4070) || inComp(kCharacterCath, kCarRedSleeping, 4455)) {
+			if (isNight()) {
+				playNIS(kEventCathTurningNight);
+			} else {
+				playNIS(kEventCathTurningDay);
+			}
+
+			playDialog(0, "BUMP", -1, 0);
+			bumpCathFDoor(37);
+		}
+
+		break;
+	case 17:
+		if (!_gameEvents[kEventAnnaTiredKiss] && nearChar(kCharacterCath, kCharacterAnna, 2000) && whoOnScreen(kCharacterAnna) &&
+			getCharacter(kCharacterAnna).characterPosition.position < getCharacter(kCharacterCath).characterPosition.position) {
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
+			AnnaCall(&LogicManager::CONS_Anna_SaveGame, 2, kEventAnnaTiredKiss, 0, 0);
+		}
+
+		break;
+	case 18:
+		if (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 1) {
+			playNIS(kEventAnnaTiredKiss);
+			bumpCath(kCarRestaurant, 29, 255);
+		}
+
+		break;
+	default:
+		break;
+	}
+}
+
+void LogicManager::CONS_Anna_DoWalkCathFollowsAnna(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_Anna_DoWalkCathFollowsAnna);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 72;
+
+	params->clear();
+
+	params->parameters[0] = param1.intParam;
+	params->parameters[1] = param2.intParam;
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_Anna_DoWalkCathFollowsAnna(HAND_PARAMS) {
+	switch (msg->action) {
+	case 0:
+		if (_gameEvents[kEventAnnaTired] || whoFacingCath(kCharacterAnna)) {
+			getCharacter(kCharacterAnna).inventoryItem = 0;
+		} else {
+			getCharacter(kCharacterAnna).inventoryItem = 0x80;
+		}
+
+		if (walk(kCharacterAnna, getCharacterCurrentParams(kCharacterAnna)[0], getCharacterCurrentParams(kCharacterAnna)[1])) {
+			getCharacter(kCharacterAnna).inventoryItem = 0;
+
+			getCharacter(kCharacterAnna).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterAnna, _functionsAnna[getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall]]);
+			fedEx(kCharacterAnna, kCharacterAnna, 18, 0);
+		}
+
+		break;
+	case 1:
+		getCharacter(kCharacterAnna).inventoryItem = 0;
+		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
+		AnnaCall(&LogicManager::CONS_Anna_SaveGame, 2, kEventAnnaTired, 0, 0);
+		break;
+	case 12:
+		if (walk(kCharacterAnna, getCharacterCurrentParams(kCharacterAnna)[0], getCharacterCurrentParams(kCharacterAnna)[1])) {
+			getCharacter(kCharacterAnna).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterAnna, _functionsAnna[getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall]]);
+			fedEx(kCharacterAnna, kCharacterAnna, 18, 0);
+		} else if (!_gameEvents[kEventAnnaTired]) {
+			getCharacter(kCharacterAnna).inventoryItem = 0x80;
+		}
+
+		break;
+	case 18:
+		if (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 1) {
+			playNIS(kEventAnnaTired);
+			if (getCharacter(kCharacterAnna).direction == 1)
+				bumpCathFx(getCharacter(kCharacterAnna).characterPosition.car, getCharacter(kCharacterAnna).characterPosition.position - 750);
+			else
+				bumpCathRx(getCharacter(kCharacterAnna).characterPosition.car, getCharacter(kCharacterAnna).characterPosition.position + 750);
+		}
+
+		break;
+	default:
+		break;
+	}
+}
+
+void LogicManager::CONS_Anna_LetDownHair(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_Anna_LetDownHair);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 73;
+
+	params->clear();
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_Anna_LetDownHair(HAND_PARAMS) {
+	switch (msg->action) {
+	case 0:
+		if (getCharacterCurrentParams(kCharacterAnna)[2] == 0x7FFFFFFF || getCharacterCurrentParams(kCharacterAnna)[0] >= _gameTime)
+			return;
+		if (getCharacterCurrentParams(kCharacterAnna)[1] < _gameTime)
+			goto LABEL_11;
+		if ((cathInCorridor(kCarGreenSleeping) || cathInCorridor(kCarRedSleeping)) && getCharacterCurrentParams(kCharacterAnna)[2] || (getCharacterCurrentParams(kCharacterAnna)[2] = _gameTime, _gameTime != 0)) {
+			if (getCharacterCurrentParams(kCharacterAnna)[2] >= _gameTime)
+				return;
+		LABEL_11:
+			getCharacterCurrentParams(kCharacterAnna)[2] = 0x7FFFFFFF;
+		}
+		if (!cathInCorridor(kCarGreenSleeping) && !cathInCorridor(kCarRedSleeping))
+			playDialog(0, "BUMP", -1, 0);
+		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
+		AnnaCall(&LogicManager::CONS_Anna_SaveGame, 2, kEventTrainHijacked, 0, 0);
+		break;
+	case 8:
+		setDoor(37, kCharacterAnna, 0, 0, 0);
+		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 2;
+		AnnaCall(&LogicManager::CONS_Anna_DoDialog, "LIB012", 0, 0, 0);
+		return;
+	case 9:
+		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 4;
+		AnnaCall(&LogicManager::CONS_Anna_SaveGame, 2, kEventAnnaKissTrainHijacked, 0, 0);
+		return;
+	case 12:
+		setDoor(37, kCharacterAnna, 0, 10, 9);
+		_gameTimeTicksDelta = 1;
+		getCharacterCurrentParams(kCharacterAnna)[0] = _gameTime + 4500;
+		getCharacterCurrentParams(kCharacterAnna)[1] = _gameTime + 9000;
+		return;
+	case 18:
+		switch (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8]) {
+		case 1:
+			playNIS(kEventTrainHijacked);
+			send(kCharacterAnna, kCharacterMaster, 139254416, 0);
+			break;
+		case 2:
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 3;
+			AnnaCall(&LogicManager::CONS_Anna_DoDialog, "Ann4200", 0, 0, 0);
+			break;
+		case 3:
+			setDoor(37, kCharacterAnna, 0, 10, 9);
+			break;
+		case 4:
+			playNIS(kEventAnnaKissTrainHijacked);
+			send(kCharacterAnna, kCharacterMaster, 139254416, 0);
+			break;
+		default:
+			return;
+		}
+		return;
+	default:
+		return;
+	}
+}
+
+void LogicManager::CONS_Anna_StartPart5(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_Anna_StartPart5);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 74;
+
+	params->clear();
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_Anna_StartPart5(HAND_PARAMS) {
+	if (msg->action) {
+		if (msg->action == 12) {
+			endGraphics(kCharacterAnna);
+			getCharacter(kCharacterAnna).characterPosition.car = 1;
+			getCharacter(kCharacterAnna).characterPosition.position = 3969;
+			getCharacter(kCharacterAnna).characterPosition.location = 1;
+			getCharacter(kCharacterAnna).clothes = 3;
+			getCharacter(kCharacterAnna).inventoryItem = 0;
+			setDoor(45, kCharacterCath, 0, 255, 255);
+		}
+	} else {
+		CONS_Anna_TiedUp(0, 0, 0, 0);
+	}
+}
+
+void LogicManager::CONS_Anna_TiedUp(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_Anna_TiedUp);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 75;
+
+	params->clear();
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_Anna_TiedUp(HAND_PARAMS) {
+	if (msg->action == 18) {
+		if (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 1) {
+			if (_gameProgress[kProgressFieldC]) {
+				if (_gameEvents[kEventAnnaKissTrainHijacked]) {
+					playNIS(kEventAnnaBaggageTies2);
+				} else {
+					playNIS(kEventAnnaBaggageTies);
+				}
+			} else if (_gameEvents[kEventAnnaKissTrainHijacked]) {
+				playNIS(kEventAnnaBaggageTies3);
+			} else {
+				playNIS(kEventAnnaBaggageTies4);
+			}
+
+			bumpCath(kCarBaggageRear, 88, 255);
+			CONS_Anna_Outside(0, 0, 0, 0);
+		}
+	} else if (msg->action == 272177921) {
+		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
+		AnnaCall(&LogicManager::CONS_Anna_SaveGame, 2, kEventAnnaBaggageTies, 0, 0);
+	}
+}
+
+void LogicManager::CONS_Anna_Outside(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_Anna_Outside);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 76;
+
+	params->clear();
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_Anna_Outside(HAND_PARAMS) {
+	if (msg->action == 158480160)
+		CONS_Anna_ReadyToScore(0, 0, 0, 0);
+}
+
+void LogicManager::CONS_Anna_ReadyToScore(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_Anna_ReadyToScore);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 77;
+
+	params->clear();
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_Anna_ReadyToScore(HAND_PARAMS) {
+	switch (msg->action) {
+	case 0:
+		if (_gameTime > 3645000 && !getCharacterCurrentParams(kCharacterAnna)[1]) {
+			getCharacterCurrentParams(kCharacterAnna)[1] = 1;
+			_gameTimeTicksDelta = 0;
+		}
+		break;
+	case 8:
+	case 9:
+		if (msg->action == 8) {
+			playDialog(0, "LIB012", -1, 0);
+		} else {
+			playDialog(0, "LIB014", -1, 0);
+		}
+
+		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 2;
+		AnnaCall(&LogicManager::CONS_Anna_SaveGame, 2, kEventAnnaDialogGoToJerusalem, 0, 0);
+		break;
+	case 12:
+		setDoor(106, kCharacterAnna, 1, 10, 9);
+		break;
+	case 17:
+		if (!getCharacterCurrentParams(kCharacterAnna)[0] && checkLoc(kCharacterCath, kCarBaggage)) {
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
+			AnnaCall(&LogicManager::CONS_Anna_SaveGame, 1, 0, 0, 0);
+		}
+		break;
+	case 18:
+		switch (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8]) {
+		case 1:
+			getCharacterCurrentParams(kCharacterAnna)[0] = 1;
+			break;
+		case 2:
+			setDoor(106, kCharacterCath, 0, 10, 9);
+			playNIS(kEventAnnaDialogGoToJerusalem);
+			_gameTime = 4914000;
+			_gameTimeTicksDelta = 0;
+			send(kCharacterAnna, kCharacterTatiana, 236060709, 0);
+			bumpCath(kCarBaggage, 97, 1);
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 3;
+			AnnaCall(&LogicManager::CONS_Anna_SaveGame, 1, 0, 0, 0);
+			break;
+		case 3:
+			CONS_Anna_Kidnapped(0, 0, 0, 0);
+			break;
+		}
+		break;
+	default:
+		return;
+	}
+}
+
+void LogicManager::CONS_Anna_Kidnapped(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_Anna_Kidnapped);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 78;
+
+	params->clear();
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_Anna_Kidnapped(HAND_PARAMS) {
+	if (msg->action == 17) {
+		if (inDiningRoom(kCharacterCath) && cathHasItem(kItemFirebird))
+			goto LABEL_6;
+		if (!inSalon(kCharacterCath))
+			return;
+		if (cathHasItem(kItemFirebird)) {
+		LABEL_6:
+			CONS_Anna_FinalSequence(0, 0, 0, 0);
+			return;
+		}
+
+		_gameTime = 4920300;
+		if (_gameInventory[18].location == 4) {
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 2;
+			AnnaCall(&LogicManager::CONS_Anna_SaveGame, 2, kEventKronosHostageAnna, 0, 0);
+		} else {
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
+			AnnaCall(&LogicManager::CONS_Anna_SaveGame, 2, kEventKronosHostageAnnaNoFirebird, 0, 0);
+		}
+	} else if (msg->action == 18) {
+		if (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 1) {
+			playNIS(kEventKronosHostageAnnaNoFirebird);
+			endGame(3, 42, 0, 1);
+		} else if (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 2) {
+			playNIS(kEventKronosHostageAnna);
+			bumpCath(kCarRestaurant, 61, 1);
+			playDialog(kCharacterAnna, "Mus024", 16, 0);
+			CONS_Anna_Waiting(0, 0, 0, 0);
+		}
+	}
+}
+
+void LogicManager::CONS_Anna_Waiting(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_Anna_Waiting);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 79;
+
+	params->clear();
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_Anna_Waiting(HAND_PARAMS) {
+	switch (msg->action) {
+	case 2:
+		_gameTime = 4923000;
+		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
+		AnnaCall(&LogicManager::CONS_Anna_SaveGame, 2, kEventKahinaPunchBaggageCarEntrance, 0, 0);
+		break;
+	case 17:
+		if (inDiningRoom(kCharacterCath) && cathHasItem(kItemFirebird)) {
+			CONS_Anna_FinalSequence(0, 0, 0, 0);
+		} else if (inSalon(kCharacterCath) && !_gameEvents[kEventKahinaPunch]) {
+			_gameTime = 4923000;
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 2;
+			AnnaCall(&LogicManager::CONS_Anna_SaveGame, 2, kEventKahinaPunch, 0, 0);
+		}
+		break;
+	case 18:
+		if (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 1) {
+			if (inSalon(kCharacterCath)) {
+				playNIS(kEventKahinaPunchSalon);
+			} else if (inDiningRoom(kCharacterCath)) {
+				playNIS(kEventKahinaPunchRestaurant);
+			} else if (inKitchen(kCharacterCath)) {
+				playNIS(kEventKahinaPunchKitchen);
+			} else if (inOffice(kCharacterCath)) {
+				playNIS(kEventKahinaPunchBaggageCarEntrance);
+			} else if (checkLoc(kCharacterCath, kCarBaggage)) {
+				playNIS(kEventKahinaPunchBaggageCar);
+			}
+			endGame(0, 1, 0, 1);
+		} else if (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 2) {
+			playNIS(kEventKahinaPunch);
+			endGame(0, 1, 0, 1);
+		}
+		break;
+	}
+}
+
+void LogicManager::CONS_Anna_FinalSequence(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_Anna_FinalSequence);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 80;
+
+	params->clear();
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_Anna_FinalSequence(HAND_PARAMS) {
+	if (msg->action > 12) {
+		if (msg->action == 18) {
+			switch (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8]) {
+			case 1:
+				if (whoRunningDialog(kCharacterAnna))
+					fadeDialog(kCharacterAnna);
+				playNIS(kEventKronosBringFirebird);
+				bumpCathCloseUp(kItemFirebird);
+				playDialog(1, "Mus025", 16, 0);
+				break;
+			case 2:
+				playNIS(kEventKahinaPunch);
+				endGame(0, 1, 0, 1);
+				break;
+			case 3:
+				_gameProgress[kProgressIsEggOpen] = 1;
+				if (whoRunningDialog(kCharacterAnna))
+					fadeDialog(kCharacterAnna);
+				playNIS(kEventKronosOpenFirebird);
+				bumpCath(kCarRestaurant, 3, 255);
+				CONS_Anna_OpenFirebird(0, 0, 0, 0);
+				break;
+			}
+		} else if (msg->action == 205294778) {
+			_gameTime = 4929300;
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 3;
+			AnnaCall(&LogicManager::CONS_Anna_SaveGame, 2, kEventKronosOpenFirebird, 0, 0);
+		}
+	} else if (msg->action == 12) {
+		_gameTime = 4923000;
+		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
+		AnnaCall(&LogicManager::CONS_Anna_SaveGame, 2, kEventKronosBringFirebird, 0, 0);
+	} else if (msg->action) {
+		if (msg->action == 2) {
+			playDialog(0, "Kro5002", 16, 0);
+			_gameTime = 4929300;
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 2;
+			AnnaCall(&LogicManager::CONS_Anna_SaveGame, 2, kEventKahinaPunch, 0, 0);
+		}
+	} else {
+		if (getCharacterCurrentParams(kCharacterAnna)[0] || (getCharacterCurrentParams(kCharacterAnna)[0] = _currentGameSessionTicks + 450, _currentGameSessionTicks != -450)) {
+			if (getCharacterCurrentParams(kCharacterAnna)[0] >= _currentGameSessionTicks)
+				return;
+
+			getCharacterCurrentParams(kCharacterAnna)[0] = 0x7FFFFFFF;
+		}
+
+		playDialog(0, "Kro5001", 16, 0);
+	}
+}
+
+void LogicManager::CONS_Anna_OpenFirebird(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_Anna_OpenFirebird);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 81;
+
+	params->clear();
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_Anna_OpenFirebird(HAND_PARAMS) {
+	if (msg->action > 18) {
+		if (msg->action == 224309120) {
+			_gameProgress[kProgressIsEggOpen] = 0;
+			_gameTime = 4941000;
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
+			AnnaCall(&LogicManager::CONS_Anna_SaveGame, 2, kEventKronosGiveFirebird, 0, 0);
+		} else if (msg->action == 270751616) {
+			_gameProgress[kProgressIsEggOpen] = 0;
+			killGracePeriod();
+			_gameTime = 4941000;
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 2;
+			AnnaCall(&LogicManager::CONS_Anna_SaveGame, 2, kEventFinalSequence, 0, 0);
+		}
+	} else if (msg->action == 18) {
+		if (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 1) {
+			playNIS(kEventCathCloseEggNoBackground);
+			playNIS(kEventKronosGiveFirebird);
+			if (cathHasItem(kItemWhistle)) {
+				endGame(0, 1, 53, true);
+			} else if (_gameInventory[kItemWhistle].location == 1) {
+				endGame(3, 208, 0, true);
+			} else {
+				endGame(3, 42, 54, true);
+			}
+		} else if (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 2) {
+			takeCathItem(kItemWhistle);
+			winGame();
+		}
+	} else if (msg->action == 0) {
+		if (getCharacterCurrentParams(kCharacterAnna)[0] || (getCharacterCurrentParams(kCharacterAnna)[0] = _currentGameSessionTicks + 180, _currentGameSessionTicks != -180)) {
+			if (getCharacterCurrentParams(kCharacterAnna)[0] >= _currentGameSessionTicks)
+				return;
+
+			getCharacterCurrentParams(kCharacterAnna)[0] = 0x7FFFFFFF;
+		}
+
+		playDialog(kCharacterClerk, "LIB069", 16, 0);
+		endGame(0, 0, 0, true);
+	}
+}
+
+void (LogicManager::*LogicManager::_functionsAnna[])(HAND_PARAMS) = {
+	nullptr,
+	&LogicManager::HAND_Anna_DebugWalks,
+	&LogicManager::HAND_Anna_DoSeqOtis,
+	&LogicManager::HAND_Anna_DoBlockSeqOtis,
+	&LogicManager::HAND_Anna_DoCorrOtis,
+	&LogicManager::HAND_Anna_FinishSeqOtis,
+	&LogicManager::HAND_Anna_DoJoinedSeqOtis,
+	&LogicManager::HAND_Anna_DoDialog,
+	&LogicManager::HAND_Anna_WaitRCClear,
+	&LogicManager::HAND_Anna_SaveGame,
+	&LogicManager::HAND_Anna_DoWalk,
+	&LogicManager::HAND_Anna_DoWait,
+	&LogicManager::HAND_Anna_PracticeMusic,
+	&LogicManager::HAND_Anna_DoComplexSeqOtis,
+	&LogicManager::HAND_Anna_DoWaitReal,
+	&LogicManager::HAND_Anna_CompLogic,
+	&LogicManager::HAND_Anna_Birth,
+	&LogicManager::HAND_Anna_DoWalkP1,
+	&LogicManager::HAND_Anna_DiningLogic,
+	&LogicManager::HAND_Anna_FleeTyler,
+	&LogicManager::HAND_Anna_WaitDinner,
+	&LogicManager::HAND_Anna_GoDinner,
+	&LogicManager::HAND_Anna_WaitHW,
+	&LogicManager::HAND_Anna_WaitingDinner,
+	&LogicManager::HAND_Anna_WaitingDinner2,
+	&LogicManager::HAND_Anna_EatingDinner,
+	&LogicManager::HAND_Anna_LeaveDinner,
+	&LogicManager::HAND_Anna_FreshenUp,
+	&LogicManager::HAND_Anna_GoSalon,
+	&LogicManager::HAND_Anna_WaitAugust,
+	&LogicManager::HAND_Anna_FlirtAugust,
+	&LogicManager::HAND_Anna_LeaveAugust,
+	&LogicManager::HAND_Anna_ReturnComp,
+	&LogicManager::HAND_Anna_ReadyForBed,
+	&LogicManager::HAND_Anna_Asleep,
+	&LogicManager::HAND_Anna_WakeNight,
+	&LogicManager::HAND_Anna_GoVassili,
+	&LogicManager::HAND_Anna_AtSeizure,
+	&LogicManager::HAND_Anna_SpeakTatiana,
+	&LogicManager::HAND_Anna_DoWalk1019,
+	&LogicManager::HAND_Anna_LeaveTatiana,
+	&LogicManager::HAND_Anna_GoBackToSleep,
+	&LogicManager::HAND_Anna_StartPart2,
+	&LogicManager::HAND_Anna_InPart2,
+	&LogicManager::HAND_Anna_StartPart3,
+	&LogicManager::HAND_Anna_ExitComp,
+	&LogicManager::HAND_Anna_Practicing,
+	&LogicManager::HAND_Anna_GoLunch,
+	&LogicManager::HAND_Anna_Lunch,
+	&LogicManager::HAND_Anna_DoOtis5026J,
+	&LogicManager::HAND_Anna_LeaveLunch,
+	&LogicManager::HAND_Anna_AfterLunch,
+	&LogicManager::HAND_Anna_ReturnComp3,
+	&LogicManager::HAND_Anna_Dressing,
+	&LogicManager::HAND_Anna_GiveMaxToCond2,
+	&LogicManager::HAND_Anna_GoConcert,
+	&LogicManager::HAND_Anna_Concert,
+	&LogicManager::HAND_Anna_LeaveConcert,
+	&LogicManager::HAND_Anna_LeaveConcertCathInComp,
+	&LogicManager::HAND_Anna_AfterConcert,
+	&LogicManager::HAND_Anna_GiveMaxBack,
+	&LogicManager::HAND_Anna_GoBagg,
+	&LogicManager::HAND_Anna_InBagg,
+	&LogicManager::HAND_Anna_DeadBagg,
+	&LogicManager::HAND_Anna_BaggageFight,
+	&LogicManager::HAND_Anna_PrepareVienna,
+	&LogicManager::HAND_Anna_StartPart4,
+	&LogicManager::HAND_Anna_Reading,
+	&LogicManager::HAND_Anna_Sulking,
+	&LogicManager::HAND_Anna_GoSalon4,
+	&LogicManager::HAND_Anna_ReturnToComp4,
+	&LogicManager::HAND_Anna_EnterCompCathFollowsAnna,
+	&LogicManager::HAND_Anna_DoWalkCathFollowsAnna,
+	&LogicManager::HAND_Anna_LetDownHair,
+	&LogicManager::HAND_Anna_StartPart5,
+	&LogicManager::HAND_Anna_TiedUp,
+	&LogicManager::HAND_Anna_Outside,
+	&LogicManager::HAND_Anna_ReadyToScore,
+	&LogicManager::HAND_Anna_Kidnapped,
+	&LogicManager::HAND_Anna_Waiting,
+	&LogicManager::HAND_Anna_FinalSequence,
+	&LogicManager::HAND_Anna_OpenFirebird
+};
+
+} // End of namespace LastExpress
diff --git a/engines/lastexpress/characters/august.cpp b/engines/lastexpress/characters/august.cpp
new file mode 100644
index 00000000000..2523d0823c0
--- /dev/null
+++ b/engines/lastexpress/characters/august.cpp
@@ -0,0 +1,3928 @@
+/* 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 3 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, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "lastexpress/lastexpress.h"
+
+namespace LastExpress {
+
+void LogicManager::CONS_August(int chapter) {
+	switch (chapter) {
+	case 0:
+		_engine->getMessageManager()->setMessageHandle(
+			kCharacterAugust,
+			_functionsAugust[getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall]]
+		);
+
+		break;
+	case 1:
+		CONS_August_Birth(0, 0, 0, 0);
+		break;
+	case 2:
+		CONS_August_StartPart2(0, 0, 0, 0);
+		break;
+	case 3:
+		CONS_August_StartPart3(0, 0, 0, 0);
+		break;
+	case 4:
+		CONS_August_StartPart4(0, 0, 0, 0);
+		break;
+	case 5:
+		CONS_August_StartPart5(0, 0, 0, 0);
+		break;
+	default:
+		return;
+	}
+}
+
+void LogicManager::AugustCall(CALL_PARAMS) {
+	getCharacter(kCharacterAugust).currentCall++;
+
+	(this->*functionPointer)(param1, param2, param3, param4);
+}
+
+void LogicManager::CONS_August_DebugWalks(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAugust).callParams[getCharacter(kCharacterAugust).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAugust, &LogicManager::HAND_August_DebugWalks);
+	getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall] = 1;
+
+	params->clear();
+
+	fedEx(kCharacterAugust, kCharacterAugust, 12, 0);
+}
+
+void LogicManager::HAND_August_DebugWalks(HAND_PARAMS) {
+	if (msg->action) {
+		if (msg->action == 1) {
+			getCharacter(kCharacterAugust).clothes++;
+			if (getCharacter(kCharacterAugust).clothes > 2)
+				getCharacter(kCharacterAugust).clothes = 0;
+		} else if (msg->action == 12) {
+			getCharacter(kCharacterAugust).characterPosition.position = 0;
+			getCharacter(kCharacterAugust).characterPosition.location = 0;
+			getCharacter(kCharacterAugust).characterPosition.car = kCarGreenSleeping;
+			getCharacter(kCharacterAugust).inventoryItem = kItemInvalid;
+			getCharacterCurrentParams(kCharacterAugust)[0] = 10000;
+		}
+	} else if (walk(kCharacterAugust, kCarGreenSleeping, getCharacterCurrentParams(kCharacterAugust)[0])) {
+		if (getCharacterCurrentParams(kCharacterAugust)[0] == 10000) {
+			getCharacterCurrentParams(kCharacterAugust)[0] = 0;
+		} else {
+			getCharacterCurrentParams(kCharacterAugust)[0] = 10000;
+		}
+	}
+}
+
+void LogicManager::CONS_August_DoWait(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAugust).callParams[getCharacter(kCharacterAugust).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAugust, &LogicManager::HAND_August_DoWait);
+	getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall] = 2;
+
+	params->clear();
+
+	params->parameters[0] = param1.intParam;
+
+	fedEx(kCharacterAugust, kCharacterAugust, 12, 0);
+}
+
+void LogicManager::HAND_August_DoWait(HAND_PARAMS) {
+	if (msg->action == 0) {
+		if (getCharacterCurrentParams(kCharacterAugust)[1] ||
+			(getCharacterCurrentParams(kCharacterAugust)[1] = _gameTime + getCharacterCurrentParams(kCharacterAugust)[0], _gameTime + getCharacterCurrentParams(kCharacterAugust)[0] != 0)) {
+			if (getCharacterCurrentParams(kCharacterAugust)[1] >= _gameTime)
+				return;
+
+			getCharacterCurrentParams(kCharacterAugust)[1] = 0x7FFFFFFF;
+		}
+
+		getCharacter(kCharacterAugust).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterAugust, _functionsAugust[getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall]]);
+		fedEx(kCharacterAugust, kCharacterAugust, 18, 0);
+	}
+}
+
+void LogicManager::CONS_August_DoSeqOtis(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAugust).callParams[getCharacter(kCharacterAugust).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAugust, &LogicManager::HAND_August_DoSeqOtis);
+	getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall] = 3;
+
+	params->clear();
+
+	strncpy((char *)&params->parameters[0], param1.stringParam, 12);
+
+	fedEx(kCharacterAugust, kCharacterAugust, 12, 0);
+}
+
+void LogicManager::HAND_August_DoSeqOtis(HAND_PARAMS) {
+	if (msg->action == 3) {
+		getCharacter(kCharacterAugust).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterAugust, _functionsAugust[getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall]]);
+		fedEx(kCharacterAugust, kCharacterAugust, 18, 0);
+	} else if (msg->action == 12) {
+		startSeqOtis(kCharacterAugust, (char *)&getCharacterCurrentParams(kCharacterAugust)[0]);
+	}
+}
+
+void LogicManager::CONS_August_DoBlockSeqOtis(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAugust).callParams[getCharacter(kCharacterAugust).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAugust, &LogicManager::HAND_August_DoBlockSeqOtis);
+	getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall] = 4;
+
+	params->clear();
+
+	strncpy((char *)&params->parameters[0], param1.stringParam, 12);
+
+	params->parameters[3] = param2.intParam;
+	params->parameters[4] = param3.intParam;
+
+	fedEx(kCharacterAugust, kCharacterAugust, 12, 0);
+}
+
+void LogicManager::HAND_August_DoBlockSeqOtis(HAND_PARAMS) {
+	if (msg->action == 3) {
+		releaseView(kCharacterAugust, getCharacterCurrentParams(kCharacterAugust)[3], getCharacterCurrentParams(kCharacterAugust)[4]);
+


Commit: 787c013e038fcc3445bf216e971a582e130c7663
    https://github.com/scummvm/scummvm/commit/787c013e038fcc3445bf216e971a582e130c7663
Author: AndywinXp (andywinxp at gmail.com)
Date: 2025-06-16T23:12:18+02:00

Commit Message:
LASTEXPRESS: Add support for demo

Changed paths:
  A engines/lastexpress/characters/demo/demo_abbot.cpp
  A engines/lastexpress/characters/demo/demo_anna.cpp
  A engines/lastexpress/characters/demo/demo_august.cpp
  A engines/lastexpress/characters/demo/demo_cond2.cpp
  A engines/lastexpress/characters/demo/demo_francois.cpp
  A engines/lastexpress/characters/demo/demo_ivo.cpp
  A engines/lastexpress/characters/demo/demo_madame.cpp
  A engines/lastexpress/characters/demo/demo_master.cpp
  A engines/lastexpress/characters/demo/demo_monsieur.cpp
  A engines/lastexpress/characters/demo/demo_rebecca.cpp
  A engines/lastexpress/characters/demo/demo_tablea.cpp
  A engines/lastexpress/characters/demo/demo_tableb.cpp
  A engines/lastexpress/characters/demo/demo_tablec.cpp
  A engines/lastexpress/characters/demo/demo_tabled.cpp
  A engines/lastexpress/characters/demo/demo_tablee.cpp
  A engines/lastexpress/characters/demo/demo_tablef.cpp
  A engines/lastexpress/characters/demo/demo_tatiana.cpp
  A engines/lastexpress/characters/demo/demo_vesna.cpp
  A engines/lastexpress/characters/demo/demo_waiter1.cpp
    engines/lastexpress/characters/abbot.cpp
    engines/lastexpress/characters/anna.cpp
    engines/lastexpress/characters/august.cpp
    engines/lastexpress/characters/francois.cpp
    engines/lastexpress/characters/ivo.cpp
    engines/lastexpress/characters/master.cpp
    engines/lastexpress/characters/vesna.cpp
    engines/lastexpress/data/archive.cpp
    engines/lastexpress/debug.cpp
    engines/lastexpress/detection.cpp
    engines/lastexpress/fight/opponent_vesna1.cpp
    engines/lastexpress/game/action.cpp
    engines/lastexpress/game/credits.cpp
    engines/lastexpress/game/events.cpp
    engines/lastexpress/game/logic.cpp
    engines/lastexpress/game/logic.h
    engines/lastexpress/game/navigation.cpp
    engines/lastexpress/game/savegame.cpp
    engines/lastexpress/game/vcr.cpp
    engines/lastexpress/graphics.cpp
    engines/lastexpress/lastexpress.cpp
    engines/lastexpress/lastexpress.h
    engines/lastexpress/menu/menu.cpp
    engines/lastexpress/menu/menu.h
    engines/lastexpress/module.mk
    engines/lastexpress/sound/sound.cpp


diff --git a/engines/lastexpress/characters/abbot.cpp b/engines/lastexpress/characters/abbot.cpp
index 5f6c32284c0..50e75ec1a0f 100644
--- a/engines/lastexpress/characters/abbot.cpp
+++ b/engines/lastexpress/characters/abbot.cpp
@@ -1422,7 +1422,7 @@ void LogicManager::HAND_Abbot_InSalon3(HAND_PARAMS) {
 			playDialog(kCharacterAbbot, "Abb3040", -1, 45);
 			blockView(kCharacterAbbot, kCarRestaurant, 57);
 			getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 3;
-			AbbotCall(&LogicManager::CONS_Abbot_DoJoinedSeqOtis, "121A", 2, 122358304u, "BOGUS");
+			AbbotCall(&LogicManager::CONS_Abbot_DoJoinedSeqOtis, "121A", 2, 122358304, "BOGUS");
 			break;
 		case 3:
 			releaseView(kCharacterAbbot, kCarRestaurant, 57);
@@ -1430,8 +1430,12 @@ void LogicManager::HAND_Abbot_InSalon3(HAND_PARAMS) {
 			getCharacter(kCharacterAbbot).characterPosition.location = 1;
 			CONS_Abbot_WithAugust(0, 0, 0, 0);
 			break;
+		default:
+			break;
 		}
 
+		break;
+	default:
 		break;
 	}
 }
diff --git a/engines/lastexpress/characters/anna.cpp b/engines/lastexpress/characters/anna.cpp
index a24fbaccef0..2832b0b19ac 100644
--- a/engines/lastexpress/characters/anna.cpp
+++ b/engines/lastexpress/characters/anna.cpp
@@ -176,12 +176,12 @@ void LogicManager::CONS_Anna_FinishSeqOtis(CONS_PARAMS) {
 
 void LogicManager::HAND_Anna_FinishSeqOtis(HAND_PARAMS) {
 	if (msg->action == 0) {
-		if (getCharacter(kCharacterAnna).direction == 4)
-			return;
-		goto LABEL_5;
-	}
-	if (msg->action == 3) {
-	LABEL_5:
+		if (getCharacter(kCharacterAnna).direction != 4) {
+			getCharacter(kCharacterAnna).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterAnna, _functionsAnna[getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall]]);
+			fedEx(kCharacterAnna, kCharacterAnna, 18, 0);
+		}
+	} else if (msg->action == 3) {
 		getCharacter(kCharacterAnna).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterAnna, _functionsAnna[getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall]]);
 		fedEx(kCharacterAnna, kCharacterAnna, 18, 0);
@@ -262,12 +262,12 @@ void LogicManager::CONS_Anna_WaitRCClear(CONS_PARAMS) {
 
 void LogicManager::HAND_Anna_WaitRCClear(HAND_PARAMS) {
 	if (msg->action == 0) {
-		if (!rcClear())
-			return;
-		goto LABEL_7;
-	}
-	if (msg->action == 12 && rcClear()) {
-	LABEL_7:
+		if (rcClear()) {
+			getCharacter(kCharacterAnna).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterAnna, _functionsAnna[getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall]]);
+			fedEx(kCharacterAnna, kCharacterAnna, 18, 0);
+		}
+	} else if (msg->action == 12 && rcClear()) {
 		getCharacter(kCharacterAnna).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterAnna, _functionsAnna[getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall]]);
 		fedEx(kCharacterAnna, kCharacterAnna, 18, 0);
@@ -291,7 +291,7 @@ void LogicManager::HAND_Anna_SaveGame(HAND_PARAMS) {
 	if (msg->action) {
 		if (msg->action == 12) {
 			save(
-				1,
+				kCharacterAnna,
 				getCharacterCurrentParams(kCharacterAnna)[0],
 				getCharacterCurrentParams(kCharacterAnna)[1]
 			);
@@ -323,8 +323,13 @@ void LogicManager::CONS_Anna_DoWalk(CONS_PARAMS) {
 void LogicManager::HAND_Anna_DoWalk(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
-		if (walk(kCharacterAnna, getCharacterCurrentParams(kCharacterAnna)[0], getCharacterCurrentParams(kCharacterAnna)[1]))
-			goto LABEL_12;
+	case 12:
+		if (walk(kCharacterAnna, getCharacterCurrentParams(kCharacterAnna)[0], getCharacterCurrentParams(kCharacterAnna)[1])) {
+			getCharacter(kCharacterAnna).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterAnna, _functionsAnna[getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall]]);
+			fedEx(kCharacterAnna, kCharacterAnna, 18, 0);
+		}
+
 		break;
 	case 5:
 		if (_gameEvents[kEventAugustPresentAnna] || _gameEvents[kEventAugustPresentAnnaFirstIntroduction] || _gameProgress[kProgressChapter] >= 2) {
@@ -332,18 +337,11 @@ void LogicManager::HAND_Anna_DoWalk(HAND_PARAMS) {
 		} else {
 			playCathExcuseMe();
 		}
+
 		break;
 	case 6:
 		playChrExcuseMe(kCharacterAnna, kCharacterCath, 0);
 		break;
-	case 12:
-		if (walk(kCharacterAnna, getCharacterCurrentParams(kCharacterAnna)[0], getCharacterCurrentParams(kCharacterAnna)[1])) {
-		LABEL_12:
-			getCharacter(kCharacterAnna).currentCall--;
-			_engine->getMessageManager()->setMessageHandle(kCharacterAnna, _functionsAnna[getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall]]);
-			fedEx(kCharacterAnna, kCharacterAnna, 18, 0);
-		}
-		break;
 	default:
 		return;
 	}
@@ -3429,6 +3427,8 @@ void LogicManager::HAND_Anna_DeadBagg(HAND_PARAMS) {
 		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
 		AnnaCall(&LogicManager::CONS_Anna_SaveGame, 2, kEventAnnaKilled, 0, 0);
 		break;
+	default:
+		break;
 	}
 }
 
@@ -3472,6 +3472,8 @@ void LogicManager::HAND_Anna_BaggageFight(HAND_PARAMS) {
 			_gameTime = 2266200;
 			CONS_Anna_PrepareVienna(0, 0, 0, 0);
 			break;
+		default:
+			break;
 		}
 	}
 }
diff --git a/engines/lastexpress/characters/august.cpp b/engines/lastexpress/characters/august.cpp
index 2523d0823c0..f4faa34d82d 100644
--- a/engines/lastexpress/characters/august.cpp
+++ b/engines/lastexpress/characters/august.cpp
@@ -468,7 +468,7 @@ void LogicManager::HAND_August_SaveGame(HAND_PARAMS) {
 	if (msg->action) {
 		if (msg->action == 12) {
 			save(
-				2,
+				kCharacterAugust,
 				getCharacterCurrentParams(kCharacterAugust)[0],
 				getCharacterCurrentParams(kCharacterAugust)[1]
 			);
diff --git a/engines/lastexpress/characters/demo/demo_abbot.cpp b/engines/lastexpress/characters/demo/demo_abbot.cpp
new file mode 100644
index 00000000000..24babf5281b
--- /dev/null
+++ b/engines/lastexpress/characters/demo/demo_abbot.cpp
@@ -0,0 +1,303 @@
+/* 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 3 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, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "lastexpress/lastexpress.h"
+
+namespace LastExpress {
+void LogicManager::CONS_DemoAbbot(int chapter) {
+	switch (chapter) {
+	case 0:
+		_engine->getMessageManager()->setMessageHandle(
+			kCharacterAbbot,
+			_functionsDemoAbbot[getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall]]
+		);
+
+		break;
+	case 1:
+		CONS_DemoAbbot_Birth(0, 0, 0, 0);
+		break;
+	case 2:
+		CONS_DemoAbbot_StartPart2(0, 0, 0, 0);
+		break;
+	case 3:
+		CONS_DemoAbbot_StartPart3(0, 0, 0, 0);
+		break;
+	case 4:
+		CONS_DemoAbbot_StartPart4(0, 0, 0, 0);
+		break;
+	case 5:
+		CONS_DemoAbbot_StartPart5(0, 0, 0, 0);
+		break;
+	default:
+		break;
+	}
+}
+
+void LogicManager::DemoAbbotCall(CALL_PARAMS) {
+	getCharacter(kCharacterAbbot).currentCall++;
+
+	(this->*functionPointer)(param1, param2, param3, param4);
+}
+
+void LogicManager::CONS_DemoAbbot_DoWait(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAbbot).callParams[getCharacter(kCharacterAbbot).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, &LogicManager::HAND_DemoAbbot_DoWait);
+	getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall] = 1;
+
+	params->clear();
+
+	params->parameters[0] = param1.intParam;
+
+	fedEx(kCharacterAbbot, kCharacterAbbot, 12, 0);
+}
+
+void LogicManager::HAND_DemoAbbot_DoWait(HAND_PARAMS) {
+	switch (msg->action) {
+	case 0:
+		if (getCharacterCurrentParams(kCharacterAbbot)[1]) {
+			if (getCharacterCurrentParams(kCharacterAbbot)[1] >= _gameTime)
+				return;
+
+			getCharacterCurrentParams(kCharacterAbbot)[1] = 0x7FFFFFFF;
+		} else {
+			getCharacterCurrentParams(kCharacterAbbot)[1] = _gameTime + getCharacterCurrentParams(kCharacterAbbot)[0];
+
+			if (_gameTime + getCharacterCurrentParams(kCharacterAbbot)[0] == 0)
+				return;
+
+			if (_gameTime <= getCharacterCurrentParams(kCharacterAbbot)[1])
+				return;
+
+			getCharacterCurrentParams(kCharacterAbbot)[1] = 0x7FFFFFFF;
+		}
+
+		getCharacter(kCharacterAbbot).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, _functionsDemoAbbot[getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall]]);
+
+		fedEx(kCharacterAbbot, kCharacterAbbot, 18, 0);
+		break;
+	default:
+		break;
+	}
+}
+
+void LogicManager::CONS_DemoAbbot_DoJoinedSeqOtis(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAbbot).callParams[getCharacter(kCharacterAbbot).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, &LogicManager::HAND_DemoAbbot_DoJoinedSeqOtis);
+	getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall] = 2;
+
+	params->clear();
+
+	strncpy((char *)&params->parameters[0], param1.stringParam, 12);
+
+	params->parameters[3] = param2.intParam;
+	params->parameters[4] = param3.intParam;
+
+	strncpy((char *)&params->parameters[5], param4.stringParam, 12);
+
+	fedEx(kCharacterAbbot, kCharacterAbbot, 12, 0);
+}
+
+void LogicManager::HAND_DemoAbbot_DoJoinedSeqOtis(HAND_PARAMS) {
+	switch (msg->action) {
+	case 3:
+		if (!getCharacterCurrentParams(kCharacterAbbot)[8])
+			fedEx(kCharacterAbbot, getCharacterCurrentParams(kCharacterAbbot)[3], getCharacterCurrentParams(kCharacterAbbot)[4], getCharacterCurrentParams(kCharacterAbbot)[5]);
+
+		getCharacter(kCharacterAbbot).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, _functionsDemoAbbot[getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall]]);
+		fedEx(kCharacterAbbot, kCharacterAbbot, 18, 0);
+
+		break;
+	case 10:
+		if (!getCharacterCurrentParams(kCharacterAbbot)[8]) {
+			fedEx(kCharacterAbbot, getCharacterCurrentParams(kCharacterAbbot)[3], getCharacterCurrentParams(kCharacterAbbot)[4], getCharacterCurrentParams(kCharacterAbbot)[5]);
+			getCharacterCurrentParams(kCharacterAbbot)[8] = 1;
+		}
+
+		break;
+	case 12:
+		startSeqOtis(kCharacterAbbot, (char *)&getCharacterCurrentParams(kCharacterAbbot));
+		break;
+	default:
+		break;
+	}
+}
+
+void LogicManager::CONS_DemoAbbot_WaitRCClear(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAbbot).callParams[getCharacter(kCharacterAbbot).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, &LogicManager::HAND_DemoAbbot_WaitRCClear);
+	getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall] = 3;
+
+	params->clear();
+
+	fedEx(kCharacterAbbot, kCharacterAbbot, 12, 0);
+}
+
+void LogicManager::HAND_DemoAbbot_WaitRCClear(HAND_PARAMS) {
+	if ((msg->action == 12 && rcClear()) || (msg->action == 0 && rcClear())) {
+		getCharacter(kCharacterAbbot).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, _functionsDemoAbbot[getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall]]);
+
+		fedEx(kCharacterAbbot, kCharacterAbbot, 18, 0);
+	}
+}
+
+void LogicManager::CONS_DemoAbbot_Birth(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAbbot).callParams[getCharacter(kCharacterAbbot).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, &LogicManager::HAND_DemoAbbot_Birth);
+	getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall] = 4;
+
+	params->clear();
+
+	fedEx(kCharacterAbbot, kCharacterAbbot, 12, 0);
+}
+
+void LogicManager::HAND_DemoAbbot_Birth(HAND_PARAMS) {
+	switch (msg->action) {
+	case 0:
+		if (getCharacterCurrentParams(kCharacterAbbot)[0] == 0x7FFFFFFF || _gameTime <= 2248200)
+			return;
+
+		if (_gameTime <= 2259000) {
+			if (!inSalon(kCharacterCath) || !getCharacterCurrentParams(kCharacterAbbot)[0]) {
+				getCharacterCurrentParams(kCharacterAbbot)[0] = _gameTime + 225;
+				if (_gameTime == -225) {
+					send(kCharacterAbbot, kCharacterAugust, 136196244, 0);
+					getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 1;
+					AbbotCall(&LogicManager::CONS_DemoAbbot_DoWait, 0, 0, 0, 0);
+					return;
+				}
+			}
+
+			if (getCharacterCurrentParams(kCharacterAbbot)[0] >= _gameTime)
+				return;
+		}
+
+		getCharacterCurrentParams(kCharacterAbbot)[0] = 0x7FFFFFFF;
+		send(kCharacterAbbot, kCharacterAugust, 136196244, 0);
+		getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 1;
+		AbbotCall(&LogicManager::CONS_DemoAbbot_DoWait, 0, 0, 0, 0);
+
+		break;
+	case 12:
+		getCharacter(kCharacterAbbot).characterPosition.car = kCarRestaurant;
+		getCharacter(kCharacterAbbot).characterPosition.position = 3450;
+		getCharacter(kCharacterAbbot).characterPosition.location = 1;
+		startCycOtis(kCharacterAbbot, "115B");
+		break;
+	case 18:
+		switch (getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8]) {
+		case 1:
+			getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 2;
+			AbbotCall(&LogicManager::CONS_DemoAbbot_WaitRCClear, 0, 0, 0, 0);
+			break;
+		case 2:
+			getCharacter(kCharacterAbbot).characterPosition.location = 0;
+			playDialog(kCharacterAbbot, "Abb3demo", -1, 45);
+			blockView(kCharacterAbbot, kCarRestaurant, 50);
+			getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 3;
+			AbbotCall(&LogicManager::CONS_DemoAbbot_DoJoinedSeqOtis, "121A", 2, 122358304, "BOGUS");
+			break;
+		case 3:
+			releaseView(kCharacterAbbot, kCarRestaurant, 50);
+			getCharacter(kCharacterAbbot).characterPosition.location = 1;
+			startCycOtis(kCharacterAbbot, "121B");
+			break;
+		default:
+			break;
+		}
+
+		break;
+	default:
+		break;
+	}
+}
+
+void LogicManager::CONS_DemoAbbot_StartPart2(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAbbot).callParams[getCharacter(kCharacterAbbot).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, &LogicManager::HAND_DemoAbbot_StartPart2);
+	getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall] = 5;
+
+	params->clear();
+
+	fedEx(kCharacterAbbot, kCharacterAbbot, 12, 0);
+}
+
+void LogicManager::HAND_DemoAbbot_StartPart2(HAND_PARAMS) {
+	// No-op
+}
+
+void LogicManager::CONS_DemoAbbot_StartPart3(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAbbot).callParams[getCharacter(kCharacterAbbot).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, &LogicManager::HAND_DemoAbbot_StartPart3);
+	getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall] = 6;
+
+	params->clear();
+
+	fedEx(kCharacterAbbot, kCharacterAbbot, 12, 0);
+}
+
+void LogicManager::HAND_DemoAbbot_StartPart3(HAND_PARAMS) {
+	// No-op
+}
+
+void LogicManager::CONS_DemoAbbot_StartPart4(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAbbot).callParams[getCharacter(kCharacterAbbot).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, &LogicManager::HAND_DemoAbbot_StartPart4);
+	getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall] = 7;
+
+	params->clear();
+
+	fedEx(kCharacterAbbot, kCharacterAbbot, 12, 0);
+}
+
+void LogicManager::HAND_DemoAbbot_StartPart4(HAND_PARAMS) {
+	// No-op
+}
+
+void LogicManager::CONS_DemoAbbot_StartPart5(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAbbot).callParams[getCharacter(kCharacterAbbot).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, &LogicManager::HAND_DemoAbbot_StartPart5);
+	getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall] = 8;
+
+	params->clear();
+
+	fedEx(kCharacterAbbot, kCharacterAbbot, 12, 0);
+}
+
+void LogicManager::HAND_DemoAbbot_StartPart5(HAND_PARAMS) {
+	// No-op
+}
+
+void (LogicManager::*LogicManager::_functionsDemoAbbot[])(HAND_PARAMS) = {
+	nullptr,
+	&LogicManager::HAND_DemoAbbot_DoWait,
+	&LogicManager::HAND_DemoAbbot_DoJoinedSeqOtis,
+	&LogicManager::HAND_DemoAbbot_WaitRCClear,
+	&LogicManager::HAND_DemoAbbot_Birth,
+	&LogicManager::HAND_DemoAbbot_StartPart2,
+	&LogicManager::HAND_DemoAbbot_StartPart3,
+	&LogicManager::HAND_DemoAbbot_StartPart4,
+	&LogicManager::HAND_DemoAbbot_StartPart5
+};
+
+} // End of namespace LastExpress
diff --git a/engines/lastexpress/characters/demo/demo_anna.cpp b/engines/lastexpress/characters/demo/demo_anna.cpp
new file mode 100644
index 00000000000..69432afbd13
--- /dev/null
+++ b/engines/lastexpress/characters/demo/demo_anna.cpp
@@ -0,0 +1,513 @@
+/* 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 3 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, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "lastexpress/lastexpress.h"
+
+namespace LastExpress {
+
+void LogicManager::CONS_DemoAnna(int chapter) {
+	switch (chapter) {
+	case 0:
+		_engine->getMessageManager()->setMessageHandle(
+			kCharacterAnna,
+			_functionsDemoAnna[getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall]]);
+
+		break;
+	case 1:
+		CONS_DemoAnna_Birth(0, 0, 0, 0);
+		break;
+	case 2:
+		CONS_DemoAnna_StartPart2(0, 0, 0, 0);
+		break;
+	case 3:
+		CONS_DemoAnna_StartPart3(0, 0, 0, 0);
+		break;
+	case 4:
+		CONS_DemoAnna_StartPart4(0, 0, 0, 0);
+		break;
+	case 5:
+		CONS_DemoAnna_StartPart5(0, 0, 0, 0);
+		break;
+	default:
+		break;
+	}
+}
+
+void LogicManager::DemoAnnaCall(CALL_PARAMS) {
+	getCharacter(kCharacterAnna).currentCall++;
+
+	(this->*functionPointer)(param1, param2, param3, param4);
+}
+
+void LogicManager::CONS_DemoAnna_DoSeqOtis(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_DemoAnna_DoSeqOtis);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 1;
+
+	params->clear();
+
+	strncpy((char *)&params->parameters[0], param1.stringParam, 12);
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_DemoAnna_DoSeqOtis(HAND_PARAMS) {
+	switch (msg->action) {
+	case 3:
+		getCharacter(kCharacterAnna).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterAnna, _functionsDemoAnna[getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall]]);
+		fedEx(kCharacterAnna, kCharacterAnna, 18, 0);
+		break;
+	case 12:
+		startSeqOtis(kCharacterAnna, (char *)&getCharacterCurrentParams(kCharacterAnna)[0]);
+		break;
+	default:
+		break;
+	}
+}
+
+void LogicManager::CONS_DemoAnna_FinishSeqOtis(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_DemoAnna_FinishSeqOtis);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 2;
+
+	params->clear();
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_DemoAnna_FinishSeqOtis(HAND_PARAMS) {
+	if (msg->action == 3) {
+		getCharacter(kCharacterAnna).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterAnna, _functionsDemoAnna[getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall]]);
+		fedEx(kCharacterAnna, kCharacterAnna, 18, 0);
+	}
+}
+
+void LogicManager::CONS_DemoAnna_DoCorrOtis(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_DemoAnna_DoCorrOtis);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 3;
+
+	params->clear();
+
+	strncpy((char *)&params->parameters[0], param1.stringParam, 12);
+
+	params->parameters[3] = param2.intParam;
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_DemoAnna_DoCorrOtis(HAND_PARAMS) {
+	switch (msg->action) {
+	case 3:
+		releaseAtDoor(kCharacterAnna, getCharacterCurrentParams(kCharacterAnna)[3]);
+		getCharacter(kCharacterAnna).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterAnna, _functionsDemoAnna[getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall]]);
+		fedEx(kCharacterAnna, kCharacterAnna, 18, 0);
+		break;
+	case 12:
+		startSeqOtis(kCharacterAnna, (char *)&getCharacterCurrentParams(kCharacterAnna)[0]);
+		blockAtDoor(kCharacterAnna, getCharacterCurrentParams(kCharacterAnna)[3]);
+		break;
+	default:
+		break;
+	}
+}
+
+void LogicManager::CONS_DemoAnna_WaitRCClear(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_DemoAnna_WaitRCClear);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 4;
+
+	params->clear();
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_DemoAnna_WaitRCClear(HAND_PARAMS) {
+	if ((msg->action == 0 && rcClear()) && (msg->action == 12 && rcClear())) {
+		getCharacter(kCharacterAnna).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterAnna, _functionsDemoAnna[getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall]]);
+		fedEx(kCharacterAnna, kCharacterAnna, 18, 0);
+	}
+}
+
+void LogicManager::CONS_DemoAnna_SaveGame(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_DemoAnna_SaveGame);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 5;
+
+	params->clear();
+
+	params->parameters[0] = param1.intParam;
+	params->parameters[1] = param2.intParam;
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_DemoAnna_SaveGame(HAND_PARAMS) {
+	switch (msg->action) {
+	case 0:
+		getCharacter(kCharacterAnna).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterAnna, _functionsDemoAnna[getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall]]);
+		fedEx(kCharacterAnna, kCharacterAnna, 18, 0);
+		break;
+	case 12:
+		save(
+			kCharacterAnna,
+			getCharacterCurrentParams(kCharacterAnna)[0],
+			getCharacterCurrentParams(kCharacterAnna)[1]
+		);
+
+		getCharacter(kCharacterAnna).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterAnna, _functionsDemoAnna[getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall]]);
+		fedEx(kCharacterAnna, kCharacterAnna, 18, 0);
+		break;
+	default:
+		break;
+	}
+}
+
+void LogicManager::CONS_DemoAnna_DoWalk(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_DemoAnna_DoWalk);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 6;
+
+	params->clear();
+
+	params->parameters[0] = param1.intParam;
+	params->parameters[1] = param2.intParam;
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_DemoAnna_DoWalk(HAND_PARAMS) {
+	switch (msg->action) {
+	case 0:
+	case 12:
+		if (walk(kCharacterAnna, getCharacterCurrentParams(kCharacterAnna)[0], getCharacterCurrentParams(kCharacterAnna)[1])) {
+			getCharacter(kCharacterAnna).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterAnna, _functionsDemoAnna[getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall]]);
+			fedEx(kCharacterAnna, kCharacterAnna, 18, 0);
+		}
+
+		break;
+	case 5:
+		playDialog(kCharacterCath, "CAT1001", -1, 0);
+		break;
+	case 6:
+		playChrExcuseMe(kCharacterAnna, kCharacterCath, 0);
+		break;
+	default:
+		break;
+	}
+}
+
+void LogicManager::CONS_DemoAnna_Birth(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_DemoAnna_Birth);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 7;
+
+	params->clear();
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_DemoAnna_Birth(HAND_PARAMS) {
+	switch (msg->action) {
+	case 0:
+		if (_gameTime > 2254500 && !getCharacterCurrentParams(kCharacterAnna)[0]) {
+			getCharacterCurrentParams(kCharacterAnna)[0] = 1;
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
+			DemoAnnaCall(&LogicManager::CONS_DemoAnna_GoBagg, 0, 0, 0, 0);
+		}
+
+		break;
+	case 12:
+		getCharacter(kCharacterAnna).characterPosition.car = kCarRedSleeping;
+		getCharacter(kCharacterAnna).characterPosition.position = 4070;
+		getCharacter(kCharacterAnna).characterPosition.location = 1;
+		getCharacter(kCharacterAnna).clothes = 2;
+		break;
+	default:
+		break;
+	}
+}
+
+void LogicManager::CONS_DemoAnna_GoBagg(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_DemoAnna_GoBagg);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 8;
+
+	params->clear();
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_DemoAnna_GoBagg(HAND_PARAMS) {
+	switch (msg->action) {
+	case 12:
+		setDoor(53, kCharacterCath, 1, 10, 9);
+		getCharacter(kCharacterAnna).characterPosition.location = 0;
+		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
+		DemoAnnaCall(&LogicManager::CONS_DemoAnna_DoCorrOtis, "625Bf", 37, 0, 0);
+		break;
+	case 18:
+		switch (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8]) {
+		case 1:
+			setDoor(37, kCharacterCath, 1, 10, 9);
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 2;
+			DemoAnnaCall(&LogicManager::CONS_DemoAnna_DoWalk, 5, 850, 0, 0);
+			break;
+		case 2:
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 3;
+			DemoAnnaCall(&LogicManager::CONS_DemoAnna_WaitRCClear, 0, 0, 0, 0);
+			break;
+		case 3:
+			getCharacter(kCharacterAnna).characterPosition.position = 1540;
+			getCharacter(kCharacterAnna).characterPosition.location = 0;
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 4;
+			DemoAnnaCall(&LogicManager::CONS_DemoAnna_DoSeqOtis, "802US", 0, 0, 0);
+			break;
+		case 4:
+			startSeqOtis(kCharacterAnna, "802UD");
+
+			if (inSalon(kCharacterCath))
+				advanceFrame(kCharacterAnna);
+
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 5;
+			DemoAnnaCall(&LogicManager::CONS_DemoAnna_FinishSeqOtis, 0, 0, 0, 0);
+			break;
+		case 5:
+			_gameProgress[kProgressField4C] = 1;
+			endGraphics(kCharacterAnna);
+			CONS_DemoAnna_InBagg(0, 0, 0, 0);
+			break;
+		default:
+			break;
+		}
+
+		break;
+	default:
+		break;
+	}
+}
+
+void LogicManager::CONS_DemoAnna_InBagg(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_DemoAnna_InBagg);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 9;
+
+	params->clear();
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_DemoAnna_InBagg(HAND_PARAMS) {
+	switch (msg->action) {
+	case 0:
+		if (getCharacterCurrentParams(kCharacterAnna)[0] && _gameTime > 2265300 && !getCharacterCurrentParams(kCharacterAnna)[1]) {
+			getCharacterCurrentParams(kCharacterAnna)[1] = 1;
+			if (checkLoc(kCharacterCath, 6)) {
+				CONS_DemoAnna_BaggageFight(0, 0, 0, 0);
+			} else {
+				send(kCharacterAnna, kCharacterVesna, 189299008, 0);
+				CONS_DemoAnna_DeadBagg(0, 0, 0, 0);
+			}
+		}
+
+		break;
+	case 12:
+		getCharacter(kCharacterAnna).characterPosition.car = kCarBaggage;
+		_gameProgress[kProgressField54] = 1;
+		break;
+	case 235856512:
+		getCharacterCurrentParams(kCharacterAnna)[0] = 1;
+		break;
+	default:
+		break;
+	}
+}
+
+void LogicManager::CONS_DemoAnna_DeadBagg(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_DemoAnna_DeadBagg);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 10;
+
+	params->clear();
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_DemoAnna_DeadBagg(HAND_PARAMS) {
+	switch (msg->action) {
+	case 18:
+		if (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 1) {
+			playNIS(kEventAnnaKilled);
+			endGame(1, 2259000, 58, true);
+		}
+
+		break;
+	case 272177921:
+		if (dialogRunning("MUS021"))
+			fadeDialog("MUS021");
+
+		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
+		DemoAnnaCall(&LogicManager::CONS_DemoAnna_SaveGame, 2, kEventAnnaKilled, 0, 0);
+		break;
+	default:
+		break;
+	}
+}
+
+void LogicManager::CONS_DemoAnna_BaggageFight(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_DemoAnna_BaggageFight);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 11;
+
+	params->clear();
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_DemoAnna_BaggageFight(HAND_PARAMS) {
+	switch (msg->action) {
+	case 12:
+		endGraphics(kCharacterAnna);
+
+		if (dialogRunning("MUS021"))
+			fadeDialog("MUS021");
+
+		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
+		DemoAnnaCall(&LogicManager::CONS_DemoAnna_SaveGame, 2, kEventAnnaBaggageArgument, 0, 0);
+		break;
+	case 18:
+		switch (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8]) {
+		case 1:
+			playNIS(kEventAnnaBaggageArgument);
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 2;
+			DemoAnnaCall(&LogicManager::CONS_DemoAnna_SaveGame, 1, 0, 0, 0);
+			break;
+		case 2:
+			getCharacterCurrentParams(kCharacterAnna)[0] = playFight(2002);
+			if (getCharacterCurrentParams(kCharacterAnna)[0]) {
+				endGame(0, 0, 0, getCharacterCurrentParams(kCharacterAnna)[0] == 1);
+			} else {
+				_gameTime = 2268000;
+				getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 3;
+				DemoAnnaCall(&LogicManager::CONS_DemoAnna_SaveGame, 2, kEventAnnaBagagePart2, 0, 0);
+			}
+
+			break;
+		case 3:
+			playNIS(kEventAnnaBagagePart2);
+			_gameProgress[kProgressField54] = 0;
+			forceJump(kCharacterVesna, &LogicManager::CONS_DemoVesna_InComp);
+			winGame();
+			break;
+		default:
+			break;
+		}
+
+		break;
+
+	default:
+		break;
+	}
+}
+
+void LogicManager::CONS_DemoAnna_StartPart2(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_DemoAnna_StartPart2);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 12;
+
+	params->clear();
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_DemoAnna_StartPart2(HAND_PARAMS) {
+	// No-op
+}
+
+void LogicManager::CONS_DemoAnna_StartPart3(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_DemoAnna_StartPart3);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 13;
+
+	params->clear();
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_DemoAnna_StartPart3(HAND_PARAMS) {
+	// No-op
+}
+
+void LogicManager::CONS_DemoAnna_StartPart4(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_DemoAnna_StartPart4);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 14;
+
+	params->clear();
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_DemoAnna_StartPart4(HAND_PARAMS) {
+	// No-op
+}
+
+void LogicManager::CONS_DemoAnna_StartPart5(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAnna, &LogicManager::HAND_DemoAnna_StartPart5);
+	getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall] = 15;
+
+	params->clear();
+
+	fedEx(kCharacterAnna, kCharacterAnna, 12, 0);
+}
+
+void LogicManager::HAND_DemoAnna_StartPart5(HAND_PARAMS) {
+	// No-op
+}
+
+void (LogicManager::*LogicManager::_functionsDemoAnna[])(HAND_PARAMS) = {
+	nullptr,
+	&LogicManager::HAND_DemoAnna_DoSeqOtis,
+	&LogicManager::HAND_DemoAnna_FinishSeqOtis,
+	&LogicManager::HAND_DemoAnna_DoCorrOtis,
+	&LogicManager::HAND_DemoAnna_WaitRCClear,
+	&LogicManager::HAND_DemoAnna_SaveGame,
+	&LogicManager::HAND_DemoAnna_DoWalk,
+	&LogicManager::HAND_DemoAnna_Birth,
+	&LogicManager::HAND_DemoAnna_GoBagg,
+	&LogicManager::HAND_DemoAnna_InBagg,
+	&LogicManager::HAND_DemoAnna_DeadBagg,
+	&LogicManager::HAND_DemoAnna_BaggageFight,
+	&LogicManager::HAND_DemoAnna_StartPart2,
+	&LogicManager::HAND_DemoAnna_StartPart3,
+	&LogicManager::HAND_DemoAnna_StartPart4,
+	&LogicManager::HAND_DemoAnna_StartPart5
+};
+
+} // End of namespace LastExpress
diff --git a/engines/lastexpress/characters/demo/demo_august.cpp b/engines/lastexpress/characters/demo/demo_august.cpp
new file mode 100644
index 00000000000..bd0eed27f60
--- /dev/null
+++ b/engines/lastexpress/characters/demo/demo_august.cpp
@@ -0,0 +1,230 @@
+/* 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 3 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, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "lastexpress/lastexpress.h"
+
+namespace LastExpress {
+
+void LogicManager::CONS_DemoAugust(int chapter) {
+	switch (chapter) {
+	case 0:
+		_engine->getMessageManager()->setMessageHandle(
+			kCharacterAugust,
+			_functionsDemoAugust[getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall]]
+		);
+
+		break;
+	case 1:
+		CONS_DemoAugust_Birth(0, 0, 0, 0);
+		break;
+	case 2:
+		CONS_DemoAugust_StartPart2(0, 0, 0, 0);
+		break;
+	case 3:
+		CONS_DemoAugust_StartPart3(0, 0, 0, 0);
+		break;
+	case 4:
+		CONS_DemoAugust_StartPart4(0, 0, 0, 0);
+		break;
+	case 5:
+		CONS_DemoAugust_StartPart5(0, 0, 0, 0);
+		break;
+	default:
+		break;
+	}
+}
+
+void LogicManager::DemoAugustCall(CALL_PARAMS) {
+	getCharacter(kCharacterAugust).currentCall++;
+
+	(this->*functionPointer)(param1, param2, param3, param4);
+}
+
+void LogicManager::CONS_DemoAugust_SaveGame(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAugust).callParams[getCharacter(kCharacterAugust).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAugust, &LogicManager::HAND_DemoAugust_SaveGame);
+	getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall] = 1;
+
+	params->clear();
+
+	params->parameters[0] = param1.intParam;
+	params->parameters[1] = param2.intParam;
+
+	fedEx(kCharacterAugust, kCharacterAugust, 12, 0);
+}
+
+void LogicManager::HAND_DemoAugust_SaveGame(HAND_PARAMS) {
+	switch (msg->action) {
+	case 0:
+			getCharacter(kCharacterAugust).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterAugust, _functionsDemoAugust[getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall]]);
+			fedEx(kCharacterAugust, kCharacterAugust, 18, 0);
+			break;
+	case 12:
+		save(
+			kCharacterAugust,
+			getCharacterCurrentParams(kCharacterAugust)[0],
+			getCharacterCurrentParams(kCharacterAugust)[1]
+		);
+
+		getCharacter(kCharacterAugust).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterAugust, _functionsDemoAugust[getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall]]);
+		fedEx(kCharacterAugust, kCharacterAugust, 18, 0);
+		break;
+	default:
+		break;
+	}
+}
+
+void LogicManager::CONS_DemoAugust_Birth(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAugust).callParams[getCharacter(kCharacterAugust).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAugust, &LogicManager::HAND_DemoAugust_Birth);
+	getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall] = 2;
+
+	params->clear();
+
+	fedEx(kCharacterAugust, kCharacterAugust, 12, 0);
+}
+
+void LogicManager::HAND_DemoAugust_Birth(HAND_PARAMS) {
+	switch (msg->action) {
+	case 0:
+		if (getCharacterCurrentParams(kCharacterAugust)[2] && !getCharacterCurrentParams(kCharacterAugust)[0]) {
+			getCharacter(kCharacterAugust).inventoryItem = 0x80;
+		} else {
+			getCharacter(kCharacterAugust).inventoryItem = 0;
+		}
+
+		break;
+	case 1:
+		getCharacter(kCharacterAugust).inventoryItem = 0;
+		getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 1;
+		DemoAugustCall(&LogicManager::CONS_DemoAugust_SaveGame, 2, kEventAugustTalkCigar, 0, 0);
+		break;
+	case 3:
+		releaseView(kCharacterAugust, kCarRestaurant, 50);
+		startCycOtis(kCharacterAugust, "105B3");
+		break;
+	case 12:
+		getCharacter(kCharacterAugust).characterPosition.car = kCarRestaurant;
+		getCharacter(kCharacterAugust).characterPosition.position = 3450;
+		getCharacter(kCharacterAugust).characterPosition.location = 1;
+		send(kCharacterAugust, kCharacterAbbot, 123712592, 0);
+		startCycOtis(kCharacterAugust, "105B3");
+		getCharacterCurrentParams(kCharacterAugust)[2] = 1;
+		break;
+	case 17:
+		if (checkCathDir(kCarRestaurant, 60) && !getCharacterCurrentParams(kCharacterAugust)[1] && !getCharacterCurrentParams(kCharacterAugust)[0]) {
+			blockView(kCharacterAugust, kCarRestaurant, 50);
+			startSeqOtis(kCharacterAugust, "105C3");
+		}
+
+		break;
+	case 18:
+		if (getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] == 1) {
+			playNIS(kEventAugustTalkCigar);
+			startCycOtis(kCharacterAugust, "105B3");
+			cleanNIS();
+			getCharacterCurrentParams(kCharacterAugust)[2] = 0;
+		}
+
+		break;
+	case 122358304:
+		startCycOtis(kCharacterAugust, "BLANK");
+		getCharacterCurrentParams(kCharacterAugust)[0] = 1;
+		getCharacterCurrentParams(kCharacterAugust)[1] = 1;
+		break;
+	case 136196244:
+		getCharacterCurrentParams(kCharacterAugust)[0] = 1;
+		getCharacter(kCharacterAugust).inventoryItem = 0;
+		break;
+	default:
+		break;
+	}
+}
+
+void LogicManager::CONS_DemoAugust_StartPart2(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAugust).callParams[getCharacter(kCharacterAugust).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAugust, &LogicManager::HAND_DemoAugust_StartPart2);
+	getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall] = 3;
+
+	params->clear();
+
+	fedEx(kCharacterAugust, kCharacterAugust, 12, 0);
+}
+
+void LogicManager::HAND_DemoAugust_StartPart2(HAND_PARAMS) {
+	// No-op
+}
+
+void LogicManager::CONS_DemoAugust_StartPart3(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAugust).callParams[getCharacter(kCharacterAugust).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAugust, &LogicManager::HAND_DemoAugust_StartPart3);
+	getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall] = 4;
+
+	params->clear();
+
+	fedEx(kCharacterAugust, kCharacterAugust, 12, 0);
+}
+
+void LogicManager::HAND_DemoAugust_StartPart3(HAND_PARAMS) {
+	// No-op
+}
+
+void LogicManager::CONS_DemoAugust_StartPart4(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAugust).callParams[getCharacter(kCharacterAugust).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAugust, &LogicManager::HAND_DemoAugust_StartPart4);
+	getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall] = 5;
+
+	params->clear();
+
+	fedEx(kCharacterAugust, kCharacterAugust, 12, 0);
+}
+
+void LogicManager::HAND_DemoAugust_StartPart4(HAND_PARAMS) {
+	// No-op
+}
+
+void LogicManager::CONS_DemoAugust_StartPart5(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterAugust).callParams[getCharacter(kCharacterAugust).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterAugust, &LogicManager::HAND_DemoAugust_StartPart5);
+	getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall] = 35;
+
+	params->clear();
+
+	fedEx(kCharacterAugust, kCharacterAugust, 12, 0);
+}
+
+void LogicManager::HAND_DemoAugust_StartPart5(HAND_PARAMS) {
+	// No-op
+}
+
+void (LogicManager::*LogicManager::_functionsDemoAugust[])(HAND_PARAMS) = {
+	nullptr,
+	&LogicManager::HAND_DemoAugust_SaveGame,
+	&LogicManager::HAND_DemoAugust_Birth,
+	&LogicManager::HAND_DemoAugust_StartPart2,
+	&LogicManager::HAND_DemoAugust_StartPart3,
+	&LogicManager::HAND_DemoAugust_StartPart4,
+	&LogicManager::HAND_DemoAugust_StartPart5
+};
+
+} // End of namespace LastExpress
diff --git a/engines/lastexpress/characters/demo/demo_cond2.cpp b/engines/lastexpress/characters/demo/demo_cond2.cpp
new file mode 100644
index 00000000000..aecb349dffa
--- /dev/null
+++ b/engines/lastexpress/characters/demo/demo_cond2.cpp
@@ -0,0 +1,261 @@
+/* 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 3 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, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "lastexpress/lastexpress.h"
+
+namespace LastExpress {
+
+void LogicManager::CONS_DemoCond2(int chapter) {
+	switch (chapter) {
+	case 0:
+		_engine->getMessageManager()->setMessageHandle(
+			kCharacterCond2,
+			_functionsDemoCond2[getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall]]
+		);
+
+		break;
+	case 1:
+		CONS_DemoCond2_Birth(0, 0, 0, 0);
+		break;
+	case 2:
+		CONS_DemoCond2_StartPart2(0, 0, 0, 0);
+		break;
+	case 3:
+		CONS_DemoCond2_StartPart3(0, 0, 0, 0);
+		break;
+	case 4:
+		CONS_DemoCond2_StartPart4(0, 0, 0, 0);
+		break;
+	case 5:
+		CONS_DemoCond2_StartPart5(0, 0, 0, 0);
+		break;
+	default:
+		break;
+	}
+}
+
+void LogicManager::DemoCond2Call(CALL_PARAMS) {
+	getCharacter(kCharacterCond2).currentCall++;
+
+	(this->*functionPointer)(param1, param2, param3, param4);
+}
+
+void LogicManager::CONS_DemoCond2_DoSeqOtis(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterCond2).callParams[getCharacter(kCharacterCond2).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterCond2, &LogicManager::HAND_DemoCond2_DoSeqOtis);
+	getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall] = 1;
+
+	params->clear();
+
+	strncpy((char *)&params->parameters[0], param1.stringParam, 12);
+
+	fedEx(kCharacterCond2, kCharacterCond2, 12, 0);
+}
+
+void LogicManager::HAND_DemoCond2_DoSeqOtis(HAND_PARAMS) {
+	switch (msg->action) {
+	case 3:
+		getCharacter(kCharacterCond2).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterCond2, _functionsDemoCond2[getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall]]);
+		fedEx(kCharacterCond2, kCharacterCond2, 18, 0);
+		break;
+	case 12:
+		startSeqOtis(kCharacterCond2, (char *)&getCharacterCurrentParams(kCharacterCond2)[0]);
+		break;
+	default:
+		break;
+	}
+}
+
+void LogicManager::CONS_DemoCond2_FinishSeqOtis(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterCond2).callParams[getCharacter(kCharacterCond2).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterCond2, &LogicManager::HAND_DemoCond2_FinishSeqOtis);
+	getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall] = 2;
+
+	params->clear();
+
+	fedEx(kCharacterCond2, kCharacterCond2, 12, 0);
+}
+
+void LogicManager::HAND_DemoCond2_FinishSeqOtis(HAND_PARAMS) {
+	if (msg->action == 3) {
+		getCharacter(kCharacterCond2).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterCond2, _functionsDemoCond2[getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall]]);
+		fedEx(kCharacterCond2, kCharacterCond2, 18, 0);
+	}
+}
+
+void LogicManager::CONS_DemoCond2_SitDown(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterCond2).callParams[getCharacter(kCharacterCond2).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterCond2, &LogicManager::HAND_DemoCond2_SitDown);
+	getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall] = 3;
+
+	params->clear();
+
+	params->parameters[0] = param1.intParam;
+
+	fedEx(kCharacterCond2, kCharacterCond2, 12, 0);
+}
+
+void LogicManager::HAND_DemoCond2_SitDown(HAND_PARAMS) {
+	switch (msg->action) {
+	case 12:
+		if (getCharacterCurrentParams(kCharacterCond2)[0]) {
+			startSeqOtis(kCharacterCond2, "697H");
+		} else {
+			startSeqOtis(kCharacterCond2, "627A");
+		}
+
+		getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 1;
+		DemoCond2Call(&LogicManager::CONS_DemoCond2_FinishSeqOtis, 0, 0, 0, 0);
+
+		break;
+	case 18:
+		switch (getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8]) {
+		case 1:
+			startCycOtis(kCharacterCond2, "627B");
+
+			getCharacter(kCharacterCond2).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterCond2, _functionsDemoCond2[getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall]]);
+			fedEx(kCharacterCond2, kCharacterCond2, 18, 0);
+			break;
+		default:
+			break;
+		}
+
+		break;
+	default:
+		break;
+	}
+}
+
+void LogicManager::CONS_DemoCond2_Birth(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterCond2).callParams[getCharacter(kCharacterCond2).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterCond2, &LogicManager::HAND_DemoCond2_Birth);
+	getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall] = 4;
+
+	params->clear();
+
+	fedEx(kCharacterCond2, kCharacterCond2, 12, 0);
+}
+
+void LogicManager::HAND_DemoCond2_Birth(HAND_PARAMS) {
+	switch (msg->action) {
+	case 12:
+		getCharacter(kCharacterCond2).characterPosition.car = kCarRedSleeping;
+		getCharacter(kCharacterCond2).characterPosition.position = 1500;
+		getCharacter(kCharacterCond2).characterPosition.location = 0;
+		getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 1;
+		DemoCond2Call(&LogicManager::CONS_DemoCond2_SitDown, 0, 0, 0, 0);
+		break;
+	case 18:
+		if (getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] == 2) {
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 3;
+			DemoCond2Call(&LogicManager::CONS_DemoCond2_SitDown, 0, 0, 0, 0);
+		}
+
+		break;
+	case 168253822:
+		if (whoOnScreen(kCharacterCond2) && !getCharacterCurrentParams(kCharacterCond2)[0]) {
+			getCharacterCurrentParams(kCharacterCond2)[0] = 1;
+			playDialog(kCharacterCond2, "JAC1120", -1, 0);
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 2;
+			DemoCond2Call(&LogicManager::CONS_DemoCond2_DoSeqOtis, "697D", 0, 0, 0);
+		}
+
+		break;
+	case 225932896:
+		send(kCharacterCond2, kCharacterFrancois, 205346192, 0);
+		break;
+	default:
+		break;
+	}
+}
+
+void LogicManager::CONS_DemoCond2_StartPart2(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterCond2).callParams[getCharacter(kCharacterCond2).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterCond2, &LogicManager::HAND_DemoCond2_StartPart2);
+	getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall] = 5;
+
+	params->clear();
+
+	fedEx(kCharacterCond2, kCharacterCond2, 12, 0);
+}
+
+void LogicManager::HAND_DemoCond2_StartPart2(HAND_PARAMS) {
+	// No-op
+}
+
+void LogicManager::CONS_DemoCond2_StartPart3(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterCond2).callParams[getCharacter(kCharacterCond2).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterCond2, &LogicManager::HAND_DemoCond2_StartPart3);
+	getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall] = 6;
+
+	params->clear();
+
+	fedEx(kCharacterCond2, kCharacterCond2, 12, 0);
+}
+
+void LogicManager::HAND_DemoCond2_StartPart3(HAND_PARAMS) {
+	// No-op
+}
+
+void LogicManager::CONS_DemoCond2_StartPart4(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterCond2).callParams[getCharacter(kCharacterCond2).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterCond2, &LogicManager::HAND_DemoCond2_StartPart4);
+	getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall] = 7;
+
+	params->clear();
+
+	fedEx(kCharacterCond2, kCharacterCond2, 12, 0);
+}
+
+void LogicManager::HAND_DemoCond2_StartPart4(HAND_PARAMS) {
+	// No-op
+}
+
+void LogicManager::CONS_DemoCond2_StartPart5(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterCond2).callParams[getCharacter(kCharacterCond2).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterCond2, &LogicManager::HAND_DemoCond2_StartPart5);
+	getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall] = 8;
+
+	params->clear();
+
+	fedEx(kCharacterCond2, kCharacterCond2, 12, 0);
+}
+
+void LogicManager::HAND_DemoCond2_StartPart5(HAND_PARAMS) {
+	// No-op
+}
+
+void (LogicManager::*LogicManager::_functionsDemoCond2[])(HAND_PARAMS) = {
+	nullptr,
+	&LogicManager::HAND_DemoCond2_DoSeqOtis,
+	&LogicManager::HAND_DemoCond2_FinishSeqOtis,
+	&LogicManager::HAND_DemoCond2_SitDown,
+	&LogicManager::HAND_DemoCond2_Birth,
+	&LogicManager::HAND_DemoCond2_StartPart2,
+	&LogicManager::HAND_DemoCond2_StartPart3,
+	&LogicManager::HAND_DemoCond2_StartPart4,
+	&LogicManager::HAND_DemoCond2_StartPart5
+};
+
+} // End of namespace LastExpress
diff --git a/engines/lastexpress/characters/demo/demo_francois.cpp b/engines/lastexpress/characters/demo/demo_francois.cpp
new file mode 100644
index 00000000000..16639e99f08
--- /dev/null
+++ b/engines/lastexpress/characters/demo/demo_francois.cpp
@@ -0,0 +1,358 @@
+/* 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 3 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, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "lastexpress/lastexpress.h"
+
+namespace LastExpress {
+
+void LogicManager::CONS_DemoFrancois(int chapter) {
+	switch (chapter) {
+	case 0:
+		_engine->getMessageManager()->setMessageHandle(
+			kCharacterFrancois,
+			_functionsDemoFrancois[getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall]]
+		);
+
+		break;
+	case 1:
+		CONS_DemoFrancois_Birth(0, 0, 0, 0);
+		break;
+	case 2:
+		CONS_DemoFrancois_StartPart2(0, 0, 0, 0);
+		break;
+	case 3:
+		CONS_DemoFrancois_StartPart3(0, 0, 0, 0);
+		break;
+	case 4:
+		CONS_DemoFrancois_StartPart4(0, 0, 0, 0);
+		break;
+	case 5:
+		CONS_DemoFrancois_StartPart5(0, 0, 0, 0);
+		break;
+	default:
+		break;
+	}
+}
+
+void LogicManager::DemoFrancoisCall(CALL_PARAMS) {
+	getCharacter(kCharacterFrancois).currentCall++;
+
+	(this->*functionPointer)(param1, param2, param3, param4);
+}
+
+void LogicManager::CONS_DemoFrancois_DoSeqOtis(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterFrancois).callParams[getCharacter(kCharacterFrancois).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterFrancois, &LogicManager::HAND_DemoFrancois_DoSeqOtis);
+	getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall] = 1;
+
+	params->clear();
+
+	strncpy((char *)&params->parameters[0], param1.stringParam, 12);
+
+	fedEx(kCharacterFrancois, kCharacterFrancois, 12, 0);
+}
+
+void LogicManager::HAND_DemoFrancois_DoSeqOtis(HAND_PARAMS) {
+	if (msg->action == 3) {
+		getCharacter(kCharacterFrancois).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterFrancois, _functionsDemoFrancois[getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall]]);
+		fedEx(kCharacterFrancois, kCharacterFrancois, 18, 0);
+	} else if (msg->action == 12) {
+		startSeqOtis(kCharacterFrancois, (char *)&getCharacterCurrentParams(kCharacterFrancois)[0]);
+	}
+}
+
+void LogicManager::CONS_DemoFrancois_SaveGame(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterFrancois).callParams[getCharacter(kCharacterFrancois).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterFrancois, &LogicManager::HAND_DemoFrancois_SaveGame);
+	getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall] = 2;
+
+	params->clear();
+
+	params->parameters[0] = param1.intParam;
+	params->parameters[1] = param2.intParam;
+
+	fedEx(kCharacterFrancois, kCharacterFrancois, 12, 0);
+}
+
+void LogicManager::HAND_DemoFrancois_SaveGame(HAND_PARAMS) {
+	switch (msg->action) {
+	case 0:
+		getCharacter(kCharacterFrancois).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterFrancois, _functionsDemoFrancois[getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall]]);
+		fedEx(kCharacterFrancois, kCharacterFrancois, 18, 0);
+		break;
+	case 12:
+		save(
+			kCharacterFrancois,
+			getCharacterCurrentParams(kCharacterFrancois)[0],
+			getCharacterCurrentParams(kCharacterFrancois)[1]
+		);
+
+		getCharacter(kCharacterFrancois).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterFrancois, _functionsDemoFrancois[getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall]]);
+		fedEx(kCharacterFrancois, kCharacterFrancois, 18, 0);
+		break;
+	default:
+		break;
+	}
+}
+
+void LogicManager::CONS_DemoFrancois_Birth(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterFrancois).callParams[getCharacter(kCharacterFrancois).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterFrancois, &LogicManager::HAND_DemoFrancois_Birth);
+	getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall] = 3;
+
+	params->clear();
+
+	fedEx(kCharacterFrancois, kCharacterFrancois, 12, 0);
+}
+
+void LogicManager::HAND_DemoFrancois_Birth(HAND_PARAMS) {
+	switch (msg->action) {
+	case 0:
+		if (whoRunningDialog(kCharacterFrancois)) {
+			if (whoOnScreen(kCharacterFrancois) && whoFacingCath(kCharacterFrancois)) {
+				if (nearChar(kCharacterFrancois, kCharacterCath, 2500) && !_gameEvents[kEventFrancoisWhistleD])
+					getCharacter(kCharacterFrancois).inventoryItem = 0x80;
+			} else {
+				getCharacter(kCharacterFrancois).inventoryItem = 0;
+			}
+
+			if (getCharacterCurrentParams(kCharacterFrancois)[4]) {
+				getCharacterCurrentParams(kCharacterFrancois)[4]--;
+			} else if (walk(kCharacterFrancois, *getCharacterCurrentParams(kCharacterFrancois), getCharacterCurrentParams(kCharacterFrancois)[1])) {
+				if (getCharacterCurrentParams(kCharacterFrancois)[1] == 540) {
+					getCharacterCurrentParams(kCharacterFrancois)[0] = 4;
+					getCharacterCurrentParams(kCharacterFrancois)[1] = 9460;
+					getCharacterCurrentParams(kCharacterFrancois)[4] = 120;
+				} else {
+					getCharacterCurrentParams(kCharacterFrancois)[0] = 3;
+					getCharacterCurrentParams(kCharacterFrancois)[1] = 540;
+					getCharacterCurrentParams(kCharacterFrancois)[4] = 15;
+					getCharacterCurrentParams(kCharacterFrancois)[3] = 0;
+					send(kCharacterFrancois, kCharacterCond2, 225932896, 0);
+				}
+			}
+
+			if (nearX(kCharacterFrancois, 2000, 500) &&
+				getCharacter(kCharacterFrancois).direction == 2 &&
+				checkLoc(kCharacterFrancois, 4) && getCharacterCurrentParams(kCharacterFrancois)[3]) {
+				getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 1;
+				DemoFrancoisCall(&LogicManager::CONS_DemoFrancois_DoSeqOtis, "605A", 0, 0, 0);
+			}
+
+			return;
+		}
+
+		if (getCharacterCurrentParams(kCharacterFrancois)[5] || (getCharacterCurrentParams(kCharacterFrancois)[5] = getCharacterCurrentParams(kCharacterFrancois)[2] + _currentGameSessionTicks,
+																 getCharacterCurrentParams(kCharacterFrancois)[5] != 0)) {
+			if (_currentGameSessionTicks <= getCharacterCurrentParams(kCharacterFrancois)[5]) {
+				if (whoOnScreen(kCharacterFrancois) && whoFacingCath(kCharacterFrancois)) {
+					if (nearChar(kCharacterFrancois, kCharacterCath, 2500) && !_gameEvents[kEventFrancoisWhistleD])
+						getCharacter(kCharacterFrancois).inventoryItem = 0x80;
+				} else {
+					getCharacter(kCharacterFrancois).inventoryItem = 0;
+				}
+
+				if (getCharacterCurrentParams(kCharacterFrancois)[4]) {
+					getCharacterCurrentParams(kCharacterFrancois)[4]--;
+				} else if (walk(kCharacterFrancois, *getCharacterCurrentParams(kCharacterFrancois), getCharacterCurrentParams(kCharacterFrancois)[1])) {
+					if (getCharacterCurrentParams(kCharacterFrancois)[1] == 540) {
+						getCharacterCurrentParams(kCharacterFrancois)[0] = 4;
+						getCharacterCurrentParams(kCharacterFrancois)[1] = 9460;
+						getCharacterCurrentParams(kCharacterFrancois)[4] = 120;
+					} else {
+						getCharacterCurrentParams(kCharacterFrancois)[0] = 3;
+						getCharacterCurrentParams(kCharacterFrancois)[1] = 540;
+						getCharacterCurrentParams(kCharacterFrancois)[4] = 15;
+						getCharacterCurrentParams(kCharacterFrancois)[3] = 0;
+						send(kCharacterFrancois, kCharacterCond2, 225932896, 0);
+					}
+				}
+
+				if (nearX(kCharacterFrancois, 2000, 500) &&
+					getCharacter(kCharacterFrancois).direction == 2 &&
+					checkLoc(kCharacterFrancois, 4) && getCharacterCurrentParams(kCharacterFrancois)[3]) {
+					getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 1;
+					DemoFrancoisCall(&LogicManager::CONS_DemoFrancois_DoSeqOtis, "605A", 0, 0, 0);
+				}
+
+				return;
+			}
+
+			getCharacterCurrentParams(kCharacterFrancois)[5] = 0x7FFFFFFF;
+		}
+
+		if (rnd(2) == 0) {
+			playDialog(kCharacterFrancois, "Fra1002G", -1, 0);
+		} else {
+			playDialog(kCharacterFrancois, "Fra1002A", -1, 0);
+		}
+
+		getCharacterCurrentParams(kCharacterFrancois)[5] = 0;
+		getCharacterCurrentParams(kCharacterFrancois)[2] = 15 * rnd(7);
+
+		if (whoOnScreen(kCharacterFrancois) && whoFacingCath(kCharacterFrancois)) {
+			if (nearChar(kCharacterFrancois, kCharacterCath, 2500) && !_gameEvents[kEventFrancoisWhistleD])
+				getCharacter(kCharacterFrancois).inventoryItem = 0x80;
+		} else {
+			getCharacter(kCharacterFrancois).inventoryItem = 0;
+		}
+
+		if (getCharacterCurrentParams(kCharacterFrancois)[4]) {
+			getCharacterCurrentParams(kCharacterFrancois)[4]--;
+		} else if (walk(kCharacterFrancois, *getCharacterCurrentParams(kCharacterFrancois), getCharacterCurrentParams(kCharacterFrancois)[1])) {
+			if (getCharacterCurrentParams(kCharacterFrancois)[1] == 540) {
+				getCharacterCurrentParams(kCharacterFrancois)[0] = 4;
+				getCharacterCurrentParams(kCharacterFrancois)[1] = 9460;
+				getCharacterCurrentParams(kCharacterFrancois)[4] = 120;
+			} else {
+				getCharacterCurrentParams(kCharacterFrancois)[0] = 3;
+				getCharacterCurrentParams(kCharacterFrancois)[1] = 540;
+				getCharacterCurrentParams(kCharacterFrancois)[4] = 15;
+				getCharacterCurrentParams(kCharacterFrancois)[3] = 0;
+				send(kCharacterFrancois, kCharacterCond2, 225932896, 0);
+			}
+		}
+
+		if (nearX(kCharacterFrancois, 2000, 500) &&
+			getCharacter(kCharacterFrancois).direction == 2 &&
+			checkLoc(kCharacterFrancois, 4) && getCharacterCurrentParams(kCharacterFrancois)[3]) {
+			getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 1;
+			DemoFrancoisCall(&LogicManager::CONS_DemoFrancois_DoSeqOtis, "605A", 0, 0, 0);
+		}
+
+		break;
+	case 1:
+		getCharacter(kCharacterFrancois).inventoryItem = 0;
+
+		if (whoRunningDialog(kCharacterFrancois))
+			fadeDialog(kCharacterFrancois);
+
+		getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 2;
+		DemoFrancoisCall(&LogicManager::CONS_DemoFrancois_SaveGame, 2, kEventFrancoisWhistle, 0, 0);
+		break;
+	case 12:
+		getCharacter(kCharacterFrancois).characterPosition.car = kCarRedSleeping;
+		getCharacter(kCharacterFrancois).characterPosition.position = 2088;
+		getCharacter(kCharacterFrancois).characterPosition.location = 0;
+		getCharacter(kCharacterFrancois).clothes = 1;
+		getCharacter(kCharacterFrancois).walkStepSize = 100;
+		getCharacter(kCharacterFrancois).inventoryItem = 0;
+		getCharacterCurrentParams(kCharacterFrancois)[0] = kCarRedSleeping;
+		getCharacterCurrentParams(kCharacterFrancois)[1] = 9460;
+		walk(kCharacterFrancois, kCarRedSleeping, 9460);
+		getCharacterCurrentParams(kCharacterFrancois)[2] = 15 * rnd(7);
+		break;
+	case 18:
+		if (getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] == 1) {
+			send(kCharacterFrancois, kCharacterCond2, 168253822, 0);
+			getCharacterCurrentParams(kCharacterFrancois)[0] = kCarRedSleeping;
+			getCharacterCurrentParams(kCharacterFrancois)[1] = 9460;
+			getCharacter(kCharacterFrancois).characterPosition.position = 2088;
+			walk(kCharacterFrancois, getCharacterCurrentParams(kCharacterFrancois)[0], getCharacterCurrentParams(kCharacterFrancois)[1]);
+		} else if (getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] == 2) {
+			playNIS(kEventFrancoisWhistleD);
+			if (getCharacter(kCharacterFrancois).direction == 1) {
+				bumpCathFx(kCarRedSleeping, getCharacter(kCharacterFrancois).characterPosition.position - 750);
+			} else {
+				bumpCathRx(kCarRedSleeping, getCharacter(kCharacterFrancois).characterPosition.position + 750);
+			}
+		}
+
+		break;
+	case 205346192:
+		getCharacterCurrentParams(kCharacterFrancois)[3] = 1;
+		break;
+	default:
+		break;
+	}
+}
+
+void LogicManager::CONS_DemoFrancois_StartPart2(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterFrancois).callParams[getCharacter(kCharacterFrancois).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterFrancois, &LogicManager::HAND_DemoFrancois_StartPart2);
+	getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall] = 4;
+
+	params->clear();
+
+	fedEx(kCharacterFrancois, kCharacterFrancois, 12, 0);
+}
+
+void LogicManager::HAND_DemoFrancois_StartPart2(HAND_PARAMS) {
+	// No-op
+}
+
+void LogicManager::CONS_DemoFrancois_StartPart3(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterFrancois).callParams[getCharacter(kCharacterFrancois).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterFrancois, &LogicManager::HAND_DemoFrancois_StartPart3);
+	getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall] = 5;
+
+	params->clear();
+
+	fedEx(kCharacterFrancois, kCharacterFrancois, 12, 0);
+}
+
+void LogicManager::HAND_DemoFrancois_StartPart3(HAND_PARAMS) {
+	// No-op
+}
+
+void LogicManager::CONS_DemoFrancois_StartPart4(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterFrancois).callParams[getCharacter(kCharacterFrancois).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterFrancois, &LogicManager::HAND_DemoFrancois_StartPart4);
+	getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall] = 6;
+
+	params->clear();
+
+	fedEx(kCharacterFrancois, kCharacterFrancois, 12, 0);
+}
+
+void LogicManager::HAND_DemoFrancois_StartPart4(HAND_PARAMS) {
+	// No-op
+}
+
+void LogicManager::CONS_DemoFrancois_StartPart5(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterFrancois).callParams[getCharacter(kCharacterFrancois).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterFrancois, &LogicManager::HAND_DemoFrancois_StartPart5);
+	getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall] = 7;
+
+	params->clear();
+
+	fedEx(kCharacterFrancois, kCharacterFrancois, 12, 0);
+}
+
+void LogicManager::HAND_DemoFrancois_StartPart5(HAND_PARAMS) {
+	// No-op
+}
+
+void (LogicManager::*LogicManager::_functionsDemoFrancois[])(HAND_PARAMS) = {
+	nullptr,
+	&LogicManager::HAND_DemoFrancois_DoSeqOtis,
+	&LogicManager::HAND_DemoFrancois_SaveGame,
+	&LogicManager::HAND_DemoFrancois_Birth,
+	&LogicManager::HAND_DemoFrancois_StartPart2,
+	&LogicManager::HAND_DemoFrancois_StartPart3,
+	&LogicManager::HAND_DemoFrancois_StartPart4,
+	&LogicManager::HAND_DemoFrancois_StartPart5
+};
+
+} // End of namespace LastExpress
diff --git a/engines/lastexpress/characters/demo/demo_ivo.cpp b/engines/lastexpress/characters/demo/demo_ivo.cpp
new file mode 100644
index 00000000000..35071fd2dab
--- /dev/null
+++ b/engines/lastexpress/characters/demo/demo_ivo.cpp
@@ -0,0 +1,278 @@
+/* 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 3 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, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "lastexpress/lastexpress.h"
+
+namespace LastExpress {
+
+void LogicManager::CONS_DemoIvo(int chapter) {
+	switch (chapter) {
+	case 0:
+		_engine->getMessageManager()->setMessageHandle(
+			kCharacterIvo,
+			_functionsDemoIvo[getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall]]
+		);
+
+		break;
+	case 1:
+		CONS_DemoIvo_Birth(0, 0, 0, 0);
+		break;
+	case 2:
+		CONS_DemoIvo_StartPart2(0, 0, 0, 0);
+		break;
+	case 3:
+		CONS_DemoIvo_StartPart3(0, 0, 0, 0);
+		break;
+	case 4:
+		CONS_DemoIvo_StartPart4(0, 0, 0, 0);
+		break;
+	case 5:
+		CONS_DemoIvo_StartPart5(0, 0, 0, 0);
+		break;
+	default:
+		break;
+	}
+}
+
+void LogicManager::DemoIvoCall(CALL_PARAMS) {
+	getCharacter(kCharacterIvo).currentCall++;
+
+	(this->*functionPointer)(param1, param2, param3, param4);
+}
+
+void LogicManager::CONS_DemoIvo_WaitRCClear(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterIvo).callParams[getCharacter(kCharacterIvo).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterIvo, &LogicManager::HAND_DemoIvo_WaitRCClear);
+	getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall] = 1;
+
+	params->clear();
+
+	fedEx(kCharacterIvo, kCharacterIvo, 12, 0);
+}
+
+void LogicManager::HAND_DemoIvo_WaitRCClear(HAND_PARAMS) {
+	switch (msg->action) {
+	case 0:
+	case 12:
+		if (rcClear()) {
+			getCharacter(kCharacterIvo).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterIvo, _functionsDemoIvo[getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall]]);
+			fedEx(kCharacterIvo, kCharacterIvo, 18, 0);
+		}
+
+		break;
+	default:
+		break;
+	}
+}
+
+void LogicManager::CONS_DemoIvo_DoSeqOtis(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterIvo).callParams[getCharacter(kCharacterIvo).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterIvo, &LogicManager::HAND_DemoIvo_DoSeqOtis);
+	getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall] = 2;
+
+	params->clear();
+
+	strncpy((char *)&params->parameters[0], param1.stringParam, 12);
+
+	fedEx(kCharacterIvo, kCharacterIvo, 12, 0);
+}
+
+void LogicManager::HAND_DemoIvo_DoSeqOtis(HAND_PARAMS) {
+	switch (msg->action) {
+	case 3:
+		getCharacter(kCharacterIvo).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterIvo, _functionsDemoIvo[getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall]]);
+		fedEx(kCharacterIvo, kCharacterIvo, 18, 0);
+		break;
+	case 12:
+		startSeqOtis(kCharacterIvo, (char *)&getCharacterCurrentParams(kCharacterIvo)[0]);
+		break;
+	default:
+		break;
+	}
+}
+
+void LogicManager::CONS_DemoIvo_FinishSeqOtis(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterIvo).callParams[getCharacter(kCharacterIvo).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterIvo, &LogicManager::HAND_DemoIvo_FinishSeqOtis);
+	getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall] = 3;
+
+	params->clear();
+
+	fedEx(kCharacterIvo, kCharacterIvo, 12, 0);
+}
+
+void LogicManager::HAND_DemoIvo_FinishSeqOtis(HAND_PARAMS) {
+	switch (msg->action) {
+	case 3:
+		getCharacter(kCharacterIvo).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterIvo, _functionsDemoIvo[getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall]]);
+		fedEx(kCharacterIvo, kCharacterIvo, 18, 0);
+		break;
+	default:
+		break;
+	}
+}
+
+void LogicManager::CONS_DemoIvo_DoSplitOtis023A(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterIvo).callParams[getCharacter(kCharacterIvo).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterIvo, &LogicManager::HAND_DemoIvo_DoSplitOtis023A);
+	getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall] = 4;
+
+	params->clear();
+
+	fedEx(kCharacterIvo, kCharacterIvo, 12, 0);
+}
+
+void LogicManager::HAND_DemoIvo_DoSplitOtis023A(HAND_PARAMS) {
+	switch (msg->action) {
+	case 3:
+		endGraphics(kCharacterTableD);
+		send(kCharacterIvo, kCharacterTableC, 136455232, 0);
+
+		getCharacter(kCharacterIvo).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterIvo, _functionsDemoIvo[getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall]]);
+		fedEx(kCharacterIvo, kCharacterIvo, 18, 0);
+		break;
+	case 12:
+		startSeqOtis(kCharacterIvo, "023A1");
+		startSeqOtis(kCharacterTableD, "023A2");
+		startSeqOtis(kCharacterTableC, "023A3");
+		break;
+	default:
+		break;
+	}
+}
+
+void LogicManager::CONS_DemoIvo_Birth(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterIvo).callParams[getCharacter(kCharacterIvo).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterIvo, &LogicManager::HAND_DemoIvo_Birth);
+	getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall] = 5;
+
+	params->clear();
+
+	fedEx(kCharacterIvo, kCharacterIvo, 12, 0);
+}
+
+void LogicManager::HAND_DemoIvo_Birth(HAND_PARAMS) {
+	switch (msg->action) {
+	case 12:
+		getCharacter(kCharacterIvo).characterPosition.position = 1539;
+		getCharacter(kCharacterIvo).characterPosition.location = 0;
+		getCharacter(kCharacterIvo).characterPosition.car = kCarRestaurant;
+		getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall + 8] = 1;
+		DemoIvoCall(&LogicManager::CONS_DemoIvo_WaitRCClear, 0, 0, 0, 0);
+		break;
+	case 18:
+		switch (getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall + 8]) {
+		case 1:
+			getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall + 8] = 2;
+			DemoIvoCall(&LogicManager::CONS_DemoIvo_DoSeqOtis, "809US", 0, 0, 0);
+			break;
+		case 2:
+			getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall + 8] = 3;
+			DemoIvoCall(&LogicManager::CONS_DemoIvo_DoSplitOtis023A, 0, 0, 0, 0);
+			break;
+		case 3:
+			getCharacter(kCharacterIvo).characterPosition.location = 1;
+			startCycOtis(kCharacterIvo, "023B");
+			break;
+		default:
+			break;
+		}
+
+		break;
+	default:
+		break;
+	}
+}
+
+void LogicManager::CONS_DemoIvo_StartPart2(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterIvo).callParams[getCharacter(kCharacterIvo).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterIvo, &LogicManager::HAND_DemoIvo_StartPart2);
+	getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall] = 6;
+
+	params->clear();
+
+	fedEx(kCharacterIvo, kCharacterIvo, 12, 0);
+}
+
+void LogicManager::HAND_DemoIvo_StartPart2(HAND_PARAMS) {
+	// No-op
+}
+
+void LogicManager::CONS_DemoIvo_StartPart3(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterIvo).callParams[getCharacter(kCharacterIvo).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterIvo, &LogicManager::HAND_DemoIvo_StartPart3);
+	getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall] = 7;
+
+	params->clear();
+
+	fedEx(kCharacterIvo, kCharacterIvo, 12, 0);
+}
+
+void LogicManager::HAND_DemoIvo_StartPart3(HAND_PARAMS) {
+	// No-op
+}
+
+void LogicManager::CONS_DemoIvo_StartPart4(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterIvo).callParams[getCharacter(kCharacterIvo).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterIvo, &LogicManager::HAND_DemoIvo_StartPart4);
+	getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall] = 8;
+
+	params->clear();
+
+	fedEx(kCharacterIvo, kCharacterIvo, 12, 0);
+}
+
+void LogicManager::HAND_DemoIvo_StartPart4(HAND_PARAMS) {
+	// No-op
+}
+
+void LogicManager::CONS_DemoIvo_StartPart5(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterIvo).callParams[getCharacter(kCharacterIvo).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterIvo, &LogicManager::HAND_DemoIvo_StartPart5);
+	getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall] = 9;
+
+	params->clear();
+
+	fedEx(kCharacterIvo, kCharacterIvo, 12, 0);
+}
+
+void LogicManager::HAND_DemoIvo_StartPart5(HAND_PARAMS) {
+	// No-op
+}
+
+void (LogicManager::*LogicManager::_functionsDemoIvo[])(HAND_PARAMS) = {
+	nullptr,
+	&LogicManager::HAND_DemoIvo_WaitRCClear,
+	&LogicManager::HAND_DemoIvo_DoSeqOtis,
+	&LogicManager::HAND_DemoIvo_FinishSeqOtis,
+	&LogicManager::HAND_DemoIvo_DoSplitOtis023A,
+	&LogicManager::HAND_DemoIvo_Birth,
+	&LogicManager::HAND_DemoIvo_StartPart2,
+	&LogicManager::HAND_DemoIvo_StartPart3,
+	&LogicManager::HAND_DemoIvo_StartPart4,
+	&LogicManager::HAND_DemoIvo_StartPart5
+};
+
+} // End of namespace LastExpress
diff --git a/engines/lastexpress/characters/demo/demo_madame.cpp b/engines/lastexpress/characters/demo/demo_madame.cpp
new file mode 100644
index 00000000000..43f27e8dd45
--- /dev/null
+++ b/engines/lastexpress/characters/demo/demo_madame.cpp
@@ -0,0 +1,252 @@
+/* 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 3 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, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "lastexpress/lastexpress.h"
+
+namespace LastExpress {
+
+void LogicManager::CONS_DemoMadame(int chapter) {
+	switch (chapter) {
+	case 0:
+		_engine->getMessageManager()->setMessageHandle(
+			kCharacterMadame,
+			_functionsDemoMadame[getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall]]
+		);
+
+		break;
+	case 1:
+		CONS_DemoMadame_Birth(0, 0, 0, 0);
+		break;
+	case 2:
+		CONS_DemoMadame_StartPart2(0, 0, 0, 0);
+		break;
+	case 3:
+		CONS_DemoMadame_StartPart3(0, 0, 0, 0);
+		break;
+	case 4:
+		CONS_DemoMadame_StartPart4(0, 0, 0, 0);
+		break;
+	case 5:
+		CONS_DemoMadame_StartPart5(0, 0, 0, 0);
+		break;
+	default:
+		break;
+	}
+}
+
+void LogicManager::DemoMadameCall(CALL_PARAMS) {
+	getCharacter(kCharacterMadame).currentCall++;
+
+	(this->*functionPointer)(param1, param2, param3, param4);
+}
+
+void LogicManager::CONS_DemoMadame_DoDialog(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterMadame).callParams[getCharacter(kCharacterMadame).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterMadame, &LogicManager::HAND_DemoMadame_DoDialog);
+	getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall] = 1;
+
+	params->clear();
+
+	strncpy((char *)&params->parameters[0], param1.stringParam, 12);
+
+	fedEx(kCharacterMadame, kCharacterMadame, 12, 0);
+}
+
+void LogicManager::HAND_DemoMadame_DoDialog(HAND_PARAMS) {
+	switch (msg->action) {
+	case 2:
+		getCharacter(kCharacterMadame).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterMadame, _functionsDemoMadame[getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall]]);
+		fedEx(kCharacterMadame, kCharacterMadame, 18, 0);
+		break;
+	case 12:
+		playDialog(kCharacterMadame, (char *)&getCharacterCurrentParams(kCharacterMadame)[0], -1, 0);
+		break;
+	default:
+		break;
+	}
+}
+
+void LogicManager::CONS_DemoMadame_Birth(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterMadame).callParams[getCharacter(kCharacterMadame).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterMadame, &LogicManager::HAND_DemoMadame_Birth);
+	getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall] = 2;
+
+	params->clear();
+
+	fedEx(kCharacterMadame, kCharacterMadame, 12, 0);
+}
+
+void LogicManager::HAND_DemoMadame_Birth(HAND_PARAMS) {
+	switch (msg->action) {
+	case 0:
+		if (getCharacterCurrentParams(kCharacterMadame)[2]) {
+			if (getCharacterCurrentParams(kCharacterMadame)[3] ||
+				(getCharacterCurrentParams(kCharacterMadame)[3] = _currentGameSessionTicks + 75,
+					_currentGameSessionTicks != -75)) {
+
+				if (_currentGameSessionTicks <= getCharacterCurrentParams(kCharacterMadame)[3])
+					return;
+
+				getCharacterCurrentParams(kCharacterMadame)[3] = 0x7FFFFFFF;
+			}
+			getCharacterCurrentParams(kCharacterMadame)[2] = 0;
+			getCharacterCurrentParams(kCharacterMadame)[1] = 1;
+			setDoor(33, kCharacterMadame, 1, 0, 0);
+			getCharacterCurrentParams(kCharacterMadame)[3] = 0;
+		} else {
+			getCharacterCurrentParams(kCharacterMadame)[3] = 0;
+		}
+
+		break;
+	case 8:
+	case 9:
+		if (getCharacterCurrentParams(kCharacterMadame)[2]) {
+			setDoor(33, kCharacterMadame, 1, 0, 0);
+			getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 5;
+			DemoMadameCall(&LogicManager::CONS_DemoMadame_DoDialog, getCathSorryDialog(), 0, 0, 0);
+		} else {
+			getCharacterCurrentParams(kCharacterMadame)[0]++;
+			setDoor(33, kCharacterMadame, 1, 0, 0);
+			if (msg->action == 9) {
+				getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 1;
+				DemoMadameCall(&LogicManager::CONS_DemoMadame_DoDialog, "LIB013", 0, 0, 0);
+			} else {
+				getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 2;
+				DemoMadameCall(&LogicManager::CONS_DemoMadame_DoDialog, "LIB012", 0, 0, 0);
+			}
+		}
+
+		break;
+	case 12:
+		getCharacter(kCharacterMadame).characterPosition.car = 4;
+		getCharacter(kCharacterMadame).characterPosition.location = 1;
+		getCharacter(kCharacterMadame).characterPosition.position = 7500;
+		setDoor(33, kCharacterMadame, 1, 10, 9);
+		break;
+	case 17:
+		if (getCharacterCurrentParams(kCharacterMadame)[1] || getCharacterCurrentParams(kCharacterMadame)[2]) {
+			setDoor(33, kCharacterMadame, 1, 10, 9);
+			getCharacterCurrentParams(kCharacterMadame)[1] = 0;
+			getCharacterCurrentParams(kCharacterMadame)[2] = 0;
+			getCharacterCurrentParams(kCharacterMadame)[0] = 0;
+		}
+
+		break;
+	case 18:
+		switch (getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8]) {
+		case 1:
+		case 2:
+			if (getCharacterCurrentParams(kCharacterMadame)[0] <= 1) {
+				getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 4;
+				DemoMadameCall(&LogicManager::CONS_DemoMadame_DoDialog, "MME1038", 0, 0, 0);
+			} else {
+				getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 3;
+				DemoMadameCall(&LogicManager::CONS_DemoMadame_DoDialog, "MME1038C", 0, 0, 0);
+			}
+
+			break;
+		case 3:
+		case 4:
+			setDoor(33, kCharacterMadame, 1, 14, 0);
+			getCharacterCurrentParams(kCharacterMadame)[2] = 1;
+			break;
+		case 5:
+			getCharacterCurrentParams(kCharacterMadame)[2] = 0;
+			getCharacterCurrentParams(kCharacterMadame)[1] = 1;
+			break;
+		default:
+			break;
+		}
+
+		break;
+	default:
+		break;
+	}
+}
+
+void LogicManager::CONS_DemoMadame_StartPart2(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterMadame).callParams[getCharacter(kCharacterMadame).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterMadame, &LogicManager::HAND_DemoMadame_StartPart2);
+	getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall] = 3;
+
+	params->clear();
+
+	fedEx(kCharacterMadame, kCharacterMadame, 12, 0);
+}
+
+void LogicManager::HAND_DemoMadame_StartPart2(HAND_PARAMS) {
+	// No-op
+}
+
+void LogicManager::CONS_DemoMadame_StartPart3(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterMadame).callParams[getCharacter(kCharacterMadame).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterMadame, &LogicManager::HAND_DemoMadame_StartPart3);
+	getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall] = 4;
+
+	params->clear();
+
+	fedEx(kCharacterMadame, kCharacterMadame, 12, 0);
+}
+
+void LogicManager::HAND_DemoMadame_StartPart3(HAND_PARAMS) {
+	// No-op
+}
+
+void LogicManager::CONS_DemoMadame_StartPart4(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterMadame).callParams[getCharacter(kCharacterMadame).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterMadame, &LogicManager::HAND_DemoMadame_StartPart4);
+	getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall] = 5;
+
+	params->clear();
+
+	fedEx(kCharacterMadame, kCharacterMadame, 12, 0);
+}
+
+void LogicManager::HAND_DemoMadame_StartPart4(HAND_PARAMS) {
+	// No-op
+}
+
+void LogicManager::CONS_DemoMadame_StartPart5(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterMadame).callParams[getCharacter(kCharacterMadame).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterMadame, &LogicManager::HAND_DemoMadame_StartPart5);
+	getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall] = 6;
+
+	params->clear();
+
+	fedEx(kCharacterMadame, kCharacterMadame, 12, 0);
+}
+
+void LogicManager::HAND_DemoMadame_StartPart5(HAND_PARAMS) {
+	// No-op
+}
+
+void (LogicManager::*LogicManager::_functionsDemoMadame[])(HAND_PARAMS) = {
+	nullptr,
+	&LogicManager::HAND_DemoMadame_DoDialog,
+	&LogicManager::HAND_DemoMadame_Birth,
+	&LogicManager::HAND_DemoMadame_StartPart2,
+	&LogicManager::HAND_DemoMadame_StartPart3,
+	&LogicManager::HAND_DemoMadame_StartPart4,
+	&LogicManager::HAND_DemoMadame_StartPart5
+};
+
+} // End of namespace LastExpress
diff --git a/engines/lastexpress/characters/demo/demo_master.cpp b/engines/lastexpress/characters/demo/demo_master.cpp
new file mode 100644
index 00000000000..04b7edab460
--- /dev/null
+++ b/engines/lastexpress/characters/demo/demo_master.cpp
@@ -0,0 +1,319 @@
+/* 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 3 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, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "lastexpress/lastexpress.h"
+
+namespace LastExpress {
+
+void LogicManager::CONS_DemoMaster(int chapter) {
+	switch (chapter) {
+	case 0:
+		_engine->getMessageManager()->setMessageHandle(
+			kCharacterMaster,
+			_functionsDemoMaster[getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall]]
+		);
+
+		break;
+	case 1:
+		CONS_DemoMaster_Birth(0, 0, 0, 0);
+		break;
+	case 2:
+		CONS_DemoMaster_StartPart2(0, 0, 0, 0);
+		break;
+	case 3:
+		CONS_DemoMaster_StartPart3(0, 0, 0, 0);
+		break;
+	case 4:
+		CONS_DemoMaster_StartPart4(0, 0, 0, 0);
+		break;
+	case 5:
+		CONS_DemoMaster_StartPart5(0, 0, 0, 0);
+		break;
+	default:
+		break;
+	}
+}
+
+void LogicManager::DemoMasterCall(CALL_PARAMS) {
+	getCharacter(kCharacterMaster).currentCall++;
+
+	(this->*functionPointer)(param1, param2, param3, param4);
+}
+
+void LogicManager::CONS_DemoMaster_SaveGame(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterMaster).callParams[getCharacter(kCharacterMaster).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterMaster, &LogicManager::HAND_DemoMaster_SaveGame);
+	getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall] = 1;
+
+	params->clear();
+
+	params->parameters[0] = param1.intParam;
+	params->parameters[1] = param2.intParam;
+
+	fedEx(kCharacterMaster, kCharacterMaster, 12, 0);
+}
+
+void LogicManager::HAND_DemoMaster_SaveGame(HAND_PARAMS) {
+	switch (msg->action) {
+	case 0:
+		getCharacter(kCharacterMaster).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(
+			kCharacterMaster,
+			_functionsDemoMaster[getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall]]
+		);
+
+		fedEx(kCharacterMaster, kCharacterMaster, 18, 0);
+		break;
+	case 12:
+		save(
+			kCharacterMaster,
+			getCharacterCurrentParams(kCharacterMaster)[0],
+			getCharacterCurrentParams(kCharacterMaster)[1]
+		);
+
+		getCharacter(kCharacterMaster).currentCall--;
+
+		_engine->getMessageManager()->setMessageHandle(
+			kCharacterMaster,
+			_functionsDemoMaster[getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall]]
+		);
+
+		fedEx(kCharacterMaster, kCharacterMaster, 18, 0);
+		break;
+	default:
+		break;
+	}
+
+}
+
+void LogicManager::CONS_DemoMaster_Birth(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterMaster).callParams[getCharacter(kCharacterMaster).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterMaster, &LogicManager::HAND_DemoMaster_Birth);
+	getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall] = 2;
+
+	params->clear();
+
+	fedEx(kCharacterMaster, kCharacterMaster, 12, 0);
+}
+
+void LogicManager::HAND_DemoMaster_Birth(HAND_PARAMS) {
+	switch (msg->action) {
+	case 0:
+	{
+		bool playSndFx = false;
+		bool doBumpCath = false;
+
+		if (_gameProgress[kProgressIsTrainRunning]) {
+			if (!getCharacterCurrentParams(kCharacterMaster)[3]) {
+				getCharacterCurrentParams(kCharacterMaster)[3] = _currentGameSessionTicks + getCharacterCurrentParams(kCharacterMaster)[0];
+				if (!getCharacterCurrentParams(kCharacterMaster)[3])
+					playSndFx = true;
+			}
+
+			if (!playSndFx && _currentGameSessionTicks > getCharacterCurrentParams(kCharacterMaster)[3]) {
+				getCharacterCurrentParams(kCharacterMaster)[3] = 0x7FFFFFFF;
+				playSndFx = true;
+			}
+
+			if (playSndFx) {
+				if (!rnd(2)) {
+					playDialog(kCharacterCath, "ZFX1007B", rnd(15) + 2, 0);
+				} else {
+					playDialog(kCharacterCath, "ZFX1005", rnd(15) + 2, 0);
+				}
+
+				getCharacterCurrentParams(kCharacterMaster)[3] = 0;
+				getCharacterCurrentParams(kCharacterMaster)[0] = 900 * (rnd(5) + 5);
+			}
+		}
+
+		if (_gameTime > 2268000 && !getCharacterCurrentParams(kCharacterMaster)[4]) {
+			getCharacterCurrentParams(kCharacterMaster)[4] = 1;
+			getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 2;
+			DemoMasterCall(&LogicManager::CONS_DemoMaster_SaveGame, 2, kEventVergesAnnaDead, 0, 0);
+			break;
+		}
+
+		if (getCharacterCurrentParams(kCharacterMaster)[1]) {
+			if (!getCharacterCurrentParams(kCharacterMaster)[5]) {
+				getCharacterCurrentParams(kCharacterMaster)[5] = _gameTime + 900;
+				if (_gameTime == -900)
+					doBumpCath = true;
+			}
+
+			if (!doBumpCath && _gameTime > getCharacterCurrentParams(kCharacterMaster)[5]) {
+				getCharacterCurrentParams(kCharacterMaster)[5] = 0x7FFFFFFF;
+				doBumpCath = true;
+			}
+
+			if (doBumpCath) {
+				bumpCath(kCarRestaurant, 58, 255);
+			}
+		}
+
+		getCharacterCurrentParams(kCharacterMaster)[5] = 0;
+
+		if (getCharacterCurrentParams(kCharacterMaster)[1]) {
+			if (!cathRunningDialog("ZFX1001"))
+				playDialog(kCharacterCath, "ZFX1001", -1, 0);
+		}
+
+		break;
+	}
+	case 12:
+		_engine->getSoundManager()->startAmbient();
+		getCharacterCurrentParams(kCharacterMaster)[0] = 900 * (rnd(5) + 5);
+		setDoor(34, kCharacterCath, 2, 255, 255);
+		getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 1;
+		DemoMasterCall(&LogicManager::CONS_DemoMaster_SaveGame, 1, 0, 0, 0);
+		break;
+	case 17:
+		getCharacter(kCharacterMaster).characterPosition.car = getCharacter(kCharacterCath).characterPosition.car;
+		if (checkCathDir(kCarRestaurant, 81)) {
+			getCharacterCurrentParams(kCharacterMaster)[1] = 1;
+			if (!dialogRunning("ZFX1001"))
+				playDialog(kCharacterCath, "ZFX1001", -1, 0);
+		} else {
+			getCharacterCurrentParams(kCharacterMaster)[1] = 0;
+			if (cathRunningDialog("ZFX1001"))
+				endDialog("ZFX1001");
+		}
+
+		if (getCharacter(kCharacterCath).characterPosition.car != getCharacterCurrentParams(kCharacterMaster)[2]) {
+			if (getCharacter(kCharacterCath).characterPosition.car == kCarRestaurant) {
+				startCycOtis(kCharacterMaster, "RCWND");
+			} else if (getCharacter(kCharacterCath).characterPosition.car == kCarRedSleeping) {
+				startCycOtis(kCharacterMaster, "S1WND");
+			} else {
+				endGraphics(kCharacterMaster);
+			}
+
+			getCharacterCurrentParams(kCharacterMaster)[2] = getCharacter(kCharacterCath).characterPosition.car;
+		}
+
+		break;
+	case 18:
+	{
+		bool doBumpCath = false;
+
+		if (getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] == 2) {
+			playNIS(kEventVergesAnnaDead);
+			endGame(1, 2259000, 58, true);
+
+			if (getCharacterCurrentParams(kCharacterMaster)[1]) {
+				if (!getCharacterCurrentParams(kCharacterMaster)[5]) {
+					getCharacterCurrentParams(kCharacterMaster)[5] = _gameTime + 900;
+					if (_gameTime == -900)
+						doBumpCath = true;
+				}
+
+				if (!doBumpCath && _gameTime > getCharacterCurrentParams(kCharacterMaster)[5]) {
+					getCharacterCurrentParams(kCharacterMaster)[5] = 0x7FFFFFFF;
+					doBumpCath = true;
+				}
+
+				if (doBumpCath) {
+					bumpCath(kCarRestaurant, 58, 255);
+				}
+			}
+
+			getCharacterCurrentParams(kCharacterMaster)[5] = 0;
+
+			if (getCharacterCurrentParams(kCharacterMaster)[1]) {
+				if (!cathRunningDialog("ZFX1001"))
+					playDialog(kCharacterCath, "ZFX1001", -1, 0);
+			}
+		}
+
+		break;
+	}
+	default:
+		break;
+	}
+}
+
+void LogicManager::CONS_DemoMaster_StartPart2(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterMaster).callParams[getCharacter(kCharacterMaster).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterMaster, &LogicManager::HAND_DemoMaster_StartPart2);
+	getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall] = 3;
+
+	params->clear();
+
+	fedEx(kCharacterMaster, kCharacterMaster, 12, 0);
+}
+
+void LogicManager::HAND_DemoMaster_StartPart2(HAND_PARAMS) {
+	// No-op
+}
+
+void LogicManager::CONS_DemoMaster_StartPart3(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterMaster).callParams[getCharacter(kCharacterMaster).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterMaster, &LogicManager::HAND_DemoMaster_StartPart3);
+	getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall] = 4;
+
+	params->clear();
+
+	fedEx(kCharacterMaster, kCharacterMaster, 12, 0);
+}
+
+void LogicManager::HAND_DemoMaster_StartPart3(HAND_PARAMS) {
+	// No-op
+}
+
+void LogicManager::CONS_DemoMaster_StartPart4(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterMaster).callParams[getCharacter(kCharacterMaster).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterMaster, &LogicManager::HAND_DemoMaster_StartPart4);
+	getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall] = 5;
+
+	params->clear();
+
+	fedEx(kCharacterMaster, kCharacterMaster, 12, 0);
+}
+
+void LogicManager::HAND_DemoMaster_StartPart4(HAND_PARAMS) {
+	// No-op
+}
+
+void LogicManager::CONS_DemoMaster_StartPart5(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterMaster).callParams[getCharacter(kCharacterMaster).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterMaster, &LogicManager::HAND_DemoMaster_StartPart5);
+	getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall] = 6;
+
+	params->clear();
+
+	fedEx(kCharacterMaster, kCharacterMaster, 12, 0);
+}
+
+void LogicManager::HAND_DemoMaster_StartPart5(HAND_PARAMS) {
+	// No-op
+}
+
+void (LogicManager::*LogicManager::_functionsDemoMaster[])(HAND_PARAMS) = {
+	nullptr,
+	&LogicManager::HAND_DemoMaster_SaveGame,
+	&LogicManager::HAND_DemoMaster_Birth,
+	&LogicManager::HAND_DemoMaster_StartPart2,
+	&LogicManager::HAND_DemoMaster_StartPart3,
+	&LogicManager::HAND_DemoMaster_StartPart4,
+	&LogicManager::HAND_DemoMaster_StartPart5
+};
+
+} // End of namespace LastExpress
diff --git a/engines/lastexpress/characters/demo/demo_monsieur.cpp b/engines/lastexpress/characters/demo/demo_monsieur.cpp
new file mode 100644
index 00000000000..c5cb818bc4f
--- /dev/null
+++ b/engines/lastexpress/characters/demo/demo_monsieur.cpp
@@ -0,0 +1,150 @@
+/* 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 3 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, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "lastexpress/lastexpress.h"
+
+namespace LastExpress {
+
+void LogicManager::CONS_DemoMonsieur(int chapter) {
+	switch (chapter) {
+	case 0:
+		_engine->getMessageManager()->setMessageHandle(
+			kCharacterMonsieur,
+			_functionsDemoMonsieur[getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall]]
+		);
+
+		break;
+	case 1:
+		CONS_DemoMonsieur_Birth(0, 0, 0, 0);
+		break;
+	case 2:
+		CONS_DemoMonsieur_StartPart2(0, 0, 0, 0);
+		break;
+	case 3:
+		CONS_DemoMonsieur_StartPart3(0, 0, 0, 0);
+		break;
+	case 4:
+		CONS_DemoMonsieur_StartPart4(0, 0, 0, 0);
+		break;
+	case 5:
+		CONS_DemoMonsieur_StartPart5(0, 0, 0, 0);
+		break;
+	default:
+		break;
+	}
+}
+
+void LogicManager::DemoMonsieurCall(CALL_PARAMS) {
+	getCharacter(kCharacterMonsieur).currentCall++;
+
+	(this->*functionPointer)(param1, param2, param3, param4);
+}
+
+void LogicManager::CONS_DemoMonsieur_Birth(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterMonsieur).callParams[getCharacter(kCharacterMonsieur).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterMonsieur, &LogicManager::HAND_DemoMonsieur_Birth);
+	getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall] = 1;
+
+	params->clear();
+
+	fedEx(kCharacterMonsieur, kCharacterMonsieur, 12, 0);
+}
+
+void LogicManager::HAND_DemoMonsieur_Birth(HAND_PARAMS) {
+	switch (msg->action) {
+	case 12:
+		getCharacter(kCharacterMonsieur).characterPosition.car = kCarRedSleeping;
+		getCharacter(kCharacterMonsieur).characterPosition.position = 8200;
+		getCharacter(kCharacterMonsieur).characterPosition.location = 1;
+		setDoor(32, kCharacterCath, 2, 255, 255);
+		startCycOtis(kCharacterMonsieur, "510");
+		break;
+	default:
+		break;
+	}
+}
+
+void LogicManager::CONS_DemoMonsieur_StartPart2(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterMonsieur).callParams[getCharacter(kCharacterMonsieur).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterMonsieur, &LogicManager::HAND_DemoMonsieur_StartPart2);
+	getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall] = 2;
+
+	params->clear();
+
+	fedEx(kCharacterMonsieur, kCharacterMonsieur, 12, 0);
+}
+
+void LogicManager::HAND_DemoMonsieur_StartPart2(HAND_PARAMS) {
+	// No-op
+}
+
+void LogicManager::CONS_DemoMonsieur_StartPart3(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterMonsieur).callParams[getCharacter(kCharacterMonsieur).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterMonsieur, &LogicManager::HAND_DemoMonsieur_StartPart3);
+	getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall] = 3;
+
+	params->clear();
+
+	fedEx(kCharacterMonsieur, kCharacterMonsieur, 12, 0);
+}
+
+void LogicManager::HAND_DemoMonsieur_StartPart3(HAND_PARAMS) {
+	// No-op
+}
+
+void LogicManager::CONS_DemoMonsieur_StartPart4(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterMonsieur).callParams[getCharacter(kCharacterMonsieur).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterMonsieur, &LogicManager::HAND_DemoMonsieur_StartPart4);
+	getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall] = 4;
+
+	params->clear();
+
+	fedEx(kCharacterMonsieur, kCharacterMonsieur, 12, 0);
+}
+
+void LogicManager::HAND_DemoMonsieur_StartPart4(HAND_PARAMS) {
+	// No-op
+}
+
+void LogicManager::CONS_DemoMonsieur_StartPart5(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterMonsieur).callParams[getCharacter(kCharacterMonsieur).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterMonsieur, &LogicManager::HAND_DemoMonsieur_StartPart5);
+	getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall] = 5;
+
+	params->clear();
+
+	fedEx(kCharacterMonsieur, kCharacterMonsieur, 12, 0);
+}
+
+void LogicManager::HAND_DemoMonsieur_StartPart5(HAND_PARAMS) {
+	// No-op
+}
+
+void (LogicManager::*LogicManager::_functionsDemoMonsieur[])(HAND_PARAMS) = {
+	nullptr,
+	&LogicManager::HAND_DemoMonsieur_Birth,
+	&LogicManager::HAND_DemoMonsieur_StartPart2,
+	&LogicManager::HAND_DemoMonsieur_StartPart3,
+	&LogicManager::HAND_DemoMonsieur_StartPart4,
+	&LogicManager::HAND_DemoMonsieur_StartPart5
+};
+
+} // End of namespace LastExpress
diff --git a/engines/lastexpress/characters/demo/demo_rebecca.cpp b/engines/lastexpress/characters/demo/demo_rebecca.cpp
new file mode 100644
index 00000000000..a1f631ebcba
--- /dev/null
+++ b/engines/lastexpress/characters/demo/demo_rebecca.cpp
@@ -0,0 +1,255 @@
+/* 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 3 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, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "lastexpress/lastexpress.h"
+
+namespace LastExpress {
+
+void LogicManager::CONS_DemoRebecca(int chapter) {
+	switch (chapter) {
+	case 0:
+		_engine->getMessageManager()->setMessageHandle(
+			kCharacterRebecca,
+			_functionsDemoRebecca[getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall]]
+		);
+
+		break;
+	case 1:
+		CONS_DemoRebecca_Birth(0, 0, 0, 0);
+		break;
+	case 2:
+		CONS_DemoRebecca_StartPart2(0, 0, 0, 0);
+		break;
+	case 3:
+		CONS_DemoRebecca_StartPart3(0, 0, 0, 0);
+		break;
+	case 4:
+		CONS_DemoRebecca_StartPart4(0, 0, 0, 0);
+		break;
+	case 5:
+		CONS_DemoRebecca_StartPart5(0, 0, 0, 0);
+		break;
+	default:
+		break;
+	}
+}
+
+void LogicManager::DemoRebeccaCall(CALL_PARAMS) {
+	getCharacter(kCharacterRebecca).currentCall++;
+
+	(this->*functionPointer)(param1, param2, param3, param4);
+}
+
+void LogicManager::CONS_DemoRebecca_DoDialog(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterRebecca).callParams[getCharacter(kCharacterRebecca).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterRebecca, &LogicManager::HAND_DemoRebecca_DoDialog);
+	getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall] = 1;
+
+	params->clear();
+
+	strncpy((char *)&params->parameters[0], param1.stringParam, 12);
+
+	fedEx(kCharacterRebecca, kCharacterRebecca, 12, 0);
+}
+
+void LogicManager::HAND_DemoRebecca_DoDialog(HAND_PARAMS) {
+	switch (msg->action) {
+	case 2:
+		getCharacter(kCharacterRebecca).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterRebecca, _functionsDemoRebecca[getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall]]);
+		fedEx(kCharacterRebecca, kCharacterRebecca, 18, 0);
+		break;
+	case 12:
+		playDialog(kCharacterRebecca, (char *)&getCharacterCurrentParams(kCharacterRebecca)[0], -1, 0);
+		break;
+	default:
+		break;
+	}
+}
+
+void LogicManager::CONS_DemoRebecca_Birth(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterRebecca).callParams[getCharacter(kCharacterRebecca).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterRebecca, &LogicManager::HAND_DemoRebecca_Birth);
+	getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall] = 2;
+
+	params->clear();
+
+	fedEx(kCharacterRebecca, kCharacterRebecca, 12, 0);
+}
+
+void LogicManager::HAND_DemoRebecca_Birth(HAND_PARAMS) {
+	switch (msg->action) {
+	case 0:
+		if (getCharacterCurrentParams(kCharacterRebecca)[0] || getCharacterCurrentParams(kCharacterRebecca)[1] >= 3 || !inDiningRoom(kCharacterCath)) {
+			if (_gameTime > 2254500 && !getCharacterCurrentParams(kCharacterRebecca)[3]) {
+				getCharacterCurrentParams(kCharacterRebecca)[3] = 1;
+				send(kCharacterRebecca, kCharacterWaiter1, 223712416, 0);
+				getCharacterCurrentParams(kCharacterRebecca)[0] = 1;
+			}
+
+			break;
+		}
+
+		if (getCharacterCurrentParams(kCharacterRebecca)[2] || (getCharacterCurrentParams(kCharacterRebecca)[2] = _gameTime + 150, _gameTime != -150)) {
+			if (_gameTime <= getCharacterCurrentParams(kCharacterRebecca)[2]) {
+				if (_gameTime > 2254500 && !getCharacterCurrentParams(kCharacterRebecca)[3]) {
+					getCharacterCurrentParams(kCharacterRebecca)[3] = 1;
+					send(kCharacterRebecca, kCharacterWaiter1, 223712416, 0);
+					getCharacterCurrentParams(kCharacterRebecca)[0] = 1;
+				}
+
+				break;
+			}
+
+			getCharacterCurrentParams(kCharacterRebecca)[2] = 0x7FFFFFFF;
+		}
+
+		if (getCharacterCurrentParams(kCharacterRebecca)[1] == 1) {
+			getCharacterCurrentParams(kCharacterRebecca)[1]++;
+			getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 1;
+			DemoRebeccaCall(&LogicManager::CONS_DemoRebecca_DoDialog, "REB1013", 0, 0, 0);
+		} else if (getCharacterCurrentParams(kCharacterRebecca)[1] == 2) {
+			getCharacterCurrentParams(kCharacterRebecca)[1]++;
+			getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 2;
+			DemoRebeccaCall(&LogicManager::CONS_DemoRebecca_DoDialog, "REB1199A", 0, 0, 0);
+		} else if (getCharacterCurrentParams(kCharacterRebecca)[1] == 3) {
+			getCharacterCurrentParams(kCharacterRebecca)[1]++;
+			getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 3;
+			DemoRebeccaCall(&LogicManager::CONS_DemoRebecca_DoDialog, "REB1199C", 0, 0, 0);
+		} else {
+			getCharacterCurrentParams(kCharacterRebecca)[1]++;
+			getCharacterCurrentParams(kCharacterRebecca)[2] = 0;
+			if (_gameTime > 2254500 && !getCharacterCurrentParams(kCharacterRebecca)[3]) {
+				getCharacterCurrentParams(kCharacterRebecca)[3] = 1;
+				send(kCharacterRebecca, kCharacterWaiter1, 223712416, 0);
+				getCharacterCurrentParams(kCharacterRebecca)[0] = 1;
+			}
+		}
+
+		break;
+	case 12:
+		getCharacter(kCharacterRebecca).characterPosition.car = kCarRestaurant;
+		getCharacter(kCharacterRebecca).characterPosition.location = 1;
+		getCharacter(kCharacterRebecca).characterPosition.position = 4690;
+		startCycOtis(kCharacterRebecca, "012D");
+		break;
+	case 18:
+		switch (getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8]) {
+		case 1:
+		case 2:
+		case 3:
+			getCharacterCurrentParams(kCharacterRebecca)[2] = 0;
+			if (_gameTime > 2254500 && !getCharacterCurrentParams(kCharacterRebecca)[3]) {
+				getCharacterCurrentParams(kCharacterRebecca)[3] = 1;
+				send(kCharacterRebecca, kCharacterWaiter1, 223712416, 0);
+				getCharacterCurrentParams(kCharacterRebecca)[0] = 1;
+			}
+
+			break;
+		case 4:
+			send(kCharacterRebecca, kCharacterWaiter1, 136702400, 0);
+			startCycOtis(kCharacterRebecca, "012G");
+			getCharacterCurrentParams(kCharacterRebecca)[0] = 0;
+			break;
+		default:
+			break;
+		}
+
+		break;
+	case 123712592:
+		startCycOtis(kCharacterWaiter1, "BLANK");
+		startCycOtis(kCharacterRebecca, "012E");
+		getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 4;
+		DemoRebeccaCall(&LogicManager::CONS_DemoRebecca_DoDialog, "REB1200", 0, 0, 0);
+		break;
+	default:
+		break;
+	}
+}
+
+void LogicManager::CONS_DemoRebecca_StartPart2(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterRebecca).callParams[getCharacter(kCharacterRebecca).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterRebecca, &LogicManager::HAND_DemoRebecca_StartPart2);
+	getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall] = 3;
+
+	params->clear();
+
+	fedEx(kCharacterRebecca, kCharacterRebecca, 12, 0);
+}
+
+void LogicManager::HAND_DemoRebecca_StartPart2(HAND_PARAMS) {
+	// No-op
+}
+
+void LogicManager::CONS_DemoRebecca_StartPart3(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterRebecca).callParams[getCharacter(kCharacterRebecca).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterRebecca, &LogicManager::HAND_DemoRebecca_StartPart3);
+	getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall] = 4;
+
+	params->clear();
+
+	fedEx(kCharacterRebecca, kCharacterRebecca, 12, 0);
+}
+
+void LogicManager::HAND_DemoRebecca_StartPart3(HAND_PARAMS) {
+	// No-op
+
+}
+
+void LogicManager::CONS_DemoRebecca_StartPart4(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterRebecca).callParams[getCharacter(kCharacterRebecca).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterRebecca, &LogicManager::HAND_DemoRebecca_StartPart4);
+	getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall] = 5;
+
+	params->clear();
+
+	fedEx(kCharacterRebecca, kCharacterRebecca, 12, 0);
+}
+
+void LogicManager::HAND_DemoRebecca_StartPart4(HAND_PARAMS) {
+	// No-op
+}
+
+void LogicManager::CONS_DemoRebecca_StartPart5(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterRebecca).callParams[getCharacter(kCharacterRebecca).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterRebecca, &LogicManager::HAND_DemoRebecca_StartPart5);
+	getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall] = 6;
+
+	params->clear();
+
+	fedEx(kCharacterRebecca, kCharacterRebecca, 12, 0);
+}
+
+void LogicManager::HAND_DemoRebecca_StartPart5(HAND_PARAMS) {
+	// No-op
+}
+
+void (LogicManager::*LogicManager::_functionsDemoRebecca[])(HAND_PARAMS) = {
+	nullptr,
+	&LogicManager::HAND_DemoRebecca_DoDialog,
+	&LogicManager::HAND_DemoRebecca_Birth,
+	&LogicManager::HAND_DemoRebecca_StartPart2,
+	&LogicManager::HAND_DemoRebecca_StartPart3,
+	&LogicManager::HAND_DemoRebecca_StartPart4,
+	&LogicManager::HAND_DemoRebecca_StartPart5
+};
+
+} // End of namespace LastExpress
diff --git a/engines/lastexpress/characters/demo/demo_tablea.cpp b/engines/lastexpress/characters/demo/demo_tablea.cpp
new file mode 100644
index 00000000000..8fd96a9ae02
--- /dev/null
+++ b/engines/lastexpress/characters/demo/demo_tablea.cpp
@@ -0,0 +1,154 @@
+/* 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 3 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, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "lastexpress/lastexpress.h"
+
+namespace LastExpress {
+
+void LogicManager::CONS_DemoTableA(int chapter) {
+	switch (chapter) {
+	case 0:
+		_engine->getMessageManager()->setMessageHandle(
+			kCharacterTableA,
+			_functionsDemoTableA[getCharacter(kCharacterTableA).callbacks[getCharacter(kCharacterTableA).currentCall]]
+		);
+
+		break;
+	case 1:
+		CONS_DemoTableA_Birth(0, 0, 0, 0);
+		break;
+	case 2:
+		CONS_DemoTableA_StartPart2(0, 0, 0, 0);
+		break;
+	case 3:
+		CONS_DemoTableA_StartPart3(0, 0, 0, 0);
+		break;
+	case 4:
+		CONS_DemoTableA_StartPart4(0, 0, 0, 0);
+		break;
+	case 5:
+		CONS_DemoTableA_StartPart5(0, 0, 0, 0);
+		break;
+	default:
+		break;
+	}
+}
+
+void LogicManager::CONS_DemoTableA_Birth(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterTableA).callParams[getCharacter(kCharacterTableA).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterTableA, &LogicManager::HAND_DemoTableA_Birth);
+	getCharacter(kCharacterTableA).callbacks[getCharacter(kCharacterTableA).currentCall] = 1;
+
+	params->clear();
+
+	fedEx(kCharacterTableA, kCharacterTableA, 12, 0);
+}
+
+void LogicManager::HAND_DemoTableA_Birth(HAND_PARAMS) {
+	switch (msg->action) {
+	case 12:
+		getCharacter(kCharacterTableA).characterPosition.position = 3970;
+		getCharacter(kCharacterTableA).characterPosition.location = 1;
+		getCharacter(kCharacterTableA).characterPosition.car = kCarRestaurant;
+		startCycOtis(kCharacterTableA, "001P");
+		break;
+	case 103798704:
+		if (msg->param.stringParam) {
+			startCycOtis(kCharacterTableA, msg->param.stringParam);
+		} else {
+			startCycOtis(kCharacterTableA, "001P");
+		}
+
+		break;
+	case 136455232:
+		startCycOtis(kCharacterTableA, "BLANK");
+		break;
+	default:
+		break;
+	}
+}
+
+void LogicManager::CONS_DemoTableA_StartPart2(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterTableA).callParams[getCharacter(kCharacterTableA).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterTableA, &LogicManager::HAND_DemoTableA_StartPart2);
+	getCharacter(kCharacterTableA).callbacks[getCharacter(kCharacterTableA).currentCall] = 2;
+
+	params->clear();
+
+	fedEx(kCharacterTableA, kCharacterTableA, 12, 0);
+}
+
+void LogicManager::HAND_DemoTableA_StartPart2(HAND_PARAMS) {
+	// No-op
+}
+
+void LogicManager::CONS_DemoTableA_StartPart3(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterTableA).callParams[getCharacter(kCharacterTableA).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterTableA, &LogicManager::HAND_DemoTableA_StartPart3);
+	getCharacter(kCharacterTableA).callbacks[getCharacter(kCharacterTableA).currentCall] = 3;
+
+	params->clear();
+
+	fedEx(kCharacterTableA, kCharacterTableA, 12, 0);
+}
+
+void LogicManager::HAND_DemoTableA_StartPart3(HAND_PARAMS) {
+	// No-op
+}
+
+void LogicManager::CONS_DemoTableA_StartPart4(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterTableA).callParams[getCharacter(kCharacterTableA).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterTableA, &LogicManager::HAND_DemoTableA_StartPart4);
+	getCharacter(kCharacterTableA).callbacks[getCharacter(kCharacterTableA).currentCall] = 4;
+
+	params->clear();
+
+	fedEx(kCharacterTableA, kCharacterTableA, 12, 0);
+}
+
+void LogicManager::HAND_DemoTableA_StartPart4(HAND_PARAMS) {
+	// No-op
+}
+
+void LogicManager::CONS_DemoTableA_StartPart5(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterTableA).callParams[getCharacter(kCharacterTableA).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterTableA, &LogicManager::HAND_DemoTableA_StartPart5);
+	getCharacter(kCharacterTableA).callbacks[getCharacter(kCharacterTableA).currentCall] = 5;
+
+	params->clear();
+
+	fedEx(kCharacterTableA, kCharacterTableA, 12, 0);
+}
+
+void LogicManager::HAND_DemoTableA_StartPart5(HAND_PARAMS) {
+	// No-op
+}
+
+void (LogicManager::*LogicManager::_functionsDemoTableA[])(HAND_PARAMS) = {
+	nullptr,
+	&LogicManager::HAND_DemoTableA_Birth,
+	&LogicManager::HAND_DemoTableA_StartPart2,
+	&LogicManager::HAND_DemoTableA_StartPart3,
+	&LogicManager::HAND_DemoTableA_StartPart4,
+	&LogicManager::HAND_DemoTableA_StartPart5,
+};
+
+} // End of namespace LastExpress
diff --git a/engines/lastexpress/characters/demo/demo_tableb.cpp b/engines/lastexpress/characters/demo/demo_tableb.cpp
new file mode 100644
index 00000000000..df6e035fcd6
--- /dev/null
+++ b/engines/lastexpress/characters/demo/demo_tableb.cpp
@@ -0,0 +1,154 @@
+/* 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 3 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, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "lastexpress/lastexpress.h"
+
+namespace LastExpress {
+
+void LogicManager::CONS_DemoTableB(int chapter) {
+	switch (chapter) {
+	case 0:
+		_engine->getMessageManager()->setMessageHandle(
+			kCharacterTableB,
+			_functionsDemoTableB[getCharacter(kCharacterTableB).callbacks[getCharacter(kCharacterTableB).currentCall]]
+		);
+
+		break;
+	case 1:
+		CONS_DemoTableB_Birth(0, 0, 0, 0);
+		break;
+	case 2:
+		CONS_DemoTableB_StartPart2(0, 0, 0, 0);
+		break;
+	case 3:
+		CONS_DemoTableB_StartPart3(0, 0, 0, 0);
+		break;
+	case 4:
+		CONS_DemoTableB_StartPart4(0, 0, 0, 0);
+		break;
+	case 5:
+		CONS_DemoTableB_StartPart5(0, 0, 0, 0);
+		break;
+	default:
+		break;
+	}
+}
+
+void LogicManager::CONS_DemoTableB_Birth(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterTableB).callParams[getCharacter(kCharacterTableB).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterTableB, &LogicManager::HAND_DemoTableB_Birth);
+	getCharacter(kCharacterTableB).callbacks[getCharacter(kCharacterTableB).currentCall] = 1;
+
+	params->clear();
+
+	fedEx(kCharacterTableB, kCharacterTableB, 12, 0);
+}
+
+void LogicManager::HAND_DemoTableB_Birth(HAND_PARAMS) {
+	switch (msg->action) {
+	case 12:
+		getCharacter(kCharacterTableB).characterPosition.position = 3970;
+		getCharacter(kCharacterTableB).characterPosition.location = 1;
+		getCharacter(kCharacterTableB).characterPosition.car = kCarRestaurant;
+		startCycOtis(kCharacterTableB, "005J");
+		break;
+	case 103798704:
+		if (msg->param.stringParam) {
+			startCycOtis(kCharacterTableB, msg->param.stringParam);
+		} else {
+			startCycOtis(kCharacterTableB, "005J");
+		}
+
+		break;
+	case 136455232:
+		startCycOtis(kCharacterTableB, "BLANK");
+		break;
+	default:
+		break;
+	}
+}
+
+void LogicManager::CONS_DemoTableB_StartPart2(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterTableB).callParams[getCharacter(kCharacterTableB).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterTableB, &LogicManager::HAND_DemoTableB_StartPart2);
+	getCharacter(kCharacterTableB).callbacks[getCharacter(kCharacterTableB).currentCall] = 2;
+
+	params->clear();
+
+	fedEx(kCharacterTableB, kCharacterTableB, 12, 0);
+}
+
+void LogicManager::HAND_DemoTableB_StartPart2(HAND_PARAMS) {
+	// No-op
+}
+
+void LogicManager::CONS_DemoTableB_StartPart3(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterTableB).callParams[getCharacter(kCharacterTableB).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterTableB, &LogicManager::HAND_DemoTableB_StartPart3);
+	getCharacter(kCharacterTableB).callbacks[getCharacter(kCharacterTableB).currentCall] = 3;
+
+	params->clear();
+
+	fedEx(kCharacterTableB, kCharacterTableB, 12, 0);
+}
+
+void LogicManager::HAND_DemoTableB_StartPart3(HAND_PARAMS) {
+	// No-op
+}
+
+void LogicManager::CONS_DemoTableB_StartPart4(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterTableB).callParams[getCharacter(kCharacterTableB).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterTableB, &LogicManager::HAND_DemoTableB_StartPart4);
+	getCharacter(kCharacterTableB).callbacks[getCharacter(kCharacterTableB).currentCall] = 4;
+
+	params->clear();
+
+	fedEx(kCharacterTableB, kCharacterTableB, 12, 0);
+}
+
+void LogicManager::HAND_DemoTableB_StartPart4(HAND_PARAMS) {
+	// No-op
+}
+
+void LogicManager::CONS_DemoTableB_StartPart5(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterTableB).callParams[getCharacter(kCharacterTableB).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterTableB, &LogicManager::HAND_DemoTableB_StartPart5);
+	getCharacter(kCharacterTableB).callbacks[getCharacter(kCharacterTableB).currentCall] = 5;
+
+	params->clear();
+
+	fedEx(kCharacterTableB, kCharacterTableB, 12, 0);
+}
+
+void LogicManager::HAND_DemoTableB_StartPart5(HAND_PARAMS) {
+	// No-op
+}
+
+void (LogicManager::*LogicManager::_functionsDemoTableB[])(HAND_PARAMS) = {
+	nullptr,
+	&LogicManager::HAND_DemoTableB_Birth,
+	&LogicManager::HAND_DemoTableB_StartPart2,
+	&LogicManager::HAND_DemoTableB_StartPart3,
+	&LogicManager::HAND_DemoTableB_StartPart4,
+	&LogicManager::HAND_DemoTableB_StartPart5,
+};
+
+} // End of namespace LastExpress
diff --git a/engines/lastexpress/characters/demo/demo_tablec.cpp b/engines/lastexpress/characters/demo/demo_tablec.cpp
new file mode 100644
index 00000000000..33e8e20dc8c
--- /dev/null
+++ b/engines/lastexpress/characters/demo/demo_tablec.cpp
@@ -0,0 +1,155 @@
+/* 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 3 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, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "lastexpress/lastexpress.h"
+
+namespace LastExpress {
+
+void LogicManager::CONS_DemoTableC(int chapter) {
+	switch (chapter) {
+	case 0:
+		_engine->getMessageManager()->setMessageHandle(
+			kCharacterTableC,
+			_functionsDemoTableC[getCharacter(kCharacterTableC).callbacks[getCharacter(kCharacterTableC).currentCall]]
+		);
+
+		break;
+	case 1:
+		CONS_DemoTableC_Birth(0, 0, 0, 0);
+		break;
+	case 2:
+		CONS_DemoTableC_StartPart2(0, 0, 0, 0);
+		break;
+	case 3:
+		CONS_DemoTableC_StartPart3(0, 0, 0, 0);
+		break;
+	case 4:
+		CONS_DemoTableC_StartPart4(0, 0, 0, 0);
+		break;
+	case 5:
+		CONS_DemoTableC_StartPart5(0, 0, 0, 0);
+		break;
+	default:
+		break;
+	}
+}
+
+void LogicManager::CONS_DemoTableC_Birth(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterTableC).callParams[getCharacter(kCharacterTableC).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterTableC, &LogicManager::HAND_DemoTableC_Birth);
+	getCharacter(kCharacterTableC).callbacks[getCharacter(kCharacterTableC).currentCall] = 1;
+
+	params->clear();
+
+	fedEx(kCharacterTableC, kCharacterTableC, 12, 0);
+}
+
+void LogicManager::HAND_DemoTableC_Birth(HAND_PARAMS) {
+	switch (msg->action) {
+	case 12:
+		_engine->getSoundManager()->playSoundFile("LOOP8A.SND", kSoundTypeWalla | kSoundFlagLooped | kVolume8, kCharacterTableC, 0);
+		getCharacter(kCharacterTableC).characterPosition.position = 4690;
+		getCharacter(kCharacterTableC).characterPosition.location = 1;
+		getCharacter(kCharacterTableC).characterPosition.car = kCarRestaurant;
+		startCycOtis(kCharacterTableC, "009G");
+		break;
+	case 103798704:
+		if (msg->param.stringParam) {
+			startCycOtis(kCharacterTableC, msg->param.stringParam);
+		} else {
+			startCycOtis(kCharacterTableC, "009G");
+		}
+
+		break;
+	case 136455232:
+		startCycOtis(kCharacterTableC, "BLANK");
+		break;
+	default:
+		break;
+	}
+}
+
+void LogicManager::CONS_DemoTableC_StartPart2(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterTableC).callParams[getCharacter(kCharacterTableC).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterTableC, &LogicManager::HAND_DemoTableC_StartPart2);
+	getCharacter(kCharacterTableC).callbacks[getCharacter(kCharacterTableC).currentCall] = 2;
+
+	params->clear();
+
+	fedEx(kCharacterTableC, kCharacterTableC, 12, 0);
+}
+
+void LogicManager::HAND_DemoTableC_StartPart2(HAND_PARAMS) {
+	// No-op
+}
+
+void LogicManager::CONS_DemoTableC_StartPart3(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterTableC).callParams[getCharacter(kCharacterTableC).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterTableC, &LogicManager::HAND_DemoTableC_StartPart3);
+	getCharacter(kCharacterTableC).callbacks[getCharacter(kCharacterTableC).currentCall] = 3;
+
+	params->clear();
+
+	fedEx(kCharacterTableC, kCharacterTableC, 12, 0);
+}
+
+void LogicManager::HAND_DemoTableC_StartPart3(HAND_PARAMS) {
+	// No-op
+}
+
+void LogicManager::CONS_DemoTableC_StartPart4(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterTableC).callParams[getCharacter(kCharacterTableC).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterTableC, &LogicManager::HAND_DemoTableC_StartPart4);
+	getCharacter(kCharacterTableC).callbacks[getCharacter(kCharacterTableC).currentCall] = 4;
+
+	params->clear();
+
+	fedEx(kCharacterTableC, kCharacterTableC, 12, 0);
+}
+
+void LogicManager::HAND_DemoTableC_StartPart4(HAND_PARAMS) {
+	// No-op
+}
+
+void LogicManager::CONS_DemoTableC_StartPart5(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterTableC).callParams[getCharacter(kCharacterTableC).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterTableC, &LogicManager::HAND_DemoTableC_StartPart5);
+	getCharacter(kCharacterTableC).callbacks[getCharacter(kCharacterTableC).currentCall] = 5;
+
+	params->clear();
+
+	fedEx(kCharacterTableC, kCharacterTableC, 12, 0);
+}
+
+void LogicManager::HAND_DemoTableC_StartPart5(HAND_PARAMS) {
+	// No-op
+}
+
+void (LogicManager::*LogicManager::_functionsDemoTableC[])(HAND_PARAMS) = {
+	nullptr,
+	&LogicManager::HAND_DemoTableC_Birth,
+	&LogicManager::HAND_DemoTableC_StartPart2,
+	&LogicManager::HAND_DemoTableC_StartPart3,
+	&LogicManager::HAND_DemoTableC_StartPart4,
+	&LogicManager::HAND_DemoTableC_StartPart5,
+};
+
+} // End of namespace LastExpress
diff --git a/engines/lastexpress/characters/demo/demo_tabled.cpp b/engines/lastexpress/characters/demo/demo_tabled.cpp
new file mode 100644
index 00000000000..34501cd7c27
--- /dev/null
+++ b/engines/lastexpress/characters/demo/demo_tabled.cpp
@@ -0,0 +1,154 @@
+/* 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 3 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, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "lastexpress/lastexpress.h"
+
+namespace LastExpress {
+
+void LogicManager::CONS_DemoTableD(int chapter) {
+	switch (chapter) {
+	case 0:
+		_engine->getMessageManager()->setMessageHandle(
+			kCharacterTableD,
+			_functionsDemoTableD[getCharacter(kCharacterTableD).callbacks[getCharacter(kCharacterTableD).currentCall]]
+		);
+
+		break;
+	case 1:
+		CONS_DemoTableD_Birth(0, 0, 0, 0);
+		break;
+	case 2:
+		CONS_DemoTableD_StartPart2(0, 0, 0, 0);
+		break;
+	case 3:
+		CONS_DemoTableD_StartPart3(0, 0, 0, 0);
+		break;
+	case 4:
+		CONS_DemoTableD_StartPart4(0, 0, 0, 0);
+		break;
+	case 5:
+		CONS_DemoTableD_StartPart5(0, 0, 0, 0);
+		break;
+	default:
+		break;
+	}
+}
+
+void LogicManager::CONS_DemoTableD_Birth(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterTableD).callParams[getCharacter(kCharacterTableD).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterTableD, &LogicManager::HAND_DemoTableD_Birth);
+	getCharacter(kCharacterTableD).callbacks[getCharacter(kCharacterTableD).currentCall] = 1;
+
+	params->clear();
+
+	fedEx(kCharacterTableD, kCharacterTableD, 12, 0);
+}
+
+void LogicManager::HAND_DemoTableD_Birth(HAND_PARAMS) {
+	switch (msg->action) {
+	case 12:
+		getCharacter(kCharacterTableD).characterPosition.position = 4690;
+		getCharacter(kCharacterTableD).characterPosition.location = 1;
+		getCharacter(kCharacterTableD).characterPosition.car = kCarRestaurant;
+		startCycOtis(kCharacterTableD, "010M");
+		break;
+	case 103798704:
+		if (msg->param.stringParam) {
+			startCycOtis(kCharacterTableD, msg->param.stringParam);
+		} else {
+			startCycOtis(kCharacterTableD, "010M");
+		}
+
+		break;
+	case 136455232:
+		startCycOtis(kCharacterTableD, "BLANK");
+		break;
+	default:
+		break;
+	}
+}
+
+void LogicManager::CONS_DemoTableD_StartPart2(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterTableD).callParams[getCharacter(kCharacterTableD).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterTableD, &LogicManager::HAND_DemoTableD_StartPart2);
+	getCharacter(kCharacterTableD).callbacks[getCharacter(kCharacterTableD).currentCall] = 2;
+
+	params->clear();
+
+	fedEx(kCharacterTableD, kCharacterTableD, 12, 0);
+}
+
+void LogicManager::HAND_DemoTableD_StartPart2(HAND_PARAMS) {
+	// No-op
+}
+
+void LogicManager::CONS_DemoTableD_StartPart3(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterTableD).callParams[getCharacter(kCharacterTableD).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterTableD, &LogicManager::HAND_DemoTableD_StartPart3);
+	getCharacter(kCharacterTableD).callbacks[getCharacter(kCharacterTableD).currentCall] = 3;
+
+	params->clear();
+
+	fedEx(kCharacterTableD, kCharacterTableD, 12, 0);
+}
+
+void LogicManager::HAND_DemoTableD_StartPart3(HAND_PARAMS) {
+	// No-op
+}
+
+void LogicManager::CONS_DemoTableD_StartPart4(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterTableD).callParams[getCharacter(kCharacterTableD).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterTableD, &LogicManager::HAND_DemoTableD_StartPart4);
+	getCharacter(kCharacterTableD).callbacks[getCharacter(kCharacterTableD).currentCall] = 4;
+
+	params->clear();
+
+	fedEx(kCharacterTableD, kCharacterTableD, 12, 0);
+}
+
+void LogicManager::HAND_DemoTableD_StartPart4(HAND_PARAMS) {
+	// No-op
+}
+
+void LogicManager::CONS_DemoTableD_StartPart5(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterTableD).callParams[getCharacter(kCharacterTableD).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterTableD, &LogicManager::HAND_DemoTableD_StartPart5);
+	getCharacter(kCharacterTableD).callbacks[getCharacter(kCharacterTableD).currentCall] = 5;
+
+	params->clear();
+
+	fedEx(kCharacterTableD, kCharacterTableD, 12, 0);
+}
+
+void LogicManager::HAND_DemoTableD_StartPart5(HAND_PARAMS) {
+	// No-op
+}
+
+void (LogicManager::*LogicManager::_functionsDemoTableD[])(HAND_PARAMS) = {
+	nullptr,
+	&LogicManager::HAND_DemoTableD_Birth,
+	&LogicManager::HAND_DemoTableD_StartPart2,
+	&LogicManager::HAND_DemoTableD_StartPart3,
+	&LogicManager::HAND_DemoTableD_StartPart4,
+	&LogicManager::HAND_DemoTableD_StartPart5,
+};
+
+} // End of namespace LastExpress
diff --git a/engines/lastexpress/characters/demo/demo_tablee.cpp b/engines/lastexpress/characters/demo/demo_tablee.cpp
new file mode 100644
index 00000000000..bf5c6086cbd
--- /dev/null
+++ b/engines/lastexpress/characters/demo/demo_tablee.cpp
@@ -0,0 +1,154 @@
+/* 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 3 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, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "lastexpress/lastexpress.h"
+
+namespace LastExpress {
+
+void LogicManager::CONS_DemoTableE(int chapter) {
+	switch (chapter) {
+	case 0:
+		_engine->getMessageManager()->setMessageHandle(
+			kCharacterTableE,
+			_functionsDemoTableE[getCharacter(kCharacterTableE).callbacks[getCharacter(kCharacterTableE).currentCall]]
+		);
+
+		break;
+	case 1:
+		CONS_DemoTableE_Birth(0, 0, 0, 0);
+		break;
+	case 2:
+		CONS_DemoTableE_StartPart2(0, 0, 0, 0);
+		break;
+	case 3:
+		CONS_DemoTableE_StartPart3(0, 0, 0, 0);
+		break;
+	case 4:
+		CONS_DemoTableE_StartPart4(0, 0, 0, 0);
+		break;
+	case 5:
+		CONS_DemoTableE_StartPart5(0, 0, 0, 0);
+		break;
+	default:
+		break;
+	}
+}
+
+void LogicManager::CONS_DemoTableE_Birth(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterTableE).callParams[getCharacter(kCharacterTableE).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterTableE, &LogicManager::HAND_DemoTableE_Birth);
+	getCharacter(kCharacterTableE).callbacks[getCharacter(kCharacterTableE).currentCall] = 1;
+
+	params->clear();
+
+	fedEx(kCharacterTableE, kCharacterTableE, 12, 0);
+}
+
+void LogicManager::HAND_DemoTableE_Birth(HAND_PARAMS) {
+	switch (msg->action) {
+	case 12:
+		getCharacter(kCharacterTableE).characterPosition.position = 5420;
+		getCharacter(kCharacterTableE).characterPosition.location = 1;
+		getCharacter(kCharacterTableE).characterPosition.car = kCarRestaurant;
+		startCycOtis(kCharacterTableE, "014F");
+		break;
+	case 103798704:
+		if (msg->param.stringParam) {
+			startCycOtis(kCharacterTableE, msg->param.stringParam);
+		} else {
+			startCycOtis(kCharacterTableE, "014F");
+		}
+
+		break;
+	case 136455232:
+		startCycOtis(kCharacterTableE, "BLANK");
+		break;
+	default:
+		break;
+	}
+}
+
+void LogicManager::CONS_DemoTableE_StartPart2(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterTableE).callParams[getCharacter(kCharacterTableE).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterTableE, &LogicManager::HAND_DemoTableE_StartPart2);
+	getCharacter(kCharacterTableE).callbacks[getCharacter(kCharacterTableE).currentCall] = 2;
+
+	params->clear();
+
+	fedEx(kCharacterTableE, kCharacterTableE, 12, 0);
+}
+
+void LogicManager::HAND_DemoTableE_StartPart2(HAND_PARAMS) {
+	// No-op
+}
+
+void LogicManager::CONS_DemoTableE_StartPart3(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterTableE).callParams[getCharacter(kCharacterTableE).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterTableE, &LogicManager::HAND_DemoTableE_StartPart3);
+	getCharacter(kCharacterTableE).callbacks[getCharacter(kCharacterTableE).currentCall] = 3;
+
+	params->clear();
+
+	fedEx(kCharacterTableE, kCharacterTableE, 12, 0);
+}
+
+void LogicManager::HAND_DemoTableE_StartPart3(HAND_PARAMS) {
+	// No-op
+}
+
+void LogicManager::CONS_DemoTableE_StartPart4(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterTableE).callParams[getCharacter(kCharacterTableE).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterTableE, &LogicManager::HAND_DemoTableE_StartPart4);
+	getCharacter(kCharacterTableE).callbacks[getCharacter(kCharacterTableE).currentCall] = 4;
+
+	params->clear();
+
+	fedEx(kCharacterTableE, kCharacterTableE, 12, 0);
+}
+
+void LogicManager::HAND_DemoTableE_StartPart4(HAND_PARAMS) {
+	// No-op
+}
+
+void LogicManager::CONS_DemoTableE_StartPart5(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterTableE).callParams[getCharacter(kCharacterTableE).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterTableE, &LogicManager::HAND_DemoTableE_StartPart5);
+	getCharacter(kCharacterTableE).callbacks[getCharacter(kCharacterTableE).currentCall] = 5;
+
+	params->clear();
+
+	fedEx(kCharacterTableE, kCharacterTableE, 12, 0);
+}
+
+void LogicManager::HAND_DemoTableE_StartPart5(HAND_PARAMS) {
+	// No-op
+}
+
+void (LogicManager::*LogicManager::_functionsDemoTableE[])(HAND_PARAMS) = {
+	nullptr,
+	&LogicManager::HAND_DemoTableE_Birth,
+	&LogicManager::HAND_DemoTableE_StartPart2,
+	&LogicManager::HAND_DemoTableE_StartPart3,
+	&LogicManager::HAND_DemoTableE_StartPart4,
+	&LogicManager::HAND_DemoTableE_StartPart5,
+};
+
+} // End of namespace LastExpress
diff --git a/engines/lastexpress/characters/demo/demo_tablef.cpp b/engines/lastexpress/characters/demo/demo_tablef.cpp
new file mode 100644
index 00000000000..6652c8d5104
--- /dev/null
+++ b/engines/lastexpress/characters/demo/demo_tablef.cpp
@@ -0,0 +1,154 @@
+/* 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 3 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, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "lastexpress/lastexpress.h"
+
+namespace LastExpress {
+
+void LogicManager::CONS_DemoTableF(int chapter) {
+	switch (chapter) {
+	case 0:
+		_engine->getMessageManager()->setMessageHandle(
+			kCharacterTableF,
+			_functionsDemoTableF[getCharacter(kCharacterTableF).callbacks[getCharacter(kCharacterTableF).currentCall]]
+		);
+
+		break;
+	case 1:
+		CONS_DemoTableF_Birth(0, 0, 0, 0);
+		break;
+	case 2:
+		CONS_DemoTableF_StartPart2(0, 0, 0, 0);
+		break;
+	case 3:
+		CONS_DemoTableF_StartPart3(0, 0, 0, 0);
+		break;
+	case 4:
+		CONS_DemoTableF_StartPart4(0, 0, 0, 0);
+		break;
+	case 5:
+		CONS_DemoTableF_StartPart5(0, 0, 0, 0);
+		break;
+	default:
+		break;
+	}
+}
+
+void LogicManager::CONS_DemoTableF_Birth(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterTableF).callParams[getCharacter(kCharacterTableF).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterTableF, &LogicManager::HAND_DemoTableF_Birth);
+	getCharacter(kCharacterTableF).callbacks[getCharacter(kCharacterTableF).currentCall] = 1;
+
+	params->clear();
+
+	fedEx(kCharacterTableF, kCharacterTableF, 12, 0);
+}
+
+void LogicManager::HAND_DemoTableF_Birth(HAND_PARAMS) {
+	switch (msg->action) {
+	case 12:
+		getCharacter(kCharacterTableF).characterPosition.position = 5420;
+		getCharacter(kCharacterTableF).characterPosition.location = 1;
+		getCharacter(kCharacterTableF).characterPosition.car = kCarRestaurant;
+		startCycOtis(kCharacterTableF, "024D");
+		break;
+	case 103798704:
+		if (msg->param.stringParam) {
+			startCycOtis(kCharacterTableF, msg->param.stringParam);
+		} else {
+			startCycOtis(kCharacterTableF, "024D");
+		}
+
+		break;
+	case 136455232:
+		startCycOtis(kCharacterTableF, "BLANK");
+		break;
+	default:
+		break;
+	}
+}
+
+void LogicManager::CONS_DemoTableF_StartPart2(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterTableF).callParams[getCharacter(kCharacterTableF).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterTableF, &LogicManager::HAND_DemoTableF_StartPart2);
+	getCharacter(kCharacterTableF).callbacks[getCharacter(kCharacterTableF).currentCall] = 2;
+
+	params->clear();
+
+	fedEx(kCharacterTableF, kCharacterTableF, 12, 0);
+}
+
+void LogicManager::HAND_DemoTableF_StartPart2(HAND_PARAMS) {
+	// No-op
+}
+
+void LogicManager::CONS_DemoTableF_StartPart3(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterTableF).callParams[getCharacter(kCharacterTableF).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterTableF, &LogicManager::HAND_DemoTableF_StartPart3);
+	getCharacter(kCharacterTableF).callbacks[getCharacter(kCharacterTableF).currentCall] = 3;
+
+	params->clear();
+
+	fedEx(kCharacterTableF, kCharacterTableF, 12, 0);
+}
+
+void LogicManager::HAND_DemoTableF_StartPart3(HAND_PARAMS) {
+	// No-op
+}
+
+void LogicManager::CONS_DemoTableF_StartPart4(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterTableF).callParams[getCharacter(kCharacterTableF).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterTableF, &LogicManager::HAND_DemoTableF_StartPart4);
+	getCharacter(kCharacterTableF).callbacks[getCharacter(kCharacterTableF).currentCall] = 4;
+
+	params->clear();
+
+	fedEx(kCharacterTableF, kCharacterTableF, 12, 0);
+}
+
+void LogicManager::HAND_DemoTableF_StartPart4(HAND_PARAMS) {
+	// No-op
+}
+
+void LogicManager::CONS_DemoTableF_StartPart5(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterTableF).callParams[getCharacter(kCharacterTableF).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterTableF, &LogicManager::HAND_DemoTableF_StartPart5);
+	getCharacter(kCharacterTableF).callbacks[getCharacter(kCharacterTableF).currentCall] = 5;
+
+	params->clear();
+
+	fedEx(kCharacterTableF, kCharacterTableF, 12, 0);
+}
+
+void LogicManager::HAND_DemoTableF_StartPart5(HAND_PARAMS) {
+	// No-op
+}
+
+void (LogicManager::*LogicManager::_functionsDemoTableF[])(HAND_PARAMS) = {
+	nullptr,
+	&LogicManager::HAND_DemoTableF_Birth,
+	&LogicManager::HAND_DemoTableF_StartPart2,
+	&LogicManager::HAND_DemoTableF_StartPart3,
+	&LogicManager::HAND_DemoTableF_StartPart4,
+	&LogicManager::HAND_DemoTableF_StartPart5,
+};
+
+} // End of namespace LastExpress
diff --git a/engines/lastexpress/characters/demo/demo_tatiana.cpp b/engines/lastexpress/characters/demo/demo_tatiana.cpp
new file mode 100644
index 00000000000..2144167f3f0
--- /dev/null
+++ b/engines/lastexpress/characters/demo/demo_tatiana.cpp
@@ -0,0 +1,184 @@
+/* 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 3 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, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "lastexpress/lastexpress.h"
+
+namespace LastExpress {
+
+void LogicManager::CONS_DemoTatiana(int chapter) {
+	switch (chapter) {
+	case 0:
+		_engine->getMessageManager()->setMessageHandle(
+			kCharacterTatiana,
+			_functionsDemoTatiana[getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall]]
+		);
+
+		break;
+	case 1:
+		CONS_DemoTatiana_Birth(0, 0, 0, 0);
+		break;
+	case 2:
+		CONS_DemoTatiana_StartPart2(0, 0, 0, 0);
+		break;
+	case 3:
+		CONS_DemoTatiana_StartPart3(0, 0, 0, 0);
+		break;
+	case 4:
+		CONS_DemoTatiana_StartPart4(0, 0, 0, 0);
+		break;
+	case 5:
+		CONS_DemoTatiana_StartPart5(0, 0, 0, 0);
+		break;
+	default:
+		break;
+	}
+}
+
+void LogicManager::CONS_DemoTatiana_Birth(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterTatiana).callParams[getCharacter(kCharacterTatiana).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterTatiana, &LogicManager::HAND_DemoTatiana_Birth);
+	getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall] = 1;
+
+	params->clear();
+
+	fedEx(kCharacterTatiana, kCharacterTatiana, 12, 0);
+}
+
+void LogicManager::HAND_DemoTatiana_Birth(HAND_PARAMS) {
+	switch (msg->action) {
+	case 0:
+		if (!getCharacterCurrentParams(kCharacterTatiana)[1] && !getCharacterCurrentParams(kCharacterTatiana)[3]) {
+			getCharacterCurrentParams(kCharacterTatiana)[0] -= _gameTimeTicksDelta;
+			if (getCharacterCurrentParams(kCharacterTatiana)[0] < _gameTimeTicksDelta) {
+				startCycOtis(kCharacterTatiana, (char *)&getCharacterCurrentParams(kCharacterTatiana)[7]);
+				playDialog(kCharacterTatiana, (char *)&getCharacterCurrentParams(kCharacterTatiana)[4], -1, 0);
+				getCharacterCurrentParams(kCharacterTatiana)[1] = 1;
+			}
+		}
+
+		break;
+	case 2:
+		getCharacterCurrentParams(kCharacterTatiana)[1] = 0;
+		getCharacterCurrentParams(kCharacterTatiana)[2]++;
+		switch (getCharacterCurrentParams(kCharacterTatiana)[2]) {
+		case 1:
+			getCharacterCurrentParams(kCharacterTatiana)[0] = 900;
+			startCycOtis(kCharacterTatiana, "110A");
+			Common::strcpy_s((char *)&getCharacterCurrentParams(kCharacterTatiana)[4], 12, "Tat3160B");
+			Common::strcpy_s((char *)&getCharacterCurrentParams(kCharacterTatiana)[7], 12, "110A");
+			break;
+		case 2:
+			getCharacterCurrentParams(kCharacterTatiana)[0] = 2700;
+			startCycOtis(kCharacterTatiana, "110B");
+			Common::strcpy_s((char *)&getCharacterCurrentParams(kCharacterTatiana)[4], 12, "Tat3160D");
+			Common::strcpy_s((char *)&getCharacterCurrentParams(kCharacterTatiana)[7], 12, "110D");
+			break;
+		case 3:
+			getCharacterCurrentParams(kCharacterTatiana)[0] = 4500;
+			startCycOtis(kCharacterTatiana, "110B");
+			Common::strcpy_s((char *)&getCharacterCurrentParams(kCharacterTatiana)[4], 12, "Tat3160E");
+			Common::strcpy_s((char *)&getCharacterCurrentParams(kCharacterTatiana)[7], 12, "110D");
+			break;
+		default:
+			getCharacterCurrentParams(kCharacterTatiana)[3] = 1;
+			break;
+		}
+
+		break;
+	case 12:
+		getCharacter(kCharacterTatiana).characterPosition.car = kCarRestaurant;
+		getCharacter(kCharacterTatiana).characterPosition.location = 1;
+		getCharacter(kCharacterTatiana).characterPosition.position = 1750;
+		startCycOtis(kCharacterTatiana, "110C");
+		playDialog(kCharacterTatiana, "Tat3160A", -1, 0);
+		getCharacterCurrentParams(kCharacterTatiana)[1] = 1;
+		break;
+	default:
+		break;
+	}
+}
+
+void LogicManager::CONS_DemoTatiana_StartPart2(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterTatiana).callParams[getCharacter(kCharacterTatiana).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterTatiana, &LogicManager::HAND_DemoTatiana_StartPart2);
+	getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall] = 2;
+
+	params->clear();
+
+	fedEx(kCharacterTatiana, kCharacterTatiana, 12, 0);
+}
+
+void LogicManager::HAND_DemoTatiana_StartPart2(HAND_PARAMS) {
+	// No-op
+}
+
+void LogicManager::CONS_DemoTatiana_StartPart3(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterTatiana).callParams[getCharacter(kCharacterTatiana).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterTatiana, &LogicManager::HAND_DemoTatiana_StartPart3);
+	getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall] = 3;
+
+	params->clear();
+
+	fedEx(kCharacterTatiana, kCharacterTatiana, 12, 0);
+}
+
+void LogicManager::HAND_DemoTatiana_StartPart3(HAND_PARAMS) {
+	// No-op
+}
+
+void LogicManager::CONS_DemoTatiana_StartPart4(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterTatiana).callParams[getCharacter(kCharacterTatiana).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterTatiana, &LogicManager::HAND_DemoTatiana_StartPart4);
+	getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall] = 4;
+
+	params->clear();
+
+	fedEx(kCharacterTatiana, kCharacterTatiana, 12, 0);
+}
+
+void LogicManager::HAND_DemoTatiana_StartPart4(HAND_PARAMS) {
+	// No-op
+}
+
+void LogicManager::CONS_DemoTatiana_StartPart5(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterTatiana).callParams[getCharacter(kCharacterTatiana).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterTatiana, &LogicManager::HAND_DemoTatiana_StartPart5);
+	getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall] = 5;
+
+	params->clear();
+
+	fedEx(kCharacterTatiana, kCharacterTatiana, 12, 0);
+}
+
+void LogicManager::HAND_DemoTatiana_StartPart5(HAND_PARAMS) {
+	// No-op
+}
+
+void (LogicManager::*LogicManager::_functionsDemoTatiana[])(HAND_PARAMS) = {
+	nullptr,
+	&LogicManager::HAND_DemoTatiana_Birth,
+	&LogicManager::HAND_DemoTatiana_StartPart2,
+	&LogicManager::HAND_DemoTatiana_StartPart3,
+	&LogicManager::HAND_DemoTatiana_StartPart4,
+	&LogicManager::HAND_DemoTatiana_StartPart5
+};
+
+} // End of namespace LastExpress
diff --git a/engines/lastexpress/characters/demo/demo_vesna.cpp b/engines/lastexpress/characters/demo/demo_vesna.cpp
new file mode 100644
index 00000000000..d28aad51642
--- /dev/null
+++ b/engines/lastexpress/characters/demo/demo_vesna.cpp
@@ -0,0 +1,411 @@
+/* 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 3 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, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "lastexpress/lastexpress.h"
+
+namespace LastExpress {
+
+void LogicManager::CONS_DemoVesna(int chapter) {
+	switch (chapter) {
+	case 0:
+		_engine->getMessageManager()->setMessageHandle(
+			kCharacterVesna,
+			_functionsDemoVesna[getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall]]
+		);
+
+		break;
+	case 1:
+		CONS_DemoVesna_Birth(0, 0, 0, 0);
+		break;
+	case 2:
+		CONS_DemoVesna_StartPart2(0, 0, 0, 0);
+		break;
+	case 3:
+		CONS_DemoVesna_StartPart3(0, 0, 0, 0);
+		break;
+	case 4:
+		CONS_DemoVesna_StartPart4(0, 0, 0, 0);
+		break;
+	case 5:
+		CONS_DemoVesna_StartPart5(0, 0, 0, 0);
+		break;
+	default:
+		break;
+	}
+}
+
+void LogicManager::DemoVesnaCall(CALL_PARAMS) {
+	getCharacter(kCharacterVesna).currentCall++;
+
+	(this->*functionPointer)(param1, param2, param3, param4);
+}
+
+void LogicManager::CONS_DemoVesna_DoCorrOtis(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterVesna).callParams[getCharacter(kCharacterVesna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterVesna, &LogicManager::HAND_DemoVesna_DoCorrOtis);
+	getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall] = 1;
+
+	params->clear();
+
+	strncpy((char *)&params->parameters[0], param1.stringParam, 12);
+
+	params->parameters[3] = param2.intParam;
+
+	fedEx(kCharacterVesna, kCharacterVesna, 12, 0);
+}
+
+void LogicManager::HAND_DemoVesna_DoCorrOtis(HAND_PARAMS) {
+	if (msg->action == 3) {
+		releaseAtDoor(kCharacterVesna, getCharacterCurrentParams(kCharacterVesna)[3]);
+
+		getCharacter(kCharacterVesna).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterVesna, _functionsDemoVesna[getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall]]);
+		fedEx(kCharacterVesna, kCharacterVesna, 18, 0);
+	} else if (msg->action == 12) {
+		startSeqOtis(kCharacterVesna, (char *)&getCharacterCurrentParams(kCharacterVesna)[0]);
+		blockAtDoor(kCharacterVesna, getCharacterCurrentParams(kCharacterVesna)[3]);
+	}
+}
+
+void LogicManager::CONS_DemoVesna_DoSeqOtis(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterVesna).callParams[getCharacter(kCharacterVesna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterVesna, &LogicManager::HAND_DemoVesna_DoSeqOtis);
+	getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall] = 2;
+
+	params->clear();
+
+	strncpy((char *)&params->parameters[0], param1.stringParam, 12);
+
+	fedEx(kCharacterVesna, kCharacterVesna, 12, 0);
+}
+
+void LogicManager::HAND_DemoVesna_DoSeqOtis(HAND_PARAMS) {
+	if (msg->action == 3) {
+		getCharacter(kCharacterVesna).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterVesna, _functionsDemoVesna[getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall]]);
+		fedEx(kCharacterVesna, kCharacterVesna, 18, 0);
+	} else if (msg->action == 12) {
+		startSeqOtis(kCharacterVesna, (char *)&getCharacterCurrentParams(kCharacterVesna)[0]);
+	}
+}
+
+void LogicManager::CONS_DemoVesna_DoWalk(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterVesna).callParams[getCharacter(kCharacterVesna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterVesna, &LogicManager::HAND_DemoVesna_DoWalk);
+	getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall] = 3;
+
+	params->clear();
+
+	params->parameters[0] = param1.intParam;
+	params->parameters[1] = param2.intParam;
+
+	fedEx(kCharacterVesna, kCharacterVesna, 12, 0);
+}
+
+void LogicManager::HAND_DemoVesna_DoWalk(HAND_PARAMS) {
+	switch (msg->action) {
+	case 0:
+	case 12:
+		if (walk(kCharacterVesna, getCharacterCurrentParams(kCharacterVesna)[0], getCharacterCurrentParams(kCharacterVesna)[1])) {
+			getCharacter(kCharacterVesna).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterVesna, _functionsDemoVesna[getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall]]);
+			fedEx(kCharacterVesna, kCharacterVesna, 18, 0);
+		}
+
+		break;
+	case 5:
+		if (rnd(2) == 0) {
+			playDialog(kCharacterCath, "CAT1015A", -1, 0);
+		} else {
+			playDialog(kCharacterCath, "CAT1015", -1, 0);
+		}
+
+		break;
+	case 6:
+		playChrExcuseMe(kCharacterVesna, kCharacterCath, 0);
+		break;
+	default:
+		break;
+	}
+}
+
+void LogicManager::CONS_DemoVesna_WaitRCClear(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterVesna).callParams[getCharacter(kCharacterVesna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterVesna, &LogicManager::HAND_DemoVesna_WaitRCClear);
+	getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall] = 4;
+
+	params->clear();
+
+	fedEx(kCharacterVesna, kCharacterVesna, 12, 0);
+}
+
+void LogicManager::HAND_DemoVesna_WaitRCClear(HAND_PARAMS) {
+	if ((msg->action == 0 && rcClear()) || (msg->action == 12 && rcClear())) {
+		getCharacter(kCharacterVesna).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterVesna, _functionsDemoVesna[getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall]]);
+		fedEx(kCharacterVesna, kCharacterVesna, 18, 0);
+	}
+}
+
+void LogicManager::CONS_DemoVesna_FinishSeqOtis(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterVesna).callParams[getCharacter(kCharacterVesna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterVesna, &LogicManager::HAND_DemoVesna_FinishSeqOtis);
+	getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall] = 5;
+
+	params->clear();
+
+	fedEx(kCharacterVesna, kCharacterVesna, 12, 0);
+}
+
+void LogicManager::HAND_DemoVesna_FinishSeqOtis(HAND_PARAMS) {
+	if (msg->action == 3) {
+		getCharacter(kCharacterVesna).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterVesna, _functionsDemoVesna[getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall]]);
+		fedEx(kCharacterVesna, kCharacterVesna, 18, 0);
+	}
+}
+
+void LogicManager::CONS_DemoVesna_Birth(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterVesna).callParams[getCharacter(kCharacterVesna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterVesna, &LogicManager::HAND_DemoVesna_Birth);
+	getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall] = 6;
+
+	params->clear();
+
+	fedEx(kCharacterVesna, kCharacterVesna, 12, 0);
+}
+
+void LogicManager::HAND_DemoVesna_Birth(HAND_PARAMS) {
+	if (msg->action == 12)
+		CONS_DemoVesna_InComp(0, 0, 0, 0);
+}
+
+void LogicManager::CONS_DemoVesna_InComp(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterVesna).callParams[getCharacter(kCharacterVesna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterVesna, &LogicManager::HAND_DemoVesna_InComp);
+	getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall] = 7;
+
+	params->clear();
+
+	fedEx(kCharacterVesna, kCharacterVesna, 12, 0);
+}
+
+void LogicManager::HAND_DemoVesna_InComp(HAND_PARAMS) {
+	switch (msg->action) {
+	case 0:
+		if (_gameProgress[kProgressField54] && getCharacterCurrentParams(kCharacterVesna)[0] != 0x7FFFFFFF && _gameTime) {
+			if (_gameTime <= 2259000) {
+				if (!cathInCorridor(kCarRedSleeping) || !getCharacterCurrentParams(kCharacterVesna)[0]) {
+					getCharacterCurrentParams(kCharacterVesna)[0] = _gameTime;
+					if (!_gameTime) {
+						CONS_DemoVesna_KillAnna(0, 0, 0, 0);
+						break;
+					}
+				}
+
+				if (getCharacterCurrentParams(kCharacterVesna)[0] >= _gameTime)
+					break;
+			}
+
+			getCharacterCurrentParams(kCharacterVesna)[0] = 0x7FFFFFFF;
+			CONS_DemoVesna_KillAnna(0, 0, 0, 0);
+		}
+
+		break;
+	case 12:
+		getCharacter(kCharacterVesna).characterPosition.car = kCarRedSleeping;
+		getCharacter(kCharacterVesna).characterPosition.position = 3050;
+		getCharacter(kCharacterVesna).characterPosition.location = 1;
+		getCharacter(kCharacterVesna).clothes = 0;
+		getCharacter(kCharacterVesna).inventoryItem = 0;
+		endGraphics(kCharacterVesna);
+		break;
+	default:
+		break;
+	}
+}
+
+void LogicManager::CONS_DemoVesna_KillAnna(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterVesna).callParams[getCharacter(kCharacterVesna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterVesna, &LogicManager::HAND_DemoVesna_KillAnna);
+	getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall] = 8;
+
+	params->clear();
+
+	fedEx(kCharacterVesna, kCharacterVesna, 12, 0);
+}
+
+void LogicManager::HAND_DemoVesna_KillAnna(HAND_PARAMS) {
+	switch (msg->action) {
+	case 12:
+		getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8] = 1;
+		DemoVesnaCall(&LogicManager::CONS_DemoVesna_DoCorrOtis, "610Bg", 38, 0, 0);
+		break;
+	case 18:
+		switch (getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8]) {
+		case 1:
+			getCharacter(kCharacterVesna).characterPosition.location = 0;
+			if (getCharacter(kCharacterVesna).characterPosition.position < 2087)
+				getCharacter(kCharacterVesna).characterPosition.position = 2088;
+			getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8] = 2;
+			DemoVesnaCall(&LogicManager::CONS_DemoVesna_DoWalk, kCarRestaurant, 850, 0, 0);
+			break;
+		case 2:
+			getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8] = 3;
+			DemoVesnaCall(&LogicManager::CONS_DemoVesna_WaitRCClear, 0, 0, 0, 0);
+			break;
+		case 3:
+			getCharacter(kCharacterVesna).characterPosition.position = 1540;
+			getCharacter(kCharacterVesna).characterPosition.location = 0;
+			getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8] = 4;
+			DemoVesnaCall(&LogicManager::CONS_DemoVesna_DoSeqOtis, "808US", 0, 0, 0);
+			break;
+		case 4:
+			startSeqOtis(kCharacterVesna, "808UD");
+
+			if (inSalon(kCharacterCath))
+				advanceFrame(kCharacterVesna);
+
+			getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8] = 5;
+			DemoVesnaCall(&LogicManager::CONS_DemoVesna_FinishSeqOtis, 0, 0, 0, 0);
+			break;
+		case 5:
+			endGraphics(kCharacterVesna);
+			getCharacter(kCharacterVesna).characterPosition.car = kCarBaggage;
+			send(kCharacterVesna, kCharacterAnna, 235856512, 0);
+			break;
+		case 6:
+			getCharacter(kCharacterVesna).characterPosition.car = kCarRestaurant;
+			getCharacter(kCharacterVesna).characterPosition.position = 5800;
+			getCharacter(kCharacterVesna).characterPosition.location = 0;
+			getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8] = 7;
+			DemoVesnaCall(&LogicManager::CONS_DemoVesna_DoSeqOtis, "808DD", 0, 0, 0);
+			break;
+		case 7:
+			startSeqOtis(kCharacterVesna, "808DS");
+
+			if (inDiningRoom(kCharacterCath))
+				advanceFrame(kCharacterVesna);
+
+			getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8] = 8;
+			DemoVesnaCall(&LogicManager::CONS_DemoVesna_FinishSeqOtis, 0, 0, 0, 0);
+			break;
+		case 8:
+			getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8] = 9;
+			DemoVesnaCall(&LogicManager::CONS_DemoVesna_DoWalk, kCarRedSleeping, 3050, 0, 0);
+			break;
+		case 9:
+			getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8] = 10;
+			DemoVesnaCall(&LogicManager::CONS_DemoVesna_DoCorrOtis, "610Ag", 3050, 0, 0);
+			break;
+		case 10:
+			getCharacter(kCharacterVesna).characterPosition.position = 3050;
+			getCharacter(kCharacterVesna).characterPosition.location = 1;
+			endGraphics(kCharacterVesna);
+			break;
+		default:
+			break;
+		}
+
+		break;
+	case 189299008:
+		getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8] = 6;
+		DemoVesnaCall(&LogicManager::CONS_DemoVesna_WaitRCClear, 0, 0, 0, 0);
+		break;
+	default:
+		break;
+	}
+}
+
+void LogicManager::CONS_DemoVesna_StartPart2(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterVesna).callParams[getCharacter(kCharacterVesna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterVesna, &LogicManager::HAND_DemoVesna_StartPart2);
+	getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall] = 9;
+
+	params->clear();
+
+	fedEx(kCharacterVesna, kCharacterVesna, 12, 0);
+}
+
+void LogicManager::HAND_DemoVesna_StartPart2(HAND_PARAMS) {
+	// No-op
+}
+
+void LogicManager::CONS_DemoVesna_StartPart3(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterVesna).callParams[getCharacter(kCharacterVesna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterVesna, &LogicManager::HAND_DemoVesna_StartPart3);
+	getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall] = 10;
+
+	params->clear();
+
+	fedEx(kCharacterVesna, kCharacterVesna, 12, 0);
+}
+
+void LogicManager::HAND_DemoVesna_StartPart3(HAND_PARAMS) {
+	// No-op
+}
+
+void LogicManager::CONS_DemoVesna_StartPart4(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterVesna).callParams[getCharacter(kCharacterVesna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterVesna, &LogicManager::HAND_DemoVesna_StartPart4);
+	getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall] = 11;
+
+	params->clear();
+
+	fedEx(kCharacterVesna, kCharacterVesna, 12, 0);
+}
+
+void LogicManager::HAND_DemoVesna_StartPart4(HAND_PARAMS) {
+	// No-op
+}
+
+void LogicManager::CONS_DemoVesna_StartPart5(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterVesna).callParams[getCharacter(kCharacterVesna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterVesna, &LogicManager::HAND_DemoVesna_StartPart5);
+	getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall] = 12;
+
+	params->clear();
+
+	fedEx(kCharacterVesna, kCharacterVesna, 12, 0);
+}
+
+void LogicManager::HAND_DemoVesna_StartPart5(HAND_PARAMS) {
+	// No-op
+}
+
+void (LogicManager::*LogicManager::_functionsDemoVesna[])(HAND_PARAMS) = {
+	nullptr,
+	&LogicManager::HAND_DemoVesna_DoCorrOtis,
+	&LogicManager::HAND_DemoVesna_DoSeqOtis,
+	&LogicManager::HAND_DemoVesna_DoWalk,
+	&LogicManager::HAND_DemoVesna_WaitRCClear,
+	&LogicManager::HAND_DemoVesna_FinishSeqOtis,
+	&LogicManager::HAND_DemoVesna_Birth,
+	&LogicManager::HAND_DemoVesna_InComp,
+	&LogicManager::HAND_DemoVesna_KillAnna,
+	&LogicManager::HAND_DemoVesna_StartPart2,
+	&LogicManager::HAND_DemoVesna_StartPart3,
+	&LogicManager::HAND_DemoVesna_StartPart4,
+	&LogicManager::HAND_DemoVesna_StartPart5
+};
+
+
+} // End of namespace LastExpress
diff --git a/engines/lastexpress/characters/demo/demo_waiter1.cpp b/engines/lastexpress/characters/demo/demo_waiter1.cpp
new file mode 100644
index 00000000000..9010310074a
--- /dev/null
+++ b/engines/lastexpress/characters/demo/demo_waiter1.cpp
@@ -0,0 +1,225 @@
+/* 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 3 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, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "lastexpress/lastexpress.h"
+
+namespace LastExpress {
+
+void LogicManager::CONS_DemoWaiter1(int chapter) {
+	switch (chapter) {
+	case 0:
+		_engine->getMessageManager()->setMessageHandle(
+			kCharacterWaiter1,
+			_functionsDemoWaiter1[getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall]]
+		);
+
+		break;
+	case 1:
+		CONS_DemoWaiter1_Birth(0, 0, 0, 0);
+		break;
+	case 2:
+		CONS_DemoWaiter1_StartPart2(0, 0, 0, 0);
+		break;
+	case 3:
+		CONS_DemoWaiter1_StartPart3(0, 0, 0, 0);
+		break;
+	case 4:
+		CONS_DemoWaiter1_StartPart4(0, 0, 0, 0);
+		break;
+	case 5:
+		CONS_DemoWaiter1_StartPart5(0, 0, 0, 0);
+		break;
+	default:
+		break;
+	}
+}
+
+void LogicManager::DemoWaiter1Call(CALL_PARAMS) {
+	getCharacter(kCharacterWaiter1).currentCall++;
+
+	(this->*functionPointer)(param1, param2, param3, param4);
+}
+
+void LogicManager::CONS_DemoWaiter1_DoSeqOtis(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterWaiter1).callParams[getCharacter(kCharacterWaiter1).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterWaiter1, &LogicManager::HAND_DemoWaiter1_DoSeqOtis);
+	getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall] = 1;
+
+	params->clear();
+
+	strncpy((char *)&params->parameters[0], param1.stringParam, 12);
+
+	fedEx(kCharacterWaiter1, kCharacterWaiter1, 12, 0);
+}
+
+void LogicManager::HAND_DemoWaiter1_DoSeqOtis(HAND_PARAMS) {
+	switch (msg->action) {
+	case 3:
+		getCharacter(kCharacterWaiter1).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterWaiter1, _functionsDemoWaiter1[getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall]]);
+		fedEx(kCharacterWaiter1, kCharacterWaiter1, 18, 0);
+		break;
+	case 5:
+		if (!getCharacterCurrentParams(kCharacterWaiter1)[3]) {
+			playChrExcuseMe(kCharacterWaiter1, kCharacterCath, 0);
+			getCharacterCurrentParams(kCharacterWaiter1)[3] = 1;
+		}
+
+		break;
+	case 12:
+		startSeqOtis(kCharacterWaiter1, (char *)&getCharacterCurrentParams(kCharacterWaiter1)[0]);
+		break;
+	default:
+		break;
+	}
+}
+
+void LogicManager::CONS_DemoWaiter1_Birth(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterWaiter1).callParams[getCharacter(kCharacterWaiter1).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterWaiter1, &LogicManager::HAND_DemoWaiter1_Birth);
+	getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall] = 2;
+
+	params->clear();
+
+	fedEx(kCharacterWaiter1, kCharacterWaiter1, 12, 0);
+}
+
+void LogicManager::HAND_DemoWaiter1_Birth(HAND_PARAMS) {
+	switch (msg->action) {
+	case 12:
+		getCharacter(kCharacterWaiter1).characterPosition.car = kCarRestaurant;
+		getCharacter(kCharacterWaiter1).characterPosition.position = 5900;
+		getCharacter(kCharacterWaiter1).characterPosition.location = 0;
+		break;
+	case 223712416:
+		getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] = 1;
+		DemoWaiter1Call(&LogicManager::CONS_DemoWaiter1_RebeccaFeedUs, 0, 0, 0, 0);
+		break;
+	default:
+		break;
+	}
+}
+
+void LogicManager::CONS_DemoWaiter1_RebeccaFeedUs(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterWaiter1).callParams[getCharacter(kCharacterWaiter1).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterWaiter1, &LogicManager::HAND_DemoWaiter1_RebeccaFeedUs);
+	getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall] = 3;
+
+	params->clear();
+
+	fedEx(kCharacterWaiter1, kCharacterWaiter1, 12, 0);
+}
+
+void LogicManager::HAND_DemoWaiter1_RebeccaFeedUs(HAND_PARAMS) {
+	switch (msg->action) {
+	case 12:
+		getCharacter(kCharacterWaiter1).characterPosition.position = 5800;
+		getCharacter(kCharacterWaiter1).characterPosition.location = 0;
+		getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] = 1;
+		DemoWaiter1Call(&LogicManager::CONS_DemoWaiter1_DoSeqOtis, "911", 0, 0, 0);
+		break;
+	case 18:
+		if (getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] == 1) {
+			endGraphics(kCharacterWaiter1);
+			send(kCharacterWaiter1, kCharacterRebecca, 123712592, 0);
+		} else if (getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] == 2) {
+			endGraphics(kCharacterWaiter1);
+			getCharacter(kCharacterWaiter1).characterPosition.position = 5900;
+		}
+
+		break;
+	case 136702400:
+		getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] = 2;
+		DemoWaiter1Call(&LogicManager::CONS_DemoWaiter1_DoSeqOtis, "913", 0, 0, 0);
+		break;
+	default:
+		break;
+	}
+}
+
+void LogicManager::CONS_DemoWaiter1_StartPart2(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterWaiter1).callParams[getCharacter(kCharacterWaiter1).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterWaiter1, &LogicManager::HAND_DemoWaiter1_StartPart2);
+	getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall] = 4;
+
+	params->clear();
+
+	fedEx(kCharacterWaiter1, kCharacterWaiter1, 12, 0);
+}
+
+void LogicManager::HAND_DemoWaiter1_StartPart2(HAND_PARAMS) {
+	// No-op
+}
+
+void LogicManager::CONS_DemoWaiter1_StartPart3(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterWaiter1).callParams[getCharacter(kCharacterWaiter1).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterWaiter1, &LogicManager::HAND_DemoWaiter1_StartPart3);
+	getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall] = 5;
+
+	params->clear();
+
+	fedEx(kCharacterWaiter1, kCharacterWaiter1, 12, 0);
+}
+
+void LogicManager::HAND_DemoWaiter1_StartPart3(HAND_PARAMS) {
+	// No-op
+}
+
+void LogicManager::CONS_DemoWaiter1_StartPart4(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterWaiter1).callParams[getCharacter(kCharacterWaiter1).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterWaiter1, &LogicManager::HAND_DemoWaiter1_StartPart4);
+	getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall] = 6;
+
+	params->clear();
+
+	fedEx(kCharacterWaiter1, kCharacterWaiter1, 12, 0);
+}
+
+void LogicManager::HAND_DemoWaiter1_StartPart4(HAND_PARAMS) {
+	// No-op
+}
+
+void LogicManager::CONS_DemoWaiter1_StartPart5(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterWaiter1).callParams[getCharacter(kCharacterWaiter1).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterWaiter1, &LogicManager::HAND_DemoWaiter1_StartPart5);
+	getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall] = 7;
+
+	params->clear();
+
+	fedEx(kCharacterWaiter1, kCharacterWaiter1, 12, 0);
+}
+
+void LogicManager::HAND_DemoWaiter1_StartPart5(HAND_PARAMS) {
+	// No-op
+}
+
+void (LogicManager::*LogicManager::_functionsDemoWaiter1[])(HAND_PARAMS) = {
+	nullptr,
+	&LogicManager::HAND_DemoWaiter1_DoSeqOtis,
+	&LogicManager::HAND_DemoWaiter1_Birth,
+	&LogicManager::HAND_DemoWaiter1_RebeccaFeedUs,
+	&LogicManager::HAND_DemoWaiter1_StartPart2,
+	&LogicManager::HAND_DemoWaiter1_StartPart3,
+	&LogicManager::HAND_DemoWaiter1_StartPart4,
+	&LogicManager::HAND_DemoWaiter1_StartPart5
+};
+
+} // End of namespace LastExpress
diff --git a/engines/lastexpress/characters/francois.cpp b/engines/lastexpress/characters/francois.cpp
index 922f71dc287..0d5db2382c7 100644
--- a/engines/lastexpress/characters/francois.cpp
+++ b/engines/lastexpress/characters/francois.cpp
@@ -246,8 +246,8 @@ void LogicManager::HAND_Francois_SaveGame(HAND_PARAMS) {
 		if (msg->action == 12) {
 			save(
 				kCharacterFrancois,
-				getCharacter(kCharacterFrancois).callParams[getCharacter(kCharacterFrancois).currentCall].parameters[0],
-				getCharacter(kCharacterFrancois).callParams[getCharacter(kCharacterFrancois).currentCall].parameters[1]
+				getCharacterCurrentParams(kCharacterFrancois)[0],
+				getCharacterCurrentParams(kCharacterFrancois)[1]
 			);
 
 			getCharacter(kCharacterFrancois).currentCall--;
diff --git a/engines/lastexpress/characters/ivo.cpp b/engines/lastexpress/characters/ivo.cpp
index 25e9ced014d..f498f0b7f20 100644
--- a/engines/lastexpress/characters/ivo.cpp
+++ b/engines/lastexpress/characters/ivo.cpp
@@ -238,12 +238,12 @@ void LogicManager::CONS_Ivo_FinishSeqOtis(CONS_PARAMS) {
 
 void LogicManager::HAND_Ivo_FinishSeqOtis(HAND_PARAMS) {
 	if (msg->action == 0) {
-		if (getCharacter(kCharacterIvo).direction == 4)
-			return;
-		goto LABEL_5;
-	}
-	if (msg->action == 3) {
-	LABEL_5:
+		if (getCharacter(kCharacterIvo).direction != 4) {
+			getCharacter(kCharacterIvo).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterIvo, _functionsIvo[getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall]]);
+			fedEx(kCharacterIvo, kCharacterIvo, 18, 0);
+		}
+	} else if (msg->action == 3) {
 		getCharacter(kCharacterIvo).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterIvo, _functionsIvo[getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall]]);
 		fedEx(kCharacterIvo, kCharacterIvo, 18, 0);
@@ -282,13 +282,7 @@ void LogicManager::CONS_Ivo_WaitRCClear(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Ivo_WaitRCClear(HAND_PARAMS) {
-	if (msg->action == 0) {
-		if (!rcClear())
-			return;
-		goto LABEL_7;
-	}
-	if (msg->action == 12 && rcClear()) {
-	LABEL_7:
+	if ((msg->action == 0 && rcClear()) || (msg->action == 12 && rcClear())) {
 		getCharacter(kCharacterIvo).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterIvo, _functionsIvo[getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall]]);
 		fedEx(kCharacterIvo, kCharacterIvo, 18, 0);
diff --git a/engines/lastexpress/characters/master.cpp b/engines/lastexpress/characters/master.cpp
index ec94e929aeb..4bfa29f7a2f 100644
--- a/engines/lastexpress/characters/master.cpp
+++ b/engines/lastexpress/characters/master.cpp
@@ -198,7 +198,7 @@ void LogicManager::HAND_Master_Depart(HAND_PARAMS) {
 							}
 						}
 					} else {
-						bumpCath(5, 82, 255);
+						bumpCath(kCarRestaurant, 82, 255);
 					}
 				}
 				getCharacterParams(kCharacterMaster, 8)[1] = 0;
@@ -212,8 +212,8 @@ void LogicManager::HAND_Master_Depart(HAND_PARAMS) {
 
 		send(kCharacterMaster, kCharacterClerk, 203419131, 0);
 
-		setDoor(26, 0, 1, 0, 9);
-		setDoor(27, 0, 1, 0, 9);
+		setDoor(26, kCharacterCath, 1, 0, 9);
+		setDoor(27, kCharacterCath, 1, 0, 9);
 
 		_gameProgress[kProgressIsTrainRunning] = 1;
 
@@ -222,7 +222,8 @@ void LogicManager::HAND_Master_Depart(HAND_PARAMS) {
 		getCharacter(kCharacterMaster).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(
 			kCharacterMaster,
-			_functionsMaster[getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall]]);
+			_functionsMaster[getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall]]
+		);
 
 		fedEx(kCharacterMaster, kCharacterMaster, 18, 0);
 	}
@@ -409,7 +410,7 @@ void LogicManager::HAND_Master_FirstDream(HAND_PARAMS) {
 			_gameTimeTicksDelta = 3;
 			_gameProgress[kProgressField18] = 1;
 
-			setDoor(63, 0, 0, 10, 9);
+			setDoor(63, kCharacterCath, 0, 10, 9);
 
 			_gameProgress[kProgressField84] = 0;
 
@@ -418,7 +419,8 @@ void LogicManager::HAND_Master_FirstDream(HAND_PARAMS) {
 			getCharacter(kCharacterMaster).currentCall--;
 			_engine->getMessageManager()->setMessageHandle(
 				kCharacterMaster,
-				_functionsMaster[getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall]]);
+				_functionsMaster[getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall]]
+			);
 
 			fedEx(kCharacterMaster, kCharacterMaster, 18, 0);
 		} else {
@@ -487,8 +489,8 @@ void LogicManager::HAND_Master_StartPart1(HAND_PARAMS) {
 
 		_gameProgress[kProgressField7C] = 1;
 
-		setDoor(1, 0, 0, 10, 9);
-		setDoor(9, 0, 0, 255, 255);
+		setDoor(1, kCharacterCath, 0, 10, 9);
+		setDoor(9, kCharacterCath, 0, 255, 255);
 
 		getCharacterCurrentParams(kCharacterMaster)[0] = 1;
 
@@ -509,22 +511,22 @@ void LogicManager::HAND_Master_StartPart1(HAND_PARAMS) {
 		setModel(98, 1);
 		setModel(55, 1);
 
-		setDoor(25, 0, 0, 0, 1);
-		setDoor(23, 0, 0, 0, 1);
-		setDoor(24, 0, 0, 0, 1);
-		setDoor(28, 0, 0, 0, 1);
-		setDoor(56, 0, 0, 0, 1);
-		setDoor(54, 0, 0, 0, 1);
-		setDoor(55, 0, 0, 0, 1);
-		setDoor(59, 0, 0, 0, 1);
-		setDoor(66, 0, 0, 0, 1);
-		setDoor(64, 0, 0, 0, 1);
-		setDoor(65, 0, 0, 0, 1);
-		setDoor(69, 0, 0, 0, 1);
-		setDoor(98, 0, 0, 0, 1);
-		setDoor(26, 0, 1, 0, 9);
-		setDoor(27, 0, 1, 0, 9);
-		setDoor(101, 0, 1, 10, 9);
+		setDoor(25, kCharacterCath, 0, 0, 1);
+		setDoor(23, kCharacterCath, 0, 0, 1);
+		setDoor(24, kCharacterCath, 0, 0, 1);
+		setDoor(28, kCharacterCath, 0, 0, 1);
+		setDoor(56, kCharacterCath, 0, 0, 1);
+		setDoor(54, kCharacterCath, 0, 0, 1);
+		setDoor(55, kCharacterCath, 0, 0, 1);
+		setDoor(59, kCharacterCath, 0, 0, 1);
+		setDoor(66, kCharacterCath, 0, 0, 1);
+		setDoor(64, kCharacterCath, 0, 0, 1);
+		setDoor(65, kCharacterCath, 0, 0, 1);
+		setDoor(69, kCharacterCath, 0, 0, 1);
+		setDoor(98, kCharacterCath, 0, 0, 1);
+		setDoor(26, kCharacterCath, 1, 0, 9);
+		setDoor(27, kCharacterCath, 1, 0, 9);
+		setDoor(101, kCharacterCath, 1, 10, 9);
 
 		CONS_Master_MovingNight(0, 0, 0, 0);
 	}
@@ -1509,8 +1511,8 @@ void LogicManager::HAND_Master_InitPart4(HAND_PARAMS) {
 
 		_gameProgress[kProgressIsTrainRunning] = 1;
 
-		setDoor(26, 0, 1, 0, 9);
-		setDoor(27, 0, 1, 0, 9);
+		setDoor(26, kCharacterCath, 1, 0, 9);
+		setDoor(27, kCharacterCath, 1, 0, 9);
 
 		send(kCharacterMaster, kCharacterClerk, 203419131, 0);
 		send(kCharacterMaster, kCharacterTableA, 103798704, 0);
diff --git a/engines/lastexpress/characters/vesna.cpp b/engines/lastexpress/characters/vesna.cpp
index 87ea2abc0d5..45828a4d7b3 100644
--- a/engines/lastexpress/characters/vesna.cpp
+++ b/engines/lastexpress/characters/vesna.cpp
@@ -172,8 +172,12 @@ void LogicManager::CONS_Vesna_DoWalk(CONS_PARAMS) {
 void LogicManager::HAND_Vesna_DoWalk(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
-		if (walk(kCharacterVesna, getCharacterCurrentParams(kCharacterVesna)[0], getCharacterCurrentParams(kCharacterVesna)[1]))
-			goto LABEL_10;
+	case 12:
+		if (walk(kCharacterVesna, getCharacterCurrentParams(kCharacterVesna)[0], getCharacterCurrentParams(kCharacterVesna)[1])) {
+			getCharacter(kCharacterVesna).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterVesna, _functionsVesna[getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall]]);
+			fedEx(kCharacterVesna, kCharacterVesna, 18, 0);
+		}
 		break;
 	case 5:
 		if (rnd(2) == 0) {
@@ -186,16 +190,8 @@ void LogicManager::HAND_Vesna_DoWalk(HAND_PARAMS) {
 	case 6:
 		playChrExcuseMe(kCharacterVesna, kCharacterCath, 0);
 		break;
-	case 12:
-		if (walk(kCharacterVesna, getCharacterCurrentParams(kCharacterVesna)[0], getCharacterCurrentParams(kCharacterVesna)[1])) {
-		LABEL_10:
-			getCharacter(kCharacterVesna).currentCall--;
-			_engine->getMessageManager()->setMessageHandle(kCharacterVesna, _functionsVesna[getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall]]);
-			fedEx(kCharacterVesna, kCharacterVesna, 18, 0);
-		}
-		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -249,7 +245,7 @@ void LogicManager::HAND_Vesna_DoWalkBehind(HAND_PARAMS) {
 			}
 			return;
 		}
-	LABEL_16:
+
 		walk(kCharacterVesna, getCharacterCurrentParams(kCharacterVesna)[0], getCharacterCurrentParams(kCharacterVesna)[1]);
 		return;
 	}
@@ -264,8 +260,9 @@ void LogicManager::HAND_Vesna_DoWalkBehind(HAND_PARAMS) {
 		getCharacter(kCharacterVesna).waitedTicksUntilCycleRestart = 0;
 		getCharacterCurrentParams(kCharacterVesna)[2] = 1;
 	}
-	if (!getCharacterCurrentParams(kCharacterVesna)[2])
-		goto LABEL_16;
+	if (!getCharacterCurrentParams(kCharacterVesna)[2]) {
+		walk(kCharacterVesna, getCharacterCurrentParams(kCharacterVesna)[0], getCharacterCurrentParams(kCharacterVesna)[1]);
+	}
 }
 
 void LogicManager::CONS_Vesna_WaitRCClear(CONS_PARAMS) {
@@ -279,13 +276,7 @@ void LogicManager::CONS_Vesna_WaitRCClear(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Vesna_WaitRCClear(HAND_PARAMS) {
-	if (msg->action == 0) {
-		if (!rcClear())
-			return;
-		goto LABEL_7;
-	}
-	if (msg->action == 12 && rcClear()) {
-	LABEL_7:
+	if ((msg->action == 0 && rcClear()) || (msg->action == 12 && rcClear())) {
 		getCharacter(kCharacterVesna).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterVesna, _functionsVesna[getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall]]);
 		fedEx(kCharacterVesna, kCharacterVesna, 18, 0);
@@ -304,12 +295,12 @@ void LogicManager::CONS_Vesna_FinishSeqOtis(CONS_PARAMS) {
 
 void LogicManager::HAND_Vesna_FinishSeqOtis(HAND_PARAMS) {
 	if (msg->action == 0) {
-		if (getCharacter(kCharacterVesna).direction == 4)
-			return;
-		goto LABEL_5;
-	}
-	if (msg->action == 3) {
-	LABEL_5:
+		if (getCharacter(kCharacterVesna).direction != 4) {
+			getCharacter(kCharacterVesna).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterVesna, _functionsVesna[getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall]]);
+			fedEx(kCharacterVesna, kCharacterVesna, 18, 0);
+		}
+	} else if (msg->action == 3) {
 		getCharacter(kCharacterVesna).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterVesna, _functionsVesna[getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall]]);
 		fedEx(kCharacterVesna, kCharacterVesna, 18, 0);
@@ -415,8 +406,7 @@ void LogicManager::HAND_Vesna_HomeAlone(HAND_PARAMS) {
 				Common::strcpy_s((char *)&getCharacterCurrentParams(kCharacterVesna)[3], 12, "VES1015B");
 			}
 		}
-		
-	LABEL_27:
+
 		setDoor(38, kCharacterVesna, 3, 0, 0);
 		if (msg->action == 9) {
 			getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8] = 1;
@@ -926,7 +916,7 @@ void LogicManager::HAND_Vesna_KillAnna(HAND_PARAMS) {
 			if (getCharacter(kCharacterVesna).characterPosition.position < 2087)
 				getCharacter(kCharacterVesna).characterPosition.position = 2088;
 			getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8] = 2;
-			VesnaCall(&LogicManager::CONS_Vesna_DoWalk, 5, 850, 0, 0);
+			VesnaCall(&LogicManager::CONS_Vesna_DoWalk, kCarRestaurant, 850, 0, 0);
 			break;
 		case 2:
 			getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8] = 3;
@@ -966,7 +956,7 @@ void LogicManager::HAND_Vesna_KillAnna(HAND_PARAMS) {
 			break;
 		case 8:
 			getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8] = 9;
-			VesnaCall(&LogicManager::CONS_Vesna_DoWalk, 4, 3050, 0, 0);
+			VesnaCall(&LogicManager::CONS_Vesna_DoWalk, kCarRedSleeping, 3050, 0, 0);
 			break;
 		case 9:
 			getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8] = 10;
diff --git a/engines/lastexpress/data/archive.cpp b/engines/lastexpress/data/archive.cpp
index 81204758947..74877a2e75d 100644
--- a/engines/lastexpress/data/archive.cpp
+++ b/engines/lastexpress/data/archive.cpp
@@ -226,7 +226,7 @@ bool ArchiveManager::lockCache(char *filename) {
 void ArchiveManager::initHPFS() {
 	g_HDFilePosition = 0;
 
-	if (!g_HDFilePointer || !g_HDFilePointer->open("HD.hpf")) {
+	if (!g_HDFilePointer || !g_HDFilePointer->open(_engine->isDemo() ? "DEMO.HPF" : "HD.hpf")) {
 		error("Hard drive cache not found (please reinstall)");
 	}
 
@@ -239,7 +239,7 @@ void ArchiveManager::initHPFS() {
 	g_HDArchiveNumFiles = g_HDFilePointer->readUint32LE();
 
 	if (g_HDFilePointer->err()) {
-		error("Error reading from file \"%s\"", "HD.hpf");
+		error("Error reading from file \"%s\"", _engine->isDemo() ? "DEMO.HPF" : "HD.hpf");
 	}
 
 	g_HDFilePosition += 4;
@@ -258,7 +258,7 @@ void ArchiveManager::initHPFS() {
 	}
 
 	if (g_HDFilePointer->err()) {
-		error("Error reading from file \"%s\"", "HD.hpf");
+		error("Error reading from file \"%s\"", _engine->isDemo() ? "DEMO.HPF" : "HD.hpf");
 	}
 
 	g_HDFilePosition += g_HDArchiveNumFiles;
diff --git a/engines/lastexpress/debug.cpp b/engines/lastexpress/debug.cpp
index 4bc6f51e6c8..53dfae8025f 100644
--- a/engines/lastexpress/debug.cpp
+++ b/engines/lastexpress/debug.cpp
@@ -428,7 +428,7 @@ void LogicManager::renderCharacterList(int &selectedCharacter) {
 }
 
 Common::StringArray LogicManager::getCharacterFunctionNames(int character) {
-	return _funcNames[character];
+	return _engine->isDemo() ? _demoFuncNames[character] : _funcNames[character];
 }
 
 void LogicManager::showTrainMapWindow() {
diff --git a/engines/lastexpress/detection.cpp b/engines/lastexpress/detection.cpp
index 0183d8dd219..8902ad2fce6 100644
--- a/engines/lastexpress/detection.cpp
+++ b/engines/lastexpress/detection.cpp
@@ -88,7 +88,7 @@ static const ADGameDescription gameDescriptions[] = {
 	//   express.exe  ???
 	{
 		"lastexpress",
-		"",
+		"Interplay Release",
 		{
 			{"HD.HPF",  0, "bcc32d977f92bb52c060a0b4e8589cac", 30715904},
 			{"CD1.HPF", 0, "8c86db47304033fcff32c69fddd5a920", 525522944},
diff --git a/engines/lastexpress/fight/opponent_vesna1.cpp b/engines/lastexpress/fight/opponent_vesna1.cpp
index d27ac1780e0..00b730afac2 100644
--- a/engines/lastexpress/fight/opponent_vesna1.cpp
+++ b/engines/lastexpress/fight/opponent_vesna1.cpp
@@ -36,7 +36,7 @@ COpponent2::COpponent2(LastExpressEngine *engine, CFight *fight) : COpponent(eng
 	_seqs[5] = _engine->getArchiveManager()->loadSeq("2002okml.seq", 15, 0);
 	_seqs[6] = _engine->getArchiveManager()->loadSeq("2002okm.seq",  15, 0);
 
-	_engine->getLogicManager()->playDialog(kCharacterTableA, "MUS030", 16, 0);
+	_engine->getLogicManager()->playDialog(kCharacterTableA, engine->isDemo() ? "MUS030D" : "MUS030", 16, 0);
 
 	_timer = 30;
 }
diff --git a/engines/lastexpress/game/action.cpp b/engines/lastexpress/game/action.cpp
index b4cbb27f388..75060005cda 100644
--- a/engines/lastexpress/game/action.cpp
+++ b/engines/lastexpress/game/action.cpp
@@ -2429,7 +2429,7 @@ void LogicManager::doPreFunction(int *sceneOut) {
 
 		break;
 	case kCarLocomotive:
-		if (_trainData[*sceneOut].parameter1 < 32) {
+		if (_trainData[*sceneOut].parameter1 < (_engine->isDemo() ? 16 : 32)) {
 			if (_softBlockedEntitiesBits[_trainData[*sceneOut].parameter1] || _blockedEntitiesBits[_trainData[*sceneOut].parameter1]) {
 				if (_engine->getOtisManager()->fDirection(_trainNodeIndex) &&
 					_engine->getOtisManager()->fDirection(*sceneOut) &&
@@ -2482,7 +2482,7 @@ void LogicManager::doPreFunction(int *sceneOut) {
 			fadeDialog(kCharacterTableE);
 	}
 
-	if (_engine->_beetle) {
+	if (!_engine->isDemo() && _engine->_beetle) {
 		if (_trainData[*sceneOut].car != 130)
 			_engine->endBeetle();
 	}
@@ -2515,13 +2515,6 @@ void LogicManager::doPostFunction() {
 			do {
 				tmp.copyFrom(_trainData[tmp.scene].link);
 				doAction(&tmp);
-
-				// TODO: Figure out why this happens when canceling fast-walks mode
-				// in between cars...
-				if (tmp.action == 0) {
-					warning("Possible loop for link with action 0");
-					//break;
-				}
 			} while (_trainData[tmp.scene].car == 128);
 		}
 
@@ -2561,11 +2554,17 @@ void LogicManager::doPostFunction() {
 		return;
 	}
 	case 129:
+		if (_engine->isDemo())
+			break;
+
 		if (_gameProgress[kProgressField18] == 2)
 			send(kCharacterCath, kCharacterMaster, 190346110, 0);
 
 		return;
 	case 130:
+		if (_engine->isDemo())
+			break;
+
 		_engine->doBeetle();
 		return;
 	case 131:
@@ -2836,6 +2835,9 @@ void LogicManager::doAction(Link *link) {
 
 		break;
 	case kActionSetItem:
+		if (_engine->isDemo())
+			break;
+
 		if (link->param1 < 32) {
 			if (!_gameInventory[link->param1].isPresent) {
 				_gameInventory[link->param1].location = link->param2;
@@ -2848,6 +2850,9 @@ void LogicManager::doAction(Link *link) {
 
 		break;
 	case kActionPickItem:
+		if (_engine->isDemo())
+			break;
+
 		if (link->param1 >= 32)
 			return;
 
@@ -2910,6 +2915,9 @@ void LogicManager::doAction(Link *link) {
 
 		break;
 	case kActionDropItem:
+		if (_engine->isDemo())
+			break;
+
 		if (link->param1 >= 32 || !_gameInventory[link->param1].isPresent || !link->param2)
 			return;
 
@@ -2947,6 +2955,9 @@ void LogicManager::doAction(Link *link) {
 		break;
 	
 	case kActionLeanOutWindow:
+		if (_engine->isDemo())
+			break;
+
 		if (!_gameEvents[kEventCathLookOutsideWindowDay] && !_gameEvents[kEventCathLookOutsideWindowNight] && getModel(1) != 1 || !_gameProgress[kProgressIsTrainRunning] || link->param1 == 45 && (inComp(kCharacterRebecca, kCarRedSleeping, 4840) || _gameObjects[kObjectOutsideBetweenCompartments].door != 2) || _inventorySelectedItemIdx == kItemBriefcase || _inventorySelectedItemIdx == kItemFirebird) {
 			if (link->param1 == 9 || link->param1 >= 44 && link->param1 <= 45) {
 				if (isNight()) {
@@ -3001,6 +3012,9 @@ void LogicManager::doAction(Link *link) {
 
 		break;
 	case kActionAlmostFall:
+		if (_engine->isDemo())
+			break;
+
 		if (link->param1 == 9) {
 			if (isNight()) {
 				playNIS(kEventCathSlipTylerCompartmentNight);
@@ -3031,6 +3045,9 @@ void LogicManager::doAction(Link *link) {
 		cleanNIS();
 		break;
 	case kActionClimbInWindow:
+		if (_engine->isDemo())
+			break;
+
 		switch (link->param1) {
 		case 9:
 			if (isNight()) {
@@ -3068,6 +3085,9 @@ void LogicManager::doAction(Link *link) {
 		cleanNIS();
 		break;
 	case kActionClimbLadder:
+		if (_engine->isDemo())
+			break;
+
 		if (link->param1 == 1) {
 			if (_gameProgress[kProgressChapter] == 2 || _gameProgress[kProgressChapter] == 3) {
 				playNIS(kEventCathTopTrainGreenJacket);
@@ -3096,6 +3116,9 @@ void LogicManager::doAction(Link *link) {
 		cleanNIS();
 		break;
 	case kActionClimbDownTrain:
+		if (_engine->isDemo())
+			break;
+
 		if (_gameProgress[kProgressChapter] == 2 || _gameProgress[kProgressChapter] == 3) {
 			nisId = kEventCathClimbDownTrainGreenJacket;
 		} else if (_gameProgress[kProgressChapter] == 5) {
@@ -3118,6 +3141,9 @@ void LogicManager::doAction(Link *link) {
 
 		break;
 	case kActionKronosSanctum:
+		if (_engine->isDemo())
+			break;
+
 		switch (link->param1) {
 		case 1:
 			send(kCharacterCath, 32, 225056224, 0);
@@ -3162,6 +3188,9 @@ void LogicManager::doAction(Link *link) {
 
 		break;
 	case kActionEscapeBaggage:
+		if (_engine->isDemo())
+			break;
+
 		switch (link->param1) {
 		case 1:
 			nisId = kEventCathStruggleWithBonds;
@@ -3213,10 +3242,16 @@ void LogicManager::doAction(Link *link) {
 			break;
 		case 3:
 			queueSFX(kCharacterCath, 43, 0);
-			if (cathHasItem(kItemKey)) {
-				if (!_gameEvents[kEventAnnaBaggageArgument]) {
-					forceJump(kCharacterAnna, &LogicManager::CONS_Anna_BaggageFight);
-					link->scene = kSceneNone;
+
+			if (_engine->isDemo()) {
+				forceJump(kCharacterAnna, &LogicManager::CONS_DemoAnna_BaggageFight);
+				link->scene = kSceneNone;
+			} else {
+				if (cathHasItem(kItemKey)) {
+					if (!_gameEvents[kEventAnnaBaggageArgument]) {
+						forceJump(kCharacterAnna, &LogicManager::CONS_Anna_BaggageFight);
+						link->scene = kSceneNone;
+					}
 				}
 			}
 
@@ -3225,6 +3260,9 @@ void LogicManager::doAction(Link *link) {
 
 		break;
 	case kActionBombPuzzle:
+		if (_engine->isDemo())
+			break;
+
 		switch (link->param1) {
 		case 1:
 			send(kCharacterCath, kCharacterMaster, 158610240, 0);
@@ -3259,6 +3297,9 @@ void LogicManager::doAction(Link *link) {
 
 		break;
 	case kActionConductors:
+		if (_engine->isDemo())
+			break;
+
 		if (!cathRunningDialog("LIB031"))
 			queueSFX(kCharacterCath, 31, 0);
 
@@ -3270,6 +3311,9 @@ void LogicManager::doAction(Link *link) {
 
 		break;
 	case kActionKronosConcert:
+		if (_engine->isDemo())
+			break;
+
 		if (link->param1 == 1) {
 			nisId = kEventConcertSit;
 		} else if (link->param1 == 2) {
@@ -3284,6 +3328,9 @@ void LogicManager::doAction(Link *link) {
 
 		break;
 	case kActionPlayMusic2:
+		if (_engine->isDemo())
+			break;
+
 		_gameProgress[kProgressFieldC] = 1;
 		queueSFX(kCharacterCath, link->param1, link->param2);
 		Common::sprintf_s(filename, "MUS%03d", link->param3);
@@ -3292,6 +3339,9 @@ void LogicManager::doAction(Link *link) {
 
 		break;
 	case kActionCatchBeetle:
+		if (_engine->isDemo())
+			break;
+
 		if (_engine->_beetle && _engine->_beetle->click()) {
 			_engine->endBeetle();
 			_gameInventory[kItemBeetle].location = 1;
@@ -3307,28 +3357,32 @@ void LogicManager::doAction(Link *link) {
 		bool skipFlag = false;
 
 		if (link->action != kActionCompartment) {
-			if (link->action == kActionExitCompartment) {
-				if (!_gameProgress[kProgressField30] && _gameProgress[kProgressJacket]) {
-					_engine->getVCR()->writeSavePoint(1, kCharacterCath, 0);
-					_gameProgress[kProgressField30] = 1;
-				}
+			if (!_engine->isDemo()) {
+				if (link->action == kActionExitCompartment) {
+					if (!_gameProgress[kProgressField30] && _gameProgress[kProgressJacket]) {
+						_engine->getVCR()->writeSavePoint(1, kCharacterCath, 0);
+						_gameProgress[kProgressField30] = 1;
+					}
 
-				setModel(1, link->param2);
-			}
+					setModel(1, link->param2);
+				}
 
-			if (_gameObjects[kItemMatchBox].door != 1 && _gameObjects[kItemMatchBox].door != 3 && _inventorySelectedItemIdx != kItemKey) {
-				if (!_gameProgress[kProgressEventFoundCorpse]) {
-					_engine->getVCR()->writeSavePoint(1, kCharacterCath, 0);
-					playDialog(kCharacterCath, "LIB014", -1, 0);
-					playNIS(kEventCathFindCorpse);
-					playDialog(kCharacterCath, "LIB015", -1, 0);
-					_gameProgress[kProgressEventFoundCorpse] = 1;
-					link->scene = kSceneCompartmentCorpse;
+				if (_gameObjects[kItemMatchBox].door != 1 && _gameObjects[kItemMatchBox].door != 3 && _inventorySelectedItemIdx != kItemKey) {
+					if (!_gameProgress[kProgressEventFoundCorpse]) {
+						_engine->getVCR()->writeSavePoint(1, kCharacterCath, 0);
+						playDialog(kCharacterCath, "LIB014", -1, 0);
+						playNIS(kEventCathFindCorpse);
+						playDialog(kCharacterCath, "LIB015", -1, 0);
+						_gameProgress[kProgressEventFoundCorpse] = 1;
+						link->scene = kSceneCompartmentCorpse;
 
-					return;
+						return;
+					}
+				} else {
+					skipFlag = true;
 				}
 			} else {
-				skipFlag = true;
+				link->action = kActionCompartment;
 			}
 		}
 
@@ -3342,9 +3396,11 @@ void LogicManager::doAction(Link *link) {
 				return;
 			}
 
-			if (bumpCathTowardsCond(link->param1, 1, 1)) {
-				link->scene = kSceneNone;
-				return;
+			if (!_engine->isDemo()) {
+				if (bumpCathTowardsCond(link->param1, 1, 1)) {
+					link->scene = kSceneNone;
+					return;
+				}
 			}
 
 			if (_gameObjects[link->param1].door == 1 || _gameObjects[link->param1].door == 3 || preventEnterComp(link->param1)) {
@@ -3394,21 +3450,26 @@ void LogicManager::doAction(Link *link) {
 			return;
 		}
 
-		queueSFX(kCharacterCath, 14, 0);
-		queueSFX(kCharacterCath, 15, 22);
+		if (!_engine->isDemo()) {
+			queueSFX(kCharacterCath, 14, 0);
+			queueSFX(kCharacterCath, 15, 22);
 
-		if (_gameProgress[kProgressField78] && !dialogRunning("MUS003")) {
-			playDialog(kCharacterCath, "MUS003", 16, 0);
-			_gameProgress[kProgressField78] = 0;
-		}
+			if (_gameProgress[kProgressField78] && !dialogRunning("MUS003")) {
+				playDialog(kCharacterCath, "MUS003", 16, 0);
+				_gameProgress[kProgressField78] = 0;
+			}
 
-		bumpCath(kCarGreenSleeping, 77, 255);
-		link->scene = kSceneNone;
+			bumpCath(kCarGreenSleeping, 77, 255);
+			link->scene = kSceneNone;
+		}
 
 		break;
 	}
 
 	case kActionOutsideTrain:
+		if (_engine->isDemo())
+			break;
+
 		switch (link->param1) {
 		case 1:
 			send(kCharacterCath, kCharacterSalko, 167992577, 0);
@@ -3441,6 +3502,9 @@ void LogicManager::doAction(Link *link) {
 
 		break;
 	case kActionFirebirdPuzzle:
+		if (_engine->isDemo())
+			break;
+
 		if (_gameEvents[kEventKronosBringFirebird]) {
 			switch (link->param1) {
 			case 1:
@@ -3498,6 +3562,9 @@ void LogicManager::doAction(Link *link) {
 
 		break;
 	case kActionOpenMatchBox:
+		if (_engine->isDemo())
+			break;
+
 		if (_gameInventory[kItemMatch].location && !_gameInventory[kItemMatch].isPresent) {
 			_gameInventory[kItemMatch].isPresent = 1;
 			_gameInventory[kItemMatch].location = 0;
@@ -3509,6 +3576,9 @@ void LogicManager::doAction(Link *link) {
 		queueSFX(kCharacterCath, 59, 0);
 		break;
 	case kActionHintDialog:
+		if (_engine->isDemo())
+			break;
+
 		if (dialogRunning(getHintDialog(link->param1))) {
 			endDialog(getHintDialog(link->param1));
 		}
@@ -3517,6 +3587,9 @@ void LogicManager::doAction(Link *link) {
 
 		break;
 	case kActionMusicEggBox:
+		if (_engine->isDemo())
+			break;
+
 		queueSFX(kCharacterCath, 43, 0);
 		if (_gameProgress[kProgressField7C] && !dialogRunning("MUS003")) {
 			playDialog(kCharacterCath, "MUS003", 16, 0);
@@ -3525,6 +3598,9 @@ void LogicManager::doAction(Link *link) {
 
 		break;
 	case kActionPlayMusic3:
+		if (_engine->isDemo())
+			break;
+
 		queueSFX(kCharacterCath, 24, 0);
 		if (_gameProgress[kProgressField80] && !dialogRunning("MUS003")) {
 			playDialog(kCharacterCath, "MUS003", 16, 0);
@@ -3534,6 +3610,9 @@ void LogicManager::doAction(Link *link) {
 		break;
 	case kActionKnockInside:
 	case kActionBed:
+		if (_engine->isDemo())
+			break;
+
 		if (link->action == kActionBed) {
 			queueSFX(kCharacterCath, 85, 0);
 		}
@@ -3567,6 +3646,9 @@ void LogicManager::doAction(Link *link) {
 
 		break;
 	case kActionPlayMusicChapterSetupTrain:
+		if (_engine->isDemo())
+			break;
+
 		switch (_gameProgress[kProgressChapter]) {
 		case 1:
 			musId = 1;
@@ -3592,6 +3674,9 @@ void LogicManager::doAction(Link *link) {
 
 		break;
 	case kActionEasterEggs:
+		if (_engine->isDemo())
+			break;
+
 		if (link->param1 == 1) {
 			send(kCharacterCath, kCharacterRebecca, 205034665, 0);
 		} else if (link->param1 == 2) {
diff --git a/engines/lastexpress/game/credits.cpp b/engines/lastexpress/game/credits.cpp
index d9f03e8388b..4b6ab1bb7da 100644
--- a/engines/lastexpress/game/credits.cpp
+++ b/engines/lastexpress/game/credits.cpp
@@ -461,4 +461,94 @@ void LastExpressEngine::constructPalette(TGAHeader *tgaHeader, uint16 *palette)
 	getGraphicsManager()->modifyPalette(palette, 256);
 }
 
+bool LastExpressEngine::demoEnding(bool wonGame) {
+	bool exitFlag = false;
+	int frameIndex = 0;
+	bool savedMouseState = getGraphicsManager()->canDrawMouse();
+
+	const char backgroundNames[35][9] = {
+		"CROSSING", "ABBOT", "ANCATH", "MORNING", "GUNS", "DRINKUP", "SERBSRES",
+		"ANALXR13", "TATIANA", "KRONAN", "CONCERT", "AUDIENCE", "COUPLE", "RUSSIANS",
+		"SPIES", "1017DOG", "CARRIAGE", "TYLEREGG", "TRNM2", "MAHMUD", "CATHMIL",
+		"FRANCY", "ONROOF", "COPS2", "MILOSVES", "KAHINGUN", "1041KISS", "EVERYONE",
+		"BONDAGE", "KILL", "HIGHFITE", "1315GUNS", "BOOM2", "ISTANBUL", "LASTSHOT"};
+
+	if (wonGame) {
+		getMessageManager()->setEventHandle(1, &LastExpressEngine::emptyHandler);
+	} else {
+		getMessageManager()->setEventHandle(1, &LastExpressEngine::demoEndingMouseWrapper);
+	}
+
+	getMessageManager()->setEventHandle(3, &LastExpressEngine::demoEndingTimerWrapper);
+	getGraphicsManager()->setMouseDrawable(false);
+
+	mouseSetRightClicked(false);
+
+	if (getGraphicsManager()->acquireSurface()) {
+		getGraphicsManager()->clear(getGraphicsManager()->_screenSurface, 0, 0, 640, 480);
+		getGraphicsManager()->unlockSurface();
+	}
+
+	getGraphicsManager()->burstAll();
+	getSoundManager()->playSoundFile("MUSSELL.SND", kSoundTypeNIS | kVolumeFull, 0, 0);
+
+	while (!exitFlag && frameIndex < 35) {
+		Slot *soundSlot = getSoundManager()->_soundCache;
+		int frameDuration = 180;
+
+		if (soundSlot) {
+			while (soundSlot && soundSlot->getTag() != kSoundTagNIS)
+				soundSlot = soundSlot->getNext();
+
+			if (soundSlot)
+				frameDuration = 2 * soundSlot->getBlockCount() / (35 - frameIndex);
+		}
+
+		int targetTime = getSoundFrameCounter() + frameDuration;
+		int bgResult = getArchiveManager()->loadBG(backgroundNames[frameIndex]);
+
+		if (bgResult < 0) {
+			exitFlag = true;
+			break;
+		}
+
+		TBM *renderBox = (bgResult == 0) ? &getGraphicsManager()->_renderBox1 : &getGraphicsManager()->_renderBox2;
+		getGraphicsManager()->stepDissolve(renderBox);
+
+		while (getSoundFrameCounter() < targetTime && !exitFlag) {
+			if (wonGame) {
+				if (mouseHasRightClicked()) {
+					exitFlag = true;
+				}
+			} else {
+				if (getMenu()->getEggTimerDelta())
+					exitFlag = true;
+			}
+
+			if (!exitFlag) {
+				getMessageManager()->process();
+				getSoundManager()->soundThread();
+				getSubtitleManager()->subThread();
+				handleEvents();
+			}
+		}
+
+		frameIndex++;
+	}
+
+	getGraphicsManager()->setMouseDrawable(savedMouseState);
+	getMenu()->setEggTimerDelta(2700);
+
+	return exitFlag;
+}
+
+void LastExpressEngine::demoEndingMouse(Event *event) {
+	if (event->flags || ABS<int32>((int32)event->x - _cursorX) > 5 || ABS<int32>((int32)event->y - _cursorY) > 5)
+		getMenu()->setEggTimerDelta(2700);
+}
+
+void LastExpressEngine::demoEndingTimer(Event *event) {
+	setEventTickInternal(false);
+}
+
 } // End of namespace LastExpress
diff --git a/engines/lastexpress/game/events.cpp b/engines/lastexpress/game/events.cpp
index 1ff07655c0c..3fa646a21d5 100644
--- a/engines/lastexpress/game/events.cpp
+++ b/engines/lastexpress/game/events.cpp
@@ -69,9 +69,12 @@ void MessageManager::addEvent(int channel, int x, int y, int flags) {
 		_engine->setEventTickInternal(true);
 	} else if (channel == 1) {
 		if ((flags & 1) != 0) {
-			_engine->mouseSetLeftClicked(true);
-	
+			// Originally _engine->mouseSetLeftClicked(true); was called from here,
+			// but it's been moved under the "if" because this lead to fake double
+			// clicks when registering mouse movement events (which are re-paired
+			// with RMOUSE and LMOUSE flags when sent to the engine via this function).
 			if (!_systemEventLeftMouseDown) {
+				_engine->mouseSetLeftClicked(true);
 				flags |= 0x8;
 				_systemEventLeftMouseDown = true;
 	
@@ -88,9 +91,12 @@ void MessageManager::addEvent(int channel, int x, int y, int flags) {
 		}
 	
 		if ((flags & 2) != 0) {
-			_engine->_mouseHasRightClicked = true;
-	
+			// Originally _engine->mouseSetRightClicked(true); was called from here,
+			// but it's been moved under the "if" because this lead to fake double
+			// clicks when registering mouse movement events (which are re-paired
+			// with RMOUSE and LMOUSE flags when sent to the engine via this function).
 			if (!_systemEventRightMouseDown) {
+				_engine->mouseSetRightClicked(true);
 				flags |= 0x10;
 				_systemEventRightMouseDown = true;
 			}
diff --git a/engines/lastexpress/game/logic.cpp b/engines/lastexpress/game/logic.cpp
index dafc8b2e116..6f40cc9d572 100644
--- a/engines/lastexpress/game/logic.cpp
+++ b/engines/lastexpress/game/logic.cpp
@@ -617,24 +617,28 @@ void LogicManager::sendAll(int character, int action, ConsCallParam param) {
 void LogicManager::fedEx(int sender, int receiver, int action, ConsCallParam param) {
 	Message msg;
 
-	msg.sender = sender;
-	msg.receiver = receiver;
-	msg.action = action;
-	msg.param = param;
-	_engine->getMessageManager()->forceMessage(&msg);
+	if (!_engine->isDemo() || _engine->_navigationEngineIsRunning) {
+		msg.sender = sender;
+		msg.receiver = receiver;
+		msg.action = action;
+		msg.param = param;
+		_engine->getMessageManager()->forceMessage(&msg);
+	}
 }
 
 void LogicManager::forceJump(int character, void (LogicManager::*functionPointer)(CONS_PARAMS)) {
-	getCharacter(character).currentCall = 0;
-	getCharacter(character).inventoryItem = 0;
+	if (!_engine->isDemo() || _engine->_navigationEngineIsRunning) {
+		getCharacter(character).currentCall = 0;
+		getCharacter(character).inventoryItem = 0;
 
-	if (whoRunningDialog(character))
-		endDialog(character);
+		if (whoRunningDialog(character))
+			endDialog(character);
 
-	endGraphics(character);
-	releaseEverything(character);
+		endGraphics(character);
+		releaseEverything(character);
 
-	(this->*functionPointer)(0, 0, 0, 0);
+		(this->*functionPointer)(0, 0, 0, 0);
+	}
 }
 
 void LogicManager::autoMessage(int character, int action, ConsCallParam param) {
@@ -665,10 +669,14 @@ bool LogicManager::doAutoMessage(Message *msg) {
 }
 
 void LogicManager::save(int character, int type, int event) {
-	_engine->getVCR()->writeSavePoint(type, character, event);
+	if (!_engine->isDemo() || _engine->_navigationEngineIsRunning)
+		_engine->getVCR()->writeSavePoint(type, character, event);
 }
 
 void LogicManager::endGame(int type, int value, int sceneIndex, bool showScene) {
+	if (_engine->isDemo() && !_engine->_navigationEngineIsRunning)
+		return;
+
 	_engine->getSoundManager()->endAmbient();
 	_engine->getOtisManager()->wipeAllGSysInfo();
 
@@ -717,13 +725,22 @@ void LogicManager::endGame(int type, int value, int sceneIndex, bool showScene)
 }
 
 void LogicManager::winGame() {
-	_engine->getSoundManager()->endAmbient();
-	playNIS(kEventFinalSequence);
-	_engine->doCredits();
-	_engine->getOtisManager()->wipeAllGSysInfo();
-	_engine->getMessageManager()->reset();
-	_engine->_stopUpdatingCharacters = true;
-	_engine->getMenu()->doEgg(false, 0, 0);
+	if (_engine->isDemo() && _engine->_navigationEngineIsRunning) {
+		_engine->getSoundManager()->endAmbient();
+		_engine->getOtisManager()->wipeAllGSysInfo();
+		_engine->getMessageManager()->reset();
+		_engine->_stopUpdatingCharacters = true;
+		_engine->demoEnding(true);
+		_engine->getMenu()->doEgg(false, 0, 0);
+	} else {
+		_engine->getSoundManager()->endAmbient();
+		playNIS(kEventFinalSequence);
+		_engine->doCredits();
+		_engine->getOtisManager()->wipeAllGSysInfo();
+		_engine->getMessageManager()->reset();
+		_engine->_stopUpdatingCharacters = true;
+		_engine->getMenu()->doEgg(false, 0, 0);
+	}
 }
 
 void LogicManager::killGracePeriod() {
@@ -1608,7 +1625,9 @@ int LogicManager::getBumpNode(int car, int position, int param) {
 }
 
 void LogicManager::bumpCath(int car, int position, int param) {
-	bumpCathNode(getBumpNode(car, position, param));
+	if (!_engine->isDemo() || _engine->_navigationEngineIsRunning) {
+		bumpCathNode(getBumpNode(car, position, param));
+	}
 }
 
 bool LogicManager::obstacleBetween(int character1, int character2) {
@@ -2219,7 +2238,9 @@ int LogicManager::getSmartBumpNode(int node) {
 }
 
 void LogicManager::smartBumpCath() {
-	bumpCathNode(getSmartBumpNode(_trainNodeIndex));
+	if (!_engine->isDemo() || _engine->_navigationEngineIsRunning) {
+		bumpCathNode(getSmartBumpNode(_trainNodeIndex));
+	}
 }
 
 void LogicManager::bumpCathCloseUp(int item) {
@@ -2236,10 +2257,17 @@ void LogicManager::bumpCathCloseUp(int item) {
 }
 
 int LogicManager::playFight(int fightId) {
-	return _engine->doFight(fightId);
+	if (!_engine->isDemo() || _engine->_navigationEngineIsRunning) {
+		return _engine->doFight(fightId);
+	} else {
+		return 1;
+	}
 }
 
 void LogicManager::playNIS(int nisId) {
+	if (_engine->isDemo() && !_engine->_navigationEngineIsRunning)
+		return;
+
 	char filename[16];
 
 	bool videoWithoutFade = false;
@@ -2290,6 +2318,9 @@ void LogicManager::playNIS(int nisId) {
 }
 
 void LogicManager::cleanNIS() {
+	if (_engine->isDemo() && !_engine->_navigationEngineIsRunning)
+		return;
+
 	if (_useLastSavedNodeIndex) {
 		int largeItem = findLargeItem();
 		_useLastSavedNodeIndex = 0;
@@ -2612,12 +2643,12 @@ void LogicManager::playChrExcuseMe(int character, int receivingCharacter, int vo
 		if (receivingCharacter == kCharacterCath && _gameProgress[kProgressJacket] == 2 && rnd(2) != 0) {
 			if (isNight()) {	
 				if (_gameProgress[kProgressField18] != 2) {
-					playDialog(0, "CON1110E", -1, 0);
+					playDialog(0, "CON1110E", volume, 0);
 				} else {
-					playDialog(0, "CON1110F", -1, 0);
+					playDialog(0, "CON1110F", volume, 0);
 				}
 			} else {
-				playDialog(0, "CON1110D", -1, 0);
+				playDialog(0, "CON1110D", volume, 0);
 			}
 		} else {
 			switch (rnd(3)) {
@@ -2700,11 +2731,11 @@ void LogicManager::playChrExcuseMe(int character, int receivingCharacter, int vo
 		if (isFemale(receivingCharacter)) {
 			switch (rnd(2)) {
 			case 0:
-				playDialog(0, "TRA1113A", -1, 0);
+				playDialog(0, "TRA1113A", volume, 0);
 				break;
 			case 1:
 			default:
-				playDialog(0, "TRA1113B", -1, 0);
+				playDialog(0, "TRA1113B", volume, 0);
 			}
 		} else {
 			playDialog(0, "TRA1112", volume, 0);
@@ -3997,73 +4028,99 @@ void LogicManager::makeAllJump(int chapter) {
 			_softBlockedEntitiesBits[i] = 0;
 		}
 
-		// Originally the game checked only for kSoundTagMenu;
+		// Originally the first edition of the game checked only for kSoundTagMenu;
 		// I added kSoundTagLink since otherwise the music coda playing after
 		// the very first cutscene is immediately killed by this function, which
 		// is also happening in the original. But the latter gets the news of the
 		// sound getting killed a bit later, so we manage to hear it anyway; not
 		// here though...
-		_engine->getSoundManager()->killAllExcept(kSoundTagMenu, kSoundTagLink, 0, 0, 0, 0, 0);
-	}
-
-	CONS_Anna(chapter);
-	CONS_August(chapter);
-	CONS_Cond1(chapter);
-	CONS_Cond2(chapter);
-	CONS_HeadWait(chapter);
-	CONS_Waiter1(chapter);
-	CONS_Waiter2(chapter);
-	CONS_Cook(chapter);
-	CONS_TrainM(chapter);
-	CONS_Tatiana(chapter);
-	CONS_Vassili(chapter);
-	CONS_Alexei(chapter);
-	CONS_Abbot(chapter);
-	CONS_Milos(chapter);
-	CONS_Vesna(chapter);
-	CONS_Ivo(chapter);
-	CONS_Salko(chapter);
-	CONS_Rebecca(chapter);
-	CONS_Sophie(chapter);
-	CONS_Francois(chapter);
-	CONS_Madame(chapter);
-	CONS_Monsieur(chapter);
-	CONS_Kronos(chapter);
-	CONS_Kahina(chapter);
-	CONS_Mahmud(chapter);
-	CONS_Yasmin(chapter);
-	CONS_Hadija(chapter);
-	CONS_Alouan(chapter);
-	CONS_Police(chapter);
-	CONS_Max(chapter);
-
-	if (chapter < 2)
-		CONS_Master(chapter);
-
-	CONS_Clerk(chapter);
-	CONS_TableA(chapter);
-	CONS_TableB(chapter);
-	CONS_TableC(chapter);
-	CONS_TableD(chapter);
-	CONS_TableE(chapter);
-	CONS_TableF(chapter);
-	CONS_Mitchell(chapter);
+		//
+		// Incidentally this is what the demo and subsequent releases do.
+		if (chapter == 1 || chapter == 3) {
+			_engine->getSoundManager()->killAllExcept(kSoundTagMenu, kSoundTagLink, 0, 0, 0, 0, 0);
+		} else {
+			_engine->getSoundManager()->killAllExcept(kSoundTagMenu, 0, 0, 0, 0, 0, 0);
+		}
+	}
+
+	if (_engine->isDemo()) {
+		CONS_DemoAnna(chapter);
+		CONS_DemoAugust(chapter);
+		CONS_DemoCond2(chapter);
+		CONS_DemoWaiter1(chapter);
+		CONS_DemoTatiana(chapter);
+		CONS_DemoAbbot(chapter);
+		CONS_DemoVesna(chapter);
+		CONS_DemoIvo(chapter);
+		CONS_DemoRebecca(chapter);
+		CONS_DemoFrancois(chapter);
+		CONS_DemoMadame(chapter);
+		CONS_DemoMonsieur(chapter);
+
+		if (chapter < 2)
+			CONS_DemoMaster(chapter);
+
+		CONS_DemoTableA(chapter);
+		CONS_DemoTableB(chapter);
+		CONS_DemoTableC(chapter);
+		CONS_DemoTableD(chapter);
+		CONS_DemoTableE(chapter);
+		CONS_DemoTableF(chapter);
+	} else {
+		CONS_Anna(chapter);
+		CONS_August(chapter);
+		CONS_Cond1(chapter);
+		CONS_Cond2(chapter);
+		CONS_HeadWait(chapter);
+		CONS_Waiter1(chapter);
+		CONS_Waiter2(chapter);
+		CONS_Cook(chapter);
+		CONS_TrainM(chapter);
+		CONS_Tatiana(chapter);
+		CONS_Vassili(chapter);
+		CONS_Alexei(chapter);
+		CONS_Abbot(chapter);
+		CONS_Milos(chapter);
+		CONS_Vesna(chapter);
+		CONS_Ivo(chapter);
+		CONS_Salko(chapter);
+		CONS_Rebecca(chapter);
+		CONS_Sophie(chapter);
+		CONS_Francois(chapter);
+		CONS_Madame(chapter);
+		CONS_Monsieur(chapter);
+		CONS_Kronos(chapter);
+		CONS_Kahina(chapter);
+		CONS_Mahmud(chapter);
+		CONS_Yasmin(chapter);
+		CONS_Hadija(chapter);
+		CONS_Alouan(chapter);
+		CONS_Police(chapter);
+		CONS_Max(chapter);
+
+		if (chapter < 2)
+			CONS_Master(chapter);
+
+		CONS_Clerk(chapter);
+		CONS_TableA(chapter);
+		CONS_TableB(chapter);
+		CONS_TableC(chapter);
+		CONS_TableD(chapter);
+		CONS_TableE(chapter);
+		CONS_TableF(chapter);
+		CONS_Mitchell(chapter);
+	}
 }
 
 void LogicManager::CONS_All(bool isFirstChapter, int character) {
-	bool bumpCathNodeFlag = false;
-
 	makeAllJump(isFirstChapter ? 1 : 0);
 
-	if (!isFirstChapter) {
-		_flagBumpCathNode = false;
-		if (character) {
-			fedEx(kCharacterCath, character, 0, 0);
-			bumpCathNodeFlag = _flagBumpCathNode;
-		}
+	_flagBumpCathNode = false;
+
+	if (!isFirstChapter && character) {
+		fedEx(kCharacterCath, character, 0, 0);
 	}
 
-	_flagBumpCathNode = bumpCathNodeFlag;
 	if (!_flagBumpCathNode)
 		bumpCathNode(_trainNodeIndex);
 
diff --git a/engines/lastexpress/game/logic.h b/engines/lastexpress/game/logic.h
index 4f6cee324ea..3fed5222720 100644
--- a/engines/lastexpress/game/logic.h
+++ b/engines/lastexpress/game/logic.h
@@ -329,6 +329,7 @@ private:
 	int _navigationItemBrightness = 0;
 	int _navigationItemBrighnessStep = 1;
 	int32 _eventTicksUntilNextSavePoint = 450;
+	int32 _eventTicksSinceLastDemoSavegame = 150;
 	bool _actionJustPerformed = false;
 
 	bool _mitchellFlag = false;
@@ -5580,6 +5581,716 @@ private:
 		_tablesFuncNames,
 		_mitchellFuncNames
 	};
+
+	
+	////////////////////////////////////
+	//         DEMO FUNCTIONS
+	////////////////////////////////////
+
+	// CHAPTER SELECTOR
+	void CONS_DemoAbbot(int chapter);
+	void CONS_DemoAnna(int chapter);
+	void CONS_DemoAugust(int chapter);
+	void CONS_DemoCond2(int chapter);
+	void CONS_DemoFrancois(int chapter);
+	void CONS_DemoIvo(int chapter);
+	void CONS_DemoMadame(int chapter);
+	void CONS_DemoMaster(int chapter);
+	void CONS_DemoMonsieur(int chapter);
+	void CONS_DemoRebecca(int chapter);
+	void CONS_DemoTableA(int chapter);
+	void CONS_DemoTableB(int chapter);
+	void CONS_DemoTableC(int chapter);
+	void CONS_DemoTableD(int chapter);
+	void CONS_DemoTableE(int chapter);
+	void CONS_DemoTableF(int chapter);
+	void CONS_DemoTatiana(int chapter);
+	void CONS_DemoVesna(int chapter);
+	void CONS_DemoWaiter1(int chapter);
+
+	// DEMO ANNA EVENTS
+
+	void DemoAnnaCall(CALL_PARAMS);
+
+	void CONS_DemoAnna_DoSeqOtis(CONS_PARAMS);
+	void HAND_DemoAnna_DoSeqOtis(HAND_PARAMS);
+
+	void CONS_DemoAnna_FinishSeqOtis(CONS_PARAMS);
+	void HAND_DemoAnna_FinishSeqOtis(HAND_PARAMS);
+
+	void CONS_DemoAnna_DoCorrOtis(CONS_PARAMS);
+	void HAND_DemoAnna_DoCorrOtis(HAND_PARAMS);
+
+	void CONS_DemoAnna_WaitRCClear(CONS_PARAMS);
+	void HAND_DemoAnna_WaitRCClear(HAND_PARAMS);
+
+	void CONS_DemoAnna_SaveGame(CONS_PARAMS);
+	void HAND_DemoAnna_SaveGame(HAND_PARAMS);
+
+	void CONS_DemoAnna_DoWalk(CONS_PARAMS);
+	void HAND_DemoAnna_DoWalk(HAND_PARAMS);
+
+	void CONS_DemoAnna_Birth(CONS_PARAMS);
+	void HAND_DemoAnna_Birth(HAND_PARAMS);
+
+	void CONS_DemoAnna_GoBagg(CONS_PARAMS);
+	void HAND_DemoAnna_GoBagg(HAND_PARAMS);
+
+	void CONS_DemoAnna_InBagg(CONS_PARAMS);
+	void HAND_DemoAnna_InBagg(HAND_PARAMS);
+
+	void CONS_DemoAnna_DeadBagg(CONS_PARAMS);
+	void HAND_DemoAnna_DeadBagg(HAND_PARAMS);
+
+	void CONS_DemoAnna_BaggageFight(CONS_PARAMS);
+	void HAND_DemoAnna_BaggageFight(HAND_PARAMS);
+
+	void CONS_DemoAnna_StartPart2(CONS_PARAMS);
+	void HAND_DemoAnna_StartPart2(HAND_PARAMS);
+
+	void CONS_DemoAnna_StartPart3(CONS_PARAMS);
+	void HAND_DemoAnna_StartPart3(HAND_PARAMS);
+
+	void CONS_DemoAnna_StartPart4(CONS_PARAMS);
+	void HAND_DemoAnna_StartPart4(HAND_PARAMS);
+
+	void CONS_DemoAnna_StartPart5(CONS_PARAMS);
+	void HAND_DemoAnna_StartPart5(HAND_PARAMS);
+
+	Common::StringArray _demoAnnaFuncNames = {
+		"DoSeqOtis",
+		"FinishSeqOtis",
+		"DoCorrOtis",
+		"WaitRCClear",
+		"SaveGame",
+		"DoWalk",
+		"Birth",
+		"GoBagg",
+		"InBagg",
+		"DeadBagg",
+		"BaggageFight",
+		"StartPart2",
+		"StartPart3",
+		"StartPart4",
+		"StartPart5"
+	};
+
+
+	// DEMO ABBOT EVENTS
+
+	void DemoAbbotCall(CALL_PARAMS);
+
+	void CONS_DemoAbbot_DoWait(CONS_PARAMS);
+	void HAND_DemoAbbot_DoWait(HAND_PARAMS);
+
+	void CONS_DemoAbbot_DoJoinedSeqOtis(CONS_PARAMS);
+	void HAND_DemoAbbot_DoJoinedSeqOtis(HAND_PARAMS);
+
+	void CONS_DemoAbbot_WaitRCClear(CONS_PARAMS);
+	void HAND_DemoAbbot_WaitRCClear(HAND_PARAMS);
+
+	void CONS_DemoAbbot_Birth(CONS_PARAMS);
+	void HAND_DemoAbbot_Birth(HAND_PARAMS);
+
+	void CONS_DemoAbbot_StartPart2(CONS_PARAMS);
+	void HAND_DemoAbbot_StartPart2(HAND_PARAMS);
+
+	void CONS_DemoAbbot_StartPart3(CONS_PARAMS);
+	void HAND_DemoAbbot_StartPart3(HAND_PARAMS);
+
+	void CONS_DemoAbbot_StartPart4(CONS_PARAMS);
+	void HAND_DemoAbbot_StartPart4(HAND_PARAMS);
+
+	void CONS_DemoAbbot_StartPart5(CONS_PARAMS);
+	void HAND_DemoAbbot_StartPart5(HAND_PARAMS);
+
+	Common::StringArray _demoAbbotFuncNames = {
+		"DoWait",
+		"DoJoinedSeqOtis",
+		"WaitRCClear",
+		"Birth",
+		"StartPart2",
+		"StartPart3",
+		"StartPart4",
+		"StartPart5"
+	};
+
+
+	// DEMO AUGUST EVENTS
+
+	void DemoAugustCall(CALL_PARAMS);
+
+	void CONS_DemoAugust_SaveGame(CONS_PARAMS);
+	void HAND_DemoAugust_SaveGame(HAND_PARAMS);
+
+	void CONS_DemoAugust_Birth(CONS_PARAMS);
+	void HAND_DemoAugust_Birth(HAND_PARAMS);
+
+	void CONS_DemoAugust_StartPart2(CONS_PARAMS);
+	void HAND_DemoAugust_StartPart2(HAND_PARAMS);
+
+	void CONS_DemoAugust_StartPart3(CONS_PARAMS);
+	void HAND_DemoAugust_StartPart3(HAND_PARAMS);
+
+	void CONS_DemoAugust_StartPart4(CONS_PARAMS);
+	void HAND_DemoAugust_StartPart4(HAND_PARAMS);
+
+	void CONS_DemoAugust_StartPart5(CONS_PARAMS);
+	void HAND_DemoAugust_StartPart5(HAND_PARAMS);
+
+	Common::StringArray _demoAugustFuncNames = {
+		"SaveGame",
+		"Birth",
+		"StartPart2",
+		"StartPart3",
+		"StartPart4",
+		"StartPart5"
+	};
+
+
+	// DEMO COND2 EVENTS
+
+	void DemoCond2Call(CALL_PARAMS);
+
+	void CONS_DemoCond2_DoSeqOtis(CONS_PARAMS);
+	void HAND_DemoCond2_DoSeqOtis(HAND_PARAMS);
+
+	void CONS_DemoCond2_FinishSeqOtis(CONS_PARAMS);
+	void HAND_DemoCond2_FinishSeqOtis(HAND_PARAMS);
+
+	void CONS_DemoCond2_SitDown(CONS_PARAMS);
+	void HAND_DemoCond2_SitDown(HAND_PARAMS);
+
+	void CONS_DemoCond2_Birth(CONS_PARAMS);
+	void HAND_DemoCond2_Birth(HAND_PARAMS);
+
+	void CONS_DemoCond2_StartPart2(CONS_PARAMS);
+	void HAND_DemoCond2_StartPart2(HAND_PARAMS);
+
+	void CONS_DemoCond2_StartPart3(CONS_PARAMS);
+	void HAND_DemoCond2_StartPart3(HAND_PARAMS);
+
+	void CONS_DemoCond2_StartPart4(CONS_PARAMS);
+	void HAND_DemoCond2_StartPart4(HAND_PARAMS);
+
+	void CONS_DemoCond2_StartPart5(CONS_PARAMS);
+	void HAND_DemoCond2_StartPart5(HAND_PARAMS);
+
+	Common::StringArray _demoCond2FuncNames = {
+		"DoSeqOtis",
+		"FinishSeqOtis",
+		"SitDown",
+		"Birth",
+		"StartPart2",
+		"StartPart3",
+		"StartPart4",
+		"StartPart5"
+	};
+
+
+	// DEMO FRANCOIS EVENTS
+
+	void DemoFrancoisCall(CALL_PARAMS);
+
+	void CONS_DemoFrancois_DoSeqOtis(CONS_PARAMS);
+	void HAND_DemoFrancois_DoSeqOtis(HAND_PARAMS);
+
+	void CONS_DemoFrancois_SaveGame(CONS_PARAMS);
+	void HAND_DemoFrancois_SaveGame(HAND_PARAMS);
+
+	void CONS_DemoFrancois_Birth(CONS_PARAMS);
+	void HAND_DemoFrancois_Birth(HAND_PARAMS);
+
+	void CONS_DemoFrancois_StartPart2(CONS_PARAMS);
+	void HAND_DemoFrancois_StartPart2(HAND_PARAMS);
+
+	void CONS_DemoFrancois_StartPart3(CONS_PARAMS);
+	void HAND_DemoFrancois_StartPart3(HAND_PARAMS);
+
+	void CONS_DemoFrancois_StartPart4(CONS_PARAMS);
+	void HAND_DemoFrancois_StartPart4(HAND_PARAMS);
+
+	void CONS_DemoFrancois_StartPart5(CONS_PARAMS);
+	void HAND_DemoFrancois_StartPart5(HAND_PARAMS);
+
+	Common::StringArray _demoFrancoisFuncNames = {
+		"DoSeqOtis",
+		"SaveGame",
+		"Birth",
+		"StartPart2",
+		"StartPart3",
+		"StartPart4",
+		"StartPart5"
+	};
+
+
+	// DEMO IVO EVENTS
+
+	void DemoIvoCall(CALL_PARAMS);
+
+	void CONS_DemoIvo_WaitRCClear(CONS_PARAMS);
+	void HAND_DemoIvo_WaitRCClear(HAND_PARAMS);
+
+	void CONS_DemoIvo_DoSeqOtis(CONS_PARAMS);
+	void HAND_DemoIvo_DoSeqOtis(HAND_PARAMS);
+
+	void CONS_DemoIvo_FinishSeqOtis(CONS_PARAMS);
+	void HAND_DemoIvo_FinishSeqOtis(HAND_PARAMS);
+
+	void CONS_DemoIvo_DoSplitOtis023A(CONS_PARAMS);
+	void HAND_DemoIvo_DoSplitOtis023A(HAND_PARAMS);
+
+	void CONS_DemoIvo_Birth(CONS_PARAMS);
+	void HAND_DemoIvo_Birth(HAND_PARAMS);
+
+	void CONS_DemoIvo_StartPart2(CONS_PARAMS);
+	void HAND_DemoIvo_StartPart2(HAND_PARAMS);
+
+	void CONS_DemoIvo_StartPart3(CONS_PARAMS);
+	void HAND_DemoIvo_StartPart3(HAND_PARAMS);
+
+	void CONS_DemoIvo_StartPart4(CONS_PARAMS);
+	void HAND_DemoIvo_StartPart4(HAND_PARAMS);
+
+	void CONS_DemoIvo_StartPart5(CONS_PARAMS);
+	void HAND_DemoIvo_StartPart5(HAND_PARAMS);
+
+	Common::StringArray _demoIvoFuncNames = {
+		"WaitRCClear",
+		"DoSeqOtis",
+		"FinishSeqOtis",
+		"DoSplitOtis023A",
+		"Birth",
+		"StartPart2",
+		"StartPart3",
+		"StartPart4",
+		"StartPart5"
+	};
+
+
+	// DEMO MADAME EVENTS
+
+	void DemoMadameCall(CALL_PARAMS);
+
+	void CONS_DemoMadame_DoDialog(CONS_PARAMS);
+	void HAND_DemoMadame_DoDialog(HAND_PARAMS);
+
+	void CONS_DemoMadame_Birth(CONS_PARAMS);
+	void HAND_DemoMadame_Birth(HAND_PARAMS);
+
+	void CONS_DemoMadame_StartPart2(CONS_PARAMS);
+	void HAND_DemoMadame_StartPart2(HAND_PARAMS);
+
+	void CONS_DemoMadame_StartPart3(CONS_PARAMS);
+	void HAND_DemoMadame_StartPart3(HAND_PARAMS);
+
+	void CONS_DemoMadame_StartPart4(CONS_PARAMS);
+	void HAND_DemoMadame_StartPart4(HAND_PARAMS);
+
+	void CONS_DemoMadame_StartPart5(CONS_PARAMS);
+	void HAND_DemoMadame_StartPart5(HAND_PARAMS);
+
+	Common::StringArray _demoMadameFuncNames = {
+		"DoDialog",
+		"Birth",
+		"StartPart2",
+		"StartPart3",
+		"StartPart4",
+		"StartPart5"
+	};
+
+
+	// DEMO MASTER EVENTS
+
+	void DemoMasterCall(CALL_PARAMS);
+
+	void CONS_DemoMaster_SaveGame(CONS_PARAMS);
+	void HAND_DemoMaster_SaveGame(HAND_PARAMS);
+
+	void CONS_DemoMaster_Birth(CONS_PARAMS);
+	void HAND_DemoMaster_Birth(HAND_PARAMS);
+
+	void CONS_DemoMaster_StartPart2(CONS_PARAMS);
+	void HAND_DemoMaster_StartPart2(HAND_PARAMS);
+
+	void CONS_DemoMaster_StartPart3(CONS_PARAMS);
+	void HAND_DemoMaster_StartPart3(HAND_PARAMS);
+
+	void CONS_DemoMaster_StartPart4(CONS_PARAMS);
+	void HAND_DemoMaster_StartPart4(HAND_PARAMS);
+
+	void CONS_DemoMaster_StartPart5(CONS_PARAMS);
+	void HAND_DemoMaster_StartPart5(HAND_PARAMS);
+
+	Common::StringArray _demoMasterFuncNames = {
+		"SaveGame",
+		"Birth",
+		"StartPart2",
+		"StartPart3",
+		"StartPart4",
+		"StartPart5"
+	};
+
+
+	// DEMO MONSIEUR EVENTS
+
+	void DemoMonsieurCall(CALL_PARAMS);
+
+	void CONS_DemoMonsieur_Birth(CONS_PARAMS);
+	void HAND_DemoMonsieur_Birth(HAND_PARAMS);
+
+	void CONS_DemoMonsieur_StartPart2(CONS_PARAMS);
+	void HAND_DemoMonsieur_StartPart2(HAND_PARAMS);
+
+	void CONS_DemoMonsieur_StartPart3(CONS_PARAMS);
+	void HAND_DemoMonsieur_StartPart3(HAND_PARAMS);
+
+	void CONS_DemoMonsieur_StartPart4(CONS_PARAMS);
+	void HAND_DemoMonsieur_StartPart4(HAND_PARAMS);
+
+	void CONS_DemoMonsieur_StartPart5(CONS_PARAMS);
+	void HAND_DemoMonsieur_StartPart5(HAND_PARAMS);
+
+	Common::StringArray _demoMonsieurFuncNames = {
+		"Birth",
+		"StartPart2",
+		"StartPart3",
+		"StartPart4",
+		"StartPart5"
+	};
+
+
+	// DEMO REBECCA EVENTS
+
+	void DemoRebeccaCall(CALL_PARAMS);
+
+	void CONS_DemoRebecca_DoDialog(CONS_PARAMS);
+	void HAND_DemoRebecca_DoDialog(HAND_PARAMS);
+
+	void CONS_DemoRebecca_Birth(CONS_PARAMS);
+	void HAND_DemoRebecca_Birth(HAND_PARAMS);
+
+	void CONS_DemoRebecca_StartPart2(CONS_PARAMS);
+	void HAND_DemoRebecca_StartPart2(HAND_PARAMS);
+
+	void CONS_DemoRebecca_StartPart3(CONS_PARAMS);
+	void HAND_DemoRebecca_StartPart3(HAND_PARAMS);
+
+	void CONS_DemoRebecca_StartPart4(CONS_PARAMS);
+	void HAND_DemoRebecca_StartPart4(HAND_PARAMS);
+
+	void CONS_DemoRebecca_StartPart5(CONS_PARAMS);
+	void HAND_DemoRebecca_StartPart5(HAND_PARAMS);
+
+	Common::StringArray _demoRebeccaFuncNames = {
+		"DoDialog",
+		"Birth",
+		"StartPart2",
+		"StartPart3",
+		"StartPart4",
+		"StartPart5"
+	};
+
+
+	// DEMO TABLEA EVENTS
+
+	void CONS_DemoTableA_Birth(CONS_PARAMS);
+	void HAND_DemoTableA_Birth(HAND_PARAMS);
+
+	void CONS_DemoTableA_StartPart2(CONS_PARAMS);
+	void HAND_DemoTableA_StartPart2(HAND_PARAMS);
+
+	void CONS_DemoTableA_StartPart3(CONS_PARAMS);
+	void HAND_DemoTableA_StartPart3(HAND_PARAMS);
+
+	void CONS_DemoTableA_StartPart4(CONS_PARAMS);
+	void HAND_DemoTableA_StartPart4(HAND_PARAMS);
+
+	void CONS_DemoTableA_StartPart5(CONS_PARAMS);
+	void HAND_DemoTableA_StartPart5(HAND_PARAMS);
+
+
+	// DEMO TABLEB EVENTS
+
+	void CONS_DemoTableB_Birth(CONS_PARAMS);
+	void HAND_DemoTableB_Birth(HAND_PARAMS);
+
+	void CONS_DemoTableB_StartPart2(CONS_PARAMS);
+	void HAND_DemoTableB_StartPart2(HAND_PARAMS);
+
+	void CONS_DemoTableB_StartPart3(CONS_PARAMS);
+	void HAND_DemoTableB_StartPart3(HAND_PARAMS);
+
+	void CONS_DemoTableB_StartPart4(CONS_PARAMS);
+	void HAND_DemoTableB_StartPart4(HAND_PARAMS);
+
+	void CONS_DemoTableB_StartPart5(CONS_PARAMS);
+	void HAND_DemoTableB_StartPart5(HAND_PARAMS);
+
+
+	// DEMO TABLEC EVENTS
+
+	void CONS_DemoTableC_Birth(CONS_PARAMS);
+	void HAND_DemoTableC_Birth(HAND_PARAMS);
+
+	void CONS_DemoTableC_StartPart2(CONS_PARAMS);
+	void HAND_DemoTableC_StartPart2(HAND_PARAMS);
+
+	void CONS_DemoTableC_StartPart3(CONS_PARAMS);
+	void HAND_DemoTableC_StartPart3(HAND_PARAMS);
+
+	void CONS_DemoTableC_StartPart4(CONS_PARAMS);
+	void HAND_DemoTableC_StartPart4(HAND_PARAMS);
+
+	void CONS_DemoTableC_StartPart5(CONS_PARAMS);
+	void HAND_DemoTableC_StartPart5(HAND_PARAMS);
+
+
+	// DEMO TABLED EVENTS
+
+	void CONS_DemoTableD_Birth(CONS_PARAMS);
+	void HAND_DemoTableD_Birth(HAND_PARAMS);
+
+	void CONS_DemoTableD_StartPart2(CONS_PARAMS);
+	void HAND_DemoTableD_StartPart2(HAND_PARAMS);
+
+	void CONS_DemoTableD_StartPart3(CONS_PARAMS);
+	void HAND_DemoTableD_StartPart3(HAND_PARAMS);
+
+	void CONS_DemoTableD_StartPart4(CONS_PARAMS);
+	void HAND_DemoTableD_StartPart4(HAND_PARAMS);
+
+	void CONS_DemoTableD_StartPart5(CONS_PARAMS);
+	void HAND_DemoTableD_StartPart5(HAND_PARAMS);
+
+
+	// DEMO TABLEE EVENTS
+
+	void CONS_DemoTableE_Birth(CONS_PARAMS);
+	void HAND_DemoTableE_Birth(HAND_PARAMS);
+
+	void CONS_DemoTableE_StartPart2(CONS_PARAMS);
+	void HAND_DemoTableE_StartPart2(HAND_PARAMS);
+
+	void CONS_DemoTableE_StartPart3(CONS_PARAMS);
+	void HAND_DemoTableE_StartPart3(HAND_PARAMS);
+
+	void CONS_DemoTableE_StartPart4(CONS_PARAMS);
+	void HAND_DemoTableE_StartPart4(HAND_PARAMS);
+
+	void CONS_DemoTableE_StartPart5(CONS_PARAMS);
+	void HAND_DemoTableE_StartPart5(HAND_PARAMS);
+
+
+	// DEMO TABLEF EVENTS
+
+	void CONS_DemoTableF_Birth(CONS_PARAMS);
+	void HAND_DemoTableF_Birth(HAND_PARAMS);
+
+	void CONS_DemoTableF_StartPart2(CONS_PARAMS);
+	void HAND_DemoTableF_StartPart2(HAND_PARAMS);
+
+	void CONS_DemoTableF_StartPart3(CONS_PARAMS);
+	void HAND_DemoTableF_StartPart3(HAND_PARAMS);
+
+	void CONS_DemoTableF_StartPart4(CONS_PARAMS);
+	void HAND_DemoTableF_StartPart4(HAND_PARAMS);
+
+	void CONS_DemoTableF_StartPart5(CONS_PARAMS);
+	void HAND_DemoTableF_StartPart5(HAND_PARAMS);
+
+	Common::StringArray _demoTablesFuncNames = {
+		"Birth",
+		"StartPart2",
+		"StartPart3",
+		"StartPart4",
+		"StartPart5"
+	};
+
+
+	// DEMO TATIANA EVENTS
+
+	void CONS_DemoTatiana_Birth(CONS_PARAMS);
+	void HAND_DemoTatiana_Birth(HAND_PARAMS);
+
+	void CONS_DemoTatiana_StartPart2(CONS_PARAMS);
+	void HAND_DemoTatiana_StartPart2(HAND_PARAMS);
+
+	void CONS_DemoTatiana_StartPart3(CONS_PARAMS);
+	void HAND_DemoTatiana_StartPart3(HAND_PARAMS);
+
+	void CONS_DemoTatiana_StartPart4(CONS_PARAMS);
+	void HAND_DemoTatiana_StartPart4(HAND_PARAMS);
+
+	void CONS_DemoTatiana_StartPart5(CONS_PARAMS);
+	void HAND_DemoTatiana_StartPart5(HAND_PARAMS);
+
+	Common::StringArray _demoTatianaFuncNames = {
+		"Birth",
+		"StartPart2",
+		"StartPart3",
+		"StartPart4",
+		"StartPart5"
+	};
+
+
+	// DEMO VESNA EVENTS
+
+	void DemoVesnaCall(CALL_PARAMS);
+
+	void CONS_DemoVesna_DoCorrOtis(CONS_PARAMS);
+	void HAND_DemoVesna_DoCorrOtis(HAND_PARAMS);
+
+	void CONS_DemoVesna_DoSeqOtis(CONS_PARAMS);
+	void HAND_DemoVesna_DoSeqOtis(HAND_PARAMS);
+
+	void CONS_DemoVesna_DoWalk(CONS_PARAMS);
+	void HAND_DemoVesna_DoWalk(HAND_PARAMS);
+
+	void CONS_DemoVesna_WaitRCClear(CONS_PARAMS);
+	void HAND_DemoVesna_WaitRCClear(HAND_PARAMS);
+
+	void CONS_DemoVesna_FinishSeqOtis(CONS_PARAMS);
+	void HAND_DemoVesna_FinishSeqOtis(HAND_PARAMS);
+
+	void CONS_DemoVesna_Birth(CONS_PARAMS);
+	void HAND_DemoVesna_Birth(HAND_PARAMS);
+
+	void CONS_DemoVesna_InComp(CONS_PARAMS);
+	void HAND_DemoVesna_InComp(HAND_PARAMS);
+
+	void CONS_DemoVesna_KillAnna(CONS_PARAMS);
+	void HAND_DemoVesna_KillAnna(HAND_PARAMS);
+
+	void CONS_DemoVesna_StartPart2(CONS_PARAMS);
+	void HAND_DemoVesna_StartPart2(HAND_PARAMS);
+
+	void CONS_DemoVesna_StartPart3(CONS_PARAMS);
+	void HAND_DemoVesna_StartPart3(HAND_PARAMS);
+
+	void CONS_DemoVesna_StartPart4(CONS_PARAMS);
+	void HAND_DemoVesna_StartPart4(HAND_PARAMS);
+
+	void CONS_DemoVesna_StartPart5(CONS_PARAMS);
+	void HAND_DemoVesna_StartPart5(HAND_PARAMS);
+
+	Common::StringArray _demoVesnaFuncNames = {
+		"DoCorrOtis",
+		"DoSeqOtis",
+		"DoWalk",
+		"WaitRCClear",
+		"FinishSeqOtis",
+		"Birth",
+		"InComp",
+		"KillAnna",
+		"StartPart2",
+		"StartPart3",
+		"StartPart4",
+		"StartPart5"
+	};
+
+
+	// DEMO WAITER1 EVENTS
+
+	void DemoWaiter1Call(CALL_PARAMS);
+
+	void CONS_DemoWaiter1_DoSeqOtis(CONS_PARAMS);
+	void HAND_DemoWaiter1_DoSeqOtis(HAND_PARAMS);
+
+	void CONS_DemoWaiter1_Birth(CONS_PARAMS);
+	void HAND_DemoWaiter1_Birth(HAND_PARAMS);
+
+	void CONS_DemoWaiter1_RebeccaFeedUs(CONS_PARAMS);
+	void HAND_DemoWaiter1_RebeccaFeedUs(HAND_PARAMS);
+
+	void CONS_DemoWaiter1_StartPart2(CONS_PARAMS);
+	void HAND_DemoWaiter1_StartPart2(HAND_PARAMS);
+
+	void CONS_DemoWaiter1_StartPart3(CONS_PARAMS);
+	void HAND_DemoWaiter1_StartPart3(HAND_PARAMS);
+
+	void CONS_DemoWaiter1_StartPart4(CONS_PARAMS);
+	void HAND_DemoWaiter1_StartPart4(HAND_PARAMS);
+
+	void CONS_DemoWaiter1_StartPart5(CONS_PARAMS);
+	void HAND_DemoWaiter1_StartPart5(HAND_PARAMS);
+
+	Common::StringArray _demoWaiter1FuncNames = {
+		"DoSeqOtis",
+		"Birth",
+		"RebeccaFeedUs",
+		"StartPart2",
+		"StartPart3",
+		"StartPart4",
+		"StartPart5"
+	};
+
+
+	static void (LogicManager::*_functionsDemoAbbot[])(HAND_PARAMS);
+	static void (LogicManager::*_functionsDemoAnna[])(HAND_PARAMS);
+	static void (LogicManager::*_functionsDemoAugust[])(HAND_PARAMS);
+	static void (LogicManager::*_functionsDemoCond2[])(HAND_PARAMS);
+	static void (LogicManager::*_functionsDemoFrancois[])(HAND_PARAMS);
+	static void (LogicManager::*_functionsDemoIvo[])(HAND_PARAMS);
+	static void (LogicManager::*_functionsDemoMadame[])(HAND_PARAMS);
+	static void (LogicManager::*_functionsDemoMaster[])(HAND_PARAMS);
+	static void (LogicManager::*_functionsDemoMonsieur[])(HAND_PARAMS);
+	static void (LogicManager::*_functionsDemoRebecca[])(HAND_PARAMS);
+	static void (LogicManager::*_functionsDemoSophie[])(HAND_PARAMS);
+	static void (LogicManager::*_functionsDemoTableA[])(HAND_PARAMS);
+	static void (LogicManager::*_functionsDemoTableB[])(HAND_PARAMS);
+	static void (LogicManager::*_functionsDemoTableC[])(HAND_PARAMS);
+	static void (LogicManager::*_functionsDemoTableD[])(HAND_PARAMS);
+	static void (LogicManager::*_functionsDemoTableE[])(HAND_PARAMS);
+	static void (LogicManager::*_functionsDemoTableF[])(HAND_PARAMS);
+	static void (LogicManager::*_functionsDemoTatiana[])(HAND_PARAMS);
+	static void (LogicManager::*_functionsDemoVesna[])(HAND_PARAMS);
+	static void (LogicManager::*_functionsDemoWaiter1[])(HAND_PARAMS);
+
+
+	// For the debugger
+	Common::Array<Common::StringArray> _demoFuncNames = {
+		_cathFuncNames,
+		_demoAnnaFuncNames,
+		_demoAugustFuncNames,
+		_cathFuncNames,
+		_demoCond2FuncNames,
+		_cathFuncNames,
+		_demoWaiter1FuncNames,
+		_cathFuncNames,
+		_cathFuncNames,
+		_cathFuncNames,
+		_demoTatianaFuncNames,
+		_cathFuncNames,
+		_cathFuncNames,
+		_demoAbbotFuncNames,
+		_cathFuncNames,
+		_demoVesnaFuncNames,
+		_demoIvoFuncNames,
+		_cathFuncNames,
+		_cathFuncNames,
+		_cathFuncNames,
+		_demoFrancoisFuncNames,
+		_demoMadameFuncNames,
+		_demoMonsieurFuncNames,
+		_demoRebeccaFuncNames,
+		_cathFuncNames,
+		_cathFuncNames,
+		_cathFuncNames,
+		_cathFuncNames,
+		_cathFuncNames,
+		_cathFuncNames,
+		_cathFuncNames,
+		_demoMasterFuncNames,
+		_cathFuncNames,
+		_demoTablesFuncNames,
+		_demoTablesFuncNames,
+		_demoTablesFuncNames,
+		_demoTablesFuncNames,
+		_demoTablesFuncNames,
+		_demoTablesFuncNames,
+		_cathFuncNames
+	};
 };
 
 } // End of namespace LastExpress
diff --git a/engines/lastexpress/game/navigation.cpp b/engines/lastexpress/game/navigation.cpp
index 5ad4d3bbffb..8f380cce3a4 100644
--- a/engines/lastexpress/game/navigation.cpp
+++ b/engines/lastexpress/game/navigation.cpp
@@ -253,13 +253,23 @@ void LogicManager::nodeStepTimer(Event *event) {
 		_gameTime += ticks * _gameTimeTicksDelta;
 
 		if (_gameTimeTicksDelta) {
-			if (!_eventTicksUntilNextSavePoint--) {
-				_eventTicksUntilNextSavePoint = 450;
-				_engine->getVCR()->writeSavePoint(4, 31, 0);
-			}
+			if (_engine->isDemo()) {
+				if (!_eventTicksSinceLastDemoSavegame--) {
+					_eventTicksSinceLastDemoSavegame = 150;
+					_engine->getVCR()->writeSavePoint(4, 31, 0);
+				}
+
+				if ((_currentGameSessionTicks - _lastSavegameSessionTicks) > 450)
+					_engine->getVCR()->writeSavePoint(5, 31, 0);
+			} else {
+				if (!_eventTicksUntilNextSavePoint--) {
+					_eventTicksUntilNextSavePoint = 450;
+					_engine->getVCR()->writeSavePoint(4, 31, 0);
+				}
 
-			if ((_currentGameSessionTicks - _lastSavegameSessionTicks) > 2700)
-				_engine->getVCR()->writeSavePoint(5, 31, 0);
+				if ((_currentGameSessionTicks - _lastSavegameSessionTicks) > 2700)
+					_engine->getVCR()->writeSavePoint(5, 31, 0);
+			}
 		}
 	}
 
@@ -290,7 +300,7 @@ void LogicManager::nodeStepTimer(Event *event) {
 	}
 
 	if (_engine->_navigationEngineIsRunning) {
-		if (_engine->_beetle)
+		if (!_engine->isDemo() && _engine->_beetle)
 			_engine->_beetle->tick();
 
 		_engine->getMessageManager()->flushTime();
@@ -530,7 +540,7 @@ void LogicManager::nodeStepMouse(Event *event) {
 								flag = false;
 							}
 
-							if (actionLink.action == 43 &&
+							if (!_engine->isDemo() && actionLink.action == 43 &&
 								actionLink.param1 == _gameProgress[kProgressChapter] &&
 								(event->flags & 2) != 0) {
 								doF4();
diff --git a/engines/lastexpress/game/savegame.cpp b/engines/lastexpress/game/savegame.cpp
index 3d3f06f4dfe..80d29a35531 100644
--- a/engines/lastexpress/game/savegame.cpp
+++ b/engines/lastexpress/game/savegame.cpp
@@ -1332,8 +1332,8 @@ void SaveManager::validateSaveFile(bool flag) {
 			error("Out of memory");
 		}
 
-		_engine->_savePointHeaders->gameTime = 1037700;
-		_engine->_savePointHeaders->chapter = 1;
+		_engine->_savePointHeaders->gameTime = _engine->isDemo() ? 2241000 : 1037700;
+		_engine->_savePointHeaders->chapter = _engine->isDemo() ? 3 : 1;
 	}
 
 	saveFile->open(_engine->_savegameFilename, CVCRMODE_RB);
@@ -1359,8 +1359,8 @@ void SaveManager::validateSaveFile(bool flag) {
 					error("Out of memory");
 				}
 
-				_engine->_savePointHeaders->gameTime = 1037700;
-				_engine->_savePointHeaders->chapter = 1;
+				_engine->_savePointHeaders->gameTime = _engine->isDemo() ? 2241000 : 1037700;
+				_engine->_savePointHeaders->chapter = _engine->isDemo() ? 3 : 1;
 			}
 
 			for (int i = 0; fileSize >= sizeof(SVCRFileHeader) && i < fileHeader.numSavePoints; ++i) {
@@ -1445,8 +1445,8 @@ void SaveManager::validateSaveFile(bool flag) {
 				error("Out of memory");
 			}
 
-			_engine->_savePointHeaders->gameTime = 1037700;
-			_engine->_savePointHeaders->chapter = 1;
+			_engine->_savePointHeaders->gameTime = _engine->isDemo() ? 2241000 : 1037700;
+			_engine->_savePointHeaders->chapter = _engine->isDemo() ? 3 : 1;
 		}
 
 		int offset = sizeof(SVCRFileHeader);
diff --git a/engines/lastexpress/game/vcr.cpp b/engines/lastexpress/game/vcr.cpp
index 2a302ac393c..b5d9a9d914f 100644
--- a/engines/lastexpress/game/vcr.cpp
+++ b/engines/lastexpress/game/vcr.cpp
@@ -173,7 +173,7 @@ void VCR::shuffleGames() {
 		}
 
 		// If slot is empty, try to find a valid save to move here
-		if (!slotFilled && currentSlot < ARRAYSIZE(_engine->_savegameNames)) {
+		if (!slotFilled && currentSlot < ARRAYSIZE(_engine->_savegameNames) - 1) {
 			for (const char **candidateFile = &_engine->_savegameNames[currentSlot + 1];
 				 candidateFile < _engine->_savegameTempNames;
 				 candidateFile++) {
@@ -213,7 +213,7 @@ void VCR::shuffleGames() {
 	}
 	
 	// Set the current game color based on the most recent save...
-	Common::String currentSaveName = _engine->getTargetName() + "-" + Common::String(_engine->_savegameNames[currentSlot]);
+	Common::String currentSaveName = _engine->getTargetName() + "-" + Common::String(_engine->_savegameNames[currentSlot % 6]);
 	if (_engine->_currentGameFileColorId == -1 || !_engine->getSaveFileManager()->exists(currentSaveName)) {
 		setCurrentGameColor(0); // Default color
 		int32  newestSaveSecs = 0;
@@ -258,11 +258,11 @@ void VCR::setCurrentGameColor(int index) {
 }
 
 void VCR::init(bool doSaveGameFlag, int saveType, int32 time) {
-	int32 chosenTime;
 	int cdNum;
 	SVCRFileHeader header;
 	char path[80];
 
+	int32 chosenTime = 0;
 	bool flag = true;
 	bool writeSavePoint = false;
 
@@ -270,41 +270,62 @@ void VCR::init(bool doSaveGameFlag, int saveType, int32 time) {
 		_engine->_savegame->close();
 
 	if (_engine->_gracePeriodTimer) {
-		chosenTime = 0;
-
-		if (_engine->getLogicManager()->_gameProgress[kProgressChapter] <= 1) {
-			cdNum = 1;
-		} else {
-			cdNum = (_engine->getLogicManager()->_gameProgress[kProgressChapter] > 3) + 2;
-		}
-
-		if (_engine->getArchiveManager()->isCDAvailable(cdNum, path, sizeof(path))) {
-			writeSavePoint = 0;
+		if (_engine->isDemo()) {
+			time = 0;
 			_engine->_gracePeriodTimer = 0;
+			doSaveGameFlag = false;
 
 			if (_engine->getSaveManager()->removeSavegame(_engine->_savegameFilename)) {
 				error("Error deleting file \"%s\"", _engine->_savegameFilename);
 			}
 
-			flag = false;
 			_engine->_currentSavePoint = _engine->_gracePeriodIndex;
+			flag = false;
 			_engine->_savegameFilename = _engine->_savegameNames[_engine->_currentGameFileColorId];
 		} else {
-			writeSavePoint = false;
+			chosenTime = 0;
+
+			if (_engine->getLogicManager()->_gameProgress[kProgressChapter] <= 1) {
+				cdNum = 1;
+			} else {
+				cdNum = (_engine->getLogicManager()->_gameProgress[kProgressChapter] > 3) + 2;
+			}
+
+			if (_engine->getArchiveManager()->isCDAvailable(cdNum, path, sizeof(path))) {
+				writeSavePoint = 0;
+				_engine->_gracePeriodTimer = 0;
+
+				if (_engine->getSaveManager()->removeSavegame(_engine->_savegameFilename)) {
+					error("Error deleting file \"%s\"", _engine->_savegameFilename);
+				}
+
+				flag = false;
+				_engine->_currentSavePoint = _engine->_gracePeriodIndex;
+				_engine->_savegameFilename = _engine->_savegameNames[_engine->_currentGameFileColorId];
+			} else {
+				writeSavePoint = false;
+			}
 		}
 	} else {
-		if (_engine->_savegameTempNames[_engine->_currentGameFileColorId] == _engine->_savegameFilename)
+		if (_engine->_savegameFilename == _engine->_savegameTempNames[_engine->_currentGameFileColorId])
 			_engine->getVCR()->makePermanent();
 
-		writeSavePoint = doSaveGameFlag;
-		chosenTime = time;
+		if (!_engine->isDemo()) {
+			writeSavePoint = doSaveGameFlag;
+			chosenTime = time;
+		}
 	}
 
 	if (!_engine->getSaveManager()->fileExists(_engine->_savegameFilename))
 		_engine->getVCR()->virginSaveFile();
 
-	if (writeSavePoint)
-		_engine->getVCR()->writeSavePoint(3, kCharacterCath, 0);
+	if (_engine->isDemo()) {
+		if (doSaveGameFlag)
+			_engine->getVCR()->writeSavePoint(3, kCharacterCath, 0);
+	} else {
+		if (writeSavePoint)
+			_engine->getVCR()->writeSavePoint(3, kCharacterCath, 0);
+	}
 
 	if (!_engine->_gracePeriodTimer &&
 		_engine->getSaveManager()->fileExists(_engine->_savegameTempNames[_engine->_currentGameFileColorId]) &&
@@ -343,7 +364,13 @@ void VCR::init(bool doSaveGameFlag, int saveType, int32 time) {
 
 	if (_engine->_gameTimeOfLastSavePointInFile >= 1061100) {
 		_engine->getClock()->startClock(_engine->getLogicManager()->_gameTime);
-		_engine->getVCR()->autoRewind(saveType, chosenTime);
+
+		if (_engine->isDemo()) {
+			// Demo: use modified time parameter
+			_engine->getVCR()->autoRewind(saveType, time);
+		} else {
+			_engine->getVCR()->autoRewind(saveType, chosenTime);
+		}
 	}
 }
 
diff --git a/engines/lastexpress/graphics.cpp b/engines/lastexpress/graphics.cpp
index 68e0abb7d22..edad8c8b9bb 100644
--- a/engines/lastexpress/graphics.cpp
+++ b/engines/lastexpress/graphics.cpp
@@ -311,13 +311,6 @@ void GraphicsManager::stepDissolve(TBM *tbm) {
 
 		// Not present in the original, like above.
 		_engine->handleEvents();
-
-		// Also not present in the original; but this is an enhancement which makes it easier
-		// and more reliable to get out of the fast-walk transitions before getting to the next car by mistake...
-		if (_engine->getLogicManager()->_doubleClickFlag && i > 1 && _engine->mouseHasLeftClicked()) {
-			debug("GraphicsManager::stepDissolve(): breaking out of transition in fast-walk mode; REMEMBER TO MAKE THIS AN ENHANCEMENT");
-			break;
-		}
 	}
 
 	if (acquireSurface()) {
diff --git a/engines/lastexpress/lastexpress.cpp b/engines/lastexpress/lastexpress.cpp
index 9dcfa8c19cb..776bff9305a 100644
--- a/engines/lastexpress/lastexpress.cpp
+++ b/engines/lastexpress/lastexpress.cpp
@@ -47,6 +47,7 @@
 #include "common/timer.h"
 
 #include "engines/util.h"
+#include "engines/advancedDetector.h"
 
 const char *g_actionNames[] = {"None", "Action1", "Action2", "ExitCompartment", "Action4", "ExcuseMeCath", "ExcuseMe", "INVALID", "Knock", "OpenDoor", "Action10", "Action11", "Default", "INVALID", "INVALID", "INVALID", "Action16", "DrawScene", "Callback"};
 const char *g_directionNames[] = { "None", "Up", "Down", "Left", "Right", "Switch"};
@@ -112,7 +113,7 @@ void LastExpressEngine::startUp() {
 	getGraphicsManager()->setMouseDrawable(false);
 	initGameData();
 	getSubtitleManager()->initSubtitles();
-	getLogicManager()->loadTrain(1);
+	getLogicManager()->loadTrain(isDemo() ? 2 : 1);
 }
 
 void LastExpressEngine::shutDown() {
@@ -385,15 +386,15 @@ void LastExpressEngine::initGameData() {
 	getLogicManager()->_gameInventory[kItemArticle].scene = 36;
 	getLogicManager()->_gameInventory[kItemTelegram].isPresent = 1;
 	getLogicManager()->_gameInventory[kItemArticle].isPresent = 1;
-	getLogicManager()->_gameProgress[kProgressPortrait] = 32;
-	getLogicManager()->_gameProgress[kProgressChapter] = 1;
+	getLogicManager()->_gameProgress[kProgressPortrait] = isDemo() ? 34: 32;
+	getLogicManager()->_gameProgress[kProgressChapter] = isDemo() ? 3 : 1;
 	getLogicManager()->_lastSavegameSessionTicks = 0;
 	getLogicManager()->_currentGameSessionTicks = 0;
 	getLogicManager()->_useLastSavedNodeIndex = 0;
 	getLogicManager()->_lastNodeIndex = 0;
 	getLogicManager()->_lastSavedNodeIndex = 0;
 	getLogicManager()->_inventorySelectedItemIdx = 0;
-	getLogicManager()->_gameTime = 1037700;
+	getLogicManager()->_gameTime = isDemo() ? 2241000 : 1037700;
 	getLogicManager()->_gameTimeTicksDelta = 3;
 	getLogicManager()->_trainNodeIndex = 40;
 }
@@ -409,7 +410,7 @@ void LastExpressEngine::engineEventHandler(Event *event) {
 		//++g_numClicks;
 		getNISManager()->abortNIS();
 		warning("abortFight() missing from engineEventHandler");
-		//abortFight();
+		abortFight();
 		abortCredits();
 		if (shouldQuit()) {
 			// g_flag_running = 0;
@@ -435,14 +436,14 @@ void LastExpressEngine::engineEventHandler(Event *event) {
 		break;
 	case 2:
 		getNISManager()->abortNIS();
-		//abortFight();
+		abortFight();
 		warning("abortFight() missing from engineEventHandler");
 		abortCredits();
 		if (!shouldQuit() && !getMenu()->isShowingMenu()) {
 			if (getMessageManager()->getEventHandle(1) != &LastExpressEngine::nodeStepMouseWrapper || getVCR()->isVirgin(_currentGameFileColorId))
 				getMessageManager()->addEvent(4, 0, 0, 2);
 			else
-				getMenu()->doEgg(1, 0, 0);
+				getMenu()->doEgg(true, 0, 0);
 		}
 		break;
 	case 3:
@@ -597,7 +598,7 @@ bool LastExpressEngine::handleEvents() {
 			if (!getLogicManager()->_doubleClickFlag) {
 				if (_systemEventLeftMouseDown)
 					curFlags |= 1;
-
+			
 				if (_systemEventRightMouseDown)
 					curFlags |= 2;
 			}
@@ -743,6 +744,14 @@ void LastExpressEngine::creditsTimerWrapper(Event *event) {
 	creditsTimer(event);
 }
 
+void LastExpressEngine::demoEndingMouseWrapper(Event *event) {
+	demoEndingMouse(event);
+}
+
+void LastExpressEngine::demoEndingTimerWrapper(Event *event) {
+	demoEndingTimer(event);
+}
+
 void LastExpressEngine::fightMouseWrapper(Event *event) {
 	_fight->mouse(event);
 }
@@ -751,6 +760,10 @@ void LastExpressEngine::fightTimerWrapper(Event *event) {
 	_fight->timer(event, true);
 }
 
+void LastExpressEngine::emptyHandler(Event *event) {
+	// No-op
+}
+
 ///////////////////////////////////////////////////////////////////////////////////
 /// Event Handling
 ///////////////////////////////////////////////////////////////////////////////////
diff --git a/engines/lastexpress/lastexpress.h b/engines/lastexpress/lastexpress.h
index f2e85ea2a59..db8875a6441 100644
--- a/engines/lastexpress/lastexpress.h
+++ b/engines/lastexpress/lastexpress.h
@@ -691,6 +691,12 @@ public:
 	int32 readTGAIntoMemory(const char *filename, TGAHeader *tgaHeader);
 	void constructPalette(TGAHeader *tgaHeader, uint16 *palette);
 
+	// DEMO CREDITS
+	bool demoEnding(bool wonGame);
+	void demoEndingMouse(Event *event);
+	void demoEndingTimer(Event *event);
+
+	// EVENT HANDLERS
 	void engineEventHandlerWrapper(Event *event);
 
 	void nodeStepMouseWrapper(Event *event);
@@ -705,9 +711,14 @@ public:
 	void creditsMouseWrapper(Event *event);
 	void creditsTimerWrapper(Event *event);
 
+	void demoEndingMouseWrapper(Event *event);
+	void demoEndingTimerWrapper(Event *event);
+
 	void fightMouseWrapper(Event *event);
 	void fightTimerWrapper(Event *event);
 
+	void emptyHandler(Event *event);
+
 	int _savedFrameCounter = 0;
 	int32 _savedFrameInterval = 0;
 	int _doCredits = 0;
diff --git a/engines/lastexpress/menu/menu.cpp b/engines/lastexpress/menu/menu.cpp
index 75466305a93..1b9a1dba4de 100644
--- a/engines/lastexpress/menu/menu.cpp
+++ b/engines/lastexpress/menu/menu.cpp
@@ -1352,16 +1352,22 @@ void MenuOld::setBrightness(uint32 brightness) const {
 
 Menu::Menu(LastExpressEngine *engine) {
 	_engine = engine;
+
+	if (_engine->isDemo())
+		_eggTimerDelta = 2700;
 }
 
 void Menu::doEgg(bool doSaveGame, int type, int32 time) {
 	if (!_isShowingMenu) {
 		_isShowingMenu = true;
 
+		if (_engine->isDemo())
+			_eggTimerDelta = 2700;
+
 		_engine->getOtisManager()->wipeAllGSysInfo();
 
 		if (!_engine->mouseHasRightClicked()) {
-			if (_engine->getVCR()->isVirgin(0) && _engine->getArchiveManager()->lockCD(1)) {
+			if (!_engine->isDemo() && _engine->getVCR()->isVirgin(0) && _engine->getArchiveManager()->lockCD(1)) {
 				if (!_hasShownIntro) {
 					_engine->getNISManager()->doNIS("1930.NIS", 0x4000);
 					_engine->getMessageManager()->clearClickEvents();
@@ -1447,6 +1453,9 @@ void Menu::eggFree() {
 }
 
 void Menu::eggMouse(Event *event) {
+	if (_engine->isDemo())
+		_eggTimerDelta = 2700;
+
 	if (_engine->getGraphicsManager()->canDrawMouse()) {
 		bool redrawMouse = true;
 
@@ -1517,8 +1526,17 @@ void Menu::eggTimer(Event *event) {
 	}
 
 	if (!_eggTimerDelta--) {
-		updateEgg();
-		_eggTimerDelta = 15;
+		if (_engine->isDemo()) {
+			endEgg();
+
+			if (!_engine->demoEnding(false))
+				_engine->getSaveManager()->removeSavegame(_engine->_savegameNames[_engine->_currentGameFileColorId]);
+
+			doEgg(false, 0, 0);
+		} else {
+			updateEgg();
+			_eggTimerDelta = 15;
+		}
 	}
 }
 
@@ -1563,7 +1581,11 @@ bool Menu::eggCursorAction(int8 action, int8 flags) {
 			setSprite(1, 6, true);
 			setSprite(0, -1, true);
 
-			_engine->getLogicManager()->playDialog(0, "LIB046", -1, 0);
+			if (_engine->isDemo()) {
+				_engine->getSoundManager()->playSoundFile("LIB046.SND", 16, 0, 0);
+			} else {
+				_engine->getLogicManager()->playDialog(0, "LIB046", -1, 0);
+			}
 
 			clearSprites();
 
@@ -1590,7 +1612,12 @@ bool Menu::eggCursorAction(int8 action, int8 flags) {
 
 			_engine->getSoundManager()->killAllSlots();
 			_engine->getSoundManager()->soundThread();
-			_engine->getLogicManager()->playDialog(0, "LIB046", -1, 0);
+
+			if (_engine->isDemo()) {
+				_engine->getSoundManager()->playSoundFile("LIB046.SND", 16, 0, 0);
+			} else {
+				_engine->getLogicManager()->playDialog(0, "LIB046", -1, 0);
+			}
 
 			while (_engine->getLogicManager()->dialogRunning("LIB046"))
 				_engine->getSoundManager()->soundThread();
@@ -1611,6 +1638,11 @@ bool Menu::eggCursorAction(int8 action, int8 flags) {
 	case kMenuAction4:
 	{
 		if (action == kMenuAction4) {
+			if (_engine->isDemo()) {
+				clearSprites();
+				return true;
+			}
+
 			if ((flags & 8) != 0)
 				_engine->_currentSavePoint = 0;
 		}
@@ -1624,15 +1656,10 @@ bool Menu::eggCursorAction(int8 action, int8 flags) {
 		if (_engine->getLogicManager()->_gameProgress[kProgressChapter] > 1)
 			whichCD = (_engine->getLogicManager()->_gameProgress[kProgressChapter] > 3) + 2;
 
-		char path[80];
-		if (_engine->getArchiveManager()->isCDAvailable(whichCD, path, sizeof(path))) {
-			if (_gameInNotStartedInFile) {
-				setSprite(1, 0, true);
-				setSprite(0, 31, true);
-			} else {
+		if (_engine->isDemo()) {
+			if (!_gameInNotStartedInFile) {
 				setSprite(1, 7, true);
-
-				if (_engine->_lastSavePointIdInFile == _engine->_currentSavePoint) {
+				if (_engine->_currentSavePoint == _engine->_lastSavePointIdInFile) {
 					if (_engine->getVCR()->currentEndsGame()) {
 						setSprite(0, 6, true);
 					} else {
@@ -1642,59 +1669,117 @@ bool Menu::eggCursorAction(int8 action, int8 flags) {
 					setSprite(0, 5, true);
 				}
 			}
+
+			if ((flags & 8) == 0)
+				return true;
+
+			_engine->getLogicManager()->loadTrain(whichCD);
+			setSprite(0, -1, true);
+			_engine->getSoundManager()->playSoundFile("LIB046.SND", 16, 0, 0);
+			_engine->getMessageManager()->reset();
+			endEgg();
+
+			Slot *slot = _engine->getSoundManager()->_soundCache;
+			if (_engine->getSoundManager()->_soundCache) {
+				do {
+					if (slot->_tag == kSoundTagIntro)
+						break;
+					slot = slot->_next;
+				} while (slot);
+
+				if (slot)
+					slot->setFade(0);
+			}
+
+			_engine->getLogicManager()->fadeToBlack();
 		} else {
-			setSprite(1, -1, true);
-			setSprite(0, whichCD - 1, true);
-		}
+			char path[80];
+			if (_engine->getArchiveManager()->isCDAvailable(whichCD, path, sizeof(path))) {
+				if (_gameInNotStartedInFile) {
+					setSprite(1, 0, true);
+					setSprite(0, 31, true);
+				} else {
+					setSprite(1, 7, true);
 
-		if ((flags & 8) == 0)
-			return true;
+					if (_engine->_lastSavePointIdInFile == _engine->_currentSavePoint) {
+						if (_engine->getVCR()->currentEndsGame()) {
+							setSprite(0, 6, true);
+						} else {
+							setSprite(0, 3, true);
+						}
+					} else {
+						setSprite(0, 5, true);
+					}
+				}
+			} else {
+				setSprite(1, -1, true);
+				setSprite(0, whichCD - 1, true);
+			}
 
-		if (!_engine->getArchiveManager()->lockCD(whichCD))
-			return true;
+			if ((flags & 8) == 0)
+				return true;
 
-		_engine->getLogicManager()->loadTrain(whichCD);
+			if (!_engine->getArchiveManager()->lockCD(whichCD))
+				return true;
 
-		setSprite(0, -1, true);
+			_engine->getLogicManager()->loadTrain(whichCD);
 
-		_engine->getLogicManager()->playDialog(0, "LIB046", -1, 0);
-		_engine->getMessageManager()->reset();
-		endEgg();
+			setSprite(0, -1, true);
 
-		if (!_engine->_currentSavePoint) {
+			_engine->getLogicManager()->playDialog(0, "LIB046", -1, 0);
+			_engine->getMessageManager()->reset();
+			endEgg();
 
-			if (!_engine->mouseHasRightClicked()) {
-				_engine->getLogicManager()->bumpCathNode(5 * _engine->_currentGameFileColorId + 3);
+			if (!_engine->_currentSavePoint) {
 
 				if (!_engine->mouseHasRightClicked()) {
-					_engine->getLogicManager()->bumpCathNode(5 * _engine->_currentGameFileColorId + 4);
+					_engine->getLogicManager()->bumpCathNode(5 * _engine->_currentGameFileColorId + 3);
 
 					if (!_engine->mouseHasRightClicked()) {
-						_engine->getLogicManager()->bumpCathNode(5 * _engine->_currentGameFileColorId + 5);
+						_engine->getLogicManager()->bumpCathNode(5 * _engine->_currentGameFileColorId + 4);
 
 						if (!_engine->mouseHasRightClicked()) {
-							Slot *slot = _engine->getSoundManager()->_soundCache;
-							if (_engine->getSoundManager()->_soundCache) {
-								do {
-									if (slot->_tag == kSoundTagIntro)
-										break;
+							_engine->getLogicManager()->bumpCathNode(5 * _engine->_currentGameFileColorId + 5);
 
-									slot = slot->_next;
-								} while (slot);
+							if (!_engine->mouseHasRightClicked()) {
+								Slot *slot = _engine->getSoundManager()->_soundCache;
+								if (_engine->getSoundManager()->_soundCache) {
+									do {
+										if (slot->_tag == kSoundTagIntro)
+											break;
 
-								if (slot)
-									slot->setFade(0);
-							}
+										slot = slot->_next;
+									} while (slot);
+
+									if (slot)
+										slot->setFade(0);
+								}
 
-							_engine->getNISManager()->doNIS("1601.NIS", 0x4000);
-							_engine->getLogicManager()->_gameEvents[kEventIntro] = 1;
+								_engine->getNISManager()->doNIS("1601.NIS", 0x4000);
+								_engine->getLogicManager()->_gameEvents[kEventIntro] = 1;
+							}
 						}
 					}
 				}
-			}
 
-			if (!_engine->getLogicManager()->_gameEvents[kEventIntro]) {
-				_engine->getLogicManager()->_gameEvents[kEventIntro] = 1;
+				if (!_engine->getLogicManager()->_gameEvents[kEventIntro]) {
+					_engine->getLogicManager()->_gameEvents[kEventIntro] = 1;
+					Slot *slot = _engine->getSoundManager()->_soundCache;
+					if (_engine->getSoundManager()->_soundCache) {
+						do {
+							if (slot->_tag == kSoundTagIntro)
+								break;
+
+							slot = slot->_next;
+						} while (slot);
+
+						if (slot)
+							slot->setFade(0);
+
+						_engine->getLogicManager()->fadeToBlack();
+					}
+				}
+			} else {
 				Slot *slot = _engine->getSoundManager()->_soundCache;
 				if (_engine->getSoundManager()->_soundCache) {
 					do {
@@ -1710,21 +1795,6 @@ bool Menu::eggCursorAction(int8 action, int8 flags) {
 					_engine->getLogicManager()->fadeToBlack();
 				}
 			}
-		} else {
-			Slot *slot = _engine->getSoundManager()->_soundCache;
-			if (_engine->getSoundManager()->_soundCache) {
-				do {
-					if (slot->_tag == kSoundTagIntro)
-						break;
-
-					slot = slot->_next;
-				} while (slot);
-
-				if (slot)
-					slot->setFade(0);
-
-				_engine->getLogicManager()->fadeToBlack();
-			}
 		}
 
 		_engine->_navigationEngineIsRunning = true;
@@ -1741,50 +1811,60 @@ bool Menu::eggCursorAction(int8 action, int8 flags) {
 			return true;
 		}
 
-		if ((flags & 8) != 0) {
-			setSprite(3, 1, true);
-			setSprite(0, -1, true);
+		if (_engine->isDemo()) {
+			// Demo: simplified implementation
+			if ((flags & 0x88) != 0)
+				return true;
 
-			_engine->getLogicManager()->playDialog(0, "LIB047", -1, 0);
+			setSprite(3, 0, true);
+			setSprite(0, 7, true);
+			return true;
+		} else {
+			if ((flags & 8) != 0) {
+				setSprite(3, 1, true);
+				setSprite(0, -1, true);
 
-			switchEggs(_engine->getVCR()->switchGames());
+				_engine->getLogicManager()->playDialog(0, "LIB047", -1, 0);
 
-			_engine->_fightSkipCounter = 0;
-			return true;
-		}
+				switchEggs(_engine->getVCR()->switchGames());
 
-		if ((flags & 0x80) != 0)
-			return true;
+				_engine->_fightSkipCounter = 0;
+				return true;
+			}
 
-		setSprite(3, 0, true);
+			if ((flags & 0x80) != 0)
+				return true;
 
-		if (_gameInNotStartedInFile || _engine->_currentGameFileColorId == 5) {
-			setSprite(0, 25, true);
-		} else if (_engine->getVCR()->isVirgin(_engine->_currentGameFileColorId + 1)) {
-			setSprite(0, 7, true);
-		} else {
-			switch (_engine->_currentGameFileColorId) {
-			case 0:
-				setSprite(0, 26, true);
-				break;
-			case 1:
-				setSprite(0, 28, true);
-				break;
-			case 2:
-				setSprite(0, 30, true);
-				break;
-			case 3:
-				setSprite(0, 29, true);
-				break;
-			case 4:
-				setSprite(0, 27, true);
-				break;
-			default:
-				break;
+			setSprite(3, 0, true);
+
+			if (_gameInNotStartedInFile || _engine->_currentGameFileColorId == 5) {
+				setSprite(0, 25, true);
+			} else if (_engine->getVCR()->isVirgin(_engine->_currentGameFileColorId + 1)) {
+				setSprite(0, 7, true);
+			} else {
+				switch (_engine->_currentGameFileColorId) {
+				case 0:
+					setSprite(0, 26, true);
+					break;
+				case 1:
+					setSprite(0, 28, true);
+					break;
+				case 2:
+					setSprite(0, 30, true);
+					break;
+				case 3:
+					setSprite(0, 29, true);
+					break;
+				case 4:
+					setSprite(0, 27, true);
+					break;
+				default:
+					break;
+				}
 			}
-		}
 
-		return true;
+			return true;
+		}
 	case kMenuActionRewind:
 		if (!_engine->_currentSavePoint) {
 			clearSprites();
@@ -1806,7 +1886,12 @@ bool Menu::eggCursorAction(int8 action, int8 flags) {
 			setSprite(1, 2, true);
 			setSprite(0, -1, true);
 
-			_engine->getLogicManager()->playDialog(0, "LIB046", -1, 0);
+			if (_engine->isDemo()) {
+				_engine->getSoundManager()->playSoundFile("LIB046.SND", 16, 0, 0);
+			} else {
+				_engine->getLogicManager()->playDialog(0, "LIB046", -1, 0);
+			}
+
 			_engine->getVCR()->rewind();
 
 			_moveClockHandsFlag = false;
@@ -1839,7 +1924,12 @@ bool Menu::eggCursorAction(int8 action, int8 flags) {
 			setSprite(1, 4, true);
 			setSprite(0, -1, true);
 
-			_engine->getLogicManager()->playDialog(0, "LIB046", -1, 0);
+			if (_engine->isDemo()) {
+				_engine->getSoundManager()->playSoundFile("LIB046.SND", 16, 0, 0);
+			} else {
+				_engine->getLogicManager()->playDialog(0, "LIB046", -1, 0);
+			}
+
 			_engine->getVCR()->forward();
 
 			_moveClockHandsFlag = false;
@@ -1859,22 +1949,31 @@ bool Menu::eggCursorAction(int8 action, int8 flags) {
 
 		setCity(0);
 
-		if ((flags & 8) != 0) {
-			setSprite(0, -1, true);
-
-			_engine->getLogicManager()->playDialog(0, "LIB046", -1, 0);
-			_engine->getVCR()->seekToTime(1037700);
+		if (_engine->isDemo()) {
+			// Demo doesn't implement time seeking...
+			if ((flags & 0x88) != 0)
+				return true;
 
-			_moveClockHandsFlag = true;
+			setSprite(0, 13, true);
 			return true;
-		}
+		} else {
+			if ((flags & 8) != 0) {
+				setSprite(0, -1, true);
 
-		if ((flags & 0x80) != 0)
-			return true;
+				_engine->getLogicManager()->playDialog(0, "LIB046", -1, 0);
+				_engine->getVCR()->seekToTime(1037700);
 
-		setSprite(0, 13, true);
+				_moveClockHandsFlag = true;
+				return true;
+			}
 
-		return true;
+			if ((flags & 0x80) != 0)
+				return true;
+
+			setSprite(0, 13, true);
+
+			return true;
+		}
 	case kMenuActionGoToStrasbourg:
 		if (_engine->_gameTimeOfLastSavePointInFile < 1490400 || _engine->getClock()->getTimeShowing() == 1490400 || _engine->getClock()->getTimeTo() == 1490400) {
 			clearSprites();
@@ -1883,26 +1982,40 @@ bool Menu::eggCursorAction(int8 action, int8 flags) {
 
 		setCity(1);
 
-		if ((flags & 8) != 0) {
-			setSprite(0, -1, true);
+		if (_engine->isDemo()) {
+			// Demo doesn't implement time seeking...
+			if ((flags & 0x88) != 0)
+				return true;
 
-			_engine->getLogicManager()->playDialog(0, "LIB046", -1, 0);
-			_engine->getVCR()->seekToTime(1490400);
+			if (_engine->getClock()->getTimeShowing() <= 1490400) {
+				setSprite(0, 14, true);
+			} else {
+				setSprite(0, 15, true);
+			}
 
-			_moveClockHandsFlag = true;
 			return true;
-		}
+		} else {
+			if ((flags & 8) != 0) {
+				setSprite(0, -1, true);
 
-		if ((flags & 0x80) != 0)
-			return true;
+				_engine->getLogicManager()->playDialog(0, "LIB046", -1, 0);
+				_engine->getVCR()->seekToTime(1490400);
 
-		if (_engine->getClock()->getTimeShowing() <= 1490400) {
-			setSprite(0, 14, true);
-		} else {
-			setSprite(0, 15, true);
-		}
+				_moveClockHandsFlag = true;
+				return true;
+			}
 
-		return true;
+			if ((flags & 0x80) != 0)
+				return true;
+
+			if (_engine->getClock()->getTimeShowing() <= 1490400) {
+				setSprite(0, 14, true);
+			} else {
+				setSprite(0, 15, true);
+			}
+
+			return true;
+		}
 	case kMenuActionGoToMunich:
 		if (_engine->_gameTimeOfLastSavePointInFile < 1852200 || _engine->getClock()->getTimeShowing() == 1852200 || _engine->getClock()->getTimeTo() == 1852200) {
 			clearSprites();
@@ -1911,27 +2024,46 @@ bool Menu::eggCursorAction(int8 action, int8 flags) {
 
 		setCity(2);
 
-		if ((flags & 8) != 0) {
-			setSprite(0, -1, true);
+		if (_engine->isDemo()) {
+			// Demo doesn't implement time seeking...
+			if ((flags & 0x88) != 0)
+				return true;
 
-			_engine->getLogicManager()->playDialog(0, "LIB046", -1, 0);
-			_engine->getVCR()->seekToTime(1852200);
+			if (_engine->getClock()->getTimeShowing() <= 1852200) {
+				setSprite(0, 17, true);
+			} else {
+				setSprite(0, 16, true);
+			}
 
-			_moveClockHandsFlag = true;
 			return true;
-		}
+		} else {
+			if ((flags & 8) != 0) {
+				setSprite(0, -1, true);
 
-		if ((flags & 0x80) != 0)
-			return true;
+				_engine->getLogicManager()->playDialog(0, "LIB046", -1, 0);
+				_engine->getVCR()->seekToTime(1852200);
 
-		if (_engine->getClock()->getTimeShowing() <= 1852200) {
-			setSprite(0, 17, true);
-		} else {
-			setSprite(0, 16, true);
-		}
+				_moveClockHandsFlag = true;
+				return true;
+			}
 
-		return true;
+			if ((flags & 0x80) != 0)
+				return true;
+
+			if (_engine->getClock()->getTimeShowing() <= 1852200) {
+				setSprite(0, 17, true);
+			} else {
+				setSprite(0, 16, true);
+			}
+
+			return true;
+		}
 	case kMenuActionGoToVienna:
+		if (_engine->isDemo()) {
+			clearSprites();
+			return true;
+		}
+
 		if (_engine->_gameTimeOfLastSavePointInFile < 2268000 || _engine->getClock()->getTimeShowing() == 2268000 || _engine->getClock()->getTimeTo() == 2268000) {
 			clearSprites();
 			return true;
@@ -1960,6 +2092,11 @@ bool Menu::eggCursorAction(int8 action, int8 flags) {
 
 		return true;
 	case kMenuActionGoToBudapest:
+		if (_engine->isDemo()) {
+			clearSprites();
+			return true;
+		}
+
 		if (_engine->_gameTimeOfLastSavePointInFile < 2551500 || _engine->getClock()->getTimeShowing() == 2551500 || _engine->getClock()->getTimeTo() == 2551500) {
 			clearSprites();
 			return true;
@@ -1988,6 +2125,11 @@ bool Menu::eggCursorAction(int8 action, int8 flags) {
 
 		return true;
 	case kMenuActionGoToBelgrad:
+		if (_engine->isDemo()) {
+			clearSprites();
+			return true;
+		}
+
 		if (_engine->_gameTimeOfLastSavePointInFile < 2952000 || _engine->getClock()->getTimeShowing() == 2952000 || _engine->getClock()->getTimeTo() == 2952000) {
 			clearSprites();
 			return true;
@@ -2016,6 +2158,11 @@ bool Menu::eggCursorAction(int8 action, int8 flags) {
 
 		return true;
 	case kMenuActionGoToCostantinople:
+		if (_engine->isDemo()) {
+			clearSprites();
+			return true;
+		}
+
 		if (_engine->_gameTimeOfLastSavePointInFile < 4941000 || _engine->getClock()->getTimeShowing() == 4941000 || _engine->getClock()->getTimeTo() == 4941000) {
 			clearSprites();
 			return true;
@@ -2060,7 +2207,12 @@ bool Menu::eggCursorAction(int8 action, int8 flags) {
 
 		setSprite(2, 0, true);
 
-		_engine->getLogicManager()->playDialog(0, "LIB046", -1, 0);
+		if (_engine->isDemo()) {
+			_engine->getSoundManager()->playSoundFile("LIB046.SND", 16, 0, 0);
+		} else {
+			_engine->getLogicManager()->playDialog(0, "LIB046", -1, 0);
+		}
+
 		_engine->getSoundManager()->setMasterVolume(_engine->getSoundManager()->getMasterVolume() - 1);
 		_engine->getVCR()->storeSettings();
 
@@ -2088,7 +2240,11 @@ bool Menu::eggCursorAction(int8 action, int8 flags) {
 			setSprite(0, 8, true);
 
 			if ((flags & 8) != 0) {
-				_engine->getLogicManager()->playDialog(0, "LIB046", -1, 0);
+				if (_engine->isDemo()) {
+					_engine->getSoundManager()->playSoundFile("LIB046.SND", 16, 0, 0);
+				} else {
+					_engine->getLogicManager()->playDialog(0, "LIB046", -1, 0);
+				}
 
 				setSprite(2, 4, true);
 
@@ -2131,7 +2287,12 @@ bool Menu::eggCursorAction(int8 action, int8 flags) {
 
 		setSprite(2, 5, true);
 
-		_engine->getLogicManager()->playDialog(0, "LIB046", -1, 0);
+		if (_engine->isDemo()) {
+			_engine->getSoundManager()->playSoundFile("LIB046.SND", 16, 0, 0);
+		} else {
+			_engine->getLogicManager()->playDialog(0, "LIB046", -1, 0);
+		}
+
 		_engine->getGraphicsManager()->setGammaLevel(_engine->getGraphicsManager()->getGammaLevel() - 1);
 		_engine->getVCR()->storeSettings();
 
@@ -2173,7 +2334,12 @@ bool Menu::eggCursorAction(int8 action, int8 flags) {
 				if ((flags & 8) != 0) {
 					setSprite(2, 9, true);
 
-					_engine->getLogicManager()->playDialog(0, "LIB046", -1, 0);
+					if (_engine->isDemo()) {
+						_engine->getSoundManager()->playSoundFile("LIB046.SND", 16, 0, 0);
+					} else {
+						_engine->getLogicManager()->playDialog(0, "LIB046", -1, 0);
+					}
+
 					_engine->getGraphicsManager()->setGammaLevel(_engine->getGraphicsManager()->getGammaLevel() + 1);
 					_engine->getVCR()->storeSettings();
 
@@ -2248,9 +2414,9 @@ void Menu::switchEggs(int whichEgg) {
 		_menuSeqs[3] = nullptr;
 	}
 
-	_gameInNotStartedInFile = _engine->_gameTimeOfLastSavePointInFile < 1061100;
+	_gameInNotStartedInFile = _engine->isDemo() || _engine->_gameTimeOfLastSavePointInFile < 1061100;
 
-	if (_engine->_gameTimeOfLastSavePointInFile >= 1061100) {
+	if (_engine->isDemo() || _engine->_gameTimeOfLastSavePointInFile >= 1061100) {
 		_engine->getLogicManager()->bumpCathNode((5 * whichEgg) + 1);
 	} else {
 		_engine->getLogicManager()->bumpCathNode((5 * whichEgg) + 2);
@@ -2259,6 +2425,12 @@ void Menu::switchEggs(int whichEgg) {
 	_engine->getGraphicsManager()->setMouseDrawable(true);
 	_engine->getLogicManager()->mouseStatus();
 
+	if (_engine->isDemo()) {
+		Common::strcpy_s(_eggButtonsSeqNames[3], "aconred.seq");
+		_menuSeqs[3] = _engine->getArchiveManager()->loadSeq(_eggButtonsSeqNames[3], 15, 0);
+		return;
+	}
+
 	if (_gameInNotStartedInFile && whichEgg == 0) {
 		return;
 	}
@@ -2297,4 +2469,12 @@ bool Menu::isShowingMenu() {
 	return _isShowingMenu;
 }
 
+void Menu::setEggTimerDelta(int delta) {
+	_eggTimerDelta = delta;
+}
+
+int Menu::getEggTimerDelta() {
+	return _eggTimerDelta;
+}
+
 } // End of namespace LastExpress
diff --git a/engines/lastexpress/menu/menu.h b/engines/lastexpress/menu/menu.h
index 8eb9f61438d..7532a2a9bb7 100644
--- a/engines/lastexpress/menu/menu.h
+++ b/engines/lastexpress/menu/menu.h
@@ -226,7 +226,10 @@ public:
 	void switchEggs(int whichEgg);
 	bool isShowingMenu();
 
-private:
+	void setEggTimerDelta(int delta);
+	int getEggTimerDelta();
+
+protected:
 	LastExpressEngine *_engine = nullptr;
 	bool _isShowingMenu = false;
 	bool _hasShownIntro = false;
diff --git a/engines/lastexpress/module.mk b/engines/lastexpress/module.mk
index 76f0556a7d5..7e7a29ea030 100644
--- a/engines/lastexpress/module.mk
+++ b/engines/lastexpress/module.mk
@@ -1,6 +1,25 @@
 MODULE := engines/lastexpress
 
 MODULE_OBJS := \
+	characters/demo/demo_abbot.o \
+	characters/demo/demo_anna.o \
+	characters/demo/demo_august.o \
+	characters/demo/demo_cond2.o \
+	characters/demo/demo_francois.o \
+	characters/demo/demo_ivo.o \
+	characters/demo/demo_madame.o \
+	characters/demo/demo_master.o \
+	characters/demo/demo_monsieur.o \
+	characters/demo/demo_rebecca.o \
+	characters/demo/demo_tablea.o \
+	characters/demo/demo_tableb.o \
+	characters/demo/demo_tablec.o \
+	characters/demo/demo_tabled.o \
+	characters/demo/demo_tablee.o \
+	characters/demo/demo_tablef.o \
+	characters/demo/demo_tatiana.o \
+	characters/demo/demo_vesna.o \
+	characters/demo/demo_waiter1.o \
 	characters/abbot.o \
 	characters/alexei.o \
 	characters/alouan.o \
diff --git a/engines/lastexpress/sound/sound.cpp b/engines/lastexpress/sound/sound.cpp
index efbbe0c10bc..0d3158409df 100644
--- a/engines/lastexpress/sound/sound.cpp
+++ b/engines/lastexpress/sound/sound.cpp
@@ -1674,7 +1674,11 @@ void SoundManager::ambientAI(int id) {
 			_loopingSoundDuration = ((rnd(UINT_MAX)) % 320) + 260;
 
 			if (soundId != 99) {
-				playSoundFile(newAmbientSoundName, kSoundTypeAmbient | kSoundFlagLooped | kVolume1, kCharacterSteam, 0);
+				if (_engine->isDemo()) {
+					playSoundFile(newAmbientSoundName, kSoundTypeAmbient | kSoundFlagLooped | kVolume2, kCharacterSteam, 0);
+				} else {
+					playSoundFile(newAmbientSoundName, kSoundTypeAmbient | kSoundFlagLooped | kVolume1, kCharacterSteam, 0);
+				}
 
 				if (oldAmbientSlot1)
 					oldAmbientSlot1->setFade(kVolumeNone);


Commit: b5f33424ebdfe0e7da1a6beecf7eb7c7f0199674
    https://github.com/scummvm/scummvm/commit/b5f33424ebdfe0e7da1a6beecf7eb7c7f0199674
Author: AndywinXp (andywinxp at gmail.com)
Date: 2025-06-16T23:12:18+02:00

Commit Message:
LASTEXPRESS: Remove old engine code

Changed paths:
  R engines/lastexpress/data/animation.cpp
  R engines/lastexpress/data/animation.h
  R engines/lastexpress/data/background.cpp
  R engines/lastexpress/data/background.h
  R engines/lastexpress/data/cursor.cpp
  R engines/lastexpress/data/cursor.h
  R engines/lastexpress/data/font.cpp
  R engines/lastexpress/data/font.h
  R engines/lastexpress/data/scene.cpp
  R engines/lastexpress/data/scene.h
  R engines/lastexpress/data/sequence.cpp
  R engines/lastexpress/data/sequence.h
  R engines/lastexpress/data/snd.cpp
  R engines/lastexpress/data/snd.h
  R engines/lastexpress/data/subtitle.cpp
  R engines/lastexpress/data/subtitle.h
  R engines/lastexpress/drawable.h
  R engines/lastexpress/entities/abbot.cpp
  R engines/lastexpress/entities/abbot.h
  R engines/lastexpress/entities/alexei.cpp
  R engines/lastexpress/entities/alexei.h
  R engines/lastexpress/entities/alouan.cpp
  R engines/lastexpress/entities/alouan.h
  R engines/lastexpress/entities/anna.cpp
  R engines/lastexpress/entities/anna.h
  R engines/lastexpress/entities/august.cpp
  R engines/lastexpress/entities/august.h
  R engines/lastexpress/entities/boutarel.cpp
  R engines/lastexpress/entities/boutarel.h
  R engines/lastexpress/entities/chapters.cpp
  R engines/lastexpress/entities/chapters.h
  R engines/lastexpress/entities/cooks.cpp
  R engines/lastexpress/entities/cooks.h
  R engines/lastexpress/entities/coudert.cpp
  R engines/lastexpress/entities/coudert.h
  R engines/lastexpress/entities/entity.cpp
  R engines/lastexpress/entities/entity.h
  R engines/lastexpress/entities/entity39.cpp
  R engines/lastexpress/entities/entity39.h
  R engines/lastexpress/entities/entity_intern.h
  R engines/lastexpress/entities/francois.cpp
  R engines/lastexpress/entities/francois.h
  R engines/lastexpress/entities/gendarmes.cpp
  R engines/lastexpress/entities/gendarmes.h
  R engines/lastexpress/entities/hadija.cpp
  R engines/lastexpress/entities/hadija.h
  R engines/lastexpress/entities/ivo.cpp
  R engines/lastexpress/entities/ivo.h
  R engines/lastexpress/entities/kahina.cpp
  R engines/lastexpress/entities/kahina.h
  R engines/lastexpress/entities/kronos.cpp
  R engines/lastexpress/entities/kronos.h
  R engines/lastexpress/entities/mahmud.cpp
  R engines/lastexpress/entities/mahmud.h
  R engines/lastexpress/entities/max.cpp
  R engines/lastexpress/entities/max.h
  R engines/lastexpress/entities/mertens.cpp
  R engines/lastexpress/entities/mertens.h
  R engines/lastexpress/entities/milos.cpp
  R engines/lastexpress/entities/milos.h
  R engines/lastexpress/entities/mmeboutarel.cpp
  R engines/lastexpress/entities/mmeboutarel.h
  R engines/lastexpress/entities/pascale.cpp
  R engines/lastexpress/entities/pascale.h
  R engines/lastexpress/entities/rebecca.cpp
  R engines/lastexpress/entities/rebecca.h
  R engines/lastexpress/entities/salko.cpp
  R engines/lastexpress/entities/salko.h
  R engines/lastexpress/entities/sophie.cpp
  R engines/lastexpress/entities/sophie.h
  R engines/lastexpress/entities/tables.cpp
  R engines/lastexpress/entities/tables.h
  R engines/lastexpress/entities/tatiana.cpp
  R engines/lastexpress/entities/tatiana.h
  R engines/lastexpress/entities/train.cpp
  R engines/lastexpress/entities/train.h
  R engines/lastexpress/entities/vassili.cpp
  R engines/lastexpress/entities/vassili.h
  R engines/lastexpress/entities/verges.cpp
  R engines/lastexpress/entities/verges.h
  R engines/lastexpress/entities/vesna.cpp
  R engines/lastexpress/entities/vesna.h
  R engines/lastexpress/entities/waiter1.cpp
  R engines/lastexpress/entities/waiter1.h
  R engines/lastexpress/entities/waiter2.cpp
  R engines/lastexpress/entities/waiter2.h
  R engines/lastexpress/entities/yasmin.cpp
  R engines/lastexpress/entities/yasmin.h
  R engines/lastexpress/eventhandler.h
  R engines/lastexpress/game/action.h
  R engines/lastexpress/game/entities.cpp
  R engines/lastexpress/game/entities.h
  R engines/lastexpress/game/inventory.cpp
  R engines/lastexpress/game/inventory.h
  R engines/lastexpress/game/object.cpp
  R engines/lastexpress/game/object.h
  R engines/lastexpress/game/savepoint.cpp
  R engines/lastexpress/game/savepoint.h
  R engines/lastexpress/game/scenes.cpp
  R engines/lastexpress/game/scenes.h
  R engines/lastexpress/game/state.cpp
  R engines/lastexpress/game/state.h
  R engines/lastexpress/menu/trainline.cpp
  R engines/lastexpress/menu/trainline.h
  R engines/lastexpress/resource.cpp
  R engines/lastexpress/resource.h
  R engines/lastexpress/sound/entry.cpp
  R engines/lastexpress/sound/entry.h
  R engines/lastexpress/sound/mixer.h
  R engines/lastexpress/sound/queue.cpp
  R engines/lastexpress/sound/queue.h
  R engines/lastexpress/strings.h
    engines/lastexpress/data/archive.cpp
    engines/lastexpress/data/archive.h
    engines/lastexpress/data/cvcrfile.cpp
    engines/lastexpress/debug.cpp
    engines/lastexpress/debug.h
    engines/lastexpress/game/action.cpp
    engines/lastexpress/game/beetle.cpp
    engines/lastexpress/game/beetle.h
    engines/lastexpress/game/credits.cpp
    engines/lastexpress/game/logic.cpp
    engines/lastexpress/game/logic.h
    engines/lastexpress/game/navigation.cpp
    engines/lastexpress/game/savegame.cpp
    engines/lastexpress/game/savegame.h
    engines/lastexpress/game/vcr.cpp
    engines/lastexpress/graphics.cpp
    engines/lastexpress/graphics.h
    engines/lastexpress/helpers.h
    engines/lastexpress/lastexpress.cpp
    engines/lastexpress/lastexpress.h
    engines/lastexpress/memory.cpp
    engines/lastexpress/menu/clock.cpp
    engines/lastexpress/menu/clock.h
    engines/lastexpress/menu/menu.cpp
    engines/lastexpress/menu/menu.h
    engines/lastexpress/metaengine.cpp
    engines/lastexpress/module.mk
    engines/lastexpress/sound/mixer.cpp
    engines/lastexpress/sound/sound.cpp
    engines/lastexpress/sound/sound.h
    engines/lastexpress/sound/subtitle.h


diff --git a/engines/lastexpress/data/animation.cpp b/engines/lastexpress/data/animation.cpp
deleted file mode 100644
index 670228c4565..00000000000
--- a/engines/lastexpress/data/animation.cpp
+++ /dev/null
@@ -1,301 +0,0 @@
-/* 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 3 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, see <http://www.gnu.org/licenses/>.
- *
- */
-
-// Based on Deniz Oezmen's code: http://oezmen.eu/
-
-#include "lastexpress/data/animation.h"
-
-#include "lastexpress/data/sequence.h"
-#include "lastexpress/data/snd.h"
-
-#include "lastexpress/debug.h"
-#include "lastexpress/helpers.h"
-
-#include "common/events.h"
-#include "common/rational.h"
-#include "common/stream.h"
-#include "common/system.h"
-
-#include "engines/engine.h"
-
-namespace LastExpress {
-
-Animation::Animation() : _stream(nullptr), _currentChunk(nullptr), _overlay(nullptr), _background1(nullptr), _background2(nullptr), _backgroundCurrent(0), _audio(nullptr), _startTime(0), _changed(false) {
-}
-
-Animation::~Animation() {
-	reset();
-}
-
-void Animation::reset() {
-	SAFE_DELETE(_overlay);
-	SAFE_DELETE(_background1);
-	SAFE_DELETE(_background2);
-	SAFE_DELETE(_audio);
-
-	_backgroundCurrent = 0;
-	_chunks.clear();
-
-	_currentChunk = nullptr;
-
-	SAFE_DELETE(_stream);
-}
-
-bool Animation::load(Common::SeekableReadStream *stream, int flag) {
-	if (!stream)
-		return false;
-
-	reset();
-
-	// Keep stream for later decoding of animation
-	_stream = stream;
-
-	// Read header to get the number of chunks
-	uint32 numChunks = _stream->readUint32LE();
-	debugC(3, kLastExpressDebugGraphics, "Number of chunks in NIS file: %d", numChunks);
-
-	// Check if there is enough data
-	if (_stream->size() - _stream->pos() < (signed)(numChunks * sizeof(Chunk))) {
-		debugC(2, kLastExpressDebugGraphics, "NIS file seems to be corrupted");
-		return false;
-	}
-
-	// Read all the chunks
-	for (uint32 i = 0; i < numChunks; ++i) {
-		Chunk chunk;
-		chunk.type = (ChunkType)_stream->readUint16LE();
-		chunk.frame = _stream->readUint16LE();
-		chunk.size = _stream->readUint32LE();
-
-		_chunks.push_back(chunk);
-
-		debugC(9, kLastExpressDebugGraphics, "Chunk Entry: type 0x%.4x, frame=%d, size=%d", chunk.type, chunk.frame, chunk.size);
-	}
-	_currentChunk = _chunks.begin();
-	_changed = false;
-	_startTime = g_system->getMillis();
-
-	return true;
-}
-
-bool Animation::process() {
-	if (!_currentChunk)
-		error("[Animation::process] Current chunk iterator is invalid");
-
-	if (_stream == nullptr || _chunks.size() == 0)
-		error("[Animation::process] Trying to show an animation before loading data");
-
-	// TODO: - subtract the time paused by the GUI
-	//       - Re-implement to be closer to the original engine
-	//       - Add support for subtitles
-	//       - Use engine sound queue instead of our own appendable sound instance
-	int32 currentFrame = (g_system->getMillis() - _startTime) * 3 / 100;
-
-	// Process all chunks until the current frame
-	while (!_changed && _currentChunk != nullptr && currentFrame > _currentChunk->frame && !hasEnded()) {
-		switch(_currentChunk->type) {
-		//TODO: some info chunks are probably subtitle/sync related
-		case kChunkTypeUnknown1:
-		case kChunkTypeUnknown2:
-		case kChunkTypeUnknown5:
-			debugC(9, kLastExpressDebugGraphics, "  info chunk: type 0x%.4x (size %d)", _currentChunk->type, _currentChunk->size);
-			assert (_currentChunk->frame == 0);
-			//TODO: _currentChunk->size?
-			break;
-
-		case kChunkTypeAudioInfo:
-			debugC(9, kLastExpressDebugGraphics, "  audio info: %d blocks", _currentChunk->size);
-			assert (_currentChunk->frame == 0);
-			//TODO: save the size?
-			_audio = new AppendableSound();
-			break;
-
-		case kChunkTypeUnknown4:
-			debugC(9, kLastExpressDebugGraphics, "  info block 4");
-			assert (_currentChunk->frame == 0 && _currentChunk->size == 0);
-			//TODO unknown type of chunk
-			break;
-
-		case kChunkTypeBackground1:
-			debugC(9, kLastExpressDebugGraphics, "  background frame 1 (%d bytes, frame %d)", _currentChunk->size, _currentChunk->frame);
-			delete _background1;
-			_background1 = processChunkFrame(_stream, *_currentChunk);
-			break;
-
-		case kChunkTypeSelectBackground1:
-			debugC(9, kLastExpressDebugGraphics, "  select background 1");
-			assert (_currentChunk->frame == 0 && _currentChunk->size == 0);
-			_backgroundCurrent = 1;
-			break;
-
-		case kChunkTypeBackground2:
-			debugC(9, kLastExpressDebugGraphics, "  background frame 2 (%d bytes, frame %d)", _currentChunk->size, _currentChunk->frame);
-			delete _background2;
-			_background2 = processChunkFrame(_stream, *_currentChunk);
-			break;
-
-		case kChunkTypeSelectBackground2:
-			debugC(9, kLastExpressDebugGraphics, "  select background 2");
-			assert (_currentChunk->frame == 0 && _currentChunk->size == 0);
-			_backgroundCurrent = 2;
-			break;
-
-		case kChunkTypeOverlay:
-			debugC(9, kLastExpressDebugGraphics, "  overlay frame (%d bytes, frame %d)", _currentChunk->size, _currentChunk->frame);
-			delete _overlay;
-			_overlay = processChunkFrame(_stream, *_currentChunk);
-			break;
-
-		case kChunkTypeUpdate:
-		case kChunkTypeUpdateTransition:
-			debugC(9, kLastExpressDebugGraphics, "  update%s: frame %d", _currentChunk->type == 15 ? "" : " with transition", _currentChunk->frame);
-			assert (_currentChunk->size == 0);
-			_changed = true;
-			break;
-
-		case kChunkTypeAudioData:
-			debugC(9, kLastExpressDebugGraphics, "  audio (%d blocks, %d bytes, frame %d)", _currentChunk->size / _soundBlockSize, _currentChunk->size, _currentChunk->frame);
-			processChunkAudio(_stream, *_currentChunk);
-
-			// Synchronize the audio by resetting the start time
-			if (_currentChunk->frame == 0)
-				_startTime = g_system->getMillis();
-			break;
-
-		case kChunkTypeAudioEnd:
-			debugC(9, kLastExpressDebugGraphics, "  audio end: %d blocks", _currentChunk->frame);
-			assert (_currentChunk->size == 0);
-			_audio->finish();
-			//TODO: we need to start the linked sound (.LNK) after the audio from the animation ends
-			break;
-
-		default:
-			error("[Animation::process] UNKNOWN chunk type=%x frame=%d size=%d", _currentChunk->type, _currentChunk->frame, _currentChunk->size);
-			break;
-		}
-		_currentChunk++;
-	}
-
-	return true;
-}
-
-bool Animation::hasEnded() {
-	return _currentChunk == _chunks.end();
-}
-
-Common::Rect Animation::draw(Graphics::Surface *surface) {
-	if (!_overlay)
-		error("[Animation::draw] Current overlay animation frame is invalid");
-
-	// Paint the background
-	if (_backgroundCurrent == 1 && _background1)
-		_background1->draw(surface);
-	else if (_backgroundCurrent == 2 && _background2)
-		_background2->draw(surface);
-
-	// Paint the overlay
-	_overlay->draw(surface);
-
-	//TODO
-	return Common::Rect();
-}
-
-AnimFrame *Animation::processChunkFrame(Common::SeekableReadStream *in, const Chunk &c) const {
-	assert (c.frame == 0);
-
-	// Create a temporary chunk buffer
-	Common::SeekableReadStream *str = in->readStream(c.size);
-
-	// Read the frame information
-	FrameInfo i;
-	i.read(str, false);
-
-	// Decode the frame
-	AnimFrame *f = new AnimFrame(str, i, true);
-
-	// Delete the temporary chunk buffer
-	delete str;
-
-	return f;
-}
-
-void Animation::processChunkAudio(Common::SeekableReadStream *in, const Chunk &c) {
-	if (!_audio)
-		error("[Animation::processChunkAudio] Audio stream is invalid");
-
-	// Skip the Snd header, to queue just the audio blocks
-	uint32 size = c.size;
-	if ((c.size % 739) != 0) {
-		// Read Snd header
-		uint32 header1 = in->readUint32LE();
-		uint16 header2 = in->readUint16LE();
-		debugC(4, kLastExpressDebugSound, "Start ADPCM: %d, %d", header1, header2);
-		size -= 6;
-	}
-
-	// Append the current chunk to the Snd
-	_audio->queueBuffer(in->readStream(size));
-}
-
-// TODO: this method will probably go away and be integrated in the main loop
-void Animation::play() {
-	Common::EventManager *eventMan = g_system->getEventManager();
-	while (!hasEnded() && !Engine::shouldQuit()) {
-		process();
-
-		if (_changed) {
-			// Create a temporary surface to merge the overlay with the background
-			Graphics::Surface *s = new Graphics::Surface;
-			s->create(640, 480, Graphics::PixelFormat(2, 5, 5, 5, 0, 10, 5, 0, 0));
-
-			draw(s);
-
-			// XXX: Update the screen
-			g_system->copyRectToScreen(s->getPixels(), s->pitch, 0, 0, s->w, s->h);
-
-			// Free the temporary surface
-			s->free();
-			delete s;
-
-			_changed = false;
-		}
-
-		g_system->updateScreen();
-
-		//FIXME: implement subtitles
-		g_system->delayMillis(20);
-
-		// Handle right-click to interrupt animations
-		Common::Event ev = Common::Event();
-		while (eventMan->pollEvent(ev)) {
-			if (ev.type == Common::EVENT_RBUTTONUP) {
-				// Stop audio
-				if (_audio)
-					_audio->finish();
-
-				// TODO start LNK file sound?
-				return;
-			}
-		}
-	}
-}
-
-} // End of namespace LastExpress
diff --git a/engines/lastexpress/data/animation.h b/engines/lastexpress/data/animation.h
deleted file mode 100644
index bf0962e5b96..00000000000
--- a/engines/lastexpress/data/animation.h
+++ /dev/null
@@ -1,119 +0,0 @@
-/* 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 3 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, see <http://www.gnu.org/licenses/>.
- *
- */
-
-#ifndef LASTEXPRESS_ANIMATION_H
-#define LASTEXPRESS_ANIMATION_H
-
-/*
-	Animation format (.NIS)
-
-	uint32 {4}    - Number of chunks
-
-	// for each chunk
-	    uint16 {2}    - Type
-	    uint16 {2}    - Tag
-	    uint32 {4}    - Size of chunk
-	    byte {x}      - Data (for "data" chunks: backgrounds, overlay & audio data)
-*/
-
-#include "lastexpress/drawable.h"
-
-#include "common/array.h"
-
-namespace Common {
-class SeekableReadStream;
-}
-
-namespace LastExpress {
-
-class AnimFrame;
-class AppendableSound;
-
-class Animation : public Drawable {
-public:
-	enum FlagType {
-		kFlagDefault = 16384,
-		kFlagProcess = 49152
-	};
-
-	Animation();
-	~Animation() override;
-
-	bool load(Common::SeekableReadStream *stream, int flag = kFlagDefault);
-	bool process();
-	bool hasEnded();
-	Common::Rect draw(Graphics::Surface *surface) override;
-	void play();
-
-private:
-	static const uint32 _soundBlockSize = 739;
-
-	// despite their size field, info chunks don't have a payload
-	enum ChunkType {
-		kChunkTypeNone              = 0,
-		kChunkTypeUnknown1          = 1,
-		kChunkTypeUnknown2          = 2,
-		kChunkTypeAudioInfo         = 3,
-		kChunkTypeUnknown4          = 4,
-		kChunkTypeUnknown5          = 5,
-		kChunkTypeBackground1       = 10,
-		kChunkTypeSelectBackground1 = 11,
-		kChunkTypeBackground2       = 12,
-		kChunkTypeSelectBackground2 = 13,
-		kChunkTypeOverlay           = 20,
-		kChunkTypeUpdate            = 21,
-		kChunkTypeUpdateTransition  = 22,
-		kChunkTypeSound1            = 30,
-		kChunkTypeSound2            = 31,
-		kChunkTypeAudioData         = 32,
-		kChunkTypeAudioEnd          = 99
-	};
-
-	struct Chunk {
-		ChunkType type;
-		uint16 frame;
-		uint32 size;
-
-		Chunk() {
-			type = kChunkTypeNone;
-			frame = 0;
-			size = 0;
-		}
-	};
-
-	void reset();
-	AnimFrame *processChunkFrame(Common::SeekableReadStream *in, const Chunk &c) const;
-	void processChunkAudio(Common::SeekableReadStream *in, const Chunk &c);
-
-	Common::SeekableReadStream *_stream;
-	Common::Array<Chunk> _chunks;
-	Common::Array<Chunk>::iterator _currentChunk;
-	AnimFrame *_overlay, *_background1, *_background2;
-	byte _backgroundCurrent;
-	AppendableSound *_audio;
-
-	uint32 _startTime;
-	bool _changed;
-};
-
-} // End of namespace LastExpress
-
-#endif // LASTEXPRESS_ANIMATION_H
diff --git a/engines/lastexpress/data/archive.cpp b/engines/lastexpress/data/archive.cpp
index 74877a2e75d..07f92786576 100644
--- a/engines/lastexpress/data/archive.cpp
+++ b/engines/lastexpress/data/archive.cpp
@@ -24,96 +24,13 @@
 
 #include "lastexpress/lastexpress.h"
 #include "lastexpress/data/archive.h"
-#include "lastexpress/debug.h"
 
 #include "common/debug.h"
 #include "common/file.h"
-#include "common/substream.h"
-#include "common/savefile.h"
+#include "common/memstream.h"
 
 namespace LastExpress {
 
-HPFArchive::HPFArchive(const Common::Path &path) {
-	_filename = path;
-
-	// Open a stream to the archive
-	Common::SeekableReadStream *archive = SearchMan.createReadStreamForMember(_filename);
-	if (!archive) {
-		debugC(2, kLastExpressDebugResource, "Error opening file: %s", path.toString(Common::Path::kNativeSeparator).c_str());
-		return;
-	}
-
-	debugC(2, kLastExpressDebugResource, "Opened archive: %s", path.toString(Common::Path::kNativeSeparator).c_str());
-
-	// Read header to get the number of files
-	uint32 numFiles = archive->readUint32LE();
-	debugC(3, kLastExpressDebugResource, "Number of files in archive: %d", numFiles);
-
-	// Read the list of files
-	for (unsigned int i = 0; i < numFiles; ++i) {
-		char name[13];
-		HPFEntry entry;
-
-		archive->read(&name, sizeof(char) * _archiveNameSize);
-		entry.offset = archive->readUint32LE();
-		entry.size = archive->readUint32LE();
-		entry.isOnHD = archive->readUint16LE();
-
-		// Terminate string
-		name[12] = '\0';
-
-		Common::String filename(name);
-		filename.toLowercase();
-
-		_files[filename] = entry;
-
-		//debugC(9, kLastExpressDebugResource, "File entry: %s (offset:%d - Size: %d - HD: %u)", &eraseData, entry.offset, entry.size, entry.isOnHD);
-	}
-
-	// Close stream
-	delete archive;
-}
-
-bool HPFArchive::hasFile(const Common::Path &path) const {
-	Common::String name = path.toString();
-	return (_files.find(name) != _files.end());
-}
-
-int HPFArchive::listMembers(Common::ArchiveMemberList &list) const {
-	int numMembers = 0;
-
-	for (FileMap::const_iterator i = _files.begin(); i != _files.end(); ++i) {
-		list.push_back(Common::ArchiveMemberList::value_type(new Common::GenericArchiveMember(i->_key, *this)));
-		numMembers++;
-	}
-
-	return numMembers;
-}
-
-const Common::ArchiveMemberPtr HPFArchive::getMember(const Common::Path &path) const {
-	if (!hasFile(path))
-		return Common::ArchiveMemberPtr();
-
-	return Common::ArchiveMemberPtr(new Common::GenericArchiveMember(path, *this));
-}
-
-Common::SeekableReadStream *HPFArchive::createReadStreamForMember(const Common::Path &path) const {
-	Common::String name = path.toString();
-	FileMap::const_iterator fDesc = _files.find(name);
-	if (fDesc == _files.end())
-		return nullptr;
-
-	Common::File *archive = new Common::File();
-	if (!archive->open(_filename)) {
-		delete archive;
-		return nullptr;
-	}
-
-	return new Common::SeekableSubReadStream(archive, fDesc->_value.offset * _archiveSectorSize, fDesc->_value.offset * _archiveSectorSize + fDesc->_value.size * _archiveSectorSize, DisposeAfterUse::YES);
-}
-
-// NEW ARCHIVE
-
 ArchiveManager::ArchiveManager(LastExpressEngine *engine) {
 	_engine = engine;
 
diff --git a/engines/lastexpress/data/archive.h b/engines/lastexpress/data/archive.h
index d7d2b49fb95..1e727f97320 100644
--- a/engines/lastexpress/data/archive.h
+++ b/engines/lastexpress/data/archive.h
@@ -22,58 +22,11 @@
 #ifndef LASTEXPRESS_HPF_H
 #define LASTEXPRESS_HPF_H
 
-/*
-	HPF Archive Format
-
-	* uint32 {4}   Number of files
-
-	For each file:
-		* char {12}    Name (zero-terminated)
-		* uint32 {4}   Offset (expressed in sectors of 2048 bytes)
-		* uint16 {2}   Size (expressed in sectors of 2048 bytes)
-		* uint16 {2}   Current position (expressed in sectors of 2048 bytes)
-		* uint16 {2}   File status flags:
-					   - Bit 0: "Is on CD"
-					   - Bit 1: "Is loaded"
-*/
-
-#include "common/archive.h"
-#include "common/hash-str.h"
-#include "common/hashmap.h"
-#include "common/str.h"
-#include "common/file.h"
-
 #include "lastexpress/lastexpress.h"
 
-namespace LastExpress {
-
-class HPFArchive : public Common::Archive {
-public:
-	HPFArchive(const Common::Path &path);
-
-	bool hasFile(const Common::Path &path) const override;
-	int listMembers(Common::ArchiveMemberList &list) const override;
-	const Common::ArchiveMemberPtr getMember(const Common::Path &path) const override;
-	Common::SeekableReadStream *createReadStreamForMember(const Common::Path &path) const override;
-
-	int count() { return _files.size(); }
-
-private:
-	static const unsigned int _archiveNameSize = 12;
-	static const unsigned int _archiveSectorSize = 2048;
-
-	// File entry
-	struct HPFEntry {
-		uint32 offset;          ///< Offset (in sectors of 2048 bytes)
-		uint32 size;            ///< Size (in sectors of 2048 bytes)
-		uint16 isOnHD;          ///< File location (1: on HD; 0: on CD)
-	};
-
-	typedef Common::HashMap<Common::String, HPFEntry, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo> FileMap;
+#include "common/file.h"
 
-	FileMap _files;             ///< List of files
-	Common::Path _filename;   ///< Filename of the archive
-};
+namespace LastExpress {
 
 struct Seq;
 
diff --git a/engines/lastexpress/data/background.cpp b/engines/lastexpress/data/background.cpp
deleted file mode 100644
index 823168a2812..00000000000
--- a/engines/lastexpress/data/background.cpp
+++ /dev/null
@@ -1,140 +0,0 @@
-/* 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 3 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, see <http://www.gnu.org/licenses/>.
- *
- */
-
-// Based on Deniz Oezmen's code and Xentax Wiki documentation
-// http://oezmen.eu/
-// http://wiki.xentax.com/index.php/The_Last_Express_BG
-
-#include "lastexpress/data/background.h"
-
-#include "lastexpress/debug.h"
-
-#include "common/rect.h"
-#include "common/stream.h"
-
-namespace LastExpress {
-
-Background::Background() : _data(nullptr) {
-	memset(&_header, 0, sizeof(BackgroundHeader));
-}
-
-Background::~Background() {
-	delete[] _data;
-}
-
-bool Background::load(Common::SeekableReadStream *stream) {
-	if (!stream)
-		return false;
-
-	// Reset data
-	delete[] _data;
-
-	// Load Background header
-	_header.posX = stream->readUint32LE();
-	_header.posY = stream->readUint32LE();
-	_header.width = stream->readUint32LE();
-	_header.height = stream->readUint32LE();
-	_header.redSize = stream->readUint32LE();
-	_header.blueSize = stream->readUint32LE();
-	_header.greenSize = stream->readUint32LE();
-
-	debugC(3, kLastExpressDebugGraphics, "Background Info: (%d, %d) - (%d x %d) - (%d, %d, %d)",
-	                                    _header.posX, _header.posY, _header.width, _header.height,
-	                                    _header.redSize, _header.blueSize, _header.greenSize);
-
-	// Load and decompress Background channel data
-	uint32 numPix = _header.width * _header.height;
-	byte *dataR = decodeComponent(stream, _header.redSize, numPix);
-	byte *dataB = decodeComponent(stream, _header.blueSize, numPix);
-	byte *dataG = decodeComponent(stream, _header.greenSize, numPix);
-
-	// Save to pixel buffer
-	// FIXME handle big-endian case
-	_data = new uint16[_header.width * _header.height];
-	for (uint i = 0; i < _header.width * _header.height; i++)
-		_data[i] = (uint16)((dataR[i] << 10) + (dataG[i] << 5) + dataB[i]);
-
-	// Cleanup buffers
-	delete[] dataR;
-	delete[] dataG;
-	delete[] dataB;
-
-	delete stream;
-
-	return true;
-}
-
-Common::Rect Background::draw(Graphics::Surface *surface) {
-	if (!_data) {
-		debugC(2, kLastExpressDebugGraphics, "Trying to show a background before loading data");
-		return Common::Rect();
-	}
-
-	int i = 0;
-	for (uint16 y = 0; y < _header.height; y++) {
-		for (uint16 x = 0; x < _header.width; x++) {
-			surface->fillRect(Common::Rect((int16)(_header.posX + x), (int16)(_header.posY + y), (int16)(_header.posX + x + 1), (int16)(_header.posY + y + 1)), _data[i]);
-			i ++;
-		}
-	}
-
-	return Common::Rect((int16)_header.posX, (int16)_header.posY, (int16)(_header.posX + _header.width), (int16)(_header.posY + _header.height));
-}
-
-byte *Background::decodeComponent(Common::SeekableReadStream *in, uint32 inSize, uint32 outSize) const {
-	// Create the destination array
-	byte *out = new byte[outSize]();
-	if (!out)
-		return nullptr;
-
-	// Initialize the decoding
-	uint32 inPos = 0;
-	uint32 outPos = 0;
-
-	// Decode
-	while (inPos < inSize) {
-		byte inByte = in->readByte();
-		inPos++;
-
-		if (inByte < 0x80) {
-			// Direct decompression (RLE)
-			byte len = (inByte >> 5) + 1;
-			byte data = inByte & 0x1f;
-			for (int i = 0; i < len && outPos < outSize; i++)
-				out[outPos++] = data;
-		} else {
-			// Buffer back reference, 4096 byte window
-			// Take inByte and the following value as a big endian
-			// OfsLen while zeroing the first bit
-			uint16 ofsLen = ((inByte & 0x7F) << 8) | in->readByte();
-			inPos++;
-
-			int32 len = (ofsLen >> 12) + 3;
-			int32 hisPos = (int32)(outPos + (ofsLen & 0x0FFF) - 4096);
-			for (int i = 0; i < len && outPos < outSize; i++)
-				out[outPos++] = out[hisPos++];
-		}
-	}
-
-	return out;
-}
-
-} // End of namespace LastExpress
diff --git a/engines/lastexpress/data/background.h b/engines/lastexpress/data/background.h
deleted file mode 100644
index e87ee911c9c..00000000000
--- a/engines/lastexpress/data/background.h
+++ /dev/null
@@ -1,79 +0,0 @@
-/* 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 3 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, see <http://www.gnu.org/licenses/>.
- *
- */
-
-#ifndef LASTEXPRESS_BACKGROUND_H
-#define LASTEXPRESS_BACKGROUND_H
-
-/*
-	Background file format (.BG)
-
-	header:
-	    uint32 {4}   - position X on screen
-	    uint32 {4}   - position Y on screen
-	    uint32 {4}   - image width
-	    uint32 {4}   - image height
-	    uint32 {4}   - red color channel data size
-	    uint32 {4}   - blue color channel data size
-	    uint32 {4}   - green color channel data size
-
-	data:
-	    byte {x}     - red color channel data
-	    byte {x}     - blue color channel data
-	    byte {x}     - green color channel data
-*/
-
-#include "lastexpress/drawable.h"
-
-namespace Common {
-class SeekableReadStream;
-}
-
-namespace LastExpress {
-
-class Background : public Drawable {
-public:
-	Background();
-	~Background() override;
-
-	bool load(Common::SeekableReadStream *stream);
-
-	Common::Rect draw(Graphics::Surface *surface) override;
-
-private:
-	struct BackgroundHeader {
-		uint32 posX;       ///< position X on screen
-		uint32 posY;       ///< position Y on screen
-		uint32 width;      ///< image width
-		uint32 height;     ///< image height
-		uint32 redSize;    ///< red color channel data size
-		uint32 blueSize;   ///< blue color channel data size
-		uint32 greenSize;  ///< green color channel data size
-	};
-
-	BackgroundHeader _header;
-	uint16 *_data;         ///< decoded background data
-
-	byte *decodeComponent(Common::SeekableReadStream *in, uint32 inSize, uint32 outSize) const;
-};
-
-} // End of namespace LastExpress
-
-#endif // LASTEXPRESS_BACKGROUND_H
diff --git a/engines/lastexpress/data/cursor.cpp b/engines/lastexpress/data/cursor.cpp
deleted file mode 100644
index 4a5ad671d6d..00000000000
--- a/engines/lastexpress/data/cursor.cpp
+++ /dev/null
@@ -1,144 +0,0 @@
-/* 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 3 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, see <http://www.gnu.org/licenses/>.
- *
- */
-
-#include "lastexpress/data/cursor.h"
-
-#include "lastexpress/lastexpress.h"
-
-#include "common/stream.h"
-#include "common/system.h"
-#include "graphics/cursorman.h"
-
-namespace LastExpress {
-
-uint16 brigthnessData[4] = { 0, 0x7BDE, 0x739C, 0x6318 };
-
-Cursor::Cursor() : _current(kCursorMAX) {
-	memset(&_cursors, 0, sizeof(_cursors));
-}
-
-bool Cursor::load(Common::SeekableReadStream *stream) {
-	if (!stream)
-		return false;
-
-	// Load the whole file to memory
-	Common::SeekableReadStream *data = stream->readStream((uint32) stream->size());
-	delete stream;
-	if (!data)
-		return false;
-
-	// Read the hotspot data
-	for (int i = 0; i < kCursorMAX; i++) {
-		_cursors[i].hotspotX = data->readUint16LE();
-		_cursors[i].hotspotY = data->readUint16LE();
-		debugC(15, kLastExpressDebugCursor,
-			"Cursor %d hotspot x: %d, hotspot y: %d",
-			i, _cursors[i].hotspotX, _cursors[i].hotspotY);
-	}
-
-	// Read the pixel data
-	for (int i = 0; i < kCursorMAX; i++)
-		for (int pix = 0; pix < 32 * 32; pix++)
-			_cursors[i].image[pix] = data->readUint16LE();
-
-	delete data;
-	return true;
-}
-
-void Cursor::show(bool visible) const {
-	CursorMan.showMouse(visible);
-}
-
-bool Cursor::checkStyle(CursorStyle style) const {
-	if (style >= kCursorMAX) {
-		debugC(2, kLastExpressDebugGraphics, "Trying to use an invalid cursor style: was %d, max %d", (int)style, kCursorMAX);
-		return false;
-	}
-
-	return true;
-}
-
-void Cursor::setStyle(CursorStyle style) {
-	if (!checkStyle(style))
-		return;
-
-	if (style == _current)
-		return;
-
-	debugC(10, kLastExpressDebugCursor, "Cursor: setting style: %d", style);
-
-	// Save the new cursor
-	_current = style;
-
-	// Reuse the screen pixel format
-	Graphics::PixelFormat pf = g_system->getScreenFormat();
-	CursorMan.replaceCursor(getCursorImage(style),
-	                        32, 32, _cursors[style].hotspotX, _cursors[style].hotspotY,
-	                        0, false, &pf);
-}
-
-const uint16 *Cursor::getCursorImage(CursorStyle style) const {
-	if (!checkStyle(style))
-		return nullptr;
-
-	return _cursors[style].image;
-}
-
-
-Icon::Icon(CursorStyle style) : _style(style), _x(0), _y(0), _brightnessIndex(-1) {}
-
-void Icon::setPosition(int16 x, int16 y) {
-	_x = x;
-	_y = y;
-}
-
-void Icon::setBrightness(int16 brightnessIndex) {
-	assert(brightnessIndex < ARRAYSIZE(brigthnessData));
-
-	_brightnessIndex = brightnessIndex;
-}
-
-Common::Rect Icon::draw(Graphics::Surface *surface) {
-	const uint16 *image = ((LastExpressEngine *)g_engine)->getCursor()->getCursorImage((CursorStyle)_style);
-	if (!image)
-		return Common::Rect();
-
-	// TODO adjust brightness. The original game seems to be using a table for that (at least in the highlighting case)
-	for (int j = 0; j < 32; j++) {
-		uint16 *s = (uint16 *)surface->getBasePtr(_x, _y + j);
-		for (int i = 0; i < 32; i++) {
-
-			// Adjust brightness
-			if (_brightnessIndex == -1 || _brightnessIndex >= ARRAYSIZE(brigthnessData))
-				*s = *image;
-			else
-				*s = (*image & brigthnessData[_brightnessIndex]) >> _brightnessIndex;
-
-			// Update the image and surface pointers
-			image++;
-			s++;
-		}
-	}
-
-	return Common::Rect(_x, _y, _x + 32, _y + 32);
-}
-
-} // End of namespace LastExpress
diff --git a/engines/lastexpress/data/cursor.h b/engines/lastexpress/data/cursor.h
deleted file mode 100644
index b55f20d4ffc..00000000000
--- a/engines/lastexpress/data/cursor.h
+++ /dev/null
@@ -1,91 +0,0 @@
-/* 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 3 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, see <http://www.gnu.org/licenses/>.
- *
- */
-
-#ifndef LASTEXPRESS_CURSOR_H
-#define LASTEXPRESS_CURSOR_H
-
-/*
-	Cursor format (CURSORS.TBM)
-
-	style table:
-	    (for each cursor)
-	    uint16 {2}       - hotspot X
-	    uint16 {2}       - hotspot Y
-
-	data:
-	    (for each cursor)
-	    uint16 {32*32}   - cursor data
-*/
-
-#include "lastexpress/drawable.h"
-
-#include "lastexpress/shared.h"
-
-namespace Common {
-class SeekableReadStream;
-}
-
-namespace LastExpress {
-
-class Icon : public Drawable {
-public:
-	Icon(CursorStyle style);
-
-	void setPosition(int16 x, int16 y);
-	void setBrightness(int16 brightnessIndex);
-	Common::Rect draw(Graphics::Surface *surface) override;
-
-private:
-	CursorStyle _style;
-	int16 _x, _y;
-	int16 _brightnessIndex;
-};
-
-class Cursor {
-public:
-	Cursor();
-
-	bool load(Common::SeekableReadStream *stream);
-	void show(bool visible) const;
-
-	void setStyle(CursorStyle style);
-	CursorStyle getStyle() const { return _current; }
-
-private:
-	// Style
-	CursorStyle _current;
-
-	// Cursors data
-	struct {
-		uint16 image[32 * 32];
-		uint16 hotspotX, hotspotY;
-	} _cursors[kCursorMAX];
-
-	bool checkStyle(CursorStyle style) const;
-	const uint16 *getCursorImage(CursorStyle style) const;
-
-	// Only allow full access for drawing (needed for getCursorImage)
-	friend Common::Rect Icon::draw(Graphics::Surface *surface);
-};
-
-} // End of namespace LastExpress
-
-#endif // LASTEXPRESS_CURSOR_H
diff --git a/engines/lastexpress/data/cvcrfile.cpp b/engines/lastexpress/data/cvcrfile.cpp
index b38fad51bbe..3682ac69068 100644
--- a/engines/lastexpress/data/cvcrfile.cpp
+++ b/engines/lastexpress/data/cvcrfile.cpp
@@ -24,7 +24,9 @@
 
 #include "common/file.h"
 #include "common/memstream.h"
+#include "common/savefile.h"
 #include "common/stream.h"
+
 #include "engines/metaengine.h"
 
 namespace LastExpress {
diff --git a/engines/lastexpress/data/font.cpp b/engines/lastexpress/data/font.cpp
deleted file mode 100644
index 9c8a6344671..00000000000
--- a/engines/lastexpress/data/font.cpp
+++ /dev/null
@@ -1,204 +0,0 @@
-/* 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 3 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, see <http://www.gnu.org/licenses/>.
- *
- */
-
-#include "lastexpress/data/font.h"
-
-#include "common/rect.h"
-#include "common/stream.h"
-#include "common/system.h"
-#include "common/textconsole.h"
-
-namespace LastExpress {
-
-Font::Font() : _numGlyphs(0), _glyphs(nullptr), _glyphWidths(nullptr) {
-	memset(&_palette, 0, sizeof(_palette));
-	memset(&_charMap, 0, sizeof(_charMap));
-}
-
-Font::~Font() {
-	reset();
-}
-
-void Font::reset() {
-	delete[] _glyphs;
-	delete[] _glyphWidths;
-}
-
-bool Font::load(Common::SeekableReadStream *stream) {
-	if (!stream)
-		return false;
-
-	// Reset data
-	reset();
-
-	// Read the palette
-	for (uint i = 0; i < _paletteSize; i++) {
-		_palette[i] = stream->readUint16LE();
-	}
-
-	// Read the character map
-	stream->read(_charMap, _charMapSize);
-
-	// Read the glyphs
-	_numGlyphs = stream->readUint16LE();
-	_glyphs = new byte[_numGlyphs * 18 * 8];
-	stream->read(_glyphs, _numGlyphs * 18 * 8);
-
-	// TODO: Read something else?
-	//uint16 unknown = fontFile->readByte();
-	//warning("unknown = %d", unknown);
-	//warning("pos = %d", fontFile->pos());
-	//warning("left = %d", fontFile->size() - fontFile->pos());
-
-	//while (!fontFile->eos()) {
-	//unknown = fontFile->readByte();
-	//warning("val = %d", unknown);
-	//}
-
-	// Precalculate glyph widths
-	_glyphWidths = new byte[_numGlyphs];
-	for (uint16 i = 0; i < _numGlyphs; i++) {
-		_glyphWidths[i] = getGlyphWidth(i);
-	}
-
-	delete stream;
-
-	return true;
-}
-
-
-uint16 Font::getCharGlyph(uint16 c) const {
-	//warning("%c", c);
-	if (c >= 0x200)
-		error("[Font::getCharGlyph] Invalid character %d", c);
-
-	return _charMap[c];
-}
-
-byte *Font::getGlyphImg(uint16 g) {
-	if (!_glyphs)
-		error("[Font::getGlyphImg] Invalid glyphs");
-
-	if (g >= _numGlyphs)
-		error("[Font::getGlyphImg] Invalid glyph %d (%d available)", g, _numGlyphs);
-
-	return _glyphs + g * 18 * 8;
-}
-
-uint8 Font::getGlyphWidth(uint16 g) {
-	byte *p = getGlyphImg(g);
-
-	uint8 maxLineWidth = 0;
-	for (int j = 0; j < 18; j++) {
-		uint8 currentLineWidth = 0;
-		for (uint8 i = 0; i < 16; i++) {
-			byte index;
-			if (i % 2)
-				index = *p & 0xf;
-			else
-				index = *p >> 4;
-			uint16 color = _palette[index];
-			if (color != 0x1f)
-				currentLineWidth = i;
-			if (i % 2)
-				p++;
-		}
-		if (currentLineWidth > maxLineWidth)
-			maxLineWidth = currentLineWidth;
-	}
-
-	return maxLineWidth;
-}
-
-byte *Font::getCharImg(uint16 c) {
-	return getGlyphImg(getCharGlyph(c));
-}
-
-uint8 Font::getCharWidth(uint16 c) const{
-	if (c == 0x20) {
-		// Space is a special case
-		// TODO: this is an arbitrary value
-		return 10;
-	} else {
-		if (!_glyphWidths)
-			error("[Font::getCharWidth] Invalid glyphs widths");
-
-		return _glyphWidths[getCharGlyph(c)];
-	}
-}
-
-uint16 Font::getStringWidth(Common::String str) const {
-	uint16 width = 0;
-	for (uint i = 0; i < str.size(); i++)
-		width += getCharWidth((unsigned char)str[i]);
-
-	return width;
-}
-
-uint16 Font::getStringWidth(const uint16 *str, uint16 length) const {
-	uint16 width = 0;
-	for (uint i = 0; i < length; i++)
-		width += getCharWidth(str[i]);
-
-	return width;
-}
-
-void Font::drawChar(Graphics::Surface *surface, int16 x, int16 y, uint16 c) {
-	byte *p = getCharImg(c);
-
-	for (int16 j = 0; j < 18; j++) {
-		for (int16 i = 0; i < 16; i++) {
-			byte index;
-			if (i % 2)
-				index = *p & 0xf;
-			else
-				index = *p >> 4;
-			uint16 color = _palette[index];
-			if (color != 0x1f) {
-				surface->fillRect(Common::Rect(x+i, y+j, x+i+1, y+j+1), color);
-			}
-			if (i % 2)
-				p++;
-		}
-	}
-}
-
-Common::Rect Font::drawString(Graphics::Surface *surface, int16 x, int16 y, Common::String str) {
-	int16 currentX = x;
-	for (uint i = 0; i < str.size(); i++) {
-		drawChar(surface, currentX, y, (unsigned char)str[i]);
-		currentX += getCharWidth((unsigned char)str[i]);
-	}
-
-	return Common::Rect(x, y, x + currentX, y + (int16)_charHeight);
-}
-
-Common::Rect Font::drawString(Graphics::Surface *surface, int16 x, int16 y, const uint16 *str, uint16 length) {
-	int16 currentX = x;
-	for (uint i = 0; i < length; i++) {
-		drawChar(surface, currentX, y, str[i]);
-		currentX += getCharWidth(str[i]);
-	}
-
-	return Common::Rect(x, y, x + currentX, y + (int16)_charHeight);
-}
-
-} // End of namespace LastExpress
diff --git a/engines/lastexpress/data/font.h b/engines/lastexpress/data/font.h
deleted file mode 100644
index 16cbcc21349..00000000000
--- a/engines/lastexpress/data/font.h
+++ /dev/null
@@ -1,83 +0,0 @@
-/* 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 3 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, see <http://www.gnu.org/licenses/>.
- *
- */
-
-#ifndef LASTEXPRESS_FONT_H
-#define LASTEXPRESS_FONT_H
-
-/*
-	Font format (FONT.DAT)
-
-	uint16 {40}   - Palette data
-	byte {200}    - Character map
-	uint16 {2}    - Number of glyphs
-
-	// For each glyph
-	    byte {18*8}   - Glyph data
-
-	byte {x}      - Unknown data (probably just garbage)
-*/
-
-#include "common/str.h"
-#include "graphics/surface.h"
-
-namespace Common {
-class SeekableReadStream;
-struct Rect;
-}
-
-namespace LastExpress {
-
-class Font {
-public:
-	Font();
-	~Font();
-
-	bool load(Common::SeekableReadStream *stream);
-	Common::Rect drawString(Graphics::Surface *surface, int16 x, int16 y, Common::String str);
-	Common::Rect drawString(Graphics::Surface *surface, int16 x, int16 y, const uint16 *str, uint16 length);
-
-private:
-	static const uint32 _paletteSize = 0x10;
-	static const uint32 _charMapSize = 0x200;
-	static const uint32 _charHeight = 16;
-
-	void reset();
-
-	uint16 getCharGlyph(uint16 c) const;
-	byte *getGlyphImg(uint16 g);
-	uint8 getGlyphWidth(uint16 g);
-	byte *getCharImg(uint16 c);
-	uint8 getCharWidth(uint16 c) const;
-	uint16 getStringWidth(Common::String str) const;
-	uint16 getStringWidth(const uint16 *str, uint16 length) const;
-	void drawChar(Graphics::Surface *surface, int16 x, int16 y, uint16 c);
-
-	// Font data
-	uint16 _palette[_paletteSize];
-	uint8 _charMap[_charMapSize];
-	uint16 _numGlyphs;
-	byte *_glyphs;
-	uint8 *_glyphWidths;
-};
-
-} // End of namespace LastExpress
-
-#endif // LASTEXPRESS_FONT_H
diff --git a/engines/lastexpress/data/scene.cpp b/engines/lastexpress/data/scene.cpp
deleted file mode 100644
index 1d18f8657fb..00000000000
--- a/engines/lastexpress/data/scene.cpp
+++ /dev/null
@@ -1,298 +0,0 @@
-/* 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 3 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, see <http://www.gnu.org/licenses/>.
- *
- */
-
-#include "lastexpress/data/scene.h"
-
-#include "lastexpress/data/background.h"
-
-#include "lastexpress/helpers.h"
-#include "lastexpress/lastexpress.h"
-#include "lastexpress/resource.h"
-
-#include "common/stream.h"
-
-namespace LastExpress {
-
-SceneHotspot::~SceneHotspot() {
-	for (uint i = 0; i < _coords.size(); i++)
-		SAFE_DELETE(_coords[i]);
-
-	_coords.clear();
-}
-
-SceneHotspot *SceneHotspot::load(Common::SeekableReadStream *stream) {
-	SceneHotspot *hs = new SceneHotspot();
-
-	// Rect
-	hs->rect.left = (int16)stream->readUint16LE();
-	hs->rect.right = (int16)stream->readUint16LE();
-	hs->rect.top = (int16)stream->readUint16LE();
-	hs->rect.bottom = (int16)stream->readUint16LE();
-
-	hs->coordsOffset = stream->readUint32LE();
-	hs->scene = (SceneIndex)stream->readUint16LE();
-	hs->location = stream->readByte();
-	hs->action = (Action)stream->readByte();
-	hs->param1 = stream->readByte();
-	hs->param2 = stream->readByte();
-	hs->param3 = stream->readByte();
-	hs->cursor = stream->readByte();
-	hs->next = stream->readUint32LE();
-
-	debugC(10, kLastExpressDebugScenes, "\thotspot: scene=%d location=%02d action=%d param1=%02d param2=%02d param3=%02d cursor=%02d rect=(%d, %d)x(%d, %d)",
-	                                   hs->scene, hs->location, hs->action, hs->param1, hs->param2, hs->param3, hs->cursor, hs->rect.left, hs->rect.top, hs->rect.right, hs->rect.bottom);
-	debugC(10, kLastExpressDebugScenes, "\t         coords=%d next=%d ", hs->coordsOffset, hs->next);
-
-	// Read all coords data
-	uint32 offset = hs->coordsOffset;
-	while (offset != 0) {
-
-		SceneCoord *sceneCoord = new SceneCoord;
-
-		stream->seek(offset, SEEK_SET);
-
-		sceneCoord->field_0 = stream->readSint32LE();
-		sceneCoord->field_4 = stream->readSint32LE();
-		sceneCoord->field_8 = stream->readByte();
-		sceneCoord->next = stream->readUint32LE();
-
-		hs->_coords.push_back(sceneCoord);
-
-		offset = sceneCoord->next;
-	}
-
-	return hs;
-}
-
-Common::String SceneHotspot::toString() const {
-	Common::String output = "";
-
-	output += Common::String::format("    hotspot: scene=%d location=%02d action=%d param1=%02d param2=%02d param3=%02d cursor=%02d rect=(%d, %d)x(%d, %d)",
-	                                   scene, location, action, param1, param2, param3, cursor, rect.left, rect.top, rect.right, rect.bottom);
-
-	return output;
-}
-
-bool SceneHotspot::isInside(const Common::Point &point) {
-
-	bool contains = rect.contains(point);
-
-	if (_coords.empty() || !contains)
-		return contains;
-
-	// Checks extended coordinates
-	for (uint i = 0; i < _coords.size(); i++) {
-
-		SceneCoord *sCoord = _coords[i];
-
-		bool cont;
-		if (sCoord->field_8)
-			cont = (sCoord->field_4 + point.x * sCoord->field_0 + 1000 * point.y) >= 0;
-		else
-			cont = (sCoord->field_4 + point.x * sCoord->field_0 + 1000 * point.y) <= 0;
-
-		if (!cont)
-			return false;
-	}
-
-	return true;
-}
-
-//////////////////////////////////////////////////////////////////////////
-// Scene
-Scene::~Scene() {
-	// Free the hotspots
-	for (uint i = 0; i < _hotspots.size(); i++)
-		delete _hotspots[i];
-}
-
-Scene *Scene::load(Common::SeekableReadStream *stream) {
-	Scene *scene = new Scene();
-
-	stream->read(&scene->_name, sizeof(scene->_name));
-	scene->_sig = stream->readByte();
-	scene->entityPosition = (EntityPosition)stream->readUint16LE();
-	scene->location = (Location)stream->readUint16LE();
-	scene->car = (CarIndex)stream->readUint16LE();
-	scene->position = stream->readByte();
-	scene->type = (Type)stream->readByte();
-	scene->param1 = stream->readByte();
-	scene->param2 = stream->readByte();
-	scene->param3 = stream->readByte();
-	scene->_hotspot = stream->readUint32LE();
-
-	return scene;
-}
-
-void Scene::loadHotspots(Common::SeekableReadStream *stream) {
-	if (!_hotspots.empty())
-		return;
-
-	debugC(10, kLastExpressDebugScenes, "Scene:  name=%s, sig=%02d, entityPosition=%d, location=%d", _name, _sig, entityPosition, location);
-	debugC(10, kLastExpressDebugScenes, "\tcar=%02d, position=%02d, type=%02d, param1=%02d", car, position, type, param1);
-	debugC(10, kLastExpressDebugScenes, "\tparam2=%02d, param3=%02d, hotspot=%d\n", param2, param3, _hotspot);
-
-	// Read all hotspots
-	if (_hotspot != 0) {
-		stream->seek((int32)_hotspot, SEEK_SET);
-		SceneHotspot *hotspot = SceneHotspot::load(stream);
-		while (hotspot) {
-			_hotspots.push_back(hotspot);
-
-			if (hotspot->next == 0)
-				break;
-
-			stream->seek((int32)hotspot->next, SEEK_SET);
-			hotspot = SceneHotspot::load(stream);
-		}
-	}
-}
-
-bool Scene::checkHotSpot(const Common::Point &coord, SceneHotspot **hotspot) {
-	bool found = false;
-	int _location = 0;
-
-	for (uint i = 0; i < _hotspots.size(); i++) {
-		if (_hotspots[i]->isInside(coord)) {
-			if (_location <= _hotspots[i]->location) {
-				_location = _hotspots[i]->location;
-				*hotspot = _hotspots[i];
-				found = true;
-			}
-		}
-	}
-
-	return found;
-}
-
-SceneHotspot *Scene::getHotspot(uint index) {
-	if (_hotspots.empty())
-		error("[Scene::getHotspot] Scene does not have any hotspots");
-
-	if (index >= _hotspots.size())
-		error("[Scene::getHotspot] Invalid index (was: %d, max: %d)", index, _hotspots.size() - 1);
-
-	return _hotspots[index];
-}
-
-Common::Rect Scene::draw(Graphics::Surface *surface) {
-	// Safety checks
-	Common::Rect rect;
-
-	Common::String sceneName(_name);
-	sceneName.trim();
-	if (sceneName.empty())
-		error("[Scene::draw] This scene is not a valid drawing scene");
-
-	// Load background
-	Background *background = ((LastExpressEngine *)g_engine)->getResourceManager()->loadBackground(sceneName);
-	if (background) {
-		rect = background->draw(surface);
-		delete background;
-	}
-
-	return rect;
-}
-
-Common::String Scene::toString() {
-	Common::String output = "";
-
-	output += Common::String::format("Scene:  name=%s, sig=%02d, entityPosition=%d, location=%d\n", _name, _sig, entityPosition, location);
-	output += Common::String::format("        car=%02d, position=%02d, type=%02d, param1=%02d\n", car, position, type, param1);
-	output += Common::String::format("        param2=%02d, param3=%02d, hotspot=%d\n", param2, param3, _hotspot);
-
-	// Hotspots
-	if (_hotspots.size() != 0) {
-		output += "\nHotspots:\n";
-		for (uint i = 0; i < _hotspots.size(); i++)
-			output += _hotspots[i]->toString() + "\n";
-	}
-
-	return output;
-}
-
-//////////////////////////////////////////////////////////////////////////
-// SceneLoader
-SceneLoader::SceneLoader() : _stream(nullptr) {}
-
-SceneLoader::~SceneLoader() {
-	clear();
-}
-
-void SceneLoader::clear() {
-	// Remove all scenes
-	for (uint i = 0; i < _scenes.size(); i++)
-		delete _scenes[i];
-
-	_scenes.clear();
-
-	delete _stream;
-}
-
-bool SceneLoader::load(Common::SeekableReadStream *stream) {
-	if (!stream)
-		return false;
-
-	clear();
-
-	_stream = stream;
-
-	// Read the default scene to get the total number of scenes
-	Scene *header = Scene::load(_stream);
-	if (!header)
-		error("[SceneLoader::load] Invalid data file");
-
-	debugC(2, kLastExpressDebugScenes, "   found %d entries", header->entityPosition); /* Header entityPosition is the scene count */
-
-	if (header->entityPosition > 2500) {
-		delete header;
-
-		return false;
-	}
-
-	_scenes.push_back(header);
-
-	// Read all the chunks
-	for (uint i = 0; i < (uint)header->entityPosition; ++i) {
-		Scene *scene = Scene::load(_stream);
-		if (!scene)
-			break;
-
-		_scenes.push_back(scene);
-	}
-
-	return true;
-}
-
-Scene *SceneLoader::get(SceneIndex index) {
-	if (_scenes.empty())
-		return nullptr;
-
-	if (index > _scenes.size())
-		return nullptr;
-
-	// Load the hotspots if needed
-	_scenes[(uint)index]->loadHotspots(_stream);
-
-	return _scenes[(uint)index];
-}
-
-} // End of namespace LastExpress
diff --git a/engines/lastexpress/data/scene.h b/engines/lastexpress/data/scene.h
deleted file mode 100644
index b0dfbf21a98..00000000000
--- a/engines/lastexpress/data/scene.h
+++ /dev/null
@@ -1,259 +0,0 @@
-/* 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 3 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, see <http://www.gnu.org/licenses/>.
- *
- */
-
-#ifndef LASTEXPRESS_SCENE_H
-#define LASTEXPRESS_SCENE_H
-
-/*
-	Scene format (CDTRAIN.DAT)
-
-	(text:00484750)
-	header (24 bytes)
-	    char {8}    - entry eraseData (null terminated)
-	    byte {1}    - 0xCD
-	    uint16 {2}  - number of scenes (for first entry - always 0 after?)
-	    uint16 {2}  - 11 ??
-	    uint16 {2}  - car
-	    byte {1}    - camera position (used to get the proper sequences to show)
-	    byte {1}    - type
-	    byte {1}    - param1
-	    byte {1}    - param2
-	    byte {1}    - param3
-	    uint32 {4}  - Offset to hotspot info struct
-
-	    probably contains cursor type too / scene index : 0 - 2500 (max)
-
-	hotspot info (24 bytes)
-	    uint16 {2}  - left
-	    uint16 {2}  - right
-	    uint16 {2}  - top
-	    uint16 {2}  - bottom
-	    uint32 {4}  - scene coords data
-	    uint16 {2}  - scene
-	    byte {1}    - location;
-	    byte {1}    - action;
-	    byte {1}    - param1;
-	    byte {1}    - param2;
-	    byte {1}    - param3
-	    byte {1}    - cursor
-	    uint32{4}   - offset to next hotpost
-
-	coords data (9 bytes)
-	    uint32 {4}    - ??
-	    uint32 {4}    - ??
-	    byte {1}       - ??
-	   uint32 {4}     - offset to next coords data structure
-
-*/
-
-#include "lastexpress/drawable.h"
-#include "lastexpress/shared.h"
-
-#include "common/array.h"
-#include "common/rect.h"
-
-namespace Common {
-class SeekableReadStream;
-class String;
-}
-
-namespace LastExpress {
-
-class Scene;
-
-class SceneHotspot {
-public:
-	enum Action {
-		kActionNoneHS = 0,
-		kActionInventory = 1,
-		kActionSavePoint = 2,
-		kActionPlaySound = 3,
-		kActionPlayMusic = 4,
-		kActionKnockOnDoor = 5,
-		kActionCompartment = 6,
-		kActionPlaySounds = 7,
-		kActionPlayAnimation = 8,
-		kActionOpenCloseObject = 9,
-		kActionObjectUpdateLocation2 = 10,
-		kActionSetItemLocation = 11,
-		kAction12 = 12,
-		kActionPickItem = 13,
-		kActionDropItem = 14,
-		kAction15 = 15,
-		kActionEnterCompartment = 16,
-		kActionGetOutsideTrain = 18,
-		kActionSlip = 19,
-		kActionGetInsideTrain = 20,
-		kActionClimbUpTrain = 21,
-		kActionClimbDownTrain = 22,
-		kActionJumpUpDownTrain = 23,
-		kActionUnbound = 24,
-		kAction25 = 25,
-		kAction26 = 26,
-		kAction27 = 27,
-		kActionConcertSitCough = 28,
-		kAction29 = 29,
-		kActionCatchBeetleHS = 30,
-		kActionExitCompartmentHS = 31,
-		kAction32 = 32,
-		KActionUseWhistle = 33,
-		kActionOpenMatchBox = 34,
-		kActionOpenBed = 35,
-		kActionDialog = 37,
-		kActionEggBox = 38,
-		kAction39 = 39,
-		kActionBed = 40,
-		kAction41 = 41,
-		kAction42 = 42,
-		kActionSwitchChapter = 43,
-		kAction44 = 44
-	};
-
-	struct SceneCoord {
-		int32 field_0;
-		int32 field_4;
-		byte field_8;
-		uint32 next;
-
-		SceneCoord() {
-			field_0 = 0;
-			field_4 = 0;
-			field_8 = 0;
-			next = 0;
-		}
-	};
-
-	Common::Rect rect;
-	uint32 coordsOffset;
-	SceneIndex scene;
-	byte location;
-	Action action;
-	byte param1;
-	byte param2;
-	byte param3;
-	byte cursor;
-	uint32 next;
-
-	SceneHotspot() {
-		coordsOffset = 0;
-		scene = kSceneNone;
-		location = 0;
-		action = kActionNoneHS;
-		param1 = 0;
-		param2 = 0;
-		param3 = 0;
-		cursor = 0;
-		next = 0;
-	}
-	~SceneHotspot();
-
-	static SceneHotspot *load(Common::SeekableReadStream *stream);
-
-	bool isInside(const Common::Point &point);
-
-	Common::String toString() const;
-
-private:
-	Common::Array<SceneCoord *> _coords;
-};
-
-class SceneLoader {
-public:
-	SceneLoader();
-	~SceneLoader();
-
-	bool load(Common::SeekableReadStream *stream);
-	Scene *get(SceneIndex index);
-
-	uint32 count() const { return _scenes.size() - 1; }
-
-private:
-	Common::SeekableReadStream *_stream;
-	Common::Array<Scene *> _scenes;
-
-	void clear();
-};
-
-class Scene : public Drawable {
-public:
-	// Enumerations
-	enum Type {
-		// PreProcess
-		kTypeObject = 1,
-		kTypeItem = 2,
-		kTypeItem2 = 3,
-		kTypeObjectItem = 4,
-		kTypeItem3 = 5,
-		kTypeObjectLocation2 = 6,
-		kTypeCompartments = 7,
-		kTypeCompartmentsItem = 8,
-
-		// PostProcess
-		kTypeList = 128,
-		kTypeSavePointChapter = 129,
-		kTypeLoadBeetleSequences = 130,
-		kTypeGameOver = 131,
-		kTypeReadText = 132,
-		kType133 = 133
-	};
-
-	// Data
-	EntityPosition entityPosition;
-	Location location;
-	CarIndex car;
-	PositionOld position;
-	Type type;
-	byte param1;
-	byte param2;
-	byte param3;
-
-	~Scene() override;
-
-	Common::Rect draw(Graphics::Surface *surface) override;
-
-	// Hotspots
-	Common::Array<SceneHotspot *> *getHotspots() { return &_hotspots; }
-	bool checkHotSpot(const Common::Point &coord, SceneHotspot **hotspot);
-	SceneHotspot *getHotspot(uint index = 0);
-
-	Common::String toString();
-
-private:
-	char _name[8];
-	byte _sig;
-	uint32 _hotspot;
-
-	Scene() {}
-	Common::Array<SceneHotspot *> _hotspots;
-
-	static Scene *load(Common::SeekableReadStream *stream);
-	void loadHotspots(Common::SeekableReadStream *stream);
-
-	void clear();
-
-	// Only allow full access for loading the scene and the hotspots
-	friend bool SceneLoader::load(Common::SeekableReadStream *stream);
-	friend Scene *SceneLoader::get(SceneIndex index);
-};
-
-} // End of namespace LastExpress
-
-#endif // LASTEXPRESS_SCENE_H
diff --git a/engines/lastexpress/data/sequence.cpp b/engines/lastexpress/data/sequence.cpp
deleted file mode 100644
index 3ae0b8c32c3..00000000000
--- a/engines/lastexpress/data/sequence.cpp
+++ /dev/null
@@ -1,480 +0,0 @@
-/* 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 3 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, see <http://www.gnu.org/licenses/>.
- *
- */
-
-// Based on Deniz Oezmen's code: http://oezmen.eu/
-
-#include "lastexpress/data/sequence.h"
-
-#include "lastexpress/debug.h"
-
-#include "common/stream.h"
-
-namespace LastExpress {
-
-void FrameInfo::read(Common::SeekableReadStream *in, bool isSequence) {
-	// Save the current position
-	int32 basePos = in->pos();
-
-	dataOffset = in->readUint32LE();
-	unknown = in->readUint32LE();
-	paletteOffset = in->readUint32LE();
-	xPos1 = in->readUint32LE();
-	yPos1 = in->readUint32LE();
-	xPos2 = in->readUint32LE();
-	yPos2 = in->readUint32LE();
-	initialSkip = in->readUint32LE();
-	decompressedEndOffset = in->readUint32LE();
-
-	// Read the compression type for NIS files
-	if (!isSequence) {
-		in->seek(basePos + 0x124);
-	} else {
-		hotspot.left = (int16)in->readUint16LE();
-		hotspot.right = (int16)in->readUint16LE();
-		hotspot.top = (int16)in->readUint16LE();
-		hotspot.bottom = (int16)in->readUint16LE();
-	}
-
-	compressionType = in->readByte();
-	subType = (FrameSubType)in->readByte();
-
-	// Sequence information
-	field_2E = in->readByte();
-	keepPreviousFrame = in->readByte();
-	field_30 = in->readByte();
-	field_31 = in->readByte();
-	soundAction = in->readByte();
-	field_33 = in->readByte();
-	position = in->readByte();
-	field_35 = in->readByte();
-	field_36 = in->readUint16LE();
-	field_38 = in->readUint32LE();
-	entityPosition = (EntityPosition)in->readUint16LE();
-	location = in->readUint16LE();
-	next = in->readUint32LE();
-}
-
-
-// AnimFrame
-
-AnimFrame::AnimFrame(Common::SeekableReadStream *in, const FrameInfo &f, bool /* ignoreSubtype */) : _palette(nullptr) {
-	_palSize = 1;
-	// TODO: use just the needed rectangle
-	_image.create(640, 480, Graphics::PixelFormat::createFormatCLUT8());
-
-	//debugC(6, kLastExpressDebugGraphics, "    Offsets: data=%d, unknown=%d, palette=%d", f.dataOffset, f.unknown, f.paletteOffset);
-	//debugC(6, kLastExpressDebugGraphics, "    Position: (%d, %d) - (%d, %d)", f.xPos1, f.yPos1, f.xPos2, f.yPos2);
-	//debugC(6, kLastExpressDebugGraphics, "    Initial Skip: %d", f.initialSkip);
-	//debugC(6, kLastExpressDebugGraphics, "    Decompressed end offset: %d", f.decompressedEndOffset);
-	//debugC(6, kLastExpressDebugGraphics, "    Hotspot: (%d, %d) x (%d, %d)\n", f.hotspot.left, f.hotspot.top, f.hotspot.right, f.hotspot.bottom);
-	//debugC(6, kLastExpressDebugGraphics, "    Compression type: %u / %u", f.compressionType, f.subType);
-	//debugC(6, kLastExpressDebugGraphics, "    Unknown: %u - %u - %u - %u - %u - %u - %u - %d", f.field_2E, f.field_2F, f.field_30, f.field_31, f.field_33, f.field_35, f.field_36, f.field_38);
-	//debugC(6, kLastExpressDebugGraphics, "    Sound action: %u", f.soundAction);
-	//debugC(6, kLastExpressDebugGraphics, "    Position: %d", f.position);
-	//debugC(6, kLastExpressDebugGraphics, "    Entity Position: %d", f.entityPosition);
-	//debugC(6, kLastExpressDebugGraphics, "    Location: %d", f.location);
-	//debugC(6, kLastExpressDebugGraphics, "    next: %d", f.next);
-
-	switch (f.compressionType) {
-	case 0:
-		// Empty frame
-		break;
-	case 3:
-		decomp3(in, f);
-		break;
-	case 4:
-		decomp4(in, f);
-		break;
-	case 5:
-		decomp5(in, f);
-		break;
-	case 7:
-		decomp7(in, f);
-		break;
-	case 255:
-		decompFF(in, f);
-		break;
-	default:
-		error("[AnimFrame::AnimFrame] Unknown frame compression: %d", f.compressionType);
-	}
-
-	readPalette(in, f);
-	_rect = Common::Rect((int16)f.xPos1, (int16)f.yPos1, (int16)f.xPos2, (int16)f.yPos2);
-	//_rect.debugPrint(0, "Frame rect:");
-}
-
-AnimFrame::~AnimFrame() {
-	_image.free();
-	delete[] _palette;
-}
-
-Common::Rect AnimFrame::draw(Graphics::Surface *s) {
-	byte *inp = (byte *)_image.getPixels();
-	uint16 *outp = (uint16 *)s->getPixels();
-	for (int i = 0; i < 640 * 480; i++, inp++, outp++) {
-		if (*inp)
-			*outp = _palette[*inp];
-	}
-	return _rect;
-}
-
-void AnimFrame::readPalette(Common::SeekableReadStream *in, const FrameInfo &f) {
-	// Read the palette
-	in->seek((int)f.paletteOffset);
-	_palette = new uint16[_palSize];
-	for (uint32 i = 0; i < _palSize; i++) {
-		_palette[i] = in->readUint16LE();
-	}
-}
-
-void AnimFrame::decomp3(Common::SeekableReadStream *in, const FrameInfo &f) {
-	decomp34(in, f, 0x7, 3);
-}
-
-void AnimFrame::decomp4(Common::SeekableReadStream *in, const FrameInfo &f) {
-	decomp34(in, f, 0xf, 4);
-}
-
-void AnimFrame::decomp34(Common::SeekableReadStream *in, const FrameInfo &f, byte mask, byte shift) {
-	byte *p = (byte *)_image.getPixels();
-
-	uint32 skip = f.initialSkip / 2;
-	uint32 size = f.decompressedEndOffset / 2;
-	//warning("skip: %d, %d", skip % 640, skip / 640);
-	//warning("size: %d, %d", size % 640, size / 640);
-	//assert (f.yPos1 == skip / 640);
-	//assert (f.yPos2 == size / 640);
-
-	uint32 numBlanks = 640 - (f.xPos2 - f.xPos1);
-
-	in->seek((int)f.dataOffset);
-	for (uint32 out = skip; out < size; ) {
-		uint16 opcode = in->readByte();
-
-		if (opcode & 0x80) {
-			if (opcode & 0x40) {
-				opcode &= 0x3f;
-				out += numBlanks + opcode + 1;
-			} else {
-				opcode &= 0x3f;
-				if (opcode & 0x20) {
-					opcode = ((opcode & 0x1f) << 8) + in->readByte();
-					if (opcode & 0x1000) {
-						out += opcode & 0xfff;
-						continue;
-					}
-				}
-				out += opcode + 2;
-			}
-		} else {
-			byte value = opcode & mask;
-			opcode >>= shift;
-			if (_palSize <= value)
-				_palSize = value + 1;
-			if (!opcode)
-				opcode = in->readByte();
-			for (int i = 0; i < opcode; i++, out++) {
-				p[out] = value;
-			}
-		}
-	}
-}
-
-void AnimFrame::decomp5(Common::SeekableReadStream *in, const FrameInfo &f) {
-	byte *p = (byte *)_image.getPixels();
-
-	uint32 skip = f.initialSkip / 2;
-	uint32 size = f.decompressedEndOffset / 2;
-	//warning("skip: %d, %d", skip % 640, skip / 640);
-	//warning("size: %d, %d", size % 640, size / 640);
-	//assert (f.yPos1 == skip / 640);
-	//assert (f.yPos2 == size / 640);
-
-	in->seek((int)f.dataOffset);
-	for (uint32 out = skip; out < size; ) {
-		uint16 opcode = in->readByte();
-		if (!(opcode & 0x1f)) {
-			opcode = (uint16)((opcode << 3) + in->readByte());
-			if (opcode & 0x400) {
-				// skip these 10 bits
-				out += (opcode & 0x3ff);
-			} else {
-				out += opcode + 2;
-			}
-		} else {
-			byte value = opcode & 0x1f;
-			opcode >>= 5;
-			if (_palSize <= value)
-				_palSize = value + 1;
-			if (!opcode)
-				opcode = in->readByte();
-			for (int i = 0; i < opcode; i++, out++) {
-				p[out] = value;
-			}
-		}
-	}
-}
-
-void AnimFrame::decomp7(Common::SeekableReadStream *in, const FrameInfo &f) {
-	byte *p = (byte *)_image.getPixels();
-
-	uint32 skip = f.initialSkip / 2;
-	uint32 size = f.decompressedEndOffset / 2;
-	//warning("skip: %d, %d", skip % 640, skip / 640);
-	//warning("size: %d, %d", size % 640, size / 640);
-	//assert (f.yPos1 == skip / 640);
-	//assert (f.yPos2 == size / 640);
-
-	uint32 numBlanks = 640 - (f.xPos2 - f.xPos1);
-
-	in->seek((int)f.dataOffset);
-	for (uint32 out = skip; out < size; ) {
-		uint16 opcode = in->readByte();
-		if (opcode & 0x80) {
-			if (opcode & 0x40) {
-				if (opcode & 0x20) {
-					opcode &= 0x1f;
-					out += numBlanks + opcode + 1;
-				} else {
-					opcode &= 0x1f;
-					if (opcode & 0x10) {
-						opcode = ((opcode & 0xf) << 8) + in->readByte();
-						if (opcode & 0x800) {
-							// skip these 11 bits
-							out += (opcode & 0x7ff);
-							continue;
-						}
-					}
-
-					// skip these 4 bits
-					out += opcode + 2;
-				}
-			} else {
-				opcode &= 0x3f;
-				byte value = in->readByte();
-				if (_palSize <= value)
-					_palSize = value + 1;
-				for (int i = 0; i < opcode; i++, out++) {
-					p[out] = value;
-				}
-			}
-		} else {
-			if (_palSize <= opcode)
-				_palSize = opcode + 1;
-			// set the given value
-			p[out] = (byte)opcode;
-			out++;
-		}
-	}
-}
-
-void AnimFrame::decompFF(Common::SeekableReadStream *in, const FrameInfo &f) {
-	byte *p = (byte *)_image.getPixels();
-
-	uint32 skip = f.initialSkip / 2;
-	uint32 size = f.decompressedEndOffset / 2;
-
-	in->seek((int)f.dataOffset);
-	for (uint32 out = skip; out < size; ) {
-		uint16 opcode = in->readByte();
-
-		if (opcode < 0x80) {
-			if (_palSize <= opcode)
-				_palSize = opcode + 1;
-			// set the given value
-			p[out] = (byte)opcode;
-			out++;
-		} else {
-			if (opcode < 0xf0) {
-				if (opcode < 0xe0) {
-					// copy old part
-					uint32 old = out + ((opcode & 0x7) << 8) + in->readByte() - 2048;
-					opcode = ((opcode >> 3) & 0xf) + 3;
-					for (int i = 0; i < opcode; i++, out++, old++) {
-						p[out] = p[old];
-					}
-				} else {
-					opcode = (opcode & 0xf) + 1;
-					byte value = in->readByte();
-					if (_palSize <= value)
-						_palSize = value + 1;
-					for (int i = 0; i < opcode; i++, out++) {
-						p[out] = value;
-					}
-				}
-			} else {
-				out += ((opcode & 0xf) << 8) + in->readByte();
-			}
-		}
-	}
-}
-
-
-//////////////////////////////////////////////////////////////////////////
-//  SEQUENCE
-//////////////////////////////////////////////////////////////////////////
-
-Sequence::~Sequence() {
-	reset();
-}
-
-void Sequence::reset() {
-	_frames.clear();
-	delete _stream;
-	_stream = nullptr;
-}
-
-Sequence *Sequence::load(Common::String name, Common::SeekableReadStream *stream, byte field30) {
-	Sequence *sequence = new Sequence(name);
-
-	if (!sequence->load(stream, field30)) {
-		delete sequence;
-		return nullptr;
-	}
-
-	return sequence;
-}
-
-bool Sequence::load(Common::SeekableReadStream *stream, byte field30) {
-	if (!stream)
-		return false;
-
-	// Reset data
-	reset();
-
-	_field30 = field30;
-
-	// Keep stream for later decoding of sequence
-	_stream = stream;
-
-	// Read header to get the number of frames
-	_stream->seek(0);
-	uint32 numframes = _stream->readUint32LE();
-	uint32 unknown = _stream->readUint32LE();
-	debugC(3, kLastExpressDebugGraphics, "Number of frames in sequence: %d / unknown=0x%x", numframes, unknown);
-
-	// Store frames information
-	for (uint i = 0; i < numframes; i++) {
-
-		// Move stream to start of frame
-		_stream->seek((int32)(_sequenceHeaderSize + i * _sequenceFrameSize), SEEK_SET);
-		if (_stream->eos())
-			error("[Sequence::load] Couldn't seek to the current frame data");
-
-		// Check if there is enough data
-		if ((unsigned)(_stream->size() - _stream->pos()) < _sequenceFrameSize)
-			error("[Sequence::load] The sequence frame does not have a valid header");
-
-		FrameInfo info;
-		info.read(_stream, true);
-		_frames.push_back(info);
-	}
-
-	_isLoaded = true;
-
-	return true;
-}
-
-FrameInfo *Sequence::getFrameInfo(uint16 index) {
-	if (_frames.size() == 0)
-		error("[Sequence::getFrameInfo] Trying to decode a sequence before loading its data");
-
-	if (index > _frames.size() - 1)
-		error("[Sequence::getFrameInfo] Invalid sequence frame requested: %d, max %d", index, _frames.size() - 1);
-
-	return &_frames[index];
-}
-
-AnimFrame *Sequence::getFrame(uint16 index) {
-
-	FrameInfo *frame = getFrameInfo(index);
-
-	if (!frame)
-		return nullptr;
-
-	// Skip "invalid" frames
-	if (frame->compressionType == 0)
-		return nullptr;
-
-	debugC(9, kLastExpressDebugGraphics, "Decoding sequence %s: frame %d / %d", _name.c_str(), index, _frames.size() - 1);
-
-	return new AnimFrame(_stream, *frame);
-}
-
-//////////////////////////////////////////////////////////////////////////
-// SequenceFrame
-SequenceFrame::~SequenceFrame() {
-	if (_dispose && _sequence) {
-		delete _sequence;
-	}
-
-	_sequence = nullptr;
-}
-
-Common::Rect SequenceFrame::draw(Graphics::Surface *surface) {
-	if (!_sequence || _frame >= _sequence->count())
-		return Common::Rect();
-
-	AnimFrame *f = _sequence->getFrame(_frame);
-	if (!f)
-		return Common::Rect();
-
-	Common::Rect rect = f->draw(surface);
-
-	delete f;
-
-	return rect;
-}
-
-bool SequenceFrame::setFrame(uint16 frame) {
-	if (!_sequence)
-		return false;
-
-	if (frame < _sequence->count()) {
-		_frame = frame;
-		return true;
-	} else
-		return false;
-}
-
-bool SequenceFrame::nextFrame() {
-	return setFrame(_frame + 1);
-}
-
-FrameInfo *SequenceFrame::getInfo() {
-	if (!_sequence)
-		error("[SequenceFrame::getInfo] Invalid sequence");
-
-	return _sequence->getFrameInfo(_frame);
-}
-
-Common::String SequenceFrame::getName() {
-	if (!_sequence)
-		error("[SequenceFrame::getName] Invalid sequence");
-
-	return _sequence->getName();
-}
-
-bool SequenceFrame::equal(const SequenceFrame *other) const {
-	return _sequence->getName() == other->_sequence->getName() && _frame == other->_frame;
-}
-
-} // End of namespace LastExpress
diff --git a/engines/lastexpress/data/sequence.h b/engines/lastexpress/data/sequence.h
deleted file mode 100644
index 929e1d44ae1..00000000000
--- a/engines/lastexpress/data/sequence.h
+++ /dev/null
@@ -1,207 +0,0 @@
-/* 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 3 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, see <http://www.gnu.org/licenses/>.
- *
- */
-
-#ifndef LASTEXPRESS_SEQUENCE_H
-#define LASTEXPRESS_SEQUENCE_H
-
-/*
-	Sequence format (.SEQ / .NIS (frame header & data only))
-
-	uint32 {4}    - Number of frames in sequence
-	uint32 {4}    - Unknown
-
-	frames headers (68 bytes):
-	// for each frame
-	    uint32 {4}    - Data offset (from beginning of file)
-	    uint32 {4}    - Unknown
-	    uint32 {4}    - Palette offset (from beginning of file)
-	    uint32 {4}    - Top-left X coordinate
-	    uint32 {4}    - Top-left Y coordinate
-	    uint32 {4}    - Bottom-right X coordinate
-	    uint32 {4}    - Bottom-right Y coordinate
-	    uint32 {4}    - Initial offset of decompressed data (doubled, since each pixel occupies one color word)
-	    uint32 {4}    - End of data after decompression
-
-	    (for SEQ files only)
-	    uint16 {2}    - Hotspot left
-	    uint16 {2}    - Hotspot right
-	    uint16 {2}    - Hotspot top
-	    uint16 {2}    - Hotspot bottom
-	    byte {1}      - Compression type
-	    byte {1}      - Subtype (determines which set of decompression functions will be called) => 0, 1, 2, 3
-	    byte {1}      - Unknown
-	    byte {1}      - Keep previous frame while drawing
-	    byte {1}      - Unknown
-	    byte {1}      - Unknown
-	    byte {1}      - Sound action
-	    byte {1}      - Unknown
-	    uint32 {4}    - positionId
-	    uint32 {4}    - Unknown
-	    uint16 {2}    - Entity Position
-	    uint16 {2}    - Location (~z-order)
-	    uint32 {4}    - Next sequence in the linked list
-
-	    (for NIS files: found at 0x124)
-	    byte {1}      - Compression type
-
-	palette data:
-	    uint16 {x}    - palette data (max size: 256)
-
-	data
-	    byte {x}      - compressed image data
-*/
-
-#include "lastexpress/drawable.h"
-
-#include "lastexpress/shared.h"
-
-#include "common/array.h"
-#include "common/rect.h"
-#include "common/str.h"
-
-namespace Common {
-class SeekableReadStream;
-}
-
-namespace LastExpress {
-
-enum FrameSubType {
-	kFrameTypeNone = 0,
-	kFrameType1 = 1,
-	kFrameType2 = 2,
-	kFrameType3 = 3
-};
-
-struct FrameInfo {
-	void read(Common::SeekableReadStream *in, bool isSequence);
-
-	uint32 dataOffset;            ///< Data offset (from beginning of file)
-	uint32 unknown;               ///< FIXME: unknown data
-	uint32 paletteOffset;         ///< Palette offset (from beginning of file)
-	uint32 xPos1;                 ///< Top-left X coordinate
-	uint32 yPos1;                 ///< Top-left Y coordinate
-	uint32 xPos2;                 ///< Bottom-right X coordinate
-	uint32 yPos2;                 ///< Bottom-right Y coordinate
-	uint32 initialSkip;           ///< Initial on-screen offset of decompressed data (doubled, since each pixel occupies one color word)
-	uint32 decompressedEndOffset; ///< End of data after decompression
-
-	// NIS frame headers end here. SEQ frame headers have additional 32 bytes of
-	// data, notably the compression type at the position outlined above in
-	// CompPos_SEQ
-
-	Common::Rect hotspot;
-
-	byte compressionType;         ///< Type of frame compression (0x03, 0x04, 0x05, 0x07, 0xFF)
-	FrameSubType subType;         ///< Subtype (byte)
-
-	byte field_2E;
-	byte keepPreviousFrame;
-	byte field_30;
-	byte field_31;
-	byte soundAction;
-	byte field_33;
-	PositionOld position;
-	byte field_35;
-	int16 field_36;
-	uint32 field_38;
-	EntityPosition entityPosition;
-	uint16 location;
-	uint32 next;
-};
-
-class AnimFrame : public Drawable {
-public:
-	AnimFrame(Common::SeekableReadStream *in, const FrameInfo &f, bool ignoreSubtype = false);
-	~AnimFrame() override;
-	Common::Rect draw(Graphics::Surface *s) override;
-
-private:
-	void decomp3(Common::SeekableReadStream *in, const FrameInfo &f);
-	void decomp4(Common::SeekableReadStream *in, const FrameInfo &f);
-	void decomp34(Common::SeekableReadStream *in, const FrameInfo &f, byte mask, byte shift);
-	void decomp5(Common::SeekableReadStream *in, const FrameInfo &f);
-	void decomp7(Common::SeekableReadStream *in, const FrameInfo &f);
-	void decompFF(Common::SeekableReadStream *in, const FrameInfo &f);
-	void readPalette(Common::SeekableReadStream *in, const FrameInfo &f);
-
-	Graphics::Surface _image;
-	uint16 _palSize;
-	uint16 *_palette;
-	Common::Rect _rect;
-};
-
-class Sequence {
-public:
-	Sequence(Common::String name) : _stream(NULL), _isLoaded(false), _name(name), _field30(15) {}
-	~Sequence();
-
-	static Sequence *load(Common::String name, Common::SeekableReadStream *stream = NULL, byte field30 = 15);
-
-	bool load(Common::SeekableReadStream *stream, byte field30 = 15);
-
-	uint16 count() const { return (uint16)_frames.size(); }
-	AnimFrame *getFrame(uint16 index = 0);
-	FrameInfo *getFrameInfo(uint16 index = 0);
-
-	Common::String getName() { return _name; }
-	byte getField30() { return _field30; }
-
-	bool isLoaded() { return _isLoaded; }
-
-private:
-	static const uint32 _sequenceHeaderSize = 8;
-	static const uint32 _sequenceFrameSize = 68;
-
-	void reset();
-
-	Common::Array<FrameInfo> _frames;
-	Common::SeekableReadStream *_stream;
-	bool _isLoaded;
-
-	Common::String _name;
-	byte _field30; // used when copying sequences
-};
-
-class SequenceFrame : public Drawable {
-public:
-	SequenceFrame(Sequence *sequence, uint16 frame = 0, bool dispose = false) : _sequence(sequence), _frame(frame), _dispose(dispose) {}
-	~SequenceFrame() override;
-
-	Common::Rect draw(Graphics::Surface *surface) override;
-
-	bool setFrame(uint16 frame);
-	uint32 getFrame() { return _frame; }
-	bool nextFrame();
-
-	Common::String getName();
-	FrameInfo *getInfo();
-
-	bool equal(const SequenceFrame *other) const;
-
-private:
-	Sequence *_sequence;
-	uint16 _frame;
-	bool _dispose;
-};
-
-} // End of namespace LastExpress
-
-#endif // LASTEXPRESS_SEQUENCE_H
diff --git a/engines/lastexpress/data/snd.cpp b/engines/lastexpress/data/snd.cpp
deleted file mode 100644
index 7d48e563669..00000000000
--- a/engines/lastexpress/data/snd.cpp
+++ /dev/null
@@ -1,608 +0,0 @@
-/* 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 3 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, see <http://www.gnu.org/licenses/>.
- *
- */
-
-// Based on the Xentax Wiki documentation:
-// http://wiki.xentax.com/index.php/The_Last_Express_SND
-
-#include "lastexpress/data/snd.h"
-
-#include "lastexpress/debug.h"
-
-#include "audio/decoders/adpcm_intern.h"
-#include "common/debug.h"
-#include "common/memstream.h"
-#include "common/system.h"
-
-namespace LastExpress {
-
-#pragma region Sound filters tables
-
-static const int stepTable[1424] = {
-	0, 0, 0, 0, 128, 256, 384, 512, 0, 0, 0, 0, 128, 256,
-	384, 512, 0, 0, 0, 0, 192, 320, 448, 576, 0, 0, 0, 0,
-	192, 320, 448, 576, 64, 64, 64, 64, 256, 384, 512, 640,
-	64, 64, 64, 64, 256, 384, 512, 640, 128, 128, 128, 128,
-	320, 448, 576, 704, 128, 128, 128, 128, 320, 448, 576,
-	704, 192, 192, 192, 192, 384, 512, 640, 768, 192, 192,
-	192, 192, 384, 512, 640, 768, 256, 256, 256, 256, 448,
-	576, 704, 832, 256, 256, 256, 256, 448, 576, 704, 832,
-	320, 320, 320, 320, 512, 640, 768, 896, 320, 320, 320,
-	320, 512, 640, 768, 896, 384, 384, 384, 384, 576, 704,
-	832, 960, 384, 384, 384, 384, 576, 704, 832, 960, 448,
-	448, 448, 448, 640, 768, 896, 1024, 448, 448, 448, 448,
-	640, 768, 896, 1024, 512, 512, 512, 512, 704, 832, 960,
-	1088, 512, 512, 512, 512, 704, 832, 960, 1088, 576,
-	576, 576, 576, 768, 896, 1024, 1152, 576, 576, 576,
-	576, 768, 896, 1024, 1152, 640, 640, 640, 640, 832,
-	960, 1088, 1216, 640, 640, 640, 640, 832, 960, 1088,
-	1216, 704, 704, 704, 704, 896, 1024, 1152, 1280, 704,
-	704, 704, 704, 896, 1024, 1152, 1280, 768, 768, 768,
-	768, 960, 1088, 1216, 1344, 768, 768, 768, 768, 960,
-	1088, 1216, 1344, 832, 832, 832, 832, 1024, 1152, 1280,
-	1408, 832, 832, 832, 832, 1024, 1152, 1280, 1408, 896,
-	896, 896, 896, 1088, 1216, 1344, 1472, 896, 896, 896,
-	896, 1088, 1216, 1344, 1472, 960, 960, 960, 960, 1152,
-	1280, 1408, 1536, 960, 960, 960, 960, 1152, 1280, 1408,
-	1536, 1024, 1024, 1024, 1024, 1216, 1344, 1472, 1600,
-	1024, 1024, 1024, 1024, 1216, 1344, 1472, 1600, 1088,
-	1088, 1088, 1088, 1280, 1408, 1536, 1664, 1088, 1088,
-	1088, 1088, 1280, 1408, 1536, 1664, 1152, 1152, 1152,
-	1152, 1344, 1472, 1600, 1728, 1152, 1152, 1152, 1152,
-	1344, 1472, 1600, 1728, 1216, 1216, 1216, 1216, 1408,
-	1536, 1664, 1792, 1216, 1216, 1216, 1216, 1408, 1536,
-	1664, 1792, 1280, 1280, 1280, 1280, 1472, 1600, 1728,
-	1856, 1280, 1280, 1280, 1280, 1472, 1600, 1728, 1856,
-	1344, 1344, 1344, 1344, 1536, 1664, 1792, 1920, 1344,
-	1344, 1344, 1344, 1536, 1664, 1792, 1920, 1408, 1408,
-	1408, 1408, 1600, 1728, 1856, 1984, 1408, 1408, 1408,
-	1408, 1600, 1728, 1856, 1984, 1472, 1472, 1472, 1472,
-	1664, 1792, 1920, 2048, 1472, 1472, 1472, 1472, 1664,
-	1792, 1920, 2048, 1536, 1536, 1536, 1536, 1728, 1856,
-	1984, 2112, 1536, 1536, 1536, 1536, 1728, 1856, 1984,
-	2112, 1600, 1600, 1600, 1600, 1792, 1920, 2048, 2176,
-	1600, 1600, 1600, 1600, 1792, 1920, 2048, 2176, 1664,
-	1664, 1664, 1664, 1856, 1984, 2112, 2240, 1664, 1664,
-	1664, 1664, 1856, 1984, 2112, 2240, 1728, 1728, 1728,
-	1728, 1920, 2048, 2176, 2304, 1728, 1728, 1728, 1728,
-	1920, 2048, 2176, 2304, 1792, 1792, 1792, 1792, 1984,
-	2112, 2240, 2368, 1792, 1792, 1792, 1792, 1984, 2112,
-	2240, 2368, 1856, 1856, 1856, 1856, 2048, 2176, 2304,
-	2432, 1856, 1856, 1856, 1856, 2048, 2176, 2304, 2432,
-	1920, 1920, 1920, 1920, 2112, 2240, 2368, 2496, 1920,
-	1920, 1920, 1920, 2112, 2240, 2368, 2496, 1984, 1984,
-	1984, 1984, 2176, 2304, 2432, 2560, 1984, 1984, 1984,
-	1984, 2176, 2304, 2432, 2560, 2048, 2048, 2048, 2048,
-	2240, 2368, 2496, 2624, 2048, 2048, 2048, 2048, 2240,
-	2368, 2496, 2624, 2112, 2112, 2112, 2112, 2304, 2432,
-	2560, 2688, 2112, 2112, 2112, 2112, 2304, 2432, 2560,
-	2688, 2176, 2176, 2176, 2176, 2368, 2496, 2624, 2752,
-	2176, 2176, 2176, 2176, 2368, 2496, 2624, 2752, 2240,
-	2240, 2240, 2240, 2432, 2560, 2688, 2816, 2240, 2240,
-	2240, 2240, 2432, 2560, 2688, 2816, 2304, 2304, 2304,
-	2304, 2496, 2624, 2752, 2880, 2304, 2304, 2304, 2304,
-	2496, 2624, 2752, 2880, 2368, 2368, 2368, 2368, 2560,
-	2688, 2816, 2944, 2368, 2368, 2368, 2368, 2560, 2688,
-	2816, 2944, 2432, 2432, 2432, 2432, 2624, 2752, 2880,
-	3008, 2432, 2432, 2432, 2432, 2624, 2752, 2880, 3008,
-	2496, 2496, 2496, 2496, 2688, 2816, 2944, 3072, 2496,
-	2496, 2496, 2496, 2688, 2816, 2944, 3072, 2560, 2560,
-	2560, 2560, 2752, 2880, 3008, 3136, 2560, 2560, 2560,
-	2560, 2752, 2880, 3008, 3136, 2624, 2624, 2624, 2624,
-	2816, 2944, 3072, 3200, 2624, 2624, 2624, 2624, 2816,
-	2944, 3072, 3200, 2688, 2688, 2688, 2688, 2880, 3008,
-	3136, 3264, 2688, 2688, 2688, 2688, 2880, 3008, 3136,
-	3264, 2752, 2752, 2752, 2752, 2944, 3072, 3200, 3328,
-	2752, 2752, 2752, 2752, 2944, 3072, 3200, 3328, 2816,
-	2816, 2816, 2816, 3008, 3136, 3264, 3392, 2816, 2816,
-	2816, 2816, 3008, 3136, 3264, 3392, 2880, 2880, 2880,
-	2880, 3072, 3200, 3328, 3456, 2880, 2880, 2880, 2880,
-	3072, 3200, 3328, 3456, 2944, 2944, 2944, 2944, 3136,
-	3264, 3392, 3520, 2944, 2944, 2944, 2944, 3136, 3264,
-	3392, 3520, 3008, 3008, 3008, 3008, 3200, 3328, 3456,
-	3584, 3008, 3008, 3008, 3008, 3200, 3328, 3456, 3584,
-	3072, 3072, 3072, 3072, 3264, 3392, 3520, 3648, 3072,
-	3072, 3072, 3072, 3264, 3392, 3520, 3648, 3136, 3136,
-	3136, 3136, 3328, 3456, 3584, 3712, 3136, 3136, 3136,
-	3136, 3328, 3456, 3584, 3712, 3200, 3200, 3200, 3200,
-	3392, 3520, 3648, 3776, 3200, 3200, 3200, 3200, 3392,
-	3520, 3648, 3776, 3264, 3264, 3264, 3264, 3456, 3584,
-	3712, 3840, 3264, 3264, 3264, 3264, 3456, 3584, 3712,
-	3840, 3328, 3328, 3328, 3328, 3520, 3648, 3776, 3904,
-	3328, 3328, 3328, 3328, 3520, 3648, 3776, 3904, 3392,
-	3392, 3392, 3392, 3584, 3712, 3840, 3968, 3392, 3392,
-	3392, 3392, 3584, 3712, 3840, 3968, 3456, 3456, 3456,
-	3456, 3648, 3776, 3904, 4032, 3456, 3456, 3456, 3456,
-	3648, 3776, 3904, 4032, 3520, 3520, 3520, 3520, 3712,
-	3840, 3968, 4096, 3520, 3520, 3520, 3520, 3712, 3840,
-	3968, 4096, 3584, 3584, 3584, 3584, 3776, 3904, 4032,
-	4160, 3584, 3584, 3584, 3584, 3776, 3904, 4032, 4160,
-	3648, 3648, 3648, 3648, 3840, 3968, 4096, 4224, 3648,
-	3648, 3648, 3648, 3840, 3968, 4096, 4224, 3712, 3712,
-	3712, 3712, 3904, 4032, 4160, 4288, 3712, 3712, 3712,
-	3712, 3904, 4032, 4160, 4288, 3776, 3776, 3776, 3776,
-	3968, 4096, 4224, 4352, 3776, 3776, 3776, 3776, 3968,
-	4096, 4224, 4352, 3840, 3840, 3840, 3840, 4032, 4160,
-	4288, 4416, 3840, 3840, 3840, 3840, 4032, 4160, 4288,
-	4416, 3904, 3904, 3904, 3904, 4096, 4224, 4352, 4480,
-	3904, 3904, 3904, 3904, 4096, 4224, 4352, 4480, 3968,
-	3968, 3968, 3968, 4160, 4288, 4416, 4544, 3968, 3968,
-	3968, 3968, 4160, 4288, 4416, 4544, 4032, 4032, 4032,
-	4032, 4224, 4352, 4480, 4608, 4032, 4032, 4032, 4032,
-	4224, 4352, 4480, 4608, 4096, 4096, 4096, 4096, 4288,
-	4416, 4544, 4672, 4096, 4096, 4096, 4096, 4288, 4416,
-	4544, 4672, 4160, 4160, 4160, 4160, 4352, 4480, 4608,
-	4736, 4160, 4160, 4160, 4160, 4352, 4480, 4608, 4736,
-	4224, 4224, 4224, 4224, 4416, 4544, 4672, 4800, 4224,
-	4224, 4224, 4224, 4416, 4544, 4672, 4800, 4288, 4288,
-	4288, 4288, 4480, 4608, 4736, 4864, 4288, 4288, 4288,
-	4288, 4480, 4608, 4736, 4864, 4352, 4352, 4352, 4352,
-	4544, 4672, 4800, 4928, 4352, 4352, 4352, 4352, 4544,
-	4672, 4800, 4928, 4416, 4416, 4416, 4416, 4608, 4736,
-	4864, 4992, 4416, 4416, 4416, 4416, 4608, 4736, 4864,
-	4992, 4480, 4480, 4480, 4480, 4672, 4800, 4928, 5056,
-	4480, 4480, 4480, 4480, 4672, 4800, 4928, 5056, 4544,
-	4544, 4544, 4544, 4736, 4864, 4992, 5120, 4544, 4544,
-	4544, 4544, 4736, 4864, 4992, 5120, 4608, 4608, 4608,
-	4608, 4800, 4928, 5056, 5184, 4608, 4608, 4608, 4608,
-	4800, 4928, 5056, 5184, 4672, 4672, 4672, 4672, 4864,
-	4992, 5120, 5248, 4672, 4672, 4672, 4672, 4864, 4992,
-	5120, 5248, 4736, 4736, 4736, 4736, 4928, 5056, 5184,
-	5312, 4736, 4736, 4736, 4736, 4928, 5056, 5184, 5312,
-	4800, 4800, 4800, 4800, 4992, 5120, 5248, 5376, 4800,
-	4800, 4800, 4800, 4992, 5120, 5248, 5376, 4864, 4864,
-	4864, 4864, 5056, 5184, 5312, 5440, 4864, 4864, 4864,
-	4864, 5056, 5184, 5312, 5440, 4928, 4928, 4928, 4928,
-	5120, 5248, 5376, 5504, 4928, 4928, 4928, 4928, 5120,
-	5248, 5376, 5504, 4992, 4992, 4992, 4992, 5184, 5312,
-	5440, 5568, 4992, 4992, 4992, 4992, 5184, 5312, 5440,
-	5568, 5056, 5056, 5056, 5056, 5248, 5376, 5504, 5632,
-	5056, 5056, 5056, 5056, 5248, 5376, 5504, 5632, 5120,
-	5120, 5120, 5120, 5312, 5440, 5568, 5632, 5120, 5120,
-	5120, 5120, 5312, 5440, 5568, 5632, 5184, 5184, 5184,
-	5184, 5376, 5504, 5632, 5632, 5184, 5184, 5184, 5184,
-	5376, 5504, 5632, 5632, 5248, 5248, 5248, 5248, 5440,
-	5568, 5632, 5632, 5248, 5248, 5248, 5248, 5440, 5568,
-	5632, 5632, 5312, 5312, 5312, 5312, 5504, 5632, 5632,
-	5632, 5312, 5312, 5312, 5312, 5504, 5632, 5632, 5632,
-	5376, 5376, 5376, 5376, 5568, 5632, 5632, 5632, 5376,
-	5376, 5376, 5376, 5568, 5632, 5632, 5632, 5440, 5440,
-	5440, 5440, 5632, 5632, 5632, 5632, 5440, 5440, 5440,
-	5440, 5632, 5632, 5632, 5632, 5504, 5504, 5504, 5504,
-	5632, 5632, 5632, 5632, 5504, 5504, 5504, 5504, 5632,
-	5632, 5632, 5632, 5568, 5568, 5568, 5568, 5632, 5632,
-	5632, 5632, 5568, 5568, 5568, 5568, 5632, 5632, 5632,
-	5632
-};
-
-static const int imaTable[1424] = {
-	0, 2, 4, 6, 7, 9, 11, 13, 0, -2, -4, -6, -7, -9, -11,
-	-13, 1, 3, 5, 7, 9, 11, 13, 15, -1, -3, -5, -7, -9,
-	-11, -13, -15, 1, 3, 5, 7, 10, 12, 14, 16, -1, -3, -5,
-	-7, -10, -12, -14, -16, 1, 3, 6, 8, 11, 13, 16, 18,
-	-1, -3, -6, -8, -11, -13, -16, -18, 1, 4, 6, 9, 12,
-	15, 17, 20, -1, -4, -6, -9, -12, -15, -17, -20, 1, 4,
-	7, 10, 13, 16, 19, 22, -1, -4, -7, -10, -13, -16, -19,
-	-22, 1, 4, 8, 11, 14, 17, 21, 24, -1, -4, -8, -11, -14,
-	-17, -21, -24, 1, 5, 8, 12, 15, 19, 22, 26, -1, -5,
-	-8, -12, -15, -19, -22, -26, 2, 6, 10, 14, 18, 22, 26,
-	30, -2, -6, -10, -14, -18, -22, -26, -30, 2, 6, 10,
-	14, 19, 23, 27, 31, -2, -6, -10, -14, -19, -23, -27,
-	-31, 2, 7, 11, 16, 21, 26, 30, 35, -2, -7, -11, -16,
-	-21, -26, -30, -35, 2, 7, 13, 18, 23, 28, 34, 39, -2,
-	-7, -13, -18, -23, -28, -34, -39, 2, 8, 14, 20, 25,
-	31, 37, 43, -2, -8, -14, -20, -25, -31, -37, -43, 3,
-	9, 15, 21, 28, 34, 40, 46, -3, -9, -15, -21, -28, -34,
-	-40, -46, 3, 10, 17, 24, 31, 38, 45, 52, -3, -10, -17,
-	-24, -31, -38, -45, -52, 3, 11, 19, 27, 34, 42, 50,
-	58, -3, -11, -19, -27, -34, -42, -50, -58, 4, 12, 21,
-	29, 38, 46, 55, 63, -4, -12, -21, -29, -38, -46, -55,
-	-63, 4, 13, 23, 32, 41, 50, 60, 69, -4, -13, -23, -32,
-	-41, -50, -60, -69, 5, 15, 25, 35, 46, 56, 66, 76, -5,
-	-15, -25, -35, -46, -56, -66, -76, 5, 16, 28, 39, 50,
-	61, 73, 84, -5, -16, -28, -39, -50, -61, -73, -84, 6,
-	18, 31, 43, 56, 68, 81, 93, -6, -18, -31, -43, -56,
-	-68, -81, -93, 6, 20, 34, 48, 61, 75, 89, 103, -6, -20,
-	-34, -48, -61, -75, -89, -103, 7, 22, 37, 52, 67, 82,
-	97, 112, -7, -22, -37, -52, -67, -82, -97, -112, 8,
-	24, 41, 57, 74, 90, 107, 123, -8, -24, -41, -57, -74,
-	-90, -107, -123, 9, 27, 45, 63, 82, 100, 118, 136, -9,
-	-27, -45, -63, -82, -100, -118, -136, 10, 30, 50, 70,
-	90, 110, 130, 150, -10, -30, -50, -70, -90, -110, -130,
-	-150, 11, 33, 55, 77, 99, 121, 143, 165, -11, -33, -55,
-	-77, -99, -121, -143, -165, 12, 36, 60, 84, 109, 133,
-	157, 181, -12, -36, -60, -84, -109, -133, -157, -181,
-	13, 40, 66, 93, 120, 147, 173, 200, -13, -40, -66, -93,
-	-120, -147, -173, -200, 14, 44, 73, 103, 132, 162, 191,
-	221, -14, -44, -73, -103, -132, -162, -191, -221, 16,
-	48, 81, 113, 146, 178, 211, 243, -16, -48, -81, -113,
-	-146, -178, -211, -243, 17, 53, 89, 125, 160, 196, 232,
-	268, -17, -53, -89, -125, -160, -196, -232, -268, 19,
-	58, 98, 137, 176, 215, 255, 294, -19, -58, -98, -137,
-	-176, -215, -255, -294, 21, 64, 108, 151, 194, 237,
-	281, 324, -21, -64, -108, -151, -194, -237, -281, -324,
-	23, 71, 118, 166, 213, 261, 308, 356, -23, -71, -118,
-	-166, -213, -261, -308, -356, 26, 78, 130, 182, 235,
-	287, 339, 391, -26, -78, -130, -182, -235, -287, -339,
-	-391, 28, 86, 143, 201, 258, 316, 373, 431, -28, -86,
-	-143, -201, -258, -316, -373, -431, 31, 94, 158, 221,
-	284, 347, 411, 474, -31, -94, -158, -221, -284, -347,
-	-411, -474, 34, 104, 174, 244, 313, 383, 453, 523, -34,
-	-104, -174, -244, -313, -383, -453, -523, 38, 115, 191,
-	268, 345, 422, 498, 575, -38, -115, -191, -268, -345,
-	-422, -498, -575, 42, 126, 210, 294, 379, 463, 547,
-	631, -42, -126, -210, -294, -379, -463, -547, -631,
-	46, 139, 231, 324, 417, 510, 602, 695, -46, -139, -231,
-	-324, -417, -510, -602, -695, 51, 153, 255, 357, 459,
-	561, 663, 765, -51, -153, -255, -357, -459, -561, -663,
-	-765, 56, 168, 280, 392, 505, 617, 729, 841, -56, -168,
-	-280, -392, -505, -617, -729, -841, 61, 185, 308, 432,
-	555, 679, 802, 926, -61, -185, -308, -432, -555, -679,
-	-802, -926, 68, 204, 340, 476, 612, 748, 884, 1020,
-	-68, -204, -340, -476, -612, -748, -884, -1020, 74,
-	224, 373, 523, 672, 822, 971, 1121, -74, -224, -373,
-	-523, -672, -822, -971, -1121, 82, 246, 411, 575, 740,
-	904, 1069, 1233, -82, -246, -411, -575, -740, -904,
-	-1069, -1233, 90, 271, 452, 633, 814, 995, 1176, 1357,
-	-90, -271, -452, -633, -814, -995, -1176, -1357, 99,
-	298, 497, 696, 895, 1094, 1293, 1492, -99, -298, -497,
-	-696, -895, -1094, -1293, -1492, 109, 328, 547, 766,
-	985, 1204, 1423, 1642, -109, -328, -547, -766, -985,
-	-1204, -1423, -1642, 120, 361, 601, 842, 1083, 1324,
-	1564, 1805, -120, -361, -601, -842, -1083, -1324, -1564,
-	-1805, 132, 397, 662, 927, 1192, 1457, 1722, 1987, -132,
-	-397, -662, -927, -1192, -1457, -1722, -1987, 145, 437,
-	728, 1020, 1311, 1603, 1894, 2186, -145, -437, -728,
-	-1020, -1311, -1603, -1894, -2186, 160, 480, 801, 1121,
-	1442, 1762, 2083, 2403, -160, -480, -801, -1121, -1442,
-	-1762, -2083, -2403, 176, 529, 881, 1234, 1587, 1940,
-	2292, 2645, -176, -529, -881, -1234, -1587, -1940, -2292,
-	-2645, 194, 582, 970, 1358, 1746, 2134, 2522, 2910,
-	-194, -582, -970, -1358, -1746, -2134, -2522, -2910,
-	213, 640, 1066, 1493, 1920, 2347, 2773, 3200, -213,
-	-640, -1066, -1493, -1920, -2347, -2773, -3200, 234,
-	704, 1173, 1643, 2112, 2582, 3051, 3521, -234, -704,
-	-1173, -1643, -2112, -2582, -3051, -3521, 258, 774,
-	1291, 1807, 2324, 2840, 3357, 3873, -258, -774, -1291,
-	-1807, -2324, -2840, -3357, -3873, 284, 852, 1420, 1988,
-	2556, 3124, 3692, 4260, -284, -852, -1420, -1988, -2556,
-	-3124, -3692, -4260, 312, 937, 1561, 2186, 2811, 3436,
-	4060, 4685, -312, -937, -1561, -2186, -2811, -3436,
-	-4060, -4685, 343, 1030, 1718, 2405, 3092, 3779, 4467,
-	5154, -343, -1030, -1718, -2405, -3092, -3779, -4467,
-	-5154, 378, 1134, 1890, 2646, 3402, 4158, 4914, 5670,
-	-378, -1134, -1890, -2646, -3402, -4158, -4914, -5670,
-	415, 1247, 2079, 2911, 3742, 4574, 5406, 6238, -415,
-	-1247, -2079, -2911, -3742, -4574, -5406, -6238, 457,
-	1372, 2287, 3202, 4117, 5032, 5947, 6862, -457, -1372,
-	-2287, -3202, -4117, -5032, -5947, -6862, 503, 1509,
-	2516, 3522, 4529, 5535, 6542, 7548, -503, -1509, -2516,
-	-3522, -4529, -5535, -6542, -7548, 553, 1660, 2767,
-	3874, 4981, 6088, 7195, 8302, -553, -1660, -2767, -3874,
-	-4981, -6088, -7195, -8302, 608, 1826, 3044, 4262, 5479,
-	6697, 7915, 9133, -608, -1826, -3044, -4262, -5479,
-	-6697, -7915, -9133, 669, 2009, 3348, 4688, 6027, 7367,
-	8706, 10046, -669, -2009, -3348, -4688, -6027, -7367,
-	-8706, -10046, 736, 2210, 3683, 5157, 6630, 8104, 9577,
-	11051, -736, -2210, -3683, -5157, -6630, -8104, -9577,
-	-11051, 810, 2431, 4052, 5673, 7294, 8915, 10536, 12157,
-	-810, -2431, -4052, -5673, -7294, -8915, -10536, -12157,
-	891, 2674, 4457, 6240, 8023, 9806, 11589, 13372, -891,
-	-2674, -4457, -6240, -8023, -9806, -11589, -13372, 980,
-	2941, 4903, 6864, 8825, 10786, 12748, 14709, -980, -2941,
-	-4903, -6864, -8825, -10786, -12748, -14709, 1078, 3236,
-	5393, 7551, 9708, 11866, 14023, 16181, -1078, -3236,
-	-5393, -7551, -9708, -11866, -14023, -16181, 1186, 3559,
-	5933, 8306, 10679, 13052, 15426, 17799, -1186, -3559,
-	-5933, -8306, -10679, -13052, -15426, -17799, 1305,
-	3915, 6526, 9136, 11747, 14357, 16968, 19578, -1305,
-	-3915, -6526, -9136, -11747, -14357, -16968, -19578,
-	1435, 4307, 7179, 10051, 12922, 15794, 18666, 21538,
-	-1435, -4307, -7179, -10051, -12922, -15794, -18666,
-	-21538, 1579, 4738, 7896, 11055, 14214, 17373, 20531,
-	23690, -1579, -4738, -7896, -11055, -14214, -17373,
-	-20531, -23690, 1737, 5212, 8686, 12161, 15636, 19111,
-	22585, 26060, -1737, -5212, -8686, -12161, -15636, -19111,
-	-22585, -26060, 1911, 5733, 9555, 13377, 17200, 21022,
-	24844, 28666, -1911, -5733, -9555, -13377, -17200, -21022,
-	-24844, -28666, 2102, 6306, 10511, 14715, 18920, 23124,
-	27329, 31533, -2102, -6306, -10511, -14715, -18920,
-	-23124, -27329, -31533, 2312, 6937, 11562, 16187, 20812,
-	25437, 30062, 32767, -2312, -6937, -11562, -16187, -20812,
-	-25437, -30062, -32767, 2543, 7631, 12718, 17806, 22893,
-	27981, 32767, 32767, -2543, -7631, -12718, -17806, -22893,
-	-27981, -32767, -32767, 2798, 8394, 13990, 19586, 25183,
-	30779, 32767, 32767, -2798, -8394, -13990, -19586, -25183,
-	-30779, -32767, -32767, 3077, 9233, 15389, 21545, 27700,
-	32767, 32767, 32767, -3077, -9233, -15389, -21545, -27700,
-	-32767, -32767, -32767, 3385, 10157, 16928, 23700, 30471,
-	32767, 32767, 32767, -3385, -10157, -16928, -23700,
-	-30471, -32767, -32767, -32767, 3724, 11172, 18621,
-	26069, 32767, 32767, 32767, 32767, -3724, -11172, -18621,
-	-26069, -32767, -32767, -32767, -32767, 4095, 12287,
-	20479, 28671, 32767, 32767, 32767, 32767, -4095, -12287,
-	-20479, -28671, -32767, -32767, -32767, -32767
-};
-
-#pragma endregion
-
-// Last Express ADPCM is similar to MS IMA mono, but inverts its nibbles
-// and does not have the 4 byte per channel requirement
-
-class LastExpress_ADPCMStream : public Audio::ADPCMStream {
-public:
-	LastExpress_ADPCMStream(Common::SeekableReadStream *stream, DisposeAfterUse::Flag disposeAfterUse, uint32 size, uint32 blockSize, uint32 volume, bool looped) :
-			Audio::ADPCMStream(stream, disposeAfterUse, size, 44100, 1, blockSize) {
-		_decodedSampleCount = 0;
-		_currentVolume = 0;
-		_nextVolume = volume;
-		_smoothChangeTarget = volume;
-		_volumeHoldBlocks = 0;
-		_running = true;
-		_looped = looped;
-	}
-
-	bool endOfData() const override {
-		return !_running || (!_looped && Audio::ADPCMStream::endOfData());
-	}
-
-	void seekToBlock(uint32 block) {
-		reset();
-		_stream->seek(_startpos + _blockAlign * block);
-	}
-
-	int readBuffer(int16 *buffer, const int numSamples) override {
-		int samples = 0;
-
-		while (_running && samples < numSamples) {
-			if (Audio::ADPCMStream::endOfData()) {
-				if (!_looped)
-					break;
-				rewind();
-			}
-			if (_blockPos[0] == _blockAlign) {
-				// read block header
-				_status.ima_ch[0].last = _stream->readSint16LE();
-				_status.ima_ch[0].stepIndex = _stream->readSint16LE() << 6;
-				_blockPos[0] = 4;
-
-				// sanity check against broken stream
-				if ((unsigned)_status.ima_ch[0].stepIndex >= ARRAYSIZE(stepTable) * 4) {
-					// the original game sets kSoundFlagDecodeError here and stops playing
-					_status.ima_ch[0].stepIndex = 0;
-				}
-
-				if (!smoothVolumeChangeStep()) {
-					_running = false;
-					break;
-				}
-
-				// Get current volume
-				_currentVolume = _nextVolume;
-			}
-
-			for (; samples < numSamples && _blockPos[0] < _blockAlign && !_stream->eos() && _stream->pos() < _endpos; samples++) {
-				if (_decodedSampleCount == 0) {
-					int step, sample;
-					byte idx;
-
-					byte data = _stream->readByte();
-					_blockPos[0]++;
-
-					// First nibble
-					idx = data >> 4;
-					step = stepTable[idx + _status.ima_ch[0].stepIndex / 4];
-					sample = CLIP<int>(imaTable[idx + _status.ima_ch[0].stepIndex / 4] + _status.ima_ch[0].last, -32767, 32767);
-					_decodedSamples[0] = (sample * _currentVolume) >> 4;
-
-					// Second nibble
-					idx = data & 0xF;
-					_status.ima_ch[0].stepIndex = stepTable[idx + step / 4];
-					_status.ima_ch[0].last = CLIP(imaTable[idx + step / 4] + sample, -32767, 32767);
-					_decodedSamples[1] = (_status.ima_ch[0].last * _currentVolume) >> 4;
-
-					_decodedSampleCount = 2;
-				}
-
-				// (1 - (count - 1)) ensures that _decodedSamples acts as a FIFO of depth 2
-				buffer[samples] = _decodedSamples[1 - (_decodedSampleCount - 1)];
-				_decodedSampleCount--;
-			}
-		}
-
-		return samples;
-	}
-
-	void setVolume(uint32 newVolume) { _smoothChangeTarget = _nextVolume = newVolume; }
-	void setVolumeSmoothly(uint32 newVolume) { _smoothChangeTarget = newVolume; }
-
-private:
-	uint8 _decodedSampleCount;
-	int16 _decodedSamples[2];
-
-	uint32 _currentVolume;
-	uint32 _nextVolume;
-	uint32 _smoothChangeTarget;
-	uint32 _volumeHoldBlocks; // smooth change of volume keeps volume on hold for 4 blocks = 133ms for every value; this is the counter
-	bool _running, _looped;
-
-	bool smoothVolumeChangeStep() {
-		if (_nextVolume == _smoothChangeTarget)
-			return true; // the original game clears kSoundFlagVolumeChanging here
-		if (_volumeHoldBlocks <= 3) {
-			_volumeHoldBlocks++;
-			return true;
-		}
-		if (_nextVolume < _smoothChangeTarget)
-			++_nextVolume;
-		else
-			--_nextVolume;
-		_volumeHoldBlocks = 0;
-		return (_nextVolume != 0);
-	}
-};
-
-//////////////////////////////////////////////////////////////////////////
-// Sound
-//////////////////////////////////////////////////////////////////////////
-SimpleSound::SimpleSound() : _size(0), _blocks(0), _blockSize(0) {}
-
-SimpleSound::~SimpleSound() {
-}
-
-// Stop the sound
-void SimpleSound::stop() const {
-	g_system->getMixer()->stopHandle(_handle);
-}
-
-void SimpleSound::loadHeader(Common::SeekableReadStream *in) {
-	_size = in->readUint32LE();
-	_blocks = in->readUint16LE();
-	debugC(5, kLastExpressDebugSound, "    sound header data: size=\"%d\", %d blocks", _size, _blocks);
-
-	assert (_size % _blocks == 0);
-	_blockSize = _size / _blocks;
-}
-
-LastExpress_ADPCMStream *SimpleSound::makeDecoder(Common::SeekableReadStream *in, uint32 size, uint32 volume, bool looped) const {
-	return new LastExpress_ADPCMStream(in, DisposeAfterUse::YES, size, _blockSize, volume, looped);
-}
-
-void SimpleSound::play(Audio::AudioStream *as, DisposeAfterUse::Flag autofreeStream) {
-	g_system->getMixer()->playStream(Audio::Mixer::kPlainSoundType, &_handle, as,
-		-1, Audio::Mixer::kMaxChannelVolume, 0, autofreeStream);
-}
-
-uint32 SimpleSound::getTimeMS() {
-	return g_system->getMixer()->getSoundElapsedTime(_handle);
-}
-
-//////////////////////////////////////////////////////////////////////////
-// StreamedSound
-//////////////////////////////////////////////////////////////////////////
-StreamedSound::StreamedSound() : _as(nullptr), _loaded(false) {}
-
-StreamedSound::~StreamedSound() {
-	stop(); // should execute before disposal of _as, so don't move in ~SimpleSound
-	delete _as;
-	_as = nullptr;
-}
-
-bool StreamedSound::load(Common::SeekableReadStream *stream, uint32 volume, bool looped, uint32 startBlock) {
-	if (!stream)
-		return false;
-
-	g_system->getMixer()->stopHandle(_handle);
-
-	loadHeader(stream);
-
-	if (_as) {
-		stop();
-		delete _as;
-	}
-	// Start decoding the input stream
-	_as = makeDecoder(stream, _size, volume, looped);
-	if (startBlock)
-		_as->seekToBlock(startBlock);
-
-	// Start playing the decoded audio stream
-	play(_as, DisposeAfterUse::NO);
-
-	_loaded = true;
-
-	return true;
-}
-
-bool StreamedSound::isFinished() {
-	if (!_loaded)
-		return false;
-
-	return !g_system->getMixer()->isSoundHandleActive(_handle);
-}
-
-void StreamedSound::setVolume(uint32 newVolume) {
-	if (!_as)
-		return;
-
-	_as->setVolume(newVolume);
-}
-
-void StreamedSound::setVolumeSmoothly(uint32 newVolume) {
-	if (!_as)
-		return;
-
-	_as->setVolumeSmoothly(newVolume);
-}
-
-//////////////////////////////////////////////////////////////////////////
-// StreamedSound
-//////////////////////////////////////////////////////////////////////////
-AppendableSound::AppendableSound() : SimpleSound() {
-	// Create an audio stream where the decoded chunks will be appended
-	_as = Audio::makeQueuingAudioStream(44100, false);
-	_finished = false;
-
-	// Start playing the decoded audio stream
-	play(_as, DisposeAfterUse::YES);
-
-	// Initialize the block size
-	// TODO: get it as an argument?
-	_blockSize = 739;
-}
-
-AppendableSound::~AppendableSound() {
-	finish();
-	stop();
-
-	_as = nullptr;
-}
-
-void AppendableSound::queueBuffer(const byte *data, uint32 size) {
-	Common::MemoryReadStream *buffer = new Common::MemoryReadStream(data, size);
-	queueBuffer(buffer);
-}
-
-void AppendableSound::queueBuffer(Common::SeekableReadStream *bufferIn) {
-	if (!_as)
-		error("[AppendableSound::queueBuffer] Audio stream is invalid");
-
-	// Setup the ADPCM decoder
-	uint32 sizeIn = (uint32)bufferIn->size();
-	LastExpress_ADPCMStream *adpcm = makeDecoder(bufferIn, sizeIn, kVolumeFull, false);
-
-	// Queue the stream
-	_as->queueAudioStream(adpcm);
-}
-
-void AppendableSound::finish() {
-	if (!_as)
-		error("[AppendableSound::finish] Audio stream is invalid");
-
-	if (!_finished)
-		_as->finish();
-
-	_finished = true;
-}
-
-bool AppendableSound::isFinished() {
-	return _as->endOfStream();
-}
-
-} // End of namespace LastExpress
diff --git a/engines/lastexpress/data/snd.h b/engines/lastexpress/data/snd.h
deleted file mode 100644
index 0df415f8e23..00000000000
--- a/engines/lastexpress/data/snd.h
+++ /dev/null
@@ -1,111 +0,0 @@
-/* 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 3 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, see <http://www.gnu.org/licenses/>.
- *
- */
-
-#ifndef LASTEXPRESS_SND_H
-#define LASTEXPRESS_SND_H
-
-/*
-	Sound format (.SND / .LNK)
-
-	uint32 {4}   - data size
-	uint16 {2}   - number of blocks
-
-	// for each block
-	    int16 {2}    - initial sample
-	    byte {1}     - initial index
-	    byte {1}     - unused (00)
-	    byte {x}     - IMA ADPCM sample codes
-*/
-
-#include "audio/mixer.h"
-
-namespace Audio {
-class AudioStream;
-class QueuingAudioStream;
-}
-
-namespace Common {
-class SeekableReadStream;
-}
-
-namespace LastExpress {
-
-class LastExpress_ADPCMStream;
-
-class SimpleSound {
-public:
-	SimpleSound();
-	virtual ~SimpleSound();
-
-	void stop() const;
-	virtual bool isFinished() = 0;
-
-	uint32 getTimeMS();
-
-protected:
-	void loadHeader(Common::SeekableReadStream *in);
-	LastExpress_ADPCMStream *makeDecoder(Common::SeekableReadStream *in, uint32 size, uint32 volume, bool looped) const;
-	void play(Audio::AudioStream *as, DisposeAfterUse::Flag autofreeStream);
-
-	uint32 _size;   ///< data size
-	                ///<  - NIS: size of all blocks, including those located in the matching LNK file
-	                ///<  - LNK: size of the LNK file itself, including the header
-	                ///<  - SND: size of all blocks
-	uint16 _blocks; ///< number of blocks
-	uint32 _blockSize;
-	Audio::SoundHandle _handle;
-};
-
-class StreamedSound : public SimpleSound {
-public:
-	StreamedSound();
-	~StreamedSound() override;
-
-	bool load(Common::SeekableReadStream *stream, uint32 volume, bool looped, uint32 startBlock = 0);
-	bool isFinished() override;
-
-	void setVolume(uint32 newVolume);
-	void setVolumeSmoothly(uint32 newVolume);
-
-private:
-	LastExpress_ADPCMStream *_as;
-	bool _loaded;
-};
-
-class AppendableSound : public SimpleSound {
-public:
-	AppendableSound();
-	~AppendableSound() override;
-
-	void queueBuffer(const byte *data, uint32 size);
-	void queueBuffer(Common::SeekableReadStream *bufferIn);
-	void finish();
-
-	bool isFinished() override;
-
-private:
-	Audio::QueuingAudioStream *_as;
-	bool _finished;
-};
-
-} // End of namespace LastExpress
-
-#endif // LASTEXPRESS_SND_H
diff --git a/engines/lastexpress/data/subtitle.cpp b/engines/lastexpress/data/subtitle.cpp
deleted file mode 100644
index 36f7604398f..00000000000
--- a/engines/lastexpress/data/subtitle.cpp
+++ /dev/null
@@ -1,243 +0,0 @@
-/* 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 3 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, see <http://www.gnu.org/licenses/>.
- *
- */
-
-// Based on the Xentax Wiki documentation:
-// http://wiki.xentax.com/index.php/The_Last_Express_SBE
-
-#include "lastexpress/data/subtitle.h"
-
-#include "lastexpress/data/font.h"
-
-#include "lastexpress/debug.h"
-
-#include "common/debug.h"
-#include "common/rect.h"
-#include "common/stream.h"
-#include "subtitle.h"
-
-namespace LastExpress {
-
-//////////////////////////////////////////////////////////////////////////
-// Subtitle
-//////////////////////////////////////////////////////////////////////////
-class SubtitleOld {
-public:
-	SubtitleOld() : _timeStart(0), _timeStop(0), _topLength(0), _topText(nullptr),
-		_bottomLength(0), _bottomText(nullptr) {}
-	~SubtitleOld() { reset(); }
-
-	bool load(Common::SeekableReadStream *in);
-	Common::Rect draw(Graphics::Surface *surface, Font *font);
-
-	uint16 getTimeStart() const { return _timeStart; }
-	uint16 getTimeStop() const { return _timeStop; }
-
-private:
-	uint16 _timeStart;    ///< display start time
-	uint16 _timeStop;     ///< display stop time
-
-	uint16 _topLength;    ///< top line length
-	uint16 *_topText;     ///< bottom line length
-
-	uint16 _bottomLength; ///< top line (UTF-16 string)
-	uint16 *_bottomText;  ///< bottom line (UTF-16 string)
-
-	void reset();
-};
-
-void SubtitleOld::reset() {
-	delete[] _topText;
-	delete[] _bottomText;
-	_topText = nullptr;
-	_bottomText = nullptr;
-}
-
-template<typename T>
-T *newArray(size_t n) {
-	if (n <= (size_t)-1 / sizeof(T))
-		return new T[n];
-
-	// n is too large
-	return nullptr;
-}
-
-bool SubtitleOld::load(Common::SeekableReadStream *in) {
-	reset();
-
-	if (!in)
-		return false;
-
-	// Read the display times
-	_timeStart = in->readUint16LE();
-	_timeStop = in->readUint16LE();
-
-	// Read the text lengths
-	_topLength = in->readUint16LE();
-	_bottomLength = in->readUint16LE();
-
-	// Create the buffers
-	if (_topLength) {
-		_topText = newArray<uint16>(_topLength + 1);
-		if (!_topText)
-			return false;
-
-		_topText[_topLength] = 0;
-	}
-	if (_bottomLength) {
-		_bottomText = newArray<uint16>(_bottomLength + 1);
-		if (!_bottomText)
-			return false;
-
-		_bottomText[_bottomLength] = 0;
-	}
-
-	// Read the texts
-	for (int i = 0; i < _topLength; i++)
-		_topText[i] = in->readUint16LE();
-	for (int i = 0; i < _bottomLength; i++)
-		_bottomText[i] = in->readUint16LE();
-
-	debugC(9, kLastExpressDebugSubtitle, "  %d -> %d:", _timeStart, _timeStop);
-	if (_topLength)
-		debugC(9, kLastExpressDebugSubtitle, "\t%ls", (wchar_t *)_topText);
-	if (_bottomLength)
-		debugC(9, kLastExpressDebugSubtitle, "\t%ls", (wchar_t *)_bottomText);
-
-	return true;
-}
-
-Common::Rect SubtitleOld::draw(Graphics::Surface *surface, Font *font) {
-	Common::Rect rectTop, rectBottom;
-
-	//FIXME find out proper subtitles coordinates (and hope it's hardcoded and not stored in the sequence or animation)
-	rectTop = font->drawString(surface, 100, 100, _topText, _topLength);
-	rectBottom = font->drawString(surface, 100, 300, _bottomText, _bottomLength);
-
-	rectTop.extend(rectBottom);
-
-	return rectTop;
-}
-
-
-//////////////////////////////////////////////////////////////////////////
-// SubtitleManager
-//////////////////////////////////////////////////////////////////////////
-SubtitleManagerOld::SubtitleManagerOld(Font *font) : _font(font), _maxTime(0), _currentIndex(-1), _lastIndex(-1) {}
-
-SubtitleManagerOld::~SubtitleManagerOld() {
-	reset();
-
-	// Zero passed pointers
-	_font = nullptr;
-}
-
-void SubtitleManagerOld::reset() {
-	for (uint i = 0; i < _subtitles.size(); i++)
-		delete _subtitles[i];
-
-	_subtitles.clear();
-	_currentIndex = -1;
-	_lastIndex = -1;
-}
-
-bool SubtitleManagerOld::load(Common::SeekableReadStream *stream) {
-	if (!stream)
-		return false;
-
-	reset();
-
-	// Read header to get the number of subtitles
-	uint32 numSubtitles = stream->readUint16LE();
-	if (stream->eos())
-		error("[SubtitleManager::load] Cannot read from subtitle file");
-
-	debugC(3, kLastExpressDebugSubtitle, "Number of subtitles in file: %d", numSubtitles);
-
-	// TODO: Check that stream contain enough data
-	//if (stream->size() < (signed)(numSubtitles * sizeof(SubtitleData))) {
-		//debugC(2, kLastExpressDebugSubtitle, "Subtitle file does not contain valid data");
-		//return false;
-	//}
-
-	// Read the list of subtitles
-	_maxTime = 0;
-	for (uint i = 0; i < numSubtitles; i++) {
-		SubtitleOld *subtitle = new SubtitleOld();
-		if (!subtitle->load(stream)) {
-			// Failed to read this line
-			reset();
-
-			delete subtitle;
-
-			return false;
-		}
-
-		// Update the max time
-		if (subtitle->getTimeStop() > _maxTime)
-			_maxTime = subtitle->getTimeStop();
-
-		_subtitles.push_back(subtitle);
-	}
-
-	delete stream;
-
-	return true;
-}
-
-uint16 SubtitleManagerOld::getMaxTime() const {
-	return _maxTime;
-}
-
-void SubtitleManagerOld::setTime(uint16 time) {
-	_currentIndex = -1;
-
-	// Find the appropriate line to show
-	for (uint i = 0; i < _subtitles.size(); i++) {
-		if ((time >= _subtitles[i]->getTimeStart()) && (time <= _subtitles[i]->getTimeStop())) {
-			// Keep the index of the line to show
-			_currentIndex = (int16)i;
-			return;
-		}
-	}
-}
-
-bool SubtitleManagerOld::hasChanged() const {
-	// TODO: mark the old line rect as dirty
-	if (_currentIndex != _lastIndex)
-		return true;
-	else
-		return false;
-}
-
-Common::Rect SubtitleManagerOld::draw(Graphics::Surface *surface) {
-	// Update the last drawn index
-	_lastIndex = _currentIndex;
-
-	// Return if we don't have to draw any line
-	if (_currentIndex == -1)
-		return Common::Rect();
-
-	// Draw the current line
-	assert(_currentIndex >= 0 && _currentIndex < (int16)_subtitles.size());
-	return _subtitles[(uint16)_currentIndex]->draw(surface, _font);
-}
-
-} // End of namespace LastExpress
diff --git a/engines/lastexpress/data/subtitle.h b/engines/lastexpress/data/subtitle.h
deleted file mode 100644
index 136fafc02de..00000000000
--- a/engines/lastexpress/data/subtitle.h
+++ /dev/null
@@ -1,78 +0,0 @@
-/* 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 3 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, see <http://www.gnu.org/licenses/>.
- *
- */
-
-#ifndef LASTEXPRESS_SUBTITLE_H
-#define LASTEXPRESS_SUBTITLE_H
-
-/*
-	Subtitle format (.SBE)
-
-	uint16 {2}   - number of subtitles
-
-	// for each subtitle
-	    uint16 {2}   - display start time
-	    uint16 {2}   - display stop time
-	    uint16 {2}   - top line length
-	    uint16 {2}   - bottom line length
-	    byte {x}     - top line (UTF-16 string)
-	    byte {x}     - bottom line (UTF-16 string)
-
-	Subtitles seem to be drawn on screen at (80, 420) x (560, 458)
-*/
-
-#include "lastexpress/drawable.h"
-
-#include "common/array.h"
-
-namespace Common {
-class SeekableReadStream;
-}
-
-namespace LastExpress {
-
-class Font;
-class SubtitleOld;
-
-class SubtitleManagerOld : public Drawable {
-public:
-	SubtitleManagerOld(Font *font);
-	~SubtitleManagerOld() override;
-
-	bool load(Common::SeekableReadStream *stream);
-	uint16 getMaxTime() const;
-	void setTime(uint16 time);
-	bool hasChanged() const;
-	Common::Rect draw(Graphics::Surface *surface) override;
-
-private:
-	Common::Array<SubtitleOld *> _subtitles;
-	Font *_font;
-	uint16 _maxTime;
-
-	int16 _currentIndex;
-	int16 _lastIndex;
-
-	void reset();
-};
-
-} // End of namespace LastExpress
-
-#endif // LASTEXPRESS_SUBTITLE_H
diff --git a/engines/lastexpress/debug.cpp b/engines/lastexpress/debug.cpp
index 53dfae8025f..3048b0f9c3a 100644
--- a/engines/lastexpress/debug.cpp
+++ b/engines/lastexpress/debug.cpp
@@ -22,33 +22,17 @@
 #include "lastexpress/debug.h"
 
 // Data
-#include "lastexpress/data/animation.h"
-#include "lastexpress/data/background.h"
-#include "lastexpress/data/cursor.h"
-#include "lastexpress/data/scene.h"
-#include "lastexpress/data/sequence.h"
-#include "lastexpress/data/subtitle.h"
 
 #include "lastexpress/fight/fight.h"
 
-#include "lastexpress/game/action.h"
 #include "lastexpress/game/beetle.h"
-#include "lastexpress/game/entities.h"
-#include "lastexpress/game/inventory.h"
 #include "lastexpress/game/logic.h"
-#include "lastexpress/game/object.h"
 #include "lastexpress/game/savegame.h"
-#include "lastexpress/game/savepoint.h"
-#include "lastexpress/game/scenes.h"
-#include "lastexpress/game/state.h"
 
 #include "lastexpress/menu/clock.h"
 
-#include "lastexpress/sound/queue.h"
-
 #include "lastexpress/graphics.h"
 #include "lastexpress/lastexpress.h"
-#include "lastexpress/resource.h"
 
 #include "common/debug-channels.h"
 #include "common/md5.h"
@@ -1157,1127 +1141,26 @@ void LastExpressEngine::showEngineInfo() {
 
 #endif
 
-Debugger::Debugger(LastExpressEngine *engine) : _engine(engine), _command(nullptr), _numParams(0), _commandParams(nullptr) {
-
+Debugger::Debugger(LastExpressEngine *engine) : _engine(engine) {
 	//////////////////////////////////////////////////////////////////////////
 	// Register the debugger commands
+	//////////////////////////////////////////////////////////////////////////
 
 	// General
 	registerCmd("help",      WRAP_METHOD(Debugger, cmdHelp));
-
-	// Data
-	registerCmd("ls",        WRAP_METHOD(Debugger, cmdListFiles));
-	registerCmd("dump",      WRAP_METHOD(Debugger, cmdDumpFiles));
-
-	registerCmd("showframe", WRAP_METHOD(Debugger, cmdShowFrame));
-	registerCmd("showbg",    WRAP_METHOD(Debugger, cmdShowBg));
-	registerCmd("playseq",   WRAP_METHOD(Debugger, cmdPlaySeq));
-	registerCmd("playsnd",   WRAP_METHOD(Debugger, cmdPlaySnd));
-	registerCmd("playsbe",   WRAP_METHOD(Debugger, cmdPlaySbe));
-	registerCmd("playnis",   WRAP_METHOD(Debugger, cmdPlayNis));
-
-	// Scene & interaction
-	registerCmd("loadscene", WRAP_METHOD(Debugger, cmdLoadScene));
-	registerCmd("fight",     WRAP_METHOD(Debugger, cmdFight));
-	registerCmd("beetle",    WRAP_METHOD(Debugger, cmdBeetle));
-
-	// Game
-	registerCmd("delta",     WRAP_METHOD(Debugger, cmdTimeDelta));
-	registerCmd("time",      WRAP_METHOD(Debugger, cmdTime));
-	registerCmd("show",      WRAP_METHOD(Debugger, cmdShow));
-	registerCmd("character",    WRAP_METHOD(Debugger, cmdEntity));
-
-	// Misc
-	registerCmd("chapter",   WRAP_METHOD(Debugger, cmdSwitchChapter));
-	registerCmd("clear",     WRAP_METHOD(Debugger, cmdClear));
-
-	resetCommand();
-
-	_soundStream = new StreamedSound();
 }
 
 Debugger::~Debugger() {
-	SAFE_DELETE(_soundStream);
-	resetCommand();
-
-	_command = nullptr;
-	_commandParams = nullptr;
-
 	// Zero passed pointers
 	_engine = nullptr;
 }
 
-//////////////////////////////////////////////////////////////////////////
-// Helper functions
-//////////////////////////////////////////////////////////////////////////
-bool Debugger::hasCommand() const {
-	return (_numParams != 0);
-}
-
-void Debugger::resetCommand() {
-	SAFE_DELETE(_command);
-
-	if (_commandParams)
-		for (int i = 0; i < _numParams; i++)
-			free(_commandParams[i]);
-
-	free(_commandParams);
-	_commandParams = nullptr;
-	_numParams = 0;
-}
-
-int Debugger::getNumber(const char *arg) const {
-	return strtol(arg, (char **)nullptr, 0);
-}
-
-void Debugger::copyCommand(int argc, const char **argv) {
-	_commandParams = (char **)malloc(sizeof(char *) * (uint)argc);
-	if (!_commandParams)
-		return;
-
-	_numParams = argc;
-
-	for (int i = 0; i < _numParams; i++) {
-		size_t ln = strlen(argv[i]) + 1;
-		_commandParams[i] = (char *)malloc(ln);
-		if (_commandParams[i] == nullptr)
-			error("[Debugger::copyCommand] Cannot allocate memory for command parameters");
-
-		memset(_commandParams[i], 0, strlen(argv[i]) + 1);
-		Common::strcpy_s(_commandParams[i], ln, argv[i]);
-	}
-
-	// Exit the debugger!
-	cmdExit(0, nullptr);
-}
-
-void Debugger::callCommand() {
-	if (_command)
-		(*_command)(_numParams, const_cast<const char **>(_commandParams));
-}
-
-bool Debugger::loadArchive(int index) {
-	if (index < 1 || index > 3) {
-		debugPrintf("Invalid cd number (was: %d, valid: [1-3])\n", index);
-		return false;
-	}
-
-	if (!_engine->getResourceManager()->loadArchive((ArchiveIndex)index))
-		return false;
-
-	getScenes()->loadSceneDataFile((ArchiveIndex)index);
-
-	return true;
-}
-
-// Restore loaded archive
-void Debugger::restoreArchive() const {
-
-	ArchiveIndex index = kArchiveCd1;
-
-	switch (getProgress().chapter) {
-	default:
-	case kChapter1:
-		index = kArchiveCd1;
-		break;
-
-	case kChapter2:
-	case kChapter3:
-		index = kArchiveCd2;
-		break;
-
-	case kChapter4:
-	case kChapter5:
-		index = kArchiveCd3;
-		break;
-	}
-
-	_engine->getResourceManager()->loadArchive(index);
-	getScenes()->loadSceneDataFile(index);
-}
-
 //////////////////////////////////////////////////////////////////////////
 // Debugger commands
 //////////////////////////////////////////////////////////////////////////
 bool Debugger::cmdHelp(int, const char **) {
-	debugPrintf("Debug flags\n");
-	debugPrintf("-----------\n");
-	debugPrintf(" debugflag_list - Lists the available debug flags and their status\n");
-	debugPrintf(" debugflag_enable - Enables a debug flag\n");
-	debugPrintf(" debugflag_disable - Disables a debug flag\n");
-	debugPrintf("\n");
-	debugPrintf("Commands\n");
-	debugPrintf("--------\n");
-	debugPrintf(" ls - list files in the archive\n");
-	debugPrintf(" dump - dump a list of files in all archives\n");
-	debugPrintf("\n");
-	debugPrintf(" showframe - show a frame from a sequence\n");
-	debugPrintf(" showbg - show a background\n");
-	debugPrintf(" playseq - play a sequence\n");
-	debugPrintf(" playsnd - play a sound\n");
-	debugPrintf(" playsbe - play a subtitle\n");
-	debugPrintf(" playnis - play an animation\n");
+	debugPrintf("No commands");
 	debugPrintf("\n");
-	debugPrintf(" loadscene - load a scene\n");
-	debugPrintf(" fight - start a fight\n");
-	debugPrintf(" beetle - start the beetle game\n");
-	debugPrintf("\n");
-	debugPrintf(" delta - Adjust the time delta\n");
-	debugPrintf(" show - show game data\n");
-	debugPrintf(" character - show character data\n");
-	debugPrintf("\n");
-	debugPrintf(" loadgame - load a saved game\n");
-	debugPrintf(" chapter - switch to a specific chapter\n");
-	debugPrintf(" clear - clear the screen\n");
-	debugPrintf("\n");
-	return true;
-}
-
-/**
- * Command: list files in archive
- *
- * @param argc The argument count.
- * @param argv The values.
- *
- * @return true if it was handled, false otherwise
- */
-bool Debugger::cmdListFiles(int argc, const char **argv) {
-	if (argc == 2 || argc == 3) {
-		Common::Path filter(const_cast<char *>(argv[1]));
-
-		// Load the proper archive
-		if (argc == 3) {
-			if (!loadArchive(getNumber(argv[2])))
-				return true;
-		}
-
-		Common::ArchiveMemberList list;
-		int count = _engine->getResourceManager()->listMatchingMembers(list, filter);
-
-		debugPrintf("Number of matches: %d\n", count);
-		for (Common::ArchiveMemberList::iterator it = list.begin(); it != list.end(); ++it)
-			debugPrintf(" %s\n", (*it)->getName().c_str());
-
-		// Restore archive
-		if (argc == 3)
-			restoreArchive();
-	} else {
-		debugPrintf("Syntax: ls <filter> (use * for all) (<cd number>)\n");
-	}
-
-	return true;
-}
-
-/**
- * Command: Dump the list of files in the archive
- *
- * @param argc The argument count.
- * @param argv The values.
- *
- * @return true if it was handled, false otherwise
- */
-bool Debugger::cmdDumpFiles(int argc, const char **) {
-#define OUTPUT_ARCHIVE_FILES(name, filename) { \
-	_engine->getResourceManager()->reset(); \
-	_engine->getResourceManager()->loadArchive(filename); \
-	Common::ArchiveMemberList list; \
-	int count = _engine->getResourceManager()->listMatchingMembers(list, "*"); \
-	debugC(1, kLastExpressDebugResource, "\n\n--------------------------------------------------------------------\n"); \
-	debugC(1, kLastExpressDebugResource, "-- " #name " (%d files)\n", count); \
-	debugC(1, kLastExpressDebugResource, "--------------------------------------------------------------------\n\n"); \
-	debugC(1, kLastExpressDebugResource, "Filename,Size,MD5\n"); \
-	for (Common::ArchiveMemberList::iterator it = list.begin(); it != list.end(); ++it) { \
-		Common::SeekableReadStream *stream = getArchiveMember((*it)->getName()); \
-		if (!stream) { \
-			debugPrintf("ERROR: Cannot create stream for file: %s\n", (*it)->getName().c_str()); \
-			restoreArchive(); \
-			return true; \
-		} \
-		Common::String md5str = Common::computeStreamMD5AsString(*stream); \
-		debugC(1, kLastExpressDebugResource, "%s, %d, %s", (*it)->getName().c_str(), (int)stream->size(), md5str.c_str()); \
-		delete stream; \
-	} \
-}
-
-	if (argc == 1) {
-		// For each archive file, dump the list of files
-		if (_engine->isDemo()) {
-			OUTPUT_ARCHIVE_FILES("DEMO", "DEMO.HPF");
-		} else {
-			OUTPUT_ARCHIVE_FILES("HD", "HD.HPF");
-			OUTPUT_ARCHIVE_FILES("CD 1", "CD1.HPF");
-			OUTPUT_ARCHIVE_FILES("CD 2", "CD2.HPF");
-			OUTPUT_ARCHIVE_FILES("CD 3", "CD3.HPF");
-		}
-
-		// Restore current loaded archive
-		restoreArchive();
-	} else {
-		debugPrintf("Syntax: dump");
-	}
-
-	return true;
-}
-
-/**
- * Command: Shows a frame
- *
- * @param argc The argument count.
- * @param argv The values.
- *
- * @return true if it was handled, false otherwise
- */
-bool Debugger::cmdShowFrame(int argc, const char **argv) {
-	if (argc == 3 || argc == 4) {
-		Common::String filename(const_cast<char *>(argv[1]));
-		filename += ".seq";
-
-		if (argc == 4) {
-			if (!loadArchive(getNumber(argv[3])))
-				return true;
-		}
-
-		if (!_engine->getResourceManager()->hasFile(Common::Path(filename))) {
-			debugPrintf("Cannot find file: %s\n", filename.c_str());
-			return true;
-		}
-
-		// Store command
-		if (!hasCommand()) {
-			_command = WRAP_METHOD(Debugger, cmdShowFrame);
-			copyCommand(argc, argv);
-
-			return cmdExit(0, nullptr);
-		} else {
-			Sequence sequence(filename);
-			if (sequence.load(getArchiveMember(filename))) {
-				_engine->getCursor()->show(false);
-				clearBg(GraphicsManagerOld::kBackgroundOverlay);
-
-				AnimFrame *frame = sequence.getFrame((uint16)getNumber(argv[2]));
-				if (!frame) {
-					debugPrintf("Invalid frame index '%s'\n", argv[2]);
-					resetCommand();
-					return true;
-				}
-
-				_engine->getGraphicsManagerOld()->draw(frame, GraphicsManagerOld::kBackgroundOverlay);
-				delete frame;
-
-				askForRedraw();
-				redrawScreen();
-
-				_engine->_system->delayMillis(1000);
-				_engine->getCursor()->show(true);
-			}
-
-			resetCommand();
-
-			if (argc == 4)
-				restoreArchive();
-		}
-	} else {
-		debugPrintf("Syntax: cmd_showframe <seqname> <index> (<cd number>)\n");
-	}
-	return true;
-}
-
-/**
- * Command: shows a background
- *
- * @param argc The argument count.
- * @param argv The values.
- *
- * @return true if it was handled, false otherwise
- */
-bool Debugger::cmdShowBg(int argc, const char **argv) {
-	if (argc == 2 || argc == 3) {
-		Common::String filename(const_cast<char *>(argv[1]));
-
-		if (argc == 3) {
-			if (!loadArchive(getNumber(argv[2])))
-				return true;
-		}
-
-		if (!_engine->getResourceManager()->hasFile(Common::Path(filename + ".BG"))) {
-			debugPrintf("Cannot find file: %s\n", (filename + ".BG").c_str());
-			return true;
-		}
-
-		// Store command
-		if (!hasCommand()) {
-			_command = WRAP_METHOD(Debugger, cmdShowBg);
-			copyCommand(argc, argv);
-
-			return cmdExit(0, nullptr);
-		} else {
-			clearBg(GraphicsManagerOld::kBackgroundC);
-
-			Background *background = _engine->getResourceManager()->loadBackground(filename);
-			if (background) {
-				_engine->getGraphicsManagerOld()->draw(background, GraphicsManagerOld::kBackgroundC);
-				delete background;
-				askForRedraw();
-			}
-
-			redrawScreen();
-
-			if (argc == 3)
-				restoreArchive();
-
-			// Pause for a second to be able to see the background
-			_engine->_system->delayMillis(1000);
-
-			resetCommand();
-		}
-	} else {
-		debugPrintf("Syntax: showbg <bgname> (<cd number>)\n");
-	}
-	return true;
-}
-
-/**
- * Command: plays a sequence.
- *
- * @param argc The argument count.
- * @param argv The values.
- *
- * @return true if it was handled, false otherwise
- */
-bool Debugger::cmdPlaySeq(int argc, const char **argv) {
-	if (argc == 2 || argc == 3) {
-		Common::String filename(const_cast<char *>(argv[1]));
-		filename += ".seq";
-
-		if (argc == 3) {
-			if (!loadArchive(getNumber(argv[2])))
-				return true;
-		}
-
-		if (!_engine->getResourceManager()->hasFile(Common::Path(filename))) {
-			debugPrintf("Cannot find file: %s\n", filename.c_str());
-			return true;
-		}
-
-		// Store command
-		if (!hasCommand()) {
-			_command = WRAP_METHOD(Debugger, cmdPlaySeq);
-			copyCommand(argc, argv);
-
-			return cmdExit(0, nullptr);
-		} else {
-			Sequence *sequence = new Sequence(filename);
-			if (sequence->load(getArchiveMember(filename))) {
-
-				// Check that we have at least a frame to show
-				if (sequence->count() == 0) {
-					delete sequence;
-					return false;
-				}
-
-				_engine->getCursor()->show(false);
-
-				SequenceFrame player(sequence, 0, true);
-				do {
-					// Clear screen
-					clearBg(GraphicsManagerOld::kBackgroundA);
-
-					_engine->getGraphicsManagerOld()->draw(&player, GraphicsManagerOld::kBackgroundA);
-
-					askForRedraw();
-					redrawScreen();
-
-					// Handle right-click to interrupt sequence
-					Common::Event ev;
-					if (_engine->getEventManager()->pollEvent(ev) && ev.type == Common::EVENT_RBUTTONUP)
-						break;
-
-					_engine->_system->delayMillis(175);
-
-					// go to the next frame
-				} while (player.nextFrame());
-				_engine->getCursor()->show(true);
-			} else {
-				// Sequence player is deleting his reference to the sequence, but we need to take care of it if the
-				// sequence could not be loaded
-				delete sequence;
-			}
-
-			resetCommand();
-
-			if (argc == 3)
-				restoreArchive();
-		}
-	} else {
-		debugPrintf("Syntax: playseq <seqname> (<cd number>)\n");
-	}
-	return true;
-}
-
-/**
- * Command: plays a sound
- *
- * @param argc The argument count.
- * @param argv The values.
- *
- * @return true if it was handled, false otherwise
- */
-bool Debugger::cmdPlaySnd(int argc, const char **argv) {
-	if (argc == 2 || argc == 3) {
-
-		if (argc == 3) {
-			if (!loadArchive(getNumber(argv[2])))
-				return true;
-		}
-
-		// Add .SND at the end of the filename if needed
-		Common::String name(const_cast<char *>(argv[1]));
-		if (!name.contains('.'))
-			name += ".SND";
-
-		if (!_engine->getResourceManager()->hasFile(Common::Path(name))) {
-			debugPrintf("Cannot find file: %s\n", name.c_str());
-			return true;
-		}
-
-		_engine->_system->getMixer()->stopAll();
-
-		_soundStream->load(getArchiveMember(name), kVolumeFull, false);
-
-		if (argc == 3)
-			restoreArchive();
-	} else {
-		debugPrintf("Syntax: playsnd <sndname> (<cd number>)\n");
-	}
-	return true;
-}
-
-/**
- * Command: plays subtitles
- *
- * @param argc The argument count.
- * @param argv The values.
- *
- * @return true if it was handled, false otherwise
- */
-bool Debugger::cmdPlaySbe(int argc, const char **argv) {
-	if (argc == 2 || argc == 3) {
-		Common::String filename(const_cast<char *>(argv[1]));
-
-		if (argc == 3) {
-			if (!loadArchive(getNumber(argv[2])))
-				return true;
-		}
-
-		filename += ".sbe";
-
-		if (!_engine->getResourceManager()->hasFile(Common::Path(filename))) {
-			debugPrintf("Cannot find file: %s\n", filename.c_str());
-			return true;
-		}
-
-		// Store command
-		if (!hasCommand()) {
-			_command = WRAP_METHOD(Debugger, cmdPlaySbe);
-			copyCommand(argc, argv);
-
-			return cmdExit(0, nullptr);
-		} else {
-			SubtitleManagerOld subtitle(_engine->getFont());
-			if (subtitle.load(getArchiveMember(filename))) {
-				_engine->getCursor()->show(false);
-				for (uint16 i = 0; i < subtitle.getMaxTime(); i += 25) {
-					clearBg(GraphicsManagerOld::kBackgroundAll);
-
-					subtitle.setTime(i);
-					_engine->getGraphicsManagerOld()->draw(&subtitle, GraphicsManagerOld::kBackgroundOverlay);
-
-					askForRedraw();
-					redrawScreen();
-
-					// Handle right-click to interrupt sequence
-					Common::Event ev;
-					if (!_engine->getEventManager()->pollEvent(ev))
-						break;
-
-					if (ev.type == Common::EVENT_RBUTTONUP)
-						break;
-
-					_engine->_system->delayMillis(500);
-				}
-				_engine->getCursor()->show(true);
-			}
-
-			if (argc == 3)
-				restoreArchive();
-
-			resetCommand();
-		}
-	} else {
-		debugPrintf("Syntax: playsbe <sbename> (<cd number>)\n");
-	}
-	return true;
-}
-
-/**
- * Command: plays a NIS animation sequence.
- *
- * @param argc The argument count.
- * @param argv The values.
- *
- * @return true if it was handled, false otherwise
- */
-bool Debugger::cmdPlayNis(int argc, const char **argv) {
-	if (argc == 2 || argc == 3) {
-		Common::String name(const_cast<char *>(argv[1]));
-
-		if (argc == 3) {
-			if (!loadArchive(getNumber(argv[2])))
-				return true;
-		}
-
-		// If we got a nis filename, check that the file exists
-		if (name.contains('.') && !_engine->getResourceManager()->hasFile(Common::Path(name))) {
-			debugPrintf("Cannot find file: %s\n", name.c_str());
-			return true;
-		}
-
-		// Store command
-		if (!hasCommand()) {
-			_command = WRAP_METHOD(Debugger, cmdPlayNis);
-			copyCommand(argc, argv);
-
-			return cmdExit(0, nullptr);
-		} else {
-			// Make sure we are not called in a loop
-			_numParams = 0;
-
-			// Check if we got a nis filename or an animation index
-			if (name.contains('.')) {
-				Animation animation;
-				if (animation.load(getArchiveMember(name))) {
-					_engine->getCursor()->show(false);
-					animation.play();
-					_engine->getCursor()->show(true);
-				}
-			} else {
-				getActionOld()->playAnimation((EventIndex)atoi(name.c_str()), true);
-			}
-
-			if (argc == 3)
-				restoreArchive();
-
-			resetCommand();
-		}
-	} else {
-		debugPrintf("Syntax: playnis <nisname.nis or animation index> (<cd number>)\n");
-	}
-	return true;
-}
-
-/**
- * Command: loads a scene
- *
- * @param argc The argument count.
- * @param argv The values.
- *
- * @return true if it was handled, false otherwise
- */
-bool Debugger::cmdLoadScene(int argc, const char **argv) {
-	if (argc == 2 || argc == 3) {
-		int cd = 1;
-		SceneIndex index = (SceneIndex)getNumber(argv[1]);
-
-		// Check args
-		if (argc == 3) {
-			if (!loadArchive(getNumber(argv[2])))
-				return true;
-		}
-
-		if (index > 2500) {
-			debugPrintf("Error: invalid index value (0-2500)");
-			return true;
-		}
-
-		// Store command
-		if (!hasCommand()) {
-			_command = WRAP_METHOD(Debugger, cmdLoadScene);
-			copyCommand(argc, argv);
-
-			return cmdExit(0, nullptr);
-		} else {
-
-			clearBg(GraphicsManagerOld::kBackgroundAll);
-
-			/************  DEBUG  *************************/
-			// Use to find scenes with certain values
-
-			//for (int i = index; i < 2500; i++) {
-			//	loadSceneObject(scene, i);
-
-			//	if (scene.getHeader() && scene.getHeader()->car == 5 && scene.getHeader()->position == 81) {
-			//		debugPrintf("Found scene: %d", i);
-
-			//		// Draw scene found
-			//		_engine->getGraphicsManagerOld()->draw(&scene, GraphicsManagerOld::kBackgroundC);
-
-			//		askForRedraw();
-			//		redrawScreen();
-			//		_engine->_system->delayMillis(500);
-
-			//		break;
-			//	}
-			//}
-
-			//delete _sceneLoader;
-			//resetCommand();
-			//return true;
-
-			/*********************************************/
-			Scene *scene = getScenes()->get(index);
-			if (!scene) {
-				debugPrintf("Cannot load scene %i from CD %i", index, cd);
-				resetCommand();
-
-				return true;
-			}
-
-			_engine->getGraphicsManagerOld()->draw(scene, GraphicsManagerOld::kBackgroundC);
-
-			askForRedraw();
-			redrawScreen();
-
-			// Pause for a second to be able to see the scene
-			_engine->_system->delayMillis(500);
-
-			if (argc == 3)
-				restoreArchive();
-
-			resetCommand();
-		}
-	} else {
-		debugPrintf("Syntax: loadscene <scene index> (<cd number>)\n");
-	}
-	return true;
-}
-
-/**
- * Command: starts a fight sequence
- *
- * @param argc The argument count.
- * @param argv The values.
- *
- * @return true if it was handled, false otherwise
- */
-bool Debugger::cmdFight(int argc, const char **argv) {
-	if (argc == 2) {
-		FightType type = (FightType)getNumber(argv[1]);
-
-		// Load proper data file
-		ArchiveIndex index = kArchiveCd1;
-		switch (type) {
-		default:
-			goto error;
-
-		case kFightMilos:
-			index = kArchiveCd1;
-			break;
-
-		case kFightAnna:
-			index = kArchiveCd2;
-			break;
-
-		case kFightIvo:
-		case kFightSalko:
-		case kFightVesna:
-			index = kArchiveCd3;
-			break;
-		}
-
-		if (!loadArchive(index)) {
-			debugPrintf("Error: failed to load archive %d\n", index);
-			return true;
-		}
-
-		// Store command
-		if (!hasCommand()) {
-			_command = WRAP_METHOD(Debugger, cmdFight);
-			copyCommand(argc, argv);
-
-			return false;
-		} else {
-			// Make sure we are not called in a loop
-			_numParams = 0;
-
-			clearBg(GraphicsManagerOld::kBackgroundAll);
-			askForRedraw();
-			redrawScreen();
-
-			SceneIndex lastScene = getState()->scene;
-
-			//getFight()->setup(type) ? debugPrintf("Lost fight!\n") : debugPrintf("Won fight!\n");
-
-			// Pause for a second to be able to see the final scene
-			_engine->_system->delayMillis(1000);
-
-			// Restore loaded archive
-			restoreArchive();
-
-			// Stop audio and restore scene
-			getSoundQueue()->stopAllSound();
-
-			clearBg(GraphicsManagerOld::kBackgroundAll);
-
-			Scene *scene = getScenes()->get(lastScene);
-			_engine->getGraphicsManagerOld()->draw(scene, GraphicsManagerOld::kBackgroundC);
-
-			askForRedraw();
-			redrawScreen();
-
-			resetCommand();
-		}
-	} else {
-error:
-		debugPrintf("Syntax: fight <id> (id=2001-2005)\n");
-	}
-
-	return true;
-}
-
-/**
- * Command: starts the beetle sequence
- *
- * @param argc The argument count.
- * @param argv The values.
- *
- * @return true if it was handled, false otherwise
- */
-bool Debugger::cmdBeetle(int argc, const char **argv) {
-	if (argc == 1) {
-		// Load proper data file (beetle game in in Cd2)
-		if (!loadArchive(kArchiveCd2)) {
-			debugPrintf("Error: failed to load archive 2");
-			return true;
-		}
-
-		// Store command
-		if (!hasCommand()) {
-			_command = WRAP_METHOD(Debugger, cmdBeetle);
-			copyCommand(argc, argv);
-
-			return false;
-		} else {
-			clearBg(GraphicsManagerOld::kBackgroundAll);
-			askForRedraw();
-			redrawScreen();
-
-			// Save current state
-			SceneIndex previousScene = getState()->scene;
-			ObjectLocation previousLocation = getInventory()->get(kItemBeetle)->location;
-			ChapterIndex previousChapter = (ChapterIndex)getProgress().chapter;
-
-			// Setup scene & inventory
-			getProgress().chapter = kChapter2;
-			Scene *scene = getScenes()->get(kSceneBeetle);
-			getInventory()->get(kItemBeetle)->location = kObjectLocation3;
-
-			askForRedraw();
-			redrawScreen();
-
-			// Load the beetle game
-			Action *action = nullptr;
-			Beetle *beetle = new Beetle(_engine);
-			if (!beetle->isLoaded())
-				beetle->load();
-
-			// Play the game
-			Common::Event ev;
-			bool playgame = true;
-			while (playgame) {
-				// Update beetle
-				beetle->update();
-
-				askForRedraw();
-				redrawScreen();
-
-				while (g_system->getEventManager()->pollEvent(ev)) {
-
-					switch (ev.type) {
-					default:
-						break;
-
-					case Common::EVENT_KEYDOWN:
-						// Exit beetle game on escape
-						if (ev.kbd.keycode == Common::KEYCODE_ESCAPE)
-							playgame = false;
-
-						break;
-
-					case Common::EVENT_MOUSEMOVE: {
-						// Update cursor
-						CursorStyle style = kCursorNormal;
-						SceneHotspot *hotspot = nullptr;
-						if (scene->checkHotSpot(ev.mouse, &hotspot)) {
-							if (!action)
-								action = new Action(_engine);
-
-							style = action->getCursor(*hotspot);
-						}
-
-						_engine->getCursor()->setStyle(style);
-						break;
-					}
-
-					case Common::EVENT_LBUTTONUP:
-					case Common::EVENT_RBUTTONUP:
-						// Update coordinates
-						getLogic()->getGameState()->setCoordinates(ev.mouse);
-
-						if (beetle->catchBeetle())
-							playgame = false;
-						break;
-					}
-
-					_engine->_system->delayMillis(10);
-				}
-			}
-
-			// Cleanup
-			beetle->unload();
-			delete beetle;
-			delete action;
-
-			// Pause for a second to be able to see the final scene
-			_engine->_system->delayMillis(1000);
-
-			// Restore state
-			getProgress().chapter = previousChapter;
-			getInventory()->get(kItemBeetle)->location = previousLocation;
-
-			// Restore loaded archive
-			restoreArchive();
-
-			// Stop audio and restore scene
-			getSoundQueue()->stopAllSound();
-
-			clearBg(GraphicsManagerOld::kBackgroundAll);
-
-			Scene *oldScene = getScenes()->get(previousScene);
-			_engine->getGraphicsManagerOld()->draw(oldScene, GraphicsManagerOld::kBackgroundC);
-
-			askForRedraw();
-			redrawScreen();
-
-			resetCommand();
-		}
-	} else {
-		debugPrintf("Syntax: beetle\n");
-	}
-
-	return true;
-}
-
-/**
- * Command: adjusts the time delta
- *
- * @param argc The argument count.
- * @param argv The values.
- *
- * @return true if it was handled, false otherwise
- */
-bool Debugger::cmdTimeDelta(int argc, const char **argv) {
-	if (argc == 2) {
-		int delta = getNumber(argv[1]);
-
-		if (delta <= 0 || delta > 500)
-			goto label_error;
-
-		getState()->timeDelta = (uint)delta;
-	} else {
-label_error:
-		debugPrintf("Syntax: delta <time delta> (delta=1-500)\n");
-	}
-
-	return true;
-}
-
-/**
- * Command: Convert between in-game time and human readable time
- *
- * @param argc The argument count.
- * @param argv The values.
- *
- * @return true if it was handled, false otherwise
- */
-bool Debugger::cmdTime(int argc, const char **argv) {
-	if (argc == 2) {
-		int32 time = getNumber(argv[1]);
-
-		if (time < 0)
-			goto label_error;
-
-		// Convert to human-readable form
-		uint8 hours = 0;
-		uint8 minutes = 0;
-		State::getHourMinutes((uint32)time, &hours, &minutes);
-
-		debugPrintf("%02d:%02d\n", hours, minutes);
-	} else {
-label_error:
-		debugPrintf("Syntax: time <time to convert> (time=0-INT_MAX)\n");
-	}
-
-	return true;
-}
-
-/**
- * Command: show game logic data
- *
- * @param argc The argument count.
- * @param argv The values.
- *
- * @return true if it was handled, false otherwise
- */
-bool Debugger::cmdShow(int argc, const char **argv) {
-#define OUTPUT_DUMP(name, text) \
-	debugPrintf(#name "\n"); \
-	debugPrintf("--------------------------------------------------------------------\n\n"); \
-	debugPrintf("%s", text); \
-	debugPrintf("\n");
-
-	if (argc == 2) {
-
-		Common::String name(const_cast<char *>(argv[1]));
-
-		if (name == "state" || name == "st") {
-			OUTPUT_DUMP("Game state", getState()->toString().c_str());
-		} else if (name == "progress" || name == "pr") {
-			OUTPUT_DUMP("Progress", getProgress().toString().c_str());
-		} else if (name == "flags" || name == "fl") {
-			OUTPUT_DUMP("Flags", getFlags()->toString().c_str());
-		} else if (name == "inventory" || name == "inv") {
-			OUTPUT_DUMP("Inventory", getInventory()->toString().c_str());
-		} else if (name == "objects" || name == "obj") {
-			OUTPUT_DUMP("Objects", getObjects()->toString().c_str());
-		} else if (name == "savepoints" || name == "pt") {
-			OUTPUT_DUMP("SavePoints", getSavePoints()->toString().c_str());
-		} else if (name == "scene" || name == "sc") {
-			OUTPUT_DUMP("Current scene", getScenes()->get(getState()->scene)->toString().c_str());
-		} else {
-			goto label_error;
-		}
-
-	} else {
-label_error:
-		debugPrintf("Syntax: state <option>\n");
-		debugPrintf("          state / st\n");
-		debugPrintf("          progress / pr\n");
-		debugPrintf("          flags / fl\n");
-		debugPrintf("          inventory / inv\n");
-		debugPrintf("          objects / obj\n");
-		debugPrintf("          savepoints / pt\n");
-		debugPrintf("          scene / sc\n");
-	}
-
-	return true;
-
-#undef OUTPUT_DUMP
-}
-
-/**
- * Command: shows character data
- *
- * @param argc The argument count.
- * @param argv The values.
- *
- * @return true if it was handled, false otherwise
- */
-bool Debugger::cmdEntity(int argc, const char **argv) {
-	if (argc == 2) {
-		CharacterIndex index = (CharacterIndex)getNumber(argv[1]);
-
-		if (index > 39)
-			goto label_error;
-
-		debugPrintf("Entity %s\n", ENTITY_NAME(index));
-		debugPrintf("--------------------------------------------------------------------\n\n");
-		debugPrintf("%s", getEntities()->getData(index)->toString().c_str());
-
-		// The Player character does not have any callback data
-		if (index != kCharacterCath) {
-			EntityData *data = getEntities()->get(index)->getParamData();
-			for (uint callback = 0; callback < 9; callback++) {
-				debugPrintf("Call parameters %d:\n", callback);
-				for (byte ix = 0; ix < 4; ix++)
-					debugPrintf("  %s", data->getParameters(callback, ix)->toString().c_str());
-			}
-		}
-
-		debugPrintf("\n");
-	} else {
-label_error:
-		debugPrintf("Syntax: character <index>\n");
-		for (int i = 0; i < 40; i += 4)
-			debugPrintf(" %s - %d        %s - %d        %s - %d        %s - %d\n", ENTITY_NAME(i), i, ENTITY_NAME(i+1), i+1, ENTITY_NAME(i+2), i+2, ENTITY_NAME(i+3), i+3);
-	}
-
-	return true;
-}
-
-/**
- * Command: switch to a specific chapter
- *
- * @param argc The argument count.
- * @param argv The values.
- *
- * @return true if it was handled, false otherwise
- */
-bool Debugger::cmdSwitchChapter(int argc, const char **argv) {
-	if (argc == 2) {
-		int id = getNumber(argv[1]);
-
-		if (id <= 1 || id > 6)
-			goto error;
-
-		// Store command
-		if (!hasCommand()) {
-			_command = WRAP_METHOD(Debugger, cmdSwitchChapter);
-			copyCommand(argc, argv);
-
-			return false;
-		} else {
-			// Sets the current chapter and then call Logic::switchChapter to proceed to the next chapter
-			getState()->progress.chapter = (ChapterIndex)(id - 1);
-
-			getLogic()->switchChapter();
-
-			resetCommand();
-		}
-	} else {
-error:
-		debugPrintf("Syntax: chapter <id> (id=2-6)\n");
-	}
-
-	return true;
-}
-
-/**
- * Command: clears the screen
- *
- * @param argc The argument count.
- * @param argv The values.
- *
- * @return true if it was handled, false otherwise
- */
-bool Debugger::cmdClear(int argc, const char **) {
-	if (argc == 1) {
-		clearBg(GraphicsManagerOld::kBackgroundAll);
-		askForRedraw();
-		redrawScreen();
-	} else {
-		debugPrintf("Syntax: clear - clear the screen\n");
-	}
-
 	return true;
 }
 
diff --git a/engines/lastexpress/debug.h b/engines/lastexpress/debug.h
index 9242a72d1b6..c978e384282 100644
--- a/engines/lastexpress/debug.h
+++ b/engines/lastexpress/debug.h
@@ -24,10 +24,6 @@
 
 #include "gui/debugger.h"
 
-#include "lastexpress/data/snd.h"
-
-#include "lastexpress/shared.h"
-
 namespace LastExpress {
 
 #ifdef USE_IMGUI
@@ -59,49 +55,10 @@ public:
 	Debugger(LastExpressEngine *engine);
 	~Debugger() override;
 
-	bool hasCommand() const;
-	void callCommand();
-
 private:
 	LastExpressEngine *_engine;
 
 	bool cmdHelp(int argc, const char **argv);
-
-	bool cmdListFiles(int argc, const char **argv);
-	bool cmdDumpFiles(int argc, const char **argv);
-
-	bool cmdShowFrame(int argc, const char **argv);
-	bool cmdShowBg(int argc, const char **argv);
-	bool cmdPlaySeq(int argc, const char **argv);
-	bool cmdPlaySnd(int argc, const char **argv);
-	bool cmdPlaySbe(int argc, const char **argv);
-	bool cmdPlayNis(int argc, const char **argv);
-
-	bool cmdLoadScene(int argc, const char **argv);
-	bool cmdFight(int argc, const char **argv);
-	bool cmdBeetle(int argc, const char **argv);
-
-	bool cmdTimeDelta(int argc, const char **argv);
-	bool cmdTime(int argc, const char **argv);
-	bool cmdShow(int argc, const char **argv);
-	bool cmdEntity(int argc, const char **argv);
-
-	bool cmdSwitchChapter(int argc, const char **argv);
-	bool cmdClear(int argc, const char **argv);
-
-	void resetCommand();
-	void copyCommand(int argc, const char **argv);
-	int getNumber(const char *arg) const;
-
-	bool loadArchive(int index);
-	void restoreArchive() const;
-
-	Debuglet *_command;
-	int _numParams;
-	char **_commandParams;
-
-	// Special sound stream for playing sounds
-	StreamedSound *_soundStream;
 };
 
 } // End of namespace LastExpress
diff --git a/engines/lastexpress/drawable.h b/engines/lastexpress/drawable.h
deleted file mode 100644
index c27b639e984..00000000000
--- a/engines/lastexpress/drawable.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/* 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 3 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, see <http://www.gnu.org/licenses/>.
- *
- */
-
-#ifndef LASTEXPRESS_DRAWABLE_H
-#define LASTEXPRESS_DRAWABLE_H
-
-#include "graphics/surface.h"
-
-namespace LastExpress {
-
-class Drawable {
-public:
-	virtual ~Drawable() {}
-
-	virtual Common::Rect draw(Graphics::Surface *surface) = 0;
-};
-
-} // End of namespace LastExpress
-
-#endif // LASTEXPRESS_DRAWABLE_H
diff --git a/engines/lastexpress/entities/abbot.cpp b/engines/lastexpress/entities/abbot.cpp
deleted file mode 100644
index 4047421ffc6..00000000000
--- a/engines/lastexpress/entities/abbot.cpp
+++ /dev/null
@@ -1,1921 +0,0 @@
-/* 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 3 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, see <http://www.gnu.org/licenses/>.
- *
- */
-
-#include "lastexpress/entities/abbot.h"
-
-#include "lastexpress/entities/verges.h"
-
-#include "lastexpress/game/action.h"
-#include "lastexpress/game/entities.h"
-#include "lastexpress/game/inventory.h"
-#include "lastexpress/game/logic.h"
-#include "lastexpress/game/object.h"
-#include "lastexpress/game/savepoint.h"
-#include "lastexpress/game/scenes.h"
-#include "lastexpress/game/state.h"
-
-#include "lastexpress/sound/queue.h"
-
-#include "lastexpress/lastexpress.h"
-
-namespace LastExpress {
-
-Abbot::Abbot(LastExpressEngine *engine) : Entity(engine, kCharacterAbbot) {
-	ADD_CALLBACK_FUNCTION(Abbot, reset);
-	ADD_CALLBACK_FUNCTION_S(Abbot, draw);
-	ADD_CALLBACK_FUNCTION_SI(Abbot, enterExitCompartment);
-	ADD_CALLBACK_FUNCTION_SI(Abbot, enterExitCompartment2);
-	ADD_CALLBACK_FUNCTION(Abbot, callbackActionOnDirection);
-	ADD_CALLBACK_FUNCTION_SSI(Abbot, draw2);
-	ADD_CALLBACK_FUNCTION_I(Abbot, updateFromTime);
-	ADD_CALLBACK_FUNCTION_I(Abbot, updateFromTicks);
-	ADD_CALLBACK_FUNCTION_S(Abbot, playSound);
-	ADD_CALLBACK_FUNCTION_II(Abbot, savegame);
-	ADD_CALLBACK_FUNCTION_II(Abbot, updateEntity);
-	ADD_CALLBACK_FUNCTION_SIIS(Abbot, callSavepoint);
-	ADD_CALLBACK_FUNCTION_SII(Abbot, updatePosition);
-	ADD_CALLBACK_FUNCTION(Abbot, callbackActionRestaurantOrSalon);
-	ADD_CALLBACK_FUNCTION(Abbot, chapter1);
-	ADD_CALLBACK_FUNCTION(Abbot, chapter2);
-	ADD_CALLBACK_FUNCTION(Abbot, chapter3);
-	ADD_CALLBACK_FUNCTION(Abbot, inKitchen);
-	ADD_CALLBACK_FUNCTION(Abbot, openCompartment);
-	ADD_CALLBACK_FUNCTION(Abbot, readPaper);
-	ADD_CALLBACK_FUNCTION(Abbot, goToLunch);
-	ADD_CALLBACK_FUNCTION(Abbot, haveLunch);
-	ADD_CALLBACK_FUNCTION(Abbot, leaveLunch);
-	ADD_CALLBACK_FUNCTION(Abbot, closedCompartment);
-	ADD_CALLBACK_FUNCTION(Abbot, goSalon1);
-	ADD_CALLBACK_FUNCTION(Abbot, inSalon1);
-	ADD_CALLBACK_FUNCTION(Abbot, goCompartment);
-	ADD_CALLBACK_FUNCTION(Abbot, openCompartment2);
-	ADD_CALLBACK_FUNCTION(Abbot, goWander);
-	ADD_CALLBACK_FUNCTION(Abbot, goSalon2);
-	ADD_CALLBACK_FUNCTION(Abbot, inSalon2);
-	ADD_CALLBACK_FUNCTION(Abbot, goCompartment3);
-	ADD_CALLBACK_FUNCTION(Abbot, openCompartment3);
-	ADD_CALLBACK_FUNCTION(Abbot, goSalon3);
-	ADD_CALLBACK_FUNCTION(Abbot, inSalon3);
-	ADD_CALLBACK_FUNCTION(Abbot, withAugust);
-	ADD_CALLBACK_FUNCTION(Abbot, goCompartment4);
-	ADD_CALLBACK_FUNCTION(Abbot, inCompartment4);
-	ADD_CALLBACK_FUNCTION(Abbot, chapter4);
-	ADD_CALLBACK_FUNCTION_II(Abbot, doWalkSearchingForCath);
-	ADD_CALLBACK_FUNCTION(Abbot, chapter4Handler);
-	ADD_CALLBACK_FUNCTION(Abbot, leaveDinner);
-	ADD_CALLBACK_FUNCTION(Abbot, inCompartment);
-	ADD_CALLBACK_FUNCTION(Abbot, function44);
-	ADD_CALLBACK_FUNCTION(Abbot, conferring);
-	ADD_CALLBACK_FUNCTION(Abbot, goSalon4);
-	ADD_CALLBACK_FUNCTION(Abbot, beforeBomb);
-	ADD_CALLBACK_FUNCTION(Abbot, afterBomb);
-	ADD_CALLBACK_FUNCTION(Abbot, catchCath);
-	ADD_CALLBACK_FUNCTION(Abbot, chapter5);
-	ADD_CALLBACK_FUNCTION(Abbot, chapter5Handler);
-	ADD_CALLBACK_FUNCTION(Abbot, function52);
-	ADD_CALLBACK_FUNCTION(Abbot, runningTrain);
-}
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(1, Abbot, reset)
-	Entity::reset(savepoint);
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION_S(2, Abbot, draw)
-	Entity::draw(savepoint);
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION_SI(3, Abbot, enterExitCompartment, ObjectIndex)
-	Entity::enterExitCompartment(savepoint);
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION_SI(4, Abbot, enterExitCompartment2, ObjectIndex)
-	Entity::enterExitCompartment(savepoint, kPosition_6470, kPosition_6130, kCarRedSleeping, kObjectCompartmentC, true, true);
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(5, Abbot, callbackActionOnDirection)
-	Entity::callbackActionOnDirection(savepoint);
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION_SSI(6, Abbot, draw2, CharacterIndex)
-	Entity::draw2(savepoint);
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION_I(7, Abbot, updateFromTime, uint32)
-	Entity::updateFromTime(savepoint);
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION_I(8, Abbot, updateFromTicks, uint32)
-	Entity::updateFromTicks(savepoint);
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION_S(9, Abbot, playSound)
-	Entity::playSound(savepoint);
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION_II(10, Abbot, savegame, SavegameType, uint32)
-	Entity::savegame(savepoint);
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION_II(11, Abbot, updateEntity, CarIndex, EntityPosition)
-	if (savepoint.action == kCharacterActionExcuseMeCath) {
-		if (getEntities()->isPlayerPosition(kCarGreenSleeping, 18) || getEntities()->isPlayerPosition(kCarRedSleeping, 18)) {
-			getSound()->excuseMe(kCharacterAbbot);
-		} else {
-			if (HELPERgetEvent(kEventAbbotIntroduction))
-				getSound()->playSound(kCharacterCath, "CAT1013");
-			else
-				getSound()->excuseMeCath();
-		}
-		return;
-	}
-
-	Entity::updateEntity(savepoint, true);
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION_SIIS(12, Abbot, callSavepoint, CharacterIndex, CharacterActions)
-	Entity::callSavepoint(savepoint);
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION_SII(13, Abbot, updatePosition, CarIndex, PositionOld)
-	Entity::updatePosition(savepoint);
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(14, Abbot, callbackActionRestaurantOrSalon)
-	Entity::callbackActionRestaurantOrSalon(savepoint);
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(15, Abbot, chapter1)
-	if (savepoint.action == kCharacterActionDefault)
-		getSavePoints()->addData(kCharacterAbbot, kCharacterAction203073664, 0);
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(16, Abbot, chapter2)
-	if (savepoint.action == kCharacterActionDefault)
-		getEntities()->clearSequences(kCharacterAbbot);
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(17, Abbot, chapter3)
-	switch (savepoint.action) {
-	default:
-		break;
-
-	case kCharacterActionNone:
-		setup_inKitchen();
-		break;
-
-	case kCharacterActionDefault:
-		getEntities()->clearSequences(kCharacterAbbot);
-
-		getData()->entityPosition = kPosition_5900;
-		getData()->location = kLocationInsideCompartment;
-		getData()->car = kCarRestaurant;
-		getData()->inventoryItem = kItemNone;
-		getData()->clothes = kClothesDefault;
-
-		break;
-	}
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(18, Abbot, inKitchen)
-	switch (savepoint.action) {
-	default:
-		break;
-
-	case kCharacterActionCallback:
-		switch (getCallback()) {
-		default:
-			break;
-
-		case 1:
-			getData()->entityPosition = kPosition_5800;
-			getData()->location = kLocationOutsideCompartment;
-
-			setCallback(2);
-			setup_draw("804DD");
-			break;
-
-		case 2:
-			getSavePoints()->push(kCharacterAbbot, kCharacterCook, kCharacterAction236976550);
-			getEntities()->drawSequenceRight(kCharacterAbbot, "804DS");
-
-			if (getEntities()->isInRestaurant(kCharacterCath))
-				getEntities()->updateFrame(kCharacterAbbot);
-
-			setCallback(3);
-			setup_callbackActionOnDirection();
-			break;
-
-		case 3:
-			setCallback(4);
-			setup_updateEntity(kCarRedSleeping, kPosition_6470);
-			break;
-
-		case 4:
-			getObjects()->update(kObjectCompartmentC, kCharacterCath, kObjectLocation1, kCursorKeepValue, kCursorKeepValue);
-
-			setCallback(5);
-			setup_enterExitCompartment("617AC", kObjectCompartmentC);
-			break;
-
-		case 5:
-			getObjects()->update(kObjectCompartmentC, kCharacterCath, kObjectLocation2, kCursorKeepValue, kCursorKeepValue);
-			getData()->entityPosition = kPosition_6470;
-			getData()->location = kLocationInsideCompartment;
-
-			setup_openCompartment();
-			break;
-		}
-		break;
-
-	case kCharacterAction192054567:
-		setCallback(1);
-		setup_callbackActionRestaurantOrSalon();
-		break;
-	}
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(19, Abbot, openCompartment)
-	switch (savepoint.action) {
-	default:
-		break;
-
-	case kCharacterActionNone:
-		if (getState()->time > kTime1953000) {
-			if (!params->param1) {
-				params->param1 = 1;
-				setCallback(3);
-				setup_playSound("MrB3010");
-			}
-		}
-		break;
-
-	case kCharacterActionDefault:
-		getEntities()->drawSequenceLeft(kCharacterAbbot, "508A");
-		getSavePoints()->push(kCharacterAbbot, kCharacterMonsieur, kCharacterAction122358304);
-
-		setCallback(1);
-		setup_playSound("Abb3010");
-		break;
-
-	case kCharacterActionCallback:
-		switch (getCallback()) {
-		default:
-			break;
-
-		case 1:
-			setCallback(2);
-			setup_updateFromTime(900);
-			break;
-
-		case 2:
-			getEntities()->drawSequenceLeft(kCharacterAbbot, "508B");
-			break;
-
-		case 3:
-			getSavePoints()->push(kCharacterAbbot, kCharacterMonsieur, kCharacterAction122288808);
-			setup_readPaper();
-			break;
-		}
-	}
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(20, Abbot, readPaper)
-	switch (savepoint.action) {
-	default:
-		break;
-
-	case kCharacterActionNone:
-		if (getState()->time > kTime1966500 && getEntities()->isInRestaurant(kCharacterMonsieur))
-			setup_goToLunch();
-		break;
-
-	case kCharacterActionDefault:
-		getEntities()->drawSequenceLeft(kCharacterAbbot, "509A");
-		break;
-	}
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(21, Abbot, goToLunch)
-	switch (savepoint.action) {
-	default:
-		break;
-
-	case kCharacterActionDefault:
-		setCallback(1);
-		setup_draw("509B");
-		break;
-
-	case kCharacterActionCallback:
-		switch (getCallback()) {
-		default:
-			break;
-
-		case 1:
-			getObjects()->update(kObjectCompartmentC, kCharacterCath, kObjectLocationNone, kCursorHandKnock, kCursorHand);
-			getObjects()->update(kObject50, kCharacterCath, kObjectLocationNone, kCursorHandKnock, kCursorHand);
-
-			setCallback(2);
-			setup_enterExitCompartment("617Mc", kObjectCompartmentC);
-			break;
-
-		case 2:
-			getData()->location = kLocationOutsideCompartment;
-
-			setCallback(3);
-			setup_updateEntity(kCarRestaurant, kPosition_850);
-			break;
-
-		case 3:
-			setCallback(4);
-			setup_callbackActionRestaurantOrSalon();
-			break;
-
-		case 4:
-			getData()->entityPosition = kPosition_1540;
-			getData()->location = kLocationOutsideCompartment;
-
-			setCallback(5);
-			setup_draw("804US");
-			break;
-
-		case 5:
-			getEntities()->drawSequenceRight(kCharacterAbbot, "029J");
-			if (getEntities()->isInSalon(kCharacterCath))
-				getEntities()->updateFrame(kCharacterAbbot);
-
-			setCallback(6);
-			setup_callbackActionOnDirection();
-			break;
-
-		case 6:
-			getEntities()->drawSequenceLeft(kCharacterAbbot, "029H");
-			getSavePoints()->push(kCharacterAbbot, kCharacterHeadWait, kCharacterAction207769280);
-			break;
-
-		case 7:
-			setup_haveLunch();
-			break;
-		}
-		break;
-
-	case kCharacterAction122288808:
-		getSavePoints()->push(kCharacterAbbot, kCharacterTableE, kCharacterAction136455232);
-		getData()->location = kLocationInsideCompartment;
-
-		setCallback(7);
-		setup_draw("029B");
-		break;
-	}
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(22, Abbot, haveLunch)
-	switch (savepoint.action) {
-	default:
-		break;
-
-	case kCharacterActionNone:
-		Entity::timeCheckSavepoint(kTime1971000, params->param1, kCharacterAbbot, kCharacterWaiter1, kCharacterAction218586752);
-
-		if (getState()->time > kTime1989000 && getEntities()->isSomebodyInsideRestaurantOrSalon()) {
-			getData()->inventoryItem = kItemNone;
-			setup_leaveLunch();
-		}
-		break;
-
-	case kCharacterAction1:
-		getData()->inventoryItem = kItemNone;
-
-		setCallback(1);
-		setup_savegame(kSavegameTypeEvent, kEventAbbotIntroduction);
-		break;
-
-	case kCharacterActionDefault:
-		getEntities()->drawSequenceLeft(kCharacterAbbot, "029E");
-		if (!HELPERgetEvent(kEventAbbotIntroduction))
-			getData()->inventoryItem = (InventoryItem)kCursorProcess;
-		break;
-
-	case kCharacterActionCallback:
-		if (getCallback() != 1)
-			break;
-
-		getActionOld()->playAnimation(kEventAbbotIntroduction);
-		getSound()->playSound(kCharacterCath, "LIB036");
-		getScenes()->loadSceneFromPosition(kCarRestaurant, 61);
-		break;
-
-	case kCharacterAction122288808:
-		getEntities()->drawSequenceLeft(kCharacterAbbot, "029E");
-		break;
-
-	case kCharacterAction122358304:
-		getEntities()->drawSequenceLeft(kCharacterAbbot, "BLANK");
-		break;
-	}
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(23, Abbot, leaveLunch)
-	switch (savepoint.action) {
-	default:
-		break;
-
-	case kCharacterActionDefault:
-		getData()->location = kLocationOutsideCompartment;
-		getEntities()->updatePositionEnter(kCharacterAbbot, kCarRestaurant, 67);
-
-		setCallback(1);
-		setup_callSavepoint("029F", kCharacterTableE, kCharacterActionDrawTablesWithChairs, "029G");
-		break;
-
-	case kCharacterActionCallback:
-		switch (getCallback()) {
-		default:
-			break;
-
-		case 1:
-			getEntities()->updatePositionExit(kCharacterAbbot, kCarRestaurant, 67);
-			getSavePoints()->push(kCharacterAbbot, kCharacterWaiter1, kCharacterAction270068760);
-			getSavePoints()->push(kCharacterAbbot, kCharacterAnna, kCharacterAction238936000);
-			getEntities()->drawSequenceRight(kCharacterAbbot, "804DS");
-
-			if (getEntities()->isInRestaurant(kCharacterCath))
-				getEntities()->updateFrame(kCharacterAbbot);
-
-			setCallback(2);
-			setup_callbackActionOnDirection();
-			break;
-
-		case 2:
-			setCallback(3);
-			setup_updateEntity(kCarRedSleeping, kPosition_6470);
-			break;
-
-		case 3:
-			setCallback(4);
-			setup_enterExitCompartment2("617Cc", kObjectCompartmentC);
-			break;
-
-		case 4:
-			getData()->location = kLocationInsideCompartment;
-
-			setup_closedCompartment();
-			break;
-		}
-		break;
-	}
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(24, Abbot, closedCompartment)
-	switch (savepoint.action) {
-	default:
-		break;
-
-	case kCharacterActionNone:
-		if (!Entity::updateParameter(params->param1, getState()->time, 900))
-			break;
-
-		setup_goSalon1();
-		break;
-
-	case kCharacterActionKnock:
-	case kCharacterActionOpenDoor:
-		getObjects()->update(kObjectCompartmentC, kCharacterAbbot, kObjectLocation1, kCursorNormal, kCursorNormal);
-		getObjects()->update(kObject50, kCharacterAbbot, kObjectLocation1, kCursorNormal, kCursorNormal);
-
-		if (savepoint.action == kCharacterActionKnock) {
-			setCallback(1);
-			setup_playSound("LIB012");
-		} else {
-			setCallback(2);
-			setup_playSound("LIB013");
-		}
-		break;
-
-	case kCharacterActionDefault:
-		getEntities()->clearSequences(kCharacterAbbot);
-		getObjects()->update(kObjectCompartmentC, kCharacterAbbot, kObjectLocationNone, kCursorHandKnock, kCursorHand);
-		getObjects()->update(kObject50, kCharacterAbbot, kObjectLocationNone, kCursorHandKnock, kCursorHand);
-		break;
-
-	case kCharacterActionCallback:
-		switch (getCallback()) {
-		default:
-			break;
-
-		case 1:
-		case 2:
-			setCallback(3);
-			setup_playSound("Abb3001");
-			break;
-
-		case 3:
-			getObjects()->update(kObjectCompartmentC, kCharacterAbbot, kObjectLocation1, kCursorHandKnock, kCursorHand);
-			getObjects()->update(kObject50, kCharacterAbbot, kObjectLocation1, kCursorHandKnock, kCursorHand);
-			break;
-		}
-		break;
-	}
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(25, Abbot, goSalon1)
-	switch (savepoint.action) {
-	default:
-		break;
-
-	case kCharacterActionDefault:
-		setCallback(1);
-		setup_enterExitCompartment("617Dc", kObjectCompartmentC);
-		break;
-
-	case kCharacterActionCallback:
-		switch (getCallback()) {
-		default:
-			break;
-
-		case 1:
-			getData()->location = kLocationOutsideCompartment;
-			getObjects()->update(kObjectCompartmentC, kCharacterCath, kObjectLocationNone, kCursorHandKnock, kCursorHand);
-			getObjects()->update(kObject50, kCharacterCath, kObjectLocationNone, kCursorHandKnock, kCursorHand);
-
-			setCallback(2);
-			setup_updateEntity(kCarRestaurant,  kPosition_850);
-			break;
-
-		case 2:
-			setCallback(3);
-			setup_callbackActionRestaurantOrSalon();
-			break;
-
-		case 3:
-			getData()->entityPosition = kPosition_1540;
-			getData()->location = kLocationOutsideCompartment;
-
-			setCallback(4);
-			setup_updatePosition("115A", kCarRestaurant, 56);
-			break;
-
-		case 4:
-			getData()->location = kLocationInsideCompartment;
-			getScenes()->loadSceneFromItemPosition(kItem3);
-
-			setup_inSalon1();
-			break;
-		}
-		break;
-	}
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(26, Abbot, inSalon1)
-	switch (savepoint.action) {
-	default:
-		break;
-
-	case kCharacterActionNone:
-		if (!params->param1 || !Entity::updateParameterCheck(params->param2, getState()->time, 4500))
-			break;
-
-		if (getEntities()->isSomebodyInsideRestaurantOrSalon())
-			setup_goCompartment();
-		break;
-
-	case kCharacterActionDefault:
-		getSavePoints()->push(kCharacterAbbot, kCharacterKronos, kCharacterAction157159392);
-		getEntities()->drawSequenceLeft(kCharacterAbbot, "115B");
-		break;
-
-	case kCharacterAction101169422:
-		params->param1 = 1;
-		break;
-
-	}
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(27, Abbot, goCompartment)
-	switch (savepoint.action) {
-	default:
-		break;
-
-	case kCharacterActionDefault:
-		setCallback(1);
-		setup_callbackActionRestaurantOrSalon();
-		break;
-
-	case kCharacterActionCallback:
-		switch (getCallback()) {
-		default:
-			break;
-
-		case 1:
-			getData()->location = kLocationOutsideCompartment;
-
-			setCallback(2);
-			setup_updatePosition("115C", kCarRestaurant, 56);
-			break;
-
-		case 2:
-			getInventory()->setLocationAndProcess(kItem3, kObjectLocation1);
-
-			setCallback(3);
-			setup_updateEntity(kCarRedSleeping, kPosition_6470);
-			break;
-
-		case 3:
-			getObjects()->update(kObjectCompartmentC, kCharacterCath, kObjectLocation1, kCursorKeepValue, kCursorKeepValue);
-
-			setCallback(4);
-			setup_enterExitCompartment("617Ac", kObjectCompartmentC);
-			break;
-
-		case 4:
-			getObjects()->update(kObjectCompartmentC, kCharacterCath, kObjectLocation2, kCursorKeepValue, kCursorKeepValue);
-			getData()->entityPosition = kPosition_6470;
-			getData()->location = kLocationInsideCompartment;
-
-			setup_openCompartment2();
-			break;
-		}
-		break;
-	}
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(28, Abbot, openCompartment2)
-	switch (savepoint.action) {
-	default:
-		break;
-
-	case kCharacterActionNone:
-		Entity::timeCheckCallback(kTime2052000, params->param1, 2, WRAP_SETUP_FUNCTION(Abbot, setup_goWander));
-		break;
-
-	case kCharacterActionDefault:
-		getSavePoints()->push(kCharacterAbbot, kCharacterMonsieur, kCharacterAction122358304);
-		getEntities()->drawSequenceLeft(kCharacterAbbot, "508A");
-
-		setCallback(1);
-		setup_playSound("Abb3013");
-		break;
-
-	case kCharacterActionCallback:
-		if (getCallback() == 1)
-			getEntities()->drawSequenceLeft(kCharacterAbbot, "508B");
-		break;
-
-	case kCharacterAction222609266:
-		setup_goSalon2();
-	}
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(29, Abbot, goWander)
-	switch (savepoint.action) {
-	default:
-		break;
-
-	case kCharacterActionDefault:
-		getSavePoints()->push(kCharacterAbbot, kCharacterMonsieur, kCharacterAction122288808);
-		getObjects()->update(kObjectCompartmentC, kCharacterCath, kObjectLocation1, kCursorKeepValue, kCursorKeepValue);
-
-		setCallback(1);
-		setup_enterExitCompartment("617Bc", kObjectCompartmentC);
-		break;
-
-	case kCharacterActionCallback:
-		switch (getCallback()) {
-		default:
-			break;
-
-		case 1:
-			getObjects()->update(kObjectCompartmentC, kCharacterCath, kObjectLocation2, kCursorKeepValue, kCursorKeepValue);
-
-			setCallback(2);
-			setup_updateEntity(kCarRedSleeping, kPosition_9460);
-			break;
-
-		case 2:
-			setCallback(3);
-			setup_updateFromTicks(450);
-			break;
-
-		case 3:
-			setCallback(4);
-			setup_updateEntity(kCarGreenSleeping, kPosition_540);
-			break;
-
-		case 4:
-			// compare with callback 2.
-			// This is taken from the original game as is,
-			// but do we really want real-time 30s in case 2 but simulated-time 15s (aka real-time 5s) here?
-			setCallback(5);
-			setup_updateFromTime(225);
-			break;
-
-		case 5:
-			setCallback(6);
-			setup_updateEntity(kCarRedSleeping, kPosition_6470);
-			break;
-
-		case 6:
-			getObjects()->update(kObjectCompartmentC, kCharacterCath, kObjectLocation1, kCursorKeepValue, kCursorKeepValue);
-
-			setCallback(7);
-			setup_enterExitCompartment("617Ac", kObjectCompartmentC);
-			break;
-
-		case 7:
-			getObjects()->update(kObjectCompartmentC, kCharacterCath, kObjectLocation2, kCursorKeepValue, kCursorKeepValue);
-			getSavePoints()->push(kCharacterAbbot, kCharacterMonsieur, kCharacterAction122358304);
-			getEntities()->drawSequenceLeft(kCharacterAbbot, "508B");
-
-			callbackAction();
-			break;
-		}
-		break;
-	}
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(30, Abbot, goSalon2)
-switch (savepoint.action) {
-	default:
-		break;
-
-	case kCharacterActionDefault:
-		setCallback(1);
-		setup_playSound("Abb3030");
-		break;
-
-	case kCharacterActionCallback:
-		switch (getCallback()) {
-		default:
-			break;
-
-		case 1:
-			getSavePoints()->push(kCharacterAbbot, kCharacterMonsieur, kCharacterAction122288808);
-			getObjects()->update(kObjectCompartmentC, kCharacterCath, kObjectLocation1, kCursorKeepValue, kCursorKeepValue);
-
-			setCallback(2);
-			setup_enterExitCompartment("617Bc", kObjectCompartmentC);
-			break;
-
-		case 2:
-			getObjects()->update(kObjectCompartmentC, kCharacterCath, kObjectLocation2, kCursorKeepValue, kCursorKeepValue);
-			getData()->location = kLocationOutsideCompartment;
-
-			setCallback(3);
-			setup_updateEntity(kCarRestaurant, kPosition_850);
-			break;
-
-		case 3:
-			setCallback(4);
-			setup_callbackActionRestaurantOrSalon();
-			break;
-
-		case 4:
-			getData()->entityPosition = kPosition_1540;
-			getData()->location = kLocationOutsideCompartment;
-
-			setCallback(5);
-			setup_updatePosition("115A", kCarRestaurant, 56);
-			break;
-
-		case 5:
-			getScenes()->loadSceneFromItemPosition(kItem3);
-			getData()->location = kLocationInsideCompartment;
-
-			setup_inSalon2();
-			break;
-		}
-		break;
-	}
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(31, Abbot, inSalon2)
-	switch (savepoint.action) {
-	default:
-		break;
-
-	case kCharacterActionNone:
-		if (params->param4 != kTimeInvalid && params->param2 < getState()->time) {
-			if (params->param3 < getState()->time) {
-				params->param4 = kTimeInvalid;
-
-				setCallback(1);
-				setup_callbackActionRestaurantOrSalon();
-				break;
-			} else {
-				if (!getEntities()->isInSalon(kCharacterCath) || !params->param4)
-					params->param4 = (uint)getState()->time + 450;
-
-				if (params->param4 < getState()->time) {
-					params->param4 = kTimeInvalid;
-
-					setCallback(1);
-					setup_callbackActionRestaurantOrSalon();
-					break;
-				}
-			}
-		}
-
-		if (!params->param1)
-			break;
-
-		if (!Entity::updateParameter(params->param5, getState()->time, 450))
-			break;
-
-		setCallback(6);
-		setup_callbackActionRestaurantOrSalon();
-		break;
-
-	case kCharacterActionDefault:
-		params->param2 = (uint)getState()->time + 4500;
-		params->param3 = (uint)getState()->time + 18000;
-
-		getEntities()->drawSequenceLeft(kCharacterAbbot, "115B");
-		break;
-
-	case kCharacterActionCallback:
-		switch (getCallback()) {
-		default:
-			break;
-
-		case 1:
-			getData()->location = kLocationOutsideCompartment;
-
-			setCallback(2);
-			setup_updatePosition("115E", kCarRestaurant, 56);
-			break;
-
-		case 2:
-			getInventory()->setLocationAndProcess(kItem3, kObjectLocation1);
-			getSavePoints()->push(kCharacterAbbot, kCharacterAlexei, kCharacterAction122358304);
-			getSound()->playSound(kCharacterAbbot, "Abb3020");
-
-			setCallback(3);
-			setup_updatePosition("125A", kCarRestaurant, 52);
-			break;
-
-		case 3:
-			getData()->location = kLocationInsideCompartment;
-			getEntities()->drawSequenceLeft(kCharacterAbbot, "125B");
-
-			setCallback(4);
-			setup_playSound("Abb3021");
-			break;
-
-		case 4:
-			getSound()->playSound(kCharacterAbbot, "Abb3023");
-			getEntities()->updatePositionEnter(kCharacterAbbot, kCarRestaurant, 52);
-
-			setCallback(5);
-			setup_draw2("125C1", "125C2", kCharacterAlexei);
-			break;
-
-		case 5:
-			getEntities()->updatePositionExit(kCharacterAbbot, kCarRestaurant, 52);
-			getEntities()->drawSequenceLeft(kCharacterAbbot, "125D");
-			getSavePoints()->push(kCharacterAbbot, kCharacterAlexei, kCharacterAction122288808);
-			params->param1 = 1;
-
-			if (!Entity::updateParameter(params->param5, getState()->time, 450))
-				break;
-
-			setCallback(6);
-			setup_callbackActionRestaurantOrSalon();
-			break;
-
-		case 6:
-			getData()->location = kLocationOutsideCompartment;
-
-			setCallback(7);
-			setup_updatePosition("125E", kCarRestaurant, 52);
-			break;
-
-		case 7:
-			setup_goCompartment3();
-			break;
-		}
-		break;
-	}
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(32, Abbot, goCompartment3)
-	switch (savepoint.action) {
-	default:
-		break;
-
-	case kCharacterActionDefault:
-		setCallback(1);
-		setup_updateEntity(kCarRedSleeping, kPosition_6470);
-		break;
-
-	case kCharacterActionCallback:
-		switch (getCallback()) {
-		default:
-			break;
-
-		case 1:
-			getObjects()->update(kObjectCompartmentC, kCharacterCath, kObjectLocation1, kCursorKeepValue, kCursorKeepValue);
-
-			setCallback(2);
-			setup_enterExitCompartment("617Ac", kObjectCompartmentC);
-			break;
-
-		case 2:
-			getObjects()->update(kObjectCompartmentC, kCharacterCath, kObjectLocation2, kCursorKeepValue, kCursorKeepValue);
-			getData()->entityPosition = kPosition_6470;
-			getData()->location = kLocationInsideCompartment;
-			getSavePoints()->push(kCharacterAbbot, kCharacterMonsieur, kCharacterAction122358304);
-
-			setup_openCompartment3();
-			break;
-		}
-		break;
-	}
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(33, Abbot, openCompartment3)
-	switch (savepoint.action) {
-	default:
-		break;
-
-	case kCharacterActionNone:
-		if (params->param1 != kTimeInvalid && getState()->time > kTime2115000) {
-			if (getState()->time <= kTime2124000) {
-				if (!getEntities()->isDistanceBetweenEntities(kCharacterAbbot, kCharacterCath, 2000) || !params->param1)
-					params->param1 = (uint)getState()->time;
-
-				if (params->param1 >= getState()->time)
-					break;
-			}
-
-			params->param1 = kTimeInvalid;
-
-			setCallback(1);
-			setup_playSound("Abb3014");
-		}
-		break;
-
-	case kCharacterActionDefault:
-		getEntities()->drawSequenceLeft(kCharacterAbbot, "508A");
-		break;
-
-	case kCharacterActionCallback:
-		if (getCallback() == 1)
-			getEntities()->drawSequenceLeft(kCharacterAbbot, "508B");
-		break;
-
-	case kCharacterAction123712592:
-		setup_goSalon3();
-		break;
-	}
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(34, Abbot, goSalon3)
-	switch (savepoint.action) {
-	default:
-		break;
-
-	case kCharacterActionDefault:
-		setCallback(1);
-		setup_playSound("Abb3031");
-		break;
-
-	case kCharacterActionCallback:
-		switch (getCallback()) {
-		default:
-			break;
-
-		case 1:
-			getSavePoints()->push(kCharacterAbbot, kCharacterMonsieur, kCharacterAction122288808);
-			getObjects()->update(kObjectCompartmentC, kCharacterCath, kObjectLocation1, kCursorKeepValue, kCursorKeepValue);
-
-			setCallback(2);
-			setup_enterExitCompartment("617Bc", kObjectCompartmentC);
-			break;
-
-		case 2:
-			getObjects()->update(kObjectCompartmentC, kCharacterCath, kObjectLocation2, kCursorKeepValue, kCursorKeepValue);
-			getData()->location = kLocationOutsideCompartment;
-
-			setCallback(3);
-			setup_updateEntity(kCarRestaurant, kPosition_850);
-			break;
-
-		case 3:
-			setCallback(4);
-			setup_callbackActionRestaurantOrSalon();
-			break;
-
-		case 4:
-			getData()->entityPosition = kPosition_1540;
-			getData()->location = kLocationOutsideCompartment;
-
-			setCallback(5);
-			setup_updatePosition("115A", kCarRestaurant, 56);
-			break;
-
-		case 5:
-			getScenes()->loadSceneFromItemPosition(kItem3);
-
-			getData()->location = kLocationInsideCompartment;
-			setup_inSalon3();
-			break;
-		}
-		break;
-	}
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(35, Abbot, inSalon3)
-	switch (savepoint.action) {
-	default:
-		break;
-
-	case kCharacterActionNone:
-		if (params->param2 == kTimeInvalid)
-			break;
-
-		if (params->param1 >= getState()->time) {
-			if (!getEntities()->isInSalon(kCharacterCath) || !params->param2)
-				params->param2 = (uint)getState()->time + 450;
-
-			if (params->param2 >= getState()->time)
-				break;
-		}
-
-		params->param2 = kTimeInvalid;
-
-		getSavePoints()->push(kCharacterAbbot, kCharacterAugust, kCharacterAction136196244);
-
-		setCallback(1);
-		setup_updateFromTime(0);
-		break;
-
-	case kCharacterActionDefault:
-		getEntities()->drawSequenceLeft(kCharacterAbbot, "115B");
-		params->param1 = (uint)getState()->time + 9000;
-		break;
-
-	case kCharacterActionCallback:
-		switch (getCallback()) {
-		default:
-			break;
-
-		case 1:
-			setCallback(2);
-			setup_callbackActionRestaurantOrSalon();
-			break;
-
-		case 2:
-			getData()->location = kLocationOutsideCompartment;
-			getSound()->playSound(kCharacterAbbot, "Abb3040", kSoundVolumeEntityDefault, 45);
-			getEntities()->updatePositionEnter(kCharacterAbbot, kCarRestaurant, 57);
-
-			setCallback(3);
-			setup_callSavepoint("121A", kCharacterAugust, kCharacterAction122358304, "BOGUS");
-			break;
-
-		case 3:
-			getEntities()->updatePositionExit(kCharacterAbbot, kCarRestaurant, 57);
-			getInventory()->setLocationAndProcess(kItem3, kObjectLocation1);
-			getData()->location = kLocationInsideCompartment;
-
-			setup_withAugust();
-			break;
-		}
-		break;
-	}
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(36, Abbot, withAugust)
-	switch (savepoint.action) {
-	default:
-		break;
-
-	case kCharacterActionNone:
-		switch (params->param2) {
-		default:
-			break;
-
-		case 1:
-			if (params->param3 == kTimeInvalid)
-				break;
-
-			if (params->param1 >= getState()->time) {
-
-				if (!getEntities()->isInSalon(kCharacterCath) || !params->param3)
-					params->param3 = (uint)getState()->time + 675;
-
-				if (params->param3 >= getState()->time)
-					break;
-			}
-
-			params->param3 = kTimeInvalid;
-
-			getSound()->playSound(kCharacterAbbot, "Abb3041");
-			break;
-
-		case 2:
-			if (!Entity::updateParameter(params->param4, getState()->time, 900))
-				break;
-
-			getSound()->playSound(kCharacterAbbot, "Abb3042");
-			break;
-
-		case 3:
-			getSound()->playSound(kCharacterAbbot, "Abb3043");
-			getEntities()->updatePositionEnter(kCharacterAbbot, kCarRestaurant, 57);
-
-			setCallback(1);
-			setup_callSavepoint("121D", kCharacterAugust, kCharacterAction122288808, "BOGUS");
-			break;
-		}
-		break;
-
-	case kCharacterActionEndSound:
-		++params->param2;
-		break;
-
-	case kCharacterActionDefault:
-		params->param1 = (uint)getState()->time + 4500;
-		getEntities()->drawSequenceLeft(kCharacterAbbot, "121B");
-		break;
-
-	case kCharacterActionDrawScene:
-		if (getEntities()->isPlayerPosition(kCarRestaurant, 57))
-			getScenes()->loadSceneFromPosition(kCarRestaurant, 50);
-		break;
-
-	case kCharacterActionCallback:
-		if (getCallback() == 1) {
-			getEntities()->updatePositionExit(kCharacterAbbot, kCarRestaurant, 57);
-			setup_goCompartment4();
-		}
-		break;
-	}
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(37, Abbot, goCompartment4)
-	switch (savepoint.action) {
-	default:
-		break;
-
-	case kCharacterActionDefault:
-		setCallback(1);
-		setup_updateEntity(kCarRedSleeping, kPosition_6470);
-		break;
-
-	case kCharacterActionCallback:
-		switch (getCallback()) {
-		default:
-			break;
-
-		case 1:
-			getObjects()->update(kObjectCompartmentC, kCharacterCath, kObjectLocation1, kCursorKeepValue, kCursorKeepValue);
-
-			setCallback(2);
-			setup_enterExitCompartment("617Ac", kObjectCompartmentC);
-			break;
-
-		case 2:
-			getObjects()->update(kObjectCompartmentC, kCharacterCath, kObjectLocation2, kCursorKeepValue, kCursorKeepValue);
-			getData()->entityPosition = kPosition_6470;
-			getData()->location = kLocationInsideCompartment;
-			getSavePoints()->push(kCharacterAbbot, kCharacterMonsieur, kCharacterAction122358304);
-
-			setup_inCompartment4();
-			break;
-		}
-		break;
-	}
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(38, Abbot, inCompartment4)
-	switch (savepoint.action) {
-	default:
-		break;
-
-	case kCharacterActionDefault:
-		getEntities()->drawSequenceLeft(kCharacterAbbot, "508A");
-
-		setCallback(1);
-		setup_playSound("Abb3014A");
-		break;
-
-	case kCharacterActionCallback:
-		if (getCallback() == 1)
-			getEntities()->drawSequenceLeft(kCharacterAbbot, "508B");
-		break;
-	}
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(39, Abbot, chapter4)
-	switch (savepoint.action) {
-	default:
-		break;
-
-	case kCharacterActionNone:
-		setup_chapter4Handler();
-		break;
-
-	case kCharacterActionDefault:
-		getEntities()->clearSequences(kCharacterAbbot);
-
-		getData()->car = kCarRestaurant;
-		getData()->inventoryItem = kItemNone;
-
-		ENTITY_PARAM(0, 1) = 0;
-
-		break;
-	}
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION_II(40, Abbot, doWalkSearchingForCath, CarIndex, EntityPosition)
-	switch (savepoint.action) {
-	default:
-		break;
-
-	case kCharacterActionNone:
-		if (getEntities()->updateEntity(kCharacterAbbot, (CarIndex)params->param1, (EntityPosition)params->param2)) {
-			callbackAction();
-		} else if (!HELPERgetEvent(kEventAbbotInvitationDrink)
-			    && getEntities()->isDistanceBetweenEntities(kCharacterAbbot, kCharacterCath, 1000)
-			    && !getEntities()->isInsideCompartments(kCharacterCath)
-			    && !getEntities()->checkFields10(kCharacterCath)) {
-
-			if (getData()->car == kCarGreenSleeping || getData()->car == kCarRedSleeping) {
-				setCallback(1);
-				setup_savegame(kSavegameTypeEvent, kEventAbbotInvitationDrink);
-			}
-		}
-		break;
-
-	case kCharacterActionDefault:
-		if (getEntities()->updateEntity(kCharacterAbbot, (CarIndex)params->param1, (EntityPosition)params->param2))
-			callbackAction();
-		break;
-
-	case kCharacterActionCallback:
-		if (getCallback() == 1) {
-			getActionOld()->playAnimation(kEventAbbotInvitationDrink);
-			getEntities()->loadSceneFromEntityPosition(getData()->car, (EntityPosition)(getData()->entityPosition + (750 * (getData()->direction == kDirectionUp ? -1 : 1))), getData()->direction == kDirectionUp);
-		}
-		break;
-	}
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(41, Abbot, chapter4Handler)
-	switch (savepoint.action) {
-	default:
-		break;
-
-	case kCharacterActionNone:
-		Entity::timeCheckSavepoint(kTime2358000, params->param1, kCharacterAbbot, kCharacterWaiter1, kCharacterAction218128129);
-
-		if (getState()->time > kTime2389500 && getEntities()->isSomebodyInsideRestaurantOrSalon())
-			setup_leaveDinner();
-
-		break;
-
-	case kCharacterActionDefault:
-		getSavePoints()->push(kCharacterAbbot, kCharacterTableE, kCharacterAction136455232);
-		getEntities()->drawSequenceLeft(kCharacterAbbot, "029E");
-		getData()->location = kLocationInsideCompartment;
-		break;
-
-	case kCharacterAction122288808:
-		getEntities()->drawSequenceLeft(kCharacterAbbot, "029E");
-		break;
-
-	case kCharacterAction122358304:
-		getEntities()->drawSequenceLeft(kCharacterAbbot, "BLANK");
-		break;
-	}
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(42, Abbot, leaveDinner)
-	switch (savepoint.action) {
-	default:
-		break;
-
-	case kCharacterActionDefault:
-		getData()->location = kLocationOutsideCompartment;
-		getEntities()->updatePositionEnter(kCharacterAbbot, kCarRestaurant, 67);
-
-		setCallback(1);
-		setup_callSavepoint("029F", kCharacterTableE, kCharacterActionDrawTablesWithChairs, "029G");
-		break;
-
-	case kCharacterActionCallback:
-		switch (getCallback()) {
-		default:
-			break;
-
-		case 1:
-			getEntities()->updatePositionExit(kCharacterAbbot, kCarRestaurant, 67);
-			getSavePoints()->push(kCharacterAbbot, kCharacterWaiter1, kCharacterAction270068760);
-			getEntities()->drawSequenceRight(kCharacterAbbot, "804DS");
-
-			if (getEntities()->isInRestaurant(kCharacterCath))
-				getEntities()->updateFrame(kCharacterAbbot);
-
-			setCallback(2);
-			setup_callbackActionOnDirection();
-			break;
-
-		case 2:
-			setCallback(3);
-			setup_updateEntity(kCarRedSleeping, kPosition_6470);
-			break;
-
-		case 3:
-			setCallback(4);
-			setup_enterExitCompartment2("617Cc", kObjectCompartmentC);
-			break;
-
-		case 4:
-			getData()->location = kLocationInsideCompartment;
-			getEntities()->clearSequences(kCharacterAbbot);
-
-			setup_inCompartment();
-			break;
-		}
-		break;
-	}
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(43, Abbot, inCompartment)
-	switch (savepoint.action) {
-	default:
-		break;
-
-	case kCharacterActionNone:
-		if (params->param1 && params->param4 != kTimeInvalid) {
-			if (getState()->time > kTime2452500) {
-				params->param4 = kTimeInvalid;
-
-				setCallback(1);
-				setup_playSound("Abb4002");
-				break;
-			} else {
-				if (!getEntities()->isDistanceBetweenEntities(kCharacterAbbot, kCharacterCath, 1000) || getSoundQueue()->isBuffered(kCharacterMonsieur) || !params->param4)
-					params->param4 = (uint)getState()->time;
-
-				if (params->param4 < getState()->time) {
-					params->param4 = kTimeInvalid;
-
-					setCallback(1);
-					setup_playSound("Abb4002");
-					break;
-				}
-			}
-		}
-
-label_callback_1:
-		if (Entity::timeCheck(kTime2466000, params->param5, WRAP_SETUP_FUNCTION(Abbot, setup_function44)))
-			break;
-
-		if (params->param3) {
-			if (!Entity::updateParameter(params->param6, getState()->timeTicks, 75))
-				break;
-
-			params->param2 = 1;
-			params->param3 = 0;
-
-			getObjects()->update(kObjectCompartmentC, kCharacterAbbot, kObjectLocation1, kCursorNormal, kCursorNormal);
-			getObjects()->update(kObject50, kCharacterAbbot, kObjectLocation1, kCursorNormal, kCursorNormal);
-		}
-
-		params->param6 = 0;
-		break;
-
-	case kCharacterActionKnock:
-	case kCharacterActionOpenDoor:
-		getObjects()->update(kObjectCompartmentC, kCharacterAbbot, kObjectLocation1, kCursorNormal, kCursorNormal);
-		getObjects()->update(kObject50, kCharacterAbbot, kObjectLocation1, kCursorNormal, kCursorNormal);
-
-		if (params->param3) {
-			setCallback(savepoint.param.intValue == 50 ? 5 : 6);
-			setup_playSound(savepoint.param.intValue == 50 ? getSound()->justAMinuteCath() : getSound()->wrongDoorCath());
-		} else {
-			setCallback(savepoint.action == kCharacterActionKnock ? 2 : 3);
-			setup_playSound(savepoint.action == kCharacterActionKnock ?  "LIB012" : "LIB013");
-		}
-		break;
-
-	case kCharacterActionDefault:
-		getObjects()->update(kObjectCompartmentC, kCharacterAbbot, kObjectLocation1, kCursorHandKnock, kCursorHand);
-		getObjects()->update(kObject50, kCharacterAbbot, kObjectLocation1, kCursorHandKnock, kCursorHand);
-		break;
-
-	case kCharacterActionDrawScene:
-		if (params->param2 || params->param3) {
-			getObjects()->update(kObjectCompartmentC, kCharacterAbbot, kObjectLocation1, kCursorHandKnock, kCursorHand);
-			getObjects()->update(kObject50, kCharacterAbbot, kObjectLocation1, kCursorHandKnock, kCursorHand);
-
-			params->param2 = 0;
-			params->param3 = 0;
-		}
-		break;
-
-	case kCharacterActionCallback:
-		switch (getCallback()) {
-		default:
-			break;
-
-		case 1:
-			goto label_callback_1;
-
-		case 2:
-		case 3:
-			setCallback(4);
-			setup_playSound("Abb3001");
-			break;
-
-		case 4:
-			getObjects()->update(kObjectCompartmentC, kCharacterAbbot, kObjectLocation1, kCursorTalk, kCursorNormal);
-			getObjects()->update(kObject50, kCharacterAbbot, kObjectLocation1, kCursorTalk, kCursorNormal);
-
-			params->param3 = 1;
-			break;
-
-		case 5:
-		case 6:
-			params->param2 = 1;
-			params->param3 = 0;
-			break;
-		}
-		break;
-
-	case kCharacterAction101687594:
-		params->param1 = 1;
-		break;
-
-	case kCharacterAction159003408:
-		params->param1 = 0;
-		break;
-	}
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(44, Abbot, function44)
-	switch (savepoint.action) {
-	default:
-		break;
-
-	case kCharacterActionDefault:
-		getData()->entityPosition = kPosition_6470;
-		getData()->location = kLocationInsideCompartment;
-		getData()->car = kCarRedSleeping;
-
-		getEntities()->clearSequences(kCharacterAbbot);
-
-		getObjects()->update(kObjectCompartmentC, kCharacterCath, kObjectLocation1, kCursorHandKnock, kCursorHand);
-		getObjects()->update(kObject50, kCharacterCath, kObjectLocation1, kCursorHandKnock, kCursorHand);
-		break;
-
-	case kCharacterAction104060776:
-		setup_conferring();
-		break;
-	}
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(45, Abbot, conferring)
-	switch (savepoint.action) {
-	default:
-		break;
-
-	case kCharacterActionDefault:
-		getData()->entityPosition = kPosition_6471;
-		getData()->car = kCarRedSleeping;
-		getData()->location = kLocationOutsideCompartment;
-
-		RESET_ENTITY_STATE(kCharacterTrainM, Verges, setup_resetState);
-
-		getEntities()->drawSequenceLeft(kCharacterAbbot, "617Ec");
-		getEntities()->enterCompartment(kCharacterAbbot, kObjectCompartmentC, true);
-
-		setCallback(1);
-		setup_playSound("Abb4010");
-		break;
-
-	case kCharacterActionCallback:
-		switch (getCallback()) {
-		default:
-			break;
-
-		case 1:
-			setCallback(2);
-			setup_enterExitCompartment("617Kc", kObjectCompartmentC);
-			break;
-
-		case 2:
-			getEntities()->exitCompartment(kCharacterAbbot, kObjectCompartmentC, true);
-			getSavePoints()->push(kCharacterAbbot, kCharacterTrainM, kCharacterAction125233040);
-
-			setup_goSalon4();
-			break;
-		}
-		break;
-	}
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(46, Abbot, goSalon4)
-	switch (savepoint.action) {
-	default:
-		break;
-
-	case kCharacterActionDefault:
-		getData()->entityPosition = kPosition_6471;
-
-		setCallback(1);
-		setup_doWalkSearchingForCath(kCarRestaurant, kPosition_850);
-		break;
-
-	case kCharacterActionCallback:
-		if (getCallback() == 1)
-			setup_beforeBomb();
-		break;
-	}
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(47, Abbot, beforeBomb)
-	switch (savepoint.action) {
-	default:
-		break;
-
-	case kCharacterAction1:
-		setCallback(3);
-		setup_savegame(kSavegameTypeEvent, kEventAbbotDrinkGiveDetonator);
-		break;
-
-	case kCharacterActionDefault:
-		setCallback(1);
-		setup_callbackActionRestaurantOrSalon();
-		break;
-
-	case kCharacterActionCallback:
-		switch (getCallback()) {
-		default:
-			break;
-
-		case 1:
-			getData()->entityPosition = kPosition_1540;
-			getData()->location = kLocationOutsideCompartment;
-
-			setCallback(2);
-			setup_draw("126A");
-			break;
-
-		case 2:
-			getData()->location = kLocationInsideCompartment;
-			getEntities()->drawSequenceLeft(kCharacterAbbot, "126B");
-			getData()->inventoryItem = kItemBomb;
-			break;
-
-		case 3:
-			getActionOld()->playAnimation(kEventAbbotDrinkGiveDetonator);
-			getLogic()->gameOver(kSavegameTypeIndex, 1, kSceneNone, true);
-			break;
-		}
-		break;
-	}
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(48, Abbot, afterBomb)
-	switch (savepoint.action) {
-	default:
-		break;
-
-	case kCharacterActionNone:
-		if (ENTITY_PARAM(0, 1))
-			getData()->inventoryItem = kItemInvalid;
-
-		if (Entity::updateParameter(params->param1, getState()->time, 1800)) {
-			getData()->inventoryItem = kItemNone;
-
-			setCallback(4);
-			setup_updatePosition("126C", kCarRestaurant, 52);
-			break;
-		}
-
-		Entity::timeCheckCallbackInventory(kTime2533500, params->param2, 5, WRAP_SETUP_FUNCTION(Abbot, setup_callbackActionRestaurantOrSalon));
-		break;
-
-	case kCharacterAction1:
-		getData()->inventoryItem = kItemNone;
-
-		setCallback(9);
-		setup_savegame(kSavegameTypeEvent, kEventAbbotDrinkDefuse);
-		break;
-
-	case kCharacterActionDefault:
-		getData()->entityPosition = kPosition_850;
-		getData()->location = kLocationOutsideCompartment;
-		getData()->car = kCarRedSleeping;
-		getData()->inventoryItem = kItemNone;
-
-		getSavePoints()->push(kCharacterAbbot, kCharacterTrainM, kCharacterAction125233040);
-
-		setCallback(1);
-		setup_updateEntity(kCarRestaurant, kPosition_850);
-		break;
-
-	case kCharacterActionCallback:
-		switch (getCallback()) {
-		default:
-			break;
-
-		case 1:
-			setCallback(2);
-			setup_callbackActionRestaurantOrSalon();
-			break;
-
-		case 2:
-			getData()->entityPosition = kPosition_1540;
-			getData()->location = kLocationOutsideCompartment;
-
-			setCallback(3);
-			setup_updatePosition("126A", kCarRestaurant, 52);
-			break;
-
-		case 3:
-			getData()->location = kLocationInsideCompartment;
-			getEntities()->drawSequenceLeft(kCharacterAbbot, "126B");
-			break;
-
-		case 4:
-			if (!HELPERgetEvent(kEventAbbotDrinkDefuse) && ENTITY_PARAM(0, 1))
-				getData()->inventoryItem = kItemInvalid;
-
-			getEntities()->drawSequenceLeft(kCharacterAbbot, "126B");
-			params->param1 = 0;
-
-			Entity::timeCheckCallbackInventory(kTime2533500, params->param2, 5, WRAP_SETUP_FUNCTION(Abbot, setup_callbackActionRestaurantOrSalon));
-			break;
-
-		case 5:
-			getData()->location = kLocationInsideCompartment;
-
-			setCallback(6);
-			setup_updatePosition("126D", kCarRestaurant, 52);
-			break;
-
-		case 6:
-			setCallback(7);
-			setup_updateEntity(kCarRedSleeping, kPosition_6470);
-			break;
-
-		case 7:
-			setCallback(8);
-			setup_enterExitCompartment2("617Cc", kObjectCompartmentC);
-			break;
-
-		case 8:
-			getData()->location = kLocationInsideCompartment;
-			getEntities()->clearSequences(kCharacterAbbot);
-
-			setup_function44();
-			break;
-
-		case 9:
-			getActionOld()->playAnimation(kEventAbbotDrinkDefuse);
-			getEntities()->drawSequenceLeft(kCharacterAbbot, "126B");
-			getSavePoints()->push(kCharacterAbbot, kCharacterAnna, kCharacterAction100969180);
-			getScenes()->loadSceneFromPosition(kCarRestaurant, 58);
-			break;
-		}
-		break;
-	}
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(49, Abbot, catchCath)
-	switch (savepoint.action) {
-	default:
-		break;
-
-	case kCharacterActionNone:
-		if (!Entity::updateParameter(params->param1, getState()->timeTicks, 150))
-			break;
-
-		getSavePoints()->push(kCharacterAbbot, kCharacterAbbot, kCharacterAction157489665);
-		break;
-
-	case kCharacterActionKnock:
-		if (!getSoundQueue()->isBuffered("LIB012", true))
-			getSound()->playSound(kCharacterCath, "LIB012");
-		break;
-
-	case kCharacterActionOpenDoor:
-	case kCharacterAction157489665:
-		getSavePoints()->push(kCharacterAbbot, kCharacterTatiana, kCharacterAction238790488);
-		getObjects()->update(kObjectCompartment2, kCharacterCath, kObjectLocationNone, kCursorHandKnock, kCursorHand);
-		getObjects()->update(kObjectHandleInsideBathroom, kCharacterCath, kObjectLocationNone, kCursorHandKnock, kCursorHand);
-
-		setCallback(1);
-		setup_savegame(kSavegameTypeEvent, kEventAbbotWrongCompartment);
-		break;
-
-	case kCharacterActionDefault:
-		getData()->car = kCarGreenSleeping;
-		getData()->entityPosition = kPosition_7500;
-		getData()->location = kLocationInsideCompartment;
-
-		getSavePoints()->call(kCharacterAbbot, kCharacterTableE, kCharacterActionDrawTablesWithChairs, "029G");
-		getSavePoints()->push(kCharacterAbbot, kCharacterWaiter1, kCharacterAction270068760);
-		getSavePoints()->push(kCharacterAbbot, kCharacterMonsieur, kCharacterAction125039808);
-		getObjects()->update(kObjectCompartment2, kCharacterAbbot, kObjectLocation1, kCursorHandKnock, kCursorHand);
-		getObjects()->update(kObjectHandleInsideBathroom, kCharacterAbbot, kObjectLocation1, kCursorHandKnock, kCursorHand);
-		break;
-
-	case kCharacterActionCallback:
-		switch (getCallback()) {
-		default:
-			break;
-
-		case 1:
-			getActionOld()->playAnimation(getObjects()->get(kObjectCompartment2).model == kObjectModel1 ? kEventAbbotWrongCompartmentBed : kEventAbbotWrongCompartment);
-			getEntities()->updateEntity(kCharacterAbbot, kCarRedSleeping, kPosition_6470);
-			getSound()->playSound(kCharacterCath, "LIB015");
-			getScenes()->loadSceneFromObject(kObjectCompartment2, true);
-
-			setCallback(2);
-			setup_updateEntity(kCarRedSleeping, kPosition_6470);
-			break;
-
-		case 2:
-			setCallback(3);
-			setup_enterExitCompartment2("617Cc", kObjectCompartmentC);
-			break;
-
-		case 3:
-			getData()->location = kLocationInsideCompartment;
-			getEntities()->clearSequences(kCharacterAbbot);
-			getObjects()->update(kObjectCompartmentC, kCharacterAbbot, kObjectLocation1, kCursorHandKnock, kCursorHand);
-
-			setup_inCompartment();
-			break;
-		}
-		break;
-	}
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(50, Abbot, chapter5)
-	switch (savepoint.action) {
-	default:
-		break;
-
-	case kCharacterActionNone:
-		setup_chapter5Handler();
-		break;
-
-	case kCharacterActionDefault:
-		getEntities()->clearSequences(kCharacterAbbot);
-
-		getData()->entityPosition = kPosition_3969;
-		getData()->location = kLocationInsideCompartment;
-		getData()->car = kCarRestaurant;
-		getData()->inventoryItem = kItemNone;
-		getData()->clothes = kClothesDefault;
-		break;
-	}
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(51, Abbot, chapter5Handler)
-	if (savepoint.action == kCharacterActionProceedChapter5)
-		setup_function52();
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(52, Abbot, function52)
-	switch (savepoint.action) {
-	default:
-		break;
-
-	case kCharacterActionDefault:
-		getEntities()->clearSequences(kCharacterAbbot);
-
-		getData()->entityPosition = kPositionNone;
-		getData()->location = kLocationOutsideCompartment;
-		getData()->car = kCarNone;
-		break;
-
-	case kCharacterAction135600432:
-		setup_runningTrain();
-		break;
-	}
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(53, Abbot, runningTrain)
-	switch (savepoint.action) {
-	default:
-		break;
-
-	case kCharacterActionDefault:
-		getInventory()->setLocationAndProcess(kItem25, kObjectLocation1);
-		getSavePoints()->push(kCharacterAbbot, kCharacterAnna, kCharacterAction158480160);
-		break;
-
-	case kCharacterActionCallback:
-		switch (getCallback()) {
-		default:
-			break;
-
-		case 1:
-			getActionOld()->playAnimation(kEventLocomotiveAbbotGetSomeRest);
-			getScenes()->processScene();
-			break;
-
-		case 2:
-			getActionOld()->playAnimation(kEventLocomotiveAbbotShoveling);
-			getScenes()->processScene();
-			break;
-		}
-		break;
-
-	case kCharacterAction168646401:
-		if (!HELPERgetEvent(kEventLocomotiveAbbotGetSomeRest)) {
-			setCallback(1);
-			setup_savegame(kSavegameTypeEvent, kEventLocomotiveAbbotGetSomeRest);
-			break;
-		}
-
-		if (!HELPERgetEvent(kEventLocomotiveAbbotShoveling)) {
-			setCallback(2);
-			setup_savegame(kSavegameTypeEvent, kEventLocomotiveAbbotShoveling);
-			break;
-		}
-
-		getActionOld()->playAnimation(kEventLocomotiveAbbotShoveling);
-		getScenes()->processScene();
-		break;
-	}
-IMPLEMENT_FUNCTION_END
-
-} // End of namespace LastExpress
diff --git a/engines/lastexpress/entities/abbot.h b/engines/lastexpress/entities/abbot.h
deleted file mode 100644
index dbb92c47919..00000000000
--- a/engines/lastexpress/entities/abbot.h
+++ /dev/null
@@ -1,220 +0,0 @@
-/* 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 3 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, see <http://www.gnu.org/licenses/>.
- *
- */
-
-#ifndef LASTEXPRESS_ABBOT_H
-#define LASTEXPRESS_ABBOT_H
-
-#include "lastexpress/entities/entity.h"
-
-namespace LastExpress {
-
-class LastExpressEngine;
-
-class Abbot : public Entity {
-public:
-	Abbot(LastExpressEngine *engine);
-	~Abbot() override {}
-
-	/**
-	 * Resets the character
-	 */
-	DECLARE_FUNCTION(reset)
-
-	/**
-	 * Draws the character
-	 *
-	 * @param sequence The sequence to draw
-	 */
-	DECLARE_FUNCTION_1(draw, const char *sequence)
-
-	/**
-	 * Handles entering/exiting a compartment.
-	 *
-	 * @param sequence    The sequence to draw
-	 * @param compartment The compartment
-	 */
-	DECLARE_VFUNCTION_2(enterExitCompartment, const char *sequence, ObjectIndex compartment)
-
-	/**
-	 * Handles entering/exiting a compartment and updates position/play animation
-	 *
-	 * @param sequence    The sequence to draw
-	 * @param compartment The compartment
-	 */
-	DECLARE_FUNCTION_2(enterExitCompartment2, const char *sequence, ObjectIndex compartment)
-
-	/**
-	 * Process callback action when the character direction is not kDirectionRight
-	 */
-	DECLARE_FUNCTION(callbackActionOnDirection)
-
-	/**
-	 * Draws the character along with another one
-	 *
-	 * @param sequence1   The sequence to draw
-	 * @param sequence2   The sequence to draw for the second character
-	 * @param character      The CharacterIndex of the second character
-	 */
-	DECLARE_FUNCTION_3(draw2, const char *sequence1, const char *sequence2, CharacterIndex entity)
-
-	/**
-	 * Updates parameter 2 using time value
-	 *
-	 * @param time The time to add
-	 */
-	DECLARE_FUNCTION_1(updateFromTime, uint32 time)
-
-	/**
-	 * Updates parameter 2 using ticks value
-	 *
-	 * @param ticks The number of ticks to add
-	 */
-	DECLARE_FUNCTION_1(updateFromTicks, uint32 ticks)
-
-	/**
-	 * Plays sound
-	 *
-	 * @param filename The sound filename
-	 */
-	DECLARE_VFUNCTION_1(playSound, const char *filename)
-
-	/**
-	 * Saves the game
-	 *
-	 * @param savegameType The type of the savegame
-	 * @param param        The param for the savegame (EventIndex or TimeValue)
-	 */
-	DECLARE_VFUNCTION_2(savegame, SavegameType savegameType, uint32 param)
-
-	/**
-	 * Updates the character
-	 *
-	 * @param car            The car
-	 * @param entityPosition The character position
-	 */
-	DECLARE_VFUNCTION_2(updateEntity, CarIndex car, EntityPosition entityPosition)
-
-	/**
-	 * Call a savepoint (or draw sequence in default case)
-	 *
-	 * @param sequence1   The sequence to draw in the default case
-	 * @param character      The character
-	 * @param action      The action
-	 * @param sequence2   The sequence eraseData for the savepoint
-	 */
-	DECLARE_FUNCTION_4(callSavepoint, const char *sequence1, CharacterIndex entity, CharacterActions action, const char *sequence2)
-
-	/**
-	 * Updates the position
-	 *
-	 * @param sequence1      The sequence to draw
-	 * @param car            The car
-	 * @param position       The position
-	 */
-	DECLARE_FUNCTION_3(updatePosition, const char *sequence1, CarIndex car, PositionOld position)
-
-	/**
-	 * Process callback action when somebody is standing in the restaurant or salon.
-	 */
-	DECLARE_FUNCTION(callbackActionRestaurantOrSalon)
-
-	/**
-	 * Setup Chapter 1
-	 */
-	DECLARE_VFUNCTION(chapter1)
-
-	/**
-	 * Setup Chapter 2
-	 */
-	DECLARE_VFUNCTION(chapter2)
-
-	/**
-	 * Setup Chapter 3
-	 */
-	DECLARE_VFUNCTION(chapter3)
-
-	/**
-	 * Handle Chapter 3 events
-	 */
-	DECLARE_FUNCTION(inKitchen)
-	DECLARE_FUNCTION(openCompartment)
-	DECLARE_FUNCTION(readPaper)
-	DECLARE_FUNCTION(goToLunch)
-	DECLARE_FUNCTION(haveLunch)
-	DECLARE_FUNCTION(leaveLunch)
-	DECLARE_FUNCTION(closedCompartment)
-	DECLARE_FUNCTION(goSalon1)
-	DECLARE_FUNCTION(inSalon1)
-	DECLARE_FUNCTION(goCompartment)
-	DECLARE_FUNCTION(openCompartment2)
-	DECLARE_FUNCTION(goWander)
-	DECLARE_FUNCTION(goSalon2)
-	DECLARE_FUNCTION(inSalon2)
-	DECLARE_FUNCTION(goCompartment3)
-	DECLARE_FUNCTION(openCompartment3)
-	DECLARE_FUNCTION(goSalon3)
-	DECLARE_FUNCTION(inSalon3)
-	DECLARE_FUNCTION(withAugust)
-	DECLARE_FUNCTION(goCompartment4)
-	DECLARE_FUNCTION(inCompartment4)
-
-	/**
-	 * Setup Chapter 4
-	 */
-	DECLARE_VFUNCTION(chapter4)
-
-	/**
-	 * Search Cath by walking around
-	 *
-	 * @param car            The car
-	 * @param entityPosition The character position
-	 */
-	DECLARE_FUNCTION_2(doWalkSearchingForCath, CarIndex car, EntityPosition position)
-
-	/**
-	 * Handle Chapter 4 events
-	 */
-	DECLARE_FUNCTION(chapter4Handler)
-	DECLARE_FUNCTION(leaveDinner)
-	DECLARE_FUNCTION(inCompartment)
-	DECLARE_FUNCTION(function44)
-	DECLARE_FUNCTION(conferring)
-	DECLARE_FUNCTION(goSalon4)
-	DECLARE_FUNCTION(beforeBomb)
-	DECLARE_FUNCTION(afterBomb)
-	DECLARE_FUNCTION(catchCath)
-
-	/**
-	 * Setup Chapter 5
-	 */
-	DECLARE_VFUNCTION(chapter5)
-
-	/**
-	 * Handle Chapter 5 events
-	 */
-	DECLARE_FUNCTION(chapter5Handler)
-	DECLARE_FUNCTION(function52)
-	DECLARE_FUNCTION(runningTrain)
-};
-
-} // End of namespace LastExpress
-
-#endif // LASTEXPRESS_ABBOT_H
diff --git a/engines/lastexpress/entities/alexei.cpp b/engines/lastexpress/entities/alexei.cpp
deleted file mode 100644
index ecbc853460c..00000000000
--- a/engines/lastexpress/entities/alexei.cpp
+++ /dev/null
@@ -1,1999 +0,0 @@
-/* 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 3 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, see <http://www.gnu.org/licenses/>.
- *
- */
-
-#include "lastexpress/entities/alexei.h"
-
-#include "lastexpress/game/action.h"
-#include "lastexpress/game/entities.h"
-#include "lastexpress/game/inventory.h"
-#include "lastexpress/game/logic.h"
-#include "lastexpress/game/object.h"
-#include "lastexpress/game/savepoint.h"
-#include "lastexpress/game/scenes.h"
-#include "lastexpress/game/state.h"
-
-#include "lastexpress/lastexpress.h"
-
-namespace LastExpress {
-
-Alexei::Alexei(LastExpressEngine *engine) : Entity(engine, kCharacterAlexei) {
-	ADD_CALLBACK_FUNCTION(Alexei, reset);
-	ADD_CALLBACK_FUNCTION_S(Alexei, playSound);
-	ADD_CALLBACK_FUNCTION_I(Alexei, updateFromTime);
-	ADD_CALLBACK_FUNCTION_S(Alexei, draw);
-	ADD_CALLBACK_FUNCTION_SII(Alexei, updatePosition);
-	ADD_CALLBACK_FUNCTION_SI(Alexei, enterExitCompartment);
-	ADD_CALLBACK_FUNCTION(Alexei, callbackActionOnDirection);
-	ADD_CALLBACK_FUNCTION_SIIS(Alexei, callSavepoint);
-	ADD_CALLBACK_FUNCTION_II(Alexei, savegame);
-	ADD_CALLBACK_FUNCTION_II(Alexei, updateEntity);
-	ADD_CALLBACK_FUNCTION_SSI(Alexei, draw2);
-	ADD_CALLBACK_FUNCTION(Alexei, callbackActionRestaurantOrSalon);
-	ADD_CALLBACK_FUNCTION(Alexei, enterComparment);
-	ADD_CALLBACK_FUNCTION(Alexei, exitCompartment);
-	ADD_CALLBACK_FUNCTION(Alexei, pacingAtWindow);
-	ADD_CALLBACK_FUNCTION_IS(Alexei, compartmentLogic);
-	ADD_CALLBACK_FUNCTION(Alexei, chapter1);
-	ADD_CALLBACK_FUNCTION(Alexei, atDinner);
-	ADD_CALLBACK_FUNCTION(Alexei, returnCompartment);
-	ADD_CALLBACK_FUNCTION(Alexei, goSalon);
-	ADD_CALLBACK_FUNCTION(Alexei, sitting);
-	ADD_CALLBACK_FUNCTION(Alexei, standingAtWindow);
-	ADD_CALLBACK_FUNCTION(Alexei, waitingForTatiana);
-	ADD_CALLBACK_FUNCTION(Alexei, upset);
-	ADD_CALLBACK_FUNCTION(Alexei, returnCompartmentNight);
-	ADD_CALLBACK_FUNCTION(Alexei, function26);
-	ADD_CALLBACK_FUNCTION(Alexei, function27);
-	ADD_CALLBACK_FUNCTION(Alexei, chapter2);
-	ADD_CALLBACK_FUNCTION(Alexei, inCompartment2);
-	ADD_CALLBACK_FUNCTION(Alexei, atBreakfast);
-	ADD_CALLBACK_FUNCTION(Alexei, returnCompartment2);
-	ADD_CALLBACK_FUNCTION(Alexei, chapter3);
-	ADD_CALLBACK_FUNCTION(Alexei, playingChess);
-	ADD_CALLBACK_FUNCTION(Alexei, inPart3);
-	ADD_CALLBACK_FUNCTION(Alexei, pacing3);
-	ADD_CALLBACK_FUNCTION(Alexei, goSalon3);
-	ADD_CALLBACK_FUNCTION(Alexei, chapter4);
-	ADD_CALLBACK_FUNCTION(Alexei, inCompartment4);
-	ADD_CALLBACK_FUNCTION(Alexei, meetTatiana);
-	ADD_CALLBACK_FUNCTION(Alexei, leavePlatform);
-	ADD_CALLBACK_FUNCTION(Alexei, inCompartmentAgain);
-	ADD_CALLBACK_FUNCTION(Alexei, goSalon4);
-	ADD_CALLBACK_FUNCTION(Alexei, pacing);
-	ADD_CALLBACK_FUNCTION(Alexei, goToPlatform);
-	ADD_CALLBACK_FUNCTION(Alexei, returnCompartment4);
-	ADD_CALLBACK_FUNCTION(Alexei, bombPlanB);
-	ADD_CALLBACK_FUNCTION(Alexei, function47);
-	ADD_CALLBACK_FUNCTION(Alexei, chapter5);
-}
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(1, Alexei, reset)
-	Entity::reset(savepoint);
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION_S(2, Alexei, playSound)
-	Entity::playSound(savepoint);
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION_I(3, Alexei, updateFromTime, uint32)
-	Entity::updateFromTime(savepoint);
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION_S(4, Alexei, draw)
-	Entity::draw(savepoint);
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION_SII(5, Alexei, updatePosition, CarIndex, PositionOld)
-	Entity::updatePosition(savepoint);
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION_SI(6, Alexei, enterExitCompartment, ObjectIndex)
-	Entity::enterExitCompartment(savepoint);
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(7, Alexei, callbackActionOnDirection)
-	Entity::callbackActionOnDirection(savepoint);
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION_SIIS(8, Alexei, callSavepoint, CharacterIndex, CharacterActions)
-	Entity::callSavepoint(savepoint);
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION_II(9, Alexei, savegame, SavegameType, uint32)
-	Entity::savegame(savepoint);
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION_II(10, Alexei, updateEntity, CarIndex, EntityPosition)
-	switch (savepoint.action) {
-	default:
-		break;
-
-	case kCharacterActionExcuseMeCath:
-		if (getEntities()->isPlayerPosition(kCarGreenSleeping, 18) || getEntities()->isPlayerPosition(kCarRedSleeping, 18)) {
-			getSound()->excuseMe(kCharacterAlexei);
-		} else {
-			if (HELPERgetEvent(kEventAlexeiSalonVassili) || (HELPERgetEvent(kEventTatianaAskMatchSpeakRussian) && getInventory()->hasItem(kItemPassengerList))) {
-				getSound()->playSound(kCharacterCath, rnd(2) ? "CAT1012" : "CAT1012A");
-			} else {
-				getSound()->excuseMeCath();
-			}
-		}
-		// Stop execution here
-		return;
-
-	case kCharacterActionDefault:
-		getData()->inventoryItem = kItemNone;
-		break;
-	}
-
-	Entity::updateEntity(savepoint, true);
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION_NOSETUP(11, Alexei, draw2)
-	Entity::draw2(savepoint);
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(12, Alexei, callbackActionRestaurantOrSalon)
-	Entity::callbackActionRestaurantOrSalon(savepoint);
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(13, Alexei, enterComparment)
-	switch (savepoint.action) {
-	default:
-		break;
-
-	case kCharacterActionDefault:
-		setCallback(1);
-		setup_updateEntity(kCarGreenSleeping, kPosition_7500);
-		break;
-
-	case kCharacterActionCallback:
-		switch (getCallback()) {
-		default:
-			break;
-
-		case 1:
-			getSavePoints()->push(kCharacterAlexei, kCharacterCond1, kCharacterAction302614416);
-			getEntities()->drawSequenceLeft(kCharacterAlexei, "602DB");
-			getEntities()->enterCompartment(kCharacterAlexei, kObjectCompartment2, true);
-
-			getData()->location = kLocationInsideCompartment;
-
-			if (getEntities()->isInsideCompartment(kCharacterCath, kCarGreenSleeping, kPosition_7500)) {
-				getActionOld()->playAnimation(isNightOld() ? kEventCathTurningNight : kEventCathTurningDay);
-				getSound()->playSound(kCharacterCath, "BUMP");
-				getScenes()->loadSceneFromObject(kObjectCompartment2, true);
-			}
-			break;
-
-		case 2:
-			getEntities()->exitCompartment(kCharacterAlexei, kObjectCompartment2, true);
-			getData()->location = kLocationInsideCompartment;
-			getData()->entityPosition = kPosition_7500;
-			getEntities()->clearSequences(kCharacterAlexei);
-
-			callbackAction();
-			break;
-		}
-		break;
-
-	case kCharacterAction135664192:
-		setCallback(2);
-		setup_enterExitCompartment("602Eb", kObjectCompartment2);
-	}
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(14, Alexei, exitCompartment)
-	switch (savepoint.action) {
-	default:
-		break;
-
-	case kCharacterActionDefault:
-		setCallback(1);
-		setup_enterExitCompartment("602Fb", kObjectCompartment2);
-		break;
-
-	case kCharacterActionCallback:
-		if (getCallback() == 1) {
-			getData()->location = kLocationOutsideCompartment;
-			getSavePoints()->push(kCharacterAlexei, kCharacterCond1, kCharacterAction302614416);
-			getEntities()->drawSequenceLeft(kCharacterAlexei, "602DB");
-			getEntities()->enterCompartment(kCharacterAlexei, kObjectCompartment2, true);
-		}
-		break;
-
-	case kCharacterAction135664192:
-		getObjects()->update(kObjectCompartment2, kCharacterCath, kObjectLocation1, kCursorHandKnock, kCursorHand);
-		getEntities()->exitCompartment(kCharacterAlexei, kObjectCompartment2, true);
-
-		callbackAction();
-		break;
-	}
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(15, Alexei, pacingAtWindow)
-	switch (savepoint.action) {
-	default:
-		break;
-
-	case kCharacterActionNone:
-		if (Entity::updateParameterCheck(params->param2, getState()->time, params->param1)) {
-			if (getEntities()->isSomebodyInsideRestaurantOrSalon()) {
-				getData()->location = kLocationOutsideCompartment;
-
-				setCallback(3);
-				setup_updatePosition("103D", kCarRestaurant, 52);
-			}
-		}
-		break;
-
-	case kCharacterActionDefault:
-		params->param1 = 5 * (3 * rnd(60) + 90);
-
-		setCallback(1);
-		setup_callbackActionRestaurantOrSalon();
-		break;
-
-	case kCharacterActionCallback:
-		switch (getCallback()) {
-		default:
-			break;
-
-		case 1:
-			getData()->location = kLocationOutsideCompartment;
-
-			setCallback(2);
-			setup_updatePosition("103C", kCarRestaurant, 52);
-			break;
-
-		case 2:
-			getData()->location = kLocationInsideCompartment;
-			getEntities()->drawSequenceLeft(kCharacterAlexei, "103E");
-			break;
-
-		case 3:
-			getData()->location = kLocationInsideCompartment;
-			getEntities()->drawSequenceLeft(kCharacterAlexei, "103B");
-
-			callbackAction();
-			break;
-		}
-		break;
-	}
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION_IS(16, Alexei, compartmentLogic, TimeValue)
-	switch (savepoint.action) {
-	default:
-		break;
-
-	case kCharacterActionNone:
-		if (!params->param7 && params->param1 < getState()->time && !params->param8) {
-			params->param8 = 1;
-
-			getObjects()->update(kObjectCompartment2, kCharacterCath, kObjectLocation1, kCursorHandKnock, kCursorHand);
-			getObjects()->update(kObjectHandleInsideBathroom, kCharacterCath, kObjectLocation1, kCursorHandKnock, kCursorHand);
-
-			callbackAction();
-			break;
-		}
-
-		if (params->param5) {
-			if (!Entity::updateParameter(CURRENT_PARAM(1, 1), getState()->timeTicks, 75))
-				break;
-
-			params->param5 = 0;
-			params->param6 = 1;
-
-			getObjects()->update(kObjectCompartment2, kCharacterAlexei, kObjectLocation1, kCursorNormal, kCursorNormal);
-			getObjects()->update(kObjectHandleInsideBathroom, kCharacterAlexei, kObjectLocation1, kCursorNormal, kCursorNormal);
-		}
-
-		CURRENT_PARAM(1, 1) = 0;
-		break;
-
-	case kCharacterActionKnock:
-	case kCharacterActionOpenDoor:
-		getObjects()->update(kObjectCompartment2, kCharacterAlexei, kObjectLocation1, kCursorNormal, kCursorNormal);
-		getObjects()->update(kObjectHandleInsideBathroom, kCharacterAlexei, kObjectLocation1, kCursorNormal, kCursorNormal);
-
-		if (params->param5) {
-			if (savepoint.param.intValue == 18) {
-				setCallback(4);
-				setup_playSound(getSound()->justAMinuteCath());
-				break;
-			}
-
-			if (getInventory()->hasItem(kItemPassengerList)) {
-				setCallback(5);
-				setup_playSound(rnd(2) ? getSound()->wrongDoorCath() : "CAT1503");
-			} else {
-				setCallback(6);
-				setup_playSound(getSound()->wrongDoorCath());
-			}
-		} else {
-			setCallback(savepoint.action == kCharacterActionKnock ? 1 : 2);
-			setup_playSound(savepoint.action == kCharacterActionKnock ? "LIB012" : "LIB013");
-		}
-		break;
-
-	case kCharacterActionDefault:
-		getEntities()->drawSequenceLeft(kCharacterAlexei, (char *)&params->seq);
-		getObjects()->update(kObjectCompartment2, kCharacterAlexei, kObjectLocation1, kCursorHandKnock, kCursorHand);
-		getObjects()->update(kObjectHandleInsideBathroom, kCharacterAlexei, kObjectLocation1, kCursorHandKnock, kCursorHand);
-		break;
-
-	case kCharacterActionDrawScene:
-		if (params->param6 || params->param5) {
-			getObjects()->update(kObjectCompartment2, kCharacterAlexei, kObjectLocation1, kCursorHandKnock, kCursorHand);
-			getObjects()->update(kObjectHandleInsideBathroom, kCharacterAlexei, kObjectLocation1, kCursorHandKnock, kCursorHand);
-
-			params->param5 = 0;
-			params->param6 = 0;
-		}
-		break;
-
-	case kCharacterActionCallback:
-		switch (getCallback()) {
-		default:
-			break;
-
-		case 1:
-		case 2:
-			setCallback(3);
-			setup_playSound("ALX1134A");
-			break;
-
-		case 3:
-			getObjects()->update(kObjectCompartment2, kCharacterAlexei, kObjectLocation1, kCursorTalk, kCursorNormal);
-			getObjects()->update(kObjectHandleInsideBathroom, kCharacterAlexei, kObjectLocation1, kCursorTalk, kCursorNormal);
-			params->param5 = 1;
-			break;
-
-		case 4:
-		case 5:
-		case 6:
-			params->param5 = 0;
-			params->param6 = 1;
-			break;
-
-		case 7:
-			setCallback(8);
-			setup_updateFromTime(300);
-			break;
-
-		case 8:
-			setCallback(9);
-			setup_enterExitCompartment("602Gb", kObjectCompartment2);
-			break;
-
-		case 9:
-			getData()->location = kLocationOutsideCompartment;
-			getSavePoints()->push(kCharacterAlexei, kCharacterCond1, kCharacterAction156567128);
-			getEntities()->drawSequenceLeft(kCharacterAlexei, "602Hb");
-			getEntities()->enterCompartment(kCharacterAlexei, kObjectCompartment2, true);
-			break;
-
-		case 10:
-			getEntities()->exitCompartment(kCharacterAlexei, kObjectCompartment2, true);
-
-			getData()->location = kLocationInsideCompartment;
-			getData()->entityPosition = kPosition_7500;
-
-			getEntities()->drawSequenceLeft(kCharacterAlexei, (char *)&params->seq);
-			getObjects()->update(kObjectCompartment2, kCharacterAlexei, kObjectLocation1, kCursorHandKnock, kCursorHand);
-			getObjects()->update(kObjectHandleInsideBathroom, kCharacterAlexei, kObjectLocation1, kCursorHandKnock, kCursorHand);
-
-			params->param7 = 0;
-			break;
-		}
-		break;
-
-	case kCharacterAction124697504:
-		setCallback(10);
-		setup_enterExitCompartment("602Ib", kObjectCompartment2);
-		break;
-
-	case kCharacterAction221617184:
-		params->param7 = 1;
-		getSavePoints()->push(kCharacterAlexei, kCharacterCond1, kCharacterAction100906246);
-
-		setCallback(7);
-		setup_playSound("CON1024");
-		break;
-	}
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(17, Alexei, chapter1)
-	switch (savepoint.action) {
-	default:
-		break;
-
-	case kCharacterActionNone:
-		Entity::timeCheck(kTimeChapter1, params->param1, WRAP_SETUP_FUNCTION(Alexei, setup_atDinner));
-		break;
-
-	case kCharacterActionDefault:
-		getObjects()->update(kObjectCompartment2, kCharacterCath, kObjectLocation1, kCursorHandKnock, kCursorHand);
-		getObjects()->update(kObject10, kCharacterCath, kObjectLocationNone, kCursorKeepValue, kCursorKeepValue);
-		getObjects()->update(kObjectHandleInsideBathroom, kCharacterCath, kObjectLocation1, kCursorHandKnock, kCursorHand);
-
-		getData()->entityPosition = kPosition_3969;
-		getData()->location = kLocationInsideCompartment;
-		getData()->car = kCarRestaurant;
-		break;
-	}
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(18, Alexei, atDinner)
-	switch (savepoint.action) {
-	default:
-		break;
-
-	case kCharacterActionNone:
-		if (getState()->time > kTime1089000 && getEntities()->isSomebodyInsideRestaurantOrSalon()) {
-			params->param2 = kItemNone;
-
-			getData()->location = kLocationOutsideCompartment;
-			getData()->inventoryItem = kItemNone;
-
-			getEntities()->updatePositionEnter(kCharacterAlexei, kCarRestaurant, 63);
-			getInventory()->setLocationAndProcess(kItem17, kObjectLocation1);
-
-			setCallback(1);
-			setup_callSavepoint("005D", kCharacterTableB, kCharacterActionDrawTablesWithChairs, "005E");
-			break;
-		}
-
-		if (params->param1) {
-			if (!Entity::updateParameter(params->param3, getState()->timeTicks, 90))
-				break;
-
-			getScenes()->loadSceneFromPosition(kCarRestaurant, 61);
-		} else {
-			params->param3 = 0;
-		}
-		break;
-
-	case kCharacterAction1:
-		params->param2 = kItemNone;
-		getData()->inventoryItem = kItemNone;
-
-		setCallback(2);
-		setup_savegame(kSavegameTypeEvent, kEventAlexeiDiner);
-		break;
-
-	case kCharacterActionDefault:
-		getSavePoints()->push(kCharacterAlexei, kCharacterTableB, kCharacterAction136455232);
-		getEntities()->drawSequenceLeft(kCharacterAlexei, "005B");
-
-		params->param2 = kItemInvalid;
-		getData()->inventoryItem = kItemInvalid;
-		break;
-
-	case kCharacterActionDrawScene:
-		params->param1 = getEntities()->isPlayerPosition(kCarRestaurant, 63) ? 1 : 0;
-		break;
-
-	case kCharacterActionCallback:
-		switch (getCallback()) {
-		default:
-			break;
-
-		case 1:
-			getEntities()->updatePositionExit(kCharacterAlexei, kCarRestaurant, 63);
-			setup_returnCompartment();
-			break;
-
-		case 2:
-			getActionOld()->playAnimation(getProgress().jacket == kJacketGreen ? kEventAlexeiDiner : kEventAlexeiDinerOriginalJacket);
-			getSavePoints()->push(kCharacterAlexei, kCharacterTableB, kCharacterActionDrawTablesWithChairs, "005E");
-
-			getData()->entityPosition = kPosition_3650;
-			getData()->location = kLocationOutsideCompartment;
-
-			getEntities()->clearSequences(kCharacterAlexei);
-			getInventory()->get(kItem17)->location = kObjectLocation1;
-			getScenes()->loadSceneFromPosition(kCarRestaurant, 63);
-
-			setup_returnCompartment();
-			break;
-		}
-		break;
-
-	case kCharacterAction168046720:
-		getData()->inventoryItem = kItemNone;
-		break;
-
-	case kCharacterAction168627977:
-		getData()->inventoryItem = (InventoryItem)LOW_BYTE(params->param2);
-		break;
-
-	case kCharacterAction225182640:
-		getData()->inventoryItem = kItemNone;
-		break;
-	}
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(19, Alexei, returnCompartment)
-	switch (savepoint.action) {
-	default:
-		break;
-
-	case kCharacterActionDefault:
-		setCallback(1);
-		setup_draw("811DS");
-		break;
-
-	case kCharacterActionCallback:
-		switch (getCallback()) {
-		default:
-			break;
-
-		case 1:
-			setCallback(2);
-			setup_updateEntity(kCarGreenSleeping, kPosition_9460);
-			break;
-
-		case 2:
-			setCallback(3);
-			setup_updateEntity(kCarRestaurant, kPosition_850);
-			break;
-
-		case 3:
-			setCallback(4);
-			setup_callbackActionRestaurantOrSalon();
-			break;
-
-		case 4:
-			getData()->entityPosition = kPosition_1540;
-			getData()->location = kLocationOutsideCompartment;
-
-			setCallback(5);
-			setup_draw("811US");
-			break;
-
-		case 5:
-			setCallback(6);
-			setup_draw("933");
-			break;
-
-		case 6:
-			getEntities()->updatePositionEnter(kCharacterAlexei, kCarRestaurant, 63);
-			getScenes()->loadSceneFromItemPosition(kItem17);
-			getSavePoints()->push(kCharacterAlexei, kCharacterTableB, kCharacterAction136455232);
-
-			setCallback(7);
-			setup_callSavepoint("005F", kCharacterTableB, kCharacterActionDrawTablesWithChairs, "005G");
-			break;
-
-		case 7:
-			getEntities()->updatePositionExit(kCharacterAlexei, kCarRestaurant, 63);
-			getSavePoints()->push(kCharacterAlexei, kCharacterWaiter2, kCharacterAction302996448);
-
-			setCallback(8);
-			setup_draw("934");
-			break;
-
-		case 8:
-			setCallback(9);
-			setup_draw("811DS");
-			break;
-
-		case 9:
-			setCallback(10);
-			setup_enterComparment();
-			break;
-
-		case 10:
-			if (getEntities()->isPlayerPosition(kCarGreenSleeping, 61))
-				getScenes()->loadSceneFromPosition(kCarGreenSleeping, 49);
-
-			setCallback(11);
-			setup_compartmentLogic(kTime1098000, "411");
-			break;
-
-		case 11:
-			setup_goSalon();
-			break;
-		}
-		break;
-	}
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(20, Alexei, goSalon)
-	switch (savepoint.action) {
-	default:
-		break;
-
-	case kCharacterActionDefault:
-		setCallback(1);
-		setup_exitCompartment();
-		break;
-
-	case kCharacterActionCallback:
-		switch (getCallback()) {
-		default:
-			break;
-
-		case 1:
-			setCallback(2);
-			setup_updateEntity(kCarRestaurant, kPosition_850);
-			break;
-
-		case 2:
-			setCallback(3);
-			setup_callbackActionRestaurantOrSalon();
-			break;
-
-		case 3:
-			getData()->entityPosition = kPosition_1540;
-			getData()->location = kLocationOutsideCompartment;
-
-			setCallback(4);
-			setup_updatePosition("103A", kCarRestaurant, 52);
-			break;
-
-		case 4:
-			getData()->location = kLocationInsideCompartment;
-			setup_sitting();
-			break;
-		}
-		break;
-	}
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(21, Alexei, sitting)
-	switch (savepoint.action) {
-	default:
-		break;
-
-	case kCharacterActionNone:
-		if (Entity::updateParameterCheck(params->param2, getState()->time, params->param1) && getEntities()->isSomebodyInsideRestaurantOrSalon()) {
-			getData()->location = kLocationOutsideCompartment;
-			getData()->inventoryItem = kItemNone;
-
-			setCallback(1);
-			setup_updatePosition("103C", kCarRestaurant, 52);
-		}
-		break;
-
-	case kCharacterAction1:
-		getData()->inventoryItem = kItemNone;
-
-		setCallback(2);
-		setup_savegame(kSavegameTypeEvent, kEventAlexeiSalonPoem);
-		break;
-
-	case kCharacterActionDefault:
-		getEntities()->drawSequenceLeft(kCharacterAlexei, "103B");
-		params->param1 = 225 * (4 * rnd(3) + 4);
-
-		if (!HELPERgetEvent(kEventAlexeiSalonPoem))
-			getData()->inventoryItem = kItemParchemin;
-		break;
-
-	case kCharacterActionCallback:
-		switch (getCallback()) {
-		default:
-			break;
-
-		case 1:
-			getData()->location = kLocationInsideCompartment;
-			setup_standingAtWindow();
-			break;
-
-		case 2:
-			getActionOld()->playAnimation(kEventAlexeiSalonPoem);
-			getData()->location = kLocationOutsideCompartment;
-
-			getEntities()->drawSequenceRight(kCharacterAlexei, "103D");
-			getScenes()->loadSceneFromPosition(kCarRestaurant, 55);
-			getEntities()->updatePositionEnter(kCharacterAlexei, kCarRestaurant, 52);
-
-			setCallback(3);
-			setup_callbackActionOnDirection();
-			break;
-
-		case 3:
-			getEntities()->drawSequenceLeft(kCharacterAlexei, "103B");
-			getEntities()->updatePositionExit(kCharacterAlexei, kCarRestaurant, 52);
-			getData()->location = kLocationInsideCompartment;
-			break;
-		}
-		break;
-	}
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(22, Alexei, standingAtWindow)
-	switch (savepoint.action) {
-	default:
-		break;
-
-	case kCharacterActionNone:
-		if (Entity::updateParameterCheck(params->param2, getState()->time, params->param1)) {
-			if (getEntities()->isSomebodyInsideRestaurantOrSalon()) {
-				getData()->location = kLocationOutsideCompartment;
-				getData()->inventoryItem = kItemNone;
-
-				setCallback(1);
-				setup_updatePosition("103D", kCarRestaurant, 52);
-				break;
-			}
-		}
-
-		if (params->param3 == kTimeInvalid || getState()->time <= kTime1111500)
-			break;
-
-		if (getState()->time > kTime1138500) {
-			params->param3 = kTimeInvalid;
-		} else {
-			if ((!getEntities()->isInSalon(kCharacterCath) && !getEntities()->isInRestaurant(kCharacterCath)) || !params->param3)
-				params->param3 = (uint)getState()->time;
-
-			if (params->param3 >= getState()->time)
-				break;
-
-			params->param3 = kTimeInvalid;
-		}
-
-		getData()->inventoryItem = kItemNone;
-
-		setup_waitingForTatiana();
-		break;
-
-	case kCharacterAction1:
-		setCallback(2);
-		setup_savegame(kSavegameTypeEvent, kEventAlexeiSalonPoem);
-		break;
-
-	case kCharacterActionDefault:
-		params->param1 = 225 * (4 * rnd(4) + 8);
-		getEntities()->drawSequenceLeft(kCharacterAlexei, "103E");
-		if (!HELPERgetEvent(kEventAlexeiSalonPoem))
-			getData()->inventoryItem = kItemParchemin;
-		break;
-
-	case kCharacterActionCallback:
-		switch (getCallback()) {
-		default:
-			break;
-
-		case 1:
-			getData()->location = kLocationInsideCompartment;
-			setup_sitting();
-			break;
-
-		case 2:
-			getActionOld()->playAnimation(kEventAlexeiSalonPoem);
-			getData()->inventoryItem = kItemNone;
-			getData()->location = kLocationOutsideCompartment;
-
-			getEntities()->drawSequenceRight(kCharacterAlexei, "103D");
-			getEntities()->updatePositionEnter(kCharacterAlexei, kCarRestaurant, 52);
-			getScenes()->loadSceneFromPosition(kCarRestaurant, 55);
-
-			setCallback(3);
-			setup_callbackActionOnDirection();
-			break;
-
-		case 3:
-			getEntities()->updatePositionExit(kCharacterAlexei, kCarRestaurant, 52);
-			getData()->location = kLocationInsideCompartment;
-
-			setup_sitting();
-			break;
-		}
-		break;
-	}
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(23, Alexei, waitingForTatiana)
-	switch (savepoint.action) {
-	default:
-		break;
-
-	case kCharacterActionNone:
-		getData()->inventoryItem = (!getEntities()->isInRestaurant(kCharacterTatiana) || HELPERgetEvent(kEventAlexeiSalonPoem)) ? kItemNone : kItemParchemin;
-		break;
-
-	case kCharacterAction1:
-		setCallback(2);
-		setup_savegame(kSavegameTypeEvent, kEventAlexeiSalonPoem);
-		break;
-
-	case kCharacterActionDefault:
-		getData()->location = kLocationInsideCompartment;
-		getSavePoints()->push(kCharacterAlexei, kCharacterTatiana, kCharacterAction124973510);
-		break;
-
-	case kCharacterActionCallback:
-		switch (getCallback()) {
-		default:
-			break;
-
-		case 1:
-			getActionOld()->playAnimation(kEventAlexeiSalonVassili);
-
-			getData()->location = kLocationOutsideCompartment;
-
-			getEntities()->drawSequenceLeft(kCharacterAlexei, "103F");
-			getScenes()->processScene();
-
-			setup_upset();
-			break;
-
-		case 2:
-			getActionOld()->playAnimation(kEventAlexeiSalonPoem);
-
-			getData()->inventoryItem = kItemNone;
-
-			getScenes()->loadSceneFromPosition(kCarRestaurant, 55);
-			break;
-		}
-		break;
-
-	case kCharacterAction157159392:
-		if (getEntities()->isInSalon(kCharacterCath)) {
-			setCallback(1);
-			setup_savegame(kSavegameTypeEvent, kEventAlexeiSalonVassili);
-		} else {
-			setup_upset();
-		}
-		break;
-
-	case kCharacterAction188784532:
-		setup_upset();
-		break;
-	}
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(24, Alexei, upset)
-	switch (savepoint.action) {
-	default:
-		break;
-
-	case kCharacterAction1:
-		getData()->inventoryItem = kItemNone;
-		setCallback(1);
-		setup_savegame(kSavegameTypeEvent, kEventAlexeiSalonCath);
-		break;
-
-	case kCharacterActionDefault:
-		if (HELPERgetEvent(kEventAlexeiSalonVassili))
-			getData()->inventoryItem = kItemInvalid;
-		break;
-
-	case kCharacterActionCallback:
-		switch (getCallback()) {
-		default:
-			break;
-
-		case 1:
-			getActionOld()->playAnimation(kEventAlexeiSalonCath);
-			getData()->car = kCarRedSleeping;
-			getData()->entityPosition = kPosition_9460;
-			getEntities()->clearSequences(kCharacterAlexei);
-			getScenes()->loadSceneFromPosition(kCarRestaurant, 55);
-			setup_returnCompartmentNight();
-			break;
-
-		case 2:
-			setup_returnCompartmentNight();
-			break;
-		}
-		break;
-
-	case kCharacterAction135854208:
-		getData()->inventoryItem = kItemNone;
-		setCallback(2);
-		setup_draw("103G");
-		break;
-	}
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(25, Alexei, returnCompartmentNight)
-	switch (savepoint.action) {
-	default:
-		break;
-
-	case kCharacterActionDefault:
-		setCallback(1);
-		setup_enterComparment();
-		break;
-
-	case kCharacterActionCallback:
-		switch (getCallback()) {
-		default:
-			break;
-
-		case 1:
-			if (getEntities()->isPlayerPosition(kCarGreenSleeping, 61))
-				getScenes()->loadSceneFromPosition(kCarGreenSleeping, 49);
-
-			setCallback(2);
-			setup_compartmentLogic(kTime1179000, "411");
-			break;
-
-		case 2:
-			setCallback(3);
-			setup_compartmentLogic(kTime1323000, "412");
-			break;
-
-		case 3:
-			setup_function26();
-			break;
-		}
-		break;
-	}
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(26, Alexei, function26)
-	switch (savepoint.action) {
-	default:
-		break;
-
-	case kCharacterActionNone:
-		Entity::timeCheck(kTime1512000, params->param1, WRAP_SETUP_FUNCTION(Alexei, setup_function27));
-		break;
-
-	case kCharacterActionDefault:
-		getData()->entityPosition = kPosition_7500;
-		getData()->car = kCarGreenSleeping;
-		getData()->location = kLocationInsideCompartment;
-
-		getObjects()->update(kObjectCompartment2, kCharacterCath, kObjectLocation1, kCursorHandKnock, kCursorHand);
-		getObjects()->update(kObjectHandleInsideBathroom, kCharacterCath, kObjectLocation1, kCursorHandKnock, kCursorHand);
-		getObjects()->update(kObject10, kCharacterCath, kObjectLocation1, kCursorKeepValue, kCursorKeepValue);
-
-		if (getEntities()->isPlayerPosition(kCarGreenSleeping, 61))
-			getScenes()->loadSceneFromPosition(kCarGreenSleeping, 66);
-
-		getEntities()->clearSequences(kCharacterAlexei);
-		break;
-	}
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(27, Alexei, function27)
-	if (savepoint.action == kCharacterActionDefault) {
-		getObjects()->update(kObject10, kCharacterCath, kObjectLocationNone, kCursorKeepValue, kCursorKeepValue);
-
-		if (getEntities()->isPlayerPosition(kCarGreenSleeping, 66))
-			getScenes()->loadSceneFromPosition(kCarGreenSleeping, 49);
-
-		getEntities()->drawSequenceLeft(kCharacterAlexei, "412");
-	}
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(28, Alexei, chapter2)
-	switch (savepoint.action) {
-	default:
-		break;
-
-	case kCharacterActionNone:
-		setup_inCompartment2();
-		break;
-
-	case kCharacterActionDefault:
-		getEntities()->clearSequences(kCharacterAlexei);
-
-		getObjects()->update(kObjectCompartment2, kCharacterAlexei, kObjectLocation1, kCursorHandKnock, kCursorHand);
-		getObjects()->update(kObject10, kCharacterCath, kObjectLocationNone, kCursorKeepValue, kCursorKeepValue);
-		getObjects()->update(kObjectHandleInsideBathroom, kCharacterAlexei, kObjectLocation1, kCursorHandKnock, kCursorHand);
-
-		getData()->entityPosition = kPosition_7500;
-		getData()->location = kLocationInsideCompartment;
-		getData()->car = kCarGreenSleeping;
-		getData()->clothes = kClothesDefault;
-		getData()->inventoryItem = kItemNone;
-		break;
-	}
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(29, Alexei, inCompartment2)
-	switch (savepoint.action) {
-	default:
-		break;
-
-	case kCharacterActionDefault:
-		setCallback(1);
-		setup_compartmentLogic(kTime1791000, "411");
-		break;
-
-	case kCharacterActionCallback:
-		switch (getCallback()) {
-		default:
-			break;
-
-		case 1:
-			setCallback(2);
-			setup_exitCompartment();
-			break;
-
-		case 2:
-			setCallback(3);
-			setup_updateEntity(kCarRestaurant, kPosition_850);
-			break;
-
-		case 3:
-			setCallback(4);
-			setup_callbackActionRestaurantOrSalon();
-			break;
-
-		case 4:
-			getData()->entityPosition = kPosition_1540;
-			getData()->location = kLocationOutsideCompartment;
-
-			setCallback(5);
-			setup_draw("811US");
-			break;
-
-		case 5:
-			getEntities()->updatePositionEnter(kCharacterAlexei, kCarRestaurant, 63);
-
-			setCallback(6);
-			setup_callSavepoint("018B", kCharacterTableB, kCharacterAction136455232, "BOGUS");
-			break;
-
-		case 6:
-			getEntities()->updatePositionExit(kCharacterAlexei, kCarRestaurant, 63);
-			getSavePoints()->push(kCharacterAlexei, kCharacterTatiana, kCharacterAction290869168);
-			setup_atBreakfast();
-			break;
-		}
-		break;
-	}
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(30, Alexei, atBreakfast)
-	switch (savepoint.action) {
-	default:
-		break;
-
-	case kCharacterActionDefault:
-		getObjects()->update(kObjectCompartment2, kCharacterCath, kObjectLocation1, kCursorHandKnock, kCursorHand);
-		getData()->car = kCarRestaurant;
-		getData()->location = kLocationInsideCompartment;
-
-		getEntities()->drawSequenceLeft(kCharacterAlexei, "018C");
-		getSavePoints()->push(kCharacterAlexei, kCharacterTableB, kCharacterAction136455232);
-		break;
-
-	case kCharacterActionCallback:
-		switch (getCallback()) {
-		default:
-			break;
-
-		case 1:
-			getEntities()->updatePositionExit(kCharacterAlexei, kCarRestaurant, 63);
-			getSavePoints()->push(kCharacterAlexei, kCharacterTatiana, kCharacterAction156444784);
-			getEntities()->drawSequenceLeft(kCharacterAlexei, "018E");
-
-			if (getEntities()->isInRestaurant(kCharacterCath))
-				getProgress().field_68 = 1;
-
-			setCallback(2);
-			setup_playSound("TAT2116");
-			break;
-
-		case 2:
-			getSound()->playSound(kCharacterAlexei, "TAT2116A");
-			getEntities()->updatePositionEnter(kCharacterAlexei, kCarRestaurant, 63);
-
-			setCallback(3);
-			setup_callSavepoint("018F", kCharacterTatiana, kCharacterAction123857088, "BOGUS");
-			break;
-
-		case 3:
-			getEntities()->updatePositionExit(kCharacterAlexei, kCarRestaurant, 63);
-			setup_returnCompartment2();
-			break;
-		}
-		break;
-
-	case kCharacterAction236053296:
-		getEntities()->drawSequenceRight(kCharacterAlexei, "018D1");
-		getEntities()->drawSequenceRight(kCharacterTatiana, "018D2");
-		getEntities()->updatePositionEnter(kCharacterAlexei, kCarRestaurant, 63);
-
-		if (savepoint.param.intValue)
-			getScenes()->loadSceneFromPosition(kCarRestaurant, (PositionOld)savepoint.param.intValue);
-
-		setCallback(1);
-		setup_callbackActionOnDirection();
-		break;
-	}
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(31, Alexei, returnCompartment2)
-	switch (savepoint.action) {
-	default:
-		break;
-
-	case kCharacterActionDefault:
-		getEntities()->drawSequenceRight(kCharacterAlexei, "811DS");
-		if (getEntities()->isInRestaurant(kCharacterCath))
-			getEntities()->updateFrame(kCharacterAlexei);
-
-		setCallback(1);
-		setup_callbackActionOnDirection();
-		break;
-
-	case kCharacterActionCallback:
-		switch (getCallback()) {
-		default:
-			break;
-
-		case 1:
-			setCallback(2);
-			setup_enterComparment();
-			break;
-
-		case 2:
-			if (getEntities()->isPlayerPosition(kCarGreenSleeping, 61))
-				getScenes()->loadSceneFromPosition(kCarGreenSleeping, 49);
-
-			setCallback(3);
-			setup_compartmentLogic(kTimeEnd, "411");
-			break;
-		}
-		break;
-	}
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(32, Alexei, chapter3)
-	switch (savepoint.action) {
-	default:
-		break;
-
-	case kCharacterActionNone:
-		setup_playingChess();
-		break;
-
-	case kCharacterActionDefault:
-		getEntities()->clearSequences(kCharacterAlexei);
-
-		getObjects()->update(kObjectCompartment2, kCharacterCath, kObjectLocation1, kCursorHandKnock, kCursorHand);
-		getObjects()->update(kObject10, kCharacterCath, kObjectLocationNone, kCursorKeepValue, kCursorKeepValue);
-		getObjects()->update(kObjectHandleInsideBathroom, kCharacterCath, kObjectLocation1, kCursorHandKnock, kCursorHand);
-
-		getData()->location = kLocationInsideCompartment;
-		getData()->car = kCarRestaurant;
-		getData()->clothes = kClothesDefault;
-		getData()->inventoryItem = kItemNone;
-		break;
-	}
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(33, Alexei, playingChess)
-	switch (savepoint.action) {
-	default:
-		break;
-
-	case kCharacterActionCallback:
-		if (getCallback() == 1)
-			setup_inPart3();
-		break;
-
-	case kCharacterAction122288808:
-		getData()->entityPosition = kPosition_9270;
-		getData()->location = kLocationOutsideCompartment;
-		getData()->car = kCarRedSleeping;
-
-		setCallback(1);
-		setup_enterComparment();
-		break;
-
-	case kCharacterAction122358304:
-		getEntities()->drawSequenceLeft(kCharacterAlexei, "BLANK");
-		break;
-	}
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(34, Alexei, inPart3)
-	switch (savepoint.action) {
-	default:
-		break;
-
-	case kCharacterActionDefault:
-		if (getEntities()->isPlayerPosition(kCarGreenSleeping, 61))
-			getScenes()->loadSceneFromPosition(kCarGreenSleeping, 49);
-
-		setCallback(1);
-		setup_compartmentLogic(kTime2083500, "411");
-		break;
-
-	case kCharacterActionCallback:
-		switch (getCallback()) {
-		default:
-			break;
-
-		case 1:
-			setCallback(2);
-			setup_exitCompartment();
-			break;
-
-		case 2:
-			setCallback(3);
-			setup_updateEntity(kCarRestaurant, kPosition_850);
-			break;
-
-		case 3:
-			setCallback(4);
-			setup_callbackActionRestaurantOrSalon();
-			break;
-
-		case 4:
-			getData()->entityPosition = kPosition_1540;
-			getData()->location = kLocationOutsideCompartment;
-
-			setCallback(5);
-			setup_updatePosition("103A", kCarRestaurant, 52);
-			break;
-
-		case 5:
-			setCallback(6);
-			setup_pacing3();
-			break;
-
-		case 6:
-			setCallback(7);
-			setup_enterComparment();
-			break;
-
-		case 7:
-			getObjects()->update(kObject10, kCharacterCath, kObjectLocation1, kCursorKeepValue, kCursorKeepValue);
-			if (getEntities()->isPlayerPosition(kCarGreenSleeping, 61))
-				getScenes()->loadSceneFromPosition(kCarGreenSleeping, 66);
-
-			setCallback(8);
-			setup_compartmentLogic(kTime2124000, "NONE");
-			break;
-
-		case 8:
-			setCallback(9);
-			setup_exitCompartment();
-			break;
-
-		case 9:
-			setCallback(10);
-			setup_goSalon3();
-			break;
-
-		case 10:
-			getObjects()->update(kObject10, kCharacterCath, kObjectLocationNone, kCursorKeepValue, kCursorKeepValue);
-			if (getEntities()->isPlayerPosition(kCarGreenSleeping, 66))
-				getScenes()->loadSceneFromPosition(kCarGreenSleeping, 49);
-
-			setCallback(11);
-			setup_compartmentLogic(kTime16451100, "411");
-			break;
-		}
-		break;
-	}
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(35, Alexei, pacing3)
-	switch (savepoint.action) {
-	default:
-		break;
-
-	case kCharacterActionNone:
-		if (getEntities()->isInSalon(kCharacterCath)) {
-			if (Entity::updateParameterCheck(params->param2, getState()->time, 2700)) {
-				setCallback(1);
-				setup_callbackActionRestaurantOrSalon();
-				break;
-			}
-		} else {
-			params->param2 = 0;
-		}
-
-		if (Entity::updateParameterCheck(params->param3, getState()->time, params->param1)) {
-			if (getEntities()->isSomebodyInsideRestaurantOrSalon()) {
-				setCallback(3);
-				setup_pacingAtWindow();
-				break;
-			}
-		}
-
-label_callback_3:
-		if (!Entity::updateParameter(params->param4, getState()->time, 9000))
-			break;
-
-		setCallback(4);
-		setup_callbackActionRestaurantOrSalon();
-		break;
-
-	case kCharacterActionDefault:
-		params->param1 = 15 * rnd(120);
-		getEntities()->drawSequenceLeft(kCharacterAlexei, "103B");
-		getData()->location = kLocationInsideCompartment;
-		break;
-
-	case kCharacterActionCallback:
-		switch (getCallback()) {
-		default:
-			break;
-
-		case 1:
-		case 4:
-			getData()->location = kLocationOutsideCompartment;
-
-			setCallback(getCallback() + 1);
-			setup_updatePosition("124C", kCarRestaurant, 52);
-			break;
-
-		case 2:
-		case 5:
-			callbackAction();
-			break;
-
-		case 3:
-			params->param1 = 15 * rnd(120);
-			params->param3 = 0;
-			goto label_callback_3;
-		}
-		break;
-	}
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(36, Alexei, goSalon3)
-	switch (savepoint.action) {
-	default:
-		break;
-
-	case kCharacterActionNone:
-		if (params->param3 || params->param2)
-			break;
-
-		if (!Entity::updateParameter(params->param4, getState()->timeTicks, params->param1))
-			break;
-
-		getEntities()->drawSequenceRight(kCharacterAlexei, "124B");
-
-		params->param2 = 1;
-		params->param4 = 0;
-		break;
-
-	case kCharacterActionExitCompartment:
-		if (params->param2) {
-			getEntities()->drawSequenceLeft(kCharacterAlexei, "124A");
-			params->param1 = 5 * (3 * rnd(15) + 15);
-			params->param2 = 0;
-		}
-		break;
-
-	case kCharacterActionDefault:
-		params->param1 = 5 * (3 * rnd(15) + 15);
-
-		setCallback(1);
-		setup_updateEntity(kCarRestaurant, kPosition_850);
-		break;
-
-	case kCharacterActionCallback:
-		switch (getCallback()) {
-		default:
-			break;
-
-		case 1:
-			setCallback(2);
-			setup_callbackActionRestaurantOrSalon();
-			break;
-
-		case 2:
-			getSavePoints()->push(kCharacterAlexei, kCharacterAbbot, kCharacterAction222609266);
-			getData()->entityPosition = kPosition_1540;
-			getData()->location = kLocationOutsideCompartment;
-
-			setCallback(3);
-			setup_updatePosition("103A", kCarRestaurant, 52);
-			break;
-
-		case 3:
-			getData()->location = kLocationInsideCompartment;
-			getEntities()->drawSequenceLeft(kCharacterAlexei, "124A");
-			break;
-
-		case 4:
-			callbackAction();
-			break;
-		}
-		break;
-
-	case kCharacterAction122288808:
-		setCallback(4);
-		setup_enterComparment();
-		break;
-
-	case kCharacterAction122358304:
-		getEntities()->drawSequenceLeft(kCharacterAlexei, "BLANK");
-		params->param3 = 1;
-		break;
-	}
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(37, Alexei, chapter4)
-	switch (savepoint.action) {
-	default:
-		break;
-
-	case kCharacterActionNone:
-		setup_inCompartment4();
-		break;
-
-	case kCharacterActionDefault:
-		getEntities()->clearSequences(kCharacterAlexei);
-
-		getObjects()->update(kObjectCompartment2, kCharacterCath, kObjectLocation1, kCursorHandKnock, kCursorHand);
-		getObjects()->update(kObject10, kCharacterCath, kObjectLocationNone, kCursorKeepValue, kCursorKeepValue);
-		getObjects()->update(kObjectHandleInsideBathroom, kCharacterCath, kObjectLocation1, kCursorHandKnock, kCursorHand);
-
-		getData()->entityPosition = kPosition_7500;
-		getData()->location = kLocationInsideCompartment;
-		getData()->car = kCarGreenSleeping;
-		getData()->inventoryItem = kItemNone;
-		break;
-	}
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(38, Alexei, inCompartment4)
-	switch (savepoint.action) {
-	default:
-		break;
-
-	case kCharacterActionDefault:
-		setCallback(1);
-		setup_compartmentLogic(kTime2354400, "411");
-		break;
-
-	case kCharacterActionCallback:
-		if (getCallback() == 1)
-			setup_meetTatiana();
-		break;
-	}
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(39, Alexei, meetTatiana)
-	switch (savepoint.action) {
-	default:
-		break;
-
-	case kCharacterActionNone:
-		if (!params->param2)
-			break;
-
-		if (!params->param4) {
-			params->param3 = (uint)getState()->time + 4500;
-			params->param4 = (uint)getState()->time + 9000;
-		}
-
-		if (params->param5 != kTimeInvalid && params->param3 < getState()->time) {
-
-			if (params->param4 >= getState()->time) {
-				if (getEntities()->isInGreenCarEntrance(kCharacterCath) || !params->param5)
-					params->param5 = (uint)getState()->time;
-
-				if (params->param5 >= getState()->time)
-					break;
-			}
-
-			params->param5 = kTimeInvalid;
-
-			getEntities()->updatePositionExit(kCharacterAlexei, kCarGreenSleeping, 70);
-			getEntities()->updatePositionExit(kCharacterAlexei, kCarGreenSleeping, 71);
-
-			if (getEntities()->isInGreenCarEntrance(kCharacterCath)) {
-				getSound()->excuseMe(kCharacterAlexei);
-
-				if (getEntities()->isPlayerPosition(kCarGreenSleeping, 62))
-					getScenes()->loadSceneFromPosition(kCarGreenSleeping, 72);
-			}
-
-			setup_leavePlatform();
-		}
-		break;
-
-	case kCharacterActionExitCompartment:
-		if (!params->param1 && !params->param2)
-			getEntities()->drawSequenceLeft(kCharacterAlexei, "306F");
-		break;
-
-	case kCharacterActionDefault:
-		setCallback(1);
-		setup_enterExitCompartment("602FB", kObjectCompartment2);
-		break;
-
-	case kCharacterActionDrawScene:
-		if (getEntities()->isPlayerPosition(kCarGreenSleeping, 62)) {
-			if (params->param1) {
-				if (!params->param2)
-					break;
-			} else if (!params->param2) {
-				getEntities()->drawSequenceRight(kCharacterAlexei, "306A");
-				break;
-			}
-
-			setup_leavePlatform();
-		}
-		break;
-
-	case kCharacterActionCallback:
-		switch (getCallback()) {
-		default:
-			break;
-
-		case 1:
-			getObjects()->update(kObjectCompartment2, kCharacterCath, kObjectLocationNone, kCursorHandKnock, kCursorHand);
-			getData()->location = kLocationOutsideCompartment;
-
-			setCallback(2);
-			setup_updateEntity(kCarGreenSleeping, kPosition_540);
-			break;
-
-		case 2:
-			getEntities()->clearSequences(kCharacterAlexei);
-
-			if (getEntities()->isInGreenCarEntrance(kCharacterCath)) {
-				getSound()->excuseMe(kCharacterAlexei);
-
-				if (getEntities()->isPlayerPosition(kCarGreenSleeping, 62))
-					getScenes()->loadSceneFromPosition(kCarGreenSleeping, 72);
-			}
-
-			getEntities()->updatePositionEnter(kCharacterAlexei, kCarGreenSleeping, 70);
-			getEntities()->updatePositionEnter(kCharacterAlexei, kCarGreenSleeping, 71);
-			break;
-		}
-		break;
-
-	case kCharacterAction123536024:
-		params->param2 = 1;
-		break;
-
-	case kCharacterAction123712592:
-		getEntities()->clearSequences(kCharacterAlexei);
-		params->param1 = 1;
-		break;
-	}
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(40, Alexei, leavePlatform)
-	switch (savepoint.action) {
-	default:
-		break;
-
-	case kCharacterActionDefault:
-		setCallback(1);
-		setup_updateEntity(kCarGreenSleeping, kPosition_7500);
-		break;
-
-	case kCharacterActionCallback:
-		switch (getCallback()) {
-		default:
-			break;
-
-		case 1:
-			getEntities()->drawSequenceRight(kCharacterAlexei, "602Eb");
-			getEntities()->enterCompartment(kCharacterAlexei, kObjectCompartment2);
-
-			getData()->location = kLocationInsideCompartment;
-
-			if (getEntities()->isInsideCompartment(kCharacterCath, kCarGreenSleeping, kPosition_7500)) {
-				getActionOld()->playAnimation(isNightOld() ? kEventCathTurningNight : kEventCathTurningDay);
-				getSound()->playSound(kCharacterCath, "BUMP");
-				getScenes()->loadSceneFromObject(kObjectCompartment2);
-			}
-
-			setCallback(2);
-			setup_callbackActionOnDirection();
-			break;
-
-		case 2:
-			getEntities()->exitCompartment(kCharacterAlexei, kObjectCompartment2);
-			getData()->entityPosition = kPosition_7500;
-			getData()->location = kLocationInsideCompartment;
-			getEntities()->clearSequences(kCharacterAlexei);
-
-			setup_inCompartmentAgain();
-			break;
-		}
-		break;
-	}
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(41, Alexei, inCompartmentAgain)
-	switch (savepoint.action) {
-	default:
-		break;
-
-	case kCharacterActionDefault:
-		if (getEntities()->isPlayerPosition(kCarGreenSleeping, 66))
-			getScenes()->loadSceneFromPosition(kCarGreenSleeping, 49);
-
-		setCallback(1);
-		setup_compartmentLogic(kTime2403000, "411");
-		break;
-
-	case kCharacterActionCallback:
-		if (getCallback() == 1)
-			setup_goSalon4();
-		break;
-	}
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(42, Alexei, goSalon4)
-	switch (savepoint.action) {
-	default:
-		break;
-
-	case kCharacterActionDefault:
-		setCallback(1);
-		setup_exitCompartment();
-		break;
-
-	case kCharacterActionCallback:
-		switch (getCallback()) {
-		default:
-			break;
-
-		case 1:
-			getSavePoints()->push(kCharacterAlexei, kCharacterTatiana, kCharacterAction191198209);
-
-			setCallback(2);
-			setup_updateEntity(kCarRestaurant, kPosition_850);
-			break;
-
-		case 2:
-			setCallback(3);
-			setup_updatePosition("103A", kCarRestaurant, 52);
-			break;
-
-		case 3:
-			getData()->location = kLocationInsideCompartment;
-			setup_pacing();
-			break;
-		}
-		break;
-	}
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(43, Alexei, pacing)
-	switch (savepoint.action) {
-	default:
-		break;
-
-	case kCharacterActionNone:
-		if (getState()->time < kTime1806300 && Entity::updateParameterCheck(params->param2, getState()->time, params->param1)) {
-			if (getEntities()->isSomebodyInsideRestaurantOrSalon()) {
-				setCallback(1);
-				setup_pacingAtWindow();
-				break;
-			}
-		}
-
-label_callback_1:
-		if (getState()->time > kTime2457000 && !params->param3) {
-			params->param3 = 1;
-
-			setCallback(2);
-			setup_callbackActionRestaurantOrSalon();
-		}
-		break;
-
-	case kCharacterActionDefault:
-		params->param1 = 5 * (3 * rnd(120) + 180);
-		getEntities()->drawSequenceLeft(kCharacterAlexei, "103B");
-		break;
-
-	case kCharacterActionCallback:
-		switch (getCallback()) {
-		default:
-			break;
-
-		case 1:
-			params->param1 = 5 * (3 * rnd(120) + 180);
-			params->param2 = 0;
-			goto label_callback_1;
-
-		case 2:
-			getData()->location = kLocationOutsideCompartment;
-
-			setCallback(3);
-			setup_updatePosition("124C", kCarRestaurant, 52);
-			break;
-
-		case 3:
-			setup_goToPlatform();
-			break;
-		}
-		break;
-	}
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(44, Alexei, goToPlatform)
-	switch (savepoint.action) {
-	default:
-		break;
-
-	case kCharacterActionNone:
-		if (getState()->time > kTime2475000 && !params->param1) {
-			params->param1 = 1;
-
-			getEntities()->updatePositionExit(kCharacterAlexei, kCarGreenSleeping, 70);
-			getEntities()->updatePositionExit(kCharacterAlexei, kCarGreenSleeping, 71);
-
-			if (getEntities()->isInGreenCarEntrance(kCharacterCath)) {
-				getSound()->excuseMe(kCharacterAlexei);
-
-				if (getEntities()->isPlayerPosition(kCarGreenSleeping, 62))
-					getScenes()->loadSceneFromPosition(kCarGreenSleeping, 72);
-
-			}
-			setup_returnCompartment4();
-		}
-		break;
-
-	case kCharacterActionDefault:
-		getData()->car = kCarRedSleeping;
-		getData()->location = kLocationOutsideCompartment;
-		getData()->entityPosition = kPosition_9460;
-
-		setCallback(1);
-		setup_updateEntity(kCarGreenSleeping, kPosition_540);
-		break;
-
-	case kCharacterActionDrawScene:
-		if (getEntities()->isPlayerPosition(kCarGreenSleeping, 62)) {
-			setCallback(2);
-			setup_draw("306A");
-		}
-		break;
-
-	case kCharacterActionCallback:
-		switch (getCallback()) {
-		default:
-			break;
-
-		case 1:
-			getEntities()->clearSequences(kCharacterAlexei);
-
-			if (getEntities()->isInGreenCarEntrance(kCharacterCath)) {
-				getSound()->excuseMe(kCharacterAlexei);
-
-				if (getEntities()->isPlayerPosition(kCarGreenSleeping, 62))
-					getScenes()->loadSceneFromPosition(kCarGreenSleeping, 72);
-			}
-
-			getEntities()->updatePositionEnter(kCharacterAlexei, kCarGreenSleeping, 70);
-			getEntities()->updatePositionEnter(kCharacterAlexei, kCarGreenSleeping, 71);
-			break;
-
-		case 2:
-			getEntities()->drawSequenceLeft(kCharacterAlexei, "306F");
-			break;
-		}
-		break;
-	}
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(45, Alexei, returnCompartment4)
-	switch (savepoint.action) {
-	default:
-		break;
-
-	case kCharacterActionDefault:
-		setCallback(1);
-		setup_enterComparment();
-		break;
-
-	case kCharacterActionCallback:
-		if (getCallback() == 1) {
-			if (getEntities()->isPlayerPosition(kCarGreenSleeping, 66))
-				getScenes()->loadSceneFromPosition(kCarGreenSleeping, 49);
-
-			if (getInventory()->hasItem(kItemBomb)) {
-				setup_bombPlanB();
-			} else {
-				setCallback(2);
-				setup_compartmentLogic(kTimeEnd, "412");
-			}
-		}
-		break;
-	}
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(46, Alexei, bombPlanB)
-	switch (savepoint.action) {
-	default:
-		break;
-
-	case kCharacterActionNone:
-		if (params->param1 == kTimeInvalid)
-			break;
-
-		if (getState()->time <= kTime2493000) {
-
-			if (getEntities()->isInSalon(kCharacterCath) || getEntities()->isInSalon(kCharacterAugust) || !params->param1)
-				params->param1 = (uint)getState()->time;
-
-			if (params->param1 >= getState()->time)
-				break;
-		}
-
-		params->param1 = kTimeInvalid;
-
-		getScenes()->loadSceneFromItemPosition(kItem22);
-
-		if (getEntities()->isInSalon(kCharacterCath)) {
-			getSound()->excuseMe(kCharacterAlexei);
-
-			getScenes()->loadSceneFromPosition(kCarRestaurant, getScenes()->get(getState()->scene)->position);
-		}
-
-		setCallback(4);
-		setup_enterComparment();
-		break;
-
-	case kCharacterActionDefault:
-		setCallback(1);
-		setup_compartmentLogic(kTime2488500, "411");
-		break;
-
-	case kCharacterActionCallback:
-		switch (getCallback()) {
-		default:
-			break;
-
-		case 1:
-			setCallback(2);
-			setup_exitCompartment();
-			break;
-
-		case 2:
-			setCallback(3);
-			setup_updateEntity(kCarRedSleeping, kPosition_9460);
-			break;
-
-		case 4:
-			if (getEntities()->isPlayerPosition(kCarGreenSleeping, 66))
-				getScenes()->loadSceneFromPosition(kCarGreenSleeping, 49);
-
-			setCallback(5);
-			setup_compartmentLogic(kTime2507400, "412");
-			break;
-
-		case 5:
-			setCallback(6);
-			setup_enterExitCompartment("602Fb", kObjectCompartment2);
-			break;
-
-		case 6:
-			getObjects()->update(kObjectCompartment2, kCharacterCath, kObjectLocationNone, kCursorHandKnock, kCursorHand);
-			getData()->location = kLocationOutsideCompartment;
-
-			setCallback(7);
-			setup_updateEntity(kCarRedSleeping, kPosition_7500);
-			break;
-
-		case 7:
-			getEntities()->drawSequenceRight(kCharacterAlexei, "602Eb");
-			getEntities()->enterCompartment(kCharacterAlexei, kObjectCompartmentB);
-			getData()->location = kLocationInsideCompartment;
-
-			if (getEntities()->checkFields19(kCharacterCath, kCarRedSleeping, kPosition_7850)) {
-				getActionOld()->playAnimation(isNightOld() ? kEventCathTurningNight : kEventCathTurningDay);
-				getSound()->playSound(kCharacterCath, "BUMP");
-				getScenes()->loadSceneFromObject(kObjectCompartmentB);
-			}
-
-			setCallback(8);
-			setup_callbackActionOnDirection();
-			break;
-
-		case 8:
-			getEntities()->exitCompartment(kCharacterAlexei, kObjectCompartmentB);
-			getEntities()->clearSequences(kCharacterAlexei);
-			getData()->entityPosition = kPosition_8200;
-			getData()->location = kLocationInsideCompartment;
-			getObjects()->update(kObjectCompartmentA, kCharacterCath, kObjectLocation1, kCursorNormal, kCursorNormal);
-			getObjects()->update(kObject48, kCharacterCath, kObjectLocation1, kCursorNormal, kCursorNormal);
-
-			setCallback(9);
-			setup_playSound("TAT4167");
-			break;
-
-		case 9:
-			getSavePoints()->push(kCharacterAlexei, kCharacterMaster, kCharacterAction156435676);
-			setup_function47();
-			break;
-		}
-		break;
-	}
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(47, Alexei, function47)
-	if (savepoint.action == kCharacterActionDefault) {
-		getEntities()->clearSequences(kCharacterAlexei);
-
-		getData()->entityPosition = kPositionNone;
-		getData()->location = kLocationOutsideCompartment;
-		getData()->car = kCarLocomotive;
-
-		getObjects()->update(kObjectCompartment2, kCharacterCath, kObjectLocationNone, kCursorHandKnock, kCursorHand);
-		getObjects()->update(kObjectHandleInsideBathroom, kCharacterCath, kObjectLocationNone, kCursorHandKnock, kCursorHand);
-	}
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(48, Alexei, chapter5)
-	if (savepoint.action == kCharacterActionDefault)
-		getEntities()->clearSequences(kCharacterAlexei);
-IMPLEMENT_FUNCTION_END
-
-} // End of namespace LastExpress
diff --git a/engines/lastexpress/entities/alexei.h b/engines/lastexpress/entities/alexei.h
deleted file mode 100644
index 9499d50dd79..00000000000
--- a/engines/lastexpress/entities/alexei.h
+++ /dev/null
@@ -1,208 +0,0 @@
-/* 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 3 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, see <http://www.gnu.org/licenses/>.
- *
- */
-
-#ifndef LASTEXPRESS_ALEXEI_H
-#define LASTEXPRESS_ALEXEI_H
-
-#include "lastexpress/entities/entity.h"
-
-namespace LastExpress {
-
-class LastExpressEngine;
-
-class Alexei : public Entity {
-public:
-	Alexei(LastExpressEngine *engine);
-	~Alexei() override {}
-
-	/**
-	 * Resets the character
-	 */
-	DECLARE_FUNCTION(reset)
-
-	/**
-	 * Plays sound
-	 *
-	 * @param filename The sound filename
-	 */
-	DECLARE_VFUNCTION_1(playSound, const char *filename)
-
-	/**
-	 * Updates parameter 2 using time value
-	 *
-	 * @param time The time to add
-	 */
-	DECLARE_FUNCTION_1(updateFromTime, uint32 time)
-
-	/**
-	 * Draws the character
-	 *
-	 * @param sequence The sequence to draw
-	 */
-	DECLARE_FUNCTION_1(draw, const char *sequence)
-
-	/**
-	 * Updates the position
-	 *
-	 * @param sequence1      The sequence to draw
-	 * @param car            The car
-	 * @param position       The position
-	 */
-	DECLARE_FUNCTION_3(updatePosition, const char *sequence1, CarIndex car, PositionOld position)
-
-	/**
-	 * Handles entering/exiting a compartment.
-	 *
-	 * @param sequence    The sequence to draw
-	 * @param compartment The compartment
-	 */
-	DECLARE_VFUNCTION_2(enterExitCompartment, const char *sequence, ObjectIndex compartment)
-
-	/**
-	 * Process callback action when the character direction is not kDirectionRight
-	 */
-	DECLARE_FUNCTION(callbackActionOnDirection)
-
-	/**
-	 * Call a savepoint (or draw sequence in default case)
-	 *
-	 * @param sequence1   The sequence to draw in the default case
-	 * @param character      The character
-	 * @param action      The action
-	 * @param sequence2   The sequence eraseData for the savepoint
-	 */
-	DECLARE_FUNCTION_4(callSavepoint, const char *sequence1, CharacterIndex entity, CharacterActions action, const char *sequence2)
-
-	/**
-	 * Saves the game
-	 *
-	 * @param savegameType The type of the savegame
-	 * @param param        The param for the savegame (EventIndex or TimeValue)
-	 */
-	DECLARE_VFUNCTION_2(savegame, SavegameType savegameType, uint32 param)
-
-	/**
-	 * Updates the character
-	 *
-	 * @param car            The car
-	 * @param entityPosition The character position
-	 */
-	DECLARE_VFUNCTION_2(updateEntity, CarIndex car, EntityPosition entityPosition)
-
-	/**
-	 * Draws the character along with another one
-	 *
-	 * @param savepoint   The savepoint
-	 *                      - The sequence to draw
-	 *                      - The sequence to draw for the second character
-	 *                      - The CharacterIndex of the second character
-	 */
-	DECLARE_FUNCTION_NOSETUP(draw2)
-
-	/**
-	 * Process callback action when somebody is standing in the restaurant or salon.
-	 */
-	DECLARE_FUNCTION(callbackActionRestaurantOrSalon)
-
-	DECLARE_FUNCTION(enterComparment)
-	DECLARE_FUNCTION(exitCompartment)
-	DECLARE_FUNCTION(pacingAtWindow)
-
-	/**
-	 * ???
-	 *
-	 * @param timeValue          The time value
-	 * @param sequence           The sequence to draw
-	 */
-	DECLARE_FUNCTION_2(compartmentLogic, TimeValue timeValue, const char *sequence)
-
-	/**
-	 * Setup Chapter 1
-	 */
-	DECLARE_VFUNCTION(chapter1)
-
-	/**
-	 * Handle Chapter 1 events
-	 */
-	DECLARE_FUNCTION(atDinner)
-	DECLARE_FUNCTION(returnCompartment)
-	DECLARE_FUNCTION(goSalon)
-	DECLARE_FUNCTION(sitting)
-	DECLARE_FUNCTION(standingAtWindow)
-	DECLARE_FUNCTION(waitingForTatiana)
-	DECLARE_FUNCTION(upset)
-	DECLARE_FUNCTION(returnCompartmentNight)
-	DECLARE_FUNCTION(function26)
-	DECLARE_FUNCTION(function27)
-
-	/**
-	 * Setup Chapter 2
-	 */
-	DECLARE_VFUNCTION(chapter2)
-
-	/**
-	 * Handle Chapter 2 events
-	 */
-	DECLARE_FUNCTION(inCompartment2)
-	DECLARE_FUNCTION(atBreakfast)
-	DECLARE_FUNCTION(returnCompartment2)
-
-	/**
-	 * Setup Chapter 3
-	 */
-	DECLARE_VFUNCTION(chapter3)
-
-	/**
-	 * Handle Chapter 3 events
-	 */
-	DECLARE_FUNCTION(playingChess)
-	DECLARE_FUNCTION(inPart3)
-	DECLARE_FUNCTION(pacing3)
-	DECLARE_FUNCTION(goSalon3)
-
-	/**
-	 * Setup Chapter 4
-	 */
-	DECLARE_VFUNCTION(chapter4)
-
-	/**
-	 * Handle Chapter 4 events
-	 */
-	DECLARE_FUNCTION(inCompartment4)
-	DECLARE_FUNCTION(meetTatiana)
-	DECLARE_FUNCTION(leavePlatform)
-	DECLARE_FUNCTION(inCompartmentAgain)
-	DECLARE_FUNCTION(goSalon4)
-	DECLARE_FUNCTION(pacing)
-	DECLARE_FUNCTION(goToPlatform)
-	DECLARE_FUNCTION(returnCompartment4)
-	DECLARE_FUNCTION(bombPlanB)
-	DECLARE_FUNCTION(function47)
-
-	/**
-	 * Setup Chapter 5
-	 */
-	DECLARE_VFUNCTION(chapter5)
-};
-
-} // End of namespace LastExpress
-
-#endif // LASTEXPRESS_ALEXEI_H
diff --git a/engines/lastexpress/entities/alouan.cpp b/engines/lastexpress/entities/alouan.cpp
deleted file mode 100644
index 84789440645..00000000000
--- a/engines/lastexpress/entities/alouan.cpp
+++ /dev/null
@@ -1,511 +0,0 @@
-/* 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 3 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, see <http://www.gnu.org/licenses/>.
- *
- */
-
-#include "lastexpress/entities/alouan.h"
-
-#include "lastexpress/game/entities.h"
-#include "lastexpress/game/logic.h"
-#include "lastexpress/game/object.h"
-#include "lastexpress/game/savepoint.h"
-#include "lastexpress/game/state.h"
-
-#include "lastexpress/lastexpress.h"
-
-namespace LastExpress {
-
-Alouan::Alouan(LastExpressEngine *engine) : Entity(engine, kCharacterAlouan) {
-	ADD_CALLBACK_FUNCTION(Alouan, reset);
-	ADD_CALLBACK_FUNCTION_SI(Alouan, enterExitCompartment);
-	ADD_CALLBACK_FUNCTION_S(Alouan, playSound);
-	ADD_CALLBACK_FUNCTION_I(Alouan, updateFromTime);
-	ADD_CALLBACK_FUNCTION_II(Alouan, updateEntity);
-	ADD_CALLBACK_FUNCTION(Alouan, peekF);
-	ADD_CALLBACK_FUNCTION(Alouan, peekH);
-	ADD_CALLBACK_FUNCTION(Alouan, goFtoH);
-	ADD_CALLBACK_FUNCTION(Alouan, goHtoF);
-	ADD_CALLBACK_FUNCTION(Alouan, chapter1);
-	ADD_CALLBACK_FUNCTION(Alouan, chapter1Handler);
-	ADD_CALLBACK_FUNCTION(Alouan, function12);
-	ADD_CALLBACK_FUNCTION(Alouan, chapter2);
-	ADD_CALLBACK_FUNCTION(Alouan, chapter2Handler);
-	ADD_CALLBACK_FUNCTION(Alouan, chapter3);
-	ADD_CALLBACK_FUNCTION(Alouan, chapter3Handler);
-	ADD_CALLBACK_FUNCTION(Alouan, chapter4);
-	ADD_CALLBACK_FUNCTION(Alouan, chapter4Handler);
-	ADD_CALLBACK_FUNCTION(Alouan, function19);
-	ADD_CALLBACK_FUNCTION(Alouan, chapter5);
-	ADD_CALLBACK_FUNCTION(Alouan, chapter5Handler);
-	ADD_CALLBACK_FUNCTION(Alouan, function22);
-	ADD_CALLBACK_FUNCTION(Alouan, hiding);
-	ADD_NULL_FUNCTION();
-}
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(1, Alouan, reset)
-	Entity::reset(savepoint);
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION_SI(2, Alouan, enterExitCompartment, ObjectIndex)
-	Entity::enterExitCompartment(savepoint);
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION_S(3, Alouan, playSound)
-	Entity::playSound(savepoint);
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION_I(4, Alouan, updateFromTime, uint32)
-	Entity::updateFromTime(savepoint);
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION_II(5, Alouan, updateEntity, CarIndex, EntityPosition)
-	Entity::updateEntity(savepoint, true);
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(6, Alouan, peekF)
-	Entity::goToCompartment(savepoint, kObjectCompartment6, kPosition_4070, "621Cf", "621Df");
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(7, Alouan, peekH)
-	Entity::goToCompartment(savepoint, kObjectCompartment8, kPosition_2740, "621Ch", "621Dh");
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(8, Alouan, goFtoH)
-	Entity::goToCompartmentFromCompartment(savepoint, kObjectCompartment6, kPosition_4070, "621Bf", kObjectCompartment8, kPosition_2740, "621Ah");
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(9, Alouan, goHtoF)
-	Entity::goToCompartmentFromCompartment(savepoint, kObjectCompartment8, kPosition_2740, "621Bh", kObjectCompartment6, kPosition_4070, "621Af");
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(10, Alouan, chapter1)
-	switch (savepoint.action) {
-	default:
-		break;
-
-	case kCharacterActionNone:
-		Entity::timeCheck(kTimeChapter1, params->param1, WRAP_SETUP_FUNCTION(Alouan, setup_chapter1Handler));
-		break;
-
-	case kCharacterActionDefault:
-		getData()->entityPosition = kPosition_2740;
-		getData()->location = kLocationInsideCompartment;
-		getData()->car = kCarGreenSleeping;
-
-		break;
-	}
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(11, Alouan, chapter1Handler)
-	switch (savepoint.action) {
-	default:
-		break;
-
-	case kCharacterActionNone:
-
-		if (Entity::timeCheckCallback(kTime1096200, params->param1, 1, WRAP_SETUP_FUNCTION(Alouan, setup_goHtoF)))
-			break;
-
-label_callback1:
-		if (getState()->time > kTime1162800 && !params->param2) {
-			params->param2 = 1;
-			getSavePoints()->push(kCharacterAlouan, kCharacterClerk, kCharacterAction191070912, kPosition_4070);
-			getData()->entityPosition = kPosition_4070;
-		}
-
-		if (getState()->time > kTime1179000 && !params->param3) {
-			params->param3 = 1;
-			getSavePoints()->push(kCharacterAlouan, kCharacterClerk, kCharacterAction191070912, kPosition_4840);
-
-			setCallback(2);
-			setup_goFtoH();
-		}
-		break;
-
-	case kCharacterActionCallback:
-		switch (getCallback()) {
-		default:
-			break;
-
-		case 1:
-			getData()->entityPosition = kPosition_4840;
-			goto label_callback1;
-		}
-		break;
-	}
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(12, Alouan, function12)
-	if (savepoint.action == kCharacterActionDefault) {
-		getObjects()->update(kObjectCompartment7, kCharacterCath, kObjectLocation3, kCursorHandKnock, kCursorHand);
-		getObjects()->update(kObjectCompartment5, kCharacterCath, kObjectLocation3, kCursorHandKnock, kCursorHand);
-
-		getData()->entityPosition = kPosition_4070;
-		getData()->location = kLocationInsideCompartment;
-		getData()->car = kCarGreenSleeping;
-
-		getEntities()->clearSequences(kCharacterAlouan);
-	}
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(13, Alouan, chapter2)
-	if (savepoint.action != kCharacterActionDefault)
-		return;
-
-	getEntities()->clearSequences(kCharacterAlouan);
-
-	getData()->entityPosition = kPosition_2740;
-	getData()->location = kLocationInsideCompartment;
-	getData()->car = kCarGreenSleeping;
-	getData()->clothes = kClothesDefault;
-	getData()->inventoryItem = kItemNone;
-
-	setup_chapter2Handler();
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(14, Alouan, chapter2Handler)
-	switch (savepoint.action) {
-	default:
-		break;
-
-	case kCharacterActionNone:
-		if (params->param2 == kTimeInvalid)
-			break;
-
-		if (getState()->time <= kTime1777500) {
-			if (!getEntities()->isPlayerInCar(kCarGreenSleeping) || !params->param2)
-				params->param2 = (uint)getState()->time + 75;
-
-			if (params->param2 >= getState()->time)
-				break;
-		}
-
-		params->param2 = kTimeInvalid;
-
-		setCallback(params->param1 ? 1 : 2);
-		if (params->param1)
-			setup_peekH();
-		else
-			setup_peekF();
-		break;
-
-	case kCharacterActionDefault:
-		getSavePoints()->push(kCharacterAlouan, kCharacterClerk, kCharacterAction191070912, kPosition_4840);
-		params->param1 = 1;
-		break;
-
-	case kCharacterActionCallback:
-		switch (getCallback()) {
-		default:
-			break;
-
-		case 3:
-			params->param1 = 0;
-			setCallback(4);
-			setup_playSound("Har2011");
-			break;
-
-		case 4:
-			setCallback(5);
-			setup_updateFromTime(900);
-			break;
-
-		case 5:
-			getSavePoints()->push(kCharacterAlouan, kCharacterFrancois, kCharacterAction190219584);
-			break;
-		}
-		break;
-
-	case kCharacterAction189489753:
-		setCallback(3);
-		setup_goHtoF();
-		break;
-	}
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(15, Alouan, chapter3)
-	switch (savepoint.action) {
-	default:
-		break;
-
-	case kCharacterActionNone:
-		setup_chapter3Handler();
-		break;
-
-	case kCharacterActionDefault:
-		getEntities()->clearSequences(kCharacterAlouan);
-
-		getData()->entityPosition = kPosition_2740;
-		getData()->location = kLocationInsideCompartment;
-		getData()->car = kCarGreenSleeping;
-
-		break;
-	}
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(16, Alouan, chapter3Handler)
-	switch (savepoint.action) {
-	default:
-		break;
-
-	case kCharacterActionNone:
-		if (Entity::timeCheckCallback(kTimeCitySalzbourg, params->param1, 1, WRAP_SETUP_FUNCTION(Alouan, setup_goHtoF)))
-			break;
-
-label_callback1:
-		if (params->param2 != kTimeInvalid && getState()->time > kTime1989000) {
-			if (Entity::timeCheckCar(kTime2119500, params->param2, 2, WRAP_SETUP_FUNCTION(Alouan, setup_peekF)))
-				break;
-		}
-
-label_callback2:
-		if (Entity::timeCheckCallback(kTime2052000, params->param3, 3, "Har1005", WRAP_SETUP_FUNCTION_S(Alouan, setup_playSound)))
-			break;
-
-label_callback3:
-		if (Entity::timeCheckCallback(kTime2133000, params->param4, 4, WRAP_SETUP_FUNCTION(Alouan, setup_goFtoH)))
-			break;
-
-label_callback4:
-		if (params->param5 != kTimeInvalid && getState()->time > kTime2151000) {
-			if (Entity::timeCheckCar(kTime2241000, params->param5, 5, WRAP_SETUP_FUNCTION(Alouan, setup_peekH)))
-				break;
-		}
-		break;
-
-	case kCharacterActionDefault:
-		getSavePoints()->push(kCharacterAlouan, kCharacterClerk, kCharacterAction191070912, kPosition_4840);
-		break;
-
-	case kCharacterActionCallback:
-		switch (getCallback()) {
-		default:
-			break;
-
-		case 1:
-			getData()->entityPosition = kPosition_4840;
-			goto label_callback1;
-
-		case 2:
-			goto label_callback2;
-
-		case 3:
-			goto label_callback3;
-
-		case 4:
-			goto label_callback4;
-		}
-		break;
-	}
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(17, Alouan, chapter4)
-	switch (savepoint.action) {
-	default:
-		break;
-
-	case kCharacterActionNone:
-		setup_chapter4Handler();
-		break;
-
-	case kCharacterActionDefault:
-		getEntities()->clearSequences(kCharacterAlouan);
-
-		getData()->entityPosition = kPosition_2740;
-		getData()->location = kLocationInsideCompartment;
-		getData()->car = kCarGreenSleeping;
-
-		break;
-	}
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(18, Alouan, chapter4Handler)
-	switch (savepoint.action) {
-	default:
-		break;
-
-	case kCharacterActionNone:
-		if (params->param1 != kTimeInvalid) {
-			if (Entity::timeCheckCar(kTime2443500, params->param1, 1, WRAP_SETUP_FUNCTION(Alouan, setup_peekH)))
-				break;
-		}
-
-label_callback1:
-		if (Entity::timeCheckCallback(kTime2455200, params->param2, 2, WRAP_SETUP_FUNCTION(Alouan, setup_goHtoF)))
-			break;
-
-label_callback2:
-		if (getState()->time > kTime2475000 && !params->param3) {
-			params->param3 = 1;
-			getSavePoints()->push(kCharacterAlouan, kCharacterClerk, kCharacterAction191070912, kPosition_4840);
-
-			setCallback(3);
-			setup_goFtoH();
-		}
-		break;
-
-	case kCharacterActionDefault:
-		getSavePoints()->push(kCharacterAlouan, kCharacterClerk, kCharacterAction191070912, kPosition_4840);
-		break;
-
-	case kCharacterActionCallback:
-		switch (getCallback()) {
-		default:
-			break;
-
-		case 1:
-			goto label_callback1;
-
-		case 2:
-			getSavePoints()->push(kCharacterAlouan, kCharacterClerk, kCharacterAction191070912, kPosition_4070);
-			goto label_callback2;
-		}
-		break;
-	}
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(19, Alouan, function19)
-	if (savepoint.action == kCharacterActionDefault) {
-		getObjects()->update(kObjectCompartment7, kCharacterCath, kObjectLocation3, kCursorHandKnock, kCursorHand);
-		getObjects()->update(kObjectCompartment5, kCharacterCath, kObjectLocation3, kCursorHandKnock, kCursorHand);
-
-		getData()->entityPosition = kPosition_2740;
-		getData()->location = kLocationInsideCompartment;
-		getData()->car = kCarGreenSleeping;
-
-		getEntities()->clearSequences(kCharacterAlouan);
-	}
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(20, Alouan, chapter5)
-	switch (savepoint.action) {
-	default:
-		break;
-
-	case kCharacterActionNone:
-		setup_chapter5Handler();
-		break;
-
-	case kCharacterActionDefault:
-		getEntities()->clearSequences(kCharacterAlouan);
-
-		getData()->entityPosition = kPosition_3969;
-		getData()->location = kLocationInsideCompartment;
-		getData()->car = kCarRestaurant;
-		getData()->clothes = kClothesDefault;
-		getData()->inventoryItem = kItemNone;
-
-		break;
-	}
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(21, Alouan, chapter5Handler)
-	if (savepoint.action == kCharacterActionProceedChapter5)
-		setup_function22();
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(22, Alouan, function22)
-	switch (savepoint.action) {
-	default:
-		break;
-
-	case kCharacterActionNone:
-		if (!Entity::updateParameter(params->param1, getState()->time, 2700))
-			break;
-
-		setup_hiding();
-		break;
-
-	case kCharacterActionDefault:
-		getData()->entityPosition = kPosition_5000;
-		getData()->location = kLocationOutsideCompartment;
-		getData()->car = kCarGreenSleeping;
-		break;
-
-	case kCharacterActionDrawScene:
-		if (getEntities()->isInsideTrainCar(kCharacterCath, kCarGreenSleeping))
-			setup_hiding();
-		break;
-	}
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(23, Alouan, hiding)
-	switch (savepoint.action) {
-	default:
-		break;
-
-	case kCharacterActionDefault:
-		setCallback(1);
-		setup_updateEntity(kCarGreenSleeping, kPosition_4070);
-		break;
-
-	case kCharacterActionCallback:
-		switch (getCallback()) {
-		default:
-			break;
-
-		case 1:
-			setCallback(2);
-			setup_enterExitCompartment("619AF", kObjectCompartment6);
-			break;
-
-		case 2:
-			getEntities()->clearSequences(kCharacterAlouan);
-
-			getData()->entityPosition = kPosition_4070;
-			getData()->location = kLocationInsideCompartment;
-
-			getObjects()->update(kObjectCompartment6, kCharacterCath, kObjectLocation1, kCursorHandKnock, kCursorHand);
-			break;
-		}
-		break;
-
-	case kCharacterAction135800432:
-		setup_nullfunction();
-		break;
-	}
-IMPLEMENT_FUNCTION_END
-
-//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_NULL_FUNCTION(24, Alouan)
-
-} // End of namespace LastExpress
diff --git a/engines/lastexpress/entities/alouan.h b/engines/lastexpress/entities/alouan.h
deleted file mode 100644
index 733fac86358..00000000000
--- a/engines/lastexpress/entities/alouan.h
+++ /dev/null
@@ -1,134 +0,0 @@
-/* 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 3 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, see <http://www.gnu.org/licenses/>.
- *
- */
-
-#ifndef LASTEXPRESS_ALOUAN_H
-#define LASTEXPRESS_ALOUAN_H
-
-#include "lastexpress/entities/entity.h"
-
-namespace LastExpress {
-
-class LastExpressEngine;
-
-class Alouan : public Entity {
-public:
-	Alouan(LastExpressEngine *engine);
-	~Alouan() override {}
-
-	/**
-	 * Resets the character
-	 */
-	DECLARE_FUNCTION(reset)
-
-	/**
-	 * Handles entering/exiting a compartment.
-	 *
-	 * @param sequence    The sequence to draw
-	 * @param compartment The compartment
-	 */
-	DECLARE_VFUNCTION_2(enterExitCompartment, const char *sequence, ObjectIndex compartment)
-
-	/**
-	 * Plays sound
-	 *
-	 * @param filename The sound filename
-	 */
-	DECLARE_VFUNCTION_1(playSound, const char *filename)
-
-	/**
-	 * Updates parameter 2 using time value
-	 *
-	 * @param time The time to add
-	 */
-	DECLARE_FUNCTION_1(updateFromTime, uint32 time)
-
-	/**
-	 * Updates the character
-	 *
-	 * @param car            The car
-	 * @param entityPosition The character position
-	 */
-	DECLARE_VFUNCTION_2(updateEntity, CarIndex car, EntityPosition entityPosition)
-
-	DECLARE_FUNCTION(peekF)
-	DECLARE_FUNCTION(peekH)
-	DECLARE_FUNCTION(goFtoH)
-	DECLARE_FUNCTION(goHtoF)
-
-	/**
-	 * Setup Chapter 1
-	 */
-	DECLARE_VFUNCTION(chapter1)
-
-	/**
-	 * Handle Chapter 1 events
-	 */
-	DECLARE_FUNCTION(chapter1Handler)
-	DECLARE_FUNCTION(function12)
-
-	/**
-	 * Setup Chapter 2
-	 */
-	DECLARE_VFUNCTION(chapter2)
-
-	/**
-	 * Handle Chapter 2 events
-	 */
-	DECLARE_FUNCTION(chapter2Handler)
-
-	/**
-	 * Setup Chapter 3
-	 */
-	DECLARE_VFUNCTION(chapter3)
-
-	/**
-	 * Handle Chapter 3 events
-	 */
-	DECLARE_FUNCTION(chapter3Handler)


Commit: 3c4eeaeec6e437aab8a14252587bed323dd29059
    https://github.com/scummvm/scummvm/commit/3c4eeaeec6e437aab8a14252587bed323dd29059
Author: AndywinXp (andywinxp at gmail.com)
Date: 2025-06-16T23:12:18+02:00

Commit Message:
LASTEXPRESS: Fix trivial MSVC warnings

Changed paths:
    engines/lastexpress/characters/vesna.cpp
    engines/lastexpress/game/events.cpp
    engines/lastexpress/game/logic.cpp
    engines/lastexpress/game/nis.cpp
    engines/lastexpress/game/nis.h
    engines/lastexpress/game/otis.cpp
    engines/lastexpress/game/vcr.cpp
    engines/lastexpress/sound/mixer.cpp
    engines/lastexpress/sound/slot.cpp
    engines/lastexpress/sound/sound.cpp
    engines/lastexpress/sound/subtitle.cpp


diff --git a/engines/lastexpress/characters/vesna.cpp b/engines/lastexpress/characters/vesna.cpp
index 45828a4d7b3..b1af56b88b2 100644
--- a/engines/lastexpress/characters/vesna.cpp
+++ b/engines/lastexpress/characters/vesna.cpp
@@ -760,7 +760,6 @@ void LogicManager::HAND_Vesna_InComp(HAND_PARAMS) {
 			}
 		}
 
-	LABEL_40:
 		setDoor(38, kCharacterVesna, 3, 0, 0);
 		if (msg->action == 9) {
 			getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8] = 1;
diff --git a/engines/lastexpress/game/events.cpp b/engines/lastexpress/game/events.cpp
index 3fa646a21d5..60cf2567c58 100644
--- a/engines/lastexpress/game/events.cpp
+++ b/engines/lastexpress/game/events.cpp
@@ -255,10 +255,10 @@ void MessageManager::saveMessages(CVCRFile *file) {
 	assert(msgData);
 
 	for (int i = 0; i < 128; i++) {
-		WRITE_LE_UINT32(msgData + (i * 16) + 0, _autoMessages[i].receiver);
-		WRITE_LE_UINT32(msgData + (i * 16) + 4, _autoMessages[i].action);
-		WRITE_LE_UINT32(msgData + (i * 16) + 8, _autoMessages[i].sender);
-		WRITE_LE_UINT32(msgData + (i * 16) + 12, _autoMessages[i].param.intParam);
+		WRITE_LE_INT32(msgData + (i * 16) + 0, _autoMessages[i].receiver);
+		WRITE_LE_INT32(msgData + (i * 16) + 4, _autoMessages[i].action);
+		WRITE_LE_INT32(msgData + (i * 16) + 8, _autoMessages[i].sender);
+		WRITE_LE_INT32(msgData + (i * 16) + 12, _autoMessages[i].param.intParam);
 	}
 
 	file->writeRLE(msgData, 16, 128);
@@ -276,10 +276,10 @@ void MessageManager::saveMessages(CVCRFile *file) {
 			msgData = (byte *)malloc(16);
 			assert(msgData);
 
-			WRITE_LE_UINT32(msgData + 0, msgToSave->receiver);
-			WRITE_LE_UINT32(msgData + 4, msgToSave->action);
-			WRITE_LE_UINT32(msgData + 8, msgToSave->sender);
-			WRITE_LE_UINT32(msgData + 12, msgToSave->param.intParam);
+			WRITE_LE_INT32(msgData + 0, msgToSave->receiver);
+			WRITE_LE_INT32(msgData + 4, msgToSave->action);
+			WRITE_LE_INT32(msgData + 8, msgToSave->sender);
+			WRITE_LE_INT32(msgData + 12, msgToSave->param.intParam);
 
 			nextIdx = (nextIdx + 1) & 0x7F;
 			file->writeRLE(msgData, 16, 1);
@@ -297,10 +297,10 @@ void MessageManager::loadMessages(CVCRFile *file) {
 	file->readRLE(msgData, 16, 128);
 
 	for (int i = 0; i < 128; i++) {
-		_autoMessages[i].receiver = READ_LE_UINT32(msgData + (i * 16) + 0);
-		_autoMessages[i].action = READ_LE_UINT32(msgData + (i * 16) + 4);
-		_autoMessages[i].sender = READ_LE_UINT32(msgData + (i * 16) + 8);
-		_autoMessages[i].param.intParam = READ_LE_UINT32(msgData + (i * 16) + 12);
+		_autoMessages[i].receiver = READ_LE_INT32(msgData + (i * 16) + 0);
+		_autoMessages[i].action = READ_LE_INT32(msgData + (i * 16) + 4);
+		_autoMessages[i].sender = READ_LE_INT32(msgData + (i * 16) + 8);
+		_autoMessages[i].param.intParam = READ_LE_INT32(msgData + (i * 16) + 12);
 		_autoMessages[i].param.stringParam = nullptr;
 	}
 
@@ -317,12 +317,11 @@ void MessageManager::loadMessages(CVCRFile *file) {
 
 		file->readRLE(msgData, 16, 1);
 
-		uint32 receiver = READ_LE_UINT32(msgData + 0);
-		uint32 action = READ_LE_UINT32(msgData + 4);
-		uint32 sender = READ_LE_UINT32(msgData + 8);
-		ConsCallParam param;
-		param.intParam = READ_LE_UINT32(msgData + 12);
-		param.stringParam = nullptr;
+		loadedMsg.receiver = READ_LE_INT32(msgData + 0);
+		loadedMsg.action = READ_LE_INT32(msgData + 4);
+		loadedMsg.sender = READ_LE_INT32(msgData + 8);
+		loadedMsg.param.intParam = READ_LE_INT32(msgData + 12);
+		loadedMsg.param.stringParam = nullptr;
 
 		addMessage(loadedMsg.receiver, loadedMsg.action, loadedMsg.sender, loadedMsg.param);
 		free(msgData);
diff --git a/engines/lastexpress/game/logic.cpp b/engines/lastexpress/game/logic.cpp
index 5ceca32f0d1..0074c0c87ed 100644
--- a/engines/lastexpress/game/logic.cpp
+++ b/engines/lastexpress/game/logic.cpp
@@ -1091,9 +1091,9 @@ bool LogicManager::obstacleBetween(int character1, int character2) {
 		char2Pos = getCharacter(character2).characterPosition.position;
 	}
 
-	for (i = 7; i > -1 && _objectPosition[i] < char1Pos; i--);
+	for (i = 7; i > -1 && _objectPosition[i] < (int)char1Pos; i--);
 
-	for (j = 0; j < 8 && _objectPosition[j] > char2Pos; j++);
+	for (j = 0; j < 8 && _objectPosition[j] > (int)char2Pos; j++);
 
 	if (i > -1 && j < 8) {
 		while (j <= i) {
@@ -1471,7 +1471,6 @@ void LogicManager::bumpCathTylerComp() {
 }
 
 int LogicManager::getSmartBumpNode(int node) {
-	int result;
 	uint8 effDir;
 	uint16 car = _trainData[node].nodePosition.car;
 
@@ -1874,140 +1873,139 @@ void LogicManager::queueSFX(int character, uint8 action, uint8 delay) {
 		if (inSalon(character) == inSalon(kCharacterCath)) {
 			sndNum = action;
 			volume = getVolume(character);
-			if (action < 256) {
-				switch (action) {
-				case 36:
-					ambientLevel = 16;
-					if (volume <= 9)
-						ambientLevel = volume + 7;
-					_engine->getSoundManager()->raiseAmbient(ambientLevel, delay);
-					break;
-				case 37:
-					_engine->getSoundManager()->levelAmbient(delay);
-					break;
-				case 150:
-					sndArray[0] = 151;
-					sndArray[1] = 152;
-					sndArray[2] = 153;
-					sndArray[3] = 154;
-					sndArray[4] = 155;
-					sndNum = sndArray[rnd(5)];
-					break;
-				case 156:
-					sndArray[0] = 157;
-					sndArray[1] = 158;
-					sndArray[2] = 159;
-					sndArray[3] = 160;
-					sndArray[4] = 161;
-					sndNum = sndArray[rnd(5)];
-					break;
-				case 162:
-					sndArray[0] = 163;
-					sndArray[1] = 164;
-					sndArray[2] = 165;
-					sndArray[3] = 166;
-					sndArray[4] = 167;
-					sndNum = sndArray[rnd(5)];
-					break;
-				case 168:
-					sndArray[0] = 169;
-					sndArray[1] = 170;
-					sndArray[2] = 171;
-					sndArray[3] = 172;
-					sndArray[4] = 173;
-					sndNum = sndArray[rnd(5)];
-					break;
-				case 174:
-					sndArray[0] = 175;
-					sndArray[1] = 176;
-					sndArray[2] = 177;
-					sndNum = sndArray[rnd(3)];
-					break;
-				case 180:
-					sndArray[0] = 181;
-					sndArray[1] = 182;
-					sndArray[2] = 183;
-					sndArray[3] = 184;
-					sndNum = sndArray[rnd(4)];
-					break;
-				case 184:
-					sndArray[0] = 185;
-					sndArray[1] = 186;
-					sndArray[2] = 187;
-					sndNum = sndArray[rnd(3)];
-					break;
-				case 188:
-					sndArray[0] = 189;
-					sndArray[1] = 190;
-					sndArray[2] = 191;
-					sndArray[3] = 192;
-					sndArray[4] = 193;
-					sndNum = sndArray[rnd(5)];
-					break;
-				case 194:
-					sndArray[0] = -61;
-					sndArray[1] = 196;
-					sndArray[2] = 197;
-					sndNum = sndArray[rnd(3)];
-					break;
-				case 198:
-					sndArray[0] = -57;
-					sndArray[1] = 200;
-					sndArray[2] = 201;
-					sndArray[3] = 202;
-					sndArray[4] = 203;
-					sndNum = sndArray[rnd(5)];
-					break;
-				case 246:
-					sndArray[0] = 0;
-					memcpy(&sndArray[1], "hint", 4);
-					sndNum = sndArray[rnd(5)];
-					break;
-				case 247:
-					sndArray[0] = 11;
-					memcpy(&sndArray[1], "{|", 2);
-					sndNum = sndArray[rnd(3)];
-					break;
-				case 248:
-					sndArray[0] = 0;
-					memcpy(&sndArray[1], "glm", 3);
-					sndNum = sndArray[rnd(4)];
-					break;
-				case 249:
-					sndArray[0] = 0;
-					memcpy(&sndArray[1], "8pq", 3);
-					sndNum = sndArray[rnd(4)];
-					break;
-				case 250:
-					sndArray[0] = 0;
-					memcpy(&sndArray[1], "ksu", 3);
-					sndNum = sndArray[rnd(4)];
-					break;
-				case 251:
-					sndArray[0] = 0;
-					sndArray[1] = 11;
-					memcpy(&sndArray[2], "8q", 2);
-					sndNum = sndArray[rnd(4)];
-					break;
-				case 252:
-					sndArray[0] = 0;
-					sndArray[1] = 6;
-					memcpy(&sndArray[2], "my", 2);
-					sndNum = sndArray[rnd(4)];
-					break;
-				case 254:
-					sndArray[0] = 0;
-					memcpy(&sndArray[1], "hxy", 3);
-					sndNum = sndArray[rnd(4)];
-					break;
-				case 255:
-					sndArray[0] = 0;
-					memcpy(&sndArray[1], "js", 2);
-					sndNum = sndArray[rnd(3)];
-					break;
-				default:
-					break;
-				}
+
+			switch (action) {
+			case 36:
+				ambientLevel = 16;
+				if (volume <= 9)
+					ambientLevel = volume + 7;
+				_engine->getSoundManager()->raiseAmbient(ambientLevel, delay);
+				break;
+			case 37:
+				_engine->getSoundManager()->levelAmbient(delay);
+				break;
+			case 150:
+				sndArray[0] = 151;
+				sndArray[1] = 152;
+				sndArray[2] = 153;
+				sndArray[3] = 154;
+				sndArray[4] = 155;
+				sndNum = sndArray[rnd(5)];
+				break;
+			case 156:
+				sndArray[0] = 157;
+				sndArray[1] = 158;
+				sndArray[2] = 159;
+				sndArray[3] = 160;
+				sndArray[4] = 161;
+				sndNum = sndArray[rnd(5)];
+				break;
+			case 162:
+				sndArray[0] = 163;
+				sndArray[1] = 164;
+				sndArray[2] = 165;
+				sndArray[3] = 166;
+				sndArray[4] = 167;
+				sndNum = sndArray[rnd(5)];
+				break;
+			case 168:
+				sndArray[0] = 169;
+				sndArray[1] = 170;
+				sndArray[2] = 171;
+				sndArray[3] = 172;
+				sndArray[4] = 173;
+				sndNum = sndArray[rnd(5)];
+				break;
+			case 174:
+				sndArray[0] = 175;
+				sndArray[1] = 176;
+				sndArray[2] = 177;
+				sndNum = sndArray[rnd(3)];
+				break;
+			case 180:
+				sndArray[0] = 181;
+				sndArray[1] = 182;
+				sndArray[2] = 183;
+				sndArray[3] = 184;
+				sndNum = sndArray[rnd(4)];
+				break;
+			case 184:
+				sndArray[0] = 185;
+				sndArray[1] = 186;
+				sndArray[2] = 187;
+				sndNum = sndArray[rnd(3)];
+				break;
+			case 188:
+				sndArray[0] = 189;
+				sndArray[1] = 190;
+				sndArray[2] = 191;
+				sndArray[3] = 192;
+				sndArray[4] = 193;
+				sndNum = sndArray[rnd(5)];
+				break;
+			case 194:
+				sndArray[0] = 195;
+				sndArray[1] = 196;
+				sndArray[2] = 197;
+				sndNum = sndArray[rnd(3)];
+				break;
+			case 198:
+				sndArray[0] = 198;
+				sndArray[1] = 200;
+				sndArray[2] = 201;
+				sndArray[3] = 202;
+				sndArray[4] = 203;
+				sndNum = sndArray[rnd(5)];
+				break;
+			case 246:
+				sndArray[0] = 0;
+				memcpy(&sndArray[1], "hint", 4);
+				sndNum = sndArray[rnd(5)];
+				break;
+			case 247:
+				sndArray[0] = 11;
+				memcpy(&sndArray[1], "{|", 2);
+				sndNum = sndArray[rnd(3)];
+				break;
+			case 248:
+				sndArray[0] = 0;
+				memcpy(&sndArray[1], "glm", 3);
+				sndNum = sndArray[rnd(4)];
+				break;
+			case 249:
+				sndArray[0] = 0;
+				memcpy(&sndArray[1], "8pq", 3);
+				sndNum = sndArray[rnd(4)];
+				break;
+			case 250:
+				sndArray[0] = 0;
+				memcpy(&sndArray[1], "ksu", 3);
+				sndNum = sndArray[rnd(4)];
+				break;
+			case 251:
+				sndArray[0] = 0;
+				sndArray[1] = 11;
+				memcpy(&sndArray[2], "8q", 2);
+				sndNum = sndArray[rnd(4)];
+				break;
+			case 252:
+				sndArray[0] = 0;
+				sndArray[1] = 6;
+				memcpy(&sndArray[2], "my", 2);
+				sndNum = sndArray[rnd(4)];
+				break;
+			case 254:
+				sndArray[0] = 0;
+				memcpy(&sndArray[1], "hxy", 3);
+				sndNum = sndArray[rnd(4)];
+				break;
+			case 255:
+				sndArray[0] = 0;
+				memcpy(&sndArray[1], "js", 2);
+				sndNum = sndArray[rnd(3)];
+				break;
+			default:
+				break;
 			}
 
 			if (sndNum) {
@@ -3293,7 +3291,7 @@ bool LogicManager::walk(int character, int car, int position) {
 			if (!_engine->getOtisManager()->rDirection(0))
 				return false;
 		} else {
-			if (cathPos >= characterPosition || characterPosition - cathPos < 500 || characterPosition - cathPos >= (uint16)getCharacter(character).walkStepSize + 500) {
+			if (cathPos >= characterPosition || characterPosition - cathPos < 500 || (int32)(characterPosition - cathPos) >= getCharacter(character).walkStepSize + 500) {
 				return false;
 			}
 
diff --git a/engines/lastexpress/game/nis.cpp b/engines/lastexpress/game/nis.cpp
index ef3312425c7..cee8a57f96c 100644
--- a/engines/lastexpress/game/nis.cpp
+++ b/engines/lastexpress/game/nis.cpp
@@ -92,7 +92,7 @@ void NISManager::convertNSPR16(byte *spriteData, NisSprite *outSprite) {
 		outSprite->eraseMask = &spriteData[eraseMaskOffset];
 }
 
-void NISManager::getStream(byte *data, uint32 size) {
+void NISManager::getStream(byte *data, int32 size) {
 	if (size > _remainingStreamBytes) {
 		Slot *slot;
 
@@ -128,10 +128,10 @@ void NISManager::getStream(byte *data, uint32 size) {
 	}
 }
 
-void NISManager::loadSnd(uint32 size) {
+void NISManager::loadSnd(int32 size) {
 	byte *currentBufferPtr = _currentNISSound->getCurrentBufferPtr();
 	byte *dataEnd = _currentNISSound->getDataEnd();
-	uint32 availableSize = dataEnd - currentBufferPtr;
+	int32 availableSize = dataEnd - currentBufferPtr;
 
 	if (size < dataEnd - currentBufferPtr) {
 		getStream(_currentNISSound->getCurrentBufferPtr(), size);
@@ -148,7 +148,7 @@ void NISManager::loadSnd(uint32 size) {
 		memcpy(_currentNISSound->getDataEnd(), _currentNISSound->getDataStart(), NIS_SOUND_CHUNK_SIZE);
 }
 
-int NISManager::loadChunk(uint32 size) {
+int NISManager::loadChunk(int32 size) {
 	int32 sizeToLoad = _totalStreamPages - ((_remainingStreamBytes + 2047) / PAGE_SIZE);
 
 	if (!_archive || (_archive->status & 2) == 0)
@@ -194,7 +194,6 @@ int NISManager::loadChunk(uint32 size) {
 bool NISManager::initNIS(const char *filename, int32 flags) {
 	int32 chunkSizeRead = 0;
 	int32 eventSize = 0;
-	int32 *p_eventSize = nullptr;
 	Slot *slot;
 
 	_currentNISSound = nullptr;
diff --git a/engines/lastexpress/game/nis.h b/engines/lastexpress/game/nis.h
index 9efe940eeb6..977246a9627 100644
--- a/engines/lastexpress/game/nis.h
+++ b/engines/lastexpress/game/nis.h
@@ -49,9 +49,9 @@ public:
 	void clearBounds();
 	void addBounds(Extent extent);
 	void convertNSPR16(byte *spriteData, NisSprite *outSprite);
-	void getStream(byte *data, uint32 size);
-	void loadSnd(uint32 size);
-	int loadChunk(uint32 size);
+	void getStream(byte *data, int32 size);
+	void loadSnd(int32 size);
+	int loadChunk(int32 size);
 	bool initNIS(const char *filename, int32 flags);
 	void endNIS();
 	void abortNIS();
@@ -88,7 +88,7 @@ private:
 	Slot *_chainedSoundSlot = nullptr;
 
 	int32 _streamCurrentPosition = 0;
-	uint32 _currentStreamPage = 0;
+	int32 _currentStreamPage = 0;
 	int32 _totalStreamPages = 0;
 	int32 _remainingStreamBytes = 0;
 	int32 _streamBufferSize = 0;
diff --git a/engines/lastexpress/game/otis.cpp b/engines/lastexpress/game/otis.cpp
index 205dc3f622d..d061d35460a 100644
--- a/engines/lastexpress/game/otis.cpp
+++ b/engines/lastexpress/game/otis.cpp
@@ -98,7 +98,6 @@ void OtisManager::wipeAllGSysInfo() {
 bool OtisManager::fDirection(int nodeIdx) {
 	uint16 car;
 	uint8 cathDir;
-	bool result = false;
 
 	if (!nodeIdx)
 		nodeIdx = _engine->getLogicManager()->_trainNodeIndex;
@@ -117,7 +116,6 @@ bool OtisManager::fDirection(int nodeIdx) {
 bool OtisManager::rDirection(int nodeIdx) {
 	uint16 car;
 	uint8 cathDir;
-	bool result = false;
 
 	if (!nodeIdx)
 		nodeIdx = _engine->getLogicManager()->_trainNodeIndex;
@@ -136,7 +134,6 @@ bool OtisManager::rDirection(int nodeIdx) {
 bool OtisManager::doorView() {
 	uint16 car;
 	uint8 cathDir;
-	bool result = false;
 
 	int32 nodeIdx = _engine->getLogicManager()->_trainNodeIndex;
 
@@ -157,7 +154,6 @@ bool OtisManager::doorView() {
 bool OtisManager::corrRender(int nodeIdx) {
 	uint16 car;
 	uint8 cathDir;
-	bool result = false;
 
 	if (!nodeIdx)
 		nodeIdx = _engine->getLogicManager()->_trainNodeIndex;
@@ -703,10 +699,10 @@ void OtisManager::drawLooseSprites() {
 
 	int offset;
 	if (corrRender(0)) {
-		if (getCharacter(kCharacterCath).characterPosition.car == 3) {
+		if (getCharacter(kCharacterCath).characterPosition.car == kCarGreenSleeping) {
 			offset = 1;
 		} else {
-			if (getCharacter(kCharacterCath).characterPosition.car != 4)
+			if (getCharacter(kCharacterCath).characterPosition.car != kCarRedSleeping)
 				return;
 			offset = 32;
 		}
@@ -714,10 +710,10 @@ void OtisManager::drawLooseSprites() {
 		for (int k = offset; k < offset + 8; ++k) {
 			if (_engine->getLogicManager()->_gameObjects[k].door == 2) {
 				Common::sprintf_s(seqName, "633X%c-%02d.seq", k - offset + 65, _engine->getLogicManager()->_trainData[_engine->getLogicManager()->_trainNodeIndex].cathDir);
-				_engine->_doorSeqs[k - offset] = _engine->getArchiveManager()->loadSeq(seqName, 0xFFu, 0);
+				_engine->_doorSeqs[k - offset] = _engine->getArchiveManager()->loadSeq(seqName, 255, 0);
 				if (_engine->_doorSeqs[k - offset]) {
 					if (fDirection(0)) {
-						_engine->_doorSeqs[k - offset]->sprites->hotspotPriority = -1 - (k - offset);
+						_engine->_doorSeqs[k - offset]->sprites->hotspotPriority = offset - k - 1;
 					} else {
 						_engine->_doorSeqs[k - offset]->sprites->hotspotPriority = k - offset - 8;
 					}
@@ -726,13 +722,13 @@ void OtisManager::drawLooseSprites() {
 				}
 			}
 		}
-	} else if (_engine->getLogicManager()->_trainData[_engine->getLogicManager()->_trainNodeIndex].nodePosition.car == 5 && _engine->getLogicManager()->_trainData[_engine->getLogicManager()->_trainNodeIndex].cathDir == 81) {
+	} else if (_engine->getLogicManager()->_trainData[_engine->getLogicManager()->_trainNodeIndex].nodePosition.car == kCarRestaurant && _engine->getLogicManager()->_trainData[_engine->getLogicManager()->_trainNodeIndex].cathDir == 81) {
 		Common::sprintf_s(seqName, "SCLKH-%02d.seq", _engine->getLogicManager()->_trainData[_engine->getLogicManager()->_trainNodeIndex].cathDir);
-		_engine->_clockHandsSeqs[0] = _engine->getArchiveManager()->loadSeq(seqName, 0xFFu, 0);
+		_engine->_clockHandsSeqs[0] = _engine->getArchiveManager()->loadSeq(seqName, 255, 0);
 		int32 hours = _engine->getLogicManager()->_gameTime % 1296000 % 54000 / 900;
 
 		Common::sprintf_s(seqName, "SCLKM-%02d.seq", _engine->getLogicManager()->_trainData[_engine->getLogicManager()->_trainNodeIndex].cathDir);
-		_engine->_clockHandsSeqs[1] = _engine->getArchiveManager()->loadSeq(seqName, 0xFFu, 0);
+		_engine->_clockHandsSeqs[1] = _engine->getArchiveManager()->loadSeq(seqName, 255, 0);
 
 		int32 period = _engine->getLogicManager()->_gameTime % 1296000 / 54000;
 		if (period >= 12)
@@ -741,11 +737,11 @@ void OtisManager::drawLooseSprites() {
 		int32 minutes = hours / 12 + 5 * period;
 
 		if (_engine->_clockHandsSeqs[0] && _engine->_clockHandsSeqs[1]) {
-			_engine->_clockHandsSeqs[0]->sprites[hours].hotspotPriority = -2;
+			_engine->_clockHandsSeqs[0]->sprites[hours].hotspotPriority = 0xFFFE;
 			_engine->getSpriteManager()->drawSprite(&_engine->_clockHandsSeqs[0]->sprites[hours]);
 			_engine->_clockHandsValues[0] = hours;
 
-			_engine->_clockHandsSeqs[1]->sprites[minutes].hotspotPriority = -1;
+			_engine->_clockHandsSeqs[1]->sprites[minutes].hotspotPriority = 0xFFFF;
 			_engine->getSpriteManager()->drawSprite(&_engine->_clockHandsSeqs[1]->sprites[minutes]);
 			_engine->_clockHandsValues[1] = minutes;
 		}
@@ -928,7 +924,7 @@ int OtisManager::findFrame(int character, Seq *sequence, int position, bool doPr
 }
 
 void OtisManager::initCurFrame(int character) {
-	uint32 ticks;
+	int32 ticks;
 	int curFrameIdx;
 	int tmpRemainingFrames;
 	bool foundCurrentFrame = false;
@@ -1066,7 +1062,7 @@ void OtisManager::initCurFrame(int character) {
 				tmpRemainingFrames = -1;
 
 			while (!foundCurrentFrame && curFrameIdx < getCharacter(character).sequence1->numFrames) {
-				if (ticks + getCharacter(character).sequence1->sprites[curFrameIdx].ticksToWaitUntilCycleRestart >= (uint16)getCharacter(character).elapsedFrames) {
+				if (ticks + getCharacter(character).sequence1->sprites[curFrameIdx].ticksToWaitUntilCycleRestart >= getCharacter(character).elapsedFrames) {
 					foundCurrentFrame = true;
 				} else {
 					if (ticks > (getCharacter(character).elapsedFrames - 10) && getCharacter(character).sequence1->sprites[curFrameIdx].soundAction) {
diff --git a/engines/lastexpress/game/vcr.cpp b/engines/lastexpress/game/vcr.cpp
index bf074665019..fb58f1370ff 100644
--- a/engines/lastexpress/game/vcr.cpp
+++ b/engines/lastexpress/game/vcr.cpp
@@ -640,7 +640,7 @@ void VCR::seekToTime(int32 time) {
 }
 
 void VCR::updateCurGame(int32 fromTime, int32 toTime, bool searchEntry) {
-	uint32 minTimeDiff = 0xFFFFFFFF;
+	int32 minTimeDiff = 0x7FFFFFFF;
 	int newMenuIdx = 0;
 
 	if (toTime != fromTime) {
diff --git a/engines/lastexpress/sound/mixer.cpp b/engines/lastexpress/sound/mixer.cpp
index 67ff26232bf..afeaac99577 100644
--- a/engines/lastexpress/sound/mixer.cpp
+++ b/engines/lastexpress/sound/mixer.cpp
@@ -455,7 +455,6 @@ void SoundManager::mixEngine() {
 
 	Slot *cachedSlot;
 	Slot *nextCachedSlot;
-	Slot *soundEntry;
 	Slot *soundChannels[6];
 
 	if (_soundEngineToggle) {
diff --git a/engines/lastexpress/sound/slot.cpp b/engines/lastexpress/sound/slot.cpp
index c6b13e605d0..d6bd5b10206 100644
--- a/engines/lastexpress/sound/slot.cpp
+++ b/engines/lastexpress/sound/slot.cpp
@@ -390,7 +390,7 @@ bool Slot::getBuffer() {
 
 		for (chosenSlot = nullptr; cacheSlots; cacheSlots = cacheSlots->getNext()) {
 			if ((cacheSlots->getStatusFlags() & kSoundFlagMute) == 0) {
-				if (cacheSlots->getPriority() + (getStatusFlags() & kSoundVolumeMask) < effPrio) {
+				if (cacheSlots->getPriority() + (int)(getStatusFlags() & kSoundVolumeMask) < effPrio) {
 					chosenSlot = cacheSlots;
 					effPrio = cacheSlots->getPriority() + (getStatusFlags() & kSoundVolumeMask);
 				}
diff --git a/engines/lastexpress/sound/sound.cpp b/engines/lastexpress/sound/sound.cpp
index b8698d667be..a5eee300a89 100644
--- a/engines/lastexpress/sound/sound.cpp
+++ b/engines/lastexpress/sound/sound.cpp
@@ -403,7 +403,7 @@ void SoundManager::soundThread() {
 					if (_numActiveChannels < 6 && (cachedSlot->getStatusFlags() & kSoundVolumeMask) != 0) {
 						priority = cachedSlot->getPriority();
 
-						if (priority + (cachedSlot->getStatusFlags() & kSoundVolumeMask) > maxPriority) {
+						if (priority + (int)(cachedSlot->getStatusFlags() & kSoundVolumeMask) > maxPriority) {
 							slotToDevirtualize = cachedSlot;
 							maxPriority = (cachedSlot->getStatusFlags() & kSoundVolumeMask) + priority;
 						}
diff --git a/engines/lastexpress/sound/subtitle.cpp b/engines/lastexpress/sound/subtitle.cpp
index a135834b598..71cedfb4080 100644
--- a/engines/lastexpress/sound/subtitle.cpp
+++ b/engines/lastexpress/sound/subtitle.cpp
@@ -209,7 +209,7 @@ void SubtitleManager::initSubtitles() {
 
 		assert(_font->fontData);
 
-		for (int i = 0; !fontStream->eos() && i < sizeOfData; i++) {
+		for (uint i = 0; !fontStream->eos() && i < sizeOfData; i++) {
 			_font->fontData[i] = fontStream->readByte();
 		}
 


Commit: 77835fc7e8802786d6d793d65c4cff5b4b56f828
    https://github.com/scummvm/scummvm/commit/77835fc7e8802786d6d793d65c4cff5b4b56f828
Author: AndywinXp (andywinxp at gmail.com)
Date: 2025-06-16T23:12:18+02:00

Commit Message:
LASTEXPRESS: Rewrite Master logic

Changed paths:
    engines/lastexpress/characters/master.cpp


diff --git a/engines/lastexpress/characters/master.cpp b/engines/lastexpress/characters/master.cpp
index 4bfa29f7a2f..9d2162fbfd8 100644
--- a/engines/lastexpress/characters/master.cpp
+++ b/engines/lastexpress/characters/master.cpp
@@ -28,7 +28,8 @@ void LogicManager::CONS_Master(int chapter) {
 	case 0:
 		_engine->getMessageManager()->setMessageHandle(
 			kCharacterMaster,
-			_functionsMaster[getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall]]);
+			_functionsMaster[getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall]]
+		);
 
 		break;
 	case 1:
@@ -47,7 +48,7 @@ void LogicManager::CONS_Master(int chapter) {
 		CONS_Master_StartPart5(0, 0, 0, 0);
 		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -71,29 +72,33 @@ void LogicManager::CONS_Master_SaveGame(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Master_SaveGame(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			save(
-				kCharacterMaster,
-				getCharacterCurrentParams(kCharacterMaster)[0],
-				getCharacterCurrentParams(kCharacterMaster)[1]
-			);
-
-			getCharacter(kCharacterMaster).currentCall--;
+	switch (msg->action) {
+	case 0:
+		getCharacter(kCharacterMaster).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(
+			kCharacterMaster,
+			_functionsMaster[getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall]]
+		);
 
-			_engine->getMessageManager()->setMessageHandle(
-				kCharacterMaster,
-				_functionsMaster[getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall]]);
+		fedEx(kCharacterMaster, kCharacterMaster, 18, 0);
+		break;
+	case 12:
+		save(
+			kCharacterMaster,
+			getCharacterCurrentParams(kCharacterMaster)[0],
+			getCharacterCurrentParams(kCharacterMaster)[1]
+		);
 
-			fedEx(kCharacterMaster, kCharacterMaster, 18, 0);
-		}
-	} else {
 		getCharacter(kCharacterMaster).currentCall--;
+
 		_engine->getMessageManager()->setMessageHandle(
 			kCharacterMaster,
 			_functionsMaster[getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall]]);
 
 		fedEx(kCharacterMaster, kCharacterMaster, 18, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -111,7 +116,8 @@ void LogicManager::CONS_Master_Arrive(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Master_Arrive(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		if (getCharacterParams(kCharacterMaster, 8)[1] || getCharacterParams(kCharacterMaster, 8)[2]) {
 			endDialog(kCharacterMaster);
 
@@ -120,20 +126,20 @@ void LogicManager::HAND_Master_Arrive(HAND_PARAMS) {
 
 				if (getCharacter(kCharacterCath).characterPosition.location == 2) {
 					if (cathOutHisWindow()) {
-						bumpCath(3, 49, 255);
+						bumpCath(kCarGreenSleeping, 49, 255);
 					} else if (cathOutRebeccaWindow()) {
-						bumpCath(4, 49, 255);
-					} else if (getCharacter(kCharacterCath).characterPosition.car < 4 || getCharacter(kCharacterCath).characterPosition.car > 7) {
-						if (getCharacter(kCharacterCath).characterPosition.car && getCharacter(kCharacterCath).characterPosition.car <= 3) {
-							if (checkCathDir(3, 98)) {
+						bumpCath(kCarRedSleeping, 49, 255);
+					} else if (getCharacter(kCharacterCath).characterPosition.car < kCarRedSleeping || getCharacter(kCharacterCath).characterPosition.car > kCarCoalTender) {
+						if (getCharacter(kCharacterCath).characterPosition.car && getCharacter(kCharacterCath).characterPosition.car <= kCarGreenSleeping) {
+							if (checkCathDir(kCarGreenSleeping, 98)) {
 								playDialog(kCharacterCath, "LIB015", -1, 0);
-								bumpCath(3, 71, 255);
+								bumpCath(kCarGreenSleeping, 71, 255);
 							} else {
-								bumpCath(3, 82, 255);
+								bumpCath(kCarGreenSleeping, 82, 255);
 							}
 						}
 					} else {
-						bumpCath(5, 82, 255);
+						bumpCath(kCarRestaurant, 82, 255);
 					}
 				}
 
@@ -157,9 +163,13 @@ void LogicManager::HAND_Master_Arrive(HAND_PARAMS) {
 		getCharacter(kCharacterMaster).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(
 			kCharacterMaster,
-			_functionsMaster[getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall]]);
+			_functionsMaster[getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall]]
+		);
 
 		fedEx(kCharacterMaster, kCharacterMaster, 18, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -176,7 +186,8 @@ void LogicManager::CONS_Master_Depart(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Master_Depart(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		if (getCharacterParams(kCharacterMaster, 8)[1] || getCharacterParams(kCharacterMaster, 8)[2]) {
 			endDialog(kCharacterMaster);
 
@@ -188,8 +199,8 @@ void LogicManager::HAND_Master_Depart(HAND_PARAMS) {
 						bumpCath(kCarGreenSleeping, 49, 255);
 					} else if (cathOutRebeccaWindow()) {
 						bumpCath(kCarRedSleeping, 49, 255);
-					} else if (getCharacter(kCharacterCath).characterPosition.car < 4 || getCharacter(kCharacterCath).characterPosition.car > 7) {
-						if (getCharacter(kCharacterCath).characterPosition.car && getCharacter(kCharacterCath).characterPosition.car <= 3) {
+					} else if (getCharacter(kCharacterCath).characterPosition.car < kCarRedSleeping || getCharacter(kCharacterCath).characterPosition.car > kCarCoalTender) {
+						if (getCharacter(kCharacterCath).characterPosition.car && getCharacter(kCharacterCath).characterPosition.car <= kCarGreenSleeping) {
 							if (checkCathDir(kCarGreenSleeping, 98)) {
 								playDialog(kCharacterCath, "LIB015", -1, 0);
 								bumpCath(kCarGreenSleeping, 71, 255);
@@ -226,6 +237,9 @@ void LogicManager::HAND_Master_Depart(HAND_PARAMS) {
 		);
 
 		fedEx(kCharacterMaster, kCharacterMaster, 18, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -240,9 +254,13 @@ void LogicManager::CONS_Master_Birth(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Master_Birth(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		autoMessage(kCharacterMaster, 171843264, 0);
 		CONS_Master_StartPart1(0, 0, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -257,7 +275,8 @@ void LogicManager::CONS_Master_WalkTest(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Master_WalkTest(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		forceJump(kCharacterAbbot,    &LogicManager::CONS_Abbot_DebugWalks);
 		forceJump(kCharacterAlexei,   &LogicManager::CONS_Alexei_DebugWalks);
 		forceJump(kCharacterAlouan,   &LogicManager::CONS_Alouan_DebugWalks);
@@ -288,9 +307,13 @@ void LogicManager::HAND_Master_WalkTest(HAND_PARAMS) {
 		getCharacter(kCharacterMaster).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(
 			kCharacterMaster,
-			_functionsMaster[getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall]]);
+			_functionsMaster[getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall]]
+		);
 
 		fedEx(kCharacterMaster, kCharacterMaster, 18, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -305,12 +328,16 @@ void LogicManager::CONS_Master_FirstDream(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Master_FirstDream(HAND_PARAMS) {
-	if (msg->action == 2) {
+	switch (msg->action) {
+	case 2:
 		playDialog(kCharacterMaster, "MUS009", 16, 0);
-	} else if (msg->action == 8) {
+		break;
+	case 8:
 		if (!cathRunningDialog("LIB012"))
 			playDialog(kCharacterCath, "LIB012", -1, 0);
-	} else if (msg->action == 12) {
+
+		break;
+	case 12:
 		forceJump(kCharacterHeadWait, &LogicManager::CONS_HeadWait_LockUp);
 		forceJump(kCharacterWaiter1,  &LogicManager::CONS_Waiter1_LockUp);
 		forceJump(kCharacterWaiter2,  &LogicManager::CONS_Waiter2_LockUp);
@@ -394,7 +421,8 @@ void LogicManager::HAND_Master_FirstDream(HAND_PARAMS) {
 		getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 1;
 
 		MasterCall(&LogicManager::CONS_Master_SaveGame, 1, 0, 0, 0);
-	} else if (msg->action == 9) {
+		break;
+	case 9:
 		if (getCharacterCurrentParams(kCharacterMaster)[0]) {
 			endGraphics(kCharacterMaster);
 
@@ -435,7 +463,9 @@ void LogicManager::HAND_Master_FirstDream(HAND_PARAMS) {
 			setDoor(63, kCharacterMaster, 0, 10, 9);
 			getCharacterCurrentParams(kCharacterMaster)[0] = 1;
 		}
-	} else if (msg->action == 225358684) {
+
+		break;
+	case 225358684:
 		getCharacterCurrentParams(kCharacterMaster)[1]++;
 
 		if (getCharacterCurrentParams(kCharacterMaster)[1] >= 3) {
@@ -443,10 +473,14 @@ void LogicManager::HAND_Master_FirstDream(HAND_PARAMS) {
 				playDialog(kCharacterCath, "LIB031", -1, 0);
 
 			if (getCharacterCurrentParams(kCharacterMaster)[1] == 3) {
-				getCharacter(kCharacterMaster).characterPosition.car = 8;
+				getCharacter(kCharacterMaster).characterPosition.car = kCarLocomotive;
 				startCycOtis(kCharacterMaster, "JUGL");
 			}
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -461,7 +495,8 @@ void LogicManager::CONS_Master_StartPart1(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Master_StartPart1(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		_gameProgress[kProgressChapter] = 1;
 
 		_engine->getSoundManager()->startAmbient();
@@ -529,6 +564,9 @@ void LogicManager::HAND_Master_StartPart1(HAND_PARAMS) {
 		setDoor(101, kCharacterCath, 1, 10, 9);
 
 		CONS_Master_MovingNight(0, 0, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -543,116 +581,12 @@ void LogicManager::CONS_Master_MovingNight(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Master_MovingNight(HAND_PARAMS) {
-
-	int v6;
-
-	uint16 car;
-	int v9; 
-	int v10;
-	int v11;
-	int v12;
-	int v13;
-	int v14;
-
-	if (msg->action > 12) {
-		if (msg->action > 169629818) {
-			if (msg->action == 190346110) {
-				_gameProgress[6] = 3;
-				if (_gameTime >= 1494000) {
-					CONS_Master_SecondSleep(0, 0, 0, 0);
-				} else {
-					getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 23;
-					MasterCall(&LogicManager::CONS_Master_FirstDream, 0, 0, 0, 0);
-				}
-			}
-		} else {
-			switch (msg->action) {
-			case 169629818:
-				getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 22;
-				MasterCall(&LogicManager::CONS_Master_Arrive, "Unschedu", 0x10, 0, 0);
-				break;
-			case 17:
-				if (!getCharacterCurrentParams(kCharacterMaster)[2] && checkCathDir(3, 1)) {
-					_gameTime = 1062000;
-					_gameTimeTicksDelta = 3;
-					getCharacterCurrentParams(kCharacterMaster)[2] = 1;
-				}
-				break;
-			case 18:
-				switch (getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8]) {
-				case 1:
-					goto LABEL_75;
-				case 2:
-					goto LABEL_78;
-				case 3:
-					goto LABEL_81;
-				case 4:
-					getCharacterCurrentParams(kCharacterMaster)[4] = 0;
-					goto LABEL_57;
-				case 5:
-					goto LABEL_84;
-				case 6:
-					goto LABEL_87;
-				case 7:
-					goto LABEL_90;
-				case 8:
-					goto LABEL_93;
-				case 9:
-					goto LABEL_99;
-				case 10:
-					goto LABEL_102;
-				case 11:
-					goto LABEL_105;
-				case 12:
-					goto LABEL_108;
-				case 13:
-					goto LABEL_111;
-				case 14:
-					goto LABEL_114;
-				case 15:
-					goto LABEL_117;
-				case 16:
-					_gameTime = 1424700;
-					goto LABEL_65;
-				case 17:
-					_gameProgress[6] = 1;
-					getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 18;
-					MasterCall(&LogicManager::CONS_Master_Arrive, "Strasbou", 7, 0, 0);
-					break;
-				case 18:
-					goto LABEL_120;
-				case 19:
-					_gameTimeTicksDelta = 1;
-					goto LABEL_70;
-				case 20:
-					goto LABEL_123;
-				case 21:
-					goto LABEL_126;
-				case 22:
-					getCharacterCurrentParams(kCharacterMaster)[4] = 1;
-					break;
-				case 23:
-					getCharacterCurrentParams(kCharacterMaster)[0] = 1;
-					break;
-				default:
-					return;
-				}
-				break;
-			}
-		}
-		return;
-	}
-
-	if (msg->action == 12) {
-		getCharacterCurrentParams(kCharacterMaster)[1] = 225 * (4 * rnd(5) + 20);
-		return;
-	}
-
-	if (!msg->action) {
-		if (_gameProgress[20] && _gameTime < 1458000) {
+	switch (msg->action) {
+	case 0:
+		if (_gameProgress[kProgressIsTrainRunning] && _gameTime < 1458000) {
 			if (!getCharacterCurrentParams(kCharacterMaster)[5]) {
 				getCharacterCurrentParams(kCharacterMaster)[5] = _currentGameSessionTicks + getCharacterCurrentParams(kCharacterMaster)[1];
-				if (_currentGameSessionTicks + getCharacterCurrentParams(kCharacterMaster)[1] == 0)
+				if (getCharacterCurrentParams(kCharacterMaster)[5] == 0)
 					goto LABEL_19;
 			}
 			if (getCharacterCurrentParams(kCharacterMaster)[5] < _currentGameSessionTicks) {
@@ -660,19 +594,19 @@ void LogicManager::HAND_Master_MovingNight(HAND_PARAMS) {
 			LABEL_19:
 				switch (rnd(5)) {
 				case 0:
-					playDialog(kCharacterCath, "ZFX1005", rnd(15) + 2, 0);
+					playDialog(0, "ZFX1005", rnd(15) + 2, 0);
 					break;
 				case 1:
-					playDialog(kCharacterCath, "ZFX1006", rnd(15) + 2, 0);
+					playDialog(0, "ZFX1006", rnd(15) + 2, 0);
 					break;
 				case 2:
-					playDialog(kCharacterCath, "ZFX1007", rnd(15) + 2, 0);
+					playDialog(0, "ZFX1007", rnd(15) + 2, 0);
 					break;
 				case 3:
-					playDialog(kCharacterCath, "ZFX1007A", rnd(15) + 2, 0);
+					playDialog(0, "ZFX1007A", rnd(15) + 2, 0);
 					break;
 				case 4:
-					playDialog(kCharacterCath, "ZFX1007B", rnd(15) + 2, 0);
+					playDialog(0, "ZFX1007B", rnd(15) + 2, 0);
 					break;
 				default:
 					break;
@@ -712,7 +646,7 @@ void LogicManager::HAND_Master_MovingNight(HAND_PARAMS) {
 	LABEL_57:
 		if (_gameTime > 1170000 && !getCharacterCurrentParams(kCharacterMaster)[9]) {
 			getCharacterCurrentParams(kCharacterMaster)[9] = 1;
-			_gameProgress[6] = 2;
+			_gameProgress[kProgressField18] = 2;
 		}
 		if (!getCharacterCurrentParams(kCharacterMaster)[0]) {
 			if (_gameTime > 1170000 && !getCharacterCurrentParams(kCharacterMaster)[10]) {
@@ -837,34 +771,31 @@ void LogicManager::HAND_Master_MovingNight(HAND_PARAMS) {
 			MasterCall(&LogicManager::CONS_Master_Depart, "Strasbou", 0, 0, 0);
 		}
 
-		return;
-	}
-
-	if (msg->action == 2) {
+		break;
+	case 2:
 		if (getCharacterParams(kCharacterMaster, 8)[1]) {
-			send(kCharacterMaster, 32, 191350523, 0);
+			send(kCharacterMaster, kCharacterClerk, 191350523, 0);
 			if (getCharacter(kCharacterCath).characterPosition.location == 2) {
 				if (cathOutHisWindow()) {
-					v14 = 49;
-				LABEL_43:
-					bumpCath(3, v14, 255);
+					bumpCath(kCarGreenSleeping, 49, 255);
 					goto LABEL_44;
 				}
 				if (cathOutRebeccaWindow()) {
-					bumpCath(4, 49, 255);
+					bumpCath(kCarRedSleeping, 49, 255);
 				} else {
-					if (getCharacter(kCharacterCath).characterPosition.car < 4u || getCharacter(kCharacterCath).characterPosition.car > 7) {
-						if (!getCharacter(kCharacterCath).characterPosition.car || getCharacter(kCharacterCath).characterPosition.car > 3)
+					if (getCharacter(kCharacterCath).characterPosition.car < kCarRedSleeping || getCharacter(kCharacterCath).characterPosition.car > kCarCoalTender) {
+						if (!getCharacter(kCharacterCath).characterPosition.car || getCharacter(kCharacterCath).characterPosition.car > kCarGreenSleeping)
 							goto LABEL_44;
-						if (checkCathDir(3, 98)) {
-							playDialog(kCharacterCath, "LIB015", -1, 0);
-							v14 = 71;
+						if (checkCathDir(kCarGreenSleeping, 98)) {
+							playDialog(0, "LIB015", -1, 0);
+							bumpCath(kCarGreenSleeping, 71, 255);
 						} else {
-							v14 = 82;
+							bumpCath(kCarGreenSleeping, 82, 255);
 						}
-						goto LABEL_43;
+
+						goto LABEL_44;
 					}
-					bumpCath(5, 82, 255);
+					bumpCath(kCarRestaurant, 82, 255);
 				}
 			}
 		LABEL_44:
@@ -873,19 +804,104 @@ void LogicManager::HAND_Master_MovingNight(HAND_PARAMS) {
 			getCharacterParams(kCharacterMaster, 8)[1] = 0;
 			return;
 		}
-
 		if (getCharacterParams(kCharacterMaster, 8)[2]) {
 			_engine->getSoundManager()->startAmbient();
 			getCharacterParams(kCharacterMaster, 8)[2] = 0;
 			if (getCharacterCurrentParams(kCharacterMaster)[3]) {
-				if (_gameProgress[9]) {
-					send(kCharacterMaster, 9, 168187490, 0);
-				} else {
-					send(kCharacterMaster, 3, 224122407, 0);
-				}
+				if (_gameProgress[kProgressField24])
+					send(kCharacterMaster, kCharacterTrainM, 168187490, 0);
+				else
+					send(kCharacterMaster, kCharacterCond1, 224122407, 0);
 				getCharacterCurrentParams(kCharacterMaster)[3] = 0;
 			}
 		}
+
+		break;
+	case 190346110:
+		_gameProgress[kProgressField18] = 3;
+		if (_gameTime >= 1494000) {
+			CONS_Master_SecondSleep(0, 0, 0, 0);
+		} else {
+			getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 23;
+			MasterCall(&LogicManager::CONS_Master_FirstDream, 0, 0, 0, 0);
+		}
+
+		break;
+	case 169629818:
+		getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 22;
+		MasterCall(&LogicManager::CONS_Master_Arrive, "Unschedu", 16, 0, 0);
+		break;
+	case 12:
+		getCharacterCurrentParams(kCharacterMaster)[1] = 225 * (4 * rnd(5) + 20);
+		break;
+	case 17:
+		if (!getCharacterCurrentParams(kCharacterMaster)[2] && checkCathDir(kCarGreenSleeping, 1)) {
+			_gameTime = 1062000;
+			_gameTimeTicksDelta = 3;
+			getCharacterCurrentParams(kCharacterMaster)[2] = 1;
+		}
+		break;
+	case 18:
+		switch (getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8]) {
+		case 1:
+			goto LABEL_75;
+		case 2:
+			goto LABEL_78;
+		case 3:
+			goto LABEL_81;
+		case 4:
+			getCharacterCurrentParams(kCharacterMaster)[4] = 0;
+			goto LABEL_57;
+		case 5:
+			goto LABEL_84;
+		case 6:
+			goto LABEL_87;
+		case 7:
+			goto LABEL_90;
+		case 8:
+			goto LABEL_93;
+		case 9:
+			goto LABEL_99;
+		case 10:
+			goto LABEL_102;
+		case 11:
+			goto LABEL_105;
+		case 12:
+			goto LABEL_108;
+		case 13:
+			goto LABEL_111;
+		case 14:
+			goto LABEL_114;
+		case 15:
+			goto LABEL_117;
+		case 16:
+			_gameTime = 1424700;
+			goto LABEL_65;
+		case 17:
+			_gameProgress[kProgressField18] = 1;
+			getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 18;
+			MasterCall(&LogicManager::CONS_Master_Arrive, "Strasbou", 7, 0, 0);
+			break;
+		case 18:
+			goto LABEL_120;
+		case 19:
+			_gameTimeTicksDelta = 1;
+			goto LABEL_70;
+		case 20:
+			goto LABEL_123;
+		case 21:
+			goto LABEL_126;
+		case 22:
+			getCharacterCurrentParams(kCharacterMaster)[4] = 1;
+			break;
+		case 23:
+			getCharacterCurrentParams(kCharacterMaster)[0] = 1;
+			break;
+		default:
+			break;
+		}
+
+		break;
 	}
 }
 
@@ -900,7 +916,8 @@ void LogicManager::CONS_Master_SecondSleep(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Master_SecondSleep(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		if (getCharacterParams(kCharacterMaster, 8)[1] || getCharacterParams(kCharacterMaster, 8)[2]) {
 			endDialog(kCharacterMaster);
 			getCharacterParams(kCharacterMaster, 8)[1] = 0;
@@ -917,6 +934,9 @@ void LogicManager::HAND_Master_SecondSleep(HAND_PARAMS) {
 		}
 
 		CONS_Master_StartPart2(0, 0, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -931,7 +951,8 @@ void LogicManager::CONS_Master_StartPart2(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Master_StartPart2(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		if (_gameProgress[kProgressChapter] != 2) {
 			_gameProgress[kProgressChapter] = 2;
 			makeAllJump(2);
@@ -943,13 +964,20 @@ void LogicManager::HAND_Master_StartPart2(HAND_PARAMS) {
 		getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 1;
 
 		MasterCall(&LogicManager::CONS_Master_SaveGame, 1, 0, 0, 0);
-	} else if (msg->action == 18 && getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] == 1) {
-		if (_engine->getArchiveManager()->lockCD(2)) {
-			loadTrain(2);
-			CONS_Master_InitPart2(0, 0, 0, 0);
-		} else {
-			_engine->getMenu()->doEgg(0, 0, 0);
+		break;
+	case 18:
+		if (getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] == 1) {
+			if (_engine->getArchiveManager()->lockCD(2)) {
+				loadTrain(2);
+				CONS_Master_InitPart2(0, 0, 0, 0);
+			} else {
+				_engine->getMenu()->doEgg(false, 0, 0);
+			}
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -964,21 +992,22 @@ void LogicManager::CONS_Master_InitPart2(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Master_InitPart2(HAND_PARAMS) {
-	if (msg->action == 12) {
-		_gameProgress[20] = 1;
-		setDoor(26, 0, 1, 0, 9);
-		setDoor(27, 0, 1, 0, 9);
-		_gameProgress[6] = 1;
-		giveCathItem(21);
-
-		_gameInventory[20].location = 0;
-		_gameInventory[20].isPresent = 0;
-		_gameProgress[1] = 2;
-		_gameProgress[7] = 34;
-		_gameProgress[2] = 1;
-		_gameProgress[4] = 1;
-		dropItem(14, 3);
-		dropItem(3, 1);
+	switch (msg->action) {
+	case 12:
+		_gameProgress[kProgressIsTrainRunning] = 1;
+		setDoor(26, kCharacterCath, 1, 0, 9);
+		setDoor(27, kCharacterCath, 1, 0, 9);
+		_gameProgress[kProgressField18] = 1;
+		giveCathItem(kItemGreenJacket);
+
+		_gameInventory[kItemCorpse].location = 0;
+		_gameInventory[kItemCorpse].isPresent = 0;
+		_gameProgress[kProgressJacket] = 2;
+		_gameProgress[kProgressPortrait] = 34;
+		_gameProgress[kProgressEventCorpseMovedFromFloor] = 1;
+		_gameProgress[kProgressEventFoundCorpse] = 1;
+		dropItem(kItemBeetle, 3);
+		dropItem(kItem3, 1);
 
 		getCharacterCurrentParams(kCharacterMaster)[0] = 1;
 		do {
@@ -998,8 +1027,8 @@ void LogicManager::HAND_Master_InitPart2(HAND_PARAMS) {
 		send(kCharacterMaster, kCharacterTableD, 103798704, 0);
 		send(kCharacterMaster, kCharacterTableE, 103798704, 0);
 
-		setDoor(1, 0, 0, 10, 9);
-		setDoor(9, 0, 0, 255, 255);
+		setDoor(1, kCharacterCath, 0, 10, 9);
+		setDoor(9, kCharacterCath, 0, 255, 255);
 
 		if (getCharacterParams(kCharacterMaster, 8)[1] || getCharacterParams(kCharacterMaster, 8)[2]) {
 			endDialog(kCharacterMaster);
@@ -1009,13 +1038,16 @@ void LogicManager::HAND_Master_InitPart2(HAND_PARAMS) {
 
 		playNIS(kEventTrainPassing);
 
-		if (cathHasItem(8)) {
+		if (cathHasItem(kItemScarf)) {
 			bumpCathTylerComp();
 		} else {
-			bumpCath(3, 79, 255);
+			bumpCath(kCarGreenSleeping, 79, 255);
 		}
 
 		CONS_Master_MovingDay(0, 0, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1030,49 +1062,51 @@ void LogicManager::CONS_Master_MovingDay(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Master_MovingDay(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			getCharacterCurrentParams(kCharacterMaster)[0] = 225 * (4 * rnd(5) + 20);
-		} else if (msg->action == 139122728) {
-			CONS_Master_StartPart3(0, 0, 0, 0);
-		}
-	} else {
-		if (!_gameProgress[20])
-			return;
+	switch (msg->action) {
+	case 0:
+		if (_gameProgress[kProgressIsTrainRunning]) {
+			if (getCharacterCurrentParams(kCharacterMaster)[1] ||
+				(getCharacterCurrentParams(kCharacterMaster)[1] = _currentGameSessionTicks + getCharacterCurrentParams(kCharacterMaster)[0],
+				 _currentGameSessionTicks + getCharacterCurrentParams(kCharacterMaster)[0] != 0)) {
+				if (getCharacterCurrentParams(kCharacterMaster)[1] >= _currentGameSessionTicks)
+					return;
 
-		int v3; 
-		if (getCharacterCurrentParams(kCharacterMaster)[1] ||
-			(v3 = _currentGameSessionTicks + getCharacterCurrentParams(kCharacterMaster)[0] == 0,
-				getCharacterCurrentParams(kCharacterMaster)[1] = _currentGameSessionTicks + getCharacterCurrentParams(kCharacterMaster)[0],
-				!v3)) {
-			if (getCharacterCurrentParams(kCharacterMaster)[1] >= _currentGameSessionTicks)
-				return;
+				getCharacterCurrentParams(kCharacterMaster)[1] = 0x7FFFFFFF;
+			}
 
-			getCharacterCurrentParams(kCharacterMaster)[1] = 0x7FFFFFFF;
-		}
+			switch (rnd(15)) {
+			case 0:
+				playDialog(kCharacterCath, "ZFX1005", rnd(15) + 2, 0);
+				break;
+			case 1:
+				playDialog(kCharacterCath, "ZFX1006", rnd(15) + 2, 0);
+				break;
+			case 2:
+				playDialog(kCharacterCath, "ZFX1007", rnd(15) + 2, 0);
+				break;
+			case 3:
+				playDialog(kCharacterCath, "ZFX1007A", rnd(15) + 2, 0);
+				break;
+			case 4:
+				playDialog(kCharacterCath, "ZFX1007B", rnd(15) + 2, 0);
+				break;
+			default:
+				break;
+			}
 
-		switch (rnd(15)) {
-		case 0:
-			playDialog(kCharacterCath, "ZFX1005", rnd(15) + 2, 0);
-			break;
-		case 1:
-			playDialog(kCharacterCath, "ZFX1006", rnd(15) + 2, 0);
-			break;
-		case 2:
-			playDialog(kCharacterCath, "ZFX1007", rnd(15) + 2, 0);
-			break;
-		case 3:
-			playDialog(kCharacterCath, "ZFX1007A", rnd(15) + 2, 0);
-			break;
-		case 4:
-			playDialog(kCharacterCath, "ZFX1007B", rnd(15) + 2, 0);
-			break;
-		default:
-			break;
+			getCharacterCurrentParams(kCharacterMaster)[0] = 225 * (4 * rnd(5) + 20);
+			getCharacterCurrentParams(kCharacterMaster)[1] = 0;
 		}
 
+		break;
+	case 12:
 		getCharacterCurrentParams(kCharacterMaster)[0] = 225 * (4 * rnd(5) + 20);
-		getCharacterCurrentParams(kCharacterMaster)[1] = 0;
+		break;
+	case 139122728:
+		CONS_Master_StartPart3(0, 0, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1087,7 +1121,8 @@ void LogicManager::CONS_Master_StartPart3(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Master_StartPart3(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		if (_gameProgress[kProgressChapter] != 3) {
 			_gameProgress[kProgressChapter] = 3;
 			makeAllJump(3);
@@ -1097,6 +1132,9 @@ void LogicManager::HAND_Master_StartPart3(HAND_PARAMS) {
 		_gameTimeTicksDelta = 5;
 
 		CONS_Master_InitPart3(0, 0, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1111,7 +1149,8 @@ void LogicManager::CONS_Master_InitPart3(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Master_InitPart3(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		send(kCharacterMaster, kCharacterTableA, 103798704, 0);
 		send(kCharacterMaster, kCharacterTableB, 103798704, 0);
 		send(kCharacterMaster, kCharacterTableC, 103798704, 0);
@@ -1119,14 +1158,14 @@ void LogicManager::HAND_Master_InitPart3(HAND_PARAMS) {
 		send(kCharacterMaster, kCharacterTableE, 103798704, 0);
 		send(kCharacterMaster, kCharacterTableF, 103798704, 0);
 
-		_gameProgress[20] = 1;
+		_gameProgress[kProgressIsTrainRunning] = 1;
 
-		setDoor(26, 0, 1, 0, 9);
-		setDoor(27, 0, 1, 0, 9);
-		dropItem(19, 1);
-		dropItem(3, 1);
+		setDoor(26, kCharacterCath, 1, 0, 9);
+		setDoor(27, kCharacterCath, 1, 0, 9);
+		dropItem(kItemBriefcase, 1);
+		dropItem(kItem3, 1);
 		setModel(1, 2);
-		setDoor(107, 0, 3, 255, 255);
+		setDoor(107, kCharacterCath, 3, 255, 255);
 
 		if (getCharacterParams(kCharacterMaster, 8)[1] || getCharacterParams(kCharacterMaster, 8)[2]) {
 			endDialog(kCharacterMaster);
@@ -1141,8 +1180,15 @@ void LogicManager::HAND_Master_InitPart3(HAND_PARAMS) {
 		getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 1;
 
 		MasterCall(&LogicManager::CONS_Master_SaveGame, 1, 0, 0, 0);
-	} else if (msg->action == 18 && getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] == 1) {
-		CONS_Master_MovingAfternoon(0, 0, 0, 0);
+		break;
+	case 18:
+		if (getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] == 1) {
+			CONS_Master_MovingAfternoon(0, 0, 0, 0);
+		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1157,80 +1203,67 @@ void LogicManager::CONS_Master_MovingAfternoon(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Master_MovingAfternoon(HAND_PARAMS) {
-	bool v4;                        // zf
-	int v5;                         // eax
-	unsigned int v6;                // eax
-	uint16 car;           // ax
-	int v8;                         // [esp-8h] [ebp-14h]
-	int v9;                         // [esp-8h] [ebp-14h]
-	int v10;                        // [esp-8h] [ebp-14h]
-	int v11;                        // [esp-8h] [ebp-14h]
-	int v12;                        // [esp-8h] [ebp-14h]
-	int v13;                        // [esp-8h] [ebp-14h]
-	int v14;                        // [esp-8h] [ebp-14h]
-	int v15;                        // [esp-8h] [ebp-14h]
-
 	switch (msg->action) {
 	case 0:
-		if (!_gameProgress[20])
-			goto LABEL_14;
-		if (!getCharacterCurrentParams(kCharacterMaster)[3]) {
-			v4 = _currentGameSessionTicks + getCharacterCurrentParams(kCharacterMaster)[0] == 0;
-			getCharacterCurrentParams(kCharacterMaster)[3] = _currentGameSessionTicks + getCharacterCurrentParams(kCharacterMaster)[0];
-			if (v4)
-				goto LABEL_7;
-		}
-		if (getCharacterCurrentParams(kCharacterMaster)[3] < _currentGameSessionTicks) {
-			getCharacterCurrentParams(kCharacterMaster)[3] = 0x7FFFFFFF;
-		LABEL_7:
-			switch (rnd(5)) {
-			case 0:
-				v8 = rnd(15) + 2;
-				playDialog(kCharacterCath, "ZFX1005", v8, 0);
-				break;
-			case 1:
-				playDialog(kCharacterCath, "ZFX1006", rnd(15) + 2, 0);
-				break;
-			case 2:
-				playDialog(kCharacterCath, "ZFX1007", rnd(15) + 2, 0);
-				break;
-			case 3:
-				playDialog(kCharacterCath, "ZFX1007A", rnd(15) + 2, 0);
-				break;
-			case 4:
-				playDialog(kCharacterCath, "ZFX1007B", rnd(15) + 2, 0);
-				break;
-			default:
-				break;
+		if (_gameProgress[kProgressIsTrainRunning]) {
+			if (!getCharacterCurrentParams(kCharacterMaster)[3]) {
+				getCharacterCurrentParams(kCharacterMaster)[3] = _currentGameSessionTicks + getCharacterCurrentParams(kCharacterMaster)[0];
+				if (getCharacterCurrentParams(kCharacterMaster)[3] == 0)
+					goto LABEL_7;
 			}
 
-			getCharacterCurrentParams(kCharacterMaster)[0] = 225 * (4 * rnd(5) + 20);
-			getCharacterCurrentParams(kCharacterMaster)[3] = 0;
+			if (getCharacterCurrentParams(kCharacterMaster)[3] < _currentGameSessionTicks) {
+				getCharacterCurrentParams(kCharacterMaster)[3] = 0x7FFFFFFF;
+			LABEL_7:
+				switch (rnd(5)) {
+				case 0:
+					playDialog(0, "ZFX1005", rnd(15) + 2, 0);
+					break;
+				case 1:
+					playDialog(0, "ZFX1006", rnd(15) + 2, 0);
+					break;
+				case 2:
+					playDialog(0, "ZFX1007", rnd(15) + 2, 0);
+					break;
+				case 3:
+					playDialog(0, "ZFX1007A", rnd(15) + 2, 0);
+					break;
+				case 4:
+					playDialog(0, "ZFX1007B", rnd(15) + 2, 0);
+					break;
+				default:
+					break;
+				}
+
+				getCharacterCurrentParams(kCharacterMaster)[0] = 225 * (4 * rnd(5) + 20);
+				getCharacterCurrentParams(kCharacterMaster)[3] = 0;
+			}
 		}
-	LABEL_14:
+
 		if (!getCharacterCurrentParams(kCharacterMaster)[4]) {
-			v5 = getCharacterCurrentParams(kCharacterMaster)[1];
-			v4 = _currentGameSessionTicks + v5 == 0;
-			getCharacterCurrentParams(kCharacterMaster)[4] = _currentGameSessionTicks + v5;
-			if (v4)
+			getCharacterCurrentParams(kCharacterMaster)[4] = _currentGameSessionTicks + getCharacterCurrentParams(kCharacterMaster)[1];
+			if (getCharacterCurrentParams(kCharacterMaster)[4] == 0) {
 				goto LABEL_18;
+			}
 		}
+
 		if (getCharacterCurrentParams(kCharacterMaster)[4] < _currentGameSessionTicks) {
 			getCharacterCurrentParams(kCharacterMaster)[4] = 0x7FFFFFFF;
 		LABEL_18:
-			v6 = rnd(2);
-			if (v6) {
-				if (v6 == 1) {
-					v14 = rnd(0xF) + 2;
-					playDialog(kCharacterCath, "ZFX1009", v14, 0);
-				}
-			} else {
-				v13 = rnd(0xF) + 2;
-				playDialog(kCharacterCath, "ZFX1008", v13, 0);
+			switch (rnd(2)) {
+			case 0:
+				playDialog(0, "ZFX1008", rnd(15) + 2, 0);
+				break;
+			case 1:
+			default:
+				playDialog(0, "ZFX1009", rnd(15) + 2, 0);
+				break;
 			}
+
 			getCharacterCurrentParams(kCharacterMaster)[1] = 225 * (4 * rnd(6) + 8);
 			getCharacterCurrentParams(kCharacterMaster)[4] = 0;
 		}
+
 		if (_gameTime <= 1982700 || getCharacterCurrentParams(kCharacterMaster)[5]) {
 		LABEL_49:
 			if (_gameTime <= 1989900 || getCharacterCurrentParams(kCharacterMaster)[6]) {
@@ -1296,52 +1329,65 @@ void LogicManager::HAND_Master_MovingAfternoon(HAND_PARAMS) {
 			getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 1;
 			MasterCall(&LogicManager::CONS_Master_Arrive, "Salzburg", 9, 0, 0);
 		}
-		return;
+
+		break;
 	case 2:
 		if (getCharacterParams(kCharacterMaster, 8)[1]) {
-			send(31, 32, 191350523, 0);
-			if (getCharacter(kCharacterCath).characterPosition.location != 2)
-				goto LABEL_42;
-			if (cathOutHisWindow()) {
-				v15 = 49;
-			} else {
-				if (cathOutRebeccaWindow()) {
-					bumpCath(4, 49, 255);
-					goto LABEL_42;
-				}
-				car = getCharacter(kCharacterCath).characterPosition.car;
-				if (car >= 4 && car <= 7) {
-					bumpCath(5, 82, 255);
-					goto LABEL_42;
-				}
-				if (!car || car > 3) {
-				LABEL_42:
-					_engine->getSoundManager()->startAmbient();
-					_engine->getSoundManager()->startSteam(getCharacterParams(kCharacterMaster, 8)[3]);
-					getCharacterParams(kCharacterMaster, 8)[1] = 0;
-					if (getCharacterCurrentParams(kCharacterMaster)[2])
-						CONS_Master_EndVienna(0, 0, 0, 0);
-					return;
-				}
-				if (checkCathDir(3, 98)) {
-					playDialog(kCharacterCath, "LIB015", -1, 0);
-					v15 = 71;
+			send(kCharacterMaster, kCharacterClerk, 191350523, 0);
+			if (getCharacter(kCharacterCath).characterPosition.location == 2) {
+				if (cathOutHisWindow()) {
+					bumpCath(kCarGreenSleeping, 49, 255);
 				} else {
-					v15 = 82;
+					if (cathOutRebeccaWindow()) {
+						bumpCath(kCarRedSleeping, 49, 255);
+						_engine->getSoundManager()->startAmbient();
+						_engine->getSoundManager()->startSteam(getCharacterParams(kCharacterMaster, 8)[3]);
+						getCharacterParams(kCharacterMaster, 8)[1] = 0;
+
+						if (getCharacterCurrentParams(kCharacterMaster)[2])
+							CONS_Master_EndVienna(0, 0, 0, 0);
+					} else if (getCharacter(kCharacterCath).characterPosition.car >= 4 && getCharacter(kCharacterCath).characterPosition.car <= 7) {
+						bumpCath(kCarRestaurant, 82, 255);
+						_engine->getSoundManager()->startAmbient();
+						_engine->getSoundManager()->startSteam(getCharacterParams(kCharacterMaster, 8)[3]);
+						getCharacterParams(kCharacterMaster, 8)[1] = 0;
+
+						if (getCharacterCurrentParams(kCharacterMaster)[2])
+							CONS_Master_EndVienna(0, 0, 0, 0);
+					} else if (!getCharacter(kCharacterCath).characterPosition.car || getCharacter(kCharacterCath).characterPosition.car > 3) {
+						_engine->getSoundManager()->startAmbient();
+						_engine->getSoundManager()->startSteam(getCharacterParams(kCharacterMaster, 8)[3]);
+						getCharacterParams(kCharacterMaster, 8)[1] = 0;
+
+						if (getCharacterCurrentParams(kCharacterMaster)[2])
+							CONS_Master_EndVienna(0, 0, 0, 0);
+					} else {
+						if (checkCathDir(kCarGreenSleeping, 98)) {
+							playDialog(0, "LIB015", -1, 0);
+							bumpCath(kCarGreenSleeping, 71, 255);
+						} else {
+							bumpCath(kCarGreenSleeping, 82, 255);
+						}
+					}
 				}
 			}
-			bumpCath(3, v15, 255);
-			goto LABEL_42;
-		}
-		if (getCharacterParams(kCharacterMaster, 8)[2]) {
+			
+			_engine->getSoundManager()->startAmbient();
+			_engine->getSoundManager()->startSteam(getCharacterParams(kCharacterMaster, 8)[3]);
+			getCharacterParams(kCharacterMaster, 8)[1] = 0;
+
+			if (getCharacterCurrentParams(kCharacterMaster)[2])
+				CONS_Master_EndVienna(0, 0, 0, 0);
+		} else if (getCharacterParams(kCharacterMaster, 8)[2]) {
 			_engine->getSoundManager()->startAmbient();
 			getCharacterParams(kCharacterMaster, 8)[2] = 0;
 		}
-		return;
+
+		break;
 	case 12:
 		getCharacterCurrentParams(kCharacterMaster)[0] = 225 * (4 * rnd(5) + 20);
 		getCharacterCurrentParams(kCharacterMaster)[1] = 225 * (4 * rnd(6) + 8);
-		return;
+		break;
 	case 18:
 		switch (getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8]) {
 		case 1:
@@ -1364,11 +1410,12 @@ void LogicManager::HAND_Master_MovingAfternoon(HAND_PARAMS) {
 			getCharacterCurrentParams(kCharacterMaster)[2] = 1;
 			break;
 		default:
-			return;
+			break;
 		}
-		return;
+
+		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -1383,81 +1430,83 @@ void LogicManager::CONS_Master_EndVienna(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Master_EndVienna(HAND_PARAMS) {
-	Character *v1;                  // ecx
-	uint8 *p_currentCall; // edx
-	int action;                     // eax
-	int v4;                         // eax
-	int v5;                         // [esp-8h] [ebp-Ch]
-
-	v1 = &getCharacter(kCharacterMaster);
-	p_currentCall = &getCharacter(kCharacterMaster).currentCall;
-	action = msg->action;
-	if (action == 12) {
-		getCharacter(kCharacterCath).characterPosition.car = 8;
-		if (_gameEvents[30]) {
-			if (_gameInventory[18].location == 5) {
-				getCharacter(kCharacterMaster).callbacks[*p_currentCall + 8] = 2;
-				MasterCall(&LogicManager::CONS_Master_SaveGame, 2, 165, 0, 0);
+	switch (msg->action) {
+	case 12:
+		getCharacter(kCharacterCath).characterPosition.car = kCarLocomotive;
+		if (_gameEvents[kEventAugustBringBriefcase]) {
+			if (_gameInventory[kItemFirebird].location == 5) {
+				getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 2;
+				MasterCall(&LogicManager::CONS_Master_SaveGame, 2, kEventViennaKronosFirebird, 0, 0);
 			} else if (getCharacterParams(kCharacterMaster, 8)[0]) {
-				getCharacter(kCharacterMaster).callbacks[*p_currentCall + 8] = 3;
-				MasterCall(&LogicManager::CONS_Master_SaveGame, 2, 163, 0, 0);
+				getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 3;
+				MasterCall(&LogicManager::CONS_Master_SaveGame, 2, kEventVergesAnnaDead, 0, 0);
 			} else {
-				getCharacter(kCharacterMaster).callbacks[*p_currentCall + 8] = 4;
-				MasterCall(&LogicManager::CONS_Master_SaveGame, 2, 166, 0, 0);
+				getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 4;
+				MasterCall(&LogicManager::CONS_Master_SaveGame, 2, kEventViennaContinueGame, 0, 0);
 			}
 		} else {
-			getCharacter(kCharacterMaster).callbacks[*p_currentCall + 8] = 1;
-			MasterCall(&LogicManager::CONS_Master_SaveGame, 2, 164, 0, 0);
+			getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 1;
+			MasterCall(&LogicManager::CONS_Master_SaveGame, 2, kEventViennaAugustUnloadGuns, 0, 0);
 		}
-	} else if (action == 18) {
-		switch (getCharacter(kCharacterMaster).callbacks[*p_currentCall + 8]) {
+
+		break;
+	case 18:
+		switch (getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8]) {
 		case 1:
-			playNIS(164);
-			if (_gameEvents[215]) {
-				endGame(1, 2187000, 0, 1);
+			playNIS(kEventViennaAugustUnloadGuns);
+
+			if (_gameEvents[kEventConcertLeaveWithBriefcase]) {
+				endGame(1, 2187000, 0, true);
 			} else {
-				v5 = 0;
-				if (!_gameEvents[253])
-					goto LABEL_25;
-				endGame(2, 253, 0, 1);
+				if (!_gameEvents[kEventCathJumpDownCeiling]) {
+					endGame(1, 2155500, 0, true);
+				} else {
+					endGame(2, 253, 0, true);
+				}
 			}
+
 			break;
 		case 2:
-			playNIS(165);
-			if (_gameEvents[58]) {
-				endGame(3, 58, 60, 1);
-			} else if (_gameEvents[59]) {
-				endGame(1, 2155500, 60, 1);
+			playNIS(kEventViennaKronosFirebird);
+
+			if (_gameEvents[kEventKronosBringEggCeiling]) {
+				endGame(3, 58, 60, true);
+			} else if (_gameEvents[kEventKronosBringEgg]) {
+				endGame(1, 2155500, 60, true);
 			} else {
-				v4 = _gameProgress[48];
-				if (v4) {
-					v5 = 61;
-					if (_gameEvents[61]) {
-						endGame(1, v4, 61, 1);
+				if (_gameProgress[kProgressFieldC0]) {
+					if (_gameEvents[kEventKronosReturnBriefcase]) {
+						endGame(1, 61, 61, true);
 						return;
+					} else {
+						endGame(1, 2155500, 59, true);
 					}
 				} else {
-					v5 = 59;
-					if (_gameEvents[61]) {
-						endGame(2, 61, 59, 1);
+					if (_gameEvents[kEventKronosReturnBriefcase]) {
+						endGame(2, 61, 59, true);
 						return;
+					} else {
+						endGame(1, 2155500, 59, true);
 					}
 				}
-			LABEL_25:
-				endGame(1, 2155500, v5, 1);
 			}
+
 			break;
 		case 3:
-			playNIS(163);
-			endGame(1, 2250000, 58, 1);
+			playNIS(kEventVergesAnnaDead);
+			endGame(1, 2250000, 58, true);
 			break;
 		case 4:
-			playNIS(166);
+			playNIS(kEventViennaContinueGame);
 			CONS_Master_StartPart4(0, 0, 0, 0);
 			break;
 		default:
-			return;
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1472,7 +1521,8 @@ void LogicManager::CONS_Master_StartPart4(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Master_StartPart4(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		if (_gameProgress[kProgressChapter] != 4) {
 			_gameProgress[kProgressChapter] = 4;
 			makeAllJump(4);
@@ -1484,13 +1534,20 @@ void LogicManager::HAND_Master_StartPart4(HAND_PARAMS) {
 		getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 1;
 
 		MasterCall(&LogicManager::CONS_Master_SaveGame, 1, 0, 0, 0);
-	} else if (msg->action == 18 && getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] == 1) {
-		if (_engine->getArchiveManager()->lockCD(3)) {
-			loadTrain(3);
-			CONS_Master_InitPart4(0, 0, 0, 0);
-		} else {
-			_engine->getMenu()->doEgg(0, 0, 0);
+		break;
+	case 18:
+		if (getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] == 1) {
+			if (_engine->getArchiveManager()->lockCD(3)) {
+				loadTrain(3);
+				CONS_Master_InitPart4(0, 0, 0, 0);
+			} else {
+				_engine->getMenu()->doEgg(false, 0, 0);
+			}
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1505,7 +1562,8 @@ void LogicManager::CONS_Master_InitPart4(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Master_InitPart4(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		_engine->getSoundManager()->endAmbient();
 		_engine->getSoundManager()->startAmbient();
 
@@ -1522,14 +1580,14 @@ void LogicManager::HAND_Master_InitPart4(HAND_PARAMS) {
 		send(kCharacterMaster, kCharacterTableE, 103798704, 0);
 		send(kCharacterMaster, kCharacterTableF, 103798704, 0);
 
-		takeItem(3);
-		dropItem(16, 1);
+		takeItem(kItem3);
+		dropItem(kItemBomb, 1);
 
-		if (_gameInventory[14].location == 3)
-			takeItem(14);
+		if (_gameInventory[kItemBeetle].location == 3)
+			takeItem(kItemBeetle);
 
 		setModel(25, 2);
-		setDoor(107, 0, 3, 255, 255);
+		setDoor(107, kCharacterCath, 3, 255, 255);
 
 		if (getCharacterParams(kCharacterMaster, 8)[1] || getCharacterParams(kCharacterMaster, 8)[2]) {
 			endDialog(kCharacterMaster);
@@ -1540,7 +1598,7 @@ void LogicManager::HAND_Master_InitPart4(HAND_PARAMS) {
 
 		fadeToBlack();
 
-		if (cathHasItem(18)) {
+		if (cathHasItem(kItemFirebird)) {
 			bumpCath(kCarGreenSleeping, 76, 255);
 		} else {
 			bumpCath(kCarRestaurant, 69, 255);
@@ -1548,6 +1606,9 @@ void LogicManager::HAND_Master_InitPart4(HAND_PARAMS) {
 
 		restoreIcons();
 		CONS_Master_MovingSecondNight(0, 0, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1562,133 +1623,111 @@ void LogicManager::CONS_Master_MovingSecondNight(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Master_MovingSecondNight(HAND_PARAMS) {
-	uint8 *p_currentCall; // ebx
-	Character *v2;                  // esi
-	int currentCall;                // ecx
-	CharacterCallParams *v4;        // edi
-	unsigned int action;            // eax
-	int v6;                         // eax
-	bool v7;                        // zf
-	int v8;                         // eax
-	unsigned int v9;                // eax
-	uint16 car;                     // ax
-	int v11;                        // [esp-8h] [ebp-14h]
-	int v12;                        // [esp-8h] [ebp-14h]
-	int v13;                        // [esp-8h] [ebp-14h]
-	int v14;                        // [esp-8h] [ebp-14h]
-	int v15;                        // [esp-8h] [ebp-14h]
-	int v16;                        // [esp-8h] [ebp-14h]
-	int v17;                        // [esp-8h] [ebp-14h]
-	int v18;                        // [esp-8h] [ebp-14h]
-
-	p_currentCall = &getCharacter(kCharacterMaster).currentCall;
-	v2 = &getCharacter(kCharacterMaster);
-	currentCall = getCharacter(kCharacterMaster).currentCall;
-	v4 = &getCharacter(kCharacterMaster).callParams[currentCall];
-	action = msg->action;
-	if (action > 12) {
-		if (action > 139254416) {
-			if (action > 158610240) {
-				if (action > 190346110) {
-					switch (action) {
+	if (msg->action > 12) {
+		if (msg->action > 139254416) {
+			if (msg->action > 158610240) {
+				if (msg->action > 190346110) {
+					switch (msg->action) {
 					case 191001984:
 						_gameTime = 2520000;
-						if (whoRunningDialog(31))
-							endDialog(31);
-						endGraphics(31);
-						takeCathItem(4);
+						if (whoRunningDialog(kCharacterMaster))
+							endDialog(kCharacterMaster);
+						endGraphics(kCharacterMaster);
+						takeCathItem(kItemTelegram);
 						_gameTimeTicksDelta = 5;
-						v2->callbacks[*p_currentCall + 8] = 10;
-						MasterCall(&LogicManager::CONS_Master_SaveGame, 2, 0x74, 0, 0);
+						getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 10;
+						MasterCall(&LogicManager::CONS_Master_SaveGame, 2, kEventDefuseBomb, 0, 0);
 						break;
 					case 201959744:
-						if (whoRunningDialog(31))
-							endDialog(31);
-						playDialog(32, "ZFX4001", 16, 0);
+						if (whoRunningDialog(kCharacterMaster))
+							endDialog(kCharacterMaster);
+						playDialog(kCharacterClerk, "ZFX4001", 16, 0);
 						endGame(0, 0, 0, 1);
 						break;
 					case 225367984:
-						v2->callbacks[currentCall + 8] = 9;
-						MasterCall(&LogicManager::CONS_Master_SaveGame, 2, 0x108, 0, 0);
+						getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 9;
+						MasterCall(&LogicManager::CONS_Master_SaveGame, 2, kEventCathDefusingBomb, 0, 0);
 						break;
 					}
-				} else if (action == 190346110) {
+				} else if (msg->action == 190346110) {
 					_gameProgress[6] = 3;
-					v4->parameters[0] = 1;
-					if (v2->callParams[8].parameters[1] || v2->callParams[8].parameters[2]) {
-						endDialog(31);
-						v2->callParams[8].parameters[1] = 0;
-						v2->callParams[8].parameters[2] = 0;
+					getCharacterCurrentParams(kCharacterMaster)[0] = 1;
+					if (getCharacterParams(kCharacterMaster, 8)[1] || getCharacterParams(kCharacterMaster, 8)[2]) {
+						endDialog(kCharacterMaster);
+						getCharacterParams(kCharacterMaster, 8)[1] = 0;
+						getCharacterParams(kCharacterMaster, 8)[2] = 0;
 					}
 					fadeToBlack();
-					playDialog(kCharacterCath, "MUS008", 16, 0);
+					playDialog(0, "MUS008", 16, 0);
 					_inventorySelectedItemIdx = 0;
 					fadeToBlack();
 					while (dialogRunning("MUS008"))
 						_engine->getSoundManager()->soundThread();
-					if (cathHasItem(16)) {
-						forceJump(12, &LogicManager::CONS_Alexei_Dead);
-						forceJump(1, &LogicManager::CONS_Anna_Sulking);
-						forceJump(2, &LogicManager::CONS_August_Asleep4);
-						forceJump(3, &LogicManager::CONS_Cond1_OnDuty4);
-						forceJump(4, &LogicManager::CONS_Cond2_OnDuty4);
-						forceJump(6, &LogicManager::CONS_Waiter1_Serving4);
-						forceJump(7, &LogicManager::CONS_Waiter2_Serving4);
-						forceJump(5, &LogicManager::CONS_HeadWait_InPart4);
-						forceJump(9, &LogicManager::CONS_TrainM_InOffice4);
-						forceJump(10, &LogicManager::CONS_Tatiana_Asleep4);
-						forceJump(13, &LogicManager::CONS_Abbot_Asleep4);
-						forceJump(14, &LogicManager::CONS_Milos_EndPart4);
-						forceJump(15, &LogicManager::CONS_Vesna_EndPart4);
-						forceJump(16, &LogicManager::CONS_Ivo_EndPart4);
-						forceJump(17, &LogicManager::CONS_Salko_EndPart4);
-						forceJump(21, &LogicManager::CONS_Madame_Asleep4);
-						forceJump(22, &LogicManager::CONS_Monsieur_Asleep4);
-						forceJump(23, &LogicManager::CONS_Rebecca_Asleep4);
-						forceJump(24, &LogicManager::CONS_Sophie_Asleep4);
-						forceJump(26, &LogicManager::CONS_Yasmin_Asleep4);
-						forceJump(27, &LogicManager::CONS_Hadija_Asleep4);
-						forceJump(28, &LogicManager::CONS_Alouan_Asleep4);
-						forceJump(30, &LogicManager::CONS_Max_InCageFriendly);
-						send(31, 1, 201431954, 0);
-						send(31, 3, 201431954, 0);
-						send(31, 4, 201431954, 0);
-						send(31, 6, 201431954, 0);
-						send(31, 7, 201431954, 0);
-						send(31, 5, 201431954, 0);
-						send(31, 9, 201431954, 0);
-						v2->callbacks[*p_currentCall + 8] = 6;
-						MasterCall(&LogicManager::CONS_Master_SaveGame, 2, 93, 0, 0);
+					if (cathHasItem(kItemBomb)) {
+						forceJump(kCharacterAlexei,   &LogicManager::CONS_Alexei_Dead);
+						forceJump(kCharacterAnna,     &LogicManager::CONS_Anna_Sulking);
+						forceJump(kCharacterAugust,   &LogicManager::CONS_August_Asleep4);
+						forceJump(kCharacterCond1,    &LogicManager::CONS_Cond1_OnDuty4);
+						forceJump(kCharacterCond2,    &LogicManager::CONS_Cond2_OnDuty4);
+						forceJump(kCharacterWaiter1,  &LogicManager::CONS_Waiter1_Serving4);
+						forceJump(kCharacterWaiter2,  &LogicManager::CONS_Waiter2_Serving4);
+						forceJump(kCharacterHeadWait, &LogicManager::CONS_HeadWait_InPart4);
+						forceJump(kCharacterTrainM,   &LogicManager::CONS_TrainM_InOffice4);
+						forceJump(kCharacterTatiana,  &LogicManager::CONS_Tatiana_Asleep4);
+						forceJump(kCharacterAbbot,    &LogicManager::CONS_Abbot_Asleep4);
+						forceJump(kCharacterMilos,    &LogicManager::CONS_Milos_EndPart4);
+						forceJump(kCharacterVesna,    &LogicManager::CONS_Vesna_EndPart4);
+						forceJump(kCharacterIvo,      &LogicManager::CONS_Ivo_EndPart4);
+						forceJump(kCharacterSalko,    &LogicManager::CONS_Salko_EndPart4);
+						forceJump(kCharacterMadame,   &LogicManager::CONS_Madame_Asleep4);
+						forceJump(kCharacterMonsieur, &LogicManager::CONS_Monsieur_Asleep4);
+						forceJump(kCharacterRebecca,  &LogicManager::CONS_Rebecca_Asleep4);
+						forceJump(kCharacterSophie,   &LogicManager::CONS_Sophie_Asleep4);
+						forceJump(kCharacterYasmin,   &LogicManager::CONS_Yasmin_Asleep4);
+						forceJump(kCharacterHadija,   &LogicManager::CONS_Hadija_Asleep4);
+						forceJump(kCharacterAlouan,   &LogicManager::CONS_Alouan_Asleep4);
+						forceJump(kCharacterMax,      &LogicManager::CONS_Max_InCageFriendly);
+
+						send(kCharacterMaster, kCharacterAnna,     201431954, 0);
+						send(kCharacterMaster, kCharacterCond1,    201431954, 0);
+						send(kCharacterMaster, kCharacterCond2,    201431954, 0);
+						send(kCharacterMaster, kCharacterWaiter1,  201431954, 0);
+						send(kCharacterMaster, kCharacterWaiter2,  201431954, 0);
+						send(kCharacterMaster, kCharacterHeadWait, 201431954, 0);
+						send(kCharacterMaster, kCharacterTrainM,   201431954, 0);
+
+						getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 6;
+						MasterCall(&LogicManager::CONS_Master_SaveGame, 2, kEventTylerCastleDream, 0, 0);
 					} else {
 						_gameTime = 2520000;
-						v2->callbacks[*p_currentCall + 8] = 7;
-						MasterCall(&LogicManager::CONS_Master_SaveGame, 2, 115, 0, 0);
+						getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 7;
+						MasterCall(&LogicManager::CONS_Master_SaveGame, 2, kEventTrainExplosionBridge, 0, 0);
 					}
-				} else if (action == 169300225) {
+				} else if (msg->action == 169300225) {
 					if (_gameTime < 2519100)
 						_gameTime = 2519100;
-					v4->parameters[2] = 1;
-					startSeqOtis(31, "BOMB");
+					getCharacterCurrentParams(kCharacterMaster)[2] = 1;
+					startSeqOtis(kCharacterMaster, "BOMB");
 				}
-			} else if (action == 158610240) {
-				v2->callbacks[currentCall + 8] = 8;
+			} else if (msg->action == 158610240) {
+				getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 8;
 				MasterCall(&LogicManager::CONS_Master_SaveGame, 1, 0, 0, 0);
-			} else if (action == 156435676) {
-				send(31, 10, 169360385, 0);
-				send(31, 4, 201431954, 0);
-				send(31, 9, 201431954, 0);
+			} else if (msg->action == 156435676) {
+				send(kCharacterMaster, kCharacterTatiana, 169360385, 0);
+				send(kCharacterMaster, kCharacterCond2, 201431954, 0);
+				send(kCharacterMaster, kCharacterTrainM, 201431954, 0);
 				_gameTimeTicksDelta = 1;
 				_gameTime = 2511900;
-				dropItem(2, 1);
-				v2->characterPosition.car = 4;
-				v2->characterPosition.position = 1500;
-				v2->characterPosition.location = 1;
-				playDialog(31, "ZFX1001", -1, 0);
+				dropItem(kItem2, 1);
+				getCharacter(kCharacterMaster).characterPosition.car = 4;
+				getCharacter(kCharacterMaster).characterPosition.position = 1500;
+				getCharacter(kCharacterMaster).characterPosition.location = 1;
+				playDialog(kCharacterMaster, "ZFX1001", -1, 0);
 			}
-		} else if (action == 139254416) {
+		} else if (msg->action == 139254416) {
 			CONS_Master_StartPart5(0, 0, 0, 0);
-		} else if (action == 18) {
-			switch (v2->callbacks[currentCall + 8]) {
+		} else if (msg->action == 18) {
+			switch (getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8]) {
 			case 1:
 				goto LABEL_82;
 			case 2:
@@ -1698,53 +1737,53 @@ void LogicManager::HAND_Master_MovingSecondNight(HAND_PARAMS) {
 			case 4:
 				goto LABEL_96;
 			case 5:
-				if (whoRunningDialog(31))
-					endDialog(31);
-				playNIS(115);
+				if (whoRunningDialog(kCharacterMaster))
+					endDialog(kCharacterMaster);
+				playNIS(kEventTrainExplosionBridge);
 				endGame(0, 1, 0, 1);
 				break;
 			case 6:
 				_engine->getSoundManager()->endAmbient();
-				playNIS(93);
+				playNIS(kEventTylerCastleDream);
 				_engine->getSoundManager()->startAmbient();
-				_gameProgress[6] = 1;
+				_gameProgress[kProgressField18] = 1;
 				bumpCathTylerComp();
-				send(31, 10, 169360385, 0);
+				send(kCharacterMaster, kCharacterTatiana, 169360385, 0);
 				_gameTimeTicksDelta = 1;
 				_gameTime = 2511900;
-				dropItem(2, 1);
-				takeItem(22);
-				v2->characterPosition.car = 4;
-				v2->characterPosition.position = 1500;
-				v2->characterPosition.location = 1;
-				playDialog(31, "ZFX1001", -1, 0);
+				dropItem(kItem2, 1);
+				takeItem(kItem22);
+				getCharacter(kCharacterMaster).characterPosition.car = 4;
+				getCharacter(kCharacterMaster).characterPosition.position = 1500;
+				getCharacter(kCharacterMaster).characterPosition.location = 1;
+				playDialog(kCharacterMaster, "ZFX1001", -1, 0);
 				break;
 			case 7:
-				playNIS(115);
+				playNIS(kEventTrainExplosionBridge);
 				endGame(1, 2430000, 0, 1);
 				break;
 			case 8:
-				playDialog(kCharacterCath, "MUS022", -1, 0);
+				playDialog(0, "MUS022", -1, 0);
 				if (_gameTime < 2517300)
 					_gameTime = 2517300;
 				break;
 			case 9:
-				playNIS(264);
-				bumpCath(4, 73, 255);
+				playNIS(kEventCathDefusingBomb);
+				bumpCath(kCarRedSleeping, 73, 255);
 				break;
 			case 10:
-				playNIS(116);
-				forceJump(13, &LogicManager::CONS_Abbot_AfterBomb);
-				send(31, 1, 191001984, 0);
-				send(31, 4, 191001984, 0);
-				takeItem(2);
-				_gameInventory[2].location = 0;
-				v4->parameters[1] = 1;
-				bumpCath(4, 2, 255);
+				playNIS(kEventDefuseBomb);
+				forceJump(kCharacterAbbot, &LogicManager::CONS_Abbot_AfterBomb);
+				send(kCharacterMaster, kCharacterAnna, 191001984, 0);
+				send(kCharacterMaster, kCharacterCond2, 191001984, 0);
+				takeItem(kItem2);
+				_gameInventory[kItem2].location = 0;
+				getCharacterCurrentParams(kCharacterMaster)[1] = 1;
+				bumpCath(kCarRedSleeping, 2, 255);
 				break;
 			case 11:
-				bumpCath(4, 74, 255);
-				playDialog(32, "ZFX4001", 16, 0);
+				bumpCath(kCarRedSleeping, 74, 255);
+				playDialog(kCharacterClerk, "ZFX4001", 16, 0);
 				endGame(0, 1, 0, 1);
 				break;
 			default:
@@ -1753,164 +1792,173 @@ void LogicManager::HAND_Master_MovingSecondNight(HAND_PARAMS) {
 		}
 		return;
 	}
-	if (action == 12) {
-		v4->parameters[3] = 225 * (4 * rnd(5) + 20);
-		v4->parameters[4] = 225 * (4 * rnd(6) + 8);
+	if (msg->action == 12) {
+		getCharacterCurrentParams(kCharacterMaster)[3] = 225 * (4 * rnd(5) + 20);
+		getCharacterCurrentParams(kCharacterMaster)[4] = 225 * (4 * rnd(6) + 8);
 		return;
 	}
-	if (!action) {
-		if (_gameProgress[20]) {
-			if (v4->parameters[5] || (v6 = v4->parameters[3], v7 = _currentGameSessionTicks + v6 == 0, v4->parameters[5] = _currentGameSessionTicks + v6, !v7)) {
-				if (v4->parameters[5] >= _currentGameSessionTicks)
+	if (msg->action == 0) {
+		if (_gameProgress[kProgressIsTrainRunning]) {
+			if (getCharacterCurrentParams(kCharacterMaster)[5] ||
+				(getCharacterCurrentParams(kCharacterMaster)[5] = _currentGameSessionTicks + getCharacterCurrentParams(kCharacterMaster)[3], _currentGameSessionTicks + getCharacterCurrentParams(kCharacterMaster)[3] != 0)) {
+				if (getCharacterCurrentParams(kCharacterMaster)[5] >= _currentGameSessionTicks)
 					goto LABEL_35;
-				v4->parameters[5] = 0x7FFFFFFF;
+				getCharacterCurrentParams(kCharacterMaster)[5] = 0x7FFFFFFF;
 			}
 			switch (rnd(5)) {
 			case 0:
-				v11 = rnd(15) + 2;
-				playDialog(kCharacterCath, "ZFX1005", v11, 0);
+				playDialog(0, "ZFX1005", rnd(15) + 2, 0);
 				break;
 			case 1:
-				v12 = rnd(15) + 2;
-				playDialog(kCharacterCath, "ZFX1006", v12, 0);
+				playDialog(0, "ZFX1006", rnd(15) + 2, 0);
 				break;
 			case 2:
-				v13 = rnd(15) + 2;
-				playDialog(kCharacterCath, "ZFX1007", v13, 0);
+				playDialog(0, "ZFX1007", rnd(15) + 2, 0);
 				break;
 			case 3:
-				v14 = rnd(15) + 2;
-				playDialog(kCharacterCath, "ZFX1007A", v14, 0);
+				playDialog(0, "ZFX1007A", rnd(15) + 2, 0);
 				break;
 			case 4:
-				v15 = rnd(15) + 2;
-				playDialog(kCharacterCath, "ZFX1007B", v15, 0);
+				playDialog(0, "ZFX1007B", rnd(15) + 2, 0);
 				break;
 			default:
 				break;
 			}
-			v4->parameters[3] = 225 * (4 * rnd(5) + 20);
-			v4->parameters[5] = 0;
+
+			getCharacterCurrentParams(kCharacterMaster)[3] = 225 * (4 * rnd(5) + 20);
+			getCharacterCurrentParams(kCharacterMaster)[5] = 0;
 		}
 	LABEL_35:
-		if (v4->parameters[6] || (v8 = v4->parameters[4], v7 = _currentGameSessionTicks + v8 == 0, v4->parameters[6] = _currentGameSessionTicks + v8, !v7)) {
-			if (v4->parameters[6] >= _currentGameSessionTicks) {
+		if (getCharacterCurrentParams(kCharacterMaster)[6] ||
+			(getCharacterCurrentParams(kCharacterMaster)[6] = _currentGameSessionTicks + getCharacterCurrentParams(kCharacterMaster)[4], _currentGameSessionTicks + getCharacterCurrentParams(kCharacterMaster)[4] != 0)) {
+			if (getCharacterCurrentParams(kCharacterMaster)[6] >= _currentGameSessionTicks) {
 			LABEL_45:
-				if (_gameTime > 2381400 && !v4->parameters[7]) {
-					v4->parameters[7] = 1;
-					v2->callbacks[*p_currentCall + 8] = 1;
-					MasterCall(&LogicManager::CONS_Master_Arrive, "Pozsony", 0xE, 0, 0);
+				if (_gameTime > 2381400 && !getCharacterCurrentParams(kCharacterMaster)[7]) {
+					getCharacterCurrentParams(kCharacterMaster)[7] = 1;
+					getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 1;
+					MasterCall(&LogicManager::CONS_Master_Arrive, "Pozsony", 14, 0, 0);
 					return;
 				}
 			LABEL_82:
-				if (_gameTime > 2386800 && !v4->parameters[8]) {
-					v4->parameters[8] = 1;
-					v2->callbacks[*p_currentCall + 8] = 2;
+				if (_gameTime > 2386800 && !getCharacterCurrentParams(kCharacterMaster)[8]) {
+					getCharacterCurrentParams(kCharacterMaster)[8] = 1;
+					getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 2;
 					MasterCall(&LogicManager::CONS_Master_Depart, "Pozsony", 0, 0, 0);
 					return;
 				}
 			LABEL_85:
-				if (getModel(1) == 1 && _gameTime > 2403000 && !v4->parameters[9]) {
-					v4->parameters[9] = 1;
+				if (getModel(1) == 1 && _gameTime > 2403000 && !getCharacterCurrentParams(kCharacterMaster)[9]) {
+					getCharacterCurrentParams(kCharacterMaster)[9] = 1;
 					_gameProgress[6] = 2;
 				}
-				if (v4->parameters[0])
+				if (getCharacterCurrentParams(kCharacterMaster)[0])
 					goto LABEL_96;
-				if (_gameTime > 2416500 && !v4->parameters[10]) {
-					v4->parameters[10] = 1;
-					v2->callbacks[*p_currentCall + 8] = 3;
-					MasterCall(&LogicManager::CONS_Master_Arrive, "Galanta", 0xF, 0, 0);
+				if (_gameTime > 2416500 && !getCharacterCurrentParams(kCharacterMaster)[10]) {
+					getCharacterCurrentParams(kCharacterMaster)[10] = 1;
+					getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 3;
+					MasterCall(&LogicManager::CONS_Master_Arrive, "Galanta", 15, 0, 0);
 					return;
 				}
 			LABEL_93:
-				if (_gameTime <= 2421900 || v4->parameters[11]) {
+				if (_gameTime <= 2421900 || getCharacterCurrentParams(kCharacterMaster)[11]) {
 				LABEL_96:
-					if (_gameTime > 2470500 && !v4->parameters[12]) {
-						v4->parameters[12] = 1;
-						if (_gameProgress[6] == 2)
+					if (_gameTime > 2470500 && !getCharacterCurrentParams(kCharacterMaster)[12]) {
+						getCharacterCurrentParams(kCharacterMaster)[12] = 1;
+						if (_gameProgress[kProgressField18] == 2)
 							_gameTimeTicksDelta = 1;
 					}
-					if (_gameTime > 2506500 && !v4->parameters[13]) {
-						v4->parameters[13] = 1;
-						if (_gameProgress[6] == 2)
-							_gameProgress[6] = 1;
+					if (_gameTime > 2506500 && !getCharacterCurrentParams(kCharacterMaster)[13]) {
+						getCharacterCurrentParams(kCharacterMaster)[13] = 1;
+						if (_gameProgress[kProgressField18] == 2)
+							_gameProgress[kProgressField18] = 1;
 					}
-					if (_gameTime > 2520000 && !v4->parameters[14]) {
-						v4->parameters[14] = 1;
-						if (!v4->parameters[1] && !v4->parameters[2]) {
-							v2->callbacks[*p_currentCall + 8] = 5;
-							MasterCall(&LogicManager::CONS_Master_SaveGame, 2, 0x73, 0, 0);
+					if (_gameTime > 2520000 && !getCharacterCurrentParams(kCharacterMaster)[14]) {
+						getCharacterCurrentParams(kCharacterMaster)[14] = 1;
+						if (!getCharacterCurrentParams(kCharacterMaster)[1] && !getCharacterCurrentParams(kCharacterMaster)[2]) {
+							getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 5;
+							MasterCall(&LogicManager::CONS_Master_SaveGame, 2, kEventTrainExplosionBridge, 0, 0);
 						}
 					}
 				} else {
-					v4->parameters[11] = 1;
-					v2->callbacks[*p_currentCall + 8] = 4;
+					getCharacterCurrentParams(kCharacterMaster)[11] = 1;
+					getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 4;
 					MasterCall(&LogicManager::CONS_Master_Depart, "Galanta", 0, 0, 0);
 				}
 				return;
 			}
-			v4->parameters[6] = 0x7FFFFFFF;
+			getCharacterCurrentParams(kCharacterMaster)[6] = 0x7FFFFFFF;
 		}
-		v9 = rnd(2);
-		if (v9) {
-			if (v9 == 1) {
-				v17 = rnd(15) + 2;
-				playDialog(kCharacterCath, "ZFX1009", v17, 0);
-			}
-		} else {
-			v16 = rnd(15) + 2;
-			playDialog(kCharacterCath, "ZFX1008", v16, 0);
+
+		switch (rnd(2)) {
+		case 0:
+			playDialog(0, "ZFX1008", rnd(15) + 2, 0);
+			break;
+		case 1:
+		default:
+			playDialog(0, "ZFX1009", rnd(15) + 2, 0);
+			break;
 		}
-		v4->parameters[4] = 225 * (4 * rnd(6) + 8);
-		v4->parameters[6] = 0;
+
+		getCharacterCurrentParams(kCharacterMaster)[4] = 225 * (4 * rnd(6) + 8);
+		getCharacterCurrentParams(kCharacterMaster)[6] = 0;
 		goto LABEL_45;
 	}
-	if (action != 2) {
-		if (action == 3) {
-			endGraphics(31);
-			v2->callbacks[*p_currentCall + 8] = 11;
+	if (msg->action != 2) {
+		if (msg->action == 3) {
+			endGraphics(kCharacterMaster);
+			getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 11;
 			MasterCall(&LogicManager::CONS_Master_SaveGame, 1, 0, 0, 0);
 		}
 		return;
 	}
 	if (getCharacterParams(kCharacterMaster, 8)[1]) {
-		send(31, 32, 191350523, 0);
+		send(kCharacterMaster, kCharacterClerk, 191350523, 0);
 		if (getCharacter(kCharacterCath).characterPosition.location == 2) {
 			if (cathOutHisWindow()) {
-				v18 = 49;
-			LABEL_62:
-				bumpCath(3, v18, 255);
-				goto LABEL_63;
+				bumpCath(kCarGreenSleeping, 49, 255);
+				_engine->getSoundManager()->startAmbient();
+				_engine->getSoundManager()->startSteam(getCharacterParams(kCharacterMaster, 8)[3]);
+				getCharacterParams(kCharacterMaster, 8)[1] = 0;
+				return;
 			}
 			if (cathOutRebeccaWindow()) {
-				bumpCath(4, 49, 255);
+				bumpCath(kCarRedSleeping, 49, 255);
 			} else {
-				car = getCharacter(kCharacterCath).characterPosition.car;
-				if (car < 4 || car > 7) {
-					if (!car || car > 3)
-						goto LABEL_63;
-					if (checkCathDir(3, 98)) {
-						playDialog(kCharacterCath, "LIB015", -1, 0);
-						v18 = 71;
+				if (getCharacter(kCharacterCath).characterPosition.car < 4 || getCharacter(kCharacterCath).characterPosition.car > 7) {
+					if (!getCharacter(kCharacterCath).characterPosition.car || getCharacter(kCharacterCath).characterPosition.car > 3) {
+						_engine->getSoundManager()->startAmbient();
+						_engine->getSoundManager()->startSteam(getCharacterParams(kCharacterMaster, 8)[3]);
+						getCharacterParams(kCharacterMaster, 8)[1] = 0;
+						return;
+					}
+
+					if (checkCathDir(kCarGreenSleeping, 98)) {
+						playDialog(0, "LIB015", -1, 0);
+						bumpCath(kCarGreenSleeping, 71, 255);
 					} else {
-						v18 = 82;
+						bumpCath(kCarGreenSleeping, 82, 255);
 					}
-					goto LABEL_62;
+					
+					_engine->getSoundManager()->startAmbient();
+					_engine->getSoundManager()->startSteam(getCharacterParams(kCharacterMaster, 8)[3]);
+					getCharacterParams(kCharacterMaster, 8)[1] = 0;
+					return;
 				}
-				bumpCath(5, 82, 255);
+
+				bumpCath(kCarRestaurant, 82, 255);
 			}
 		}
-	LABEL_63:
+
 		_engine->getSoundManager()->startAmbient();
-		_engine->getSoundManager()->startSteam(v2->callParams[8].parameters[3]);
-		v2->callParams[8].parameters[1] = 0;
+		_engine->getSoundManager()->startSteam(getCharacterParams(kCharacterMaster, 8)[3]);
+		getCharacterParams(kCharacterMaster, 8)[1] = 0;
 		return;
 	}
 	if (getCharacterParams(kCharacterMaster, 8)[2]) {
 		_engine->getSoundManager()->startAmbient();
-		v2->callParams[8].parameters[2] = 0;
-	} else if (!v4->parameters[1] && !v4->parameters[2]) {
-		playDialog(31, "ZFX1001", -1, 0);
+		getCharacterParams(kCharacterMaster, 8)[2] = 0;
+	} else if (!getCharacterCurrentParams(kCharacterMaster)[1] && !getCharacterCurrentParams(kCharacterMaster)[2]) {
+		playDialog(kCharacterMaster, "ZFX1001", -1, 0);
 	}
 }
 
@@ -1925,7 +1973,8 @@ void LogicManager::CONS_Master_StartPart5(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Master_StartPart5(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		if (_gameProgress[kProgressChapter] != 5) {
 			_gameProgress[kProgressChapter] = 5;
 			makeAllJump(5);
@@ -1935,6 +1984,9 @@ void LogicManager::HAND_Master_StartPart5(HAND_PARAMS) {
 		_gameTimeTicksDelta = 2;
 
 		CONS_Master_InitPart5(0, 0, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1949,89 +2001,97 @@ void LogicManager::CONS_Master_InitPart5(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Master_InitPart5(HAND_PARAMS) {
-	if (msg->action == 12) {
-		endGraphics(33);
-		endGraphics(34);
-		endGraphics(35);
-		endGraphics(36);
-		endGraphics(37);
-		endGraphics(38);
-
-		_gameProgress[20] = 1;
-
-		setDoor(26, 0, 1, 0, 9);
-		setDoor(27, 0, 1, 0, 9);
-		setDoor(1, 0, 0, 10, 9);
-		setDoor(2, 0, 0, 10, 9);
-		setDoor(3, 0, 0, 10, 9);
-		setDoor(4, 0, 3, 10, 9);
-		setDoor(5, 0, 3, 10, 9);
-		setDoor(6, 0, 3, 10, 9);
-		setDoor(7, 0, 3, 10, 9);
-		setDoor(8, 0, 3, 10, 9);
-		setDoor(32, 0, 0, 10, 9);
-		setDoor(33, 0, 0, 10, 9);
-		setDoor(34, 0, 0, 10, 9);
-		setDoor(35, 0, 0, 10, 9);
-		setDoor(36, 0, 0, 10, 9);
-		setDoor(37, 0, 0, 10, 9);
-		setDoor(38, 0, 3, 10, 9);
-		setDoor(39, 0, 3, 10, 9);
-		setDoor(17, 0, 0, 10, 9);
-		setDoor(18, 0, 0, 10, 9);
-		setDoor(19, 0, 0, 10, 9);
-		setDoor(20, 0, 3, 10, 9);
-		setDoor(21, 0, 3, 10, 9);
-		setDoor(22, 0, 3, 10, 9);
-		setDoor(48, 0, 0, 10, 9);
-		setDoor(49, 0, 0, 10, 9);
-		setDoor(50, 0, 0, 10, 9);
-		setDoor(51, 0, 0, 10, 9);
-		setDoor(52, 0, 0, 10, 9);
-		setDoor(53, 0, 0, 10, 9);
-		setDoor(26, 0, 0, 10, 9);
-		setDoor(27, 0, 0, 10, 9);
-
-		_gameProgress[6] = 1;
+	switch (msg->action) {
+	case 12:
+		endGraphics(kCharacterTableA);
+		endGraphics(kCharacterTableB);
+		endGraphics(kCharacterTableC);
+		endGraphics(kCharacterTableD);
+		endGraphics(kCharacterTableE);
+		endGraphics(kCharacterTableF);
+
+		_gameProgress[kProgressIsTrainRunning] = 1;
+
+		setDoor(26, kCharacterCath, 1, 0, 9);
+		setDoor(27, kCharacterCath, 1, 0, 9);
+		setDoor(1, kCharacterCath, 0, 10, 9);
+		setDoor(2, kCharacterCath, 0, 10, 9);
+		setDoor(3, kCharacterCath, 0, 10, 9);
+		setDoor(4, kCharacterCath, 3, 10, 9);
+		setDoor(5, kCharacterCath, 3, 10, 9);
+		setDoor(6, kCharacterCath, 3, 10, 9);
+		setDoor(7, kCharacterCath, 3, 10, 9);
+		setDoor(8, kCharacterCath, 3, 10, 9);
+		setDoor(32, kCharacterCath, 0, 10, 9);
+		setDoor(33, kCharacterCath, 0, 10, 9);
+		setDoor(34, kCharacterCath, 0, 10, 9);
+		setDoor(35, kCharacterCath, 0, 10, 9);
+		setDoor(36, kCharacterCath, 0, 10, 9);
+		setDoor(37, kCharacterCath, 0, 10, 9);
+		setDoor(38, kCharacterCath, 3, 10, 9);
+		setDoor(39, kCharacterCath, 3, 10, 9);
+		setDoor(17, kCharacterCath, 0, 10, 9);
+		setDoor(18, kCharacterCath, 0, 10, 9);
+		setDoor(19, kCharacterCath, 0, 10, 9);
+		setDoor(20, kCharacterCath, 3, 10, 9);
+		setDoor(21, kCharacterCath, 3, 10, 9);
+		setDoor(22, kCharacterCath, 3, 10, 9);
+		setDoor(48, kCharacterCath, 0, 10, 9);
+		setDoor(49, kCharacterCath, 0, 10, 9);
+		setDoor(50, kCharacterCath, 0, 10, 9);
+		setDoor(51, kCharacterCath, 0, 10, 9);
+		setDoor(52, kCharacterCath, 0, 10, 9);
+		setDoor(53, kCharacterCath, 0, 10, 9);
+		setDoor(26, kCharacterCath, 0, 10, 9);
+		setDoor(27, kCharacterCath, 0, 10, 9);
+
+		_gameProgress[kProgressField18] = 1;
 		_inventorySelectedItemIdx = 0;
-		_gameProgress[33] = 1;
-		_gameProgress[7] = 36;
+		_gameProgress[kProgressField84] = 1;
+		_gameProgress[kProgressPortrait] = 36;
 
-		takeCathItem(15);
-		takeCathItem(16);
-		takeCathItem(12);
+		takeCathItem(kItemKey);
+		takeCathItem(kItemBomb);
+		takeCathItem(kItemMatch);
 
-		if (cathHasItem(18)) {
-			takeCathItem(18);
-			dropItem(18, 3);
+		if (cathHasItem(kItemFirebird)) {
+			takeCathItem(kItemFirebird);
+			dropItem(kItemFirebird, 3);
 
-			if (cathHasItem(13)) {
-				takeCathItem(13);
-				dropItem(13, 3);
+			if (cathHasItem(kItemWhistle)) {
+				takeCathItem(kItemWhistle);
+				dropItem(kItemWhistle, 3);
 			}
 		}
 
-		setDoor(93, 0, 2, 255, 255);
-		setDoor(94, 0, 0, 255, 255);
-		setDoor(101, 0, 0, 10, 9);
+		setDoor(93, kCharacterCath, 2, 255, 255);
+		setDoor(94, kCharacterCath, 0, 255, 255);
+		setDoor(101, kCharacterCath, 0, 10, 9);
 		setModel(98, 2);
 		setModel(55, 2);
 
 		if (getCharacterParams(kCharacterMaster, 8)[1] || getCharacterParams(kCharacterMaster, 8)[2]) {
-			endDialog(31);
+			endDialog(kCharacterMaster);
 			getCharacterParams(kCharacterMaster, 8)[1] = 0;
 			getCharacterParams(kCharacterMaster, 8)[2] = 0;
 		}
 
 		fadeToBlack();
-		bumpCath(1, 95, 255);
+		bumpCath(kCarBaggageRear, 95, 255);
 		restoreIcons();
 
 		getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 1;
 
 		MasterCall(&LogicManager::CONS_Master_SaveGame, 1, 0, 0, 0);
-	} else if (msg->action == 18 && getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] == 1) {
-		CONS_Master_MovingPart5(0, 0, 0, 0);
+		break;
+	case 18:
+		if (getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] == 1) {
+			CONS_Master_MovingPart5(0, 0, 0, 0);
+		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -2046,44 +2106,54 @@ void LogicManager::CONS_Master_MovingPart5(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Master_MovingPart5(HAND_PARAMS) {
-	if (msg->action > 12) {
-		if (msg->action == 18) {
-			if (getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] == 1) {
-				playNIS(46);
-				endGame(1, 2898000, 51, 1);
-			}
-		} else if (msg->action == 135800432) {
-			_gameProgress[14] = 1;
-			_gameTime = 2916000;
-			if (whoRunningDialog(31))
-				endDialog(31);
-		}
-	} else if (msg->action == 12) {
-		getCharacterCurrentParams(kCharacterMaster)[0] = 225 * (4 * rnd(10) + 20);
-	} else if (msg->action) {
-		if (msg->action == 2) {
-			if (_gameTime <= 2943000) {
-				getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 1;
-				MasterCall(&LogicManager::CONS_Master_SaveGame, 2, 0x2E, 0, 0);
-			} else {
-				endGame(1, 2934000, 51, 1);
-			}
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		if (_gameTime > 2907000 && !getCharacterCurrentParams(kCharacterMaster)[1]) {
 			getCharacterCurrentParams(kCharacterMaster)[1] = 1;
-			if (!_gameProgress[14]) {
-				playDialog(31, "ARRIVE", 8, 0);
+			if (!_gameProgress[kProgressIsDayTime]) {
+				playDialog(kCharacterMaster, "ARRIVE", 8, 0);
 				_engine->getSoundManager()->endAmbient();
 			}
 		}
+
 		if (_gameTime > 2943000 && !getCharacterCurrentParams(kCharacterMaster)[2]) {
 			getCharacterCurrentParams(kCharacterMaster)[2] = 1;
-			if (!_gameEvents[108] && !_gameEvents[109]) {
-				playDialog(31, "ARRIVE", 8, 0);
+			if (!_gameEvents[kEventLocomotiveMilosDay] && !_gameEvents[kEventLocomotiveMilosNight]) {
+				playDialog(kCharacterMaster, "ARRIVE", 8, 0);
 				_engine->getSoundManager()->endAmbient();
 			}
 		}
+
+		break;
+	case 2:
+		if (_gameTime <= 2943000) {
+			getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 1;
+			MasterCall(&LogicManager::CONS_Master_SaveGame, 2, kEventTrainStopped, 0, 0);
+		} else {
+			endGame(1, 2934000, 51, true);
+		}
+
+		break;
+	case 12:
+		getCharacterCurrentParams(kCharacterMaster)[0] = 225 * (4 * rnd(10) + 20);
+		break;
+	case 18:
+		if (getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] == 1) {
+			playNIS(kEventTrainStopped);
+			endGame(1, 2898000, 51, true);
+		}
+
+		break;
+	case 135800432:
+		_gameProgress[kProgressIsDayTime] = 1;
+		_gameTime = 2916000;
+
+		if (whoRunningDialog(kCharacterMaster))
+			endDialog(kCharacterMaster);
+
+		break;
+	default:
+		break;
 	}
 }
 


Commit: 6d0f5b1524798b9965912d93f7a6bfeb0862c73b
    https://github.com/scummvm/scummvm/commit/6d0f5b1524798b9965912d93f7a6bfeb0862c73b
Author: AndywinXp (andywinxp at gmail.com)
Date: 2025-06-16T23:12:18+02:00

Commit Message:
LASTEXPRESS: Clean up more code

Changed paths:
    engines/lastexpress/data/archive.cpp
    engines/lastexpress/data/archive.h
    engines/lastexpress/game/nis.cpp
    engines/lastexpress/game/nis.h
    engines/lastexpress/graphics.cpp
    engines/lastexpress/graphics.h
    engines/lastexpress/lastexpress.cpp


diff --git a/engines/lastexpress/data/archive.cpp b/engines/lastexpress/data/archive.cpp
index 07f92786576..47339b6fbe2 100644
--- a/engines/lastexpress/data/archive.cpp
+++ b/engines/lastexpress/data/archive.cpp
@@ -34,13 +34,13 @@ namespace LastExpress {
 ArchiveManager::ArchiveManager(LastExpressEngine *engine) {
 	_engine = engine;
 
-	g_CDFilePointer = new Common::File();
-	g_HDFilePointer = new Common::File();
+	_cdFilePointer = new Common::File();
+	_hdFilePointer = new Common::File();
 }
 
 ArchiveManager::~ArchiveManager() {
-	SAFE_DELETE(g_CDFilePointer);
-	SAFE_DELETE(g_HDFilePointer);
+	SAFE_DELETE(_cdFilePointer);
+	SAFE_DELETE(_hdFilePointer);
 }
 
 HPF *ArchiveManager::search(const char *name, HPF *archive, int archiveSize) {
@@ -69,17 +69,17 @@ HPF *ArchiveManager::search(const char *name, HPF *archive, int archiveSize) {
 bool ArchiveManager::lockCD(int32 index) {
 	char filename[80];
 
-	if (g_CDFilePointer && g_CDArchiveIndex == index)
+	if (_cdFilePointer && _cdArchiveIndex == index)
 		return true;
 
 	// Not present in the original, but we need it since we're about to reopen a new file...
-	if (g_CDFilePointer && g_CDFilePointer->isOpen())
-		g_CDFilePointer->close();
+	if (_cdFilePointer && _cdFilePointer->isOpen())
+		_cdFilePointer->close();
 
 	if (!isCDAvailable(index, filename, sizeof(filename)) || !lockCache(filename))
 		return false;
 
-	g_CDArchiveIndex = index;
+	_cdArchiveIndex = index;
 	return true;
 }
 
@@ -93,21 +93,21 @@ bool ArchiveManager::lockCache(char *filename) {
 	uint32 curSubFilesNum;
 	uint32 archiveIndex = 0;
 
-	g_CDFilePosition = 0;
+	_cdFilePosition = 0;
 
-	if (!g_CDFilePointer || !g_CDFilePointer->open(filename))
+	if (!_cdFilePointer || !_cdFilePointer->open(filename))
 		return false;
 
-	g_CDArchiveNumFiles = g_CDFilePointer->readUint32LE();
+	_cdArchiveNumFiles = _cdFilePointer->readUint32LE();
 
-	if (g_CDFilePointer->err()) {
+	if (_cdFilePointer->err()) {
 		error("Error reading from file \"%s\"", filename);
 	}
 
-	remainingArchiveSize = g_CDArchiveNumFiles;
-	g_CDFilePosition += 4;
+	remainingArchiveSize = _cdArchiveNumFiles;
+	_cdFilePosition += 4;
 
-	if (g_CDArchiveNumFiles) {
+	if (_cdArchiveNumFiles) {
 		do {
 			curSubFilesNum = 500;
 
@@ -118,14 +118,14 @@ bool ArchiveManager::lockCache(char *filename) {
 			// This is not quite portable as the bytes are directly associated to the struct, which might
 			// have alignment differences, so instead we do it in the "ScummVM way"...
 			for (uint i = 0; i < curSubFilesNum; i++) {
-				g_CDFilePointer->read(g_CDArchive[archiveIndex + i].name, sizeof(g_CDArchive[archiveIndex + i].name));
-				g_CDArchive[archiveIndex + i].offset = g_CDFilePointer->readUint32LE();
-				g_CDArchive[archiveIndex + i].size = g_CDFilePointer->readUint16LE();
-				g_CDArchive[archiveIndex + i].currentPos = g_CDFilePointer->readUint16LE();
-				g_CDArchive[archiveIndex + i].status = g_CDFilePointer->readUint16LE();
+				_cdFilePointer->read(_cdArchive[archiveIndex + i].name, sizeof(_cdArchive[archiveIndex + i].name));
+				_cdArchive[archiveIndex + i].offset = _cdFilePointer->readUint32LE();
+				_cdArchive[archiveIndex + i].size = _cdFilePointer->readUint16LE();
+				_cdArchive[archiveIndex + i].currentPos = _cdFilePointer->readUint16LE();
+				_cdArchive[archiveIndex + i].status = _cdFilePointer->readUint16LE();
 			}
 
-			if (g_CDFilePointer->err()) {
+			if (_cdFilePointer->err()) {
 				error("Error reading from file \"%s\"", filename);
 			}
 
@@ -135,86 +135,86 @@ bool ArchiveManager::lockCache(char *filename) {
 		} while (remainingArchiveSize);
 	}
 
-	g_CDFilePosition += 22 * g_CDArchiveNumFiles;
+	_cdFilePosition += 22 * _cdArchiveNumFiles;
 
 	return true;
 }
 
 void ArchiveManager::initHPFS() {
-	g_HDFilePosition = 0;
+	_hdFilePosition = 0;
 
-	if (!g_HDFilePointer || !g_HDFilePointer->open(_engine->isDemo() ? "DEMO.HPF" : "HD.hpf")) {
+	if (!_hdFilePointer || !_hdFilePointer->open(_engine->isDemo() ? "DEMO.HPF" : "HD.hpf")) {
 		error("Hard drive cache not found (please reinstall)");
 	}
 
-	g_CDArchive = (HPF *)malloc(6500 * sizeof(HPF));
+	_cdArchive = (HPF *)malloc(6500 * sizeof(HPF));
 
-	if (!g_CDArchive) {
+	if (!_cdArchive) {
 		error("Out of memory");
 	}
 
-	g_HDArchiveNumFiles = g_HDFilePointer->readUint32LE();
+	_hdArchiveNumFiles = _hdFilePointer->readUint32LE();
 
-	if (g_HDFilePointer->err()) {
+	if (_hdFilePointer->err()) {
 		error("Error reading from file \"%s\"", _engine->isDemo() ? "DEMO.HPF" : "HD.hpf");
 	}
 
-	g_HDFilePosition += 4;
-	g_HDArchive = (HPF *)malloc(g_HDArchiveNumFiles * sizeof(HPF));
+	_hdFilePosition += 4;
+	_hdArchive = (HPF *)malloc(_hdArchiveNumFiles * sizeof(HPF));
 
-	if (!g_HDArchive) {
+	if (!_hdArchive) {
 		error("Out of memory");
 	}
 
-	for (int i = 0; i < g_HDArchiveNumFiles; i++) {
-		g_HDFilePointer->read(g_HDArchive[i].name, sizeof(g_HDArchive[i].name));
-		g_HDArchive[i].offset = g_HDFilePointer->readUint32LE();
-		g_HDArchive[i].size = g_HDFilePointer->readUint16LE();
-		g_HDArchive[i].currentPos = g_HDFilePointer->readUint16LE();
-		g_HDArchive[i].status = g_HDFilePointer->readUint16LE();
+	for (int i = 0; i < _hdArchiveNumFiles; i++) {
+		_hdFilePointer->read(_hdArchive[i].name, sizeof(_hdArchive[i].name));
+		_hdArchive[i].offset = _hdFilePointer->readUint32LE();
+		_hdArchive[i].size = _hdFilePointer->readUint16LE();
+		_hdArchive[i].currentPos = _hdFilePointer->readUint16LE();
+		_hdArchive[i].status = _hdFilePointer->readUint16LE();
 	}
 
-	if (g_HDFilePointer->err()) {
+	if (_hdFilePointer->err()) {
 		error("Error reading from file \"%s\"", _engine->isDemo() ? "DEMO.HPF" : "HD.hpf");
 	}
 
-	g_HDFilePosition += g_HDArchiveNumFiles;
+	_hdFilePosition += _hdArchiveNumFiles;
 }
 
 void ArchiveManager::shutDownHPFS() {
 	unlockCD();
 
-	if (g_HDFilePointer)
-		g_HDFilePointer->close();
+	if (_hdFilePointer)
+		_hdFilePointer->close();
 
-	if (g_HDFilePointer && g_HDFilePointer->isOpen()) {
+	if (_hdFilePointer && _hdFilePointer->isOpen()) {
 		error("Error closing file \"%s\"", "HD cache file");
 	}
 
-	if (g_HDArchive) {
-		free(g_HDArchive);
-		g_HDArchive = nullptr;
+	if (_hdArchive) {
+		free(_hdArchive);
+		_hdArchive = nullptr;
 	}
 
-	if (g_CDArchive) {
-		free(g_CDArchive);
-		g_CDArchive = nullptr;
+	if (_cdArchive) {
+		free(_cdArchive);
+		_cdArchive = nullptr;
 	}
 
-	delete g_HDFilePointer;
-	g_HDFilePointer = nullptr;
+	delete _hdFilePointer;
+	_hdFilePointer = nullptr;
 
-	g_HDArchiveNumFiles = 0;
-	g_HDFilePosition = 0;
+	_hdArchiveNumFiles = 0;
+	_hdFilePosition = 0;
 }
 
 void ArchiveManager::unlockCD() {
-	if (g_CDFilePointer)
-		g_CDFilePointer->close();
+	if (_cdFilePointer)
+		_cdFilePointer->close();
 
-	g_CDArchiveNumFiles = 0;
-	g_CDFilePosition = 0;
-	g_CDArchiveIndex = 0;
+	_cdArchiveNumFiles = 0;
+	_cdFilePosition = 0;
+	_cdArchiveIndex = 0;
 }
 
 HPF *ArchiveManager::openHPF(const char *filename) {
@@ -222,13 +222,13 @@ HPF *ArchiveManager::openHPF(const char *filename) {
 	Common::String filenameStr(filename);
 	filenameStr.toUppercase();
 
-	if (!g_HDFilePointer)
+	if (!_hdFilePointer)
 		return nullptr;
 
-	result = search(filenameStr.c_str(), g_HDArchive, g_HDArchiveNumFiles);
+	result = search(filenameStr.c_str(), _hdArchive, _hdArchiveNumFiles);
 	if (!result) {
-		if (g_CDArchiveNumFiles)
-			result = search(filenameStr.c_str(), g_CDArchive, g_CDArchiveNumFiles);
+		if (_cdArchiveNumFiles)
+			result = search(filenameStr.c_str(), _cdArchive, _cdArchiveNumFiles);
 
 		if (!result)
 			return nullptr;
@@ -244,36 +244,36 @@ HPF *ArchiveManager::openHPF(const char *filename) {
 }
 
 void ArchiveManager::readHD(void *dstBuf, int offset, uint32 size) {
-	if (g_HDFilePointer && g_HDFilePointer->isOpen()) {
-		if (offset != g_HDFilePosition) {	
-			if (!g_HDFilePointer->seek(offset * PAGE_SIZE, SEEK_SET)) {
+	if (_hdFilePointer && _hdFilePointer->isOpen()) {
+		if (offset != _hdFilePosition) {	
+			if (!_hdFilePointer->seek(offset * PAGE_SIZE, SEEK_SET)) {
 				error("Error seeking in file \"%s\"", "HD cache file");
 			}
 		}
 
-		uint32 readSize = g_HDFilePointer->read(dstBuf, size * PAGE_SIZE);
+		uint32 readSize = _hdFilePointer->read(dstBuf, size * PAGE_SIZE);
 		if (readSize != size * PAGE_SIZE) {
 			error("Error reading from file \"%s\"", "HD cache file");
 		}
 
-		g_HDFilePosition = (offset + size);
+		_hdFilePosition = (offset + size);
 	}
 }
 
 void ArchiveManager::readCD(void *dstBuf, int offset, uint32 size) {
-	if (g_CDFilePointer && g_CDFilePointer->isOpen()) {
-		if (offset != g_CDFilePosition) {
-			if (!g_CDFilePointer->seek(offset * PAGE_SIZE, SEEK_SET)) {
+	if (_cdFilePointer && _cdFilePointer->isOpen()) {
+		if (offset != _cdFilePosition) {
+			if (!_cdFilePointer->seek(offset * PAGE_SIZE, SEEK_SET)) {
 				error("Error seeking in file \"%s\"", "CD cache file");
 			}
 		}
 
-		uint32 readSize = g_CDFilePointer->read(dstBuf, size * PAGE_SIZE);
+		uint32 readSize = _cdFilePointer->read(dstBuf, size * PAGE_SIZE);
 		if (readSize != size * PAGE_SIZE) {
 			error("Error reading from file \"%s\"", "CD cache file");
 		}
 
-		g_CDFilePosition = (offset + readSize);
+		_cdFilePosition = (offset + readSize);
 	}
 }
 
diff --git a/engines/lastexpress/data/archive.h b/engines/lastexpress/data/archive.h
index 1e727f97320..caa9e87f008 100644
--- a/engines/lastexpress/data/archive.h
+++ b/engines/lastexpress/data/archive.h
@@ -94,17 +94,17 @@ public:
 private:
 	LastExpressEngine *_engine = nullptr;
 
-	Common::File *g_CDFilePointer = nullptr;
-	int32 g_CDFilePosition = 0;
-	int32 g_CDArchiveNumFiles = 0;
+	Common::File *_cdFilePointer = nullptr;
+	int32 _cdFilePosition = 0;
+	int32 _cdArchiveNumFiles = 0;
 
-	Common::File *g_HDFilePointer = nullptr;
-	int32 g_HDFilePosition = 0;
-	int32 g_HDArchiveNumFiles = 0;
+	Common::File *_hdFilePointer = nullptr;
+	int32 _hdFilePosition = 0;
+	int32 _hdArchiveNumFiles = 0;
 
-	HPF *g_CDArchive = nullptr;
-	HPF *g_HDArchive = nullptr;
-	int32 g_CDArchiveIndex = 0;
+	HPF *_cdArchive = nullptr;
+	HPF *_hdArchive = nullptr;
+	int32 _cdArchiveIndex = 0;
 };
 
 } // End of namespace LastExpress
diff --git a/engines/lastexpress/game/nis.cpp b/engines/lastexpress/game/nis.cpp
index cee8a57f96c..1ec73a63975 100644
--- a/engines/lastexpress/game/nis.cpp
+++ b/engines/lastexpress/game/nis.cpp
@@ -330,12 +330,12 @@ void NISManager::abortNIS() {
 		_flags |= kNisFlagAbortRequested;
 }
 
-void NISManager::NISMouse(Event *event) {
+void NISManager::nisMouse(Event *event) {
 	if ((event->flags & 0x10) != 0)
 		abortNIS();
 }
 
-void NISManager::NISTimer(Event *event) {
+void NISManager::nisTimer(Event *event) {
 	_engine->setEventTickInternal(false);
 }
 
diff --git a/engines/lastexpress/game/nis.h b/engines/lastexpress/game/nis.h
index 977246a9627..103bb7d6c7d 100644
--- a/engines/lastexpress/game/nis.h
+++ b/engines/lastexpress/game/nis.h
@@ -55,8 +55,8 @@ public:
 	bool initNIS(const char *filename, int32 flags);
 	void endNIS();
 	void abortNIS();
-	void NISMouse(Event *event);
-	void NISTimer(Event *event);
+	void nisMouse(Event *event);
+	void nisTimer(Event *event);
 	void drawSprite(NisSprite *sprite);
 	void waxSprite(NisSprite *sprite);
 	void waneSprite(NisSprite *sprite);
diff --git a/engines/lastexpress/graphics.cpp b/engines/lastexpress/graphics.cpp
index 51b1a75c70e..06ac73ea1c3 100644
--- a/engines/lastexpress/graphics.cpp
+++ b/engines/lastexpress/graphics.cpp
@@ -43,15 +43,24 @@ GraphicsManager::GraphicsManager(LastExpressEngine *engine) {
 
 GraphicsManager::~GraphicsManager() {}
 
-bool GraphicsManager::goLockSurface() {
-	return true;
-}
-
 bool GraphicsManager::acquireSurface() {
+	// This function is technically useless, but I'm keeping it
+	// as a marker for when the engine wants to acquire the gfx context
+	// for when it has to draw something.
+	//
+	// It has proven to be useful during debugging,
+	// maybe it'll be useful in the future as well...
+
 	return true;
 }
 
 void GraphicsManager::unlockSurface() {
+	// As before, this function is technically useless, but I'm keeping it
+	// as a marker for when the engine wants to release the gfx context
+	// for when it finishes drawing something.
+	//
+	// It has proven to be useful during debugging,
+	// maybe it'll be useful in the future as well...
 }
 
 void GraphicsManager::burstAll() {
diff --git a/engines/lastexpress/graphics.h b/engines/lastexpress/graphics.h
index ef97f468761..8ab3e39b822 100644
--- a/engines/lastexpress/graphics.h
+++ b/engines/lastexpress/graphics.h
@@ -76,7 +76,6 @@ public:
 	GraphicsManager(LastExpressEngine *engine);
 	~GraphicsManager();
 
-	bool goLockSurface();
 	bool acquireSurface();
 	void unlockSurface();
 	void burstAll();
diff --git a/engines/lastexpress/lastexpress.cpp b/engines/lastexpress/lastexpress.cpp
index 6e8c287abb9..8fb7889e0f1 100644
--- a/engines/lastexpress/lastexpress.cpp
+++ b/engines/lastexpress/lastexpress.cpp
@@ -57,10 +57,21 @@ LastExpressEngine::LastExpressEngine(OSystem *syst, const ADGameDescription *gd)
 }
 
 LastExpressEngine::~LastExpressEngine() {
-	// Delete the remaining objects
+	SAFE_DELETE(_graphicsMan);
+	SAFE_DELETE(_spriteMan);
+	SAFE_DELETE(_otisMan);
+	SAFE_DELETE(_subtitleMan);
+	SAFE_DELETE(_archiveMan);
+	SAFE_DELETE(_memMan);
+	SAFE_DELETE(_msgMan);
+	SAFE_DELETE(_nisMan);
+	SAFE_DELETE(_soundMan);
+	SAFE_DELETE(_logicMan);
 	SAFE_DELETE(_menu);
+	SAFE_DELETE(_saveMan);
 	SAFE_DELETE(_clock);
 	SAFE_DELETE(_vcr);
+
 	//_debugger is deleted by Engine
 
 	// Zero passed pointers
@@ -133,11 +144,12 @@ Common::Error LastExpressEngine::run() {
 	if (gDebugLevel >= 3)
 		DebugMan.enableDebugChannel(kDebugConsole);
 
+	// Graphics manager
 	_graphicsMan = new GraphicsManager(this);
 
+	// Animation system
 	_spriteMan = new SpriteManager(this);
 	_otisMan = new OtisManager(this);
-	_subtitleMan = new SubtitleManager(this);
 
 	// Archive manager
 	_archiveMan = new ArchiveManager(this);
@@ -151,8 +163,9 @@ Common::Error LastExpressEngine::run() {
 	// NIS manager
 	_nisMan = new NISManager(this);
 
-	// Sound manager
+	// Sound&subtitles manager
 	_soundMan = new SoundManager(this);
+	_subtitleMan = new SubtitleManager(this);
 
 	// Logic manager
 	_logicMan = new LogicManager(this);
@@ -200,13 +213,6 @@ Common::Error LastExpressEngine::run() {
 
 		waitForTimer(4); // Wait 4 ticks (tick duration: 17 ms dictated by the sound timer)
 		elapsedMs += 4 * 17;
-
-		// Simulate a WM_TIMER event every 250ms
-		if (elapsedMs >= 250) {
-			elapsedMs -= 250;
-			//if (_canDrawMouse)
-			//	getMessageManager()->addEvent(4, 0, 0, 4);
-		}	
 	}
 
 	getTimerManager()->removeTimerProc(soundTimerHandler);
@@ -558,11 +564,11 @@ void LastExpressEngine::nodeStepTimerWrapper(Event *event) {
 }
 
 void LastExpressEngine::nisMouseWrapper(Event *event) {
-	getNISManager()->NISMouse(event);
+	getNISManager()->nisMouse(event);
 }
 
 void LastExpressEngine::nisTimerWrapper(Event *event) {
-	getNISManager()->NISTimer(event);
+	getNISManager()->nisTimer(event);
 }
 
 void LastExpressEngine::creditsMouseWrapper(Event *event) {


Commit: 4b0f18e4eb2f712c0f57e14151b1a76b603a9cb9
    https://github.com/scummvm/scummvm/commit/4b0f18e4eb2f712c0f57e14151b1a76b603a9cb9
Author: AndywinXp (andywinxp at gmail.com)
Date: 2025-06-16T23:12:18+02:00

Commit Message:
LASTEXPRESS: Clean up tables (ha-ha.)

Changed paths:
    engines/lastexpress/characters/tablea.cpp
    engines/lastexpress/characters/tableb.cpp
    engines/lastexpress/characters/tablec.cpp
    engines/lastexpress/characters/tabled.cpp
    engines/lastexpress/characters/tablee.cpp
    engines/lastexpress/characters/tablef.cpp


diff --git a/engines/lastexpress/characters/tablea.cpp b/engines/lastexpress/characters/tablea.cpp
index e49ae5f8b47..0b61d0ec832 100644
--- a/engines/lastexpress/characters/tablea.cpp
+++ b/engines/lastexpress/characters/tablea.cpp
@@ -48,7 +48,7 @@ void LogicManager::CONS_TableA(int chapter) {
 		CONS_TableA_StartPart5(0, 0, 0, 0);
 		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -63,8 +63,13 @@ void LogicManager::CONS_TableA_Birth(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_TableA_Birth(HAND_PARAMS) {
-	if (msg->action == 12)
+	switch (msg->action) {
+	case 12:
 		CONS_TableA_Idling(0, 0, 0, 0);
+		break;
+	default:
+		break;
+	}
 }
 
 void LogicManager::CONS_TableA_StartPart2(CONS_PARAMS) {
@@ -78,8 +83,13 @@ void LogicManager::CONS_TableA_StartPart2(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_TableA_StartPart2(HAND_PARAMS) {
-	if (msg->action == 12)
+	switch (msg->action) {
+	case 12:
 		CONS_TableA_Idling(0, 0, 0, 0);
+		break;
+	default:
+		break;
+	}
 }
 
 void LogicManager::CONS_TableA_StartPart3(CONS_PARAMS) {
@@ -93,8 +103,13 @@ void LogicManager::CONS_TableA_StartPart3(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_TableA_StartPart3(HAND_PARAMS) {
-	if (msg->action == 12)
+	switch (msg->action) {
+	case 12:
 		CONS_TableA_Idling(0, 0, 0, 0);
+		break;
+	default:
+		break;
+	}
 }
 
 void LogicManager::CONS_TableA_StartPart4(CONS_PARAMS) {
@@ -108,8 +123,13 @@ void LogicManager::CONS_TableA_StartPart4(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_TableA_StartPart4(HAND_PARAMS) {
-	if (msg->action == 12)
+	switch (msg->action) {
+	case 12:
 		CONS_TableA_Idling(0, 0, 0, 0);
+		break;
+	default:
+		break;
+	}
 }
 
 void LogicManager::CONS_TableA_StartPart5(CONS_PARAMS) {
@@ -123,8 +143,13 @@ void LogicManager::CONS_TableA_StartPart5(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_TableA_StartPart5(HAND_PARAMS) {
-	if (msg->action == 12)
+	switch (msg->action) {
+	case 12:
 		CONS_TableA_Idling(0, 0, 0, 0);
+		break;
+	default:
+		break;
+	}
 }
 
 void LogicManager::CONS_TableA_Idling(CONS_PARAMS) {
diff --git a/engines/lastexpress/characters/tableb.cpp b/engines/lastexpress/characters/tableb.cpp
index 87c34e161d7..7730916e88f 100644
--- a/engines/lastexpress/characters/tableb.cpp
+++ b/engines/lastexpress/characters/tableb.cpp
@@ -48,7 +48,7 @@ void LogicManager::CONS_TableB(int chapter) {
 		CONS_TableB_StartPart5(0, 0, 0, 0);
 		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -63,8 +63,13 @@ void LogicManager::CONS_TableB_Birth(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_TableB_Birth(HAND_PARAMS) {
-	if (msg->action == 12)
+	switch (msg->action) {
+	case 12:
 		CONS_TableB_Idling(0, 0, 0, 0);
+		break;
+	default:
+		break;
+	}
 }
 
 void LogicManager::CONS_TableB_StartPart2(CONS_PARAMS) {
@@ -78,8 +83,13 @@ void LogicManager::CONS_TableB_StartPart2(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_TableB_StartPart2(HAND_PARAMS) {
-	if (msg->action == 12)
+	switch (msg->action) {
+	case 12:
 		CONS_TableB_Idling(0, 0, 0, 0);
+		break;
+	default:
+		break;
+	}
 }
 
 void LogicManager::CONS_TableB_StartPart3(CONS_PARAMS) {
@@ -93,8 +103,13 @@ void LogicManager::CONS_TableB_StartPart3(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_TableB_StartPart3(HAND_PARAMS) {
-	if (msg->action == 12)
+	switch (msg->action) {
+	case 12:
 		CONS_TableB_Idling(0, 0, 0, 0);
+		break;
+	default:
+		break;
+	}
 }
 
 void LogicManager::CONS_TableB_StartPart4(CONS_PARAMS) {
@@ -108,8 +123,13 @@ void LogicManager::CONS_TableB_StartPart4(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_TableB_StartPart4(HAND_PARAMS) {
-	if (msg->action == 12)
+	switch (msg->action) {
+	case 12:
 		CONS_TableB_Idling(0, 0, 0, 0);
+		break;
+	default:
+		break;
+	}
 }
 
 void LogicManager::CONS_TableB_StartPart5(CONS_PARAMS) {
@@ -123,8 +143,13 @@ void LogicManager::CONS_TableB_StartPart5(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_TableB_StartPart5(HAND_PARAMS) {
-	if (msg->action == 12)
+	switch (msg->action) {
+	case 12:
 		CONS_TableB_Idling(0, 0, 0, 0);
+		break;
+	default:
+		break;
+	}
 }
 
 void LogicManager::CONS_TableB_Idling(CONS_PARAMS) {
diff --git a/engines/lastexpress/characters/tablec.cpp b/engines/lastexpress/characters/tablec.cpp
index 79fc77810c7..5eccf09ac28 100644
--- a/engines/lastexpress/characters/tablec.cpp
+++ b/engines/lastexpress/characters/tablec.cpp
@@ -48,7 +48,7 @@ void LogicManager::CONS_TableC(int chapter) {
 		CONS_TableC_StartPart5(0, 0, 0, 0);
 		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -63,9 +63,13 @@ void LogicManager::CONS_TableC_Birth(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_TableC_Birth(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		_engine->getSoundManager()->playSoundFile("LOOP8A.SND", kSoundTypeWalla | kSoundFlagLooped | kVolume8, kCharacterTableC, 0);
 		CONS_TableC_Idling(0, 0, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -80,9 +84,13 @@ void LogicManager::CONS_TableC_StartPart2(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_TableC_StartPart2(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		_engine->getSoundManager()->playSoundFile("LOOP8A.SND", kSoundTypeWalla | kSoundFlagLooped | kVolume8, kCharacterTableC, 0);
 		CONS_TableC_Idling(0, 0, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -97,9 +105,13 @@ void LogicManager::CONS_TableC_StartPart3(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_TableC_StartPart3(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		_engine->getSoundManager()->playSoundFile("LOOP8A.SND", kSoundTypeWalla | kSoundFlagLooped | kVolume8, kCharacterTableC, 0);
 		CONS_TableC_Idling(0, 0, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -114,9 +126,13 @@ void LogicManager::CONS_TableC_StartPart4(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_TableC_StartPart4(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		_engine->getSoundManager()->playSoundFile("LOOP8A.SND", kSoundTypeWalla | kSoundFlagLooped | kVolume8, kCharacterTableC, 0);
 		CONS_TableC_Idling(0, 0, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -131,11 +147,15 @@ void LogicManager::CONS_TableC_StartPart5(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_TableC_StartPart5(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		if (whoRunningDialog(kCharacterTableC))
 			fadeDialog(kCharacterTableC);
 
 		CONS_TableC_Idling(0, 0, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
diff --git a/engines/lastexpress/characters/tabled.cpp b/engines/lastexpress/characters/tabled.cpp
index 7eb5418ac98..991bef0c976 100644
--- a/engines/lastexpress/characters/tabled.cpp
+++ b/engines/lastexpress/characters/tabled.cpp
@@ -48,7 +48,7 @@ void LogicManager::CONS_TableD(int chapter) {
 		CONS_TableD_StartPart5(0, 0, 0, 0);
 		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -63,8 +63,13 @@ void LogicManager::CONS_TableD_Birth(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_TableD_Birth(HAND_PARAMS) {
-	if (msg->action == 12)
+	switch (msg->action) {
+	case 12:
 		CONS_TableD_Idling(0, 0, 0, 0);
+		break;
+	default:
+		break;
+	}
 }
 
 void LogicManager::CONS_TableD_StartPart2(CONS_PARAMS) {
@@ -78,8 +83,13 @@ void LogicManager::CONS_TableD_StartPart2(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_TableD_StartPart2(HAND_PARAMS) {
-	if (msg->action == 12)
+	switch (msg->action) {
+	case 12:
 		CONS_TableD_Idling(0, 0, 0, 0);
+		break;
+	default:
+		break;
+	}
 }
 
 void LogicManager::CONS_TableD_StartPart3(CONS_PARAMS) {
@@ -93,8 +103,13 @@ void LogicManager::CONS_TableD_StartPart3(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_TableD_StartPart3(HAND_PARAMS) {
-	if (msg->action == 12)
+	switch (msg->action) {
+	case 12:
 		CONS_TableD_Idling(0, 0, 0, 0);
+		break;
+	default:
+		break;
+	}
 }
 
 void LogicManager::CONS_TableD_StartPart4(CONS_PARAMS) {
@@ -108,8 +123,13 @@ void LogicManager::CONS_TableD_StartPart4(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_TableD_StartPart4(HAND_PARAMS) {
-	if (msg->action == 12)
+	switch (msg->action) {
+	case 12:
 		CONS_TableD_Idling(0, 0, 0, 0);
+		break;
+	default:
+		break;
+	}
 }
 
 void LogicManager::CONS_TableD_StartPart5(CONS_PARAMS) {
@@ -123,8 +143,13 @@ void LogicManager::CONS_TableD_StartPart5(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_TableD_StartPart5(HAND_PARAMS) {
-	if (msg->action == 12)
+	switch (msg->action) {
+	case 12:
 		CONS_TableD_Idling(0, 0, 0, 0);
+		break;
+	default:
+		break;
+	}
 }
 
 void LogicManager::CONS_TableD_Idling(CONS_PARAMS) {
diff --git a/engines/lastexpress/characters/tablee.cpp b/engines/lastexpress/characters/tablee.cpp
index 1449841e035..fa7247f64d0 100644
--- a/engines/lastexpress/characters/tablee.cpp
+++ b/engines/lastexpress/characters/tablee.cpp
@@ -48,7 +48,7 @@ void LogicManager::CONS_TableE(int chapter) {
 		CONS_TableE_StartPart5(0, 0, 0, 0);
 		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -63,8 +63,13 @@ void LogicManager::CONS_TableE_Birth(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_TableE_Birth(HAND_PARAMS) {
-	if (msg->action == 12)
+	switch (msg->action) {
+	case 12:
 		CONS_TableE_Idling(0, 0, 0, 0);
+		break;
+	default:
+		break;
+	}
 }
 
 void LogicManager::CONS_TableE_StartPart2(CONS_PARAMS) {
@@ -78,8 +83,13 @@ void LogicManager::CONS_TableE_StartPart2(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_TableE_StartPart2(HAND_PARAMS) {
-	if (msg->action == 12)
+	switch (msg->action) {
+	case 12:
 		CONS_TableE_Idling(0, 0, 0, 0);
+		break;
+	default:
+		break;
+	}
 }
 
 void LogicManager::CONS_TableE_StartPart3(CONS_PARAMS) {
@@ -93,8 +103,13 @@ void LogicManager::CONS_TableE_StartPart3(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_TableE_StartPart3(HAND_PARAMS) {
-	if (msg->action == 12)
+	switch (msg->action) {
+	case 12:
 		CONS_TableE_Idling(0, 0, 0, 0);
+		break;
+	default:
+		break;
+	}
 }
 
 void LogicManager::CONS_TableE_StartPart4(CONS_PARAMS) {
@@ -108,8 +123,13 @@ void LogicManager::CONS_TableE_StartPart4(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_TableE_StartPart4(HAND_PARAMS) {
-	if (msg->action == 12)
+	switch (msg->action) {
+	case 12:
 		CONS_TableE_Idling(0, 0, 0, 0);
+		break;
+	default:
+		break;
+	}
 }
 
 void LogicManager::CONS_TableE_StartPart5(CONS_PARAMS) {
@@ -123,8 +143,13 @@ void LogicManager::CONS_TableE_StartPart5(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_TableE_StartPart5(HAND_PARAMS) {
-	if (msg->action == 12)
+	switch (msg->action) {
+	case 12:
 		CONS_TableE_Idling(0, 0, 0, 0);
+		break;
+	default:
+		break;
+	}
 }
 
 void LogicManager::CONS_TableE_Idling(CONS_PARAMS) {
diff --git a/engines/lastexpress/characters/tablef.cpp b/engines/lastexpress/characters/tablef.cpp
index 8f6ffddca4b..e592fb7f409 100644
--- a/engines/lastexpress/characters/tablef.cpp
+++ b/engines/lastexpress/characters/tablef.cpp
@@ -28,7 +28,8 @@ void LogicManager::CONS_TableF(int chapter) {
 	case 0:
 		_engine->getMessageManager()->setMessageHandle(
 			kCharacterTableF,
-			_functionsTableF[getCharacter(kCharacterTableF).callbacks[getCharacter(kCharacterTableF).currentCall]]);
+			_functionsTableF[getCharacter(kCharacterTableF).callbacks[getCharacter(kCharacterTableF).currentCall]]
+		);
 
 		break;
 	case 1:
@@ -47,7 +48,7 @@ void LogicManager::CONS_TableF(int chapter) {
 		CONS_TableF_StartPart5(0, 0, 0, 0);
 		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -62,8 +63,13 @@ void LogicManager::CONS_TableF_Birth(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_TableF_Birth(HAND_PARAMS) {
-	if (msg->action == 12)
+	switch (msg->action) {
+	case 12:
 		CONS_TableF_Idling(0, 0, 0, 0);
+		break;
+	default:
+		break;
+	}
 }
 
 void LogicManager::CONS_TableF_StartPart2(CONS_PARAMS) {
@@ -77,8 +83,13 @@ void LogicManager::CONS_TableF_StartPart2(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_TableF_StartPart2(HAND_PARAMS) {
-	if (msg->action == 12)
+	switch (msg->action) {
+	case 12:
 		CONS_TableF_Idling(0, 0, 0, 0);
+		break;
+	default:
+		break;
+	}
 }
 
 void LogicManager::CONS_TableF_StartPart3(CONS_PARAMS) {
@@ -92,8 +103,13 @@ void LogicManager::CONS_TableF_StartPart3(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_TableF_StartPart3(HAND_PARAMS) {
-	if (msg->action == 12)
+	switch (msg->action) {
+	case 12:
 		CONS_TableF_Idling(0, 0, 0, 0);
+		break;
+	default:
+		break;
+	}
 }
 
 void LogicManager::CONS_TableF_StartPart4(CONS_PARAMS) {
@@ -107,8 +123,13 @@ void LogicManager::CONS_TableF_StartPart4(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_TableF_StartPart4(HAND_PARAMS) {
-	if (msg->action == 12)
+	switch (msg->action) {
+	case 12:
 		CONS_TableF_Idling(0, 0, 0, 0);
+		break;
+	default:
+		break;
+	}
 }
 
 void LogicManager::CONS_TableF_StartPart5(CONS_PARAMS) {
@@ -122,8 +143,13 @@ void LogicManager::CONS_TableF_StartPart5(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_TableF_StartPart5(HAND_PARAMS) {
-	if (msg->action == 12)
+	switch (msg->action) {
+	case 12:
 		CONS_TableF_Idling(0, 0, 0, 0);
+		break;
+	default:
+		break;
+	}
 }
 
 void LogicManager::CONS_TableF_Idling(CONS_PARAMS) {


Commit: 11fe839e47a0c814ee298febb4770f5fef18631b
    https://github.com/scummvm/scummvm/commit/11fe839e47a0c814ee298febb4770f5fef18631b
Author: AndywinXp (andywinxp at gmail.com)
Date: 2025-06-16T23:12:18+02:00

Commit Message:
LASTEXPRESS: Clean up Yasmin logic

Changed paths:
    engines/lastexpress/characters/yasmin.cpp


diff --git a/engines/lastexpress/characters/yasmin.cpp b/engines/lastexpress/characters/yasmin.cpp
index 92ac448d302..989737e6df5 100644
--- a/engines/lastexpress/characters/yasmin.cpp
+++ b/engines/lastexpress/characters/yasmin.cpp
@@ -28,8 +28,7 @@ void LogicManager::CONS_Yasmin(int chapter) {
 	case 0:
 		_engine->getMessageManager()->setMessageHandle(
 			kCharacterYasmin,
-			_functionsYasmin[getCharacter(kCharacterYasmin).callbacks[getCharacter(kCharacterYasmin).currentCall]]
-		);
+			_functionsYasmin[getCharacter(kCharacterYasmin).callbacks[getCharacter(kCharacterYasmin).currentCall]]);
 
 		break;
 	case 1:
@@ -48,7 +47,7 @@ void LogicManager::CONS_Yasmin(int chapter) {
 		CONS_Yasmin_StartPart5(0, 0, 0, 0);
 		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -77,6 +76,7 @@ void LogicManager::HAND_Yasmin_DebugWalks(HAND_PARAMS) {
 			else
 				getCharacterCurrentParams(kCharacterYasmin)[0] = 10000;
 		}
+
 		break;
 	case 5:
 		playCathExcuseMe();
@@ -110,14 +110,19 @@ void LogicManager::CONS_Yasmin_DoCorrOtis(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Yasmin_DoCorrOtis(HAND_PARAMS) {
-	if (msg->action == 3) {
+	switch (msg->action) {
+	case 3:
 		releaseAtDoor(kCharacterYasmin, getCharacterCurrentParams(kCharacterYasmin)[3]);
 		getCharacter(kCharacterYasmin).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterYasmin, _functionsYasmin[getCharacter(kCharacterYasmin).callbacks[getCharacter(kCharacterYasmin).currentCall]]);
 		fedEx(kCharacterYasmin, kCharacterYasmin, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		startSeqOtis(kCharacterYasmin, (char *)&getCharacterCurrentParams(kCharacterYasmin)[0]);
 		blockAtDoor(kCharacterYasmin, getCharacterCurrentParams(kCharacterYasmin)[3]);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -134,12 +139,17 @@ void LogicManager::CONS_Yasmin_DoDialog(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Yasmin_DoDialog(HAND_PARAMS) {
-	if (msg->action == 2) {
+	switch (msg->action) {
+	case 2:
 		getCharacter(kCharacterYasmin).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterYasmin, _functionsYasmin[getCharacter(kCharacterYasmin).callbacks[getCharacter(kCharacterYasmin).currentCall]]);
 		fedEx(kCharacterYasmin, kCharacterYasmin, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		playDialog(kCharacterYasmin, (char *)&getCharacterCurrentParams(kCharacterYasmin)[0], -1, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -156,7 +166,8 @@ void LogicManager::CONS_Yasmin_DoWait(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Yasmin_DoWait(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		if (getCharacterCurrentParams(kCharacterYasmin)[1] || (getCharacterCurrentParams(kCharacterYasmin)[1] = _gameTime + getCharacterCurrentParams(kCharacterYasmin)[0], _gameTime + getCharacterCurrentParams(kCharacterYasmin)[0] != 0)) {
 			if (getCharacterCurrentParams(kCharacterYasmin)[1] >= _gameTime)
 				return;
@@ -167,6 +178,9 @@ void LogicManager::HAND_Yasmin_DoWait(HAND_PARAMS) {
 		getCharacter(kCharacterYasmin).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterYasmin, _functionsYasmin[getCharacter(kCharacterYasmin).callbacks[getCharacter(kCharacterYasmin).currentCall]]);
 		fedEx(kCharacterYasmin, kCharacterYasmin, 18, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -223,12 +237,14 @@ void LogicManager::CONS_Yasmin_GoEtoG(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Yasmin_GoEtoG(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterYasmin).characterPosition.position = 4840;
 		getCharacter(kCharacterYasmin).characterPosition.location = 0;
 		getCharacter(kCharacterYasmin).callbacks[getCharacter(kCharacterYasmin).currentCall + 8] = 1;
 		YasminCall(&LogicManager::CONS_Yasmin_DoCorrOtis, "615Be", 5, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterYasmin).callbacks[getCharacter(kCharacterYasmin).currentCall + 8]) {
 		case 1:
 			getCharacter(kCharacterYasmin).callbacks[getCharacter(kCharacterYasmin).currentCall + 8] = 2;
@@ -248,6 +264,10 @@ void LogicManager::HAND_Yasmin_GoEtoG(HAND_PARAMS) {
 		default:
 			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -262,12 +282,14 @@ void LogicManager::CONS_Yasmin_GoGtoE(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Yasmin_GoGtoE(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterYasmin).characterPosition.position = 3050;
 		getCharacter(kCharacterYasmin).characterPosition.location = 0;
 		getCharacter(kCharacterYasmin).callbacks[getCharacter(kCharacterYasmin).currentCall + 8] = 1;
 		YasminCall(&LogicManager::CONS_Yasmin_DoCorrOtis, "615Bg", 7, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterYasmin).callbacks[getCharacter(kCharacterYasmin).currentCall + 8]) {
 		case 1:
 			getCharacter(kCharacterYasmin).callbacks[getCharacter(kCharacterYasmin).currentCall + 8] = 2;
@@ -287,6 +309,10 @@ void LogicManager::HAND_Yasmin_GoGtoE(HAND_PARAMS) {
 		default:
 			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -301,15 +327,21 @@ void LogicManager::CONS_Yasmin_Birth(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Yasmin_Birth(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		if (_gameTime > 1062000 && !getCharacterCurrentParams(kCharacterYasmin)[0]) {
 			getCharacterCurrentParams(kCharacterYasmin)[0] = 1;
 			CONS_Yasmin_Part1(0, 0, 0, 0);
 		}
-	} else if (msg->action == 12) {
+
+		break;
+	case 12:
 		getCharacter(kCharacterYasmin).characterPosition.position = 4840;
 		getCharacter(kCharacterYasmin).characterPosition.location = 1;
 		getCharacter(kCharacterYasmin).characterPosition.car = kCarGreenSleeping;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -324,71 +356,114 @@ void LogicManager::CONS_Yasmin_Part1(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Yasmin_Part1(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 18) {
-			switch (getCharacter(kCharacterYasmin).callbacks[getCharacter(kCharacterYasmin).currentCall + 8]) {
-			case 1:
-				getCharacter(kCharacterYasmin).characterPosition.position = 2740;
-				getCharacter(kCharacterYasmin).callbacks[getCharacter(kCharacterYasmin).currentCall + 8] = 2;
-				YasminCall(&LogicManager::CONS_Yasmin_DoDialog, "Har1102", 0, 0, 0);
+	switch (msg->action) {
+	case 0:
+		if (_gameTime > 1093500 && !getCharacterCurrentParams(kCharacterYasmin)[0]) {
+			getCharacterCurrentParams(kCharacterYasmin)[0] = 1;
+			getCharacter(kCharacterYasmin).callbacks[getCharacter(kCharacterYasmin).currentCall + 8] = 1;
+			YasminCall(&LogicManager::CONS_Yasmin_GoEtoG, 0, 0, 0, 0);
+			break;
+		}
+
+		if (_gameTime > 1161000 && !getCharacterCurrentParams(kCharacterYasmin)[1]) {
+			getCharacterCurrentParams(kCharacterYasmin)[1] = 1;
+			getCharacter(kCharacterYasmin).callbacks[getCharacter(kCharacterYasmin).currentCall + 8] = 3;
+			YasminCall(&LogicManager::CONS_Yasmin_GoGtoE, 0, 0, 0, 0);
+			break;
+		}
+
+		if (_gameTime > 1162800 && !getCharacterCurrentParams(kCharacterYasmin)[2]) {
+			getCharacterCurrentParams(kCharacterYasmin)[2] = 1;
+			getCharacter(kCharacterYasmin).characterPosition.position = 4070;
+			getCharacter(kCharacterYasmin).callbacks[getCharacter(kCharacterYasmin).currentCall + 8] = 4;
+			YasminCall(&LogicManager::CONS_Yasmin_DoDialog, "Har1102", 0, 0, 0);
+			break;
+		}
+
+		if (_gameTime > 1165500 && !getCharacterCurrentParams(kCharacterYasmin)[3]) {
+			getCharacterCurrentParams(kCharacterYasmin)[3] = 1;
+			getCharacter(kCharacterYasmin).callbacks[getCharacter(kCharacterYasmin).currentCall + 8] = 5;
+			YasminCall(&LogicManager::CONS_Yasmin_DoDialog, "Har1104", 0, 0, 0);
+			break;
+		}
+
+		if (_gameTime > 1174500 && !getCharacterCurrentParams(kCharacterYasmin)[4]) {
+			getCharacterCurrentParams(kCharacterYasmin)[4] = 1;
+			getCharacter(kCharacterYasmin).callbacks[getCharacter(kCharacterYasmin).currentCall + 8] = 6;
+			YasminCall(&LogicManager::CONS_Yasmin_DoDialog, "Har1106", 0, 0, 0);
+			break;
+		}
+
+		if (_gameTime > 1183500 && !getCharacterCurrentParams(kCharacterYasmin)[5]) {
+			getCharacterCurrentParams(kCharacterYasmin)[5] = 1;
+			getCharacter(kCharacterYasmin).callbacks[getCharacter(kCharacterYasmin).currentCall + 8] = 7;
+			YasminCall(&LogicManager::CONS_Yasmin_GoEtoG, 0, 0, 0, 0);
+		}
+
+		break;
+	case 18:
+		switch (getCharacter(kCharacterYasmin).callbacks[getCharacter(kCharacterYasmin).currentCall + 8]) {
+		case 1:
+			getCharacter(kCharacterYasmin).characterPosition.position = 2740;
+			getCharacter(kCharacterYasmin).callbacks[getCharacter(kCharacterYasmin).currentCall + 8] = 2;
+			YasminCall(&LogicManager::CONS_Yasmin_DoDialog, "Har1102", 0, 0, 0);
+			break;
+		case 2:
+			if (_gameTime > 1161000 && !getCharacterCurrentParams(kCharacterYasmin)[1]) {
+				getCharacterCurrentParams(kCharacterYasmin)[1] = 1;
+				getCharacter(kCharacterYasmin).callbacks[getCharacter(kCharacterYasmin).currentCall + 8] = 3;
+				YasminCall(&LogicManager::CONS_Yasmin_GoGtoE, 0, 0, 0, 0);
 				break;
-			case 2:
-				goto LABEL_9;
-			case 3:
-				goto LABEL_12;
-			case 4:
-				goto LABEL_15;
-			case 5:
-				goto LABEL_18;
-			case 6:
-				goto LABEL_21;
-			default:
-				return;
 			}
-		}
-	} else if (_gameTime <= 1093500 || getCharacterCurrentParams(kCharacterYasmin)[0]) {
-	LABEL_9:
-		if (_gameTime <= 1161000 || getCharacterCurrentParams(kCharacterYasmin)[1]) {
-		LABEL_12:
-			if (_gameTime <= 1162800 || getCharacterCurrentParams(kCharacterYasmin)[2]) {
-			LABEL_15:
-				if (_gameTime <= 1165500 || getCharacterCurrentParams(kCharacterYasmin)[3]) {
-				LABEL_18:
-					if (_gameTime <= 1174500 || getCharacterCurrentParams(kCharacterYasmin)[4]) {
-					LABEL_21:
-						if (_gameTime > 1183500 && !getCharacterCurrentParams(kCharacterYasmin)[5]) {
-							getCharacterCurrentParams(kCharacterYasmin)[5] = 1;
-							getCharacter(kCharacterYasmin).callbacks[getCharacter(kCharacterYasmin).currentCall + 8] = 7;
-							YasminCall(&LogicManager::CONS_Yasmin_GoEtoG, 0, 0, 0, 0);
-						}
-					} else {
-						getCharacterCurrentParams(kCharacterYasmin)[4] = 1;
-						getCharacter(kCharacterYasmin).callbacks[getCharacter(kCharacterYasmin).currentCall + 8] = 6;
-						YasminCall(&LogicManager::CONS_Yasmin_DoDialog, "Har1106", 0, 0, 0);
-					}
-				} else {
-					getCharacterCurrentParams(kCharacterYasmin)[3] = 1;
-					getCharacter(kCharacterYasmin).callbacks[getCharacter(kCharacterYasmin).currentCall + 8] = 5;
-					YasminCall(&LogicManager::CONS_Yasmin_DoDialog, "Har1104", 0, 0, 0);
-				}
-			} else {
+
+			// fall through
+		case 3:
+			if (_gameTime > 1162800 && !getCharacterCurrentParams(kCharacterYasmin)[2]) {
 				getCharacterCurrentParams(kCharacterYasmin)[2] = 1;
 				getCharacter(kCharacterYasmin).characterPosition.position = 4070;
 				getCharacter(kCharacterYasmin).callbacks[getCharacter(kCharacterYasmin).currentCall + 8] = 4;
 				YasminCall(&LogicManager::CONS_Yasmin_DoDialog, "Har1102", 0, 0, 0);
+				break;
 			}
-		} else {
-			getCharacterCurrentParams(kCharacterYasmin)[1] = 1;
-			getCharacter(kCharacterYasmin).callbacks[getCharacter(kCharacterYasmin).currentCall + 8] = 3;
-			YasminCall(&LogicManager::CONS_Yasmin_GoGtoE, 0, 0, 0, 0);
+
+			// fall through
+		case 4:
+			if (_gameTime > 1165500 && !getCharacterCurrentParams(kCharacterYasmin)[3]) {
+				getCharacterCurrentParams(kCharacterYasmin)[3] = 1;
+				getCharacter(kCharacterYasmin).callbacks[getCharacter(kCharacterYasmin).currentCall + 8] = 5;
+				YasminCall(&LogicManager::CONS_Yasmin_DoDialog, "Har1104", 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 5:
+			if (_gameTime > 1174500 && !getCharacterCurrentParams(kCharacterYasmin)[4]) {
+				getCharacterCurrentParams(kCharacterYasmin)[4] = 1;
+				getCharacter(kCharacterYasmin).callbacks[getCharacter(kCharacterYasmin).currentCall + 8] = 6;
+				YasminCall(&LogicManager::CONS_Yasmin_DoDialog, "Har1106", 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 6:
+			if (_gameTime > 1183500 && !getCharacterCurrentParams(kCharacterYasmin)[5]) {
+				getCharacterCurrentParams(kCharacterYasmin)[5] = 1;
+				getCharacter(kCharacterYasmin).callbacks[getCharacter(kCharacterYasmin).currentCall + 8] = 7;
+				YasminCall(&LogicManager::CONS_Yasmin_GoEtoG, 0, 0, 0, 0);
+			}
+
+			break;
+		default:
+			break;
 		}
-	} else {
-		getCharacterCurrentParams(kCharacterYasmin)[0] = 1;
-		getCharacter(kCharacterYasmin).callbacks[getCharacter(kCharacterYasmin).currentCall + 8] = 1;
-		YasminCall(&LogicManager::CONS_Yasmin_GoEtoG, 0, 0, 0, 0);
+
+		break;
+	default:
+		break;
 	}
 }
 
+
 void LogicManager::CONS_Yasmin_Asleep(CONS_PARAMS) {
 	CharacterCallParams *params = &getCharacter(kCharacterYasmin).callParams[getCharacter(kCharacterYasmin).currentCall];
 	_engine->getMessageManager()->setMessageHandle(kCharacterYasmin, &LogicManager::HAND_Yasmin_Asleep);
@@ -400,12 +475,16 @@ void LogicManager::CONS_Yasmin_Asleep(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Yasmin_Asleep(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		setDoor(7, kCharacterCath, 3, 10, 9);
 		getCharacter(kCharacterYasmin).characterPosition.position = 3050;
 		getCharacter(kCharacterYasmin).characterPosition.location = 1;
 		getCharacter(kCharacterYasmin).characterPosition.car = kCarGreenSleeping;
 		endGraphics(kCharacterYasmin);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -420,7 +499,8 @@ void LogicManager::CONS_Yasmin_StartPart2(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Yasmin_StartPart2(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		endGraphics(kCharacterYasmin);
 		getCharacter(kCharacterYasmin).characterPosition.position = 3050;
 		getCharacter(kCharacterYasmin).characterPosition.location = 1;
@@ -428,6 +508,9 @@ void LogicManager::HAND_Yasmin_StartPart2(HAND_PARAMS) {
 		getCharacter(kCharacterYasmin).inventoryItem = kItemNone;
 		getCharacter(kCharacterYasmin).clothes = 0;
 		CONS_Yasmin_Part2(0, 0, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -442,7 +525,8 @@ void LogicManager::CONS_Yasmin_Part2(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Yasmin_Part2(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		if (_gameTime > 1759500 && !getCharacterCurrentParams(kCharacterYasmin)[0]) {
 			getCharacterCurrentParams(kCharacterYasmin)[0] = 1;
 			getCharacter(kCharacterYasmin).callbacks[getCharacter(kCharacterYasmin).currentCall + 8] = 1;
@@ -452,7 +536,9 @@ void LogicManager::HAND_Yasmin_Part2(HAND_PARAMS) {
 			getCharacter(kCharacterYasmin).characterPosition.position = 4070;
 			send(kCharacterYasmin, kCharacterClerk, 191070912, 4070);
 		}
-	} else if (msg->action == 18) {
+
+		break;
+	case 18:
 		if (getCharacter(kCharacterYasmin).callbacks[getCharacter(kCharacterYasmin).currentCall + 8] == 1) {
 			if (_gameTime > 1800000 && !getCharacterCurrentParams(kCharacterYasmin)[1]) {
 				getCharacterCurrentParams(kCharacterYasmin)[1] = 1;
@@ -460,6 +546,10 @@ void LogicManager::HAND_Yasmin_Part2(HAND_PARAMS) {
 				send(kCharacterYasmin, kCharacterClerk, 191070912, 4070);
 			}
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -474,13 +564,18 @@ void LogicManager::CONS_Yasmin_StartPart3(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Yasmin_StartPart3(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		CONS_Yasmin_Part3(0, 0, 0, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		endGraphics(kCharacterYasmin);
 		getCharacter(kCharacterYasmin).characterPosition.position = 3050;
 		getCharacter(kCharacterYasmin).characterPosition.location = 1;
 		getCharacter(kCharacterYasmin).characterPosition.car = kCarGreenSleeping;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -495,7 +590,8 @@ void LogicManager::CONS_Yasmin_Part3(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Yasmin_Part3(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		if (_gameTime > 2062800 && !getCharacterCurrentParams(kCharacterYasmin)[0]) {
 			getCharacterCurrentParams(kCharacterYasmin)[0] = 1;
 			getCharacter(kCharacterYasmin).callbacks[getCharacter(kCharacterYasmin).currentCall + 8] = 1;
@@ -509,7 +605,9 @@ void LogicManager::HAND_Yasmin_Part3(HAND_PARAMS) {
 			getCharacter(kCharacterYasmin).callbacks[getCharacter(kCharacterYasmin).currentCall + 8] = 3;
 			YasminCall(&LogicManager::CONS_Yasmin_GoEtoG, 0, 0, 0, 0);
 		}
-	} else if (msg->action == 18) {
+
+		break;
+	case 18:
 		if (getCharacter(kCharacterYasmin).callbacks[getCharacter(kCharacterYasmin).currentCall + 8] != 1) {
 			if (getCharacter(kCharacterYasmin).callbacks[getCharacter(kCharacterYasmin).currentCall + 8] == 2) {
 				if (_gameTime > 2160000 && !getCharacterCurrentParams(kCharacterYasmin)[2]) {
@@ -519,6 +617,10 @@ void LogicManager::HAND_Yasmin_Part3(HAND_PARAMS) {
 				}
 			}
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -533,12 +635,17 @@ void LogicManager::CONS_Yasmin_StartPart4(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Yasmin_StartPart4(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		CONS_Yasmin_Part4(0, 0, 0, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		getCharacter(kCharacterYasmin).characterPosition.position = 3050;
 		getCharacter(kCharacterYasmin).characterPosition.location = 1;
 		getCharacter(kCharacterYasmin).characterPosition.car = kCarGreenSleeping;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -553,7 +660,8 @@ void LogicManager::CONS_Yasmin_Part4(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Yasmin_Part4(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		if (_gameTime > 2457000 && !getCharacterCurrentParams(kCharacterYasmin)[0]) {
 			getCharacterCurrentParams(kCharacterYasmin)[0] = 1;
 			getCharacter(kCharacterYasmin).callbacks[getCharacter(kCharacterYasmin).currentCall + 8] = 1;
@@ -563,7 +671,9 @@ void LogicManager::HAND_Yasmin_Part4(HAND_PARAMS) {
 			getCharacter(kCharacterYasmin).callbacks[getCharacter(kCharacterYasmin).currentCall + 8] = 3;
 			YasminCall(&LogicManager::CONS_Yasmin_GoEtoG, 0, 0, 0, 0);
 		}
-	} else if (msg->action == 18) {
+
+		break;
+	case 18:
 		if (getCharacter(kCharacterYasmin).callbacks[getCharacter(kCharacterYasmin).currentCall + 8] == 1) {
 			getCharacter(kCharacterYasmin).characterPosition.position = 4070;
 			getCharacter(kCharacterYasmin).callbacks[getCharacter(kCharacterYasmin).currentCall + 8] = 2;
@@ -576,6 +686,10 @@ void LogicManager::HAND_Yasmin_Part4(HAND_PARAMS) {
 				YasminCall(&LogicManager::CONS_Yasmin_GoEtoG, 0, 0, 0, 0);
 			}
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -590,12 +704,16 @@ void LogicManager::CONS_Yasmin_Asleep4(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Yasmin_Asleep4(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		setDoor(7, kCharacterCath, 3, 10, 9);
 		getCharacter(kCharacterYasmin).characterPosition.position = 3050;
 		getCharacter(kCharacterYasmin).characterPosition.location = 1;
 		getCharacter(kCharacterYasmin).characterPosition.car = kCarGreenSleeping;
 		endGraphics(kCharacterYasmin);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -610,15 +728,20 @@ void LogicManager::CONS_Yasmin_StartPart5(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Yasmin_StartPart5(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		CONS_Yasmin_Prisoner(0, 0, 0, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		endGraphics(kCharacterYasmin);
 		getCharacter(kCharacterYasmin).characterPosition.car = kCarRestaurant;
 		getCharacter(kCharacterYasmin).characterPosition.position = 3969;
 		getCharacter(kCharacterYasmin).characterPosition.location = 1;
 		getCharacter(kCharacterYasmin).clothes = 0;
 		getCharacter(kCharacterYasmin).inventoryItem = kItemNone;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -633,8 +756,13 @@ void LogicManager::CONS_Yasmin_Prisoner(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Yasmin_Prisoner(HAND_PARAMS) {
-	if (msg->action == 70549068)
+	switch (msg->action) {
+	case 70549068:
 		CONS_Yasmin_Free(0, 0, 0, 0);
+		break;
+	default:
+		break;
+	}
 }
 
 void LogicManager::CONS_Yasmin_Free(CONS_PARAMS) {
@@ -648,7 +776,8 @@ void LogicManager::CONS_Yasmin_Free(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Yasmin_Free(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		if (getCharacterCurrentParams(kCharacterYasmin)[0] || (getCharacterCurrentParams(kCharacterYasmin)[0] = _gameTime + 2700, _gameTime != -2700)) {
 			if (getCharacterCurrentParams(kCharacterYasmin)[0] >= _gameTime)
 				return;
@@ -657,14 +786,20 @@ void LogicManager::HAND_Yasmin_Free(HAND_PARAMS) {
 		}
 
 		CONS_Yasmin_Hiding(0, 0, 0, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		getCharacter(kCharacterYasmin).characterPosition.car = kCarGreenSleeping;
 		getCharacter(kCharacterYasmin).characterPosition.position = 2500;
 		getCharacter(kCharacterYasmin).characterPosition.location = 0;
-	} else if (msg->action == 17) {
+		break;
+	case 17:
 		if (checkLoc(kCharacterCath, kCarGreenSleeping)) {
 			CONS_Yasmin_Hiding(0, 0, 0, 0);
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -679,34 +814,42 @@ void LogicManager::CONS_Yasmin_Hiding(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Yasmin_Hiding(HAND_PARAMS) {
-	if (msg->action > 12) {
-		if (msg->action == 18) {
-			if (getCharacter(kCharacterYasmin).callbacks[getCharacter(kCharacterYasmin).currentCall + 8] == 1) {
-				getCharacter(kCharacterYasmin).callbacks[getCharacter(kCharacterYasmin).currentCall + 8] = 2;
-				YasminCall(&LogicManager::CONS_Yasmin_DoCorrOtis, "615BE", 5, 0, 0);
-			} else if (getCharacter(kCharacterYasmin).callbacks[getCharacter(kCharacterYasmin).currentCall + 8] == 2) {
-				endGraphics(kCharacterYasmin);
-				getCharacter(kCharacterYasmin).characterPosition.location = 1;
-				getCharacter(kCharacterYasmin).characterPosition.position = 3050;
-				setDoor(7, kCharacterCath, 1, 10, 9);
-				playDialog(kCharacterYasmin, "Har5001", -1, 0);
+	switch (msg->action) {
+	case 0:
+		if (!whoRunningDialog(kCharacterYasmin)) {
+			if (getCharacterCurrentParams(kCharacterYasmin)[0] || (getCharacterCurrentParams(kCharacterYasmin)[0] = _currentGameSessionTicks + 450, _currentGameSessionTicks != -450)) {
+				if (getCharacterCurrentParams(kCharacterYasmin)[0] >= _currentGameSessionTicks)
+					return;
+
+				getCharacterCurrentParams(kCharacterYasmin)[0] = 0x7FFFFFFF;
 			}
-		} else if (msg->action == 135800432) {
-			CONS_Yasmin_Disappear(0, 0, 0, 0);
+
+			playDialog(kCharacterYasmin, "Har5001", -1, 0);
+			getCharacterCurrentParams(kCharacterYasmin)[0] = 0;
 		}
-	} else if (msg->action == 12) {
+
+		break;
+	case 12:
 		getCharacter(kCharacterYasmin).callbacks[getCharacter(kCharacterYasmin).currentCall + 8] = 1;
 		YasminCall(&LogicManager::CONS_Yasmin_DoWalk, 3, 4840, 0, 0);
-	} else if (msg->action == 0 && !whoRunningDialog(kCharacterYasmin)) {
-		if (getCharacterCurrentParams(kCharacterYasmin)[0] || (getCharacterCurrentParams(kCharacterYasmin)[0] = _currentGameSessionTicks + 450, _currentGameSessionTicks != -450)) {
-			if (getCharacterCurrentParams(kCharacterYasmin)[0] >= _currentGameSessionTicks)
-				return;
-
-			getCharacterCurrentParams(kCharacterYasmin)[0] = 0x7FFFFFFF;
+		break;
+	case 18:
+		if (getCharacter(kCharacterYasmin).callbacks[getCharacter(kCharacterYasmin).currentCall + 8] == 1) {
+			getCharacter(kCharacterYasmin).callbacks[getCharacter(kCharacterYasmin).currentCall + 8] = 2;
+			YasminCall(&LogicManager::CONS_Yasmin_DoCorrOtis, "615BE", 5, 0, 0);
+		} else if (getCharacter(kCharacterYasmin).callbacks[getCharacter(kCharacterYasmin).currentCall + 8] == 2) {
+			endGraphics(kCharacterYasmin);
+			getCharacter(kCharacterYasmin).characterPosition.location = 1;
+			getCharacter(kCharacterYasmin).characterPosition.position = 3050;
+			setDoor(7, kCharacterCath, 1, 10, 9);
+			playDialog(kCharacterYasmin, "Har5001", -1, 0);
 		}
-
-		playDialog(kCharacterYasmin, "Har5001", -1, 0);
-		getCharacterCurrentParams(kCharacterYasmin)[0] = 0;
+		break;
+	case 135800432:
+		CONS_Yasmin_Disappear(0, 0, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 


Commit: 5acd485cb8b4dcd15a1daf6dc593bdc5cfac23cb
    https://github.com/scummvm/scummvm/commit/5acd485cb8b4dcd15a1daf6dc593bdc5cfac23cb
Author: AndywinXp (andywinxp at gmail.com)
Date: 2025-06-16T23:12:18+02:00

Commit Message:
LASTEXPRESS: Clean up Hadija logic

Changed paths:
    engines/lastexpress/characters/hadija.cpp


diff --git a/engines/lastexpress/characters/hadija.cpp b/engines/lastexpress/characters/hadija.cpp
index 151977899d9..40118aeeba2 100644
--- a/engines/lastexpress/characters/hadija.cpp
+++ b/engines/lastexpress/characters/hadija.cpp
@@ -48,7 +48,7 @@ void LogicManager::CONS_Hadija(int chapter) {
 		CONS_Hadija_StartPart5(0, 0, 0, 0);
 		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -69,19 +69,25 @@ void LogicManager::CONS_Hadija_DebugWalks(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Hadija_DebugWalks(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			getCharacter(kCharacterHadija).characterPosition.position = 0;
-			getCharacter(kCharacterHadija).characterPosition.location = 0;
-			getCharacter(kCharacterHadija).characterPosition.car = kCarGreenSleeping;
-			getCharacterCurrentParams(kCharacterHadija)[0] = 10000;
-		}
-	} else if (walk(kCharacterHadija, kCarGreenSleeping, getCharacterCurrentParams(kCharacterHadija)[0])) {
-		if (getCharacterCurrentParams(kCharacterHadija)[0] == 10000) {
-			getCharacterCurrentParams(kCharacterHadija)[0] = 0;
-		} else {
-			getCharacterCurrentParams(kCharacterHadija)[0] = 10000;
+	switch (msg->action) {
+	case 0:
+		if (walk(kCharacterHadija, kCarGreenSleeping, getCharacterCurrentParams(kCharacterHadija)[0])) {
+			if (getCharacterCurrentParams(kCharacterHadija)[0] == 10000) {
+				getCharacterCurrentParams(kCharacterHadija)[0] = 0;
+			} else {
+				getCharacterCurrentParams(kCharacterHadija)[0] = 10000;
+			}
 		}
+
+		break;
+	case 12:
+		getCharacter(kCharacterHadija).characterPosition.position = 0;
+		getCharacter(kCharacterHadija).characterPosition.location = 0;
+		getCharacter(kCharacterHadija).characterPosition.car = kCarGreenSleeping;
+		getCharacterCurrentParams(kCharacterHadija)[0] = 10000;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -100,14 +106,19 @@ void LogicManager::CONS_Hadija_DoCorrOtis(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Hadija_DoCorrOtis(HAND_PARAMS) {
-	if (msg->action == 3) {
+	switch (msg->action) {
+	case 3:
 		releaseAtDoor(kCharacterHadija, getCharacterCurrentParams(kCharacterHadija)[3]);
 		getCharacter(kCharacterHadija).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterHadija, _functionsHadija[getCharacter(kCharacterHadija).callbacks[getCharacter(kCharacterHadija).currentCall]]);
 		fedEx(kCharacterHadija, kCharacterHadija, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		startSeqOtis(kCharacterHadija, (char *)&getCharacterCurrentParams(kCharacterHadija)[0]);
 		blockAtDoor(kCharacterHadija, getCharacterCurrentParams(kCharacterHadija)[3]);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -124,12 +135,17 @@ void LogicManager::CONS_Hadija_DoDialog(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Hadija_DoDialog(HAND_PARAMS) {
-	if (msg->action == 2) {
+	switch (msg->action) {
+	case 2:
 		getCharacter(kCharacterHadija).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterHadija, _functionsHadija[getCharacter(kCharacterHadija).callbacks[getCharacter(kCharacterHadija).currentCall]]);
 		fedEx(kCharacterHadija, kCharacterHadija, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		playDialog(kCharacterHadija, (char *)&getCharacterCurrentParams(kCharacterHadija)[0], -1, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -147,7 +163,8 @@ void LogicManager::CONS_Hadija_DoWait(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Hadija_DoWait(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		if (getCharacterCurrentParams(kCharacterHadija)[1] || (getCharacterCurrentParams(kCharacterHadija)[1] = _gameTime + getCharacterCurrentParams(kCharacterHadija)[0], _gameTime + getCharacterCurrentParams(kCharacterHadija)[0] != 0)) {
 			if (getCharacterCurrentParams(kCharacterHadija)[1] >= _gameTime)
 				return;
@@ -158,6 +175,9 @@ void LogicManager::HAND_Hadija_DoWait(HAND_PARAMS) {
 		getCharacter(kCharacterHadija).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterHadija, _functionsHadija[getCharacter(kCharacterHadija).callbacks[getCharacter(kCharacterHadija).currentCall]]);
 		fedEx(kCharacterHadija, kCharacterHadija, 18, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -214,11 +234,13 @@ void LogicManager::CONS_Hadija_PeekF(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Hadija_PeekF(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterHadija).characterPosition.position = 2740;
 		getCharacter(kCharacterHadija).callbacks[getCharacter(kCharacterHadija).currentCall + 8] = 1;
 		HadijaCall(&LogicManager::CONS_Hadija_DoCorrOtis, "619Cf", 6, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		if (getCharacter(kCharacterHadija).callbacks[getCharacter(kCharacterHadija).currentCall + 8] == 1) {
 			getCharacter(kCharacterHadija).callbacks[getCharacter(kCharacterHadija).currentCall + 8] = 2;
 			HadijaCall(&LogicManager::CONS_Hadija_DoCorrOtis, "619Df", 6, 0, 0);
@@ -230,6 +252,10 @@ void LogicManager::HAND_Hadija_PeekF(HAND_PARAMS) {
 			_engine->getMessageManager()->setMessageHandle(kCharacterHadija, _functionsHadija[getCharacter(kCharacterHadija).callbacks[getCharacter(kCharacterHadija).currentCall]]);
 			fedEx(kCharacterHadija, kCharacterHadija, 18, 0);
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -244,11 +270,13 @@ void LogicManager::CONS_Hadija_PeekH(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Hadija_PeekH(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterHadija).characterPosition.position = 2740;
 		getCharacter(kCharacterHadija).callbacks[getCharacter(kCharacterHadija).currentCall + 8] = 1;
 		HadijaCall(&LogicManager::CONS_Hadija_DoCorrOtis, "619Ch", 8, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		if (getCharacter(kCharacterHadija).callbacks[getCharacter(kCharacterHadija).currentCall + 8] == 1) {
 			getCharacter(kCharacterHadija).callbacks[getCharacter(kCharacterHadija).currentCall + 8] = 2;
 			HadijaCall(&LogicManager::CONS_Hadija_DoCorrOtis, "619Dh", 8, 0, 0);
@@ -260,6 +288,10 @@ void LogicManager::HAND_Hadija_PeekH(HAND_PARAMS) {
 			_engine->getMessageManager()->setMessageHandle(kCharacterHadija, _functionsHadija[getCharacter(kCharacterHadija).callbacks[getCharacter(kCharacterHadija).currentCall]]);
 			fedEx(kCharacterHadija, kCharacterHadija, 18, 0);
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -274,12 +306,14 @@ void LogicManager::CONS_Hadija_GoFtoH(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Hadija_GoFtoH(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterHadija).characterPosition.position = 4070;
 		getCharacter(kCharacterHadija).characterPosition.location = 0;
 		getCharacter(kCharacterHadija).callbacks[getCharacter(kCharacterHadija).currentCall + 8] = 1;
 		HadijaCall(&LogicManager::CONS_Hadija_DoCorrOtis, "619Bf", 6, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterHadija).callbacks[getCharacter(kCharacterHadija).currentCall + 8]) {
 		case 1:
 			getCharacter(kCharacterHadija).callbacks[getCharacter(kCharacterHadija).currentCall + 8] = 2;
@@ -298,6 +332,10 @@ void LogicManager::HAND_Hadija_GoFtoH(HAND_PARAMS) {
 			fedEx(kCharacterHadija, kCharacterHadija, 18, 0);
 			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -312,12 +350,14 @@ void LogicManager::CONS_Hadija_GoHtoF(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Hadija_GoHtoF(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterHadija).characterPosition.position = 2740;
 		getCharacter(kCharacterHadija).characterPosition.location = 0;
 		getCharacter(kCharacterHadija).callbacks[getCharacter(kCharacterHadija).currentCall + 8] = 1;
 		HadijaCall(&LogicManager::CONS_Hadija_DoCorrOtis, "619Bh", 8, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterHadija).callbacks[getCharacter(kCharacterHadija).currentCall + 8]) {
 		case 1:
 			getCharacter(kCharacterHadija).callbacks[getCharacter(kCharacterHadija).currentCall + 8] = 2;
@@ -336,6 +376,10 @@ void LogicManager::HAND_Hadija_GoHtoF(HAND_PARAMS) {
 			fedEx(kCharacterHadija, kCharacterHadija, 18, 0);
 			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -350,15 +394,21 @@ void LogicManager::CONS_Hadija_Birth(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Hadija_Birth(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		if (_gameTime > 1062000 && !getCharacterCurrentParams(kCharacterHadija)[0]) {
 			getCharacterCurrentParams(kCharacterHadija)[0] = 1;
 			CONS_Hadija_Part1(0, 0, 0, 0);
 		}
-	} else if (msg->action == 12) {
+
+		break;
+	case 12:
 		getCharacter(kCharacterHadija).characterPosition.position = 4070;
 		getCharacter(kCharacterHadija).characterPosition.location = 1;
 		getCharacter(kCharacterHadija).characterPosition.car = kCarGreenSleeping;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -373,82 +423,158 @@ void LogicManager::CONS_Hadija_Part1(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Hadija_Part1(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 18) {
-			switch (getCharacter(kCharacterHadija).callbacks[getCharacter(kCharacterHadija).currentCall + 8]) {
-			case 1:
-				goto LABEL_8;
-			case 2:
-				goto LABEL_11;
-			case 3:
-				goto LABEL_21;
-			case 4:
-				goto LABEL_24;
-			default:
-				return;
+	switch (msg->action) {
+	case 0:
+		if (_gameTime > 1075500 && !getCharacterCurrentParams(kCharacterHadija)[0]) {
+			getCharacterCurrentParams(kCharacterHadija)[0] = 1;
+			getCharacter(kCharacterHadija).characterPosition.position = 4840;
+			getCharacter(kCharacterHadija).callbacks[getCharacter(kCharacterHadija).currentCall + 8] = 1;
+			HadijaCall(&LogicManager::CONS_Hadija_DoDialog, "Har1100", 0, 0, 0);
+			break;
+		}
+
+		if (_gameTime > 1084500 && !getCharacterCurrentParams(kCharacterHadija)[1]) {
+			getCharacterCurrentParams(kCharacterHadija)[1] = 1;
+			getCharacter(kCharacterHadija).callbacks[getCharacter(kCharacterHadija).currentCall + 8] = 2;
+			HadijaCall(&LogicManager::CONS_Hadija_GoFtoH, 0, 0, 0, 0);
+			break;
+		}
+
+		if (getCharacterCurrentParams(kCharacterHadija)[2] != 0x7FFFFFFF && _gameTime > 1093500) {
+			if (_gameTime > 1134000) {
+				getCharacterCurrentParams(kCharacterHadija)[2] = 0x7FFFFFFF;
+				getCharacter(kCharacterHadija).callbacks[getCharacter(kCharacterHadija).currentCall + 8] = 3;
+				HadijaCall(&LogicManager::CONS_Hadija_PeekH, 0, 0, 0, 0);
+				break;
+			}
+
+			if (!cathInCorridor(kCarGreenSleeping) ||
+				!inComp(kCharacterMahmud, kCarGreenSleeping, 5790) ||
+				!getCharacterCurrentParams(kCharacterHadija)[2]) {
+				getCharacterCurrentParams(kCharacterHadija)[2] = _gameTime + 75;
+				if (_gameTime == -75) {
+					getCharacter(kCharacterHadija).callbacks[getCharacter(kCharacterHadija).currentCall + 8] = 3;
+					HadijaCall(&LogicManager::CONS_Hadija_PeekH, 0, 0, 0, 0);
+					break;
+				}
+			}
+
+			if (getCharacterCurrentParams(kCharacterHadija)[2] < _gameTime) {
+				getCharacterCurrentParams(kCharacterHadija)[2] = 0x7FFFFFFF;
+				getCharacter(kCharacterHadija).callbacks[getCharacter(kCharacterHadija).currentCall + 8] = 3;
+				HadijaCall(&LogicManager::CONS_Hadija_PeekH, 0, 0, 0, 0);
+				break;
 			}
 		}
-		return;
-	}
-	if (_gameTime > 1075500 && !getCharacterCurrentParams(kCharacterHadija)[0]) {
-		getCharacterCurrentParams(kCharacterHadija)[0] = 1;
-		getCharacter(kCharacterHadija).characterPosition.position = 4840;
-		getCharacter(kCharacterHadija).callbacks[getCharacter(kCharacterHadija).currentCall + 8] = 1;
-		HadijaCall(&LogicManager::CONS_Hadija_DoDialog, "Har1100", 0, 0, 0);
-		return;
-	}
-LABEL_8:
-	if (_gameTime > 1084500 && !getCharacterCurrentParams(kCharacterHadija)[1]) {
-		getCharacterCurrentParams(kCharacterHadija)[1] = 1;
-		getCharacter(kCharacterHadija).callbacks[getCharacter(kCharacterHadija).currentCall + 8] = 2;
-		HadijaCall(&LogicManager::CONS_Hadija_GoFtoH, 0, 0, 0, 0);
-		return;
-	}
-LABEL_11:
-	if (getCharacterCurrentParams(kCharacterHadija)[2] != 0x7FFFFFFF && _gameTime > 1093500) {
-		if (_gameTime > 1134000)
-			goto LABEL_19;
-		if (!cathInCorridor(kCarGreenSleeping) ||
-			!inComp(kCharacterMahmud, kCarGreenSleeping, 5790) ||
-			!getCharacterCurrentParams(kCharacterHadija)[2]) {
-			getCharacterCurrentParams(kCharacterHadija)[2] = _gameTime + 75;
-			if (_gameTime == -75)
-				goto LABEL_20;
-		}
-		if (getCharacterCurrentParams(kCharacterHadija)[2] < _gameTime) {
-		LABEL_19:
-			getCharacterCurrentParams(kCharacterHadija)[2] = 0x7FFFFFFF;
-		LABEL_20:
-			getCharacter(kCharacterHadija).callbacks[getCharacter(kCharacterHadija).currentCall + 8] = 3;
-			HadijaCall(&LogicManager::CONS_Hadija_PeekH, 0, 0, 0, 0);
+
+		if (_gameTime > 1156500 && !getCharacterCurrentParams(kCharacterHadija)[3]) {
+			getCharacterCurrentParams(kCharacterHadija)[3] = 1;
+			getCharacter(kCharacterHadija).callbacks[getCharacter(kCharacterHadija).currentCall + 8] = 4;
+			HadijaCall(&LogicManager::CONS_Hadija_GoHtoF, 0, 0, 0, 0);
 			return;
 		}
-	}
-LABEL_21:
-	if (_gameTime > 1156500 && !getCharacterCurrentParams(kCharacterHadija)[3]) {
-		getCharacterCurrentParams(kCharacterHadija)[3] = 1;
-		getCharacter(kCharacterHadija).callbacks[getCharacter(kCharacterHadija).currentCall + 8] = 4;
-		HadijaCall(&LogicManager::CONS_Hadija_GoHtoF, 0, 0, 0, 0);
-		return;
-	}
-LABEL_24:
-	if (getCharacterCurrentParams(kCharacterHadija)[4] != 0x7FFFFFFF && _gameTime > 1165500) {
-		if (_gameTime <= 1188000) {
-			if (!cathInCorridor(kCarGreenSleeping) || !
-				inComp(kCharacterMahmud, kCarGreenSleeping, 5790) ||
-				!getCharacterCurrentParams(kCharacterHadija)[4]) {
-				getCharacterCurrentParams(kCharacterHadija)[4] = _gameTime + 75;
-				if (_gameTime == -75)
-					goto LABEL_33;
+
+		if (getCharacterCurrentParams(kCharacterHadija)[4] != 0x7FFFFFFF && _gameTime > 1165500) {
+			if (_gameTime <= 1188000) {
+				if (!cathInCorridor(kCarGreenSleeping) || !inComp(kCharacterMahmud, kCarGreenSleeping, 5790) ||
+					!getCharacterCurrentParams(kCharacterHadija)[4]) {
+					getCharacterCurrentParams(kCharacterHadija)[4] = _gameTime + 75;
+					if (_gameTime == -75) {
+						getCharacter(kCharacterHadija).callbacks[getCharacter(kCharacterHadija).currentCall + 8] = 5;
+						HadijaCall(&LogicManager::CONS_Hadija_PeekF, 0, 0, 0, 0);
+						break;
+					}
+				}
+
+				if (getCharacterCurrentParams(kCharacterHadija)[4] >= _gameTime)
+					break;
 			}
 
-			if (getCharacterCurrentParams(kCharacterHadija)[4] >= _gameTime)
-				return;
+			getCharacterCurrentParams(kCharacterHadija)[4] = 0x7FFFFFFF;
+			getCharacter(kCharacterHadija).callbacks[getCharacter(kCharacterHadija).currentCall + 8] = 5;
+			HadijaCall(&LogicManager::CONS_Hadija_PeekF, 0, 0, 0, 0);
+		}
+
+		break;
+	case 18:
+		switch (getCharacter(kCharacterHadija).callbacks[getCharacter(kCharacterHadija).currentCall + 8]) {
+		case 1:
+			if (_gameTime > 1084500 && !getCharacterCurrentParams(kCharacterHadija)[1]) {
+				getCharacterCurrentParams(kCharacterHadija)[1] = 1;
+				getCharacter(kCharacterHadija).callbacks[getCharacter(kCharacterHadija).currentCall + 8] = 2;
+				HadijaCall(&LogicManager::CONS_Hadija_GoFtoH, 0, 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 2:
+			if (getCharacterCurrentParams(kCharacterHadija)[2] != 0x7FFFFFFF && _gameTime > 1093500) {
+				if (_gameTime > 1134000) {
+					getCharacterCurrentParams(kCharacterHadija)[2] = 0x7FFFFFFF;
+					getCharacter(kCharacterHadija).callbacks[getCharacter(kCharacterHadija).currentCall + 8] = 3;
+					HadijaCall(&LogicManager::CONS_Hadija_PeekH, 0, 0, 0, 0);
+					break;
+				}
+
+				if (!cathInCorridor(kCarGreenSleeping) ||
+					!inComp(kCharacterMahmud, kCarGreenSleeping, 5790) ||
+					!getCharacterCurrentParams(kCharacterHadija)[2]) {
+					getCharacterCurrentParams(kCharacterHadija)[2] = _gameTime + 75;
+					if (_gameTime == -75) {
+						getCharacter(kCharacterHadija).callbacks[getCharacter(kCharacterHadija).currentCall + 8] = 3;
+						HadijaCall(&LogicManager::CONS_Hadija_PeekH, 0, 0, 0, 0);
+						break;
+					}
+				}
+
+				if (getCharacterCurrentParams(kCharacterHadija)[2] < _gameTime) {
+					getCharacterCurrentParams(kCharacterHadija)[2] = 0x7FFFFFFF;
+					getCharacter(kCharacterHadija).callbacks[getCharacter(kCharacterHadija).currentCall + 8] = 3;
+					HadijaCall(&LogicManager::CONS_Hadija_PeekH, 0, 0, 0, 0);
+					break;
+				}
+			}
+
+			// fall through
+		case 3:
+			if (_gameTime > 1156500 && !getCharacterCurrentParams(kCharacterHadija)[3]) {
+				getCharacterCurrentParams(kCharacterHadija)[3] = 1;
+				getCharacter(kCharacterHadija).callbacks[getCharacter(kCharacterHadija).currentCall + 8] = 4;
+				HadijaCall(&LogicManager::CONS_Hadija_GoHtoF, 0, 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 4:
+			if (getCharacterCurrentParams(kCharacterHadija)[4] != 0x7FFFFFFF && _gameTime > 1165500) {
+				if (_gameTime <= 1188000) {
+					if (!cathInCorridor(kCarGreenSleeping) || !inComp(kCharacterMahmud, kCarGreenSleeping, 5790) ||
+						!getCharacterCurrentParams(kCharacterHadija)[4]) {
+						getCharacterCurrentParams(kCharacterHadija)[4] = _gameTime + 75;
+						if (_gameTime == -75) {
+							getCharacter(kCharacterHadija).callbacks[getCharacter(kCharacterHadija).currentCall + 8] = 5;
+							HadijaCall(&LogicManager::CONS_Hadija_PeekF, 0, 0, 0, 0);
+							break;
+						}
+					}
+
+					if (getCharacterCurrentParams(kCharacterHadija)[4] >= _gameTime)
+						break;
+				}
+
+				getCharacterCurrentParams(kCharacterHadija)[4] = 0x7FFFFFFF;
+				getCharacter(kCharacterHadija).callbacks[getCharacter(kCharacterHadija).currentCall + 8] = 5;
+				HadijaCall(&LogicManager::CONS_Hadija_PeekF, 0, 0, 0, 0);
+			}
+
+			break;
+		default:
+			break;
 		}
-		getCharacterCurrentParams(kCharacterHadija)[4] = 0x7FFFFFFF;
-	LABEL_33:
-		getCharacter(kCharacterHadija).callbacks[getCharacter(kCharacterHadija).currentCall + 8] = 5;
-		HadijaCall(&LogicManager::CONS_Hadija_PeekF, 0, 0, 0, 0);
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -463,12 +589,16 @@ void LogicManager::CONS_Hadija_Asleep(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Hadija_Asleep(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		setDoor(8, kCharacterCath, 3, 10, 9);
 		getCharacter(kCharacterHadija).characterPosition.position = 2740;
 		getCharacter(kCharacterHadija).characterPosition.location = 1;
 		getCharacter(kCharacterHadija).characterPosition.car = kCarGreenSleeping;
 		endGraphics(kCharacterHadija);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -483,7 +613,8 @@ void LogicManager::CONS_Hadija_StartPart2(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Hadija_StartPart2(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		endGraphics(kCharacterHadija);
 		getCharacter(kCharacterHadija).characterPosition.position = 3050;
 		getCharacter(kCharacterHadija).characterPosition.location = 1;
@@ -491,6 +622,9 @@ void LogicManager::HAND_Hadija_StartPart2(HAND_PARAMS) {
 		getCharacter(kCharacterHadija).clothes = 0;
 		getCharacter(kCharacterHadija).inventoryItem = kItemNone;
 		CONS_Hadija_Part2(0, 0, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -505,47 +639,67 @@ void LogicManager::CONS_Hadija_Part2(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Hadija_Part2(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		if (_gameTime > 1782000 && !getCharacterCurrentParams(kCharacterHadija)[0]) {
 			getCharacterCurrentParams(kCharacterHadija)[0] = 1;
 			getCharacter(kCharacterHadija).characterPosition.position = 2740;
 		}
 
-		if (getCharacterCurrentParams(kCharacterHadija)[1] == 0x7FFFFFFF || _gameTime <= 1786500)
-			goto LABEL_19;
+		if (getCharacterCurrentParams(kCharacterHadija)[1] == 0x7FFFFFFF || _gameTime <= 1786500) {
+			if (_gameTime > 1822500 && !getCharacterCurrentParams(kCharacterHadija)[2]) {
+				getCharacterCurrentParams(kCharacterHadija)[2] = 1;
+				getCharacter(kCharacterHadija).callbacks[getCharacter(kCharacterHadija).currentCall + 8] = 2;
+				HadijaCall(&LogicManager::CONS_Hadija_GoHtoF, 0, 0, 0, 0);
+			}
+
+			break;
+		}
 
 		if (_gameTime <= 1818000) {
 			if (!cathInCorridor(kCarGreenSleeping) || !getCharacterCurrentParams(kCharacterHadija)[1]) {
 				getCharacterCurrentParams(kCharacterHadija)[1] = _gameTime + 75;
-				if (_gameTime == -75)
-					goto LABEL_15;
+				if (_gameTime == -75) {
+					getCharacter(kCharacterHadija).callbacks[getCharacter(kCharacterHadija).currentCall + 8] = 1;
+					HadijaCall(&LogicManager::CONS_Hadija_PeekH, 0, 0, 0, 0);
+					break;
+				}
 			}
 
-			if (getCharacterCurrentParams(kCharacterHadija)[1] >= _gameTime)
-				goto LABEL_19;
+			if (getCharacterCurrentParams(kCharacterHadija)[1] >= _gameTime) {
+				if (_gameTime > 1822500 && !getCharacterCurrentParams(kCharacterHadija)[2]) {
+					getCharacterCurrentParams(kCharacterHadija)[2] = 1;
+					getCharacter(kCharacterHadija).callbacks[getCharacter(kCharacterHadija).currentCall + 8] = 2;
+					HadijaCall(&LogicManager::CONS_Hadija_GoHtoF, 0, 0, 0, 0);
+				}
+
+				break;
+			}
 		}
+
 		getCharacterCurrentParams(kCharacterHadija)[1] = 0x7FFFFFFF;
-	LABEL_15:
 		getCharacter(kCharacterHadija).callbacks[getCharacter(kCharacterHadija).currentCall + 8] = 1;
 		HadijaCall(&LogicManager::CONS_Hadija_PeekH, 0, 0, 0, 0);
-		return;
-	}
+		break;
+	case 18:
+		if (getCharacter(kCharacterHadija).callbacks[getCharacter(kCharacterHadija).currentCall + 8] != 1) {
+			if (getCharacter(kCharacterHadija).callbacks[getCharacter(kCharacterHadija).currentCall + 8] == 2) {
+				getCharacter(kCharacterHadija).callbacks[getCharacter(kCharacterHadija).currentCall + 8] = 3;
+				HadijaCall(&LogicManager::CONS_Hadija_DoDialog, "Har2012", 0, 0, 0);
+			}
 
-	if (msg->action != 18)
-		return;
+			break;
+		}
 
-	if (getCharacter(kCharacterHadija).callbacks[getCharacter(kCharacterHadija).currentCall + 8] != 1) {
-		if (getCharacter(kCharacterHadija).callbacks[getCharacter(kCharacterHadija).currentCall + 8] == 2) {
-			getCharacter(kCharacterHadija).callbacks[getCharacter(kCharacterHadija).currentCall + 8] = 3;
-			HadijaCall(&LogicManager::CONS_Hadija_DoDialog, "Har2012", 0, 0, 0);
+		if (_gameTime > 1822500 && !getCharacterCurrentParams(kCharacterHadija)[2]) {
+			getCharacterCurrentParams(kCharacterHadija)[2] = 1;
+			getCharacter(kCharacterHadija).callbacks[getCharacter(kCharacterHadija).currentCall + 8] = 2;
+			HadijaCall(&LogicManager::CONS_Hadija_GoHtoF, 0, 0, 0, 0);
 		}
-		return;
-	}
-LABEL_19:
-	if (_gameTime > 1822500 && !getCharacterCurrentParams(kCharacterHadija)[2]) {
-		getCharacterCurrentParams(kCharacterHadija)[2] = 1;
-		getCharacter(kCharacterHadija).callbacks[getCharacter(kCharacterHadija).currentCall + 8] = 2;
-		HadijaCall(&LogicManager::CONS_Hadija_GoHtoF, 0, 0, 0, 0);
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -560,13 +714,18 @@ void LogicManager::CONS_Hadija_StartPart3(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Hadija_StartPart3(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		CONS_Hadija_Part3(0, 0, 0, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		endGraphics(kCharacterHadija);
 		getCharacter(kCharacterHadija).characterPosition.position = 4070;
 		getCharacter(kCharacterHadija).characterPosition.location = 1;
 		getCharacter(kCharacterHadija).characterPosition.car = kCarGreenSleeping;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -581,65 +740,115 @@ void LogicManager::CONS_Hadija_Part3(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Hadija_Part3(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 18) {
-			switch (getCharacter(kCharacterHadija).callbacks[getCharacter(kCharacterHadija).currentCall + 8]) {
-			case 1:
-				goto LABEL_8;
-			case 2:
-				goto LABEL_11;
-			case 3:
-				goto LABEL_14;
-			case 4:
-				goto LABEL_17;
-			default:
-				return;
+	switch (msg->action) {
+	case 0:
+		if (_gameTime > 1998000 && !getCharacterCurrentParams(kCharacterHadija)[0]) {
+			getCharacterCurrentParams(kCharacterHadija)[0] = 1;
+			getCharacter(kCharacterHadija).callbacks[getCharacter(kCharacterHadija).currentCall + 8] = 1;
+			HadijaCall(&LogicManager::CONS_Hadija_GoFtoH, 0, 0, 0, 0);
+			return;
+		}
+
+		if (_gameTime > 2020500 && !getCharacterCurrentParams(kCharacterHadija)[1]) {
+			getCharacterCurrentParams(kCharacterHadija)[1] = 1;
+			getCharacter(kCharacterHadija).callbacks[getCharacter(kCharacterHadija).currentCall + 8] = 2;
+			HadijaCall(&LogicManager::CONS_Hadija_GoHtoF, 0, 0, 0, 0);
+			break;
+		}
+
+		if (_gameTime > 2079000 && !getCharacterCurrentParams(kCharacterHadija)[2]) {
+			getCharacterCurrentParams(kCharacterHadija)[2] = 1;
+			getCharacter(kCharacterHadija).callbacks[getCharacter(kCharacterHadija).currentCall + 8] = 3;
+			HadijaCall(&LogicManager::CONS_Hadija_GoFtoH, 0, 0, 0, 0);
+			break;
+		}
+
+		if (_gameTime > 2187000 && !getCharacterCurrentParams(kCharacterHadija)[3]) {
+			getCharacterCurrentParams(kCharacterHadija)[3] = 1;
+			getCharacter(kCharacterHadija).callbacks[getCharacter(kCharacterHadija).currentCall + 8] = 4;
+			HadijaCall(&LogicManager::CONS_Hadija_GoHtoF, 0, 0, 0, 0);
+			break;
+		}
+
+		if (getCharacterCurrentParams(kCharacterHadija)[4] != 0x7FFFFFFF && _gameTime > 2196000) {
+			if (_gameTime <= 2254500) {
+				if (!cathInCorridor(kCarGreenSleeping) || !getCharacterCurrentParams(kCharacterHadija)[4]) {
+					getCharacterCurrentParams(kCharacterHadija)[4] = _gameTime + 75;
+					if (_gameTime == -75) {
+						getCharacter(kCharacterHadija).callbacks[getCharacter(kCharacterHadija).currentCall + 8] = 5;
+						HadijaCall(&LogicManager::CONS_Hadija_PeekF, 0, 0, 0, 0);
+						break;
+					}
+				}
+
+				if (getCharacterCurrentParams(kCharacterHadija)[4] >= _gameTime)
+					break;
 			}
+
+			getCharacterCurrentParams(kCharacterHadija)[4] = 0x7FFFFFFF;
+			getCharacter(kCharacterHadija).callbacks[getCharacter(kCharacterHadija).currentCall + 8] = 5;
+			HadijaCall(&LogicManager::CONS_Hadija_PeekF, 0, 0, 0, 0);
 		}
-		return;
-	}
-	if (_gameTime > 1998000 && !getCharacterCurrentParams(kCharacterHadija)[0]) {
-		getCharacterCurrentParams(kCharacterHadija)[0] = 1;
-		getCharacter(kCharacterHadija).callbacks[getCharacter(kCharacterHadija).currentCall + 8] = 1;
-		HadijaCall(&LogicManager::CONS_Hadija_GoFtoH, 0, 0, 0, 0);
-		return;
-	}
-LABEL_8:
-	if (_gameTime > 2020500 && !getCharacterCurrentParams(kCharacterHadija)[1]) {
-		getCharacterCurrentParams(kCharacterHadija)[1] = 1;
-		getCharacter(kCharacterHadija).callbacks[getCharacter(kCharacterHadija).currentCall + 8] = 2;
-		HadijaCall(&LogicManager::CONS_Hadija_GoHtoF, 0, 0, 0, 0);
-		return;
-	}
-LABEL_11:
-	if (_gameTime > 2079000 && !getCharacterCurrentParams(kCharacterHadija)[2]) {
-		getCharacterCurrentParams(kCharacterHadija)[2] = 1;
-		getCharacter(kCharacterHadija).callbacks[getCharacter(kCharacterHadija).currentCall + 8] = 3;
-		HadijaCall(&LogicManager::CONS_Hadija_GoFtoH, 0, 0, 0, 0);
-		return;
-	}
-LABEL_14:
-	if (_gameTime > 2187000 && !getCharacterCurrentParams(kCharacterHadija)[3]) {
-		getCharacterCurrentParams(kCharacterHadija)[3] = 1;
-		getCharacter(kCharacterHadija).callbacks[getCharacter(kCharacterHadija).currentCall + 8] = 4;
-		HadijaCall(&LogicManager::CONS_Hadija_GoHtoF, 0, 0, 0, 0);
-		return;
-	}
-LABEL_17:
-	if (getCharacterCurrentParams(kCharacterHadija)[4] != 0x7FFFFFFF && _gameTime > 2196000) {
-		if (_gameTime <= 2254500) {
-			if (!cathInCorridor(kCarGreenSleeping) || !getCharacterCurrentParams(kCharacterHadija)[4]) {
-				getCharacterCurrentParams(kCharacterHadija)[4] = _gameTime + 75;
-				if (_gameTime == -75)
-					goto LABEL_25;
+
+		break;
+	case 18:
+		switch (getCharacter(kCharacterHadija).callbacks[getCharacter(kCharacterHadija).currentCall + 8]) {
+		case 1:
+			if (_gameTime > 2020500 && !getCharacterCurrentParams(kCharacterHadija)[1]) {
+				getCharacterCurrentParams(kCharacterHadija)[1] = 1;
+				getCharacter(kCharacterHadija).callbacks[getCharacter(kCharacterHadija).currentCall + 8] = 2;
+				HadijaCall(&LogicManager::CONS_Hadija_GoHtoF, 0, 0, 0, 0);
+				break;
 			}
-			if (getCharacterCurrentParams(kCharacterHadija)[4] >= _gameTime)
-				return;
+
+			// fall through
+		case 2:
+			if (_gameTime > 2079000 && !getCharacterCurrentParams(kCharacterHadija)[2]) {
+				getCharacterCurrentParams(kCharacterHadija)[2] = 1;
+				getCharacter(kCharacterHadija).callbacks[getCharacter(kCharacterHadija).currentCall + 8] = 3;
+				HadijaCall(&LogicManager::CONS_Hadija_GoFtoH, 0, 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 3:
+			if (_gameTime > 2187000 && !getCharacterCurrentParams(kCharacterHadija)[3]) {
+				getCharacterCurrentParams(kCharacterHadija)[3] = 1;
+				getCharacter(kCharacterHadija).callbacks[getCharacter(kCharacterHadija).currentCall + 8] = 4;
+				HadijaCall(&LogicManager::CONS_Hadija_GoHtoF, 0, 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 4:
+			if (getCharacterCurrentParams(kCharacterHadija)[4] != 0x7FFFFFFF && _gameTime > 2196000) {
+				if (_gameTime <= 2254500) {
+					if (!cathInCorridor(kCarGreenSleeping) || !getCharacterCurrentParams(kCharacterHadija)[4]) {
+						getCharacterCurrentParams(kCharacterHadija)[4] = _gameTime + 75;
+						if (_gameTime == -75) {
+							getCharacter(kCharacterHadija).callbacks[getCharacter(kCharacterHadija).currentCall + 8] = 5;
+							HadijaCall(&LogicManager::CONS_Hadija_PeekF, 0, 0, 0, 0);
+							break;
+						}
+					}
+
+					if (getCharacterCurrentParams(kCharacterHadija)[4] >= _gameTime)
+						break;
+				}
+
+				getCharacterCurrentParams(kCharacterHadija)[4] = 0x7FFFFFFF;
+				getCharacter(kCharacterHadija).callbacks[getCharacter(kCharacterHadija).currentCall + 8] = 5;
+				HadijaCall(&LogicManager::CONS_Hadija_PeekF, 0, 0, 0, 0);
+			}
+
+			break;
+		default:
+			break;
 		}
-		getCharacterCurrentParams(kCharacterHadija)[4] = 0x7FFFFFFF;
-	LABEL_25:
-		getCharacter(kCharacterHadija).callbacks[getCharacter(kCharacterHadija).currentCall + 8] = 5;
-		HadijaCall(&LogicManager::CONS_Hadija_PeekF, 0, 0, 0, 0);
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -654,12 +863,17 @@ void LogicManager::CONS_Hadija_StartPart4(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Hadija_StartPart4(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		CONS_Hadija_Part4(0, 0, 0, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		getCharacter(kCharacterHadija).characterPosition.position = 4070;
 		getCharacter(kCharacterHadija).characterPosition.location = 1;
 		getCharacter(kCharacterHadija).characterPosition.car = kCarGreenSleeping;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -674,65 +888,119 @@ void LogicManager::CONS_Hadija_Part4(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Hadija_Part4(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		if (getCharacterCurrentParams(kCharacterHadija)[0] != 0x7FFFFFFF && _gameTime) {
-			if (_gameTime > 1714500)
-				goto LABEL_11;
+			if (_gameTime > 1714500) {
+				getCharacterCurrentParams(kCharacterHadija)[0] = 0x7FFFFFFF;
+				getCharacter(kCharacterHadija).callbacks[getCharacter(kCharacterHadija).currentCall + 8] = 1;
+				HadijaCall(&LogicManager::CONS_Hadija_PeekF, 0, 0, 0, 0);
+				break;
+			}
+
 			if (!cathInCorridor(kCarGreenSleeping) || !getCharacterCurrentParams(kCharacterHadija)[0]) {
 				getCharacterCurrentParams(kCharacterHadija)[0] = _gameTime + 75;
-				if (_gameTime == -75)
-					goto LABEL_12;
+				if (_gameTime == -75) {
+					getCharacter(kCharacterHadija).callbacks[getCharacter(kCharacterHadija).currentCall + 8] = 1;
+					HadijaCall(&LogicManager::CONS_Hadija_PeekF, 0, 0, 0, 0);
+					break;
+				}
 			}
+
 			if (getCharacterCurrentParams(kCharacterHadija)[0] < _gameTime) {
-			LABEL_11:
 				getCharacterCurrentParams(kCharacterHadija)[0] = 0x7FFFFFFF;
-			LABEL_12:
 				getCharacter(kCharacterHadija).callbacks[getCharacter(kCharacterHadija).currentCall + 8] = 1;
 				HadijaCall(&LogicManager::CONS_Hadija_PeekF, 0, 0, 0, 0);
-				return;
+				break;
 			}
 		}
-	LABEL_17:
+
 		if (_gameTime > 2367000 && !getCharacterCurrentParams(kCharacterHadija)[1]) {
 			getCharacterCurrentParams(kCharacterHadija)[1] = 1;
 			getCharacter(kCharacterHadija).callbacks[getCharacter(kCharacterHadija).currentCall + 8] = 2;
 			HadijaCall(&LogicManager::CONS_Hadija_GoFtoH, 0, 0, 0, 0);
-			return;
+			break;
 		}
-	LABEL_20:
+
 		if (_gameTime > 2421000 && !getCharacterCurrentParams(kCharacterHadija)[2]) {
 			getCharacterCurrentParams(kCharacterHadija)[2] = 1;
 			getCharacter(kCharacterHadija).callbacks[getCharacter(kCharacterHadija).currentCall + 8] = 3;
 			HadijaCall(&LogicManager::CONS_Hadija_GoHtoF, 0, 0, 0, 0);
-			return;
+			break;
 		}
-		goto LABEL_23;
-	}
 
-	if (msg->action != 18)
-		return;
-
-	if (getCharacter(kCharacterHadija).callbacks[getCharacter(kCharacterHadija).currentCall + 8] == 1)
-		goto LABEL_17;
-	if (getCharacter(kCharacterHadija).callbacks[getCharacter(kCharacterHadija).currentCall + 8] == 2)
-		goto LABEL_20;
-	if (getCharacter(kCharacterHadija).callbacks[getCharacter(kCharacterHadija).currentCall + 8] != 3)
-		return;
-LABEL_23:
-	if (getCharacterCurrentParams(kCharacterHadija)[3] != 0x7FFFFFFF && _gameTime > 2425500) {
-		if (_gameTime <= 2484000) {
-			if (!cathInCorridor(kCarGreenSleeping) || !getCharacterCurrentParams(kCharacterHadija)[3]) {
-				getCharacterCurrentParams(kCharacterHadija)[3] = _gameTime + 75;
-				if (_gameTime == -75)
-					goto LABEL_31;
+		if (getCharacterCurrentParams(kCharacterHadija)[3] != 0x7FFFFFFF && _gameTime > 2425500) {
+			if (_gameTime <= 2484000) {
+				if (!cathInCorridor(kCarGreenSleeping) || !getCharacterCurrentParams(kCharacterHadija)[3]) {
+					getCharacterCurrentParams(kCharacterHadija)[3] = _gameTime + 75;
+					if (_gameTime == -75) {
+						getCharacter(kCharacterHadija).callbacks[getCharacter(kCharacterHadija).currentCall + 8] = 4;
+						HadijaCall(&LogicManager::CONS_Hadija_PeekF, 0, 0, 0, 0);
+						break;
+					}
+				}
+
+				if (getCharacterCurrentParams(kCharacterHadija)[3] >= _gameTime)
+					break;
 			}
-			if (getCharacterCurrentParams(kCharacterHadija)[3] >= _gameTime)
-				return;
+
+			getCharacterCurrentParams(kCharacterHadija)[3] = 0x7FFFFFFF;
+			getCharacter(kCharacterHadija).callbacks[getCharacter(kCharacterHadija).currentCall + 8] = 4;
+			HadijaCall(&LogicManager::CONS_Hadija_PeekF, 0, 0, 0, 0);
+		}
+
+		break;
+	case 18:
+		switch (getCharacter(kCharacterHadija).callbacks[getCharacter(kCharacterHadija).currentCall + 8]) {
+		case 1:
+			if (_gameTime > 2367000 && !getCharacterCurrentParams(kCharacterHadija)[1]) {
+				getCharacterCurrentParams(kCharacterHadija)[1] = 1;
+				getCharacter(kCharacterHadija).callbacks[getCharacter(kCharacterHadija).currentCall + 8] = 2;
+				HadijaCall(&LogicManager::CONS_Hadija_GoFtoH, 0, 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 2:
+			if (_gameTime > 2421000 && !getCharacterCurrentParams(kCharacterHadija)[2]) {
+				getCharacterCurrentParams(kCharacterHadija)[2] = 1;
+				getCharacter(kCharacterHadija).callbacks[getCharacter(kCharacterHadija).currentCall + 8] = 3;
+				HadijaCall(&LogicManager::CONS_Hadija_GoHtoF, 0, 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 3:
+			if (getCharacterCurrentParams(kCharacterHadija)[3] != 0x7FFFFFFF && _gameTime > 2425500) {
+				if (_gameTime <= 2484000) {
+					if (!cathInCorridor(kCarGreenSleeping) || !getCharacterCurrentParams(kCharacterHadija)[3]) {
+						getCharacterCurrentParams(kCharacterHadija)[3] = _gameTime + 75;
+						if (_gameTime == -75) {
+							getCharacter(kCharacterHadija).callbacks[getCharacter(kCharacterHadija).currentCall + 8] = 4;
+							HadijaCall(&LogicManager::CONS_Hadija_PeekF, 0, 0, 0, 0);
+							break;
+						}
+					}
+
+					if (getCharacterCurrentParams(kCharacterHadija)[3] >= _gameTime)
+						break;
+				}
+
+				getCharacterCurrentParams(kCharacterHadija)[3] = 0x7FFFFFFF;
+				getCharacter(kCharacterHadija).callbacks[getCharacter(kCharacterHadija).currentCall + 8] = 4;
+				HadijaCall(&LogicManager::CONS_Hadija_PeekF, 0, 0, 0, 0);
+			}
+
+			break;
+		default:
+			break;
 		}
-		getCharacterCurrentParams(kCharacterHadija)[3] = 0x7FFFFFFF;
-	LABEL_31:
-		getCharacter(kCharacterHadija).callbacks[getCharacter(kCharacterHadija).currentCall + 8] = 4;
-		HadijaCall(&LogicManager::CONS_Hadija_PeekF, 0, 0, 0, 0);
+
+	
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -747,12 +1015,16 @@ void LogicManager::CONS_Hadija_Asleep4(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Hadija_Asleep4(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		setDoor(8, kCharacterCath, 3, 10, 9);
 		getCharacter(kCharacterHadija).characterPosition.position = 4070;
 		getCharacter(kCharacterHadija).characterPosition.location = 1;
 		getCharacter(kCharacterHadija).characterPosition.car = kCarGreenSleeping;
 		endGraphics(kCharacterHadija);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -767,15 +1039,20 @@ void LogicManager::CONS_Hadija_StartPart5(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Hadija_StartPart5(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		CONS_Hadija_Prisoner(0, 0, 0, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		endGraphics(kCharacterHadija);
 		getCharacter(kCharacterHadija).characterPosition.car = kCarRestaurant;
 		getCharacter(kCharacterHadija).characterPosition.position = 3969;
 		getCharacter(kCharacterHadija).characterPosition.location = 1;
 		getCharacter(kCharacterHadija).clothes = 0;
 		getCharacter(kCharacterHadija).inventoryItem = kItemNone;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -790,8 +1067,13 @@ void LogicManager::CONS_Hadija_Prisoner(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Hadija_Prisoner(HAND_PARAMS) {
-	if (msg->action == 70549068)
+	switch (msg->action) {
+	case 70549068:
 		CONS_Hadija_Free(0, 0, 0, 0);
+		break;
+	default:
+		break;
+	}
 }
 
 void LogicManager::CONS_Hadija_Free(CONS_PARAMS) {
@@ -805,7 +1087,8 @@ void LogicManager::CONS_Hadija_Free(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Hadija_Free(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		if (getCharacterCurrentParams(kCharacterHadija)[0] ||
 			(getCharacterCurrentParams(kCharacterHadija)[0] = _gameTime + 2700, _gameTime != -2700)) {
 			if (getCharacterCurrentParams(kCharacterHadija)[0] >= _gameTime)
@@ -814,17 +1097,20 @@ void LogicManager::HAND_Hadija_Free(HAND_PARAMS) {
 		}
 
 		CONS_Hadija_Hiding(0, 0, 0, 0);
-		return;
-	}
-	if (msg->action == 12) {
+		break;
+	case 12:
 		getCharacter(kCharacterHadija).characterPosition.car = kCarGreenSleeping;
 		getCharacter(kCharacterHadija).characterPosition.position = 5000;
 		getCharacter(kCharacterHadija).characterPosition.location = 0;
-		return;
-	}
-	if (msg->action == 17 && checkLoc(kCharacterCath, kCarGreenSleeping)) {
-		CONS_Hadija_Hiding(0, 0, 0, 0);
-		return;
+		break;
+	case 17:
+		if (checkLoc(kCharacterCath, kCarGreenSleeping)) {
+			CONS_Hadija_Hiding(0, 0, 0, 0);
+		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -859,6 +1145,8 @@ void LogicManager::HAND_Hadija_Hiding(HAND_PARAMS) {
 	case 135800432:
 		CONS_Hadija_Disappear(0, 0, 0, 0);
 		break;
+	default:
+		break;
 	}
 }
 


Commit: 03f08f37321f250c188725c96bbb7cc136c1e2ce
    https://github.com/scummvm/scummvm/commit/03f08f37321f250c188725c96bbb7cc136c1e2ce
Author: AndywinXp (andywinxp at gmail.com)
Date: 2025-06-16T23:12:18+02:00

Commit Message:
LASTEXPRESS: Clean up Clerk logic

Changed paths:
    engines/lastexpress/characters/clerk.cpp


diff --git a/engines/lastexpress/characters/clerk.cpp b/engines/lastexpress/characters/clerk.cpp
index 52195a31f58..10dd70d94f6 100644
--- a/engines/lastexpress/characters/clerk.cpp
+++ b/engines/lastexpress/characters/clerk.cpp
@@ -48,7 +48,7 @@ void LogicManager::CONS_Clerk(int chapter) {
 		CONS_Clerk_StartPart5(0, 0, 0, 0);
 		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -72,11 +72,13 @@ void LogicManager::CONS_Clerk_SaveGame(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Clerk_SaveGame(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		getCharacter(kCharacterClerk).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterClerk, _functionsClerk[getCharacter(kCharacterClerk).callbacks[getCharacter(kCharacterClerk).currentCall]]);
 		fedEx(kCharacterClerk, kCharacterClerk, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		save(
 			kCharacterClerk,
 			getCharacterCurrentParams(kCharacterClerk)[0],
@@ -86,6 +88,9 @@ void LogicManager::HAND_Clerk_SaveGame(HAND_PARAMS) {
 		getCharacter(kCharacterClerk).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterClerk, _functionsClerk[getCharacter(kCharacterClerk).callbacks[getCharacter(kCharacterClerk).currentCall]]);
 		fedEx(kCharacterClerk, kCharacterClerk, 18, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -100,8 +105,13 @@ void LogicManager::CONS_Clerk_Birth(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Clerk_Birth(HAND_PARAMS) {
-	if (msg->action == 12)
+	switch (msg->action) {
+	case 12:
 		CONS_Clerk_Processing(0, 0, 0, 0);
+		break;
+	default:
+		break;
+	}
 }
 
 void LogicManager::CONS_Clerk_StartPart2(CONS_PARAMS) {
@@ -115,8 +125,13 @@ void LogicManager::CONS_Clerk_StartPart2(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Clerk_StartPart2(HAND_PARAMS) {
-	if (msg->action == 12)
+	switch (msg->action) {
+	case 12:
 		CONS_Clerk_Processing(0, 0, 0, 0);
+		break;
+	default:
+		break;
+	}
 }
 
 void LogicManager::CONS_Clerk_StartPart3(CONS_PARAMS) {
@@ -130,8 +145,13 @@ void LogicManager::CONS_Clerk_StartPart3(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Clerk_StartPart3(HAND_PARAMS) {
-	if (msg->action == 12)
+	switch (msg->action) {
+	case 12:
 		CONS_Clerk_Processing(0, 0, 0, 0);
+		break;
+	default:
+		break;
+	}
 }
 
 void LogicManager::CONS_Clerk_StartPart4(CONS_PARAMS) {
@@ -145,8 +165,13 @@ void LogicManager::CONS_Clerk_StartPart4(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Clerk_StartPart4(HAND_PARAMS) {
-	if (msg->action == 12)
+	switch (msg->action) {
+	case 12:
 		CONS_Clerk_Processing(0, 0, 0, 0);
+		break;
+	default:
+		break;
+	}
 }
 
 void LogicManager::CONS_Clerk_StartPart5(CONS_PARAMS) {
@@ -160,8 +185,13 @@ void LogicManager::CONS_Clerk_StartPart5(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Clerk_StartPart5(HAND_PARAMS) {
-	if (msg->action == 12)
+	switch (msg->action) {
+	case 12:
 		CONS_Clerk_Processing(0, 0, 0, 0);
+		break;
+	default:
+		break;
+	}
 }
 
 void LogicManager::CONS_Clerk_DoHaremKnock(CONS_PARAMS) {
@@ -178,7 +208,8 @@ void LogicManager::CONS_Clerk_DoHaremKnock(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Clerk_DoHaremKnock(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		switch (getCharacterCurrentParams(kCharacterClerk)[0]) {
 		case 5:
 			getCharacterCurrentParams(kCharacterClerk)[2] = 4840;
@@ -235,8 +266,8 @@ void LogicManager::HAND_Clerk_DoHaremKnock(HAND_PARAMS) {
 				break;
 			}
 
-			_gameProgress[55] = 1;
-			_gameProgress[56] = 1;
+			_gameProgress[kProgressFieldDC] = 1;
+			_gameProgress[kProgressFieldE0] = 1;
 		} else {
 			if (getCharacterCurrentParams(kCharacterClerk)[5] && getCharacterCurrentParams(kCharacterClerk)[6]) {
 				getCharacterParams(kCharacterClerk, 8)[5]++;
@@ -265,7 +296,7 @@ void LogicManager::HAND_Clerk_DoHaremKnock(HAND_PARAMS) {
 						getCharacterCurrentParams(kCharacterClerk)[7] = 1;
 					}
 
-					_gameProgress[56] = 1;
+					_gameProgress[kProgressFieldE0] = 1;
 
 				} else {
 					if (getCharacterCurrentParams(kCharacterClerk)[5]) {
@@ -288,7 +319,7 @@ void LogicManager::HAND_Clerk_DoHaremKnock(HAND_PARAMS) {
 								getCharacterCurrentParams(kCharacterClerk)[7] = 1;
 							}
 
-							_gameProgress[55] = 1;
+							_gameProgress[kProgressFieldDC] = 1;
 						} else {
 							if (getCharacterCurrentParams(kCharacterClerk)[6]) {
 								getCharacterParams(kCharacterClerk, 8)[3]++;
@@ -318,6 +349,10 @@ void LogicManager::HAND_Clerk_DoHaremKnock(HAND_PARAMS) {
 		getCharacter(kCharacterClerk).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterClerk, _functionsClerk[getCharacter(kCharacterClerk).callbacks[getCharacter(kCharacterClerk).currentCall]]);
 		fedEx(kCharacterClerk, kCharacterClerk, 18, 0);
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -332,311 +367,47 @@ void LogicManager::CONS_Clerk_Processing(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Clerk_Processing(HAND_PARAMS) {
-	if (msg->action > 8) {
-		if (msg->action > 12) {
-			if (msg->action > 191070912) {
-				if (msg->action > 202613084) {
-					if (msg->action > 203419131) {
-						if (msg->action > 222746496) {
-							if (msg->action == 225056224) {
-								getCharacter(kCharacterClerk).callbacks[getCharacter(kCharacterClerk).currentCall + 8] = 6;
-								ClerkCall(&LogicManager::CONS_Clerk_SaveGame, 2, 252, 0, 0);
-							} else if (msg->action == 338494260) {
-								getCharacter(kCharacterClerk).callbacks[getCharacter(kCharacterClerk).currentCall + 8] = 7;
-								ClerkCall(&LogicManager::CONS_Clerk_SaveGame, 2, 253, 0, 0);
-							}
-						} else if (msg->action == 222746496) {
-							if (msg->param.intParam) {
-								switch (msg->param.intParam) {
-								case 1:
-									getCharacterCurrentParams(kCharacterClerk)[8] = 3;
-									getCharacterCurrentParams(kCharacterClerk)[9] = 8200;
-									getCharacterCurrentParams(kCharacterClerk)[10] = 7850;
-									break;
-								case 2:
-									getCharacterCurrentParams(kCharacterClerk)[8] = 3;
-									getCharacterCurrentParams(kCharacterClerk)[9] = 7500;
-									getCharacterCurrentParams(kCharacterClerk)[10] = 7850;
-									break;
-								case 3:
-									getCharacterCurrentParams(kCharacterClerk)[8] = 3;
-									getCharacterCurrentParams(kCharacterClerk)[9] = 6470;
-									getCharacterCurrentParams(kCharacterClerk)[10] = 6130;
-									break;
-								case 4:
-									getCharacterCurrentParams(kCharacterClerk)[8] = 3;
-									getCharacterCurrentParams(kCharacterClerk)[9] = 5790;
-									getCharacterCurrentParams(kCharacterClerk)[10] = 6130;
-									break;
-								case 5:
-									getCharacterCurrentParams(kCharacterClerk)[8] = 3;
-									getCharacterCurrentParams(kCharacterClerk)[9] = 4840;
-									getCharacterCurrentParams(kCharacterClerk)[10] = 4455;
-									break;
-								case 6:
-									getCharacterCurrentParams(kCharacterClerk)[8] = 3;
-									getCharacterCurrentParams(kCharacterClerk)[9] = 4070;
-									getCharacterCurrentParams(kCharacterClerk)[10] = 4455;
-									break;
-								case 7:
-									getCharacterCurrentParams(kCharacterClerk)[8] = 3;
-									getCharacterCurrentParams(kCharacterClerk)[9] = 3050;
-									getCharacterCurrentParams(kCharacterClerk)[10] = 0;
-									break;
-								case 8:
-									getCharacterCurrentParams(kCharacterClerk)[8] = 3;
-									getCharacterCurrentParams(kCharacterClerk)[9] = 2740;
-									getCharacterCurrentParams(kCharacterClerk)[10] = 0;
-									break;
-								case kCharacterClerk:
-									getCharacterCurrentParams(kCharacterClerk)[8] = 4;
-									getCharacterCurrentParams(kCharacterClerk)[9] = 8200;
-									getCharacterCurrentParams(kCharacterClerk)[10] = 7850;
-									break;
-								case 33:
-									getCharacterCurrentParams(kCharacterClerk)[8] = 4;
-									getCharacterCurrentParams(kCharacterClerk)[9] = 7500;
-									getCharacterCurrentParams(kCharacterClerk)[10] = 7850;
-									break;
-								case 34:
-									getCharacterCurrentParams(kCharacterClerk)[8] = 4;
-									getCharacterCurrentParams(kCharacterClerk)[9] = 6470;
-									getCharacterCurrentParams(kCharacterClerk)[10] = 6130;
-									break;
-								case 35:
-									getCharacterCurrentParams(kCharacterClerk)[8] = 4;
-									getCharacterCurrentParams(kCharacterClerk)[9] = 5790;
-									getCharacterCurrentParams(kCharacterClerk)[10] = 6130;
-									break;
-								case 36:
-									getCharacterCurrentParams(kCharacterClerk)[8] = 4;
-									getCharacterCurrentParams(kCharacterClerk)[9] = 4840;
-									getCharacterCurrentParams(kCharacterClerk)[10] = 4455;
-									break;
-								case 37:
-									getCharacterCurrentParams(kCharacterClerk)[8] = 4;
-									getCharacterCurrentParams(kCharacterClerk)[9] = 4070;
-									getCharacterCurrentParams(kCharacterClerk)[10] = 4455;
-									break;
-								case 38:
-									getCharacterCurrentParams(kCharacterClerk)[8] = 4;
-									getCharacterCurrentParams(kCharacterClerk)[9] = 3050;
-									getCharacterCurrentParams(kCharacterClerk)[10] = 0;
-									break;
-								case 39:
-									getCharacterCurrentParams(kCharacterClerk)[8] = 4;
-									getCharacterCurrentParams(kCharacterClerk)[9] = 2740;
-									getCharacterCurrentParams(kCharacterClerk)[10] = 0;
-									break;
-								default:
-									return;
-								}
-							}
-						} else if (msg->action == 203863200 && msg->param.stringParam) {
-							getCharacterCurrentParams(kCharacterClerk)[7] = 1;
-							Common::strcpy_s((char *)&getCharacterCurrentParams(kCharacterClerk)[11], 12, msg->param.stringParam);
-						}
-					} else if (msg->action == 203419131) {
-						if (!getCharacterCurrentParams(kCharacterClerk)[2]) {
-							getCharacterCurrentParams(kCharacterClerk)[2] = 1;
-							getCharacterCurrentParams(kCharacterClerk)[0] = 0;
-							send(kCharacterClerk, kCharacterClerk, 17, 0);
-						}
-					} else if (msg->action == 203339360) {
-						if (getCharacterCurrentParams(kCharacterClerk)[6]) {
-							getCharacter(kCharacterClerk).callbacks[getCharacter(kCharacterClerk).currentCall + 8] = 5;
-							ClerkCall(&LogicManager::CONS_Clerk_SaveGame, 2, 148, 0, 0);
+	switch (msg->action) {
+	case 0: {
+		if (cathInCorridor(kCarGreenSleeping) || cathInCorridor(kCarRedSleeping)) {
+			if (getCharacterCurrentParams(kCharacterClerk)[3]) {
+				if (!getCharacterCurrentParams(kCharacterClerk)[4]) {
+					getCharacterCurrentParams(kCharacterClerk)[3]--;
+
+					if (!getCharacterCurrentParams(kCharacterClerk)[3] && _gameProgress[kProgressJacket] == 2) {
+						if (isNight()) {
+							playNIS(kEventCathSmokeNight);
 						} else {
-							getCharacterCurrentParams(kCharacterClerk)[6] = 1;
-							playNIS(kEventLocomotiveConductorsLook);
-							bumpCath(kCarCoalTender, 2, 255);
-						}
-					}
-				} else if (msg->action == 202613084) {
-					getCharacter(kCharacterClerk).callbacks[getCharacter(kCharacterClerk).currentCall + 8] = 8;
-					ClerkCall(&LogicManager::CONS_Clerk_SaveGame, 2, 259, 0, 0);
-				} else if (msg->action == 191350523) {
-					getCharacterCurrentParams(kCharacterClerk)[2] = 0;
-					endGraphics(kCharacterClerk);
-				}
-			} else {
-				switch (msg->action) {
-				case 191070912:
-					getCharacterParams(kCharacterClerk, 8)[6] = msg->param.intParam;
-					break;
-				case 17:
-					getCharacter(kCharacterClerk).characterPosition.car = getCharacter(kCharacterCath).characterPosition.car;
-					if (checkCathDir(kCarRestaurant, 81)) {
-						getCharacterCurrentParams(kCharacterClerk)[5] = 1;
-						if (!dialogRunning("ZFX1001"))
-							playDialog(0, "ZFX1001", -1, 0);
-					} else {
-						getCharacterCurrentParams(kCharacterClerk)[5] = 0;
-						if (cathRunningDialog("ZFX1001"))
-							endDialog("ZFX1001");
-					}
-					if ((getCharacterCurrentParams(kCharacterClerk)[2] && (getCharacter(kCharacterCath).characterPosition.car != getCharacterCurrentParams(kCharacterClerk)[0]) ||
-						(isNight() != (getCharacterCurrentParams(kCharacterClerk)[1] != 0 ? true : false)))) {
-						switch (getCharacter(kCharacterCath).characterPosition.car) {
-						case 1:
-						case 6:
-							if (_gameProgress[kProgressIsDayTime]) {
-								startCycOtis(kCharacterClerk, "B1WNM");
-							} else if (isNight()) {
-								startCycOtis(kCharacterClerk, "B1WNN");
-							} else {
-								startCycOtis(kCharacterClerk, "B1WND");
-							}
-							break;
-						case 3:
-						case 4:
-							if (_gameProgress[kProgressIsDayTime]) {
-								startCycOtis(kCharacterClerk, "S1WNM");
-							} else if (isNight()) {
-								startCycOtis(kCharacterClerk, "S1WNN");
-							} else {
-								startCycOtis(kCharacterClerk, "S1WND");
-							}
-							break;
-						case 5:
-							if (_gameProgress[kProgressIsDayTime]) {
-								startCycOtis(kCharacterClerk, "RCWNM");
-							} else if (isNight()) {
-								startCycOtis(kCharacterClerk, "RCWNN");
-							} else {
-								startCycOtis(kCharacterClerk, "RCWND");
-							}
-							break;
-						default:
-							endGraphics(kCharacterClerk);
-							break;
+							playNIS(kEventCathSmokeDay);
 						}
-						getCharacterCurrentParams(kCharacterClerk)[0] = getCharacter(kCharacterCath).characterPosition.car;
-						getCharacterCurrentParams(kCharacterClerk)[1] = isNight();
-					}
-
-					if (!getCharacterCurrentParams(kCharacterClerk)[4]) {
-						getCharacterCurrentParams(kCharacterClerk)[3] = 2700;
-						getCharacterCurrentParams(kCharacterClerk)[4] = 0;
-					}
 
-					if (_gameProgress[kProgressJacket] != 1)
-						goto LABEL_105;
-					if (checkCathDir(kCarRedSleeping, 18)) {
-						getCharacter(kCharacterClerk).callbacks[getCharacter(kCharacterClerk).currentCall + 8] = 1;
-						ClerkCall(&LogicManager::CONS_Clerk_SaveGame, 2, 123, 0, 0);
-						return;
-					}
-					if (checkCathDir(kCarGreenSleeping, 22)) {
-						getCharacter(kCharacterClerk).callbacks[getCharacter(kCharacterClerk).currentCall + 8] = 2;
-						ClerkCall(&LogicManager::CONS_Clerk_SaveGame, 2, 123, 0, 0);
-					} else {
-					LABEL_105:
-						if (getCharacterCurrentParams(kCharacterClerk)[7] && !inComp(kCharacterCath, getCharacterCurrentParams(kCharacterClerk)[8], getCharacterCurrentParams(kCharacterClerk)[9]) && !inComp(kCharacterCath, getCharacterCurrentParams(kCharacterClerk)[8], getCharacterCurrentParams(kCharacterClerk)[10])) {
-							if (dialogRunning((char *)&getCharacterCurrentParams(kCharacterClerk)[11]))
-								fadeDialog((char *)&getCharacterCurrentParams(kCharacterClerk)[11]);
-							getCharacterCurrentParams(kCharacterClerk)[7] = 0;
-						}
-					}
-					break;
-				case 18:
-					switch (getCharacter(kCharacterClerk).callbacks[getCharacter(kCharacterClerk).currentCall + 8]) {
-					case 1:
-						playNIS(kEventCoudertBloodJacket);
-						goto LABEL_104;
-					case 2:
-						playNIS(kEventMertensBloodJacket);
-					LABEL_104:
-						endGame(0, 1, 55, true);
-						goto LABEL_105;
-					case 5:
-						playNIS(kEventLocomotiveConductorsDiscovered);
-						endGame(0, 1, 63, true);
-						return;
-					case 6:
-						playNIS(kEventCathBreakCeiling);
-						setDoor(73, 0, 2, 255, 255);
+						getCharacterCurrentParams(kCharacterClerk)[4] = 1;
 						cleanNIS();
-						return;
-					case 7:
-						playNIS(kEventCathJumpDownCeiling);
-						bumpCath(kCarKronos, 89, 255);
-						return;
-					case 8:
-						playNIS(kEventCloseMatchbox);
-						bumpCath(kCarRestaurant, 51, 255);
-						return;
-					default:
-						return;
 					}
 				}
 			}
-		} else if (msg->action == 12) {
-			getCharacterCurrentParams(kCharacterClerk)[2] = 1;
-			if (_gameProgress[11] < 5) {
-				setDoor(5, kCharacterClerk, 3, 10, 9);
-				setDoor(6, kCharacterClerk, 3, 10, 9);
-				setDoor(7, kCharacterClerk, 3, 10, 9);
-				setDoor(8, kCharacterClerk, 3, 10, 9);
-			}
-
-			getCharacter(kCharacterClerk).characterPosition.position = 30000;
-		} else if (msg->action == 9) {
-			if (msg->param.intParam == 5 || msg->param.intParam == 6 || msg->param.intParam == 7 || msg->param.intParam == 8) {
-				getCharacter(kCharacterClerk).callbacks[getCharacter(kCharacterClerk).currentCall + 8] = 4;
-				ClerkCall(&LogicManager::CONS_Clerk_DoHaremKnock, msg->param.intParam, 9, 0, 0);
-			}
 		}
-	} else {
-		if (msg->action != 8) {
-			if (msg->action)
-				return;
-
-			if (cathInCorridor(kCarGreenSleeping) || cathInCorridor(kCarRedSleeping)) {
-				if (getCharacterCurrentParams(kCharacterClerk)[3]) {
-					if (!getCharacterCurrentParams(kCharacterClerk)[4]) {
-						getCharacterCurrentParams(kCharacterClerk)[3]--;
-
-						if (!getCharacterCurrentParams(kCharacterClerk)[3] && _gameProgress[kProgressJacket] == 2) {
-							if (isNight()) {
-								playNIS(kEventCathSmokeNight);
-							} else {
-								playNIS(kEventCathSmokeDay);
-							}
 
-							getCharacterCurrentParams(kCharacterClerk)[4] = 1;
-							cleanNIS();
-						}
-					}
-				}
-			}
+		// Horrible way to unroll a goto...
+		bool skip = false;
 
-			if (getCharacterCurrentParams(kCharacterClerk)[5]) {
-				if (getCharacterCurrentParams(kCharacterClerk)[14] || (getCharacterCurrentParams(kCharacterClerk)[14] = _gameTime + 900, (_gameTime != -900))) {
-					if (getCharacterCurrentParams(kCharacterClerk)[14] >= _gameTime)
-						goto LABEL_43;
+		if (getCharacterCurrentParams(kCharacterClerk)[5]) {
+			if (getCharacterCurrentParams(kCharacterClerk)[14] || (getCharacterCurrentParams(kCharacterClerk)[14] = _gameTime + 900, (_gameTime != -900))) {
+				if (getCharacterCurrentParams(kCharacterClerk)[14] >= _gameTime)
+					skip = true;
 
+				if (!skip)
 					getCharacterCurrentParams(kCharacterClerk)[14] = 0x7FFFFFFF;
-				}
+			}
 
+			if (!skip)
 				bumpCath(kCarRestaurant, 58, 255);
-			}
+		}
 
+		if (!skip)
 			getCharacterCurrentParams(kCharacterClerk)[14] = 0;
-		LABEL_43:
-			if (!getCharacterCurrentParams(kCharacterClerk)[6])
-				goto LABEL_49;
-
-			if (getCharacterCurrentParams(kCharacterClerk)[15] || (getCharacterCurrentParams(kCharacterClerk)[15] = _gameTime + 4500, (_gameTime != -4500))) {
-				if (getCharacterCurrentParams(kCharacterClerk)[15] >= _gameTime)
-					goto LABEL_49;
 
-				getCharacterCurrentParams(kCharacterClerk)[15] = 0x7FFFFFFF;
-			}
-
-			getCharacterCurrentParams(kCharacterClerk)[6] = 0;
-			getCharacterCurrentParams(kCharacterClerk)[15] = 0;
-		LABEL_49:
+		if (!getCharacterCurrentParams(kCharacterClerk)[6]) {
 			if (getCharacterParams(kCharacterClerk, 8)[7] && !whoRunningDialog(kCharacterTableF)) {
 				setDoor(
 					getCharacterParams(kCharacterClerk, 8)[7],
@@ -645,6 +416,7 @@ void LogicManager::HAND_Clerk_Processing(HAND_PARAMS) {
 					10,
 					9
 				);
+
 				getCharacterParams(kCharacterClerk, 8)[7] = 0;
 			}
 
@@ -653,13 +425,356 @@ void LogicManager::HAND_Clerk_Processing(HAND_PARAMS) {
 					playDialog(0, "ZFX1001", -1, 0);
 			}
 
-			return;
+			break;
+		}
+
+		if (getCharacterCurrentParams(kCharacterClerk)[15] || (getCharacterCurrentParams(kCharacterClerk)[15] = _gameTime + 4500, (_gameTime != -4500))) {
+			if (getCharacterCurrentParams(kCharacterClerk)[15] >= _gameTime) {
+				if (getCharacterParams(kCharacterClerk, 8)[7] && !whoRunningDialog(kCharacterTableF)) {
+					setDoor(
+						getCharacterParams(kCharacterClerk, 8)[7],
+						_gameObjects[getCharacterParams(kCharacterClerk, 8)[7]].character,
+						3,
+						10,
+						9
+					);
+
+					getCharacterParams(kCharacterClerk, 8)[7] = 0;
+				}
+
+				if (getCharacterCurrentParams(kCharacterClerk)[5]) {
+					if (!cathRunningDialog("ZFX1001"))
+						playDialog(0, "ZFX1001", -1, 0);
+				}
+
+				break;
+			}
+
+			getCharacterCurrentParams(kCharacterClerk)[15] = 0x7FFFFFFF;
 		}
 
+		getCharacterCurrentParams(kCharacterClerk)[6] = 0;
+		getCharacterCurrentParams(kCharacterClerk)[15] = 0;
+
+		if (getCharacterParams(kCharacterClerk, 8)[7] && !whoRunningDialog(kCharacterTableF)) {
+			setDoor(
+				getCharacterParams(kCharacterClerk, 8)[7],
+				_gameObjects[getCharacterParams(kCharacterClerk, 8)[7]].character,
+				3,
+				10,
+				9);
+
+			getCharacterParams(kCharacterClerk, 8)[7] = 0;
+		}
+
+		if (getCharacterCurrentParams(kCharacterClerk)[5]) {
+			if (!cathRunningDialog("ZFX1001"))
+				playDialog(0, "ZFX1001", -1, 0);
+		}
+
+		break;
+	}
+	case 8:
 		if (msg->param.intParam == 5 || msg->param.intParam == 6 || msg->param.intParam == 7 || msg->param.intParam == 8) {
 			getCharacter(kCharacterClerk).callbacks[getCharacter(kCharacterClerk).currentCall + 8] = 3;
 			ClerkCall(&LogicManager::CONS_Clerk_DoHaremKnock, msg->param.intParam, 8, 0, 0);
 		}
+
+		break;
+	case 9:
+		if (msg->param.intParam == 5 || msg->param.intParam == 6 || msg->param.intParam == 7 || msg->param.intParam == 8) {
+			getCharacter(kCharacterClerk).callbacks[getCharacter(kCharacterClerk).currentCall + 8] = 4;
+			ClerkCall(&LogicManager::CONS_Clerk_DoHaremKnock, msg->param.intParam, 9, 0, 0);
+		}
+
+		break;
+	case 12:
+		getCharacterCurrentParams(kCharacterClerk)[2] = 1;
+		if (_gameProgress[kProgressChapter] < 5) {
+			setDoor(5, kCharacterClerk, 3, 10, 9);
+			setDoor(6, kCharacterClerk, 3, 10, 9);
+			setDoor(7, kCharacterClerk, 3, 10, 9);
+			setDoor(8, kCharacterClerk, 3, 10, 9);
+		}
+
+		getCharacter(kCharacterClerk).characterPosition.position = 30000;
+		break;
+	case 17:
+		getCharacter(kCharacterClerk).characterPosition.car = getCharacter(kCharacterCath).characterPosition.car;
+
+		if (checkCathDir(kCarRestaurant, 81)) {
+			getCharacterCurrentParams(kCharacterClerk)[5] = 1;
+			if (!dialogRunning("ZFX1001"))
+				playDialog(0, "ZFX1001", -1, 0);
+		} else {
+			getCharacterCurrentParams(kCharacterClerk)[5] = 0;
+			if (cathRunningDialog("ZFX1001"))
+				endDialog("ZFX1001");
+		}
+
+		if ((getCharacterCurrentParams(kCharacterClerk)[2] && (getCharacter(kCharacterCath).characterPosition.car != getCharacterCurrentParams(kCharacterClerk)[0]) ||
+			 (isNight() != (getCharacterCurrentParams(kCharacterClerk)[1] != 0 ? true : false)))) {
+
+			switch (getCharacter(kCharacterCath).characterPosition.car) {
+			case 1:
+			case 6:
+				if (_gameProgress[kProgressIsDayTime]) {
+					startCycOtis(kCharacterClerk, "B1WNM");
+				} else if (isNight()) {
+					startCycOtis(kCharacterClerk, "B1WNN");
+				} else {
+					startCycOtis(kCharacterClerk, "B1WND");
+				}
+
+				break;
+			case 3:
+			case 4:
+				if (_gameProgress[kProgressIsDayTime]) {
+					startCycOtis(kCharacterClerk, "S1WNM");
+				} else if (isNight()) {
+					startCycOtis(kCharacterClerk, "S1WNN");
+				} else {
+					startCycOtis(kCharacterClerk, "S1WND");
+				}
+
+				break;
+			case 5:
+				if (_gameProgress[kProgressIsDayTime]) {
+					startCycOtis(kCharacterClerk, "RCWNM");
+				} else if (isNight()) {
+					startCycOtis(kCharacterClerk, "RCWNN");
+				} else {
+					startCycOtis(kCharacterClerk, "RCWND");
+				}
+
+				break;
+			default:
+				endGraphics(kCharacterClerk);
+				break;
+			}
+
+			getCharacterCurrentParams(kCharacterClerk)[0] = getCharacter(kCharacterCath).characterPosition.car;
+			getCharacterCurrentParams(kCharacterClerk)[1] = isNight();
+		}
+
+		if (!getCharacterCurrentParams(kCharacterClerk)[4]) {
+			getCharacterCurrentParams(kCharacterClerk)[3] = 2700;
+			getCharacterCurrentParams(kCharacterClerk)[4] = 0;
+		}
+
+		if (_gameProgress[kProgressJacket] != 1) {
+			if (getCharacterCurrentParams(kCharacterClerk)[7] && !inComp(kCharacterCath, getCharacterCurrentParams(kCharacterClerk)[8], getCharacterCurrentParams(kCharacterClerk)[9]) && !inComp(kCharacterCath, getCharacterCurrentParams(kCharacterClerk)[8], getCharacterCurrentParams(kCharacterClerk)[10])) {
+				if (dialogRunning((char *)&getCharacterCurrentParams(kCharacterClerk)[11]))
+					fadeDialog((char *)&getCharacterCurrentParams(kCharacterClerk)[11]);
+				getCharacterCurrentParams(kCharacterClerk)[7] = 0;
+			}
+
+			break;
+		}
+
+		if (checkCathDir(kCarRedSleeping, 18)) {
+			getCharacter(kCharacterClerk).callbacks[getCharacter(kCharacterClerk).currentCall + 8] = 1;
+			ClerkCall(&LogicManager::CONS_Clerk_SaveGame, 2, kEventMertensBloodJacket, 0, 0);
+			break;
+		}
+
+		if (checkCathDir(kCarGreenSleeping, 22)) {
+			getCharacter(kCharacterClerk).callbacks[getCharacter(kCharacterClerk).currentCall + 8] = 2;
+			ClerkCall(&LogicManager::CONS_Clerk_SaveGame, 2, kEventMertensBloodJacket, 0, 0);
+		} else {
+			if (getCharacterCurrentParams(kCharacterClerk)[7] && !inComp(kCharacterCath, getCharacterCurrentParams(kCharacterClerk)[8], getCharacterCurrentParams(kCharacterClerk)[9]) && !inComp(kCharacterCath, getCharacterCurrentParams(kCharacterClerk)[8], getCharacterCurrentParams(kCharacterClerk)[10])) {
+				if (dialogRunning((char *)&getCharacterCurrentParams(kCharacterClerk)[11]))
+					fadeDialog((char *)&getCharacterCurrentParams(kCharacterClerk)[11]);
+
+				getCharacterCurrentParams(kCharacterClerk)[7] = 0;
+			}
+		}
+
+		break;
+	case 18:
+		switch (getCharacter(kCharacterClerk).callbacks[getCharacter(kCharacterClerk).currentCall + 8]) {
+		case 1:
+			playNIS(kEventCoudertBloodJacket);
+			endGame(0, 1, 55, true);
+
+			if (getCharacterCurrentParams(kCharacterClerk)[7] && !inComp(kCharacterCath, getCharacterCurrentParams(kCharacterClerk)[8], getCharacterCurrentParams(kCharacterClerk)[9]) && !inComp(kCharacterCath, getCharacterCurrentParams(kCharacterClerk)[8], getCharacterCurrentParams(kCharacterClerk)[10])) {
+				if (dialogRunning((char *)&getCharacterCurrentParams(kCharacterClerk)[11]))
+					fadeDialog((char *)&getCharacterCurrentParams(kCharacterClerk)[11]);
+
+				getCharacterCurrentParams(kCharacterClerk)[7] = 0;
+			}
+
+			break;
+		case 2:
+			playNIS(kEventMertensBloodJacket);
+			endGame(0, 1, 55, true);
+
+			if (getCharacterCurrentParams(kCharacterClerk)[7] && !inComp(kCharacterCath, getCharacterCurrentParams(kCharacterClerk)[8], getCharacterCurrentParams(kCharacterClerk)[9]) && !inComp(kCharacterCath, getCharacterCurrentParams(kCharacterClerk)[8], getCharacterCurrentParams(kCharacterClerk)[10])) {
+				if (dialogRunning((char *)&getCharacterCurrentParams(kCharacterClerk)[11]))
+					fadeDialog((char *)&getCharacterCurrentParams(kCharacterClerk)[11]);
+
+				getCharacterCurrentParams(kCharacterClerk)[7] = 0;
+			}
+
+			break;
+		case 5:
+			playNIS(kEventLocomotiveConductorsDiscovered);
+			endGame(0, 1, 63, true);
+			break;
+		case 6:
+			playNIS(kEventCathBreakCeiling);
+			setDoor(73, kCharacterCath, 2, 255, 255);
+			cleanNIS();
+			break;
+		case 7:
+			playNIS(kEventCathJumpDownCeiling);
+			bumpCath(kCarKronos, 89, 255);
+			break;
+		case 8:
+			playNIS(kEventCloseMatchbox);
+			bumpCath(kCarRestaurant, 51, 255);
+			break;
+		default:
+			break;
+		}
+
+		break;
+	case 191070912:
+		getCharacterParams(kCharacterClerk, 8)[6] = msg->param.intParam;
+		break;
+	case 191350523:
+		getCharacterCurrentParams(kCharacterClerk)[2] = 0;
+		endGraphics(kCharacterClerk);
+		break;
+	case 202613084:
+		getCharacter(kCharacterClerk).callbacks[getCharacter(kCharacterClerk).currentCall + 8] = 8;
+		ClerkCall(&LogicManager::CONS_Clerk_SaveGame, 2, kEventCloseMatchbox, 0, 0);
+		break;
+	case 222746496:
+		if (msg->param.intParam) {
+			switch (msg->param.intParam) {
+			case 1:
+				getCharacterCurrentParams(kCharacterClerk)[8] = 3;
+				getCharacterCurrentParams(kCharacterClerk)[9] = 8200;
+				getCharacterCurrentParams(kCharacterClerk)[10] = 7850;
+				break;
+			case 2:
+				getCharacterCurrentParams(kCharacterClerk)[8] = 3;
+				getCharacterCurrentParams(kCharacterClerk)[9] = 7500;
+				getCharacterCurrentParams(kCharacterClerk)[10] = 7850;
+				break;
+			case 3:
+				getCharacterCurrentParams(kCharacterClerk)[8] = 3;
+				getCharacterCurrentParams(kCharacterClerk)[9] = 6470;
+				getCharacterCurrentParams(kCharacterClerk)[10] = 6130;
+				break;
+			case 4:
+				getCharacterCurrentParams(kCharacterClerk)[8] = 3;
+				getCharacterCurrentParams(kCharacterClerk)[9] = 5790;
+				getCharacterCurrentParams(kCharacterClerk)[10] = 6130;
+				break;
+			case 5:
+				getCharacterCurrentParams(kCharacterClerk)[8] = 3;
+				getCharacterCurrentParams(kCharacterClerk)[9] = 4840;
+				getCharacterCurrentParams(kCharacterClerk)[10] = 4455;
+				break;
+			case 6:
+				getCharacterCurrentParams(kCharacterClerk)[8] = 3;
+				getCharacterCurrentParams(kCharacterClerk)[9] = 4070;
+				getCharacterCurrentParams(kCharacterClerk)[10] = 4455;
+				break;
+			case 7:
+				getCharacterCurrentParams(kCharacterClerk)[8] = 3;
+				getCharacterCurrentParams(kCharacterClerk)[9] = 3050;
+				getCharacterCurrentParams(kCharacterClerk)[10] = 0;
+				break;
+			case 8:
+				getCharacterCurrentParams(kCharacterClerk)[8] = 3;
+				getCharacterCurrentParams(kCharacterClerk)[9] = 2740;
+				getCharacterCurrentParams(kCharacterClerk)[10] = 0;
+				break;
+			case 32:
+				getCharacterCurrentParams(kCharacterClerk)[8] = 4;
+				getCharacterCurrentParams(kCharacterClerk)[9] = 8200;
+				getCharacterCurrentParams(kCharacterClerk)[10] = 7850;
+				break;
+			case 33:
+				getCharacterCurrentParams(kCharacterClerk)[8] = 4;
+				getCharacterCurrentParams(kCharacterClerk)[9] = 7500;
+				getCharacterCurrentParams(kCharacterClerk)[10] = 7850;
+				break;
+			case 34:
+				getCharacterCurrentParams(kCharacterClerk)[8] = 4;
+				getCharacterCurrentParams(kCharacterClerk)[9] = 6470;
+				getCharacterCurrentParams(kCharacterClerk)[10] = 6130;
+				break;
+			case 35:
+				getCharacterCurrentParams(kCharacterClerk)[8] = 4;
+				getCharacterCurrentParams(kCharacterClerk)[9] = 5790;
+				getCharacterCurrentParams(kCharacterClerk)[10] = 6130;
+				break;
+			case 36:
+				getCharacterCurrentParams(kCharacterClerk)[8] = 4;
+				getCharacterCurrentParams(kCharacterClerk)[9] = 4840;
+				getCharacterCurrentParams(kCharacterClerk)[10] = 4455;
+				break;
+			case 37:
+				getCharacterCurrentParams(kCharacterClerk)[8] = 4;
+				getCharacterCurrentParams(kCharacterClerk)[9] = 4070;
+				getCharacterCurrentParams(kCharacterClerk)[10] = 4455;
+				break;
+			case 38:
+				getCharacterCurrentParams(kCharacterClerk)[8] = 4;
+				getCharacterCurrentParams(kCharacterClerk)[9] = 3050;
+				getCharacterCurrentParams(kCharacterClerk)[10] = 0;
+				break;
+			case 39:
+				getCharacterCurrentParams(kCharacterClerk)[8] = 4;
+				getCharacterCurrentParams(kCharacterClerk)[9] = 2740;
+				getCharacterCurrentParams(kCharacterClerk)[10] = 0;
+				break;
+			default:
+				break;
+			}
+		}
+
+		break;
+	case 203339360:
+		if (getCharacterCurrentParams(kCharacterClerk)[6]) {
+			getCharacter(kCharacterClerk).callbacks[getCharacter(kCharacterClerk).currentCall + 8] = 5;
+			ClerkCall(&LogicManager::CONS_Clerk_SaveGame, 2, kEventLocomotiveConductorsDiscovered, 0, 0);
+		} else {
+			getCharacterCurrentParams(kCharacterClerk)[6] = 1;
+			playNIS(kEventLocomotiveConductorsLook);
+			bumpCath(kCarCoalTender, 2, 255);
+		}
+
+		break;
+	case 203419131:
+		if (!getCharacterCurrentParams(kCharacterClerk)[2]) {
+			getCharacterCurrentParams(kCharacterClerk)[2] = 1;
+			getCharacterCurrentParams(kCharacterClerk)[0] = 0;
+			send(kCharacterClerk, kCharacterClerk, 17, 0);
+		}
+
+		break;
+	case 203863200:
+		if (msg->param.stringParam) {
+			getCharacterCurrentParams(kCharacterClerk)[7] = 1;
+			Common::strcpy_s((char *)&getCharacterCurrentParams(kCharacterClerk)[11], 12, msg->param.stringParam);
+		}
+
+		break;
+	case 225056224:
+		getCharacter(kCharacterClerk).callbacks[getCharacter(kCharacterClerk).currentCall + 8] = 6;
+		ClerkCall(&LogicManager::CONS_Clerk_SaveGame, 2, kEventCathBreakCeiling, 0, 0);
+		break;
+	case 338494260:
+		getCharacter(kCharacterClerk).callbacks[getCharacter(kCharacterClerk).currentCall + 8] = 7;
+		ClerkCall(&LogicManager::CONS_Clerk_SaveGame, 2, kEventCathJumpDownCeiling, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 


Commit: 66c968f5daf3e5aa35541bec0b9713f15e3db4bf
    https://github.com/scummvm/scummvm/commit/66c968f5daf3e5aa35541bec0b9713f15e3db4bf
Author: AndywinXp (andywinxp at gmail.com)
Date: 2025-06-16T23:12:18+02:00

Commit Message:
LASTEXPRESS: Clean up Max logic

Changed paths:
    engines/lastexpress/characters/max.cpp


diff --git a/engines/lastexpress/characters/max.cpp b/engines/lastexpress/characters/max.cpp
index 311c65f70b1..122c00f8286 100644
--- a/engines/lastexpress/characters/max.cpp
+++ b/engines/lastexpress/characters/max.cpp
@@ -69,19 +69,25 @@ void LogicManager::CONS_Max_DebugWalks(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Max_DebugWalks(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			getCharacter(kCharacterMax).characterPosition.position = 0;
-			getCharacter(kCharacterMax).characterPosition.location = 0;
-			getCharacter(kCharacterMax).characterPosition.car = kCarGreenSleeping;
-			getCharacterCurrentParams(kCharacterMax)[0] = 10000;
-		}
-	} else if (walk(kCharacterMax, kCarGreenSleeping, getCharacterCurrentParams(kCharacterMax)[0])) {
-		if (getCharacterCurrentParams(kCharacterMax)[0] == 10000) {
-			getCharacterCurrentParams(kCharacterMax)[0] = 0;
-		} else {
-			getCharacterCurrentParams(kCharacterMax)[0] = 10000;
+	switch (msg->action) {
+	case 0:
+		if (walk(kCharacterMax, kCarGreenSleeping, getCharacterCurrentParams(kCharacterMax)[0])) {
+			if (getCharacterCurrentParams(kCharacterMax)[0] == 10000) {
+				getCharacterCurrentParams(kCharacterMax)[0] = 0;
+			} else {
+				getCharacterCurrentParams(kCharacterMax)[0] = 10000;
+			}
 		}
+
+		break;
+	case 12:
+		getCharacter(kCharacterMax).characterPosition.position = 0;
+		getCharacter(kCharacterMax).characterPosition.location = 0;
+		getCharacter(kCharacterMax).characterPosition.car = kCarGreenSleeping;
+		getCharacterCurrentParams(kCharacterMax)[0] = 10000;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -98,12 +104,17 @@ void LogicManager::CONS_Max_DoDialog(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Max_DoDialog(HAND_PARAMS) {
-	if (msg->action == 2) {
+	switch (msg->action) {
+	case 2:
 		getCharacter(kCharacterMax).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterMax, _functionsMax[getCharacter(kCharacterMax).callbacks[getCharacter(kCharacterMax).currentCall]]);
 		fedEx(kCharacterMax, kCharacterMax, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		playDialog(kCharacterMax, (char *)&getCharacterCurrentParams(kCharacterMax)[0], -1, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -120,12 +131,17 @@ void LogicManager::CONS_Max_DoSeqOtis(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Max_DoSeqOtis(HAND_PARAMS) {
-	if (msg->action == 2) {
+	switch (msg->action) {
+	case 2:
 		getCharacter(kCharacterMax).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterMax, _functionsMax[getCharacter(kCharacterMax).callbacks[getCharacter(kCharacterMax).currentCall]]);
 		fedEx(kCharacterMax, kCharacterMax, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		startSeqOtis(kCharacterMax, (char *)&getCharacterCurrentParams(kCharacterMax)[0]);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -144,14 +160,19 @@ void LogicManager::CONS_Max_DoCorrOtis(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Max_DoCorrOtis(HAND_PARAMS) {
-	if (msg->action == 3) {
+	switch (msg->action) {
+	case 3:
 		releaseAtDoor(kCharacterMax, getCharacterCurrentParams(kCharacterMax)[3]);
 		getCharacter(kCharacterMax).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterMax, _functionsMax[getCharacter(kCharacterMax).callbacks[getCharacter(kCharacterMax).currentCall]]);
 		fedEx(kCharacterMax, kCharacterMax, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		startSeqOtis(kCharacterMax, (char *)&getCharacterCurrentParams(kCharacterMax)[0]);
 		blockAtDoor(kCharacterMax, getCharacterCurrentParams(kCharacterMax)[3]);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -169,19 +190,25 @@ void LogicManager::CONS_Max_SaveGame(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Max_SaveGame(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		getCharacter(kCharacterMax).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterMax, _functionsMax[getCharacter(kCharacterMax).callbacks[getCharacter(kCharacterMax).currentCall]]);
 		fedEx(kCharacterMax, kCharacterMax, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		save(
 			kCharacterMax,
 			getCharacterCurrentParams(kCharacterMax)[0],
-			getCharacterCurrentParams(kCharacterMax)[1]);
+			getCharacterCurrentParams(kCharacterMax)[1]
+		);
 
 		getCharacter(kCharacterMax).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterMax, _functionsMax[getCharacter(kCharacterMax).callbacks[getCharacter(kCharacterMax).currentCall]]);
 		fedEx(kCharacterMax, kCharacterMax, 18, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -196,22 +223,11 @@ void LogicManager::CONS_Max_WithAnna(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Max_WithAnna(HAND_PARAMS) {
-	if (msg->action > 12) {
-		if (msg->action != 18) {
-			if (msg->action == 71277948) {
-				getCharacter(kCharacterMax).callbacks[getCharacter(kCharacterMax).currentCall + 8] = 1;
-				MaxCall(&LogicManager::CONS_Max_GuardingComp, 0, 0, 0, 0);
-			} else if (msg->action == 158007856 && !whoRunningDialog(kCharacterMax)) {
-				playDialog(kCharacterMax, "Max1122", -1, 0);
-				getCharacterCurrentParams(kCharacterMax)[0] = 225 * (4 * rnd(20) + 40);
-			}
-		}
-	} else if (msg->action == 12) {
-		getCharacterCurrentParams(kCharacterMax)[0] = 225 * (4 * rnd(20) + 40);
-	} else if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		if (getCharacterCurrentParams(kCharacterMax)[1] || (getCharacterCurrentParams(kCharacterMax)[1] = _gameTime + getCharacterCurrentParams(kCharacterMax)[0], _gameTime + getCharacterCurrentParams(kCharacterMax)[0] != 0)) {
 			if (getCharacterCurrentParams(kCharacterMax)[1] >= _gameTime)
-				return;
+				break;
 
 			getCharacterCurrentParams(kCharacterMax)[1] = 0x7FFFFFFF;
 		}
@@ -221,6 +237,25 @@ void LogicManager::HAND_Max_WithAnna(HAND_PARAMS) {
 
 		getCharacterCurrentParams(kCharacterMax)[0] = 225 * (4 * rnd(20) + 40);
 		getCharacterCurrentParams(kCharacterMax)[1] = 0;
+		break;
+	case 12:
+		getCharacterCurrentParams(kCharacterMax)[0] = 225 * (4 * rnd(20) + 40);
+		break;
+	case 18:
+		break;
+	case 71277948:
+		getCharacter(kCharacterMax).callbacks[getCharacter(kCharacterMax).currentCall + 8] = 1;
+		MaxCall(&LogicManager::CONS_Max_GuardingComp, 0, 0, 0, 0);
+		break;
+	case 158007856:
+		if (!whoRunningDialog(kCharacterMax)) {
+			playDialog(kCharacterMax, "Max1122", -1, 0);
+			getCharacterCurrentParams(kCharacterMax)[0] = 225 * (4 * rnd(20) + 40);
+		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -235,53 +270,29 @@ void LogicManager::CONS_Max_GuardingComp(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Max_GuardingComp(HAND_PARAMS) {
-	if (msg->action > 9) {
-		if (msg->action > 17) {
-			if (msg->action > 101687594) {
-				if (msg->action == 122358304 || msg->action == 135204609) {
-					send(kCharacterMax, kCharacterMax, 135204609, 0);
-					setDoor(37, kCharacterCath, 0, 10, 9);
-					setDoor(53, kCharacterCath, 0, 10, 9);
-					getCharacter(kCharacterMax).currentCall--;
-					_engine->getMessageManager()->setMessageHandle(kCharacterMax, _functionsMax[getCharacter(kCharacterMax).callbacks[getCharacter(kCharacterMax).currentCall]]);
-					fedEx(kCharacterMax, kCharacterMax, 18, 0);
-				} else if (msg->action == 158007856 && !whoRunningDialog(kCharacterMax)) {
-					playDialog(kCharacterMax, "Max1122", -1, 0);
-					getCharacterCurrentParams(kCharacterMax)[0] = 225 * (4 * rnd(20) + 40);
-				}
-			} else if (msg->action == 101687594) {
-				endGraphics(kCharacterMax);
-				getCharacter(kCharacterMax).currentCall--;
-				_engine->getMessageManager()->setMessageHandle(kCharacterMax, _functionsMax[getCharacter(kCharacterMax).callbacks[getCharacter(kCharacterMax).currentCall]]);
-				fedEx(kCharacterMax, kCharacterMax, 18, 0);
-			} else if (msg->action == 18) {
-				if (getCharacter(kCharacterMax).callbacks[getCharacter(kCharacterMax).currentCall + 8]) {
-					if (getCharacter(kCharacterMax).callbacks[getCharacter(kCharacterMax).currentCall + 8] <= 2) {
-						getCharacter(kCharacterMax).callbacks[getCharacter(kCharacterMax).currentCall + 8] = 3;
-						MaxCall(&LogicManager::CONS_Max_DoDialog, "MAX1122", 0, 0, 0);
-					} else if (getCharacter(kCharacterMax).callbacks[getCharacter(kCharacterMax).currentCall + 8] == 3) {
-						setDoor(37, kCharacterMax, 1, 10, 9);
-						setDoor(53, kCharacterMax, 1, 10, 9);
-					}
-				}
-			}
-		} else if (msg->action == 17) {
-			if (!whoRunningDialog(kCharacterMax) && (checkCathDir(kCarRedSleeping, 56) || checkCathDir(kCarRedSleeping, 78))) {
-				playDialog(kCharacterMax, "MAX1120", -1, 0);
-			}
-		} else if (msg->action == 12) {
-			getCharacterCurrentParams(kCharacterMax)[0] = 225 * (4 * rnd(20) + 40);
-			getCharacter(kCharacterMax).characterPosition.position = 4070;
-			getCharacter(kCharacterMax).characterPosition.location = 1;
-			getCharacter(kCharacterMax).characterPosition.car = kCarRedSleeping;
-			setDoor(37, kCharacterMax, 1, 10, 9);
-			setDoor(53, kCharacterMax, 1, 10, 9);
+	switch (msg->action) {
+	case 0:
+		if (getCharacterCurrentParams(kCharacterMax)[1] || (getCharacterCurrentParams(kCharacterMax)[1] = _gameTime + getCharacterCurrentParams(kCharacterMax)[0], _gameTime + getCharacterCurrentParams(kCharacterMax)[0] != 0)) {
+			if (getCharacterCurrentParams(kCharacterMax)[1] >= _gameTime)
+				break;
+
+			getCharacterCurrentParams(kCharacterMax)[1] = 0x7FFFFFFF;
 		}
-	} else if (msg->action >= 8) {
+
+		if (!whoRunningDialog(kCharacterMax))
+			playDialog(kCharacterMax, "Max1122", -1, 0);
+
+		getCharacterCurrentParams(kCharacterMax)[0] = 225 * (4 * rnd(20) + 40);
+		getCharacterCurrentParams(kCharacterMax)[1] = 0;
+		break;
+	case 8:
+	case 9:
 		setDoor(37, kCharacterMax, 1, 0, 0);
 		setDoor(53, kCharacterMax, 1, 0, 0);
+
 		if (whoRunningDialog(kCharacterMax))
 			fadeDialog(kCharacterMax);
+
 		if (msg->action == 8) {
 			getCharacter(kCharacterMax).callbacks[getCharacter(kCharacterMax).currentCall + 8] = 1;
 			MaxCall(&LogicManager::CONS_Max_DoDialog, "LIB012", 0, 0, 0);
@@ -289,19 +300,58 @@ void LogicManager::HAND_Max_GuardingComp(HAND_PARAMS) {
 			getCharacter(kCharacterMax).callbacks[getCharacter(kCharacterMax).currentCall + 8] = 2;
 			MaxCall(&LogicManager::CONS_Max_DoDialog, "LIB013", 0, 0, 0);
 		}
-	} else if (msg->action == 0) {
-		if (getCharacterCurrentParams(kCharacterMax)[1] || (getCharacterCurrentParams(kCharacterMax)[1] = _gameTime + getCharacterCurrentParams(kCharacterMax)[0], _gameTime + getCharacterCurrentParams(kCharacterMax)[0] != 0)) {
-			if (getCharacterCurrentParams(kCharacterMax)[1] >= _gameTime)
-				return;
 
-			getCharacterCurrentParams(kCharacterMax)[1] = 0x7FFFFFFF;
+		break;
+	case 12:
+		getCharacterCurrentParams(kCharacterMax)[0] = 225 * (4 * rnd(20) + 40);
+		getCharacter(kCharacterMax).characterPosition.position = 4070;
+		getCharacter(kCharacterMax).characterPosition.location = 1;
+		getCharacter(kCharacterMax).characterPosition.car = kCarRedSleeping;
+		setDoor(37, kCharacterMax, 1, 10, 9);
+		setDoor(53, kCharacterMax, 1, 10, 9);
+		break;
+	case 17:
+		if (!whoRunningDialog(kCharacterMax) && (checkCathDir(kCarRedSleeping, 56) || checkCathDir(kCarRedSleeping, 78))) {
+			playDialog(kCharacterMax, "MAX1120", -1, 0);
 		}
 
-		if (!whoRunningDialog(kCharacterMax))
+		break;
+	case 18:
+		if (getCharacter(kCharacterMax).callbacks[getCharacter(kCharacterMax).currentCall + 8]) {
+			if (getCharacter(kCharacterMax).callbacks[getCharacter(kCharacterMax).currentCall + 8] <= 2) {
+				getCharacter(kCharacterMax).callbacks[getCharacter(kCharacterMax).currentCall + 8] = 3;
+				MaxCall(&LogicManager::CONS_Max_DoDialog, "MAX1122", 0, 0, 0);
+			} else if (getCharacter(kCharacterMax).callbacks[getCharacter(kCharacterMax).currentCall + 8] == 3) {
+				setDoor(37, kCharacterMax, 1, 10, 9);
+				setDoor(53, kCharacterMax, 1, 10, 9);
+			}
+		}
+
+		break;
+	case 101687594:
+		endGraphics(kCharacterMax);
+		getCharacter(kCharacterMax).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterMax, _functionsMax[getCharacter(kCharacterMax).callbacks[getCharacter(kCharacterMax).currentCall]]);
+		fedEx(kCharacterMax, kCharacterMax, 18, 0);
+		break;
+	case 122358304:
+	case 135204609:
+		send(kCharacterMax, kCharacterMax, 135204609, 0);
+		setDoor(37, kCharacterCath, 0, 10, 9);
+		setDoor(53, kCharacterCath, 0, 10, 9);
+		getCharacter(kCharacterMax).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterMax, _functionsMax[getCharacter(kCharacterMax).callbacks[getCharacter(kCharacterMax).currentCall]]);
+		fedEx(kCharacterMax, kCharacterMax, 18, 0);
+		break;
+	case 158007856:
+		if (!whoRunningDialog(kCharacterMax)) {
 			playDialog(kCharacterMax, "Max1122", -1, 0);
+			getCharacterCurrentParams(kCharacterMax)[0] = 225 * (4 * rnd(20) + 40);
+		}
 
-		getCharacterCurrentParams(kCharacterMax)[0] = 225 * (4 * rnd(20) + 40);
-		getCharacterCurrentParams(kCharacterMax)[1] = 0;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -322,7 +372,7 @@ void LogicManager::HAND_Max_InCageFriendly(HAND_PARAMS) {
 			(getCharacterCurrentParams(kCharacterMax)[2] = _gameTime + getCharacterCurrentParams(kCharacterMax)[1],
 				_gameTime + getCharacterCurrentParams(kCharacterMax)[1] != 0)) {
 			if (getCharacterCurrentParams(kCharacterMax)[2] >= _gameTime)
-				return;
+				break;
 
 			getCharacterCurrentParams(kCharacterMax)[2] = 0x7FFFFFFF;
 		}
@@ -369,13 +419,13 @@ void LogicManager::HAND_Max_InCageFriendly(HAND_PARAMS) {
 			playDialog(0, "LIB026", -1, 0);
 			playNIS(kEventCathMaxFree);
 			bumpCath(kCarBaggage, 92, 255);
-			setDoor(109, 0, 0, 0, 9);
+			setDoor(109, kCharacterCath, 0, 0, 9);
 			CONS_Max_Escaped(0, 0, 0, 0);
 		}
 
 		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -390,7 +440,8 @@ void LogicManager::CONS_Max_Escaped(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Max_Escaped(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		if (getCharacterCurrentParams(kCharacterMax)[1] != 0x7FFFFFFF && _gameTime) {
 			if (getCharacterCurrentParams(kCharacterMax)[0] >= _gameTime) {
 				if (!whoOnScreen(kCharacterMax) || !getCharacterCurrentParams(kCharacterMax)[1]) {
@@ -405,7 +456,7 @@ void LogicManager::HAND_Max_Escaped(HAND_PARAMS) {
 				}
 
 				if (getCharacterCurrentParams(kCharacterMax)[1] >= _gameTime)
-					return;
+					break;
 			}
 
 			getCharacterCurrentParams(kCharacterMax)[1] = 0x7FFFFFFF;
@@ -415,13 +466,18 @@ void LogicManager::HAND_Max_Escaped(HAND_PARAMS) {
 				CONS_Max_LetMeIn4(0, 0, 0, 0);
 			}
 		}
-	} else if (msg->action == 12) {
+
+		break;
+	case 12:
 		getCharacter(kCharacterMax).characterPosition.position = 4070;
 		getCharacter(kCharacterMax).characterPosition.location = 0;
 		getCharacter(kCharacterMax).characterPosition.car = kCarRedSleeping;
 		startCycOtis(kCharacterMax, "630Af");
 		softBlockAtDoor(kCharacterMax, 37);
 		getCharacterCurrentParams(kCharacterMax)[0] = _gameTime + 2700;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -436,16 +492,22 @@ void LogicManager::CONS_Max_Birth(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Max_Birth(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		if (_gameTime > 1062000 && !getCharacterCurrentParams(kCharacterMax)[0]) {
 			getCharacterCurrentParams(kCharacterMax)[0] = 1;
 			CONS_Max_WithAnna(0, 0, 0, 0);
 		}
-	} else if (msg->action == 12) {
+
+		break;
+	case 12:
 		getCharacter(kCharacterMax).characterPosition.car = kCarRedSleeping;
 		getCharacter(kCharacterMax).characterPosition.position = 4070;
 		getCharacter(kCharacterMax).characterPosition.location = 1;
 		getCharacter(kCharacterMax).clothes = 0;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -460,15 +522,20 @@ void LogicManager::CONS_Max_StartPart2(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Max_StartPart2(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		CONS_Max_WithAnna(0, 0, 0, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		endGraphics(kCharacterMax);
 		getCharacter(kCharacterMax).characterPosition.position = 4070;
 		getCharacter(kCharacterMax).characterPosition.location = 1;
 		getCharacter(kCharacterMax).characterPosition.car = kCarRedSleeping;
 		getCharacter(kCharacterMax).clothes = 0;
 		getCharacter(kCharacterMax).inventoryItem = kItemNone;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -483,15 +550,20 @@ void LogicManager::CONS_Max_StartPart3(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Max_StartPart3(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		CONS_Max_WithAnna3(0, 0, 0, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		endGraphics(kCharacterMax);
 		getCharacter(kCharacterMax).characterPosition.position = 4070;
 		getCharacter(kCharacterMax).characterPosition.location = 1;
 		getCharacter(kCharacterMax).characterPosition.car = kCarRedSleeping;
 		getCharacter(kCharacterMax).clothes = 0;
 		getCharacter(kCharacterMax).inventoryItem = kItemNone;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -506,15 +578,16 @@ void LogicManager::CONS_Max_WithAnna3(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Max_WithAnna3(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		if (getCharacterCurrentParams(kCharacterMax)[1]) {
 			getCharacter(kCharacterMax).characterPosition = getCharacter(kCharacterCond2).characterPosition;
-			return;
+			break;
 		}
 
 		if (getCharacterCurrentParams(kCharacterMax)[2] || (getCharacterCurrentParams(kCharacterMax)[2] = _gameTime + getCharacterCurrentParams(kCharacterMax)[0], _gameTime + getCharacterCurrentParams(kCharacterMax)[0] != 0)) {
 			if (getCharacterCurrentParams(kCharacterMax)[2] >= _gameTime)
-				return;
+				break;
 
 			getCharacterCurrentParams(kCharacterMax)[2] = 0x7FFFFFFF;
 		}
@@ -524,21 +597,30 @@ void LogicManager::HAND_Max_WithAnna3(HAND_PARAMS) {
 
 		getCharacterCurrentParams(kCharacterMax)[0] = 225 * (4 * rnd(20) + 40);
 		getCharacterCurrentParams(kCharacterMax)[2] = 0;
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		getCharacterCurrentParams(kCharacterMax)[0] = 225 * (4 * rnd(20) + 40);
 		getCharacter(kCharacterMax).characterPosition.position = 4070;
 		getCharacter(kCharacterMax).characterPosition.location = 1;
 		getCharacter(kCharacterMax).characterPosition.car = kCarRedSleeping;
-	} else if (msg->action == 122358304) {
-		getCharacterCurrentParams(kCharacterMax)[1] = 1;
-	} else if (msg->action == 135204609) {
-		CONS_Max_InCageMad(0, 0, 0, 0);
-	} else if (msg->action == 158007856 && !getCharacterCurrentParams(kCharacterMax)[1] && !whoRunningDialog(30)) {
-		playDialog(kCharacterMax, "Max1122", -1, 0);
-		getCharacterCurrentParams(kCharacterMax)[0] = 225 * (4 * rnd(20) + 40);
-	} else if (msg->action == 71277948) {
+		break;
+	case 71277948:
 		getCharacter(kCharacterMax).callbacks[getCharacter(kCharacterMax).currentCall + 8] = 1;
 		MaxCall(&LogicManager::CONS_Max_GuardingComp, 0, 0, 0, 0);
+		break;
+	case 122358304:
+		getCharacterCurrentParams(kCharacterMax)[1] = 1;
+		break;
+	case 135204609:
+		CONS_Max_InCageMad(0, 0, 0, 0);
+		break;
+	case 158007856:
+		if (!getCharacterCurrentParams(kCharacterMax)[1] && !whoRunningDialog(30)) {
+			playDialog(kCharacterMax, "Max1122", -1, 0);
+			getCharacterCurrentParams(kCharacterMax)[0] = 225 * (4 * rnd(20) + 40);
+		}
+
+		break;
 	}
 }
 
@@ -623,7 +705,7 @@ void LogicManager::HAND_Max_LetMeIn3(HAND_PARAMS) {
 		if (!getCharacterCurrentParams(kCharacterMax)[0]) {
 			if (getCharacterCurrentParams(kCharacterMax)[2] || (getCharacterCurrentParams(kCharacterMax)[2] = _gameTime + 900, _gameTime != -900)) {
 				if (getCharacterCurrentParams(kCharacterMax)[2] >= _gameTime)
-					return;
+					break;
 
 				getCharacterCurrentParams(kCharacterMax)[2] = 0x7FFFFFFF;
 			}
@@ -682,13 +764,18 @@ void LogicManager::CONS_Max_StartPart4(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Max_StartPart4(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		CONS_Max_InCageFriendly(0, 0, 0, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		endGraphics(kCharacterMax);
 		getCharacter(kCharacterMax).characterPosition.position = 8000;
 		getCharacter(kCharacterMax).characterPosition.location = 1;
 		getCharacter(kCharacterMax).characterPosition.car = kCarBaggage;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -741,12 +828,16 @@ void LogicManager::CONS_Max_StartPart5(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Max_StartPart5(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		endGraphics(kCharacterMax);
 		getCharacter(kCharacterMax).characterPosition.position = 0;
 		getCharacter(kCharacterMax).characterPosition.location = 0;
 		getCharacter(kCharacterMax).characterPosition.car = kCarNone;
 		setDoor(109, kCharacterCath, 0, 0, 9);
+		break;
+	default:
+		break;
 	}
 }
 


Commit: 01357febf66d1098c4538548b93d008681d73eec
    https://github.com/scummvm/scummvm/commit/01357febf66d1098c4538548b93d008681d73eec
Author: AndywinXp (andywinxp at gmail.com)
Date: 2025-06-16T23:12:18+02:00

Commit Message:
LASTEXPRESS: Clean up Sophie logic

Changed paths:
    engines/lastexpress/characters/sophie.cpp


diff --git a/engines/lastexpress/characters/sophie.cpp b/engines/lastexpress/characters/sophie.cpp
index 2a5b2c33a11..56aa76cad52 100644
--- a/engines/lastexpress/characters/sophie.cpp
+++ b/engines/lastexpress/characters/sophie.cpp
@@ -48,7 +48,7 @@ void LogicManager::CONS_Sophie(int chapter) {
 		CONS_Sophie_StartPart5(0, 0, 0, 0);
 		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -69,19 +69,25 @@ void LogicManager::CONS_Sophie_DebugWalks(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Sophie_DebugWalks(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			getCharacter(kCharacterSophie).characterPosition.position = 0;
-			getCharacter(kCharacterSophie).characterPosition.location = 0;
-			getCharacter(kCharacterSophie).characterPosition.car = kCarGreenSleeping;
-			getCharacterCurrentParams(kCharacterSophie)[0] = 10000;
-		}
-	} else if (walk(kCharacterSophie, kCarGreenSleeping, getCharacterCurrentParams(kCharacterSophie)[0])) {
-		if (getCharacterCurrentParams(kCharacterSophie)[0] == 10000) {
-			getCharacterCurrentParams(kCharacterSophie)[0] = 0;
-		} else {
-			getCharacterCurrentParams(kCharacterSophie)[0] = 10000;
+	switch (msg->action) {
+	case 0:
+		if (walk(kCharacterSophie, kCarGreenSleeping, getCharacterCurrentParams(kCharacterSophie)[0])) {
+			if (getCharacterCurrentParams(kCharacterSophie)[0] == 10000) {
+				getCharacterCurrentParams(kCharacterSophie)[0] = 0;
+			} else {
+				getCharacterCurrentParams(kCharacterSophie)[0] = 10000;
+			}
 		}
+
+		break;
+	case 12:
+		getCharacter(kCharacterSophie).characterPosition.position = 0;
+		getCharacter(kCharacterSophie).characterPosition.location = 0;
+		getCharacter(kCharacterSophie).characterPosition.car = kCarGreenSleeping;
+		getCharacterCurrentParams(kCharacterSophie)[0] = 10000;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -99,35 +105,40 @@ void LogicManager::CONS_Sophie_DoWalkBehind(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Sophie_DoWalkBehind(HAND_PARAMS) {
-	if (msg->action > 5) {
-		switch (msg->action) {
-		case 6:
-			playChrExcuseMe(kCharacterSophie, kCharacterCath, 0);
-			break;
-		case 12:
-			walk(kCharacterSophie, getCharacterCurrentParams(kCharacterSophie)[0], getCharacterCurrentParams(kCharacterSophie)[1]);
-			break;
-		case 123668192:
-			getCharacter(kCharacterSophie).currentCall--;
-			_engine->getMessageManager()->setMessageHandle(kCharacterSophie, _functionsSophie[getCharacter(kCharacterSophie).callbacks[getCharacter(kCharacterSophie).currentCall]]);
-			fedEx(kCharacterSophie, kCharacterSophie, 18, 0);
-			break;
-		}
-	} else if (msg->action == 5) {
-		playCathExcuseMe();
-	} else if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		getCharacterCurrentParams(kCharacterSophie)[2] = 0;
 		if (nearChar(kCharacterSophie, kCharacterRebecca, 500) ||
 			(getCharacter(kCharacterSophie).direction == 1) && ((getCharacter(kCharacterSophie).characterPosition.car > getCharacter(kCharacterRebecca).characterPosition.car) ||
-				getCharacter(kCharacterSophie).characterPosition.car == getCharacter(kCharacterRebecca).characterPosition.car && getCharacter(kCharacterSophie).characterPosition.position > getCharacter(kCharacterRebecca).characterPosition.position) ||
-				getCharacter(kCharacterSophie).direction == 2 && ((getCharacter(kCharacterSophie).characterPosition.car < getCharacter(kCharacterRebecca).characterPosition.car) ||
-				getCharacter(kCharacterSophie).characterPosition.car == getCharacter(kCharacterRebecca).characterPosition.car && getCharacter(kCharacterSophie).characterPosition.position < getCharacter(kCharacterRebecca).characterPosition.position)) {
+																 getCharacter(kCharacterSophie).characterPosition.car == getCharacter(kCharacterRebecca).characterPosition.car && getCharacter(kCharacterSophie).characterPosition.position > getCharacter(kCharacterRebecca).characterPosition.position) ||
+			getCharacter(kCharacterSophie).direction == 2 && ((getCharacter(kCharacterSophie).characterPosition.car < getCharacter(kCharacterRebecca).characterPosition.car) ||
+															   getCharacter(kCharacterSophie).characterPosition.car == getCharacter(kCharacterRebecca).characterPosition.car && getCharacter(kCharacterSophie).characterPosition.position < getCharacter(kCharacterRebecca).characterPosition.position)) {
+
 			getCharacter(kCharacterSophie).waitedTicksUntilCycleRestart = 0;
 			getCharacterCurrentParams(kCharacterSophie)[2] = 1;
 		}
+
 		if (!getCharacterCurrentParams(kCharacterSophie)[2]) {
 			walk(kCharacterSophie, getCharacterCurrentParams(kCharacterSophie)[0], getCharacterCurrentParams(kCharacterSophie)[1]);
 		}
+
+		break;
+	case 5:
+		playCathExcuseMe();
+		break;
+	case 6:
+		playChrExcuseMe(kCharacterSophie, kCharacterCath, 0);
+		break;
+	case 12:
+		walk(kCharacterSophie, getCharacterCurrentParams(kCharacterSophie)[0], getCharacterCurrentParams(kCharacterSophie)[1]);
+		break;
+	case 123668192:
+		getCharacter(kCharacterSophie).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterSophie, _functionsSophie[getCharacter(kCharacterSophie).callbacks[getCharacter(kCharacterSophie).currentCall]]);
+		fedEx(kCharacterSophie, kCharacterSophie, 18, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -142,35 +153,11 @@ void LogicManager::CONS_Sophie_WithRebecca(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Sophie_WithRebecca(HAND_PARAMS) {
-	if (msg->action > 18) {
-		if (msg->action > 136654208) {
-			if (msg->action == 259921280) {
-				getCharacter(kCharacterSophie).characterPosition.car = getCharacter(kCharacterRebecca).characterPosition.car;
-				getCharacter(kCharacterSophie).characterPosition.location = getCharacter(kCharacterRebecca).characterPosition.location;
-				getCharacter(kCharacterSophie).characterPosition.position = getCharacter(kCharacterRebecca).characterPosition.position + 100;
-				getCharacter(kCharacterSophie).callbacks[getCharacter(kCharacterSophie).currentCall + 8] = 3;
-				SophieCall(&LogicManager::CONS_Sophie_DoWalkBehind, 2, 9460, 0, 0);
-			} else if (msg->action == 292775040) {
-				getCharacter(kCharacterSophie).characterPosition.car = 2;
-				getCharacter(kCharacterSophie).characterPosition.location = 0;
-				getCharacter(kCharacterSophie).characterPosition.position = 9270;
-				getCharacter(kCharacterSophie).callbacks[getCharacter(kCharacterSophie).currentCall + 8] = 4;
-				SophieCall(&LogicManager::CONS_Sophie_DoWalkBehind, 4, 4840, 0, 0);
-			}
-		} else if (msg->action == 136654208) {
-			getCharacter(kCharacterSophie).characterPosition.car = getCharacter(kCharacterRebecca).characterPosition.car;
-			getCharacter(kCharacterSophie).characterPosition.location = getCharacter(kCharacterRebecca).characterPosition.location;
-			getCharacter(kCharacterSophie).characterPosition.position = getCharacter(kCharacterRebecca).characterPosition.position + 100;
-			getCharacter(kCharacterSophie).callbacks[getCharacter(kCharacterSophie).currentCall + 8] = 2;
-			SophieCall(&LogicManager::CONS_Sophie_DoWalkBehind, 4, 4840, 0, 0);
-		} else if (msg->action == 125242096) {
-			getCharacter(kCharacterSophie).characterPosition.car = getCharacter(kCharacterRebecca).characterPosition.car;
-			getCharacter(kCharacterSophie).characterPosition.location = getCharacter(kCharacterRebecca).characterPosition.location;
-			getCharacter(kCharacterSophie).characterPosition.position = getCharacter(kCharacterRebecca).characterPosition.position - 100;
-			getCharacter(kCharacterSophie).callbacks[getCharacter(kCharacterSophie).currentCall + 8] = 1;
-			SophieCall(&LogicManager::CONS_Sophie_DoWalkBehind, 5, 850, 0, 0);
-		}
-	} else if (msg->action == 18) {
+	switch (msg->action) {
+	case 0:
+		getCharacter(kCharacterSophie).characterPosition = getCharacter(kCharacterRebecca).characterPosition;
+		break;
+	case 18:
 		switch (getCharacter(kCharacterSophie).callbacks[getCharacter(kCharacterSophie).currentCall + 8]) {
 		case 1:
 		case 3:
@@ -181,10 +168,40 @@ void LogicManager::HAND_Sophie_WithRebecca(HAND_PARAMS) {
 			startCycOtis(kCharacterSophie, "BLANK");
 			break;
 		default:
-			return;
+			break;
 		}
-	} else if (msg->action == 0) {
-		getCharacter(kCharacterSophie).characterPosition = getCharacter(kCharacterRebecca).characterPosition;
+
+		break;
+	case 259921280:
+		getCharacter(kCharacterSophie).characterPosition.car = getCharacter(kCharacterRebecca).characterPosition.car;
+		getCharacter(kCharacterSophie).characterPosition.location = getCharacter(kCharacterRebecca).characterPosition.location;
+		getCharacter(kCharacterSophie).characterPosition.position = getCharacter(kCharacterRebecca).characterPosition.position + 100;
+		getCharacter(kCharacterSophie).callbacks[getCharacter(kCharacterSophie).currentCall + 8] = 3;
+		SophieCall(&LogicManager::CONS_Sophie_DoWalkBehind, 2, 9460, 0, 0);
+		break;
+	case 292775040:
+		getCharacter(kCharacterSophie).characterPosition.car = 2;
+		getCharacter(kCharacterSophie).characterPosition.location = 0;
+		getCharacter(kCharacterSophie).characterPosition.position = 9270;
+		getCharacter(kCharacterSophie).callbacks[getCharacter(kCharacterSophie).currentCall + 8] = 4;
+		SophieCall(&LogicManager::CONS_Sophie_DoWalkBehind, 4, 4840, 0, 0);
+		break;
+	case 136654208:
+		getCharacter(kCharacterSophie).characterPosition.car = getCharacter(kCharacterRebecca).characterPosition.car;
+		getCharacter(kCharacterSophie).characterPosition.location = getCharacter(kCharacterRebecca).characterPosition.location;
+		getCharacter(kCharacterSophie).characterPosition.position = getCharacter(kCharacterRebecca).characterPosition.position + 100;
+		getCharacter(kCharacterSophie).callbacks[getCharacter(kCharacterSophie).currentCall + 8] = 2;
+		SophieCall(&LogicManager::CONS_Sophie_DoWalkBehind, 4, 4840, 0, 0);
+		break;
+	case 125242096:
+		getCharacter(kCharacterSophie).characterPosition.car = getCharacter(kCharacterRebecca).characterPosition.car;
+		getCharacter(kCharacterSophie).characterPosition.location = getCharacter(kCharacterRebecca).characterPosition.location;
+		getCharacter(kCharacterSophie).characterPosition.position = getCharacter(kCharacterRebecca).characterPosition.position - 100;
+		getCharacter(kCharacterSophie).callbacks[getCharacter(kCharacterSophie).currentCall + 8] = 1;
+		SophieCall(&LogicManager::CONS_Sophie_DoWalkBehind, 5, 850, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -199,15 +216,21 @@ void LogicManager::CONS_Sophie_Birth(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Sophie_Birth(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			getCharacter(kCharacterSophie).characterPosition.position = 4840;
-			getCharacter(kCharacterSophie).characterPosition.location = 1;
-			getCharacter(kCharacterSophie).characterPosition.car = kCarRedSleeping;
+	switch (msg->action) {
+	case 0:
+		if (_gameTime > 1062000 && !getCharacterCurrentParams(kCharacterSophie)[0]) {
+			getCharacterCurrentParams(kCharacterSophie)[0] = 1;
+			CONS_Sophie_WithRebecca(0, 0, 0, 0);
 		}
-	} else if (_gameTime > 1062000 && !getCharacterCurrentParams(kCharacterSophie)[0]) {
-		getCharacterCurrentParams(kCharacterSophie)[0] = 1;
-		CONS_Sophie_WithRebecca(0, 0, 0, 0);
+
+		break;
+	case 12:
+		getCharacter(kCharacterSophie).characterPosition.position = 4840;
+		getCharacter(kCharacterSophie).characterPosition.location = 1;
+		getCharacter(kCharacterSophie).characterPosition.car = kCarRedSleeping;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -222,11 +245,15 @@ void LogicManager::CONS_Sophie_Asleep(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Sophie_Asleep(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterSophie).characterPosition.position = 4840;
 		getCharacter(kCharacterSophie).characterPosition.location = 1;
 		getCharacter(kCharacterSophie).characterPosition.car = kCarRedSleeping;
 		endGraphics(kCharacterSophie);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -241,17 +268,20 @@ void LogicManager::CONS_Sophie_StartPart2(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Sophie_StartPart2(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			endGraphics(kCharacterSophie);
-			getCharacter(kCharacterSophie).characterPosition.car = kCarRedSleeping;
-			getCharacter(kCharacterSophie).characterPosition.position = 4840;
-			getCharacter(kCharacterSophie).characterPosition.location = 1;
-			getCharacter(kCharacterSophie).clothes = 0;
-			getCharacter(kCharacterSophie).inventoryItem = 0;
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		CONS_Sophie_WithRebecca(0, 0, 0, 0);
+		break;
+	case 12:
+		endGraphics(kCharacterSophie);
+		getCharacter(kCharacterSophie).characterPosition.car = kCarRedSleeping;
+		getCharacter(kCharacterSophie).characterPosition.position = 4840;
+		getCharacter(kCharacterSophie).characterPosition.location = 1;
+		getCharacter(kCharacterSophie).clothes = 0;
+		getCharacter(kCharacterSophie).inventoryItem = 0;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -266,17 +296,20 @@ void LogicManager::CONS_Sophie_StartPart3(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Sophie_StartPart3(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			endGraphics(kCharacterSophie);
-			getCharacter(kCharacterSophie).characterPosition.car = kCarRedSleeping;
-			getCharacter(kCharacterSophie).characterPosition.position = 4840;
-			getCharacter(kCharacterSophie).characterPosition.location = 1;
-			getCharacter(kCharacterSophie).clothes = 0;
-			getCharacter(kCharacterSophie).inventoryItem = 0;
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		CONS_Sophie_WithRebecca(0, 0, 0, 0);
+		break;
+	case 12:
+		endGraphics(kCharacterSophie);
+		getCharacter(kCharacterSophie).characterPosition.car = kCarRedSleeping;
+		getCharacter(kCharacterSophie).characterPosition.position = 4840;
+		getCharacter(kCharacterSophie).characterPosition.location = 1;
+		getCharacter(kCharacterSophie).clothes = 0;
+		getCharacter(kCharacterSophie).inventoryItem = 0;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -291,17 +324,20 @@ void LogicManager::CONS_Sophie_StartPart4(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Sophie_StartPart4(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			endGraphics(kCharacterSophie);
-			getCharacter(kCharacterSophie).characterPosition.car = kCarRedSleeping;
-			getCharacter(kCharacterSophie).characterPosition.position = 4840;
-			getCharacter(kCharacterSophie).characterPosition.location = 1;
-			getCharacter(kCharacterSophie).clothes = 0;
-			getCharacter(kCharacterSophie).inventoryItem = 0;
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		CONS_Sophie_WithRebecca(0, 0, 0, 0);
+		break;
+	case 12:
+		endGraphics(kCharacterSophie);
+		getCharacter(kCharacterSophie).characterPosition.car = kCarRedSleeping;
+		getCharacter(kCharacterSophie).characterPosition.position = 4840;
+		getCharacter(kCharacterSophie).characterPosition.location = 1;
+		getCharacter(kCharacterSophie).clothes = 0;
+		getCharacter(kCharacterSophie).inventoryItem = 0;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -316,11 +352,15 @@ void LogicManager::CONS_Sophie_Asleep4(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Sophie_Asleep4(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterSophie).characterPosition.position = 4840;
 		getCharacter(kCharacterSophie).characterPosition.location = 1;
 		getCharacter(kCharacterSophie).characterPosition.car = kCarRedSleeping;
 		endGraphics(kCharacterSophie);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -335,16 +375,19 @@ void LogicManager::CONS_Sophie_StartPart5(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Sophie_StartPart5(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			endGraphics(kCharacterSophie);
-			getCharacter(kCharacterSophie).characterPosition.car = kCarRestaurant;
-			getCharacter(kCharacterSophie).characterPosition.position = 3969;
-			getCharacter(kCharacterSophie).characterPosition.location = 1;
-			getCharacter(kCharacterSophie).inventoryItem = 0;
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		CONS_Sophie_Prisoner(0, 0, 0, 0);
+		break;
+	case 12:
+		endGraphics(kCharacterSophie);
+		getCharacter(kCharacterSophie).characterPosition.car = kCarRestaurant;
+		getCharacter(kCharacterSophie).characterPosition.position = 3969;
+		getCharacter(kCharacterSophie).characterPosition.location = 1;
+		getCharacter(kCharacterSophie).inventoryItem = 0;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -359,8 +402,13 @@ void LogicManager::CONS_Sophie_Prisoner(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Sophie_Prisoner(HAND_PARAMS) {
-	if (msg->action == 70549068)
+	switch (msg->action) {
+	case 70549068:
 		CONS_Sophie_Free(0, 0, 0, 0);
+		break;
+	default:
+		break;
+	}
 }
 
 void LogicManager::CONS_Sophie_Free(CONS_PARAMS) {


Commit: dafdbe320de0931b755e9d08dad3d0d9f801ab54
    https://github.com/scummvm/scummvm/commit/dafdbe320de0931b755e9d08dad3d0d9f801ab54
Author: AndywinXp (andywinxp at gmail.com)
Date: 2025-06-16T23:12:18+02:00

Commit Message:
LASTEXPRESS: Clean up Police logic

Changed paths:
    engines/lastexpress/characters/police.cpp


diff --git a/engines/lastexpress/characters/police.cpp b/engines/lastexpress/characters/police.cpp
index 9eab5c0356b..9121e62f8ac 100644
--- a/engines/lastexpress/characters/police.cpp
+++ b/engines/lastexpress/characters/police.cpp
@@ -48,7 +48,7 @@ void LogicManager::CONS_Police(int chapter) {
 		CONS_Police_StartPart5(0, 0, 0, 0);
 		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -69,19 +69,25 @@ void LogicManager::CONS_Police_DebugWalks(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Police_DebugWalks(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			getCharacter(kCharacterPolice).characterPosition.position = 0;
-			getCharacter(kCharacterPolice).characterPosition.location = 0;
-			getCharacter(kCharacterPolice).characterPosition.car = kCarGreenSleeping;
-			getCharacterCurrentParams(kCharacterPolice)[0] = 10000;
-		}
-	} else if (walk(kCharacterPolice, kCarGreenSleeping, getCharacterCurrentParams(kCharacterPolice)[0])) {
-		if (getCharacterCurrentParams(kCharacterPolice)[0] == 10000) {
-			getCharacterCurrentParams(kCharacterPolice)[0] = 0;
-		} else {
-			getCharacterCurrentParams(kCharacterPolice)[0] = 10000;
+	switch (msg->action) {
+	case 0:
+		if (walk(kCharacterPolice, kCarGreenSleeping, getCharacterCurrentParams(kCharacterPolice)[0])) {
+			if (getCharacterCurrentParams(kCharacterPolice)[0] == 10000) {
+				getCharacterCurrentParams(kCharacterPolice)[0] = 0;
+			} else {
+				getCharacterCurrentParams(kCharacterPolice)[0] = 10000;
+			}
 		}
+
+		break;
+	case 12:
+		getCharacter(kCharacterPolice).characterPosition.position = 0;
+		getCharacter(kCharacterPolice).characterPosition.location = 0;
+		getCharacter(kCharacterPolice).characterPosition.car = kCarGreenSleeping;
+		getCharacterCurrentParams(kCharacterPolice)[0] = 10000;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -96,12 +102,19 @@ void LogicManager::CONS_Police_Birth(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Police_Birth(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12)
-			getCharacter(kCharacterPolice).characterPosition.car = kCarNone;
-	} else if (_gameTime > 1062000 && !getCharacterCurrentParams(kCharacterPolice)[0]) {
-		getCharacterCurrentParams(kCharacterPolice)[0] = 1;
-		CONS_Police_ReadyToBoard(0, 0, 0, 0);
+	switch (msg->action) {
+	case 0:
+		if (_gameTime > 1062000 && !getCharacterCurrentParams(kCharacterPolice)[0]) {
+			getCharacterCurrentParams(kCharacterPolice)[0] = 1;
+			CONS_Police_ReadyToBoard(0, 0, 0, 0);
+		}
+
+		break;
+	case 12:
+		getCharacter(kCharacterPolice).characterPosition.car = kCarNone;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -125,10 +138,12 @@ void LogicManager::HAND_Police_DoSeqOtis(HAND_PARAMS) {
 			playDialog(0, "MUS007", -1, 0);
 			getCharacterParams(kCharacterPolice, 8)[0] = 1;
 		}
+
 		if (nearChar(kCharacterPolice, kCharacterCath, 1000) && !getCharacter(kCharacterCath).characterPosition.location) {
 			getCharacter(kCharacterPolice).callbacks[getCharacter(kCharacterPolice).currentCall + 8] = 1;
 			PoliceCall(&LogicManager::CONS_Police_SaveGame, 2, kEventGendarmesArrestation, 0, 0);
 		}
+
 		break;
 	case 3:
 		getCharacter(kCharacterPolice).currentCall--;
@@ -143,9 +158,10 @@ void LogicManager::HAND_Police_DoSeqOtis(HAND_PARAMS) {
 			playNIS(kEventGendarmesArrestation);
 			endGame(0, 1, 57, 1);
 		}
+
 		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -169,10 +185,12 @@ void LogicManager::HAND_Police_DoDialog(HAND_PARAMS) {
 			playDialog(0, "MUS007", -1, 0);
 			getCharacterParams(kCharacterPolice, 8)[0] = 1;
 		}
+
 		if (nearChar(kCharacterPolice, kCharacterCath, 1000) && !getCharacter(kCharacterCath).characterPosition.location) {
 			getCharacter(kCharacterPolice).callbacks[getCharacter(kCharacterPolice).currentCall + 8] = 1;
 			PoliceCall(&LogicManager::CONS_Police_SaveGame, 2, kEventGendarmesArrestation, 0, 0);
 		}
+
 		break;
 	case 2:
 		getCharacter(kCharacterPolice).currentCall--;
@@ -187,9 +205,10 @@ void LogicManager::HAND_Police_DoDialog(HAND_PARAMS) {
 			playNIS(kEventGendarmesArrestation);
 			endGame(0, 1, 57, true);
 		}
+
 		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -214,7 +233,7 @@ void LogicManager::HAND_Police_DoDialogFullVol(HAND_PARAMS) {
 			getCharacterParams(kCharacterPolice, 8)[0] = 1;
 		}
 
-		if (nearChar(kCharacterPolice, kCharacterCath, 0x3E8) && !getCharacter(kCharacterCath).characterPosition.location) {
+		if (nearChar(kCharacterPolice, kCharacterCath, 1000) && !getCharacter(kCharacterCath).characterPosition.location) {
 			getCharacter(kCharacterPolice).callbacks[getCharacter(kCharacterPolice).currentCall + 8] = 1;
 			PoliceCall(&LogicManager::CONS_Police_SaveGame, 2, kEventGendarmesArrestation, 0, 0);
 		}
@@ -236,7 +255,7 @@ void LogicManager::HAND_Police_DoDialogFullVol(HAND_PARAMS) {
 
 		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -253,30 +272,39 @@ void LogicManager::CONS_Police_DoWait(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Police_DoWait(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action != 17) {
-			if (msg->action == 18 && getCharacter(kCharacterPolice).callbacks[getCharacter(kCharacterPolice).currentCall + 8] == 1) {
-				playNIS(kEventGendarmesArrestation);
-				endGame(0, 1, 57, true);
-			}
-			return;
+	switch (msg->action) {
+	case 0:
+		if (getCharacterCurrentParams(kCharacterPolice)[0] < _gameTime && !getCharacterCurrentParams(kCharacterPolice)[1]) {
+			getCharacterCurrentParams(kCharacterPolice)[1] = 1;
+
+			getCharacter(kCharacterPolice).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterPolice, _functionsPolice[getCharacter(kCharacterPolice).callbacks[getCharacter(kCharacterPolice).currentCall]]);
+			fedEx(kCharacterPolice, kCharacterPolice, 18, 0);
+			break;
 		}
-	} else if (getCharacterCurrentParams(kCharacterPolice)[0] < _gameTime && !getCharacterCurrentParams(kCharacterPolice)[1]) {
-		getCharacterCurrentParams(kCharacterPolice)[1] = 1;
 
-		getCharacter(kCharacterPolice).currentCall--;
-		_engine->getMessageManager()->setMessageHandle(kCharacterPolice, _functionsPolice[getCharacter(kCharacterPolice).callbacks[getCharacter(kCharacterPolice).currentCall]]);
-		fedEx(kCharacterPolice, kCharacterPolice, 18, 0);
-		return;
-	}
+		if (!getCharacterParams(kCharacterPolice, 8)[0] && whoOnScreen(kCharacterPolice)) {
+			playDialog(0, "MUS007", -1, 0);
+			getCharacterParams(kCharacterPolice, 8)[0] = 1;
+		}
 
-	if (!getCharacterParams(kCharacterPolice, 8)[0] && whoOnScreen(kCharacterPolice)) {
-		playDialog(0, "MUS007", -1, 0);
-		getCharacterParams(kCharacterPolice, 8)[0] = 1;
-	}
-	if (nearChar(kCharacterPolice, kCharacterCath, 1000) && !getCharacter(kCharacterCath).characterPosition.location) {
-		getCharacter(kCharacterPolice).callbacks[getCharacter(kCharacterPolice).currentCall + 8] = 1;
-		PoliceCall(&LogicManager::CONS_Police_SaveGame, 2, kEventGendarmesArrestation, 0, 0);
+		if (nearChar(kCharacterPolice, kCharacterCath, 1000) && !getCharacter(kCharacterCath).characterPosition.location) {
+			getCharacter(kCharacterPolice).callbacks[getCharacter(kCharacterPolice).currentCall + 8] = 1;
+			PoliceCall(&LogicManager::CONS_Police_SaveGame, 2, kEventGendarmesArrestation, 0, 0);
+		}
+
+		break;
+	case 17:
+		break;
+	case 18:
+		if (getCharacter(kCharacterPolice).callbacks[getCharacter(kCharacterPolice).currentCall + 8] == 1) {
+			playNIS(kEventGendarmesArrestation);
+			endGame(0, 1, 57, true);
+		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -294,22 +322,25 @@ void LogicManager::CONS_Police_SaveGame(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Police_SaveGame(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			save(
-				kCharacterPolice,
-				getCharacterCurrentParams(kCharacterPolice)[0],
-				getCharacterCurrentParams(kCharacterPolice)[1]
-			);
+	switch (msg->action) {
+	case 0:
+		getCharacter(kCharacterPolice).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterPolice, _functionsPolice[getCharacter(kCharacterPolice).callbacks[getCharacter(kCharacterPolice).currentCall]]);
+		fedEx(kCharacterPolice, kCharacterPolice, 18, 0);
+		break;
+	case 12:
+		save(
+			kCharacterPolice,
+			getCharacterCurrentParams(kCharacterPolice)[0],
+			getCharacterCurrentParams(kCharacterPolice)[1]
+		);
 
-			getCharacter(kCharacterPolice).currentCall--;
-			_engine->getMessageManager()->setMessageHandle(kCharacterPolice, _functionsPolice[getCharacter(kCharacterPolice).callbacks[getCharacter(kCharacterPolice).currentCall]]);
-			fedEx(kCharacterPolice, kCharacterPolice, 18, 0);
-		}
-	} else {
 		getCharacter(kCharacterPolice).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterPolice, _functionsPolice[getCharacter(kCharacterPolice).callbacks[getCharacter(kCharacterPolice).currentCall]]);
 		fedEx(kCharacterPolice, kCharacterPolice, 18, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -329,36 +360,51 @@ void LogicManager::CONS_Police_DoWalk(CONS_PARAMS) {
 void LogicManager::HAND_Police_DoWalk(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
-		if (!walk(kCharacterPolice, getCharacterCurrentParams(kCharacterPolice)[0], getCharacterCurrentParams(kCharacterPolice)[1]))
-			goto LABEL_9;
-		goto LABEL_4;
+		if (!walk(kCharacterPolice, getCharacterCurrentParams(kCharacterPolice)[0], getCharacterCurrentParams(kCharacterPolice)[1])) {
+			if (!getCharacterParams(kCharacterPolice, 8)[0] && whoOnScreen(29)) {
+				playDialog(0, "MUS007", -1, 0);
+				getCharacterParams(kCharacterPolice, 8)[0] = 1;
+			}
+
+			if (nearChar(kCharacterPolice, kCharacterCath, 0x6D6) && !getCharacter(kCharacterCath).characterPosition.location && (!checkCathDir(kCarRedSleeping, 22) || nearChar(kCharacterPolice, kCharacterCath, 0xFA))) {
+				getCharacter(kCharacterPolice).callbacks[getCharacter(kCharacterPolice).currentCall + 8] = 1;
+				PoliceCall(&LogicManager::CONS_Police_SaveGame, 2, kEventGendarmesArrestation, 0, 0);
+			}
+		} else {
+			getCharacter(kCharacterPolice).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterPolice, _functionsPolice[getCharacter(kCharacterPolice).callbacks[getCharacter(kCharacterPolice).currentCall]]);
+			fedEx(kCharacterPolice, kCharacterPolice, 18, 0);
+		}
+
+		break;
 	case 12:
 		if (walk(kCharacterPolice, getCharacterCurrentParams(kCharacterPolice)[0], getCharacterCurrentParams(kCharacterPolice)[1])) {
-		LABEL_4:
 			getCharacter(kCharacterPolice).currentCall--;
 			_engine->getMessageManager()->setMessageHandle(kCharacterPolice, _functionsPolice[getCharacter(kCharacterPolice).callbacks[getCharacter(kCharacterPolice).currentCall]]);
 			fedEx(kCharacterPolice, kCharacterPolice, 18, 0);
 		}
 		break;
 	case 17:
-	LABEL_9:
 		if (!getCharacterParams(kCharacterPolice, 8)[0] && whoOnScreen(29)) {
 			playDialog(0, "MUS007", -1, 0);
 			getCharacterParams(kCharacterPolice, 8)[0] = 1;
 		}
+
 		if (nearChar(kCharacterPolice, kCharacterCath, 0x6D6) && !getCharacter(kCharacterCath).characterPosition.location && (!checkCathDir(kCarRedSleeping, 22) || nearChar(kCharacterPolice, kCharacterCath, 0xFA))) {
 			getCharacter(kCharacterPolice).callbacks[getCharacter(kCharacterPolice).currentCall + 8] = 1;
 			PoliceCall(&LogicManager::CONS_Police_SaveGame, 2, kEventGendarmesArrestation, 0, 0);
 		}
+
 		break;
 	case 18:
 		if (getCharacter(kCharacterPolice).callbacks[getCharacter(kCharacterPolice).currentCall + 8] == 1) {
 			playNIS(kEventGendarmesArrestation);
 			endGame(0, 1, 57, 1);
 		}
+
 		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -378,126 +424,129 @@ void LogicManager::CONS_Police_DoComp(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Police_DoComp(HAND_PARAMS) {
-	if (msg->action != 18) {
-		if (msg->action == 12) {
-			if (getCharacterCurrentParams(kCharacterPolice)[1] == 5790) {
-				getCharacterCurrentParams(kCharacterPolice)[20] = 4;
-				getCharacterCurrentParams(kCharacterPolice)[22] = 6130;
-			} else if (getCharacterCurrentParams(kCharacterPolice)[1] >= 5790) {
-				if (getCharacterCurrentParams(kCharacterPolice)[1] == 7500) {
-					getCharacterCurrentParams(kCharacterPolice)[20] = 2;
+	switch (msg->action) {
+	case 12:
+		if (getCharacterCurrentParams(kCharacterPolice)[1] == 5790) {
+			getCharacterCurrentParams(kCharacterPolice)[20] = 4;
+			getCharacterCurrentParams(kCharacterPolice)[22] = 6130;
+		} else if (getCharacterCurrentParams(kCharacterPolice)[1] >= 5790) {
+			if (getCharacterCurrentParams(kCharacterPolice)[1] == 7500) {
+				getCharacterCurrentParams(kCharacterPolice)[20] = 2;
+				getCharacterCurrentParams(kCharacterPolice)[22] = 7850;
+			} else if (getCharacterCurrentParams(kCharacterPolice)[1] >= 7500) {
+				if (getCharacterCurrentParams(kCharacterPolice)[1] == 8200) {
+					getCharacterCurrentParams(kCharacterPolice)[20] = 1;
 					getCharacterCurrentParams(kCharacterPolice)[22] = 7850;
-				} else if (getCharacterCurrentParams(kCharacterPolice)[1] >= 7500) {
-					if (getCharacterCurrentParams(kCharacterPolice)[1] == 8200) {
-						getCharacterCurrentParams(kCharacterPolice)[20] = 1;
-						getCharacterCurrentParams(kCharacterPolice)[22] = 7850;
-						getCharacterCurrentParams(kCharacterPolice)[21] = 1;
-					}
-				} else if (getCharacterCurrentParams(kCharacterPolice)[1] == 6470) {
-					getCharacterCurrentParams(kCharacterPolice)[20] = 3;
-					getCharacterCurrentParams(kCharacterPolice)[22] = 6130;
 					getCharacterCurrentParams(kCharacterPolice)[21] = 1;
 				}
-			} else if (getCharacterCurrentParams(kCharacterPolice)[1] == 4070) {
-				getCharacterCurrentParams(kCharacterPolice)[20] = 6;
+			} else if (getCharacterCurrentParams(kCharacterPolice)[1] == 6470) {
+				getCharacterCurrentParams(kCharacterPolice)[20] = 3;
+				getCharacterCurrentParams(kCharacterPolice)[22] = 6130;
+				getCharacterCurrentParams(kCharacterPolice)[21] = 1;
+			}
+		} else if (getCharacterCurrentParams(kCharacterPolice)[1] == 4070) {
+			getCharacterCurrentParams(kCharacterPolice)[20] = 6;
+			getCharacterCurrentParams(kCharacterPolice)[22] = 4455;
+		} else if (getCharacterCurrentParams(kCharacterPolice)[1] >= 4070) {
+			if (getCharacterCurrentParams(kCharacterPolice)[1] == 4840) {
+				getCharacterCurrentParams(kCharacterPolice)[20] = 5;
 				getCharacterCurrentParams(kCharacterPolice)[22] = 4455;
-			} else if (getCharacterCurrentParams(kCharacterPolice)[1] >= 4070) {
-				if (getCharacterCurrentParams(kCharacterPolice)[1] == 4840) {
-					getCharacterCurrentParams(kCharacterPolice)[20] = 5;
-					getCharacterCurrentParams(kCharacterPolice)[22] = 4455;
-					getCharacterCurrentParams(kCharacterPolice)[21] = 1;
-				}
-			} else if (getCharacterCurrentParams(kCharacterPolice)[1] == 3050) {
-				getCharacterCurrentParams(kCharacterPolice)[20] = 7;
 				getCharacterCurrentParams(kCharacterPolice)[21] = 1;
-			} else if (getCharacterCurrentParams(kCharacterPolice)[1] == 2740) {
-				getCharacterCurrentParams(kCharacterPolice)[20] = 8;
 			}
+		} else if (getCharacterCurrentParams(kCharacterPolice)[1] == 3050) {
+			getCharacterCurrentParams(kCharacterPolice)[20] = 7;
+			getCharacterCurrentParams(kCharacterPolice)[21] = 1;
+		} else if (getCharacterCurrentParams(kCharacterPolice)[1] == 2740) {
+			getCharacterCurrentParams(kCharacterPolice)[20] = 8;
+		}
 
-			if (getCharacterCurrentParams(kCharacterPolice)[0] == kCarRedSleeping)
-				getCharacterCurrentParams(kCharacterPolice)[20] += 31;
+		if (getCharacterCurrentParams(kCharacterPolice)[0] == kCarRedSleeping)
+			getCharacterCurrentParams(kCharacterPolice)[20] += 31;
 
-			if (getCharacterCurrentParams(kCharacterPolice)[21]) {
-				Common::strcpy_s((char *)&getCharacterCurrentParams(kCharacterPolice)[8], 12, "632A");
-				Common::strcpy_s((char *)&getCharacterCurrentParams(kCharacterPolice)[11], 12, "632B");
-				Common::strcpy_s((char *)&getCharacterCurrentParams(kCharacterPolice)[14], 12, "632C");
-			} else {
-				Common::strcpy_s((char *)&getCharacterCurrentParams(kCharacterPolice)[8], 12, "632D");
-				Common::strcpy_s((char *)&getCharacterCurrentParams(kCharacterPolice)[11], 12, "632E");
-				Common::strcpy_s((char *)&getCharacterCurrentParams(kCharacterPolice)[14], 12, "632F");
-			}
+		if (getCharacterCurrentParams(kCharacterPolice)[21]) {
+			Common::strcpy_s((char *)&getCharacterCurrentParams(kCharacterPolice)[8], 12, "632A");
+			Common::strcpy_s((char *)&getCharacterCurrentParams(kCharacterPolice)[11], 12, "632B");
+			Common::strcpy_s((char *)&getCharacterCurrentParams(kCharacterPolice)[14], 12, "632C");
+		} else {
+			Common::strcpy_s((char *)&getCharacterCurrentParams(kCharacterPolice)[8], 12, "632D");
+			Common::strcpy_s((char *)&getCharacterCurrentParams(kCharacterPolice)[11], 12, "632E");
+			Common::strcpy_s((char *)&getCharacterCurrentParams(kCharacterPolice)[14], 12, "632F");
+		}
 
-			Common::strcat_s((char *)&getCharacterCurrentParams(kCharacterPolice)[8],  12, (char *)&getCharacterCurrentParams(kCharacterPolice)[2]);
-			Common::strcat_s((char *)&getCharacterCurrentParams(kCharacterPolice)[11], 12, (char *)&getCharacterCurrentParams(kCharacterPolice)[2]);
-			Common::strcat_s((char *)&getCharacterCurrentParams(kCharacterPolice)[14], 12, (char *)&getCharacterCurrentParams(kCharacterPolice)[2]);
+		Common::strcat_s((char *)&getCharacterCurrentParams(kCharacterPolice)[8], 12, (char *)&getCharacterCurrentParams(kCharacterPolice)[2]);
+		Common::strcat_s((char *)&getCharacterCurrentParams(kCharacterPolice)[11], 12, (char *)&getCharacterCurrentParams(kCharacterPolice)[2]);
+		Common::strcat_s((char *)&getCharacterCurrentParams(kCharacterPolice)[14], 12, (char *)&getCharacterCurrentParams(kCharacterPolice)[2]);
 
-			if ((inComp(kCharacterCath, getCharacterCurrentParams(kCharacterPolice)[0], getCharacterCurrentParams(kCharacterPolice)[1]) ||
-				inComp(kCharacterCath, getCharacterCurrentParams(kCharacterPolice)[0], getCharacterCurrentParams(kCharacterPolice)[22]) ||
-				 (getCharacterCurrentParams(kCharacterPolice)[0] == kCarGreenSleeping && getCharacterCurrentParams(kCharacterPolice)[1] == 8200 && cathOutHisWindow())) &&
-				!inComp(kCharacterCath, kCarRedSleeping, 7850)) {
-				getCharacter(kCharacterPolice).callbacks[getCharacter(kCharacterPolice).currentCall + 8] = 1;
-				PoliceCall(&LogicManager::CONS_Police_TrappedCath, getCharacterCurrentParams(kCharacterPolice)[0], getCharacterCurrentParams(kCharacterPolice)[1], getCharacterCurrentParams(kCharacterPolice)[20], 0);
+		if ((inComp(kCharacterCath, getCharacterCurrentParams(kCharacterPolice)[0], getCharacterCurrentParams(kCharacterPolice)[1]) ||
+			 inComp(kCharacterCath, getCharacterCurrentParams(kCharacterPolice)[0], getCharacterCurrentParams(kCharacterPolice)[22]) ||
+			 (getCharacterCurrentParams(kCharacterPolice)[0] == kCarGreenSleeping && getCharacterCurrentParams(kCharacterPolice)[1] == 8200 && cathOutHisWindow())) &&
+			!inComp(kCharacterCath, kCarRedSleeping, 7850)) {
+			getCharacter(kCharacterPolice).callbacks[getCharacter(kCharacterPolice).currentCall + 8] = 1;
+			PoliceCall(&LogicManager::CONS_Police_TrappedCath, getCharacterCurrentParams(kCharacterPolice)[0], getCharacterCurrentParams(kCharacterPolice)[1], getCharacterCurrentParams(kCharacterPolice)[20], 0);
+		} else {
+			startCycOtis(kCharacterPolice, (char *)&getCharacterCurrentParams(kCharacterPolice)[8]);
+			softBlockAtDoor(kCharacterPolice, getCharacterCurrentParams(kCharacterPolice)[20]);
+			if (getCharacterCurrentParams(kCharacterPolice)[21]) {
+				getCharacter(kCharacterPolice).callbacks[getCharacter(kCharacterPolice).currentCall + 8] = 2;
+				PoliceCall(&LogicManager::CONS_Police_DoDialog, "POL1044A", 0, 0, 0);
 			} else {
-				startCycOtis(kCharacterPolice, (char *)&getCharacterCurrentParams(kCharacterPolice)[8]);
-				softBlockAtDoor(kCharacterPolice, getCharacterCurrentParams(kCharacterPolice)[20]);
-				if (getCharacterCurrentParams(kCharacterPolice)[21]) {
-					getCharacter(kCharacterPolice).callbacks[getCharacter(kCharacterPolice).currentCall + 8] = 2;
-					PoliceCall(&LogicManager::CONS_Police_DoDialog, "POL1044A", 0, 0, 0);
-				} else {
-					getCharacter(kCharacterPolice).callbacks[getCharacter(kCharacterPolice).currentCall + 8] = 3;
-					PoliceCall(&LogicManager::CONS_Police_DoDialog, "POL1044B", 0, 0, 0);
-				}
+				getCharacter(kCharacterPolice).callbacks[getCharacter(kCharacterPolice).currentCall + 8] = 3;
+				PoliceCall(&LogicManager::CONS_Police_DoDialog, "POL1044B", 0, 0, 0);
 			}
 		}
 
-		return;
-	}
-
-	if (getCharacter(kCharacterPolice).callbacks[getCharacter(kCharacterPolice).currentCall + 8] < 4) {
-		if (getCharacter(kCharacterPolice).callbacks[getCharacter(kCharacterPolice).currentCall + 8] != 1) {
-			if (getCharacter(kCharacterPolice).callbacks[getCharacter(kCharacterPolice).currentCall + 8]) {
-				startCycOtis(kCharacterPolice, (char *)&getCharacterCurrentParams(kCharacterPolice)[11]);
-				if (!emptyComp(getCharacterCurrentParams(kCharacterPolice)[0], getCharacterCurrentParams(kCharacterPolice)[1]) &&
-					strcmp((char *)&getCharacterCurrentParams(kCharacterPolice)[5], "NODIALOG")) {
-					Common::strcpy_s((char *)&getCharacterCurrentParams(kCharacterPolice)[17], 12, "POL1045");
-					Common::strcat_s((char *)&getCharacterCurrentParams(kCharacterPolice)[17], 12, (char *)&getCharacterCurrentParams(kCharacterPolice)[5]);
-					getCharacter(kCharacterPolice).callbacks[getCharacter(kCharacterPolice).currentCall + 8] = 5;
-					PoliceCall(&LogicManager::CONS_Police_DoDialog, (char *)&getCharacterCurrentParams(kCharacterPolice)[17], 0, 0, 0);
-				} else {
-					getCharacter(kCharacterPolice).callbacks[getCharacter(kCharacterPolice).currentCall + 8] = 4;
-					PoliceCall(&LogicManager::CONS_Police_DoWait, 150, 0, 0, 0);
+		break;
+	case 18:
+		if (getCharacter(kCharacterPolice).callbacks[getCharacter(kCharacterPolice).currentCall + 8] < 4) {
+			if (getCharacter(kCharacterPolice).callbacks[getCharacter(kCharacterPolice).currentCall + 8] != 1) {
+				if (getCharacter(kCharacterPolice).callbacks[getCharacter(kCharacterPolice).currentCall + 8]) {
+					startCycOtis(kCharacterPolice, (char *)&getCharacterCurrentParams(kCharacterPolice)[11]);
+					if (!emptyComp(getCharacterCurrentParams(kCharacterPolice)[0], getCharacterCurrentParams(kCharacterPolice)[1]) &&
+						strcmp((char *)&getCharacterCurrentParams(kCharacterPolice)[5], "NODIALOG")) {
+						Common::strcpy_s((char *)&getCharacterCurrentParams(kCharacterPolice)[17], 12, "POL1045");
+						Common::strcat_s((char *)&getCharacterCurrentParams(kCharacterPolice)[17], 12, (char *)&getCharacterCurrentParams(kCharacterPolice)[5]);
+						getCharacter(kCharacterPolice).callbacks[getCharacter(kCharacterPolice).currentCall + 8] = 5;
+						PoliceCall(&LogicManager::CONS_Police_DoDialog, (char *)&getCharacterCurrentParams(kCharacterPolice)[17], 0, 0, 0);
+					} else {
+						getCharacter(kCharacterPolice).callbacks[getCharacter(kCharacterPolice).currentCall + 8] = 4;
+						PoliceCall(&LogicManager::CONS_Police_DoWait, 150, 0, 0, 0);
+					}
 				}
+
+				break;
 			}
 
-			return;
+			getCharacter(kCharacterPolice).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterPolice, _functionsPolice[getCharacter(kCharacterPolice).callbacks[getCharacter(kCharacterPolice).currentCall]]);
+			fedEx(kCharacterPolice, kCharacterPolice, 18, 0);
+			break;
 		}
 
-		getCharacter(kCharacterPolice).currentCall--;
-		_engine->getMessageManager()->setMessageHandle(kCharacterPolice, _functionsPolice[getCharacter(kCharacterPolice).callbacks[getCharacter(kCharacterPolice).currentCall]]);
-		fedEx(kCharacterPolice, kCharacterPolice, 18, 0);
-		return;
-	}
+		if (getCharacter(kCharacterPolice).callbacks[getCharacter(kCharacterPolice).currentCall + 8] == 6) {
+			getCharacter(kCharacterPolice).characterPosition.location = 0;
+			softReleaseAtDoor(kCharacterPolice, getCharacterCurrentParams(kCharacterPolice)[20]);
+			getCharacter(kCharacterPolice).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterPolice, _functionsPolice[getCharacter(kCharacterPolice).callbacks[getCharacter(kCharacterPolice).currentCall]]);
+			fedEx(kCharacterPolice, kCharacterPolice, 18, 0);
+			break;
+		}
 
-	if (getCharacter(kCharacterPolice).callbacks[getCharacter(kCharacterPolice).currentCall + 8] == 6) {
-		getCharacter(kCharacterPolice).characterPosition.location = 0;
-		softReleaseAtDoor(kCharacterPolice, getCharacterCurrentParams(kCharacterPolice)[20]);
-		getCharacter(kCharacterPolice).currentCall--;
-		_engine->getMessageManager()->setMessageHandle(kCharacterPolice, _functionsPolice[getCharacter(kCharacterPolice).callbacks[getCharacter(kCharacterPolice).currentCall]]);
-		fedEx(kCharacterPolice, kCharacterPolice, 18, 0);
-		return;
-	}
+		if (getCharacter(kCharacterPolice).callbacks[getCharacter(kCharacterPolice).currentCall + 8] < 6) {
+			if (!emptyComp(getCharacterCurrentParams(kCharacterPolice)[0], getCharacterCurrentParams(kCharacterPolice)[1]) &&
+				strcmp((char *)&getCharacterCurrentParams(kCharacterPolice)[5], "NODIALOG")) {
+				Common::strcpy_s((char *)&getCharacterCurrentParams(kCharacterPolice)[17], 12, "POL1043");
+				Common::strcat_s((char *)&getCharacterCurrentParams(kCharacterPolice)[17], 12, (char *)&getCharacterCurrentParams(kCharacterPolice)[5]);
+				playDialog(kCharacterPolice, (char *)&getCharacterCurrentParams(kCharacterPolice)[17], -1, 30);
+			}
 
-	if (getCharacter(kCharacterPolice).callbacks[getCharacter(kCharacterPolice).currentCall + 8] < 6) {
-		if (!emptyComp(getCharacterCurrentParams(kCharacterPolice)[0], getCharacterCurrentParams(kCharacterPolice)[1]) &&
-			strcmp((char *)&getCharacterCurrentParams(kCharacterPolice)[5], "NODIALOG")) {
-			Common::strcpy_s((char *)&getCharacterCurrentParams(kCharacterPolice)[17], 12, "POL1043");
-			Common::strcat_s((char *)&getCharacterCurrentParams(kCharacterPolice)[17], 12, (char *)&getCharacterCurrentParams(kCharacterPolice)[5]);
-			playDialog(kCharacterPolice, (char *)&getCharacterCurrentParams(kCharacterPolice)[17], -1, 30);
+			getCharacter(kCharacterPolice).characterPosition.location = 1;
+			getCharacter(kCharacterPolice).callbacks[getCharacter(kCharacterPolice).currentCall + 8] = 6;
+			PoliceCall(&LogicManager::CONS_Police_DoSeqOtis, (char *)&getCharacterCurrentParams(kCharacterPolice)[14], 0, 0, 0);
 		}
 
-		getCharacter(kCharacterPolice).characterPosition.location = 1;
-		getCharacter(kCharacterPolice).callbacks[getCharacter(kCharacterPolice).currentCall + 8] = 6;
-		PoliceCall(&LogicManager::CONS_Police_DoSeqOtis, (char *)&getCharacterCurrentParams(kCharacterPolice)[14], 0, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -518,32 +567,40 @@ void LogicManager::CONS_Police_TrappedCath(CONS_PARAMS) {
 void LogicManager::HAND_Police_TrappedCath(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
+	{
 		if (!getCharacterCurrentParams(kCharacterPolice)[4] &&
-			(getCharacterCurrentParams(kCharacterPolice)[4] = _currentGameSessionTicks + 75, _currentGameSessionTicks == -75) ||
+				(getCharacterCurrentParams(kCharacterPolice)[4] = _currentGameSessionTicks + 75, _currentGameSessionTicks == -75) ||
 			getCharacterCurrentParams(kCharacterPolice)[4] < _currentGameSessionTicks) {
 			if (!cathOutHisWindow() && checkDoor(getCharacterCurrentParams(kCharacterPolice)[2]) != 1) {
 				getCharacter(kCharacterPolice).callbacks[getCharacter(kCharacterPolice).currentCall + 8] = 2;
 				PoliceCall(&LogicManager::CONS_Police_SaveGame, 2, kEventGendarmesArrestation, 0, 0);
-				return;
+				break;
 			}
 		}
+
+		bool skip = false; // Horrible way to unroll a goto...
+
 		if (!getCharacterCurrentParams(kCharacterPolice)[5]) {
 			getCharacterCurrentParams(kCharacterPolice)[5] = _currentGameSessionTicks + 150;
-			if (_currentGameSessionTicks == -150)
-				goto LABEL_13;
+			if (_currentGameSessionTicks == -150) {
+				skip = true;
+				playDialog(kCharacterPolice, "POL1046A", 16, 0);
+			}
 		}
-		if (getCharacterCurrentParams(kCharacterPolice)[5] < _currentGameSessionTicks) {
+
+		if (!skip && getCharacterCurrentParams(kCharacterPolice)[5] < _currentGameSessionTicks) {
 			getCharacterCurrentParams(kCharacterPolice)[5] = 0x7FFFFFFF;
-		LABEL_13:
 			playDialog(kCharacterPolice, "POL1046A", 16, 0);
 		}
+
 		if (getCharacterCurrentParams(kCharacterPolice)[6] || (getCharacterCurrentParams(kCharacterPolice)[6] = _currentGameSessionTicks + 300, _currentGameSessionTicks != -300)) {
 			if (getCharacterCurrentParams(kCharacterPolice)[6] >= _currentGameSessionTicks)
-				return;
+				break;
+
 			getCharacterCurrentParams(kCharacterPolice)[6] = 0x7FFFFFFF;
 		}
+
 		if (!getCharacterCurrentParams(kCharacterPolice)[3] && cathOutHisWindow()) {
-		LABEL_32:
 			setDoor(getCharacterCurrentParams(kCharacterPolice)[2], kCharacterCath, 0, 10, 9);
 
 			getCharacter(kCharacterPolice).currentCall--;
@@ -561,21 +618,23 @@ void LogicManager::HAND_Police_TrappedCath(HAND_PARAMS) {
 				PoliceCall(&LogicManager::CONS_Police_SaveGame, 2, kEventGendarmesArrestation, 0, 0);
 			}
 		}
+
 		break;
+	}
 	case 8:
 		setDoor(getCharacterCurrentParams(kCharacterPolice)[2], kCharacterPolice, checkDoor(getCharacterCurrentParams(kCharacterPolice)[2]), 0, 0);
 		getCharacter(kCharacterPolice).callbacks[getCharacter(kCharacterPolice).currentCall + 8] = 5;
 		PoliceCall(&LogicManager::CONS_Police_DoDialogFullVol, "POL1046B", 0, 0, 0);
-		return;
+		break;
 	case 9:
 		getCharacter(kCharacterPolice).callbacks[getCharacter(kCharacterPolice).currentCall + 8] = 6;
 		PoliceCall(&LogicManager::CONS_Police_SaveGame, 2, kEventGendarmesArrestation, 0, 0);
-		return;
+		break;
 	case 12:
 		setDoor(getCharacterCurrentParams(kCharacterPolice)[2], kCharacterPolice, checkDoor(getCharacterCurrentParams(kCharacterPolice)[2]), 0, 0);
 		getCharacter(kCharacterPolice).callbacks[getCharacter(kCharacterPolice).currentCall + 8] = 1;
 		PoliceCall(&LogicManager::CONS_Police_DoDialogFullVol, "POL1046", 0, 0, 0);
-		return;
+		break;
 	case 18:
 		switch (getCharacter(kCharacterPolice).callbacks[getCharacter(kCharacterPolice).currentCall + 8]) {
 		case 1:
@@ -590,21 +649,32 @@ void LogicManager::HAND_Police_TrappedCath(HAND_PARAMS) {
 		case 3:
 			playNIS((kEventCoudertBloodJacket - (getCharacterCurrentParams(kCharacterPolice)[0] == 3)));
 			endGame(0, 1, 55, true);
-			goto LABEL_32;
+			setDoor(getCharacterCurrentParams(kCharacterPolice)[2], kCharacterCath, 0, 10, 9);
+
+			getCharacter(kCharacterPolice).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterPolice, _functionsPolice[getCharacter(kCharacterPolice).callbacks[getCharacter(kCharacterPolice).currentCall]]);
+			fedEx(kCharacterPolice, kCharacterPolice, 18, 0);
+			break;
 		case 4:
 			playNIS(kEventGendarmesArrestation);
 			endGame(0, 1, 57, true);
-			goto LABEL_32;
+			setDoor(getCharacterCurrentParams(kCharacterPolice)[2], kCharacterCath, 0, 10, 9);
+
+			getCharacter(kCharacterPolice).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterPolice, _functionsPolice[getCharacter(kCharacterPolice).callbacks[getCharacter(kCharacterPolice).currentCall]]);
+			fedEx(kCharacterPolice, kCharacterPolice, 18, 0);
+			break;
 		case 5:
 			setDoor(getCharacterCurrentParams(kCharacterPolice)[2], kCharacterPolice, checkDoor(getCharacterCurrentParams(kCharacterPolice)[2]), 0, 9);
 			getCharacterCurrentParams(kCharacterPolice)[3] = 1;
 			break;
 		default:
-			return;
+			break;
 		}
-		return;
+
+		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -619,9 +689,13 @@ void LogicManager::CONS_Police_ReadyToBoard(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Police_ReadyToBoard(HAND_PARAMS) {
-	if (msg->action == 169499649) {
+	switch (msg->action) {
+	case 169499649:
 		send(kCharacterPolice, kCharacterCond1, 190082817, 0);
 		CONS_Police_SearchTrain(0, 0, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -636,14 +710,16 @@ void LogicManager::CONS_Police_SearchTrain(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Police_SearchTrain(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterPolice).characterPosition.car = kCarGreenSleeping;
 		getCharacter(kCharacterPolice).characterPosition.location = 0;
 		getCharacter(kCharacterPolice).characterPosition.position = 540;
 		_gameProgress[kProgressField14] = 29;
 		getCharacter(kCharacterPolice).callbacks[getCharacter(kCharacterPolice).currentCall + 8] = 1;
 		PoliceCall(&LogicManager::CONS_Police_DoWalk, 3, 5540, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterPolice).callbacks[getCharacter(kCharacterPolice).currentCall + 8]) {
 		case 1:
 			getCharacter(kCharacterPolice).callbacks[getCharacter(kCharacterPolice).currentCall + 8] = 2;
@@ -752,8 +828,12 @@ void LogicManager::HAND_Police_SearchTrain(HAND_PARAMS) {
 			CONS_Police_SearchDone(0, 0, 0, 0);
 			break;
 		default:
-			return;
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -768,8 +848,13 @@ void LogicManager::CONS_Police_SearchDone(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Police_SearchDone(HAND_PARAMS) {
-	if (msg->action == 12)
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterPolice).characterPosition.car = kCarNone;
+		break;
+	default:
+		break;
+	}
 }
 
 void LogicManager::CONS_Police_StartPart2(CONS_PARAMS) {
@@ -783,8 +868,13 @@ void LogicManager::CONS_Police_StartPart2(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Police_StartPart2(HAND_PARAMS) {
-	if (msg->action == 12)
+	switch (msg->action) {
+	case 12:
 		endGraphics(kCharacterPolice);
+		break;
+	default:
+		break;
+	}
 }
 
 void LogicManager::CONS_Police_StartPart3(CONS_PARAMS) {
@@ -798,8 +888,13 @@ void LogicManager::CONS_Police_StartPart3(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Police_StartPart3(HAND_PARAMS) {
-	if (msg->action == 12)
+	switch (msg->action) {
+	case 12:
 		endGraphics(kCharacterPolice);
+		break;
+	default:
+		break;
+	}
 }
 
 void LogicManager::CONS_Police_StartPart4(CONS_PARAMS) {
@@ -813,8 +908,13 @@ void LogicManager::CONS_Police_StartPart4(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Police_StartPart4(HAND_PARAMS) {
-	if (msg->action == 12)
+	switch (msg->action) {
+	case 12:
 		endGraphics(kCharacterPolice);
+		break;
+	default:
+		break;
+	}
 }
 
 void LogicManager::CONS_Police_StartPart5(CONS_PARAMS) {
@@ -828,8 +928,13 @@ void LogicManager::CONS_Police_StartPart5(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Police_StartPart5(HAND_PARAMS) {
-	if (msg->action == 12)
+	switch (msg->action) {
+	case 12:
 		endGraphics(kCharacterPolice);
+		break;
+	default:
+		break;
+	}
 }
 
 void (LogicManager::*LogicManager::_functionsPolice[])(HAND_PARAMS) = {


Commit: 78277791b9b6a4c8e1aacae98c28583bb88dbbbb
    https://github.com/scummvm/scummvm/commit/78277791b9b6a4c8e1aacae98c28583bb88dbbbb
Author: AndywinXp (andywinxp at gmail.com)
Date: 2025-06-16T23:12:18+02:00

Commit Message:
LASTEXPRESS: Clean up Salko logic

Changed paths:
    engines/lastexpress/characters/salko.cpp


diff --git a/engines/lastexpress/characters/salko.cpp b/engines/lastexpress/characters/salko.cpp
index 2799496ea67..87f776385eb 100644
--- a/engines/lastexpress/characters/salko.cpp
+++ b/engines/lastexpress/characters/salko.cpp
@@ -48,7 +48,7 @@ void LogicManager::CONS_Salko(int chapter) {
 		CONS_Salko_StartPart5(0, 0, 0, 0);
 		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -69,19 +69,25 @@ void LogicManager::CONS_Salko_DebugWalks(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Salko_DebugWalks(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			getCharacter(kCharacterSalko).characterPosition.position = 0;
-			getCharacter(kCharacterSalko).characterPosition.location = 0;
-			getCharacter(kCharacterSalko).characterPosition.car = kCarGreenSleeping;
-			getCharacterCurrentParams(kCharacterSalko)[0] = 10000;
-		}
-	} else if (walk(kCharacterSalko, kCarGreenSleeping, getCharacterCurrentParams(kCharacterSalko)[0])) {
-		if (getCharacterCurrentParams(kCharacterSalko)[0] == 10000) {
-			getCharacterCurrentParams(kCharacterSalko)[0] = 0;
-		} else {
-			getCharacterCurrentParams(kCharacterSalko)[0] = 10000;
+	switch (msg->action) {
+	case 0:
+		if (walk(kCharacterSalko, kCarGreenSleeping, getCharacterCurrentParams(kCharacterSalko)[0])) {
+			if (getCharacterCurrentParams(kCharacterSalko)[0] == 10000) {
+				getCharacterCurrentParams(kCharacterSalko)[0] = 0;
+			} else {
+				getCharacterCurrentParams(kCharacterSalko)[0] = 10000;
+			}
 		}
+
+		break;
+	case 12:
+		getCharacter(kCharacterSalko).characterPosition.position = 0;
+		getCharacter(kCharacterSalko).characterPosition.location = 0;
+		getCharacter(kCharacterSalko).characterPosition.car = kCarGreenSleeping;
+		getCharacterCurrentParams(kCharacterSalko)[0] = 10000;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -100,15 +106,20 @@ void LogicManager::CONS_Salko_DoCorrOtis(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Salko_DoCorrOtis(HAND_PARAMS) {
-	if (msg->action == 3) {
+	switch (msg->action) {
+	case 3:
 		releaseAtDoor(kCharacterSalko, getCharacterCurrentParams(kCharacterSalko)[3]);
 
 		getCharacter(kCharacterSalko).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterSalko, _functionsSalko[getCharacter(kCharacterSalko).callbacks[getCharacter(kCharacterSalko).currentCall]]);
 		fedEx(kCharacterSalko, kCharacterSalko, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		startSeqOtis(kCharacterSalko, (char *)&getCharacterCurrentParams(kCharacterSalko)[0]);
 		blockAtDoor(kCharacterSalko, getCharacterCurrentParams(kCharacterSalko)[3]);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -125,12 +136,17 @@ void LogicManager::CONS_Salko_DoSeqOtis(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Salko_DoSeqOtis(HAND_PARAMS) {
-	if (msg->action == 3) {
+	switch (msg->action) {
+	case 3:
 		getCharacter(kCharacterSalko).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterSalko, _functionsSalko[getCharacter(kCharacterSalko).callbacks[getCharacter(kCharacterSalko).currentCall]]);
 		fedEx(kCharacterSalko, kCharacterSalko, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		startSeqOtis(kCharacterSalko, (char *)&getCharacterCurrentParams(kCharacterSalko)[0]);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -148,16 +164,18 @@ void LogicManager::CONS_Salko_DoWalk(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Salko_DoWalk(HAND_PARAMS) {
-	if (msg->action == 0) {
-		if (!walk(kCharacterSalko, getCharacterCurrentParams(kCharacterSalko)[0], getCharacterCurrentParams(kCharacterSalko)[1]))
-			return;
-		goto LABEL_7;
-	}
-	if (msg->action == 12 && walk(kCharacterSalko, getCharacterCurrentParams(kCharacterSalko)[0], getCharacterCurrentParams(kCharacterSalko)[1])) {
-	LABEL_7:
-		getCharacter(kCharacterSalko).currentCall--;
-		_engine->getMessageManager()->setMessageHandle(kCharacterSalko, _functionsSalko[getCharacter(kCharacterSalko).callbacks[getCharacter(kCharacterSalko).currentCall]]);
-		fedEx(kCharacterSalko, kCharacterSalko, 18, 0);
+	switch (msg->action) {
+	case 0:
+	case 12:
+		if (walk(kCharacterSalko, getCharacterCurrentParams(kCharacterSalko)[0], getCharacterCurrentParams(kCharacterSalko)[1])) {
+			getCharacter(kCharacterSalko).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterSalko, _functionsSalko[getCharacter(kCharacterSalko).callbacks[getCharacter(kCharacterSalko).currentCall]]);
+			fedEx(kCharacterSalko, kCharacterSalko, 18, 0);
+		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -174,16 +192,21 @@ void LogicManager::CONS_Salko_DoWait(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Salko_DoWait(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		if (getCharacterCurrentParams(kCharacterSalko)[1] || (getCharacterCurrentParams(kCharacterSalko)[1] = _gameTime + getCharacterCurrentParams(kCharacterSalko)[0], _gameTime + getCharacterCurrentParams(kCharacterSalko)[0] != 0)) {
 			if (getCharacterCurrentParams(kCharacterSalko)[1] >= _gameTime)
-				return;
+				break;
+
 			getCharacterCurrentParams(kCharacterSalko)[1] = 0x7FFFFFFF;
 		}
 
 		getCharacter(kCharacterSalko).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterSalko, _functionsSalko[getCharacter(kCharacterSalko).callbacks[getCharacter(kCharacterSalko).currentCall]]);
 		fedEx(kCharacterSalko, kCharacterSalko, 18, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -201,22 +224,25 @@ void LogicManager::CONS_Salko_SaveGame(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Salko_SaveGame(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			save(
-				kCharacterSalko,
-				getCharacterCurrentParams(kCharacterSalko)[0],
-				getCharacterCurrentParams(kCharacterSalko)[1]
-			);
+	switch (msg->action) {
+	case 0:
+		getCharacter(kCharacterSalko).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterSalko, _functionsSalko[getCharacter(kCharacterSalko).callbacks[getCharacter(kCharacterSalko).currentCall]]);
+		fedEx(kCharacterSalko, kCharacterSalko, 18, 0);
+		break;
+	case 12:
+		save(
+			kCharacterSalko,
+			getCharacterCurrentParams(kCharacterSalko)[0],
+			getCharacterCurrentParams(kCharacterSalko)[1]
+		);
 
-			getCharacter(kCharacterSalko).currentCall--;
-			_engine->getMessageManager()->setMessageHandle(kCharacterSalko, _functionsSalko[getCharacter(kCharacterSalko).callbacks[getCharacter(kCharacterSalko).currentCall]]);
-			fedEx(kCharacterSalko, kCharacterSalko, 18, 0);
-		}
-	} else {
 		getCharacter(kCharacterSalko).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterSalko, _functionsSalko[getCharacter(kCharacterSalko).callbacks[getCharacter(kCharacterSalko).currentCall]]);
 		fedEx(kCharacterSalko, kCharacterSalko, 18, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -234,37 +260,43 @@ void LogicManager::CONS_Salko_DoWalkBehind(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Salko_DoWalkBehind(HAND_PARAMS) {
-	if (msg->action > 6) {
-		if (msg->action == 12) {
-		LABEL_19:
-			walk(kCharacterSalko, getCharacterCurrentParams(kCharacterSalko)[0], getCharacterCurrentParams(kCharacterSalko)[1]);
-			return;
-		}
-		if (msg->action == 123668192) {
-			getCharacter(kCharacterSalko).currentCall--;
-			_engine->getMessageManager()->setMessageHandle(kCharacterSalko, _functionsSalko[getCharacter(kCharacterSalko).callbacks[getCharacter(kCharacterSalko).currentCall]]);
-			fedEx(kCharacterSalko, kCharacterSalko, 18, 0);
-		}
-	} else if (msg->action >= 5) {
-		playDialog(0, "ZFX1002", getVolume(kCharacterSalko), 0);
-		playDialog(kCharacterCath, "CAT1127A", -1, 0);
-	} else if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		getCharacterCurrentParams(kCharacterSalko)[2] = 0;
 		if (nearChar(kCharacterSalko, kCharacterIvo, 500) ||
 			(getCharacter(kCharacterSalko).direction == 1) &&
-			((getCharacter(kCharacterSalko).characterPosition.car > getCharacter(kCharacterIvo).characterPosition.car) ||
-				getCharacter(kCharacterSalko).characterPosition.car == getCharacter(kCharacterIvo).characterPosition.car &&
-				getCharacter(kCharacterSalko).characterPosition.position > getCharacter(kCharacterIvo).characterPosition.position) ||
+				((getCharacter(kCharacterSalko).characterPosition.car > getCharacter(kCharacterIvo).characterPosition.car) ||
+				 getCharacter(kCharacterSalko).characterPosition.car == getCharacter(kCharacterIvo).characterPosition.car &&
+					 getCharacter(kCharacterSalko).characterPosition.position > getCharacter(kCharacterIvo).characterPosition.position) ||
 			getCharacter(kCharacterSalko).direction == 2 &&
 				((getCharacter(kCharacterSalko).characterPosition.car < getCharacter(kCharacterIvo).characterPosition.car) ||
-					getCharacter(kCharacterSalko).characterPosition.car == getCharacter(kCharacterIvo).characterPosition.car &&
-					getCharacter(kCharacterSalko).characterPosition.position < getCharacter(kCharacterIvo).characterPosition.position)) {
+				 getCharacter(kCharacterSalko).characterPosition.car == getCharacter(kCharacterIvo).characterPosition.car &&
+					 getCharacter(kCharacterSalko).characterPosition.position < getCharacter(kCharacterIvo).characterPosition.position)) {
 
 			getCharacter(kCharacterSalko).waitedTicksUntilCycleRestart = 0;
 			getCharacterCurrentParams(kCharacterSalko)[2] = 1;
 		}
-		if (!getCharacterCurrentParams(kCharacterSalko)[2])
-			goto LABEL_19;
+
+		if (!getCharacterCurrentParams(kCharacterSalko)[2]) {
+			walk(kCharacterSalko, getCharacterCurrentParams(kCharacterSalko)[0], getCharacterCurrentParams(kCharacterSalko)[1]);
+		}
+
+		break;
+	case 5:
+	case 6:
+		playDialog(0, "ZFX1002", getVolume(kCharacterSalko), 0);
+		playDialog(kCharacterCath, "CAT1127A", -1, 0);
+		break;
+	case 12:
+		walk(kCharacterSalko, getCharacterCurrentParams(kCharacterSalko)[0], getCharacterCurrentParams(kCharacterSalko)[1]);
+		break;
+	case 123668192:
+		break;
+	default:
+		getCharacter(kCharacterSalko).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterSalko, _functionsSalko[getCharacter(kCharacterSalko).callbacks[getCharacter(kCharacterSalko).currentCall]]);
+		fedEx(kCharacterSalko, kCharacterSalko, 18, 0);
+		break;
 	}
 }
 
@@ -279,10 +311,14 @@ void LogicManager::CONS_Salko_HomeTogether(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Salko_HomeTogether(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterSalko).characterPosition.position = 2740;
 		getCharacter(kCharacterSalko).characterPosition.location = 1;
 		getCharacter(kCharacterSalko).characterPosition.car = kCarRedSleeping;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -297,15 +333,21 @@ void LogicManager::CONS_Salko_Birth(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Salko_Birth(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			getCharacter(kCharacterSalko).characterPosition.position = 4691;
-			getCharacter(kCharacterSalko).characterPosition.location = 0;
-			getCharacter(kCharacterSalko).characterPosition.car = kCarRestaurant;
+	switch (msg->action) {
+	case 0:
+		if (_gameTime > 1062000 && !getCharacterCurrentParams(kCharacterSalko)[0]) {
+			getCharacterCurrentParams(kCharacterSalko)[0] = 1;
+			CONS_Salko_WithIvo(0, 0, 0, 0);
 		}
-	} else if (_gameTime > 1062000 && !getCharacterCurrentParams(kCharacterSalko)[0]) {
-		getCharacterCurrentParams(kCharacterSalko)[0] = 1;
-		CONS_Salko_WithIvo(0, 0, 0, 0);
+
+		break;
+	case 12:
+		getCharacter(kCharacterSalko).characterPosition.position = 4691;
+		getCharacter(kCharacterSalko).characterPosition.location = 0;
+		getCharacter(kCharacterSalko).characterPosition.car = kCarRestaurant;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -320,18 +362,23 @@ void LogicManager::CONS_Salko_WithIvo(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Salko_WithIvo(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 18) {
-			if (getCharacter(kCharacterSalko).callbacks[getCharacter(kCharacterSalko).currentCall + 8] == 1) {
-				startCycOtis(kCharacterSalko, "BLANK");
-				CONS_Salko_HomeTogether(0, 0, 0, 0);
-			}
-		} else if (msg->action == 125242096) {
-			getCharacter(kCharacterSalko).callbacks[getCharacter(kCharacterSalko).currentCall + 8] = 1;
-			SalkoCall(&LogicManager::CONS_Salko_DoWalkBehind, 4, 2740, 0, 0);
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		getCharacter(kCharacterSalko).characterPosition = getCharacter(kCharacterIvo).characterPosition;
+		break;
+	case 18:
+		if (getCharacter(kCharacterSalko).callbacks[getCharacter(kCharacterSalko).currentCall + 8] == 1) {
+			startCycOtis(kCharacterSalko, "BLANK");
+			CONS_Salko_HomeTogether(0, 0, 0, 0);
+		}
+
+		break;
+	case 125242096:
+		getCharacter(kCharacterSalko).callbacks[getCharacter(kCharacterSalko).currentCall + 8] = 1;
+		SalkoCall(&LogicManager::CONS_Salko_DoWalkBehind, 4, 2740, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -346,12 +393,16 @@ void LogicManager::CONS_Salko_Asleep(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Salko_Asleep(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterSalko).characterPosition.car = kCarRedSleeping;
 		getCharacter(kCharacterSalko).characterPosition.position = 2740;
 		getCharacter(kCharacterSalko).characterPosition.location = 1;
 		endGraphics(kCharacterSalko);
 		setDoor(39, kCharacterCath, 3, 10, 9);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -366,16 +417,21 @@ void LogicManager::CONS_Salko_StartPart2(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Salko_StartPart2(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		endGraphics(kCharacterSalko);
 		getCharacter(kCharacterSalko).characterPosition.car = kCarRedSleeping;
 		getCharacter(kCharacterSalko).characterPosition.position = 2740;
 		getCharacter(kCharacterSalko).characterPosition.location = 1;
 		getCharacter(kCharacterSalko).clothes = 0;
 		getCharacter(kCharacterSalko).inventoryItem = 0;
-	} else if (msg->action == 136184016) {
+		break;
+	case 136184016:
 		getCharacter(kCharacterSalko).callbacks[getCharacter(kCharacterSalko).currentCall + 8] = 1;
 		SalkoCall(&LogicManager::CONS_Salko_JoinIvo, 0, 0, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -411,11 +467,14 @@ void LogicManager::HAND_Salko_JoinIvo(HAND_PARAMS) {
 			CONS_Salko_HomeTogether(0, 0, 0, 0);
 			break;
 		}
+
 		break;
 	case 125242096:
 		getCharacter(kCharacterSalko).callbacks[getCharacter(kCharacterSalko).currentCall + 8] = 3;
 		SalkoCall(&LogicManager::CONS_Salko_DoWalkBehind, 4, 2740, 0, 0);
 		break;
+	default:
+		break;
 	}
 }
 
@@ -430,17 +489,20 @@ void LogicManager::CONS_Salko_StartPart3(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Salko_StartPart3(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			endGraphics(kCharacterSalko);
-			getCharacter(kCharacterSalko).characterPosition.car = kCarRedSleeping;
-			getCharacter(kCharacterSalko).characterPosition.position = 2740;
-			getCharacter(kCharacterSalko).characterPosition.location = 1;
-			getCharacter(kCharacterSalko).clothes = 0;
-			getCharacter(kCharacterSalko).inventoryItem = 0;
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		CONS_Salko_InComp(0, 0, 0, 0);
+		break;
+	case 12:
+		endGraphics(kCharacterSalko);
+		getCharacter(kCharacterSalko).characterPosition.car = kCarRedSleeping;
+		getCharacter(kCharacterSalko).characterPosition.position = 2740;
+		getCharacter(kCharacterSalko).characterPosition.location = 1;
+		getCharacter(kCharacterSalko).clothes = 0;
+		getCharacter(kCharacterSalko).inventoryItem = 0;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -455,19 +517,27 @@ void LogicManager::CONS_Salko_InComp(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Salko_InComp(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 18 && getCharacter(kCharacterSalko).callbacks[getCharacter(kCharacterSalko).currentCall + 8] == 1)
-			getCharacterCurrentParams(kCharacterSalko)[0] = 0;
-	} else {
-		if (_gameTime >= 2200500)
-			return;
-		if (getCharacterCurrentParams(kCharacterSalko)[0] || (getCharacterCurrentParams(kCharacterSalko)[0] = _gameTime + 81000, _gameTime != -81000)) {
-			if (getCharacterCurrentParams(kCharacterSalko)[0] >= _gameTime)
-				return;
-			getCharacterCurrentParams(kCharacterSalko)[0] = 0x7FFFFFFF;
+	switch (msg->action) {
+	case 0:
+		if (_gameTime < 2200500) {
+			if (getCharacterCurrentParams(kCharacterSalko)[0] || (getCharacterCurrentParams(kCharacterSalko)[0] = _gameTime + 81000, _gameTime != -81000)) {
+				if (getCharacterCurrentParams(kCharacterSalko)[0] >= _gameTime)
+					break;
+				getCharacterCurrentParams(kCharacterSalko)[0] = 0x7FFFFFFF;
+			}
+
+			getCharacter(kCharacterSalko).callbacks[getCharacter(kCharacterSalko).currentCall + 8] = 1;
+			SalkoCall(&LogicManager::CONS_Salko_EavesdropAnna, 0, 0, 0, 0);
 		}
-		getCharacter(kCharacterSalko).callbacks[getCharacter(kCharacterSalko).currentCall + 8] = 1;
-		SalkoCall(&LogicManager::CONS_Salko_EavesdropAnna, 0, 0, 0, 0);
+
+		break;
+	case 18:
+		if (getCharacter(kCharacterSalko).callbacks[getCharacter(kCharacterSalko).currentCall + 8] == 1)
+			getCharacterCurrentParams(kCharacterSalko)[0] = 0;
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -482,77 +552,91 @@ void LogicManager::CONS_Salko_EavesdropAnna(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Salko_EavesdropAnna(HAND_PARAMS) {
-	if (msg->action > 12) {
-		if (msg->action == 18) {
-			switch (getCharacter(kCharacterSalko).callbacks[getCharacter(kCharacterSalko).currentCall + 8]) {
-			case 1:
-				getCharacter(kCharacterSalko).characterPosition.location = 0;
-				if (getCharacter(kCharacterSalko).characterPosition.position < 2087)
-					getCharacter(kCharacterSalko).characterPosition.position = 2088;
-				getCharacter(kCharacterSalko).callbacks[getCharacter(kCharacterSalko).currentCall + 8] = 2;
-				SalkoCall(&LogicManager::CONS_Salko_DoWalk, 4, 4070, 0, 0);
-				break;
-			case 2:
-				startCycOtis(kCharacterSalko, "612AF");
-				softBlockAtDoor(kCharacterSalko, 37);
-				break;
-			case 3:
-				send(kCharacterSalko, kCharacterSalko, 101169464, 0);
-				goto LABEL_18;
-			case 4:
-				softReleaseAtDoor(kCharacterSalko, 37);
-				getCharacter(kCharacterSalko).callbacks[getCharacter(kCharacterSalko).currentCall + 8] = 5;
-				SalkoCall(&LogicManager::CONS_Salko_DoWalk, 4, 9460, 0, 0);
-				break;
-			case 5:
-				getCharacter(kCharacterSalko).callbacks[getCharacter(kCharacterSalko).currentCall + 8] = 6;
-				SalkoCall(&LogicManager::CONS_Salko_DoWait, 4500, 0, 0, 0);
-				break;
-			case 6:
-				getCharacter(kCharacterSalko).callbacks[getCharacter(kCharacterSalko).currentCall + 8] = 7;
-				SalkoCall(&LogicManager::CONS_Salko_DoWalk, 4, 2740, 0, 0);
-				break;
-			case 7:
-				getCharacter(kCharacterSalko).callbacks[getCharacter(kCharacterSalko).currentCall + 8] = 8;
-				SalkoCall(&LogicManager::CONS_Salko_DoCorrOtis, "612Ch", 39, 0, 0);
-				break;
-			case 8:
-				getCharacter(kCharacterSalko).characterPosition.location = 1;
-				getCharacter(kCharacterSalko).characterPosition.position = 2740;
-				endGraphics(kCharacterSalko);
-
-				getCharacter(kCharacterSalko).currentCall--;
-				_engine->getMessageManager()->setMessageHandle(kCharacterSalko, _functionsSalko[getCharacter(kCharacterSalko).callbacks[getCharacter(kCharacterSalko).currentCall]]);
-				fedEx(kCharacterSalko, kCharacterSalko, 18, 0);
-				break;
-			default:
-				return;
-			}
-		} else if (msg->action == 101169464) {
-			getCharacter(kCharacterSalko).callbacks[getCharacter(kCharacterSalko).currentCall + 8] = 4;
-			SalkoCall(&LogicManager::CONS_Salko_DoCorrOtis, "612Bf", 37, 0, 0);
+	switch (msg->action) {
+	case 0:
+		if (whoOnScreen(kCharacterSalko) && nearChar(kCharacterSalko, kCharacterCath, 5000)) {
+			send(kCharacterSalko, kCharacterMax, 158007856, 0);
+			getCharacter(kCharacterSalko).callbacks[getCharacter(kCharacterSalko).currentCall + 8] = 3;
+			SalkoCall(&LogicManager::CONS_Salko_DoWait, 75, 0, 0, 0);
+			break;
 		}
-	} else {
-		if (msg->action == 12) {
-			getCharacter(kCharacterSalko).callbacks[getCharacter(kCharacterSalko).currentCall + 8] = 1;
-			SalkoCall(&LogicManager::CONS_Salko_DoCorrOtis, "612DH", 0x27, 0, 0);
-			return;
+
+		if (getCharacterCurrentParams(kCharacterSalko)[0] || (getCharacterCurrentParams(kCharacterSalko)[0] = _gameTime + 4500, _gameTime != -4500)) {
+			if (getCharacterCurrentParams(kCharacterSalko)[0] >= _gameTime)
+				break;
+
+			getCharacterCurrentParams(kCharacterSalko)[0] = 0x7FFFFFFF;
 		}
-		if (msg->action == 0) {
-			if (whoOnScreen(kCharacterSalko) && nearChar(kCharacterSalko, kCharacterCath, 5000)) {
-				send(kCharacterSalko, kCharacterMax, 158007856, 0);
-				getCharacter(kCharacterSalko).callbacks[getCharacter(kCharacterSalko).currentCall + 8] = 3;
-				SalkoCall(&LogicManager::CONS_Salko_DoWait, 75, 0, 0, 0);
-				return;
-			}
-		LABEL_18:
+
+		send(kCharacterSalko, kCharacterSalko, 101169464, 0);
+		break;
+	case 12:
+		getCharacter(kCharacterSalko).callbacks[getCharacter(kCharacterSalko).currentCall + 8] = 1;
+		SalkoCall(&LogicManager::CONS_Salko_DoCorrOtis, "612DH", 0x27, 0, 0);
+		break;
+	case 18:
+		switch (getCharacter(kCharacterSalko).callbacks[getCharacter(kCharacterSalko).currentCall + 8]) {
+		case 1:
+			getCharacter(kCharacterSalko).characterPosition.location = 0;
+
+			if (getCharacter(kCharacterSalko).characterPosition.position < 2087)
+				getCharacter(kCharacterSalko).characterPosition.position = 2088;
+
+			getCharacter(kCharacterSalko).callbacks[getCharacter(kCharacterSalko).currentCall + 8] = 2;
+			SalkoCall(&LogicManager::CONS_Salko_DoWalk, 4, 4070, 0, 0);
+			break;
+		case 2:
+			startCycOtis(kCharacterSalko, "612AF");
+			softBlockAtDoor(kCharacterSalko, 37);
+			break;
+		case 3:
+			send(kCharacterSalko, kCharacterSalko, 101169464, 0);
 			if (getCharacterCurrentParams(kCharacterSalko)[0] || (getCharacterCurrentParams(kCharacterSalko)[0] = _gameTime + 4500, _gameTime != -4500)) {
 				if (getCharacterCurrentParams(kCharacterSalko)[0] >= _gameTime)
-					return;
+					break;
+
 				getCharacterCurrentParams(kCharacterSalko)[0] = 0x7FFFFFFF;
 			}
+
 			send(kCharacterSalko, kCharacterSalko, 101169464, 0);
+			break;
+		case 4:
+			softReleaseAtDoor(kCharacterSalko, 37);
+			getCharacter(kCharacterSalko).callbacks[getCharacter(kCharacterSalko).currentCall + 8] = 5;
+			SalkoCall(&LogicManager::CONS_Salko_DoWalk, 4, 9460, 0, 0);
+			break;
+		case 5:
+			getCharacter(kCharacterSalko).callbacks[getCharacter(kCharacterSalko).currentCall + 8] = 6;
+			SalkoCall(&LogicManager::CONS_Salko_DoWait, 4500, 0, 0, 0);
+			break;
+		case 6:
+			getCharacter(kCharacterSalko).callbacks[getCharacter(kCharacterSalko).currentCall + 8] = 7;
+			SalkoCall(&LogicManager::CONS_Salko_DoWalk, 4, 2740, 0, 0);
+			break;
+		case 7:
+			getCharacter(kCharacterSalko).callbacks[getCharacter(kCharacterSalko).currentCall + 8] = 8;
+			SalkoCall(&LogicManager::CONS_Salko_DoCorrOtis, "612Ch", 39, 0, 0);
+			break;
+		case 8:
+			getCharacter(kCharacterSalko).characterPosition.location = 1;
+			getCharacter(kCharacterSalko).characterPosition.position = 2740;
+			endGraphics(kCharacterSalko);
+
+			getCharacter(kCharacterSalko).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterSalko, _functionsSalko[getCharacter(kCharacterSalko).callbacks[getCharacter(kCharacterSalko).currentCall]]);
+			fedEx(kCharacterSalko, kCharacterSalko, 18, 0);
+			break;
+		default:
+			break;
 		}
+
+		break;
+	case 101169464:
+		getCharacter(kCharacterSalko).callbacks[getCharacter(kCharacterSalko).currentCall + 8] = 4;
+		SalkoCall(&LogicManager::CONS_Salko_DoCorrOtis, "612Bf", 37, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -567,7 +651,8 @@ void LogicManager::CONS_Salko_TellMilos(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Salko_TellMilos(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterSalko).characterPosition.car = kCarGreenSleeping;
 		getCharacter(kCharacterSalko).characterPosition.position = 6470;
 		getCharacter(kCharacterSalko).characterPosition.location = 0;
@@ -575,7 +660,8 @@ void LogicManager::HAND_Salko_TellMilos(HAND_PARAMS) {
 		getCharacter(kCharacterSalko).inventoryItem = 0;
 		getCharacter(kCharacterSalko).callbacks[getCharacter(kCharacterSalko).currentCall + 8] = 1;
 		SalkoCall(&LogicManager::CONS_Salko_DoWalk, 4, 2740, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		if (getCharacter(kCharacterSalko).callbacks[getCharacter(kCharacterSalko).currentCall + 8] == 1) {
 			getCharacter(kCharacterSalko).callbacks[getCharacter(kCharacterSalko).currentCall + 8] = 2;
 			SalkoCall(&LogicManager::CONS_Salko_DoCorrOtis, "612Ch", 39, 0, 0);
@@ -586,6 +672,10 @@ void LogicManager::HAND_Salko_TellMilos(HAND_PARAMS) {
 			send(kCharacterSalko, kCharacterMilos, 157691176, 0);
 			CONS_Salko_InComp(0, 0, 0, 0);
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -600,16 +690,19 @@ void LogicManager::CONS_Salko_StartPart4(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Salko_StartPart4(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			endGraphics(kCharacterSalko);
-			getCharacter(kCharacterSalko).characterPosition.position = 5420;
-			getCharacter(kCharacterSalko).characterPosition.location = 1;
-			getCharacter(kCharacterSalko).characterPosition.car = kCarRestaurant;
-			getCharacter(kCharacterSalko).inventoryItem = 0;
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		CONS_Salko_WithIvo4(0, 0, 0, 0);
+		break;
+	case 12:
+		endGraphics(kCharacterSalko);
+		getCharacter(kCharacterSalko).characterPosition.position = 5420;
+		getCharacter(kCharacterSalko).characterPosition.location = 1;
+		getCharacter(kCharacterSalko).characterPosition.car = kCarRestaurant;
+		getCharacter(kCharacterSalko).inventoryItem = 0;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -624,15 +717,21 @@ void LogicManager::CONS_Salko_WithIvo4(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Salko_WithIvo4(HAND_PARAMS) {
-	if (msg->action == 18) {
+	switch (msg->action) {
+	case 18:
 		if (getCharacter(kCharacterSalko).callbacks[getCharacter(kCharacterSalko).currentCall + 8] == 1) {
 			startCycOtis(kCharacterSalko, "BLANK");
 			getCharacter(kCharacterSalko).characterPosition.location = 1;
 			CONS_Salko_InComp4(0, 0, 0, 0);
 		}
-	} else if (msg->action == 125242096) {
+
+		break;
+	case 125242096:
 		getCharacter(kCharacterSalko).callbacks[getCharacter(kCharacterSalko).currentCall + 8] = 1;
 		SalkoCall(&LogicManager::CONS_Salko_DoWalkBehind, 4, 2740, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -647,7 +746,8 @@ void LogicManager::CONS_Salko_InComp4(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Salko_InComp4(HAND_PARAMS) {
-	if (msg->action == 18) {
+	switch (msg->action) {
+	case 18:
 		if (getCharacter(kCharacterSalko).callbacks[getCharacter(kCharacterSalko).currentCall + 8] == 1) {
 			getCharacter(kCharacterSalko).characterPosition.location = 0;
 
@@ -660,9 +760,14 @@ void LogicManager::HAND_Salko_InComp4(HAND_PARAMS) {
 			endGraphics(kCharacterSalko);
 			CONS_Salko_Hiding(0, 0, 0, 0);
 		}
-	} else if (msg->action == 55996766) {
+
+		break;
+	case 55996766:
 		getCharacter(kCharacterSalko).callbacks[getCharacter(kCharacterSalko).currentCall + 8] = 1;
 		SalkoCall(&LogicManager::CONS_Salko_DoCorrOtis, "612Dh", 39, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -677,19 +782,26 @@ void LogicManager::CONS_Salko_Hiding(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Salko_Hiding(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 18) {
-			if (getCharacter(kCharacterSalko).callbacks[getCharacter(kCharacterSalko).currentCall + 8] == 1) {
-				getCharacter(kCharacterSalko).callbacks[getCharacter(kCharacterSalko).currentCall + 8] = 2;
-				SalkoCall(&LogicManager::CONS_Salko_DoCorrOtis, "612Ch", 39, 0, 0);
-			} else if (getCharacter(kCharacterSalko).callbacks[getCharacter(kCharacterSalko).currentCall + 8] == 2) {
-				CONS_Salko_EndPart4(0, 0, 0, 0);
-			}
+	switch (msg->action) {
+	case 0:
+		if (_gameTime > 2422800 && !getCharacterCurrentParams(kCharacterSalko)[0]) {
+			getCharacterCurrentParams(kCharacterSalko)[0] = 1;
+			getCharacter(kCharacterSalko).callbacks[getCharacter(kCharacterSalko).currentCall + 8] = 1;
+			SalkoCall(&LogicManager::CONS_Salko_DoWalk, 4, 2740, 0, 0);
 		}
-	} else if (_gameTime > 2422800 && !getCharacterCurrentParams(kCharacterSalko)[0]) {
-		getCharacterCurrentParams(kCharacterSalko)[0] = 1;
-		getCharacter(kCharacterSalko).callbacks[getCharacter(kCharacterSalko).currentCall + 8] = 1;
-		SalkoCall(&LogicManager::CONS_Salko_DoWalk, 4, 2740, 0, 0);
+
+		break;
+	case 18:
+		if (getCharacter(kCharacterSalko).callbacks[getCharacter(kCharacterSalko).currentCall + 8] == 1) {
+			getCharacter(kCharacterSalko).callbacks[getCharacter(kCharacterSalko).currentCall + 8] = 2;
+			SalkoCall(&LogicManager::CONS_Salko_DoCorrOtis, "612Ch", 39, 0, 0);
+		} else if (getCharacter(kCharacterSalko).callbacks[getCharacter(kCharacterSalko).currentCall + 8] == 2) {
+			CONS_Salko_EndPart4(0, 0, 0, 0);
+		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -704,13 +816,17 @@ void LogicManager::CONS_Salko_EndPart4(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Salko_EndPart4(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		endGraphics(kCharacterSalko);
 		setDoor(39, kCharacterCath, 3, 10, 9);
 		getCharacter(kCharacterSalko).characterPosition.location = 1;
 		getCharacter(kCharacterSalko).characterPosition.position = 2740;
 		getCharacter(kCharacterSalko).characterPosition.car = kCarRedSleeping;
 		getCharacter(kCharacterSalko).inventoryItem = 0;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -725,16 +841,19 @@ void LogicManager::CONS_Salko_StartPart5(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Salko_StartPart5(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			endGraphics(kCharacterSalko);
-			getCharacter(kCharacterSalko).characterPosition.location = 1;
-			getCharacter(kCharacterSalko).characterPosition.position = 9460;
-			getCharacter(kCharacterSalko).characterPosition.car = kCarRestaurant;
-			getCharacter(kCharacterSalko).inventoryItem = 0;
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		CONS_Salko_Guarding(0, 0, 0, 0);
+		break;
+	case 12:
+		endGraphics(kCharacterSalko);
+		getCharacter(kCharacterSalko).characterPosition.location = 1;
+		getCharacter(kCharacterSalko).characterPosition.position = 9460;
+		getCharacter(kCharacterSalko).characterPosition.car = kCarRestaurant;
+		getCharacter(kCharacterSalko).inventoryItem = 0;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -749,9 +868,8 @@ void LogicManager::CONS_Salko_Guarding(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Salko_Guarding(HAND_PARAMS) {
-	int fightOutcome = 0;
-
-	if (msg->action == 18) {
+	switch (msg->action) {
+	case 18:
 		switch (getCharacter(kCharacterSalko).callbacks[getCharacter(kCharacterSalko).currentCall + 8]) {
 		case 1:
 			if (dialogRunning("MUS050"))
@@ -761,7 +879,8 @@ void LogicManager::HAND_Salko_Guarding(HAND_PARAMS) {
 			SalkoCall(&LogicManager::CONS_Salko_SaveGame, 1, 0, 0, 0);
 			break;
 		case 2:
-			fightOutcome = playFight(2004);
+		{
+			int fightOutcome = playFight(2004);
 			getCharacterCurrentParams(kCharacterSalko)[0] = fightOutcome;
 			if (fightOutcome) {
 				endGame(0, 0, 0, fightOutcome == 1);
@@ -770,17 +889,26 @@ void LogicManager::HAND_Salko_Guarding(HAND_PARAMS) {
 				getCharacter(kCharacterSalko).callbacks[getCharacter(kCharacterSalko).currentCall + 8] = 3;
 				SalkoCall(&LogicManager::CONS_Salko_SaveGame, 2, 176, 0, 0);
 			}
+
 			break;
+		}
 		case 3:
 			playNIS(kEventCathSalkoTrainTopWin);
 			send(kCharacterSalko, kCharacterVesna, 134427424, 0);
 			bumpCath(kCarRestaurant, 10, 255);
 			CONS_Salko_Disappear(0, 0, 0, 0);
 			break;
+		default:
+			break;
 		}
-	} else if (msg->action == 167992577) {
+
+		break;
+	case 167992577:
 		getCharacter(kCharacterSalko).callbacks[getCharacter(kCharacterSalko).currentCall + 8] = 1;
 		SalkoCall(&LogicManager::CONS_Salko_SaveGame, 2, 172, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 


Commit: e47afa2820c86881c5556851283834cc98e2544d
    https://github.com/scummvm/scummvm/commit/e47afa2820c86881c5556851283834cc98e2544d
Author: AndywinXp (andywinxp at gmail.com)
Date: 2025-06-16T23:12:18+02:00

Commit Message:
LASTEXPRESS: Clean up Anna logic

Changed paths:
    engines/lastexpress/characters/anna.cpp


diff --git a/engines/lastexpress/characters/anna.cpp b/engines/lastexpress/characters/anna.cpp
index 2832b0b19ac..0fb0e6e80d6 100644
--- a/engines/lastexpress/characters/anna.cpp
+++ b/engines/lastexpress/characters/anna.cpp
@@ -48,7 +48,7 @@ void LogicManager::CONS_Anna(int chapter) {
 		CONS_Anna_StartPart5(0, 0, 0, 0);
 		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -69,23 +69,31 @@ void LogicManager::CONS_Anna_DebugWalks(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Anna_DebugWalks(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 1) {
-			getCharacter(kCharacterAnna).clothes++;
-			if (getCharacter(kCharacterAnna).clothes > 3)
-				getCharacter(kCharacterAnna).clothes = 0;
-		} else if (msg->action == 12) {
-			getCharacter(kCharacterAnna).characterPosition.position = 0;
-			getCharacter(kCharacterAnna).characterPosition.location = 0;
-			getCharacter(kCharacterAnna).characterPosition.car = kCarGreenSleeping;
-			getCharacter(kCharacterAnna).inventoryItem = 0x80;
-			getCharacterCurrentParams(kCharacterAnna)[0] = 10000;
+	switch (msg->action) {
+	case 0:
+		if (walk(kCharacterAnna, kCarGreenSleeping, getCharacterCurrentParams(kCharacterAnna)[0])) {
+			if (getCharacterCurrentParams(kCharacterAnna)[0] == 10000)
+				getCharacterCurrentParams(kCharacterAnna)[0] = 0;
+			else
+				getCharacterCurrentParams(kCharacterAnna)[0] = 10000;
 		}
-	} else if (walk(kCharacterAnna, kCarGreenSleeping, getCharacterCurrentParams(kCharacterAnna)[0])) {
-		if (getCharacterCurrentParams(kCharacterAnna)[0] == 10000)
-			getCharacterCurrentParams(kCharacterAnna)[0] = 0;
-		else
-			getCharacterCurrentParams(kCharacterAnna)[0] = 10000;
+
+		break;
+	case 1:
+		getCharacter(kCharacterAnna).clothes++;
+		if (getCharacter(kCharacterAnna).clothes > 3)
+			getCharacter(kCharacterAnna).clothes = 0;
+
+		break;
+	case 12:
+		getCharacter(kCharacterAnna).characterPosition.position = 0;
+		getCharacter(kCharacterAnna).characterPosition.location = 0;
+		getCharacter(kCharacterAnna).characterPosition.car = kCarGreenSleeping;
+		getCharacter(kCharacterAnna).inventoryItem = 0x80;
+		getCharacterCurrentParams(kCharacterAnna)[0] = 10000;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -102,12 +110,17 @@ void LogicManager::CONS_Anna_DoSeqOtis(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Anna_DoSeqOtis(HAND_PARAMS) {
-	if (msg->action == 3) {
+	switch (msg->action) {
+	case 3:
 		getCharacter(kCharacterAnna).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterAnna, _functionsAnna[getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall]]);
 		fedEx(kCharacterAnna, kCharacterAnna, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		startSeqOtis(kCharacterAnna, (char *)&getCharacterCurrentParams(kCharacterAnna)[0]);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -127,14 +140,19 @@ void LogicManager::CONS_Anna_DoBlockSeqOtis(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Anna_DoBlockSeqOtis(HAND_PARAMS) {
-	if (msg->action == 3) {
+	switch (msg->action) {
+	case 3:
 		releaseView(kCharacterAnna, getCharacterCurrentParams(kCharacterAnna)[3], getCharacterCurrentParams(kCharacterAnna)[4]);
 		getCharacter(kCharacterAnna).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterAnna, _functionsAnna[getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall]]);
 		fedEx(kCharacterAnna, kCharacterAnna, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		startSeqOtis(kCharacterAnna, (char *)&getCharacterCurrentParams(kCharacterAnna)[0]);
 		blockView(kCharacterAnna, getCharacterCurrentParams(kCharacterAnna)[3], getCharacterCurrentParams(kCharacterAnna)[4]);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -153,14 +171,19 @@ void LogicManager::CONS_Anna_DoCorrOtis(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Anna_DoCorrOtis(HAND_PARAMS) {
-	if (msg->action == 3) {
+	switch (msg->action) {
+	case 3:
 		releaseAtDoor(kCharacterAnna, getCharacterCurrentParams(kCharacterAnna)[3]);
 		getCharacter(kCharacterAnna).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterAnna, _functionsAnna[getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall]]);
 		fedEx(kCharacterAnna, kCharacterAnna, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		startSeqOtis(kCharacterAnna, (char *)&getCharacterCurrentParams(kCharacterAnna)[0]);
 		blockAtDoor(kCharacterAnna, getCharacterCurrentParams(kCharacterAnna)[3]);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -175,16 +198,22 @@ void LogicManager::CONS_Anna_FinishSeqOtis(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Anna_FinishSeqOtis(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		if (getCharacter(kCharacterAnna).direction != 4) {
 			getCharacter(kCharacterAnna).currentCall--;
 			_engine->getMessageManager()->setMessageHandle(kCharacterAnna, _functionsAnna[getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall]]);
 			fedEx(kCharacterAnna, kCharacterAnna, 18, 0);
 		}
-	} else if (msg->action == 3) {
+
+		break;
+	case 3:
 		getCharacter(kCharacterAnna).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterAnna, _functionsAnna[getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall]]);
 		fedEx(kCharacterAnna, kCharacterAnna, 18, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -221,6 +250,7 @@ void LogicManager::HAND_Anna_DoJoinedSeqOtis(HAND_PARAMS) {
 			fedEx(kCharacterAnna, getCharacterCurrentParams(kCharacterAnna)[3], getCharacterCurrentParams(kCharacterAnna)[4], (char *)&getCharacterCurrentParams(kCharacterAnna)[5]);
 			getCharacterCurrentParams(kCharacterAnna)[8] = 1;
 		}
+
 		break;
 	case 12:
 		startSeqOtis(kCharacterAnna, (char *)&getCharacterCurrentParams(kCharacterAnna)[0]);
@@ -241,12 +271,17 @@ void LogicManager::CONS_Anna_DoDialog(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Anna_DoDialog(HAND_PARAMS) {
-	if (msg->action == 2) {
+	switch (msg->action) {
+	case 2:
 		getCharacter(kCharacterAnna).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterAnna, _functionsAnna[getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall]]);
 		fedEx(kCharacterAnna, kCharacterAnna, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		playDialog(kCharacterAnna, (char *)&getCharacterCurrentParams(kCharacterAnna)[0], -1, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -261,16 +296,18 @@ void LogicManager::CONS_Anna_WaitRCClear(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Anna_WaitRCClear(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
+	case 12:
 		if (rcClear()) {
 			getCharacter(kCharacterAnna).currentCall--;
 			_engine->getMessageManager()->setMessageHandle(kCharacterAnna, _functionsAnna[getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall]]);
 			fedEx(kCharacterAnna, kCharacterAnna, 18, 0);
 		}
-	} else if (msg->action == 12 && rcClear()) {
-		getCharacter(kCharacterAnna).currentCall--;
-		_engine->getMessageManager()->setMessageHandle(kCharacterAnna, _functionsAnna[getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall]]);
-		fedEx(kCharacterAnna, kCharacterAnna, 18, 0);
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -288,22 +325,25 @@ void LogicManager::CONS_Anna_SaveGame(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Anna_SaveGame(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			save(
-				kCharacterAnna,
-				getCharacterCurrentParams(kCharacterAnna)[0],
-				getCharacterCurrentParams(kCharacterAnna)[1]
-			);
+	switch (msg->action) {
+	case 0:
+		getCharacter(kCharacterAnna).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterAnna, _functionsAnna[getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall]]);
+		fedEx(kCharacterAnna, kCharacterAnna, 18, 0);
+		break;
+	case 12:
+		save(
+			kCharacterAnna,
+			getCharacterCurrentParams(kCharacterAnna)[0],
+			getCharacterCurrentParams(kCharacterAnna)[1]
+		);
 
-			getCharacter(kCharacterAnna).currentCall--;
-			_engine->getMessageManager()->setMessageHandle(kCharacterAnna, _functionsAnna[getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall]]);
-			fedEx(kCharacterAnna, kCharacterAnna, 18, 0);
-		}
-	} else {
 		getCharacter(kCharacterAnna).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterAnna, _functionsAnna[getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall]]);
 		fedEx(kCharacterAnna, kCharacterAnna, 18, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -343,7 +383,7 @@ void LogicManager::HAND_Anna_DoWalk(HAND_PARAMS) {
 		playChrExcuseMe(kCharacterAnna, kCharacterCath, 0);
 		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -360,11 +400,12 @@ void LogicManager::CONS_Anna_DoWait(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Anna_DoWait(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		if (getCharacterCurrentParams(kCharacterAnna)[1] ||
 			(getCharacterCurrentParams(kCharacterAnna)[1] = _gameTime + getCharacterCurrentParams(kCharacterAnna)[0], _gameTime + getCharacterCurrentParams(kCharacterAnna)[0] != 0)) {
 			if (getCharacterCurrentParams(kCharacterAnna)[1] >= _gameTime)
-				return;
+				break;
 
 			getCharacterCurrentParams(kCharacterAnna)[1] = 0x7FFFFFFF;
 		}
@@ -372,6 +413,9 @@ void LogicManager::HAND_Anna_DoWait(HAND_PARAMS) {
 		getCharacter(kCharacterAnna).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterAnna, _functionsAnna[getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall]]);
 		fedEx(kCharacterAnna, kCharacterAnna, 18, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -390,38 +434,48 @@ void LogicManager::HAND_Anna_PracticeMusic(HAND_PARAMS) {
 	case 0:
 		if (!getCharacterCurrentParams(kCharacterAnna)[1] && getCharacterParams(kCharacterAnna, 8)[0])
 			getCharacterCurrentParams(kCharacterAnna)[1] = 1;
-		if (!getCharacterCurrentParams(kCharacterAnna)[5])
-			goto LABEL_11;
-		if (!getCharacterCurrentParams(kCharacterAnna)[6]) {
-			getCharacterCurrentParams(kCharacterAnna)[6] = _currentGameSessionTicks + 75;
-			if (_currentGameSessionTicks == -75)
-				goto LABEL_10;
-		}
-		if (getCharacterCurrentParams(kCharacterAnna)[6] < _currentGameSessionTicks) {
-			getCharacterCurrentParams(kCharacterAnna)[6] = 0x7FFFFFFF;
-		LABEL_10:
-			send(kCharacterAnna, kCharacterAnna, 2, 0);
-			getCharacterCurrentParams(kCharacterAnna)[5] = 0;
-			getCharacterCurrentParams(kCharacterAnna)[6] = 0;
+
+		if (getCharacterCurrentParams(kCharacterAnna)[5]) {
+			bool skip = false; // Horrible way to unroll a goto...
+
+			if (!getCharacterCurrentParams(kCharacterAnna)[6]) {
+				getCharacterCurrentParams(kCharacterAnna)[6] = _currentGameSessionTicks + 75;
+				if (_currentGameSessionTicks == -75) {
+					skip = true;
+					send(kCharacterAnna, kCharacterAnna, 2, 0);
+					getCharacterCurrentParams(kCharacterAnna)[5] = 0;
+					getCharacterCurrentParams(kCharacterAnna)[6] = 0;
+				}
+			}
+
+			if (!skip && getCharacterCurrentParams(kCharacterAnna)[6] < _currentGameSessionTicks) {
+				getCharacterCurrentParams(kCharacterAnna)[6] = 0x7FFFFFFF;
+				send(kCharacterAnna, kCharacterAnna, 2, 0);
+				getCharacterCurrentParams(kCharacterAnna)[5] = 0;
+				getCharacterCurrentParams(kCharacterAnna)[6] = 0;
+			}
 		}
-	LABEL_11:
+
 		if (getCharacterCurrentParams(kCharacterAnna)[3]) {
 			if (getCharacterCurrentParams(kCharacterAnna)[7] || (getCharacterCurrentParams(kCharacterAnna)[7] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
 				if (getCharacterCurrentParams(kCharacterAnna)[7] >= _currentGameSessionTicks)
-					return;
+					break;
+
 				getCharacterCurrentParams(kCharacterAnna)[7] = 0x7FFFFFFF;
 			}
+
 			getCharacterCurrentParams(kCharacterAnna)[3] = 0;
 			getCharacterCurrentParams(kCharacterAnna)[4] = 1;
 			setDoor(37, kCharacterAnna, 1, 0, 9);
 			setDoor(53, kCharacterAnna, 1, 0, 9);
-			--getCharacterCurrentParams(kCharacterAnna)[0];
+			getCharacterCurrentParams(kCharacterAnna)[0]--;
 			send(kCharacterAnna, kCharacterAnna, 2, 0);
 			getCharacterCurrentParams(kCharacterAnna)[7] = 0;
 		} else {
 			getCharacterCurrentParams(kCharacterAnna)[7] = 0;
 		}
-		return;
+
+		break;
 	case 2:
 		if (getCharacterCurrentParams(kCharacterAnna)[1]) {
 			getCharacter(kCharacterAnna).currentCall--;
@@ -431,7 +485,8 @@ void LogicManager::HAND_Anna_PracticeMusic(HAND_PARAMS) {
 			getCharacterCurrentParams(kCharacterAnna)[0]++;
 			switch (getCharacterCurrentParams(kCharacterAnna)[0]) {
 			case 1:
-				goto LABEL_21;
+				playDialog(kCharacterAnna, "ANN2135A", -1, 0);
+				break;
 			case 2:
 				playDialog(kCharacterAnna, "ANN2135B", -1, 0);
 				break;
@@ -468,14 +523,16 @@ void LogicManager::HAND_Anna_PracticeMusic(HAND_PARAMS) {
 				fedEx(kCharacterAnna, kCharacterAnna, 18, 0);
 				break;
 			default:
-				return;
+				break;
 			}
 		}
-		return;
+
+		break;
 	case 8:
 		if (getCharacterCurrentParams(kCharacterAnna)[3]) {
 			setDoor(37, kCharacterAnna, 1, 0, 9);
 			setDoor(53, kCharacterAnna, 1, 0, 9);
+
 			if (msg->param.intParam == 53) {
 				playDialog(kCharacterCath, getCathWCDialog(), -1, 0);
 			} else if (cathHasItem(kItemPassengerList)) {
@@ -488,7 +545,6 @@ void LogicManager::HAND_Anna_PracticeMusic(HAND_PARAMS) {
 						playDialog(kCharacterCath, "CAT1506", -1, 0);
 					}
 				}
-				
 			} else {
 				playDialog(kCharacterCath, getCathSorryDialog(), -1, 0);
 			}
@@ -502,25 +558,29 @@ void LogicManager::HAND_Anna_PracticeMusic(HAND_PARAMS) {
 			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
 			AnnaCall(&LogicManager::CONS_Anna_DoDialog, "LIB012", 0, 0, 0);
 		}
-		return;
+
+		break;
 	case 9:
 		endDialog(kCharacterAnna);
 		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 3;
 		AnnaCall(&LogicManager::CONS_Anna_DoDialog, "LIB013", 0, 0, 0);
-		return;
+		break;
 	case 12:
 		getCharacterCurrentParams(kCharacterAnna)[0] = 1;
 		setDoor(37, kCharacterAnna, 1, 10, 9);
 		setDoor(53, kCharacterAnna, 1, 10, 9);
 		setDoor(45, kCharacterCath, 0, 255, 255);
+
 		if (checkCathDir(kCarRedSleeping, 78))
 			bumpCath(kCarRedSleeping, 49, 255);
+
 		startCycOtis(kCharacterAnna, "418C");
+
 		if (whoRunningDialog(kCharacterAnna))
 			fadeDialog(kCharacterAnna);
-	LABEL_21:
+
 		playDialog(kCharacterAnna, "ANN2135A", -1, 0);
-		return;
+		break;
 	case 17:
 		if (getCharacterCurrentParams(kCharacterAnna)[4] || getCharacterCurrentParams(kCharacterAnna)[3]) {
 			setDoor(37, kCharacterAnna, 1, 10, 9);
@@ -537,7 +597,7 @@ void LogicManager::HAND_Anna_PracticeMusic(HAND_PARAMS) {
 			}
 		}
 
-		return;
+		break;
 	case 18:
 		switch (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8]) {
 		case 1:
@@ -550,13 +610,16 @@ void LogicManager::HAND_Anna_PracticeMusic(HAND_PARAMS) {
 			getCharacterCurrentParams(kCharacterAnna)[3] = 1;
 			break;
 		case 3:
-			if (whoRunningDialog(kCharacterMax))
-				goto LABEL_61;
-			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 4;
-			AnnaCall(&LogicManager::CONS_Anna_DoDialog, "MAX1120", 0, 0, 0);
+			if (whoRunningDialog(kCharacterMax)) {
+				getCharacterCurrentParams(kCharacterAnna)[0]--;
+				getCharacterCurrentParams(kCharacterAnna)[5] = 1;
+			} else {
+				getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 4;
+				AnnaCall(&LogicManager::CONS_Anna_DoDialog, "MAX1120", 0, 0, 0);
+			}
+
 			break;
 		case 4:
-		LABEL_61:
 			getCharacterCurrentParams(kCharacterAnna)[0]--;
 			getCharacterCurrentParams(kCharacterAnna)[5] = 1;
 			break;
@@ -564,11 +627,11 @@ void LogicManager::HAND_Anna_PracticeMusic(HAND_PARAMS) {
 			startCycOtis(kCharacterAnna, "418A");
 			break;
 		default:
-			return;
+			break;
 		}
-		return;
+		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -588,13 +651,18 @@ void LogicManager::CONS_Anna_DoComplexSeqOtis(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Anna_DoComplexSeqOtis(HAND_PARAMS) {
-	if (msg->action == 3) {
+	switch (msg->action) {
+	case 3:
 		getCharacter(kCharacterAnna).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterAnna, _functionsAnna[getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall]]);
 		fedEx(kCharacterAnna, kCharacterAnna, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		startSeqOtis(kCharacterAnna, (char *)&getCharacterCurrentParams(kCharacterAnna)[0]);
 		startSeqOtis(getCharacterCurrentParams(kCharacterAnna)[6], (char *)&getCharacterCurrentParams(kCharacterAnna)[3]);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -611,12 +679,13 @@ void LogicManager::CONS_Anna_DoWaitReal(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Anna_DoWaitReal(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		if (getCharacterCurrentParams(kCharacterAnna)[1] ||
 			(getCharacterCurrentParams(kCharacterAnna)[1] = _currentGameSessionTicks + getCharacterCurrentParams(kCharacterAnna)[0],
 			_currentGameSessionTicks + getCharacterCurrentParams(kCharacterAnna)[0] != 0)) {
 			if (getCharacterCurrentParams(kCharacterAnna)[1] >= _currentGameSessionTicks)
-				return;
+				break;
 
 			getCharacterCurrentParams(kCharacterAnna)[1] = 0x7FFFFFFF;
 		}
@@ -624,6 +693,9 @@ void LogicManager::HAND_Anna_DoWaitReal(HAND_PARAMS) {
 		getCharacter(kCharacterAnna).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterAnna, _functionsAnna[getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall]]);
 		fedEx(kCharacterAnna, kCharacterAnna, 18, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -642,129 +714,135 @@ void LogicManager::CONS_Anna_CompLogic(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Anna_CompLogic(HAND_PARAMS) {
-	if (msg->action <= 18) {
-		switch (msg->action) {
-		case 0:
-			if (getCharacterCurrentParams(kCharacterAnna)[0] < _gameTime && !getCharacterCurrentParams(kCharacterAnna)[6]) {
-				getCharacterCurrentParams(kCharacterAnna)[6] = 1;
-				setDoor(37, kCharacterCath, 1, 10, 9);
-				setDoor(53, kCharacterCath, 1, 10, 9);
+	switch (msg->action) {
+	case 0:
+		if (getCharacterCurrentParams(kCharacterAnna)[0] < _gameTime && !getCharacterCurrentParams(kCharacterAnna)[6]) {
+			getCharacterCurrentParams(kCharacterAnna)[6] = 1;
+			setDoor(37, kCharacterCath, 1, 10, 9);
+			setDoor(53, kCharacterCath, 1, 10, 9);
 
-				getCharacter(kCharacterAnna).currentCall--;
-				_engine->getMessageManager()->setMessageHandle(kCharacterAnna, _functionsAnna[getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall]]);
-				fedEx(kCharacterAnna, kCharacterAnna, 18, 0);
-				return;
+			getCharacter(kCharacterAnna).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterAnna, _functionsAnna[getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall]]);
+			fedEx(kCharacterAnna, kCharacterAnna, 18, 0);
+			break;
+		}
+
+		if (getCharacterCurrentParams(kCharacterAnna)[4]) {
+			if (getCharacterCurrentParams(kCharacterAnna)[7] || (getCharacterCurrentParams(kCharacterAnna)[7] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
+				if (getCharacterCurrentParams(kCharacterAnna)[7] >= _currentGameSessionTicks)
+					break;
+
+				getCharacterCurrentParams(kCharacterAnna)[7] = 0x7FFFFFFF;
 			}
-			if (getCharacterCurrentParams(kCharacterAnna)[4]) {
-				if (getCharacterCurrentParams(kCharacterAnna)[7] || (getCharacterCurrentParams(kCharacterAnna)[7] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
-					if (getCharacterCurrentParams(kCharacterAnna)[7] >= _currentGameSessionTicks)
-						return;
-					getCharacterCurrentParams(kCharacterAnna)[7] = 0x7FFFFFFF;
-				}
-				getCharacterCurrentParams(kCharacterAnna)[4] = 0;
-				getCharacterCurrentParams(kCharacterAnna)[5] = 1;
 
+			getCharacterCurrentParams(kCharacterAnna)[4] = 0;
+			getCharacterCurrentParams(kCharacterAnna)[5] = 1;
+
+			setDoor(37, kCharacterAnna, 1, 0, !inComp(kCharacterMax, kCarRedSleeping, 4070) ? 0 : 9);
+			setDoor(53, kCharacterAnna, 1, 0, !inComp(kCharacterMax, kCarRedSleeping, 4070) ? 0 : 9);
+			getCharacterCurrentParams(kCharacterAnna)[7] = 0;
+		} else {
+			getCharacterCurrentParams(kCharacterAnna)[7] = 0;
+		}
+
+		break;
+	case 8:
+	case 9:
+		if (msg->action == 9 && inComp(kCharacterMax, kCarRedSleeping, 4070)) {
+			setDoor(37, kCharacterAnna, 1, 0, 0);
+			setDoor(53, kCharacterAnna, 1, 0, 0);
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
+			AnnaCall(&LogicManager::CONS_Anna_DoDialog, "LIB013", 0, 0, 0);
+		} else {
+			if (getCharacterCurrentParams(kCharacterAnna)[4]) {
 				setDoor(37, kCharacterAnna, 1, 0, !inComp(kCharacterMax, kCarRedSleeping, 4070) ? 0 : 9);
 				setDoor(53, kCharacterAnna, 1, 0, !inComp(kCharacterMax, kCarRedSleeping, 4070) ? 0 : 9);
-				getCharacterCurrentParams(kCharacterAnna)[7] = 0;
-			} else {
-				getCharacterCurrentParams(kCharacterAnna)[7] = 0;
-			}
-			break;
-		case 8:
-			goto LABEL_26;
-		case 9:
-			if (inComp(kCharacterMax, kCarRedSleeping, 4070)) {
-				setDoor(37, kCharacterAnna, 1, 0, 0);
-				setDoor(53, kCharacterAnna, 1, 0, 0);
-				getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
-				AnnaCall(&LogicManager::CONS_Anna_DoDialog, "LIB013", 0, 0, 0);
-			} else {
-			LABEL_26:
-				if (getCharacterCurrentParams(kCharacterAnna)[4]) {
-					setDoor(37, kCharacterAnna, 1, 0, !inComp(kCharacterMax, kCarRedSleeping, 4070) ? 0 : 9);
-					setDoor(53, kCharacterAnna, 1, 0, !inComp(kCharacterMax, kCarRedSleeping, 4070) ? 0 : 9);
-
-					if (msg->param.intParam == 53) {
-						getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 6;
-						AnnaCall(&LogicManager::CONS_Anna_DoDialog, getCathWCDialog(), 0, 0, 0);
-					} else if (cathHasItem(kItemPassengerList)) {
-						getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 7;
-						if (rnd(2)) {
-							AnnaCall(&LogicManager::CONS_Anna_DoDialog, getCathSorryDialog(), 0, 0, 0);
+
+				if (msg->param.intParam == 53) {
+					getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 6;
+					AnnaCall(&LogicManager::CONS_Anna_DoDialog, getCathWCDialog(), 0, 0, 0);
+				} else if (cathHasItem(kItemPassengerList)) {
+					getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 7;
+					if (rnd(2)) {
+						AnnaCall(&LogicManager::CONS_Anna_DoDialog, getCathSorryDialog(), 0, 0, 0);
+					} else {
+						if (rnd(2) == 0) {
+							AnnaCall(&LogicManager::CONS_Anna_DoDialog, "CAT1506A", 0, 0, 0);
 						} else {
-							if (rnd(2) == 0) {
-								AnnaCall(&LogicManager::CONS_Anna_DoDialog, "CAT1506A", 0, 0, 0);
-							} else {
-								AnnaCall(&LogicManager::CONS_Anna_DoDialog, "CAT1506", 0, 0, 0);
-							}
+							AnnaCall(&LogicManager::CONS_Anna_DoDialog, "CAT1506", 0, 0, 0);
 						}
-					} else {
-						getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 8;
-						AnnaCall(&LogicManager::CONS_Anna_DoDialog, getCathSorryDialog(), 0, 0, 0);
 					}
 				} else {
-					setDoor(37, kCharacterAnna, 1, 0, 0);
-					setDoor(53, kCharacterAnna, 1, 0, 0);
-					if (msg->action == 8) {
-						getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 3;
-						AnnaCall(&LogicManager::CONS_Anna_DoDialog, "LIB012", 0, 0, 0);
-					} else {
-						getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 4;
-						AnnaCall(&LogicManager::CONS_Anna_DoDialog, "LIB013", 0, 0, 0);
-					}
+					getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 8;
+					AnnaCall(&LogicManager::CONS_Anna_DoDialog, getCathSorryDialog(), 0, 0, 0);
+				}
+			} else {
+				setDoor(37, kCharacterAnna, 1, 0, 0);
+				setDoor(53, kCharacterAnna, 1, 0, 0);
+				if (msg->action == 8) {
+					getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 3;
+					AnnaCall(&LogicManager::CONS_Anna_DoDialog, "LIB012", 0, 0, 0);
+				} else {
+					getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 4;
+					AnnaCall(&LogicManager::CONS_Anna_DoDialog, "LIB013", 0, 0, 0);
 				}
 			}
-			return;
-		case 12:
+		}
+
+		break;
+	case 12:
+		setDoor(37, kCharacterAnna, 1, 10, 9);
+		setDoor(53, kCharacterAnna, 1, 10, 9);
+		startCycOtis(kCharacterAnna, (char *)&getCharacterCurrentParams(kCharacterAnna)[1]);
+		break;
+	case 17:
+		if (getCharacterCurrentParams(kCharacterAnna)[5] || getCharacterCurrentParams(kCharacterAnna)[4]) {
 			setDoor(37, kCharacterAnna, 1, 10, 9);
 			setDoor(53, kCharacterAnna, 1, 10, 9);
-			startCycOtis(kCharacterAnna, (char *)&getCharacterCurrentParams(kCharacterAnna)[1]);
-			return;
-		case 17:
-			if (getCharacterCurrentParams(kCharacterAnna)[5] || getCharacterCurrentParams(kCharacterAnna)[4]) {
+			getCharacterCurrentParams(kCharacterAnna)[5] = 0;
+			getCharacterCurrentParams(kCharacterAnna)[4] = 0;
+		}
+
+		break;
+	case 18:
+		switch (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8]) {
+		case 1:
+			if (whoRunningDialog(kCharacterMax)) {
 				setDoor(37, kCharacterAnna, 1, 10, 9);
 				setDoor(53, kCharacterAnna, 1, 10, 9);
-				getCharacterCurrentParams(kCharacterAnna)[5] = 0;
-				getCharacterCurrentParams(kCharacterAnna)[4] = 0;
-			}
-			return;
-		case 18:
-			switch (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8]) {
-			case 1:
-				if (whoRunningDialog(kCharacterMax))
-					goto LABEL_25;
+			} else {
 				getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 2;
 				AnnaCall(&LogicManager::CONS_Anna_DoDialog, "MAX1120", 0, 0, 0);
-				break;
-			case 2:
-			LABEL_25:
-				setDoor(37, kCharacterAnna, 1, 10, 9);
-				setDoor(53, kCharacterAnna, 1, 10, 9);
-				break;
-			case 3:
-			case 4:
-				getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 5;
-				AnnaCall(&LogicManager::CONS_Anna_DoDialog, "ANN1016", 0, 0, 0);
-				break;
-			case 5:
-				setDoor(37, kCharacterAnna, 1, 14, 0);
-				setDoor(53, kCharacterAnna, 1, 14, 0);
-				getCharacterCurrentParams(kCharacterAnna)[4] = 1;
-				break;
-			case 6:
-			case 7:
-			case 8:
-				getCharacterCurrentParams(kCharacterAnna)[4] = 0;
-				getCharacterCurrentParams(kCharacterAnna)[5] = 1;
-				break;
-			default:
-				return;
 			}
-			return;
+
+			break;
+		case 2:
+			setDoor(37, kCharacterAnna, 1, 10, 9);
+			setDoor(53, kCharacterAnna, 1, 10, 9);
+			break;
+		case 3:
+		case 4:
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 5;
+			AnnaCall(&LogicManager::CONS_Anna_DoDialog, "ANN1016", 0, 0, 0);
+			break;
+		case 5:
+			setDoor(37, kCharacterAnna, 1, 14, 0);
+			setDoor(53, kCharacterAnna, 1, 14, 0);
+			getCharacterCurrentParams(kCharacterAnna)[4] = 1;
+			break;
+		case 6:
+		case 7:
+		case 8:
+			getCharacterCurrentParams(kCharacterAnna)[4] = 0;
+			getCharacterCurrentParams(kCharacterAnna)[5] = 1;
+			break;
 		default:
-			return;
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -779,21 +857,27 @@ void LogicManager::CONS_Anna_Birth(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Anna_Birth(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			autoMessage(kCharacterAnna, 291662081, 0);
-			autoMessage(kCharacterAnna, 238936000, 1);
-			setDoor(37, kCharacterCath, 1, 10, 9);
-			setDoor(53, kCharacterCath, 1, 10, 9);
-			setDoor(45, kCharacterCath, 1, 255, 255);
-			getCharacter(kCharacterAnna).characterPosition.position = 8200;
-			getCharacter(kCharacterAnna).characterPosition.location = 1;
-			getCharacter(kCharacterAnna).characterPosition.car = kCarGreenSleeping;
-			getCharacter(kCharacterAnna).clothes = 0;
+	switch (msg->action) {
+	case 0:
+		if (_gameTime > 1062000 && !getCharacterCurrentParams(kCharacterAnna)[0]) {
+			getCharacterCurrentParams(kCharacterAnna)[0] = 1;
+			CONS_Anna_FleeTyler(0, 0, 0, 0);
 		}
-	} else if (_gameTime > 1062000 && !getCharacterCurrentParams(kCharacterAnna)[0]) {
-		getCharacterCurrentParams(kCharacterAnna)[0] = 1;
-		CONS_Anna_FleeTyler(0, 0, 0, 0);
+
+		break;
+	case 12:
+		autoMessage(kCharacterAnna, 291662081, 0);
+		autoMessage(kCharacterAnna, 238936000, 1);
+		setDoor(37, kCharacterCath, 1, 10, 9);
+		setDoor(53, kCharacterCath, 1, 10, 9);
+		setDoor(45, kCharacterCath, 1, 255, 255);
+		getCharacter(kCharacterAnna).characterPosition.position = 8200;
+		getCharacter(kCharacterAnna).characterPosition.location = 1;
+		getCharacter(kCharacterAnna).characterPosition.car = kCarGreenSleeping;
+		getCharacter(kCharacterAnna).clothes = 0;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -827,7 +911,7 @@ void LogicManager::HAND_Anna_DoWalkP1(HAND_PARAMS) {
 			fedEx(kCharacterAnna, kCharacterAnna, 18, 0);
 		}
 
-		return;
+		break;
 	case 1:
 		if (msg->param.intParam == 8) {
 			getCharacter(kCharacterAnna).inventoryItem &= ~8;
@@ -839,7 +923,7 @@ void LogicManager::HAND_Anna_DoWalkP1(HAND_PARAMS) {
 			AnnaCall(&LogicManager::CONS_Anna_SaveGame, 2, kEventGotALight, 0, 0);
 		}
 
-		return;
+		break;
 	case 5:
 		if (_gameEvents[kEventAugustPresentAnna] || _gameEvents[kEventAugustPresentAnnaFirstIntroduction] || _gameProgress[kProgressChapter] >= 2) {
 			playDialog(kCharacterCath, "CAT1001", -1, 0);
@@ -847,10 +931,10 @@ void LogicManager::HAND_Anna_DoWalkP1(HAND_PARAMS) {
 			playCathExcuseMe();
 		}
 
-		return;
+		break;
 	case 6:
 		playChrExcuseMe(kCharacterAnna, kCharacterCath, 0);
-		return;
+		break;
 	case 12:
 		getCharacter(kCharacterAnna).inventoryItem = 0;
 		if (_gameProgress[kProgressJacket] == 2 && !_gameEvents[kEventGotALight] && !_gameEvents[kEventGotALightD] && !_gameEvents[kEventAugustPresentAnna] && !_gameEvents[kEventAugustPresentAnnaFirstIntroduction]) {
@@ -866,7 +950,8 @@ void LogicManager::HAND_Anna_DoWalkP1(HAND_PARAMS) {
 			_engine->getMessageManager()->setMessageHandle(kCharacterAnna, _functionsAnna[getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall]]);
 			fedEx(kCharacterAnna, kCharacterAnna, 18, 0);
 		}
-		return;
+
+		break;
 	case 18:
 		if (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 1) {
 			if (_gameEvents[kEventAnnaGiveScarf] || _gameEvents[kEventAnnaGiveScarfDiner] || _gameEvents[kEventAnnaGiveScarfSalon] || _gameEvents[kEventAnnaGiveScarfMonogram] || _gameEvents[kEventAnnaGiveScarfDinerMonogram] || _gameEvents[kEventAnnaGiveScarfSalonMonogram]) {
@@ -876,14 +961,13 @@ void LogicManager::HAND_Anna_DoWalkP1(HAND_PARAMS) {
 			} else {
 				playNIS(kEventAnnaGiveScarf);
 			}
+
 			if (getCharacter(kCharacterAnna).direction != 1) {
-			LABEL_55:
 				bumpCathRx(getCharacter(kCharacterAnna).characterPosition.car, getCharacter(kCharacterAnna).characterPosition.position + 750);
-				return;
 			}
 		} else {
 			if (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] != 2)
-				return;
+				break;
 
 			if (getCharacter(kCharacterAnna).direction == 1) {
 				playNIS(kEventGotALightD);
@@ -895,15 +979,18 @@ void LogicManager::HAND_Anna_DoWalkP1(HAND_PARAMS) {
 
 			int32 tmp = getCharacterCurrentParams(kCharacterAnna)[2] & 0xFFFFFF7F;
 			getCharacterCurrentParams(kCharacterAnna)[2] = tmp;
-			if (_gameProgress[1] == 2 && !_gameEvents[204] && !_gameEvents[205] && !_gameEvents[206])
+			if (_gameProgress[kProgressJacket] == 2 && !_gameEvents[kEventAnnaGiveScarfAsk] && !_gameEvents[kEventAnnaGiveScarfDinerAsk] && !_gameEvents[kEventAnnaGiveScarfSalonAsk])
 				getCharacterCurrentParams(kCharacterAnna)[2] = tmp | 8;
-			if (getCharacter(kCharacterAnna).direction != 1)
-				goto LABEL_55;
+
+			if (getCharacter(kCharacterAnna).direction != 1) {
+				bumpCathRx(getCharacter(kCharacterAnna).characterPosition.car, getCharacter(kCharacterAnna).characterPosition.position + 750);
+			}
 		}
+
 		bumpCathFx(getCharacter(kCharacterAnna).characterPosition.car, getCharacter(kCharacterAnna).characterPosition.position - 750);
-		return;
+		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -920,108 +1007,133 @@ void LogicManager::CONS_Anna_DiningLogic(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Anna_DiningLogic(HAND_PARAMS) {
-	if (msg->action > 12) {
-		if (msg->action <= 168046720) {
-			switch (msg->action) {
-			case 168046720:
-				getCharacter(kCharacterAnna).inventoryItem = 0;
-				getCharacterCurrentParams(kCharacterAnna)[3] = 1;
-				break;
-			case 17:
-				getCharacterCurrentParams(kCharacterAnna)[2] = checkCathDir(kCarRestaurant, 62);
-				break;
-			case 18:
-				if (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 1) {
-					if (_gameEvents[kEventAnnaGiveScarf] || _gameEvents[kEventAnnaGiveScarfDiner] || _gameEvents[kEventAnnaGiveScarfSalon] || _gameEvents[kEventAnnaGiveScarfMonogram] || _gameEvents[kEventAnnaGiveScarfDinerMonogram] || _gameEvents[kEventAnnaGiveScarfSalonMonogram]) {
-						playNIS(kEventAnnaGiveScarfDinerAsk);
+	switch (msg->action) {
+	case 0:
+		if (getCharacterCurrentParams(kCharacterAnna)[0] && _gameTime > getCharacterCurrentParams(kCharacterAnna)[0] && rcClear()) {
+			getCharacter(kCharacterAnna).inventoryItem = 0;
+
+			getCharacter(kCharacterAnna).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterAnna, _functionsAnna[getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall]]);
+			fedEx(kCharacterAnna, kCharacterAnna, 18, 0);
+			break;
+		}
+
+		if (getCharacterCurrentParams(kCharacterAnna)[4] && !getCharacterCurrentParams(kCharacterAnna)[3]) {
+			if (getCharacterCurrentParams(kCharacterAnna)[5] || (getCharacterCurrentParams(kCharacterAnna)[5] = _gameTime + 900, _gameTime != -900)) {
+				if (getCharacterCurrentParams(kCharacterAnna)[5] >= _gameTime) {
+					if (getCharacterCurrentParams(kCharacterAnna)[2]) {
+						if (getCharacterCurrentParams(kCharacterAnna)[6] || (getCharacterCurrentParams(kCharacterAnna)[6] = _currentGameSessionTicks + 90, _currentGameSessionTicks != -90)) {
+							if (getCharacterCurrentParams(kCharacterAnna)[6] >= _currentGameSessionTicks)
+								break;
+
+							getCharacterCurrentParams(kCharacterAnna)[6] = 0x7FFFFFFF;
+						}
+
+						bumpCath(kCarRestaurant, 61, 255);
 					} else {
-						if (_gameEvents[kEventAugustPresentAnna] || _gameEvents[kEventAugustPresentAnnaFirstIntroduction])
-							playNIS(kEventAnnaGiveScarfDinerMonogram);
-						else
-							playNIS(kEventAnnaGiveScarfDiner);
-						getCharacterCurrentParams(kCharacterAnna)[4] = 1;
+						getCharacterCurrentParams(kCharacterAnna)[6] = 0;
 					}
-					int32 tmp = getCharacterCurrentParams(kCharacterAnna)[1] & 0xFFFFFFF7;
-					getCharacterCurrentParams(kCharacterAnna)[1] = tmp;
-					getCharacter(kCharacterAnna).inventoryItem = tmp;
-					bumpCath(kCarRestaurant, 61, 255);
-				} else if (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 2) {
-					playNIS(kEventDinerMindJoin);
-					int32 tmp = getCharacterCurrentParams(kCharacterAnna)[1] & 0xFFFFFF7F;
-					getCharacterCurrentParams(kCharacterAnna)[1] = tmp;
-					if (_gameProgress[kProgressJacket] == 2 && !_gameEvents[kEventAnnaGiveScarfAsk] && !_gameEvents[kEventAnnaGiveScarfDinerAsk] && !_gameEvents[kEventAnnaGiveScarfSalonAsk]) {
-						getCharacterCurrentParams(kCharacterAnna)[1] = tmp | 8;
-					}
-					getCharacter(kCharacterAnna).inventoryItem = getCharacterCurrentParams(kCharacterAnna)[1];
-					bumpCath(kCarRestaurant, 61, 255);
+
+					break;
 				}
-				break;
+
+				getCharacterCurrentParams(kCharacterAnna)[5] = 0x7FFFFFFF;
 			}
-			return;
-		}
-		if (msg->action > 170016384) {
-			if (msg->action != 259136835 && msg->action != 268773672)
-				return;
-		} else if (msg->action != 170016384) {
-			if (msg->action == 168627977) {
-				getCharacter(kCharacterAnna).inventoryItem = getCharacterCurrentParams(kCharacterAnna)[1];
-				getCharacterCurrentParams(kCharacterAnna)[3] = 0;
+			getCharacterCurrentParams(kCharacterAnna)[1] |= 8;
+			getCharacterCurrentParams(kCharacterAnna)[4] = 0;
+			getCharacterCurrentParams(kCharacterAnna)[5] = 0;
+		}
+
+		if (getCharacterCurrentParams(kCharacterAnna)[2]) {
+			if (getCharacterCurrentParams(kCharacterAnna)[6] || (getCharacterCurrentParams(kCharacterAnna)[6] = _currentGameSessionTicks + 90, _currentGameSessionTicks != -90)) {
+				if (getCharacterCurrentParams(kCharacterAnna)[6] >= _currentGameSessionTicks)
+					break;
+
+				getCharacterCurrentParams(kCharacterAnna)[6] = 0x7FFFFFFF;
 			}
-			return;
+
+			bumpCath(kCarRestaurant, 61, 255);
+		} else {
+			getCharacterCurrentParams(kCharacterAnna)[6] = 0;
 		}
-	LABEL_77:
-		getCharacter(kCharacterAnna).inventoryItem = 0;
 
-		getCharacter(kCharacterAnna).currentCall--;
-		_engine->getMessageManager()->setMessageHandle(kCharacterAnna, _functionsAnna[getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall]]);
-		fedEx(kCharacterAnna, kCharacterAnna, 18, 0);
-		return;
-	}
-	if (msg->action == 12) {
+		break;
+	case 1:
+		if (msg->param.intParam == 8) {
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
+			AnnaCall(&LogicManager::CONS_Anna_SaveGame, 2, kEventAnnaGiveScarf, 0, 0);
+		} else {
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 2;
+			AnnaCall(&LogicManager::CONS_Anna_SaveGame, 2, kEventDinerMindJoin, 0, 0);
+		}
+
+		break;
+	case 12:
 		if (_gameProgress[kProgressJacket] == 2 && !_gameEvents[kEventDinerMindJoin] && !_gameEvents[kEventAugustPresentAnna] && !_gameEvents[kEventAugustPresentAnnaFirstIntroduction]) {
 			getCharacterCurrentParams(kCharacterAnna)[1] |= 0x80;
 		}
+
 		if (_gameProgress[kProgressJacket] == 2 && !getCharacterCurrentParams(kCharacterAnna)[1] && !_gameEvents[kEventAnnaGiveScarfAsk] && !_gameEvents[kEventAnnaGiveScarfDinerAsk] && !_gameEvents[kEventAnnaGiveScarfSalonAsk]) {
 			getCharacterCurrentParams(kCharacterAnna)[1] = 8;
 		}
+
 		getCharacter(kCharacterAnna).inventoryItem = getCharacterCurrentParams(kCharacterAnna)[1];
-		return;
-	}
-	if (msg->action) {
-		if (msg->action == 1) {
-			if (msg->param.intParam == 8) {
-				getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
-				AnnaCall(&LogicManager::CONS_Anna_SaveGame, 2, kEventAnnaGiveScarf, 0, 0);
+		break;
+	case 17:
+		getCharacterCurrentParams(kCharacterAnna)[2] = checkCathDir(kCarRestaurant, 62);
+		break;
+	case 18:
+		if (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 1) {
+			if (_gameEvents[kEventAnnaGiveScarf] || _gameEvents[kEventAnnaGiveScarfDiner] || _gameEvents[kEventAnnaGiveScarfSalon] || _gameEvents[kEventAnnaGiveScarfMonogram] || _gameEvents[kEventAnnaGiveScarfDinerMonogram] || _gameEvents[kEventAnnaGiveScarfSalonMonogram]) {
+				playNIS(kEventAnnaGiveScarfDinerAsk);
 			} else {
-				getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 2;
-				AnnaCall(&LogicManager::CONS_Anna_SaveGame, 2, kEventDinerMindJoin, 0, 0);
+				if (_gameEvents[kEventAugustPresentAnna] || _gameEvents[kEventAugustPresentAnnaFirstIntroduction])
+					playNIS(kEventAnnaGiveScarfDinerMonogram);
+				else
+					playNIS(kEventAnnaGiveScarfDiner);
+
+				getCharacterCurrentParams(kCharacterAnna)[4] = 1;
+			}
+
+			int32 tmp = getCharacterCurrentParams(kCharacterAnna)[1] & 0xFFFFFFF7;
+			getCharacterCurrentParams(kCharacterAnna)[1] = tmp;
+			getCharacter(kCharacterAnna).inventoryItem = tmp;
+			bumpCath(kCarRestaurant, 61, 255);
+		} else if (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 2) {
+			playNIS(kEventDinerMindJoin);
+			int32 tmp = getCharacterCurrentParams(kCharacterAnna)[1] & 0xFFFFFF7F;
+			getCharacterCurrentParams(kCharacterAnna)[1] = tmp;
+
+			if (_gameProgress[kProgressJacket] == 2 && !_gameEvents[kEventAnnaGiveScarfAsk] && !_gameEvents[kEventAnnaGiveScarfDinerAsk] && !_gameEvents[kEventAnnaGiveScarfSalonAsk]) {
+				getCharacterCurrentParams(kCharacterAnna)[1] = tmp | 8;
 			}
+
+			getCharacter(kCharacterAnna).inventoryItem = getCharacterCurrentParams(kCharacterAnna)[1];
+			bumpCath(kCarRestaurant, 61, 255);
 		}
-		return;
-	}
-	if (getCharacterCurrentParams(kCharacterAnna)[0] && _gameTime > getCharacterCurrentParams(kCharacterAnna)[0] && rcClear())
-		goto LABEL_77;
-	if (getCharacterCurrentParams(kCharacterAnna)[4] && !getCharacterCurrentParams(kCharacterAnna)[3]) {
-		if (getCharacterCurrentParams(kCharacterAnna)[5] || (getCharacterCurrentParams(kCharacterAnna)[5] = _gameTime + 900, _gameTime != -900)) {
-			if (getCharacterCurrentParams(kCharacterAnna)[5] >= _gameTime)
-				goto LABEL_28;
-			getCharacterCurrentParams(kCharacterAnna)[5] = 0x7FFFFFFF;
-		}
-		getCharacterCurrentParams(kCharacterAnna)[1] |= 8;
-		getCharacterCurrentParams(kCharacterAnna)[4] = 0;
-		getCharacterCurrentParams(kCharacterAnna)[5] = 0;
-	}
-LABEL_28:
-	if (getCharacterCurrentParams(kCharacterAnna)[2]) {
-		if (getCharacterCurrentParams(kCharacterAnna)[6] || (getCharacterCurrentParams(kCharacterAnna)[6] = _currentGameSessionTicks + 90, _currentGameSessionTicks != -90)) {
-			if (getCharacterCurrentParams(kCharacterAnna)[6] >= _currentGameSessionTicks)
-				return;
-			getCharacterCurrentParams(kCharacterAnna)[6] = 0x7FFFFFFF;
-		}
-		bumpCath(kCarRestaurant, 61, 255);
-	} else {
-		getCharacterCurrentParams(kCharacterAnna)[6] = 0;
+
+		break;
+	case 168046720:
+		getCharacter(kCharacterAnna).inventoryItem = 0;
+		getCharacterCurrentParams(kCharacterAnna)[3] = 1;
+		break;
+	case 168627977:
+		getCharacter(kCharacterAnna).inventoryItem = getCharacterCurrentParams(kCharacterAnna)[1];
+		getCharacterCurrentParams(kCharacterAnna)[3] = 0;
+		break;
+	case 170016384:
+	case 259136835:
+	case 268773672:
+		getCharacter(kCharacterAnna).inventoryItem = 0;
+
+		getCharacter(kCharacterAnna).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterAnna, _functionsAnna[getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall]]);
+		fedEx(kCharacterAnna, kCharacterAnna, 18, 0);
+		break;
+	default:
+		break;
 	}
+	return;
 }
 
 void LogicManager::CONS_Anna_FleeTyler(CONS_PARAMS) {
@@ -1035,10 +1147,12 @@ void LogicManager::CONS_Anna_FleeTyler(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Anna_FleeTyler(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
 		AnnaCall(&LogicManager::CONS_Anna_DoCorrOtis, "618Ca", 1, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8]) {
 		case 1:
 			getCharacter(kCharacterAnna).characterPosition.location = 0;
@@ -1056,7 +1170,13 @@ void LogicManager::HAND_Anna_FleeTyler(HAND_PARAMS) {
 			getCharacter(kCharacterAnna).characterPosition.location = 1;
 			CONS_Anna_WaitDinner(0, 0, 0, 0);
 			break;
+		default:
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1071,10 +1191,12 @@ void LogicManager::CONS_Anna_WaitDinner(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Anna_WaitDinner(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
 		AnnaCall(&LogicManager::CONS_Anna_CompLogic, 1093500, "NONE", 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		if (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 1) {
 			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 2;
 			AnnaCall(&LogicManager::CONS_Anna_DoCorrOtis, "618Bf", 37, 0, 0);
@@ -1083,6 +1205,10 @@ void LogicManager::HAND_Anna_WaitDinner(HAND_PARAMS) {
 			send(kCharacterAnna, kCharacterMax, 71277948, 0);
 			CONS_Anna_GoDinner(0, 0, 0, 0);
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1097,10 +1223,12 @@ void LogicManager::CONS_Anna_GoDinner(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Anna_GoDinner(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
 		AnnaCall(&LogicManager::CONS_Anna_DoWalkP1, 5, 850, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8]) {
 		case 1:
 			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 2;
@@ -1114,8 +1242,10 @@ void LogicManager::HAND_Anna_GoDinner(HAND_PARAMS) {
 			break;
 		case 3:
 			startSeqOtis(kCharacterAnna, "001B");
+
 			if (inSalon(kCharacterCath))
 				advanceFrame(kCharacterAnna);
+
 			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 4;
 			AnnaCall(&LogicManager::CONS_Anna_FinishSeqOtis, 0, 0, 0, 0);
 			break;
@@ -1123,8 +1253,12 @@ void LogicManager::HAND_Anna_GoDinner(HAND_PARAMS) {
 			CONS_Anna_WaitHW(0, 0, 0, 0);
 			break;
 		default:
-			return;
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1139,12 +1273,17 @@ void LogicManager::CONS_Anna_WaitHW(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Anna_WaitHW(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		startCycOtis(kCharacterAnna, "001A");
 		send(kCharacterAnna, kCharacterHeadWait, 223262556, 0);
-	} else if (msg->action == 157370960) {
+		break;
+	case 157370960:
 		getCharacter(kCharacterAnna).characterPosition.location = 1;
 		CONS_Anna_WaitingDinner(0, 0, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1159,13 +1298,15 @@ void LogicManager::CONS_Anna_WaitingDinner(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Anna_WaitingDinner(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		startCycOtis(kCharacterAnna, "001D");
 		send(kCharacterAnna, kCharacterWaiter1, 270410280, 0);
 		send(kCharacterAnna, kCharacterTableA, 136455232, 0);
 		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
 		AnnaCall(&LogicManager::CONS_Anna_DiningLogic, 0, 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8]) {
 		case 1:
 			startCycOtis(kCharacterAnna, "001E");
@@ -1180,7 +1321,13 @@ void LogicManager::HAND_Anna_WaitingDinner(HAND_PARAMS) {
 			send(kCharacterAnna, kCharacterWaiter1, 203859488, 0);
 			CONS_Anna_WaitingDinner2(0, 0, 0, 0);
 			break;
+		default:
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1195,11 +1342,13 @@ void LogicManager::CONS_Anna_WaitingDinner2(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Anna_WaitingDinner2(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		startCycOtis(kCharacterAnna, "001G");
 		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
 		AnnaCall(&LogicManager::CONS_Anna_DiningLogic, 0, 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		if (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 1) {
 			startCycOtis(kCharacterAnna, "001H");
 			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 2;
@@ -1208,6 +1357,10 @@ void LogicManager::HAND_Anna_WaitingDinner2(HAND_PARAMS) {
 			send(kCharacterAnna, kCharacterWaiter1, 136702400, 0);
 			CONS_Anna_EatingDinner(0, 0, 0, 0);
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1222,26 +1375,33 @@ void LogicManager::CONS_Anna_EatingDinner(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Anna_EatingDinner(HAND_PARAMS) {
-	if (msg->action > 18) {
-		if (msg->action == 122358304) {
-			startCycOtis(kCharacterAnna, "BLANK");
-		} else if (msg->action == 201437056) {
-			startCycOtis(kCharacterAnna, "001J");
-			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 2;
-			AnnaCall(&LogicManager::CONS_Anna_DiningLogic, 1138500, 0, 0, 0);
-		}
-	} else if (msg->action == 18) {
+	switch (msg->action) {
+	case 12:
+		startCycOtis(kCharacterAnna, "001J");
+		_gameProgress[kProgressField28] = 1;
+		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
+		AnnaCall(&LogicManager::CONS_Anna_DiningLogic, 0, 0, 0, 0);
+
+		break;
+	case 18:
 		if (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 2) {
 			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 3;
 			AnnaCall(&LogicManager::CONS_Anna_WaitRCClear, 0, 0, 0, 0);
 		} else if (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 3) {
 			CONS_Anna_LeaveDinner(0, 0, 0, 0);
 		}
-	} else if (msg->action == 12) {
+
+		break;
+	case 122358304:
+		startCycOtis(kCharacterAnna, "BLANK");
+		break;
+	case 201437056:
 		startCycOtis(kCharacterAnna, "001J");
-		_gameProgress[kProgressField28] = 1;
-		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
-		AnnaCall(&LogicManager::CONS_Anna_DiningLogic, 0, 0, 0, 0);
+		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 2;
+		AnnaCall(&LogicManager::CONS_Anna_DiningLogic, 1138500, 0, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1256,17 +1416,20 @@ void LogicManager::CONS_Anna_LeaveDinner(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Anna_LeaveDinner(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterAnna).characterPosition.location = 0;
 		blockView(kCharacterAnna, kCarRestaurant, 62);
 		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
 		AnnaCall(&LogicManager::CONS_Anna_DoJoinedSeqOtis, "001L", 33, 103798704, "001M");
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8]) {
 		case 1:
 			releaseView(kCharacterAnna, kCarRestaurant, 62);
 			send(kCharacterAnna, kCharacterWaiter1, 237485916, 0);
 			startSeqOtis(kCharacterAnna, "801DS");
+
 			if (inDiningRoom(kCharacterCath))
 				advanceFrame(kCharacterAnna);
 
@@ -1288,8 +1451,12 @@ void LogicManager::HAND_Anna_LeaveDinner(HAND_PARAMS) {
 			CONS_Anna_FreshenUp(0, 0, 0, 0);
 			break;
 		default:
-			return;
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1304,11 +1471,13 @@ void LogicManager::CONS_Anna_FreshenUp(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Anna_FreshenUp(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		send(kCharacterAnna, kCharacterMax, 101687594, 0);
 		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
 		AnnaCall(&LogicManager::CONS_Anna_CompLogic, 1156500, "NONE", 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		if (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 1 ||
 			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 2) {
 			if (_gameProgress[kProgressField14] == 29) {
@@ -1324,6 +1493,10 @@ void LogicManager::HAND_Anna_FreshenUp(HAND_PARAMS) {
 			send(kCharacterAnna, kCharacterMax, 71277948, 0);
 			CONS_Anna_GoSalon(0, 0, 0, 0);
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1338,10 +1511,12 @@ void LogicManager::CONS_Anna_GoSalon(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Anna_GoSalon(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
 		AnnaCall(&LogicManager::CONS_Anna_DoWalkP1, 5, 850, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8]) {
 		case 1:
 			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 2;
@@ -1358,8 +1533,14 @@ void LogicManager::HAND_Anna_GoSalon(HAND_PARAMS) {
 			getCharacter(kCharacterAnna).characterPosition.location = 1;
 			CONS_Anna_WaitAugust(0, 0, 0, 0);
 			break;
+		default:
+			break;
 		}
-	}
+
+		break;
+	default:
+		break;
+	}
 }
 
 void LogicManager::CONS_Anna_WaitAugust(CONS_PARAMS) {
@@ -1373,94 +1554,120 @@ void LogicManager::CONS_Anna_WaitAugust(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Anna_WaitAugust(HAND_PARAMS) {
-	if (msg->action > 12) {
-		switch (msg->action) {
-		case 17:
-			getCharacterCurrentParams(kCharacterAnna)[0] = checkCathDir(kCarRestaurant, 56);
-			break;
-		case 18:
-			if (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 1) {
-				if (_gameEvents[kEventAnnaGiveScarf] ||
-					_gameEvents[kEventAnnaGiveScarfDiner] ||
-					_gameEvents[kEventAnnaGiveScarfSalon] ||
-					_gameEvents[kEventAnnaGiveScarfMonogram] ||
-					_gameEvents[kEventAnnaGiveScarfDinerMonogram] ||
-					_gameEvents[kEventAnnaGiveScarfSalonMonogram]) {
-					playNIS(kEventAnnaGiveScarfSalonAsk);
-				} else {
-					if (_gameEvents[kEventAugustPresentAnna] || _gameEvents[kEventAugustPresentAnnaFirstIntroduction])
-						playNIS(kEventAnnaGiveScarfSalonMonogram);
-					else
-						playNIS(kEventAnnaGiveScarfSalon);
-					getCharacterCurrentParams(kCharacterAnna)[1] = 1;
-				}
-				getCharacter(kCharacterAnna).inventoryItem &= ~8;
-				bumpCath(kCarRestaurant, 51, 255);
-			} else if (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 2) {
-				if (_gameEvents[kEventAugustPresentAnna] || _gameEvents[kEventAugustPresentAnnaFirstIntroduction])
-					playNIS(kEventAnnaConversationGoodNight);
-				else
-					playNIS(kEventAnnaIntroductionRejected);
-
-				getCharacter(kCharacterAnna).inventoryItem &= ~0x80;
-				if (_gameProgress[kProgressJacket] == 2 &&
-					!_gameEvents[kEventAnnaGiveScarfAsk] &&
-					!_gameEvents[kEventAnnaGiveScarfDinerAsk] &&
-					!_gameEvents[kEventAnnaGiveScarfSalonAsk]) {
-					getCharacter(kCharacterAnna).inventoryItem |= kItemScarf;
+	switch (msg->action) {
+	case 0:
+		if (getCharacterCurrentParams(kCharacterAnna)[1]) {
+			if (getCharacterCurrentParams(kCharacterAnna)[2] || (getCharacterCurrentParams(kCharacterAnna)[2] = _gameTime + 900, _gameTime != -900)) {
+				if (getCharacterCurrentParams(kCharacterAnna)[2] >= _gameTime) {
+					if (getCharacterCurrentParams(kCharacterAnna)[0]) {
+						if (getCharacterCurrentParams(kCharacterAnna)[3] || (getCharacterCurrentParams(kCharacterAnna)[3] = _currentGameSessionTicks + 90, _currentGameSessionTicks != -90)) {
+							if (getCharacterCurrentParams(kCharacterAnna)[3] >= _currentGameSessionTicks)
+								break;
+
+							getCharacterCurrentParams(kCharacterAnna)[3] = 0x7FFFFFFF;
+						}
+
+						bumpCath(kCarRestaurant, 55, 255);
+					} else {
+						getCharacterCurrentParams(kCharacterAnna)[3] = 0;
+					}
+
+					break;
 				}
-				bumpCath(kCarRestaurant, 51, 255);
+
+				getCharacterCurrentParams(kCharacterAnna)[2] = 0x7FFFFFFF;
 			}
-			break;
-		case 123712592:
-			getCharacter(kCharacterAnna).inventoryItem = 0;
-			CONS_Anna_FlirtAugust(0, 0, 0, 0);
-			break;
+
+			getCharacter(kCharacterAnna).inventoryItem |= kItemScarf;
+			getCharacterCurrentParams(kCharacterAnna)[1] = 0;
+			getCharacterCurrentParams(kCharacterAnna)[2] = 0;
 		}
-		return;
-	}
-	if (msg->action == 12) {
+
+		if (getCharacterCurrentParams(kCharacterAnna)[0]) {
+			if (getCharacterCurrentParams(kCharacterAnna)[3] || (getCharacterCurrentParams(kCharacterAnna)[3] = _currentGameSessionTicks + 90, _currentGameSessionTicks != -90)) {
+				if (getCharacterCurrentParams(kCharacterAnna)[3] >= _currentGameSessionTicks)
+					break;
+
+				getCharacterCurrentParams(kCharacterAnna)[3] = 0x7FFFFFFF;
+			}
+
+			bumpCath(kCarRestaurant, 55, 255);
+		} else {
+			getCharacterCurrentParams(kCharacterAnna)[3] = 0;
+		}
+
+		break;
+	case 1:
+		if (msg->param.intParam == 8) {
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
+			AnnaCall(&LogicManager::CONS_Anna_SaveGame, 2, kEventAnnaGiveScarf, 0, 0);
+		} else {
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 2;
+			AnnaCall(&LogicManager::CONS_Anna_SaveGame, 2, kEventAnnaIntroductionRejected, 0, 0);
+		}
+
+		break;
+	case 12:
 		getCharacter(kCharacterAnna).inventoryItem = 0;
-		if (_gameProgress[kProgressJacket] == 2 && !_gameEvents[15] && !_gameEvents[14])
+
+		if (_gameProgress[kProgressJacket] == 2 && !_gameEvents[kEventAnnaConversationGoodNight] && !_gameEvents[kEventAnnaIntroductionRejected])
 			getCharacter(kCharacterAnna).inventoryItem = 0x80;
+
 		if (_gameProgress[kProgressJacket] == 2 && !getCharacter(kCharacterAnna).inventoryItem && !_gameEvents[kEventAnnaGiveScarfAsk] && !_gameEvents[kEventAnnaGiveScarfDinerAsk] && !_gameEvents[kEventAnnaGiveScarfSalonAsk]) {
 			getCharacter(kCharacterAnna).inventoryItem = 8;
 		}
+
 		startCycOtis(kCharacterAnna, "104B");
-		return;
-	}
-	if (msg->action) {
-		if (msg->action == 1) {
-			if (msg->param.intParam == 8) {
-				getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
-				AnnaCall(&LogicManager::CONS_Anna_SaveGame, 2, kEventAnnaGiveScarf, 0, 0);
+		break;
+	case 17:
+		getCharacterCurrentParams(kCharacterAnna)[0] = checkCathDir(kCarRestaurant, 56);
+		break;
+	case 18:
+		if (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 1) {
+			if (_gameEvents[kEventAnnaGiveScarf] ||
+				_gameEvents[kEventAnnaGiveScarfDiner] ||
+				_gameEvents[kEventAnnaGiveScarfSalon] ||
+				_gameEvents[kEventAnnaGiveScarfMonogram] ||
+				_gameEvents[kEventAnnaGiveScarfDinerMonogram] ||
+				_gameEvents[kEventAnnaGiveScarfSalonMonogram]) {
+				playNIS(kEventAnnaGiveScarfSalonAsk);
 			} else {
-				getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 2;
-				AnnaCall(&LogicManager::CONS_Anna_SaveGame, 2, kEventAnnaIntroductionRejected, 0, 0);
+				if (_gameEvents[kEventAugustPresentAnna] || _gameEvents[kEventAugustPresentAnnaFirstIntroduction]) {
+					playNIS(kEventAnnaGiveScarfSalonMonogram);
+				} else {
+					playNIS(kEventAnnaGiveScarfSalon);
+				}
+
+				getCharacterCurrentParams(kCharacterAnna)[1] = 1;
 			}
+
+			getCharacter(kCharacterAnna).inventoryItem &= ~8;
+			bumpCath(kCarRestaurant, 51, 255);
+		} else if (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 2) {
+			if (_gameEvents[kEventAugustPresentAnna] || _gameEvents[kEventAugustPresentAnnaFirstIntroduction]) {
+				playNIS(kEventAnnaConversationGoodNight);
+			} else {
+				playNIS(kEventAnnaIntroductionRejected);
+			}
+
+			getCharacter(kCharacterAnna).inventoryItem &= ~0x80;
+			if (_gameProgress[kProgressJacket] == 2 &&
+				!_gameEvents[kEventAnnaGiveScarfAsk] &&
+				!_gameEvents[kEventAnnaGiveScarfDinerAsk] &&
+				!_gameEvents[kEventAnnaGiveScarfSalonAsk]) {
+				getCharacter(kCharacterAnna).inventoryItem |= kItemScarf;
+			}
+
+			bumpCath(kCarRestaurant, 51, 255);
 		}
-		return;
-	}
-	if (getCharacterCurrentParams(kCharacterAnna)[1]) {
-		if (getCharacterCurrentParams(kCharacterAnna)[2] || (getCharacterCurrentParams(kCharacterAnna)[2] = _gameTime + 900, _gameTime != -900)) {
-			if (getCharacterCurrentParams(kCharacterAnna)[2] >= _gameTime)
-				goto LABEL_16;
-			getCharacterCurrentParams(kCharacterAnna)[2] = 0x7FFFFFFF;
-		}
-		getCharacter(kCharacterAnna).inventoryItem |= kItemScarf;
-		getCharacterCurrentParams(kCharacterAnna)[1] = 0;
-		getCharacterCurrentParams(kCharacterAnna)[2] = 0;
-	}
-LABEL_16:
-	if (getCharacterCurrentParams(kCharacterAnna)[0]) {
-		if (getCharacterCurrentParams(kCharacterAnna)[3] || (getCharacterCurrentParams(kCharacterAnna)[3] = _currentGameSessionTicks + 90, _currentGameSessionTicks != -90)) {
-			if (getCharacterCurrentParams(kCharacterAnna)[3] >= _currentGameSessionTicks)
-				return;
-			getCharacterCurrentParams(kCharacterAnna)[3] = 0x7FFFFFFF;
-		}
-		bumpCath(kCarRestaurant, 55, 255);
-	} else {
-		getCharacterCurrentParams(kCharacterAnna)[3] = 0;
+
+		break;
+	case 123712592:
+		getCharacter(kCharacterAnna).inventoryItem = 0;
+		CONS_Anna_FlirtAugust(0, 0, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1477,62 +1684,76 @@ void LogicManager::CONS_Anna_FlirtAugust(CONS_PARAMS) {
 void LogicManager::HAND_Anna_FlirtAugust(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
-		if (getCharacterCurrentParams(kCharacterAnna)[2] == 0x7FFFFFFF || !_gameTime)
-			goto LABEL_12;
-		if (_gameTime > 1188000)
-			goto LABEL_10;
-		if (!inSalon(kCharacterCath) || !getCharacterCurrentParams(kCharacterAnna)[2]) {
-			getCharacterCurrentParams(kCharacterAnna)[2] = _gameTime + 450;
-			if (_gameTime == -450)
-				goto LABEL_11;
-		}
-		if (getCharacterCurrentParams(kCharacterAnna)[2] < _gameTime) {
-		LABEL_10:
-			getCharacterCurrentParams(kCharacterAnna)[2] = 0x7FFFFFFF;
-		LABEL_11:
-			playDialog(kCharacterAnna, "AUG1004", -1, 0);
-		}
-	LABEL_12:
-		if (!getCharacterCurrentParams(kCharacterAnna)[1] || getCharacterCurrentParams(kCharacterAnna)[3] == 0x7FFFFFFF || _gameTime <= 1179000)
-			goto LABEL_22;
-		if (_gameTime > 1192500)
-			goto LABEL_20;
-		if (!inSalon(kCharacterCath) || !getCharacterCurrentParams(kCharacterAnna)[3]) {
-			getCharacterCurrentParams(kCharacterAnna)[3] = _gameTime + 150;
-			if (_gameTime == -150)
-				goto LABEL_21;
-		}
-		if (getCharacterCurrentParams(kCharacterAnna)[3] < _gameTime) {
-		LABEL_20:
-			getCharacterCurrentParams(kCharacterAnna)[3] = 0x7FFFFFFF;
-		LABEL_21:
-			CONS_Anna_LeaveAugust(0, 0, 0, 0);
-			return;
-		}
-	LABEL_22:
+		if (getCharacterCurrentParams(kCharacterAnna)[2] != 0x7FFFFFFF && _gameTime != 0) {
+			if (_gameTime <= 1188000) {
+				bool skip = false; // Horrible way to unroll a goto...
+
+				if (!inSalon(kCharacterCath) || !getCharacterCurrentParams(kCharacterAnna)[2]) {
+					getCharacterCurrentParams(kCharacterAnna)[2] = _gameTime + 450;
+					if (_gameTime == -450) {
+						skip = true;
+						playDialog(kCharacterAnna, "AUG1004", -1, 0);
+					}
+				}
+
+				if (!skip && getCharacterCurrentParams(kCharacterAnna)[2] < _gameTime) {
+					getCharacterCurrentParams(kCharacterAnna)[2] = 0x7FFFFFFF;
+					playDialog(kCharacterAnna, "AUG1004", -1, 0);
+				}
+			} else {
+				getCharacterCurrentParams(kCharacterAnna)[2] = 0x7FFFFFFF;
+				playDialog(kCharacterAnna, "AUG1004", -1, 0);
+			}
+		}
+
+		if (getCharacterCurrentParams(kCharacterAnna)[1] != 0 && getCharacterCurrentParams(kCharacterAnna)[3] != 0x7FFFFFFF && _gameTime > 1179000) {
+			if (_gameTime <= 1192500) {
+				if (!inSalon(kCharacterCath) || !getCharacterCurrentParams(kCharacterAnna)[3]) {
+					getCharacterCurrentParams(kCharacterAnna)[3] = _gameTime + 150;
+					if (_gameTime == -150) {
+						CONS_Anna_LeaveAugust(0, 0, 0, 0);
+						break;
+					}
+				}
+
+				if (getCharacterCurrentParams(kCharacterAnna)[3] < _gameTime) {
+					getCharacterCurrentParams(kCharacterAnna)[3] = 0x7FFFFFFF;
+					CONS_Anna_LeaveAugust(0, 0, 0, 0);
+					break;
+				}
+			} else {
+				getCharacterCurrentParams(kCharacterAnna)[3] = 0x7FFFFFFF;
+				CONS_Anna_LeaveAugust(0, 0, 0, 0);
+				break;
+			}
+		}
+
 		if (getCharacterCurrentParams(kCharacterAnna)[0]) {
 			if (getCharacterCurrentParams(kCharacterAnna)[4] || (getCharacterCurrentParams(kCharacterAnna)[4] = _currentGameSessionTicks + 90, _currentGameSessionTicks != -90)) {
 				if (getCharacterCurrentParams(kCharacterAnna)[4] >= _currentGameSessionTicks)
-					return;
+					break;
+
 				getCharacterCurrentParams(kCharacterAnna)[4] = 0x7FFFFFFF;
 			}
+
 			bumpCath(kCarRestaurant, 55, 255);
 		} else {
 			getCharacterCurrentParams(kCharacterAnna)[4] = 0;
 		}
+
 		break;
 	case 2:
 		getCharacterCurrentParams(kCharacterAnna)[1] = 1;
-		return;
+		break;
 	case 12:
 		send(kCharacterAnna, kCharacterAugust, 122358304, 0);
 		startCycOtis(kCharacterAnna, "106B");
-		return;
+		break;
 	case 17:
 		getCharacterCurrentParams(kCharacterAnna)[0] = checkCathDir(kCarRestaurant, 56);
-		return;
+		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -1547,10 +1768,12 @@ void LogicManager::CONS_Anna_LeaveAugust(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Anna_LeaveAugust(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
 		AnnaCall(&LogicManager::CONS_Anna_WaitRCClear, 0, 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8]) {
 		case 1:
 			getCharacter(kCharacterAnna).characterPosition.location = 0;
@@ -1569,7 +1792,13 @@ void LogicManager::HAND_Anna_LeaveAugust(HAND_PARAMS) {
 			send(kCharacterAnna, kCharacterAugust, 159332865, 0);
 			CONS_Anna_ReturnComp(0, 0, 0, 0);
 			break;
+		default:
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1584,10 +1813,12 @@ void LogicManager::CONS_Anna_ReturnComp(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Anna_ReturnComp(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
 		AnnaCall(&LogicManager::CONS_Anna_DoWalkP1, 4, 4070, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		if (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 1) {
 			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 2;
 			AnnaCall(&LogicManager::CONS_Anna_DoCorrOtis, "618Af", 37, 0, 0);
@@ -1597,6 +1828,10 @@ void LogicManager::HAND_Anna_ReturnComp(HAND_PARAMS) {
 			getCharacter(kCharacterAnna).characterPosition.location = 1;
 			CONS_Anna_ReadyForBed(0, 0, 0, 0);
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1611,14 +1846,22 @@ void LogicManager::CONS_Anna_ReadyForBed(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Anna_ReadyForBed(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		send(kCharacterAnna, kCharacterMax, 101687594, 0);
 		getCharacterCurrentParams(kCharacterAnna)[0] = _gameTime + 4500;
 		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
 		AnnaCall(&LogicManager::CONS_Anna_CompLogic, getCharacterCurrentParams(kCharacterAnna)[0], "NONE", 0, 0);
-	} else if (msg->action == 18 && getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 1) {
-		setModel(37, 1);
-		CONS_Anna_Asleep(0, 0, 0, 0);
+		break;
+	case 18:
+		if (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 1) {
+			setModel(37, 1);
+			CONS_Anna_Asleep(0, 0, 0, 0);
+		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1635,25 +1878,29 @@ void LogicManager::CONS_Anna_Asleep(CONS_PARAMS) {
 void LogicManager::HAND_Anna_Asleep(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
-		if (getCharacterCurrentParams(kCharacterAnna)[0] || !checkCathDir(kCarRedSleeping, 60))
-			goto LABEL_18;
-		if (!getCharacterCurrentParams(kCharacterAnna)[1]) {
-			getCharacterCurrentParams(kCharacterAnna)[1] = _gameTime + 150;
-			if (_gameTime == -150)
-				goto LABEL_9;
-		}
-		if (getCharacterCurrentParams(kCharacterAnna)[1] < _gameTime) {
-			getCharacterCurrentParams(kCharacterAnna)[1] = 0x7FFFFFFF;
-		LABEL_9:
-			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
-			AnnaCall(&LogicManager::CONS_Anna_DoSeqOtis, "419B", 0, 0, 0);
-			return;
+		if (!getCharacterCurrentParams(kCharacterAnna)[0] && checkCathDir(kCarRedSleeping, 60)) {
+			if (!getCharacterCurrentParams(kCharacterAnna)[1]) {
+				getCharacterCurrentParams(kCharacterAnna)[1] = _gameTime + 150;
+				if (_gameTime == -150) {
+					getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
+					AnnaCall(&LogicManager::CONS_Anna_DoSeqOtis, "419B", 0, 0, 0);
+					break;
+				}
+			}
+
+			if (getCharacterCurrentParams(kCharacterAnna)[1] < _gameTime) {
+				getCharacterCurrentParams(kCharacterAnna)[1] = 0x7FFFFFFF;
+				getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
+				AnnaCall(&LogicManager::CONS_Anna_DoSeqOtis, "419B", 0, 0, 0);
+				break;
+			}
 		}
-	LABEL_18:
+
 		if (_gameTime > 1489500 && !getCharacterCurrentParams(kCharacterAnna)[2]) {
 			getCharacterCurrentParams(kCharacterAnna)[2] = 1;
 			CONS_Anna_WakeNight(0, 0, 0, 0);
 		}
+
 		break;
 	case 8:
 	case 9:
@@ -1666,7 +1913,8 @@ void LogicManager::HAND_Anna_Asleep(HAND_PARAMS) {
 			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 3;
 			AnnaCall(&LogicManager::CONS_Anna_DoDialog, "LIB013", 0, 0, 0);
 		}
-		return;
+
+		break;
 	case 12:
 		setDoor(37, kCharacterAnna, 1, 10, 9);
 		setDoor(53, kCharacterAnna, 1, 10, 9);
@@ -1679,31 +1927,40 @@ void LogicManager::HAND_Anna_Asleep(HAND_PARAMS) {
 		getCharacter(kCharacterAnna).characterPosition.position = 4070;
 		getCharacter(kCharacterAnna).characterPosition.location = 0;
 		startCycOtis(kCharacterAnna, "419A");
-		return;
+		break;
 	case 18:
 		switch (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8]) {
 		case 1:
 			startCycOtis(kCharacterAnna, "419C");
 			getCharacterCurrentParams(kCharacterAnna)[0] = 1;
-			goto LABEL_18;
+			if (_gameTime > 1489500 && !getCharacterCurrentParams(kCharacterAnna)[2]) {
+				getCharacterCurrentParams(kCharacterAnna)[2] = 1;
+				CONS_Anna_WakeNight(0, 0, 0, 0);
+			}
+
+			break;
 		case 2:
 		case 3:
-			if (whoRunningDialog(kCharacterMax))
-				goto LABEL_23;
-			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 4;
-			AnnaCall(&LogicManager::CONS_Anna_DoDialog, "MAX1120", 0, 0, 0);
+			if (whoRunningDialog(kCharacterMax)) {
+				setDoor(37, kCharacterAnna, 1, 10, 9);
+				setDoor(53, kCharacterAnna, 1, 10, 9);
+			} else {
+				getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 4;
+				AnnaCall(&LogicManager::CONS_Anna_DoDialog, "MAX1120", 0, 0, 0);
+			}
+
 			break;
 		case 4:
-		LABEL_23:
 			setDoor(37, kCharacterAnna, 1, 10, 9);
 			setDoor(53, kCharacterAnna, 1, 10, 9);
 			break;
 		default:
-			return;
+			break;
 		}
-		return;
+
+		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -1718,37 +1975,47 @@ void LogicManager::CONS_Anna_WakeNight(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Anna_WakeNight(HAND_PARAMS) {
-	if (msg->action > 9) {
-		if (msg->action > 18) {
-			if (msg->action == 226031488) {
-				if (whoRunningDialog(kCharacterAnna))
-					fadeDialog(kCharacterAnna);
-				send(kCharacterAnna, kCharacterMax, 71277948, 0);
-			} else if (msg->action == 238358920) {
-				getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 2;
-				AnnaCall(&LogicManager::CONS_Anna_DoCorrOtis, "608Cf", 37, 0, 0);
+	switch (msg->action) {
+	case 0:
+		if (getCharacterCurrentParams(kCharacterAnna)[0]) {
+			if (getCharacterCurrentParams(kCharacterAnna)[2] || (getCharacterCurrentParams(kCharacterAnna)[2] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
+				if (getCharacterCurrentParams(kCharacterAnna)[2] >= _currentGameSessionTicks)
+					break;
+
+				getCharacterCurrentParams(kCharacterAnna)[2] = 0x7FFFFFFF;
 			}
-		} else if (msg->action == 18) {
-			if (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 1) {
-				playNIS(kEventAnnaVisitToCompartmentGun);
-				playDialog(0, "LIB015", -1, 0);
-				getCharacter(kCharacterAnna).characterPosition.location = 0;
-				getCharacter(kCharacterAnna).characterPosition.position = 4840;
-				walk(kCharacterAnna, kCarRedSleeping, 8200);
-				bumpCathFDoor(37);
-				send(kCharacterAnna, kCharacterVassili, 339669520, 0);
-				send(kCharacterAnna, kCharacterTrainM, 339669520, 0);
-				send(kCharacterAnna, kCharacterCond2, 339669520, 0);
-				send(kCharacterAnna, kCharacterMax, 71277948, 0);
-				CONS_Anna_GoVassili(0, 0, 0, 0);
-			} else if (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 2) {
-				CONS_Anna_GoVassili(0, 0, 0, 0);
+
+			switch (getCharacterCurrentParams(kCharacterAnna)[1]) {
+			case 0:
+				playDialog(kCharacterAnna, "ANN2135E", -1, 0);
+				break;
+			case 1:
+				playDialog(kCharacterAnna, "ANN2135F", -1, 0);
+				break;
+			case 2:
+				playDialog(kCharacterAnna, "ANN2135G", -1, 0);
+				break;
+			case 3:
+				playDialog(kCharacterAnna, "ANN2135D", -1, 0);
+				break;
+			default:
+				break;
 			}
-		} else if (msg->action == 12) {
-			getCharacter(kCharacterAnna).clothes = 1;
-			getCharacterCurrentParams(kCharacterAnna)[0] = 1;
+
+			getCharacterCurrentParams(kCharacterAnna)[2] = 0;
+			getCharacterCurrentParams(kCharacterAnna)[0] = 0;
 		}
-	} else if (msg->action >= 8) {
+
+		break;
+	case 2:
+		getCharacterCurrentParams(kCharacterAnna)[1]++;
+		if (getCharacterCurrentParams(kCharacterAnna)[1] > 3)
+			getCharacterCurrentParams(kCharacterAnna)[1] = 0;
+
+		getCharacterCurrentParams(kCharacterAnna)[0] = 1;
+		break;
+	case 8:
+	case 9:
 		if (whoRunningDialog(kCharacterAnna))
 			fadeDialog(kCharacterAnna);
 
@@ -1757,44 +2024,41 @@ void LogicManager::HAND_Anna_WakeNight(HAND_PARAMS) {
 
 		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
 		AnnaCall(&LogicManager::CONS_Anna_SaveGame, 2, kEventAnnaVisitToCompartmentGun, 0, 0);
-	} else if (msg->action) {
-		if (msg->action == 2) {
-			getCharacterCurrentParams(kCharacterAnna)[1]++;
-			if (getCharacterCurrentParams(kCharacterAnna)[1] > 3)
-				getCharacterCurrentParams(kCharacterAnna)[1] = 0;
-
-			getCharacterCurrentParams(kCharacterAnna)[0] = 1;
-		}
-	} else {
-		if (!getCharacterCurrentParams(kCharacterAnna)[0])
-			return;
-
-		if (getCharacterCurrentParams(kCharacterAnna)[2] || (getCharacterCurrentParams(kCharacterAnna)[2] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
-			if (getCharacterCurrentParams(kCharacterAnna)[2] >= _currentGameSessionTicks)
-				return;
-
-			getCharacterCurrentParams(kCharacterAnna)[2] = 0x7FFFFFFF;
+		break;
+	case 12:
+		getCharacter(kCharacterAnna).clothes = 1;
+		getCharacterCurrentParams(kCharacterAnna)[0] = 1;
+		break;
+	case 18:
+		if (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 1) {
+			playNIS(kEventAnnaVisitToCompartmentGun);
+			playDialog(0, "LIB015", -1, 0);
+			getCharacter(kCharacterAnna).characterPosition.location = 0;
+			getCharacter(kCharacterAnna).characterPosition.position = 4840;
+			walk(kCharacterAnna, kCarRedSleeping, 8200);
+			bumpCathFDoor(37);
+			send(kCharacterAnna, kCharacterVassili, 339669520, 0);
+			send(kCharacterAnna, kCharacterTrainM, 339669520, 0);
+			send(kCharacterAnna, kCharacterCond2, 339669520, 0);
+			send(kCharacterAnna, kCharacterMax, 71277948, 0);
+			CONS_Anna_GoVassili(0, 0, 0, 0);
+		} else if (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 2) {
+			CONS_Anna_GoVassili(0, 0, 0, 0);
 		}
 
-		switch (getCharacterCurrentParams(kCharacterAnna)[1]) {
-		case 0:
-			playDialog(kCharacterAnna, "ANN2135E", -1, 0);
-			break;
-		case 1:
-			playDialog(kCharacterAnna, "ANN2135F", -1, 0);
-			break;
-		case 2:
-			playDialog(kCharacterAnna, "ANN2135G", -1, 0);
-			break;
-		case 3:
-			playDialog(kCharacterAnna, "ANN2135D", -1, 0);
-			break;
-		default:
-			break;
-		}
+		break;
+	case 226031488:
+		if (whoRunningDialog(kCharacterAnna))
+			fadeDialog(kCharacterAnna);
 
-		getCharacterCurrentParams(kCharacterAnna)[2] = 0;
-		getCharacterCurrentParams(kCharacterAnna)[0] = 0;
+		send(kCharacterAnna, kCharacterMax, 71277948, 0);
+		break;
+	case 238358920:
+		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 2;
+		AnnaCall(&LogicManager::CONS_Anna_DoCorrOtis, "608Cf", 37, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1809,11 +2073,13 @@ void LogicManager::CONS_Anna_GoVassili(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Anna_GoVassili(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		setDoor(37, kCharacterCath, 1, 10, 9);
 		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
 		AnnaCall(&LogicManager::CONS_Anna_DoWalk, 4, 8200, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		if (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 1) {
 			setDoor(32, kCharacterCath, 1, 255, 255);
 			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 2;
@@ -1824,6 +2090,10 @@ void LogicManager::HAND_Anna_GoVassili(HAND_PARAMS) {
 			endGraphics(kCharacterAnna);
 			CONS_Anna_AtSeizure(0, 0, 0, 0);
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1838,12 +2108,17 @@ void LogicManager::CONS_Anna_AtSeizure(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Anna_AtSeizure(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterAnna).characterPosition.car = kCarRedSleeping;
 		getCharacter(kCharacterAnna).characterPosition.position = 8200;
 		getCharacter(kCharacterAnna).characterPosition.location = 0;
-	} else if (msg->action == 191477936) {
+		break;
+	case 191477936:
 		CONS_Anna_SpeakTatiana(0, 0, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1858,15 +2133,23 @@ void LogicManager::CONS_Anna_SpeakTatiana(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Anna_SpeakTatiana(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterAnna).characterPosition.position = 7500;
 		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
 		AnnaCall(&LogicManager::CONS_Anna_DoDialog, "ANN1010", 0, 0, 0);
-	} else if (msg->action == 18 && getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 1) {
-		playDialog(0, "MUS043", -1, 0);
-		CONS_Anna_LeaveTatiana(0, 0, 0, 0);
-	}
-}
+		break;
+	case 18:
+		if (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 1) {
+			playDialog(0, "MUS043", -1, 0);
+			CONS_Anna_LeaveTatiana(0, 0, 0, 0);
+		}
+
+		break;
+	default:
+		break;
+	}
+}
 
 void LogicManager::CONS_Anna_DoWalk1019(CONS_PARAMS) {
 	CharacterCallParams *params = &getCharacter(kCharacterAnna).callParams[getCharacter(kCharacterAnna).currentCall];
@@ -1884,41 +2167,44 @@ void LogicManager::CONS_Anna_DoWalk1019(CONS_PARAMS) {
 void LogicManager::HAND_Anna_DoWalk1019(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
-		if (walk(kCharacterAnna, getCharacterCurrentParams(kCharacterAnna)[0], getCharacterCurrentParams(kCharacterAnna)[1]))
-			goto LABEL_4;
-		break;
-	case 1:
-		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
-		AnnaCall(&LogicManager::CONS_Anna_SaveGame, 2, kEventAnnaGoodNight, 0, 0);
-		break;
-	case 6:
-		playDialog(kCharacterAnna, "ANN1107A", -1, 0);
-		break;
 	case 12:
-		getCharacter(kCharacterAnna).inventoryItem = 0;
-		if (!_gameEvents[kEventAnnaGoodNight] && !_gameEvents[kEventAnnaGoodNightInverse])
-			getCharacter(kCharacterAnna).inventoryItem = 0x80;
+		if (msg->action == 12) {
+			getCharacter(kCharacterAnna).inventoryItem = 0;
+
+			if (!_gameEvents[kEventAnnaGoodNight] && !_gameEvents[kEventAnnaGoodNightInverse])
+				getCharacter(kCharacterAnna).inventoryItem = 0x80;
+		}
+
 		if (walk(kCharacterAnna, getCharacterCurrentParams(kCharacterAnna)[0], getCharacterCurrentParams(kCharacterAnna)[1])) {
-		LABEL_4:
 			getCharacter(kCharacterAnna).inventoryItem = 0;
 
 			getCharacter(kCharacterAnna).currentCall--;
 			_engine->getMessageManager()->setMessageHandle(kCharacterAnna, _functionsAnna[getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall]]);
 			fedEx(kCharacterAnna, kCharacterAnna, 18, 0);
 		}
+
+		break;
+	case 1:
+		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
+		AnnaCall(&LogicManager::CONS_Anna_SaveGame, 2, kEventAnnaGoodNight, 0, 0);
+		break;
+	case 6:
+		playDialog(kCharacterAnna, "ANN1107A", -1, 0);
 		break;
 	case 18:
 		if (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 1) {
 			playNIS((kEventAnnaGoodNightInverse - (getCharacter(kCharacterAnna).direction == 1)));
 			getCharacter(kCharacterAnna).inventoryItem = 0;
+
 			if (getCharacter(kCharacterAnna).direction == 1)
 				bumpCathFx(getCharacter(kCharacterAnna).characterPosition.car, getCharacter(kCharacterAnna).characterPosition.position - 750);
 			else
 				bumpCathRx(getCharacter(kCharacterAnna).characterPosition.car, getCharacter(kCharacterAnna).characterPosition.position + 750);
 		}
+
 		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -1933,10 +2219,12 @@ void LogicManager::CONS_Anna_LeaveTatiana(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Anna_LeaveTatiana(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
-		AnnaCall(&LogicManager::CONS_Anna_DoCorrOtis, "608Cb", 0x21, 0, 0);
-	} else if (msg->action == 18) {
+		AnnaCall(&LogicManager::CONS_Anna_DoCorrOtis, "608Cb", 33, 0, 0);
+		break;
+	case 18:
 		switch (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8]) {
 		case 1:
 			getCharacter(kCharacterAnna).characterPosition.location = 0;
@@ -1992,8 +2280,12 @@ void LogicManager::HAND_Anna_LeaveTatiana(HAND_PARAMS) {
 			CONS_Anna_GoBackToSleep(0, 0, 0, 0);
 			break;
 		default:
-			return;
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -2012,7 +2304,7 @@ void LogicManager::HAND_Anna_GoBackToSleep(HAND_PARAMS) {
 	case 0:
 		if (getCharacterCurrentParams(kCharacterAnna)[1] || (getCharacterCurrentParams(kCharacterAnna)[1] = _gameTime + 2700, _gameTime != -2700)) {
 			if (getCharacterCurrentParams(kCharacterAnna)[1] >= _gameTime)
-				return;
+				break;
 
 			getCharacterCurrentParams(kCharacterAnna)[1] = 0x7FFFFFFF;
 		}
@@ -2029,13 +2321,17 @@ void LogicManager::HAND_Anna_GoBackToSleep(HAND_PARAMS) {
 			startCycOtis(kCharacterAnna, "419C");
 			getCharacterCurrentParams(kCharacterAnna)[0] = 0;
 			break;
+		default:
+			break;
 		}
+
 		getCharacterCurrentParams(kCharacterAnna)[1] = 0;
-		return;
+		break;
 	case 8:
 	case 9:
 		setDoor(37, kCharacterAnna, 1, 0, 0);
 		setDoor(53, kCharacterAnna, 1, 0, 0);
+
 		if (msg->action == 8) {
 			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
 			AnnaCall(&LogicManager::CONS_Anna_DoDialog, "LIB012", 0, 0, 0);
@@ -2043,30 +2339,33 @@ void LogicManager::HAND_Anna_GoBackToSleep(HAND_PARAMS) {
 			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 2;
 			AnnaCall(&LogicManager::CONS_Anna_DoDialog, "LIB013", 0, 0, 0);
 		}
-		return;
+
+		break;
 	case 12:
 		send(kCharacterAnna, kCharacterMax, 101687594, 0);
 		setDoor(37, kCharacterAnna, 1, 10, 9);
 		setDoor(53, kCharacterAnna, 1, 10, 9);
 		startCycOtis(kCharacterAnna, "419C");
-		return;
+		break;
 	case 18:
-		if (!getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8])
-			return;
-		if (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] <= 2) {
-			if (!whoRunningDialog(kCharacterMax)) {
-				getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 3;
-				AnnaCall(&LogicManager::CONS_Anna_DoDialog, "MAX1120", 0, 0, 0);
-				return;
+		if (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8]) {
+			if (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] <= 2) {
+				if (!whoRunningDialog(kCharacterMax)) {
+					getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 3;
+					AnnaCall(&LogicManager::CONS_Anna_DoDialog, "MAX1120", 0, 0, 0);
+					break;
+				}
+			} else if (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] != 3) {
+				break;
 			}
-		} else if (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] != 3) {
-			return;
+
+			setDoor(37, kCharacterAnna, 1, 10, 9);
+			setDoor(53, kCharacterAnna, 1, 10, 9);
 		}
-		setDoor(37, kCharacterAnna, 1, 10, 9);
-		setDoor(53, kCharacterAnna, 1, 10, 9);
+
 		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -2081,17 +2380,20 @@ void LogicManager::CONS_Anna_StartPart2(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Anna_StartPart2(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			endGraphics(kCharacterAnna);
-			getCharacter(kCharacterAnna).characterPosition.car = kCarRedSleeping;
-			getCharacter(kCharacterAnna).characterPosition.position = 4070;
-			getCharacter(kCharacterAnna).characterPosition.location = 1;
-			getCharacter(kCharacterAnna).inventoryItem = kItemNone;
-			getCharacter(kCharacterAnna).clothes = 1;
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		CONS_Anna_InPart2(0, 0, 0, 0);
+		break;
+	case 12:
+		endGraphics(kCharacterAnna);
+		getCharacter(kCharacterAnna).characterPosition.car = kCarRedSleeping;
+		getCharacter(kCharacterAnna).characterPosition.position = 4070;
+		getCharacter(kCharacterAnna).characterPosition.location = 1;
+		getCharacter(kCharacterAnna).inventoryItem = kItemNone;
+		getCharacter(kCharacterAnna).clothes = 1;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -2106,11 +2408,13 @@ void LogicManager::CONS_Anna_InPart2(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Anna_InPart2(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		setDoor(45, kCharacterCath, 0, 255, 255);
 		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
 		AnnaCall(&LogicManager::CONS_Anna_PracticeMusic, 0, 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8]) {
 		case 1:
 			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 2;
@@ -2133,8 +2437,12 @@ void LogicManager::HAND_Anna_InPart2(HAND_PARAMS) {
 			AnnaCall(&LogicManager::CONS_Anna_CompLogic, 15803100, "418C", 0, 0);
 			break;
 		default:
-			return;
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -2149,20 +2457,23 @@ void LogicManager::CONS_Anna_StartPart3(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Anna_StartPart3(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			endGraphics(kCharacterAnna);
-			getCharacter(kCharacterAnna).characterPosition.car = kCarRedSleeping;
-			getCharacter(kCharacterAnna).characterPosition.position = 4070;
-			getCharacter(kCharacterAnna).characterPosition.location = 1;
-			getCharacter(kCharacterAnna).clothes = 3;
-			getCharacter(kCharacterAnna).inventoryItem = 0;
-			setDoor(37, kCharacterCath, 1, 10, 9);
-			setDoor(45, kCharacterCath, 0, 255, 255);
-			setDoor(53, kCharacterCath, 1, 10, 9);
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		CONS_Anna_Practicing(0, 0, 0, 0);
+		break;
+	case 12:
+		endGraphics(kCharacterAnna);
+		getCharacter(kCharacterAnna).characterPosition.car = kCarRedSleeping;
+		getCharacter(kCharacterAnna).characterPosition.position = 4070;
+		getCharacter(kCharacterAnna).characterPosition.location = 1;
+		getCharacter(kCharacterAnna).clothes = 3;
+		getCharacter(kCharacterAnna).inventoryItem = 0;
+		setDoor(37, kCharacterCath, 1, 10, 9);
+		setDoor(45, kCharacterCath, 0, 255, 255);
+		setDoor(53, kCharacterCath, 1, 10, 9);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -2191,6 +2502,7 @@ void LogicManager::HAND_Anna_ExitComp(HAND_PARAMS) {
 				send(kCharacterAnna, kCharacterCond2, 185737168, 0);
 			else
 				send(kCharacterAnna, kCharacterCond2, 185671840, 0);
+
 			playDialog(kCharacterAnna, "Ann3147", -1, 0);
 			startCycOtis(kCharacterAnna, "625EF");
 			softBlockAtDoor(kCharacterAnna, 37);
@@ -2201,11 +2513,14 @@ void LogicManager::HAND_Anna_ExitComp(HAND_PARAMS) {
 			_engine->getMessageManager()->setMessageHandle(kCharacterAnna, _functionsAnna[getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall]]);
 			fedEx(kCharacterAnna, kCharacterAnna, 18, 0);
 		}
+
 		break;
 	case 157894320:
 		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 2;
 		AnnaCall(&LogicManager::CONS_Anna_DoWait, 75, 0, 0, 0);
 		break;
+	default:
+		break;
 	}
 }
 
@@ -2220,12 +2535,15 @@ void LogicManager::CONS_Anna_Practicing(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Anna_Practicing(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		if (checkCathDir(kCarRedSleeping, 60))
 			bumpCath(kCarRedSleeping, 49, 255);
+
 		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
 		AnnaCall(&LogicManager::CONS_Anna_PracticeMusic, 0, 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		if (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 1 ||
 			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 2) {
 			if (getCharacterParams(kCharacterAnna, 8)[0]) {
@@ -2235,6 +2553,10 @@ void LogicManager::HAND_Anna_Practicing(HAND_PARAMS) {
 				AnnaCall(&LogicManager::CONS_Anna_CompLogic, _gameTime + 4500, "418C", 0, 0);
 			}
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -2249,12 +2571,14 @@ void LogicManager::CONS_Anna_GoLunch(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Anna_GoLunch(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		setDoor(37, kCharacterCath, 1, 10, 9);
 		setDoor(53, kCharacterCath, 1, 10, 9);
 		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
 		AnnaCall(&LogicManager::CONS_Anna_DoCorrOtis, "688Bf", 0x25, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8]) {
 		case 1:
 			getCharacter(kCharacterAnna).characterPosition.location = 0;
@@ -2288,8 +2612,12 @@ void LogicManager::HAND_Anna_GoLunch(HAND_PARAMS) {
 			CONS_Anna_Lunch(0, 0, 0, 0);
 			break;
 		default:
-			return;
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -2304,80 +2632,79 @@ void LogicManager::CONS_Anna_Lunch(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Anna_Lunch(HAND_PARAMS) {
-	if (msg->action > 12) {
-		switch (msg->action) {
-		case 18:
-			switch (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8]) {
-			case 1:
-				getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 2;
-				AnnaCall(&LogicManager::CONS_Anna_DoDialog, "Ann3137B", 0, 0, 0);
-				break;
-			case 2:
-				send(kCharacterAnna, kCharacterWaiter1, 218983616, 0);
-				break;
-			case 3:
-				getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 4;
-				AnnaCall(&LogicManager::CONS_Anna_DoDialog, "Aug3006A", 0, 0, 0);
-				break;
-			case 4:
-				goto LABEL_29;
-			case 5:
-				getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 6;
-				AnnaCall(&LogicManager::CONS_Anna_DoWait, 900, 0, 0, 0);
-				break;
-			case 6:
-				getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 7;
-				AnnaCall(&LogicManager::CONS_Anna_DoDialog, "Aug3006", 0, 0, 0);
-				break;
-			case 7:
-				getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 8;
-				AnnaCall(&LogicManager::CONS_Anna_DoWait, 2700, 0, 0, 0);
-				break;
-			case 8:
-				startCycOtis(kCharacterAnna, "026H");
-				getCharacterCurrentParams(kCharacterAnna)[0] = 1;
-				break;
-			default:
-				return;
-			}
-			break;
-		case 122288808:
-			startCycOtis(kCharacterAnna, "026C");
-			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 5;
-			AnnaCall(&LogicManager::CONS_Anna_DoDialog, "Ann3138A", 0, 0, 0);
-			break;
-		case 122358304:
-			startCycOtis(kCharacterAnna, "BLANK");
-			break;
-		}
-	} else {
-		if (msg->action == 12) {
-			startCycOtis(kCharacterAnna, "026c");
-			getCharacter(kCharacterAnna).characterPosition.location = 1;
-			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
-			AnnaCall(&LogicManager::CONS_Anna_DoWait, 450, 0, 0, 0);
-			return;
-		}
-		if (msg->action == 0 && getCharacterCurrentParams(kCharacterAnna)[0]) {
+	switch (msg->action) {
+	case 0:
+		if (getCharacterCurrentParams(kCharacterAnna)[0]) {
 			if (getCharacterCurrentParams(kCharacterAnna)[2] != 0x7FFFFFFF && _gameTime > 1969200) {
-				if (_gameTime > 1983600)
-					goto LABEL_18;
+				if (_gameTime > 1983600) {
+					getCharacterCurrentParams(kCharacterAnna)[2] = 0x7FFFFFFF;
+					getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 3;
+					AnnaCall(&LogicManager::CONS_Anna_DoDialog, "Aug3007A", 0, 0, 0);
+					break;
+				}
 
 				if (!inDiningRoom(kCharacterCath) || whoRunningDialog(kCharacterMonsieur) || !getCharacterCurrentParams(kCharacterAnna)[2]) {
 					getCharacterCurrentParams(kCharacterAnna)[2] = _gameTime + 150;
-					if (_gameTime == -150)
-						goto LABEL_19;
+					if (_gameTime == -150) {
+						getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 3;
+						AnnaCall(&LogicManager::CONS_Anna_DoDialog, "Aug3007A", 0, 0, 0);
+						break;
+					}
 				}
+
 				if (getCharacterCurrentParams(kCharacterAnna)[2] < _gameTime) {
-				LABEL_18:
 					getCharacterCurrentParams(kCharacterAnna)[2] = 0x7FFFFFFF;
-				LABEL_19:
 					getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 3;
 					AnnaCall(&LogicManager::CONS_Anna_DoDialog, "Aug3007A", 0, 0, 0);
-					return;
+					break;
+				}
+			}
+
+			if (getCharacterParams(kCharacterAnna, 8)[1]) {
+				if (!getCharacterCurrentParams(kCharacterAnna)[1])
+					getCharacterCurrentParams(kCharacterAnna)[1] = _gameTime + 4500;
+
+				if (getCharacterCurrentParams(kCharacterAnna)[3] != 0x7FFFFFFF && _gameTime) {
+					if (getCharacterCurrentParams(kCharacterAnna)[1] >= _gameTime) {
+						if (!inDiningRoom(kCharacterCath) || !getCharacterCurrentParams(kCharacterAnna)[3]) {
+							getCharacterCurrentParams(kCharacterAnna)[3] = _gameTime + 450;
+							if (_gameTime == -450) {
+								CONS_Anna_LeaveLunch(0, 0, 0, 0);
+								break;
+							}
+						}
+
+						if (getCharacterCurrentParams(kCharacterAnna)[3] >= _gameTime)
+							break;
+					}
+
+					getCharacterCurrentParams(kCharacterAnna)[3] = 0x7FFFFFFF;
+					CONS_Anna_LeaveLunch(0, 0, 0, 0);
 				}
 			}
-		LABEL_29:
+		}
+
+		break;
+	case 12:
+		startCycOtis(kCharacterAnna, "026c");
+		getCharacter(kCharacterAnna).characterPosition.location = 1;
+		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
+		AnnaCall(&LogicManager::CONS_Anna_DoWait, 450, 0, 0, 0);
+		break;
+	case 18:
+		switch (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8]) {
+		case 1:
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 2;
+			AnnaCall(&LogicManager::CONS_Anna_DoDialog, "Ann3137B", 0, 0, 0);
+			break;
+		case 2:
+			send(kCharacterAnna, kCharacterWaiter1, 218983616, 0);
+			break;
+		case 3:
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 4;
+			AnnaCall(&LogicManager::CONS_Anna_DoDialog, "Aug3006A", 0, 0, 0);
+			break;
+		case 4:
 			if (getCharacterParams(kCharacterAnna, 8)[1]) {
 				if (!getCharacterCurrentParams(kCharacterAnna)[1])
 					getCharacterCurrentParams(kCharacterAnna)[1] = _gameTime + 4500;
@@ -2386,20 +2713,53 @@ void LogicManager::HAND_Anna_Lunch(HAND_PARAMS) {
 					if (getCharacterCurrentParams(kCharacterAnna)[1] >= _gameTime) {
 						if (!inDiningRoom(kCharacterCath) || !getCharacterCurrentParams(kCharacterAnna)[3]) {
 							getCharacterCurrentParams(kCharacterAnna)[3] = _gameTime + 450;
-							if (_gameTime == -450)
-								goto LABEL_40;
+							if (_gameTime == -450) {
+								CONS_Anna_LeaveLunch(0, 0, 0, 0);
+								break;
+							}
 						}
 
 						if (getCharacterCurrentParams(kCharacterAnna)[3] >= _gameTime)
-							return;
+							break;
 					}
 
 					getCharacterCurrentParams(kCharacterAnna)[3] = 0x7FFFFFFF;
-				LABEL_40:
 					CONS_Anna_LeaveLunch(0, 0, 0, 0);
 				}
 			}
+
+			break;
+		case 5:
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 6;
+			AnnaCall(&LogicManager::CONS_Anna_DoWait, 900, 0, 0, 0);
+			break;
+		case 6:
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 7;
+			AnnaCall(&LogicManager::CONS_Anna_DoDialog, "Aug3006", 0, 0, 0);
+			break;
+		case 7:
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 8;
+			AnnaCall(&LogicManager::CONS_Anna_DoWait, 2700, 0, 0, 0);
+			break;
+		case 8:
+			startCycOtis(kCharacterAnna, "026H");
+			getCharacterCurrentParams(kCharacterAnna)[0] = 1;
+			break;
+		default:
+			break;
 		}
+
+		break;
+	case 122288808:
+		startCycOtis(kCharacterAnna, "026C");
+		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 5;
+		AnnaCall(&LogicManager::CONS_Anna_DoDialog, "Ann3138A", 0, 0, 0);
+		break;
+	case 122358304:
+		startCycOtis(kCharacterAnna, "BLANK");
+		break;
+	default:
+		break;
 	}
 }
 
@@ -2414,17 +2774,22 @@ void LogicManager::CONS_Anna_DoOtis5026J(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Anna_DoOtis5026J(HAND_PARAMS) {
-	if (msg->action == 3) {
+	switch (msg->action) {
+	case 3:
 		send(kCharacterAnna, kCharacterTableD, 103798704, "010M");
 		endGraphics(kCharacterAugust);
 
 		getCharacter(kCharacterAnna).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterAnna, _functionsAnna[getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall]]);
 		fedEx(kCharacterAnna, kCharacterAnna, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		startSeqOtis(kCharacterTableD, "026J3");
 		startSeqOtis(kCharacterAugust, "026J2");
 		startSeqOtis(kCharacterAnna, "026J1");
+		break;
+	default:
+		break;
 	}
 }
 
@@ -2439,10 +2804,12 @@ void LogicManager::CONS_Anna_LeaveLunch(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Anna_LeaveLunch(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
 		AnnaCall(&LogicManager::CONS_Anna_DoDialog, "Ann3141", 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8]) {
 		case 1:
 			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 2;
@@ -2456,7 +2823,13 @@ void LogicManager::HAND_Anna_LeaveLunch(HAND_PARAMS) {
 		case 3:
 			CONS_Anna_AfterLunch(0, 0, 0, 0);
 			break;
+		default:
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -2471,72 +2844,92 @@ void LogicManager::CONS_Anna_AfterLunch(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Anna_AfterLunch(HAND_PARAMS) {
-	if (msg->action > 12) {
-		if (msg->action > 101169422) {
-			if (msg->action == 122288808) {
-				startCycOtis(kCharacterAnna, "112D");
-				send(kCharacterAnna, kCharacterKronos, 157159392, 0);
-			} else if (msg->action == 122358304) {
-				startCycOtis(kCharacterAnna, "BLANK");
-			}
-		} else if (msg->action == 101169422) {
-			if (_gameEvents[kEventKronosVisit]) {
-				getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 3;
-				AnnaCall(&LogicManager::CONS_Anna_DoBlockSeqOtis, "112J", 5, 0x39, 0);
-			} else {
-			LABEL_22:
-				if (_gameTime >= 2047500) {
-				LABEL_28:
-					getCharacterCurrentParams(kCharacterAnna)[0] = 1;
-				} else {
-					getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 4;
-					AnnaCall(&LogicManager::CONS_Anna_DoDialog, "Ann3142A", 0, 0, 0);
-				}
-			}
-		} else if (msg->action == 18) {
-			switch (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8]) {
-			case 1:
-				getCharacter(kCharacterAnna).characterPosition.location = 1;
-				startCycOtis(kCharacterAnna, "112B");
-				releaseView(kCharacterAnna, kCarRestaurant, 57);
-				send(kCharacterAnna, kCharacterWaiter2, 219377792, 0);
-				break;
-			case 2:
-				send(kCharacterAnna, kCharacterAugust, 122288808, 0);
-				CONS_Anna_ReturnComp3(0, 0, 0, 0);
-				break;
-			case 3:
-				startCycOtis(kCharacterAnna, "112D");
-				goto LABEL_22;
-			case 4:
-				getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 5;
-				AnnaCall(&LogicManager::CONS_Anna_DoWait, 1800, 0, 0, 0);
-				break;
-			case 5:
-				getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 6;
-				AnnaCall(&LogicManager::CONS_Anna_DoDialog, "Aug3007", 0, 0, 0);
-				break;
-			case 6:
-				goto LABEL_28;
-			default:
-				return;
+	switch (msg->action) {
+	case 0:
+		if (getCharacterCurrentParams(kCharacterAnna)[0]) {
+			if (rcClear()) {
+				playDialog(kCharacterAnna, "Aug3008", -1, 0);
+				getCharacter(kCharacterAnna).characterPosition.location = 0;
+				getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 2;
+				AnnaCall(&LogicManager::CONS_Anna_DoComplexSeqOtis, "112E1", "112E2", 2, 0);
 			}
 		}
-	} else if (msg->action == 12) {
+
+		break;
+	case 12:
 		playDialog(kCharacterAnna, "Ann3142", -1, 30);
-		blockView(1, 5, 57);
+		blockView(kCharacterCath, kCarRestaurant, 57);
 		startSeqOtis(kCharacterAnna, "112A");
+
 		if (inDiningRoom(kCharacterCath))
 			advanceFrame(kCharacterAnna);
+
 		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
 		AnnaCall(&LogicManager::CONS_Anna_FinishSeqOtis, 0, 0, 0, 0);
-	} else if (msg->action == 0 && getCharacterCurrentParams(kCharacterAnna)[0]) {
-		if (rcClear()) {
-			playDialog(kCharacterAnna, "Aug3008", -1, 0);
-			getCharacter(kCharacterAnna).characterPosition.location = 0;
-			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 2;
-			AnnaCall(&LogicManager::CONS_Anna_DoComplexSeqOtis, "112E1", "112E2", 2, 0);
+		break;
+	case 18:
+		switch (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8]) {
+		case 1:
+			getCharacter(kCharacterAnna).characterPosition.location = 1;
+			startCycOtis(kCharacterAnna, "112B");
+			releaseView(kCharacterAnna, kCarRestaurant, 57);
+			send(kCharacterAnna, kCharacterWaiter2, 219377792, 0);
+			break;
+		case 2:
+			send(kCharacterAnna, kCharacterAugust, 122288808, 0);
+			CONS_Anna_ReturnComp3(0, 0, 0, 0);
+			break;
+		case 3:
+			startCycOtis(kCharacterAnna, "112D");
+
+			if (_gameTime >= 2047500) {
+				getCharacterCurrentParams(kCharacterAnna)[0] = 1;
+			} else {
+				getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 4;
+				AnnaCall(&LogicManager::CONS_Anna_DoDialog, "Ann3142A", 0, 0, 0);
+			}
+
+			break;
+		case 4:
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 5;
+			AnnaCall(&LogicManager::CONS_Anna_DoWait, 1800, 0, 0, 0);
+			break;
+		case 5:
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 6;
+			AnnaCall(&LogicManager::CONS_Anna_DoDialog, "Aug3007", 0, 0, 0);
+			break;
+		case 6:
+			getCharacterCurrentParams(kCharacterAnna)[0] = 1;
+			break;
+		default:
+			break;
+		}
+
+		break;
+	case 101169422:
+		if (_gameEvents[kEventKronosVisit]) {
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 3;
+			AnnaCall(&LogicManager::CONS_Anna_DoBlockSeqOtis, "112J", 5, 0x39, 0);
+		} else {
+			if (_gameTime >= 2047500) {
+				getCharacterCurrentParams(kCharacterAnna)[0] = 1;
+			} else {
+				getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 4;
+				AnnaCall(&LogicManager::CONS_Anna_DoDialog, "Ann3142A", 0, 0, 0);
+			}
 		}
+
+		break;
+	case 122288808:
+		startCycOtis(kCharacterAnna, "112D");
+		send(kCharacterAnna, kCharacterKronos, 157159392, 0);
+		break;
+	case 122358304:
+		startCycOtis(kCharacterAnna, "BLANK");
+		break;
+	
+	default:
+		break;
 	}
 }
 
@@ -2551,29 +2944,38 @@ void LogicManager::CONS_Anna_ReturnComp3(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Anna_ReturnComp3(HAND_PARAMS) {
-	if (msg->action == 3) {
+	switch (msg->action) {
+	case 3:
 		releaseAtDoor(kCharacterAnna, 37);
 		getCharacter(kCharacterAnna).characterPosition.position = 4070;
 		getCharacter(kCharacterAnna).characterPosition.location = 1;
 		endGraphics(kCharacterAnna);
 		CONS_Anna_Dressing(0, 0, 0, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
 		AnnaCall(&LogicManager::CONS_Anna_DoWalk, 4, 4070, 0, 0);
-	} else if (msg->action == 18 && getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 1) {
-		startSeqOtis(kCharacterAnna, "688Af");
-		blockAtDoor(kCharacterAnna, 37);
-		getCharacter(kCharacterAnna).characterPosition.location = 1;
-		if (inComp(kCharacterCath, kCarRedSleeping, 4070) || inComp(kCharacterCath, kCarRedSleeping, 4455)) {
-			if (isNight()) {
-				playNIS(kEventCathTurningNight);
-			} else {
-				playNIS(kEventCathTurningDay);
+		break;
+	case 18:
+		if (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 1) {
+			startSeqOtis(kCharacterAnna, "688Af");
+			blockAtDoor(kCharacterAnna, 37);
+			getCharacter(kCharacterAnna).characterPosition.location = 1;
+			if (inComp(kCharacterCath, kCarRedSleeping, 4070) || inComp(kCharacterCath, kCarRedSleeping, 4455)) {
+				if (isNight()) {
+					playNIS(kEventCathTurningNight);
+				} else {
+					playNIS(kEventCathTurningDay);
+				}
+
+				playDialog(0, "BUMP", -1, 0);
+				bumpCathRDoor(37);
 			}
-			
-			playDialog(0, "BUMP", -1, 0);
-			bumpCathRDoor(37);
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -2592,54 +2994,69 @@ void LogicManager::HAND_Anna_Dressing(HAND_PARAMS) {
 
 	switch (msg->action) {
 	case 0:
-		if (!_gameProgress[kProgressField48] || getCharacterCurrentParams(kCharacterAnna)[4] == 0x7FFFFFFF || !_gameTime)
-			goto LABEL_13;
+		if (_gameProgress[kProgressField48] != 0 && getCharacterCurrentParams(kCharacterAnna)[4] != 0x7FFFFFFF && _gameTime != 0) {
+			if (_gameTime > 2065500) {
+				getCharacterCurrentParams(kCharacterAnna)[4] = 0x7FFFFFFF;
+				CONS_Anna_GiveMaxToCond2(0, 0, 0, 0);
+				break;
+			}
 
-		if (_gameTime > 2065500)
-			goto LABEL_11;
+			if (!cathInCorridor(kCarRedSleeping) || !getCharacterCurrentParams(kCharacterAnna)[4]) {
+				getCharacterCurrentParams(kCharacterAnna)[4] = _gameTime + 150;
+				if (_gameTime == -150) {
+					CONS_Anna_GiveMaxToCond2(0, 0, 0, 0);
+					break;
+				}
+			}
 
-		if (!cathInCorridor(kCarRedSleeping) || !getCharacterCurrentParams(kCharacterAnna)[4]) {
-			getCharacterCurrentParams(kCharacterAnna)[4] = _gameTime + 150;
-			if (_gameTime == -150)
-				goto LABEL_12;
-		}
-		if (getCharacterCurrentParams(kCharacterAnna)[4] < _gameTime) {
-		LABEL_11:
-			getCharacterCurrentParams(kCharacterAnna)[4] = 0x7FFFFFFF;
-		LABEL_12:
-			CONS_Anna_GiveMaxToCond2(0, 0, 0, 0);
-			return;
+			if (getCharacterCurrentParams(kCharacterAnna)[4] < _gameTime) {
+				getCharacterCurrentParams(kCharacterAnna)[4] = 0x7FFFFFFF;
+				CONS_Anna_GiveMaxToCond2(0, 0, 0, 0);
+				break;
+			}
 		}
-	LABEL_13:
-		if (!getCharacterCurrentParams(kCharacterAnna)[2])
-			goto LABEL_21;
 
-		if (!getCharacterCurrentParams(kCharacterAnna)[5]) {
-			getCharacterCurrentParams(kCharacterAnna)[5] = _gameTime + 9000;
-			if (_gameTime == -9000)
-				goto LABEL_18;
-		}
+		if (getCharacterCurrentParams(kCharacterAnna)[2] != 0) {
+			bool skip = false; // Horrible way to unroll a goto...
 
-		if (getCharacterCurrentParams(kCharacterAnna)[5] < _gameTime) {
-			getCharacterCurrentParams(kCharacterAnna)[5] = 0x7FFFFFFF;
-		LABEL_18:
-			tmp = getCharacterCurrentParams(kCharacterAnna)[3] == 0;
+			if (!getCharacterCurrentParams(kCharacterAnna)[5]) {
+				getCharacterCurrentParams(kCharacterAnna)[5] = _gameTime + 9000;
+				if (_gameTime == -9000) {
+					skip = true;
+					tmp = getCharacterCurrentParams(kCharacterAnna)[3] == 0;
 
-			getCharacterCurrentParams(kCharacterAnna)[3] = tmp ? 1 : 0;
+					getCharacterCurrentParams(kCharacterAnna)[3] = tmp ? 1 : 0;
 
-			if (!tmp) {
-				startCycOtis(kCharacterAnna, "417B");
-			} else {
-				startCycOtis(kCharacterAnna, "417A");
+					if (!tmp) {
+						startCycOtis(kCharacterAnna, "417B");
+					} else {
+						startCycOtis(kCharacterAnna, "417A");
+					}
+
+					getCharacterCurrentParams(kCharacterAnna)[5] = 0;
+				}
 			}
 
-			getCharacterCurrentParams(kCharacterAnna)[5] = 0;
+			if (!skip && getCharacterCurrentParams(kCharacterAnna)[5] < _gameTime) {
+				getCharacterCurrentParams(kCharacterAnna)[5] = 0x7FFFFFFF;
+				tmp = getCharacterCurrentParams(kCharacterAnna)[3] == 0;
+
+				getCharacterCurrentParams(kCharacterAnna)[3] = tmp ? 1 : 0;
+
+				if (!tmp) {
+					startCycOtis(kCharacterAnna, "417B");
+				} else {
+					startCycOtis(kCharacterAnna, "417A");
+				}
+
+				getCharacterCurrentParams(kCharacterAnna)[5] = 0;
+			}
 		}
-	LABEL_21:
+
 		if (getCharacterCurrentParams(kCharacterAnna)[0]) {
 			if (getCharacterCurrentParams(kCharacterAnna)[6] || (getCharacterCurrentParams(kCharacterAnna)[6] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
 				if (getCharacterCurrentParams(kCharacterAnna)[6] >= _currentGameSessionTicks)
-					return;
+					break;
 
 				getCharacterCurrentParams(kCharacterAnna)[6] = 0x7FFFFFFF;
 			}
@@ -2653,17 +3070,16 @@ void LogicManager::HAND_Anna_Dressing(HAND_PARAMS) {
 		} else {
 			getCharacterCurrentParams(kCharacterAnna)[6] = 0;
 		}
+
 		break;
 	case 8:
-		goto LABEL_50;
 	case 9:
-		if (inComp(kCharacterMax, kCarRedSleeping, 4070)) {
+		if (msg->action == 9 && inComp(kCharacterMax, kCarRedSleeping, 4070)) {
 			setDoor(37, kCharacterAnna, 1, 0, 0);
 			setDoor(53, kCharacterAnna, 1, 0, 0);
 			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
 			AnnaCall(&LogicManager::CONS_Anna_DoDialog, "LIB013", 0, 0, 0);
 		} else {
-		LABEL_50:
 			if (getCharacterCurrentParams(kCharacterAnna)[0]) {
 				setDoor(37, kCharacterAnna, 1, 0, 0);
 				setDoor(53, kCharacterAnna, 1, 0, 0);
@@ -2700,13 +3116,14 @@ void LogicManager::HAND_Anna_Dressing(HAND_PARAMS) {
 				}
 			}
 		}
-		return;
+
+		break;
 	case 12:
 		send(kCharacterAnna, kCharacterMax, 101687594, 0);
 		setDoor(37, kCharacterAnna, 1, 10, 9);
 		setDoor(53, kCharacterAnna, 1, 10, 9);
 		getCharacter(kCharacterAnna).clothes = 2;
-		return;
+		break;
 	case 17:
 		if (getCharacterCurrentParams(kCharacterAnna)[1] || getCharacterCurrentParams(kCharacterAnna)[0]) {
 			setDoor(37, kCharacterAnna, 1, 10, 9);
@@ -2721,17 +3138,20 @@ void LogicManager::HAND_Anna_Dressing(HAND_PARAMS) {
 			AnnaCall(&LogicManager::CONS_Anna_DoSeqOtis, "416", 0, 0, 0);
 		}
 
-		return;
+		break;
 	case 18:
 		switch (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8]) {
 		case 1:
-			if (whoRunningDialog(kCharacterMax))
-				goto LABEL_49;
-			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 2;
-			AnnaCall(&LogicManager::CONS_Anna_DoDialog, "MAX1120", 0, 0, 0);
+			if (whoRunningDialog(kCharacterMax)) {
+				setDoor(37, kCharacterAnna, 1, 10, 9);
+				setDoor(53, kCharacterAnna, 1, 10, 9);
+			} else {
+				getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 2;
+				AnnaCall(&LogicManager::CONS_Anna_DoDialog, "MAX1120", 0, 0, 0);
+			}
+
 			break;
 		case 2:
-		LABEL_49:
 			setDoor(37, kCharacterAnna, 1, 10, 9);
 			setDoor(53, kCharacterAnna, 1, 10, 9);
 			break;
@@ -2752,20 +3172,23 @@ void LogicManager::HAND_Anna_Dressing(HAND_PARAMS) {
 				setDoor(37, kCharacterAnna, 1, 0, 9);
 				setDoor(53, kCharacterAnna, 1, 0, 9);
 			}
+
 			getCharacterCurrentParams(kCharacterAnna)[0] = 0;
 			getCharacterCurrentParams(kCharacterAnna)[1] = 1;
 			break;
 		case 9:
 			if (checkCathDir(kCarRedSleeping, 60))
 				bumpCath(kCarRedSleeping, 78, 255);
+
 			startCycOtis(kCharacterAnna, "417B");
 			break;
 		default:
-			return;
+			break;
 		}
-		return;
+
+		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -2780,107 +3203,80 @@ void LogicManager::CONS_Anna_GiveMaxToCond2(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Anna_GiveMaxToCond2(HAND_PARAMS) {
-	bool tmp;
+	switch (msg->action) {
+	case 0:
+		if (getCharacterCurrentParams(kCharacterAnna)[2] != 0) {
+			if (_gameTime > 2079000 && !getCharacterCurrentParams(kCharacterAnna)[4]) {
+				getCharacterCurrentParams(kCharacterAnna)[4] = 1;
+				CONS_Anna_GoConcert(0, 0, 0, 0);
+				break;
+			}
 
-	if (msg->action > 8) {
-		if (msg->action > 12) {
-			if (msg->action > 123733488) {
-				if (msg->action == 156049968) {
-					startCycOtis(kCharacterAnna, "629DF");
-					softBlockAtDoor(kCharacterAnna, 37);
-				} else if (msg->action == 253868128) {
-					setDoor(53, kCharacterAnna, 1, 0, 0);
-				}
-			} else {
-				switch (msg->action) {
-				case 123733488:
-					getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 9;
-					AnnaCall(&LogicManager::CONS_Anna_DoCorrOtis, "629Ef", 37, 0, 0);
-					break;
-				case 17:
-					if (getCharacterCurrentParams(kCharacterAnna)[1] || getCharacterCurrentParams(kCharacterAnna)[0]) {
-						setDoor(37, kCharacterAnna, 1, 10, 9);
-						setDoor(53, kCharacterAnna, 1, 10, 9);
-						getCharacterCurrentParams(kCharacterAnna)[1] = 0;
-						getCharacterCurrentParams(kCharacterAnna)[0] = 0;
-					}
+			if (getCharacterCurrentParams(kCharacterAnna)[5] || (getCharacterCurrentParams(kCharacterAnna)[5] = _gameTime + 9000, _gameTime != -9000)) {
+				if (getCharacterCurrentParams(kCharacterAnna)[5] >= _gameTime) {
+					if (getCharacterCurrentParams(kCharacterAnna)[0]) {
+						if (getCharacterCurrentParams(kCharacterAnna)[6] || (getCharacterCurrentParams(kCharacterAnna)[6] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
+							if (getCharacterCurrentParams(kCharacterAnna)[6] >= _currentGameSessionTicks)
+								break;
 
-					break;
-				case 18:
-					switch (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8]) {
-					case 1:
-						if (whoRunningDialog(kCharacterMax))
-							goto LABEL_54;
-						getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 2;
-						AnnaCall(&LogicManager::CONS_Anna_DoDialog, "MAX1120", 0, 0, 0);
-						break;
-					case 2:
-					LABEL_54:
-						setDoor(37, kCharacterAnna, 1, 10, 9);
-						setDoor(53, kCharacterAnna, 1, 10, 9);
-						break;
-					case 3:
-					case 4:
-						getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 5;
-						AnnaCall(&LogicManager::CONS_Anna_DoDialog, "ANN1016", 0, 0, 0);
-						break;
-					case 5:
-						setDoor(37, kCharacterAnna, 1, 14, 0);
-						setDoor(53, kCharacterAnna, 1, 14, 0);
-						getCharacterCurrentParams(kCharacterAnna)[0] = 1;
-						break;
-					case 6:
-					case 7:
-					case 8:
-						if (inComp(kCharacterMax, kCarRedSleeping, 4070)) {
-							setDoor(37, kCharacterAnna, 1, 0, 9);
-							setDoor(53, kCharacterAnna, 1, 0, 9);
+							getCharacterCurrentParams(kCharacterAnna)[6] = 0x7FFFFFFF;
 						}
 
 						getCharacterCurrentParams(kCharacterAnna)[0] = 0;
 						getCharacterCurrentParams(kCharacterAnna)[1] = 1;
-						break;
-					case 9:
-						softReleaseAtDoor(kCharacterAnna, 37);
-						endGraphics(kCharacterAnna);
-						getCharacter(kCharacterAnna).characterPosition.location = kCharacterAnna;
-						getCharacter(kCharacterAnna).characterPosition.position = 4070;
-						getCharacterCurrentParams(kCharacterAnna)[2] = kCharacterAnna;
-						setDoor(45, kCharacterCath, 0, 255, 255);
-						setDoor(53, kCharacterAnna, kCharacterAnna, 10, 9);
-
-						if (checkCathDir(kCarRedSleeping, 78))
-							bumpCath(kCarRedSleeping, 49, 255);
 
-						startCycOtis(kCharacterAnna, "417B");
-						break;
-					default:
-						return;
+						setDoor(37, kCharacterAnna, 1, 0, !inComp(kCharacterMax, kCarRedSleeping, 4070) ? 0 : 9);
+						setDoor(53, kCharacterAnna, 1, 0, !inComp(kCharacterMax, kCarRedSleeping, 4070) ? 0 : 9);
+						getCharacterCurrentParams(kCharacterAnna)[6] = 0;
+					} else {
+						getCharacterCurrentParams(kCharacterAnna)[6] = 0;
 					}
+
 					break;
 				}
+
+				getCharacterCurrentParams(kCharacterAnna)[5] = 0x7FFFFFFF;
+			}
+
+			bool tmp = getCharacterCurrentParams(kCharacterAnna)[3] == 0;
+			getCharacterCurrentParams(kCharacterAnna)[3] = tmp ? 1 : 0;
+
+			if (!tmp) {
+				startCycOtis(kCharacterAnna, "417B");
+			} else {
+				startCycOtis(kCharacterAnna, "417A");
 			}
-			return;
+
+			getCharacterCurrentParams(kCharacterAnna)[5] = 0;
 		}
-		if (msg->action == 12) {
-			setDoor(45, kCharacterCath, 1, 255, 255);
-			if (checkCathDir(kCarRedSleeping, 60))
-				bumpCath(kCarRedSleeping, 78, 255);
 
-			send(kCharacterAnna, kCharacterCond2, 189750912, 0);
-			return;
+		if (getCharacterCurrentParams(kCharacterAnna)[0]) {
+			if (getCharacterCurrentParams(kCharacterAnna)[6] || (getCharacterCurrentParams(kCharacterAnna)[6] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
+				if (getCharacterCurrentParams(kCharacterAnna)[6] >= _currentGameSessionTicks)
+					break;
+
+				getCharacterCurrentParams(kCharacterAnna)[6] = 0x7FFFFFFF;
+			}
+
+			getCharacterCurrentParams(kCharacterAnna)[0] = 0;
+			getCharacterCurrentParams(kCharacterAnna)[1] = 1;
+
+			setDoor(37, kCharacterAnna, 1, 0, !inComp(kCharacterMax, kCarRedSleeping, 4070) ? 0 : 9);
+			setDoor(53, kCharacterAnna, 1, 0, !inComp(kCharacterMax, kCarRedSleeping, 4070) ? 0 : 9);
+			getCharacterCurrentParams(kCharacterAnna)[6] = 0;
+		} else {
+			getCharacterCurrentParams(kCharacterAnna)[6] = 0;
 		}
-		if (msg->action != 9)
-			return;
-		if (inComp(kCharacterMax, kCarRedSleeping, 4070)) {
+
+		break;
+	case 8:
+	case 9:
+		if (msg->action == 9 && inComp(kCharacterMax, kCarRedSleeping, 4070)) {
 			setDoor(37, kCharacterAnna, 1, 0, 0);
 			setDoor(53, kCharacterAnna, 1, 0, 0);
 			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
 			AnnaCall(&LogicManager::CONS_Anna_DoDialog, "LIB013", 0, 0, 0);
-			return;
-		}
-	LABEL_58:
-		if (getCharacterCurrentParams(kCharacterAnna)[0]) {
+		} else if (getCharacterCurrentParams(kCharacterAnna)[0]) {
 			setDoor(37, kCharacterAnna, 1, 0, 0);
 			setDoor(53, kCharacterAnna, 1, 0, 0);
 			if (msg->param.intParam == 53) {
@@ -2897,7 +3293,7 @@ void LogicManager::HAND_Anna_GiveMaxToCond2(HAND_PARAMS) {
 						AnnaCall(&LogicManager::CONS_Anna_DoDialog, "CAT1506", 0, 0, 0);
 					}
 				}
-				
+
 			} else {
 				getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 8;
 				AnnaCall(&LogicManager::CONS_Anna_DoDialog, getCathSorryDialog(), 0, 0, 0);
@@ -2914,57 +3310,93 @@ void LogicManager::HAND_Anna_GiveMaxToCond2(HAND_PARAMS) {
 			}
 		}
 
-		return;
-	}
-
-	if (msg->action == 8)
-		goto LABEL_58;
-
-	if (msg->action)
-		return;
+		break;
+	case 12:
+		setDoor(45, kCharacterCath, 1, 255, 255);
+		if (checkCathDir(kCarRedSleeping, 60))
+			bumpCath(kCarRedSleeping, 78, 255);
 
-	if (!getCharacterCurrentParams(kCharacterAnna)[2])
-		goto LABEL_28;
+		send(kCharacterAnna, kCharacterCond2, 189750912, 0);
+		break;
 
-	if (_gameTime > 2079000 && !getCharacterCurrentParams(kCharacterAnna)[4]) {
-		getCharacterCurrentParams(kCharacterAnna)[4] = 1;
-		CONS_Anna_GoConcert(0, 0, 0, 0);
-		return;
-	}
+	case 17:
+		if (getCharacterCurrentParams(kCharacterAnna)[1] || getCharacterCurrentParams(kCharacterAnna)[0]) {
+			setDoor(37, kCharacterAnna, 1, 10, 9);
+			setDoor(53, kCharacterAnna, 1, 10, 9);
+			getCharacterCurrentParams(kCharacterAnna)[1] = 0;
+			getCharacterCurrentParams(kCharacterAnna)[0] = 0;
+		}
 
-	if (getCharacterCurrentParams(kCharacterAnna)[5] || (getCharacterCurrentParams(kCharacterAnna)[5] = _gameTime + 9000, _gameTime != -9000)) {
-		if (getCharacterCurrentParams(kCharacterAnna)[5] >= _gameTime)
-			goto LABEL_28;
-		getCharacterCurrentParams(kCharacterAnna)[5] = 0x7FFFFFFF;
-	}
+		break;
+	case 18:
+		switch (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8]) {
+		case 1:
+			if (whoRunningDialog(kCharacterMax)) {
+				setDoor(37, kCharacterAnna, 1, 10, 9);
+				setDoor(53, kCharacterAnna, 1, 10, 9);
+			} else {
+				getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 2;
+				AnnaCall(&LogicManager::CONS_Anna_DoDialog, "MAX1120", 0, 0, 0);
+			}
 
-	tmp = getCharacterCurrentParams(kCharacterAnna)[3] == 0;
-	getCharacterCurrentParams(kCharacterAnna)[3] = tmp ? 1 : 0;
+			break;
+		case 2:
+			setDoor(37, kCharacterAnna, 1, 10, 9);
+			setDoor(53, kCharacterAnna, 1, 10, 9);
+			break;
+		case 3:
+		case 4:
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 5;
+			AnnaCall(&LogicManager::CONS_Anna_DoDialog, "ANN1016", 0, 0, 0);
+			break;
+		case 5:
+			setDoor(37, kCharacterAnna, 1, 14, 0);
+			setDoor(53, kCharacterAnna, 1, 14, 0);
+			getCharacterCurrentParams(kCharacterAnna)[0] = 1;
+			break;
+		case 6:
+		case 7:
+		case 8:
+			if (inComp(kCharacterMax, kCarRedSleeping, 4070)) {
+				setDoor(37, kCharacterAnna, 1, 0, 9);
+				setDoor(53, kCharacterAnna, 1, 0, 9);
+			}
 
-	if (!tmp) {
-		startCycOtis(kCharacterAnna, "417B");
-	} else {
-		startCycOtis(kCharacterAnna, "417A");
-	}
+			getCharacterCurrentParams(kCharacterAnna)[0] = 0;
+			getCharacterCurrentParams(kCharacterAnna)[1] = 1;
+			break;
+		case 9:
+			softReleaseAtDoor(kCharacterAnna, 37);
+			endGraphics(kCharacterAnna);
+			getCharacter(kCharacterAnna).characterPosition.location = kCharacterAnna;
+			getCharacter(kCharacterAnna).characterPosition.position = 4070;
+			getCharacterCurrentParams(kCharacterAnna)[2] = kCharacterAnna;
+			setDoor(45, kCharacterCath, 0, 255, 255);
+			setDoor(53, kCharacterAnna, kCharacterAnna, 10, 9);
 
-	getCharacterCurrentParams(kCharacterAnna)[5] = 0;
-LABEL_28:
-	if (getCharacterCurrentParams(kCharacterAnna)[0]) {
-		if (getCharacterCurrentParams(kCharacterAnna)[6] || (getCharacterCurrentParams(kCharacterAnna)[6] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
-			if (getCharacterCurrentParams(kCharacterAnna)[6] >= _currentGameSessionTicks)
-				return;
+			if (checkCathDir(kCarRedSleeping, 78))
+				bumpCath(kCarRedSleeping, 49, 255);
 
-			getCharacterCurrentParams(kCharacterAnna)[6] = 0x7FFFFFFF;
+			startCycOtis(kCharacterAnna, "417B");
+			break;
+		default:
+			break;
 		}
 
-		getCharacterCurrentParams(kCharacterAnna)[0] = 0;
-		getCharacterCurrentParams(kCharacterAnna)[1] = 1;
-
-		setDoor(37, kCharacterAnna, 1, 0, !inComp(kCharacterMax, kCarRedSleeping, 4070) ? 0 : 9);
-		setDoor(53, kCharacterAnna, 1, 0, !inComp(kCharacterMax, kCarRedSleeping, 4070) ? 0 : 9);
-		getCharacterCurrentParams(kCharacterAnna)[6] = 0;
-	} else {
-		getCharacterCurrentParams(kCharacterAnna)[6] = 0;
+		break;
+	case 123733488:
+		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 9;
+		AnnaCall(&LogicManager::CONS_Anna_DoCorrOtis, "629Ef", 37, 0, 0);
+		break;
+	case 156049968:
+		startCycOtis(kCharacterAnna, "629DF");
+		softBlockAtDoor(kCharacterAnna, 37);
+		break;
+	case 253868128:
+		setDoor(53, kCharacterAnna, 1, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -2979,7 +3411,8 @@ void LogicManager::CONS_Anna_GoConcert(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Anna_GoConcert(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		setDoor(45, kCharacterCath, 2, 255, 255);
 		if (checkCathDir(kCarRedSleeping, 78))
 			bumpCath(kCarRedSleeping, 49, 255);
@@ -2989,7 +3422,8 @@ void LogicManager::HAND_Anna_GoConcert(HAND_PARAMS) {
 		dropItem(kItemKey, 1);
 		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
 		AnnaCall(&LogicManager::CONS_Anna_ExitComp, 1, 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		if (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 1) {
 			setDoor(37, kCharacterCath, 1, 10, 9);
 			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 2;
@@ -2997,6 +3431,10 @@ void LogicManager::HAND_Anna_GoConcert(HAND_PARAMS) {
 		} else if (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 2) {
 			CONS_Anna_Concert(0, 0, 0, 0);
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -3011,13 +3449,18 @@ void LogicManager::CONS_Anna_Concert(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Anna_Concert(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		endGraphics(kCharacterAnna);
 		getCharacter(kCharacterAnna).characterPosition.car = kCarKronos;
 		getCharacter(kCharacterAnna).characterPosition.position = 6000;
 		getCharacter(kCharacterAnna).characterPosition.location = 1;
-	} else if (msg->action == 191668032) {
+		break;
+	case 191668032:
 		COND_Anna_LeaveConcert(0, 0, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -3032,27 +3475,15 @@ void LogicManager::COND_Anna_LeaveConcert(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Anna_LeaveConcert(HAND_PARAMS) {
-	if (msg->action > 18) {
-		if (msg->action == 123712592) {
-			startCycOtis(kCharacterAnna, "628Af");
-		LABEL_16:
-			if (whoRunningDialog(kCharacterAugust)) {
-				getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 4;
-				AnnaCall(&LogicManager::CONS_Anna_DoWait, 75, 0, 0, 0);
-			} else {
-				getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 5;
-				AnnaCall(&LogicManager::CONS_Anna_DoDialog, "Aug3009", 0, 0, 0);
-			}
-		} else if (msg->action == 192063264) {
-			if (inComp(kCharacterCath, kCarRedSleeping, 4070) || inComp(kCharacterCath, kCarRedSleeping, 4455)) {
-				softReleaseAtDoor(kCharacterAnna, 37);
-				CONS_Anna_LeaveConcertCathInComp(0, 0, 0, 0);
-			} else {
-				getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 3;
-				AnnaCall(&LogicManager::CONS_Anna_DoCorrOtis, "625Ff", 37, 0, 0);
-			}
-		}
-	} else if (msg->action == 18) {
+	switch (msg->action) {
+	case 12:
+		getCharacter(kCharacterAnna).characterPosition.car = kCarGreenSleeping;
+		getCharacter(kCharacterAnna).characterPosition.position = 850;
+		getCharacter(kCharacterAnna).characterPosition.location = 0;
+		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
+		AnnaCall(&LogicManager::CONS_Anna_DoWalk, 3, 5790, 0, 0);
+		break;
+	case 18:
 		switch (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8]) {
 		case 1:
 			send(kCharacterAnna, kCharacterAugust, 191668032, 0);
@@ -3071,7 +3502,15 @@ void LogicManager::HAND_Anna_LeaveConcert(HAND_PARAMS) {
 			send(kCharacterAnna, kCharacterAugust, 169032608, 0);
 			break;
 		case 4:
-			goto LABEL_16;
+			if (whoRunningDialog(kCharacterAugust)) {
+				getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 4;
+				AnnaCall(&LogicManager::CONS_Anna_DoWait, 75, 0, 0, 0);
+			} else {
+				getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 5;
+				AnnaCall(&LogicManager::CONS_Anna_DoDialog, "Aug3009", 0, 0, 0);
+			}
+
+			break;
 		case 5:
 			playDialog(kCharacterAnna, "Aug3009A", -1, 0);
 			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 6;
@@ -3083,14 +3522,34 @@ void LogicManager::HAND_Anna_LeaveConcert(HAND_PARAMS) {
 			CONS_Anna_AfterConcert(0, 0, 0, 0);
 			break;
 		default:
-			return;
+			break;
 		}
-	} else if (msg->action == 12) {
-		getCharacter(kCharacterAnna).characterPosition.car = kCarGreenSleeping;
-		getCharacter(kCharacterAnna).characterPosition.position = 850;
-		getCharacter(kCharacterAnna).characterPosition.location = 0;
-		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
-		AnnaCall(&LogicManager::CONS_Anna_DoWalk, 3, 5790, 0, 0);
+
+		break;
+	case 123712592:
+		startCycOtis(kCharacterAnna, "628Af");
+
+		if (whoRunningDialog(kCharacterAugust)) {
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 4;
+			AnnaCall(&LogicManager::CONS_Anna_DoWait, 75, 0, 0, 0);
+		} else {
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 5;
+			AnnaCall(&LogicManager::CONS_Anna_DoDialog, "Aug3009", 0, 0, 0);
+		}
+
+		break;
+	case 192063264:
+		if (inComp(kCharacterCath, kCarRedSleeping, 4070) || inComp(kCharacterCath, kCarRedSleeping, 4455)) {
+			softReleaseAtDoor(kCharacterAnna, 37);
+			CONS_Anna_LeaveConcertCathInComp(0, 0, 0, 0);
+		} else {
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 3;
+			AnnaCall(&LogicManager::CONS_Anna_DoCorrOtis, "625Ff", 37, 0, 0);
+		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -3105,16 +3564,24 @@ void LogicManager::CONS_Anna_LeaveConcertCathInComp(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Anna_LeaveConcertCathInComp(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
 		AnnaCall(&LogicManager::CONS_Anna_SaveGame, 2, kEventAnnaSearchingCompartment, 0, 0);
-	} else if (msg->action == 18 && getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 1) {
-		playNIS(kEventAnnaSearchingCompartment);
-		endGraphics(kCharacterAnna);
-		bumpCath(kCarRedSleeping, 8, 255);
-		playDialog(kCharacterAnna, "lib015", -1, 0);
-		send(kCharacterAnna, kCharacterAugust, 122288808, 0);
-		CONS_Anna_AfterConcert(0, 0, 0, 0);
+		break;
+	case 18:
+		if (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 1) {
+			playNIS(kEventAnnaSearchingCompartment);
+			endGraphics(kCharacterAnna);
+			bumpCath(kCarRedSleeping, 8, 255);
+			playDialog(kCharacterAnna, "lib015", -1, 0);
+			send(kCharacterAnna, kCharacterAugust, 122288808, 0);
+			CONS_Anna_AfterConcert(0, 0, 0, 0);
+		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -3129,72 +3596,55 @@ void LogicManager::CONS_Anna_AfterConcert(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Anna_AfterConcert(HAND_PARAMS) {
-	if (msg->action > 9) {
-		if (msg->action > 17) {
-			if (msg->action > 156622016) {
-				if (msg->action == 236241630) {
-					setDoor(37, 1, 1, 0, 0);
-					setDoor(53, 1, 1, 0, 0);
-					getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 7;
-					AnnaCall(&LogicManager::CONS_Anna_DoDialog, "Ann1016A", 0, 0, 0);
-				} else if (msg->action == 236517970) {
-					getCharacterCurrentParams(kCharacterAnna)[2] = 1;
-					setDoor(37, 1, 1, 10, 9);
-					setDoor(53, 1, 1, 10, 9);
-				}
-			} else if (msg->action == 156622016) {
-				if (getCharacterCurrentParams(kCharacterAnna)[2]) {
-					getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 8;
-					AnnaCall(&LogicManager::CONS_Anna_GiveMaxBack, 0, 0, 0, 0);
-				}
-			} else if (msg->action == 18) {
-				switch (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8]) {
-				case 1:
-				case 2:
-					getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 3;
-					AnnaCall(&LogicManager::CONS_Anna_DoDialog, "ANN1016", 0, 0, 0);
-					break;
-				case 3:
-					setDoor(37, kCharacterAnna, 1, 14, 0);
-					setDoor(53, kCharacterAnna, 1, 14, 0);
-					getCharacterCurrentParams(kCharacterAnna)[0] = 1;
-					break;
-				case 4:
-				case 5:
-				case 6:
-					getCharacterCurrentParams(kCharacterAnna)[0] = 0;
-					getCharacterCurrentParams(kCharacterAnna)[1] = 1;
-					break;
-				case 7:
-					send(kCharacterAnna, kCharacterTatiana, 100906246, 0);
+	switch (msg->action) {
+	case 0:
+		if (cathHasItem(kItemKey) && getCharacterCurrentParams(kCharacterAnna)[3] != 0x7FFFFFFF && _gameTime > 2218500) {
+			if (_gameTime > 2248200) {
+				getCharacterCurrentParams(kCharacterAnna)[3] = 0x7FFFFFFF;
+				CONS_Anna_GoBagg(0, 0, 0, 0);
+				break;
+			}
+
+			if (!getCharacterCurrentParams(kCharacterAnna)[2] || !cathInCorridor(kCarRedSleeping) && !inSalon(kCharacterCath) && !inDiningRoom(kCharacterCath) || !getCharacterCurrentParams(kCharacterAnna)[3]) {
+				getCharacterCurrentParams(kCharacterAnna)[3] = _gameTime;
+				if (!getCharacterCurrentParams(kCharacterAnna)[3]) {
+					CONS_Anna_GoBagg(0, 0, 0, 0);
 					break;
-				default:
-					return;
 				}
 			}
-		} else if (msg->action == 17) {
-			if (getCharacterCurrentParams(kCharacterAnna)[1] || getCharacterCurrentParams(kCharacterAnna)[0]) {
-				setDoor(37, kCharacterAnna, 1, 10, 9);
-				setDoor(53, kCharacterAnna, 1, 10, 9);
-				getCharacterCurrentParams(kCharacterAnna)[1] = 0;
-				getCharacterCurrentParams(kCharacterAnna)[0] = 0;
+
+			if (getCharacterCurrentParams(kCharacterAnna)[3] < _gameTime) {
+				getCharacterCurrentParams(kCharacterAnna)[3] = 0x7FFFFFFF;
+				CONS_Anna_GoBagg(0, 0, 0, 0);
+				break;
+			}
+		}
+
+		if (getCharacterCurrentParams(kCharacterAnna)[0]) {
+			if (getCharacterCurrentParams(kCharacterAnna)[4] || (getCharacterCurrentParams(kCharacterAnna)[4] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
+				if (getCharacterCurrentParams(kCharacterAnna)[4] >= _currentGameSessionTicks)
+					break;
+
+				getCharacterCurrentParams(kCharacterAnna)[4] = 0x7FFFFFFF;
 			}
-		} else if (msg->action == 12) {
-			getCharacter(kCharacterAnna).characterPosition.position = 4070;
-			getCharacter(kCharacterAnna).characterPosition.location = 1;
-			endGraphics(kCharacterAnna);
-			setDoor(107, kCharacterCath, 2, 255, 255);
-			setDoor(45, kCharacterCath, 1, 255, 255);
-			setDoor(37, kCharacterAnna, 1, 10, 9);
-			setDoor(53, kCharacterAnna, 1, 10, 9);
 
-			if (checkCathDir(kCarRedSleeping, 60))
-				bumpCath(kCarRedSleeping, 78, 255);
+			getCharacterCurrentParams(kCharacterAnna)[0] = 0;
+			getCharacterCurrentParams(kCharacterAnna)[1] = 1;
+
+			setDoor(37, kCharacterAnna, 1, 0, !inComp(kCharacterMax, kCarRedSleeping, 4070) ? 0 : 9);
+			setDoor(53, kCharacterAnna, 1, 0, !inComp(kCharacterMax, kCarRedSleeping, 4070) ? 0 : 9);
+			getCharacterCurrentParams(kCharacterAnna)[4] = 0;
+		} else {
+			getCharacterCurrentParams(kCharacterAnna)[4] = 0;
 		}
-	} else if (msg->action >= 8) {
+
+		break;
+	case 8:
+	case 9:
 		if (getCharacterCurrentParams(kCharacterAnna)[0]) {
 			setDoor(37, kCharacterAnna, 1, 0, 0);
 			setDoor(53, kCharacterAnna, 1, 0, 0);
+
 			if (msg->param.intParam == 53) {
 				getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 4;
 				AnnaCall(&LogicManager::CONS_Anna_DoDialog, getCathWCDialog(), 0, 0, 0);
@@ -3225,45 +3675,76 @@ void LogicManager::HAND_Anna_AfterConcert(HAND_PARAMS) {
 				AnnaCall(&LogicManager::CONS_Anna_DoDialog, "LIB013", 0, 0, 0);
 			}
 		}
-	} else {
-		if (msg->action)
-			return;
-
-		if (cathHasItem(kItemKey) && getCharacterCurrentParams(kCharacterAnna)[3] != 0x7FFFFFFF && _gameTime > 2218500) {
-			if (_gameTime > 2248200)
-				goto LABEL_27;
-			if (!getCharacterCurrentParams(kCharacterAnna)[2] || !cathInCorridor(kCarRedSleeping) && !inSalon(kCharacterCath) && !inDiningRoom(kCharacterCath) || !getCharacterCurrentParams(kCharacterAnna)[3]) {
-				getCharacterCurrentParams(kCharacterAnna)[3] = _gameTime;
-				if (!getCharacterCurrentParams(kCharacterAnna)[3])
-					goto LABEL_28;
-			}
 
-			if (getCharacterCurrentParams(kCharacterAnna)[3] < _gameTime) {
-			LABEL_27:
-				getCharacterCurrentParams(kCharacterAnna)[3] = 0x7FFFFFFF;
-			LABEL_28:
-				CONS_Anna_GoBagg(0, 0, 0, 0);
-				return;
-			}
-		}
+		break;
+	case 12:
+		getCharacter(kCharacterAnna).characterPosition.position = 4070;
+		getCharacter(kCharacterAnna).characterPosition.location = 1;
+		endGraphics(kCharacterAnna);
+		setDoor(107, kCharacterCath, 2, 255, 255);
+		setDoor(45, kCharacterCath, 1, 255, 255);
+		setDoor(37, kCharacterAnna, 1, 10, 9);
+		setDoor(53, kCharacterAnna, 1, 10, 9);
 
-		if (getCharacterCurrentParams(kCharacterAnna)[0]) {
-			if (getCharacterCurrentParams(kCharacterAnna)[4] || (getCharacterCurrentParams(kCharacterAnna)[4] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
-				if (getCharacterCurrentParams(kCharacterAnna)[4] >= _currentGameSessionTicks)
-					return;
+		if (checkCathDir(kCarRedSleeping, 60))
+			bumpCath(kCarRedSleeping, 78, 255);
 
-				getCharacterCurrentParams(kCharacterAnna)[4] = 0x7FFFFFFF;
-			}
+		break;
+	case 17:
+		if (getCharacterCurrentParams(kCharacterAnna)[1] || getCharacterCurrentParams(kCharacterAnna)[0]) {
+			setDoor(37, kCharacterAnna, 1, 10, 9);
+			setDoor(53, kCharacterAnna, 1, 10, 9);
+			getCharacterCurrentParams(kCharacterAnna)[1] = 0;
+			getCharacterCurrentParams(kCharacterAnna)[0] = 0;
+		}
 
+		break;
+	case 18:
+		switch (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8]) {
+		case 1:
+		case 2:
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 3;
+			AnnaCall(&LogicManager::CONS_Anna_DoDialog, "ANN1016", 0, 0, 0);
+			break;
+		case 3:
+			setDoor(37, kCharacterAnna, 1, 14, 0);
+			setDoor(53, kCharacterAnna, 1, 14, 0);
+			getCharacterCurrentParams(kCharacterAnna)[0] = 1;
+			break;
+		case 4:
+		case 5:
+		case 6:
 			getCharacterCurrentParams(kCharacterAnna)[0] = 0;
 			getCharacterCurrentParams(kCharacterAnna)[1] = 1;
+			break;
+		case 7:
+			send(kCharacterAnna, kCharacterTatiana, 100906246, 0);
+			break;
+		default:
+			break;
+		}
 
-			setDoor(37, kCharacterAnna, 1, 0, !inComp(kCharacterMax, kCarRedSleeping, 4070) ? 0 : 9);
-			setDoor(53, kCharacterAnna, 1, 0, !inComp(kCharacterMax, kCarRedSleeping, 4070) ? 0 : 9);
-			getCharacterCurrentParams(kCharacterAnna)[4] = 0;
-		} else {
-			getCharacterCurrentParams(kCharacterAnna)[4] = 0;
+		break;
+	case 156622016:
+		if (getCharacterCurrentParams(kCharacterAnna)[2]) {
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 8;
+			AnnaCall(&LogicManager::CONS_Anna_GiveMaxBack, 0, 0, 0, 0);
 		}
+
+		break;
+	case 236241630:
+		setDoor(37, 1, 1, 0, 0);
+		setDoor(53, 1, 1, 0, 0);
+		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 7;
+		AnnaCall(&LogicManager::CONS_Anna_DoDialog, "Ann1016A", 0, 0, 0);
+		break;
+	case 236517970:
+		getCharacterCurrentParams(kCharacterAnna)[2] = 1;
+		setDoor(37, 1, 1, 10, 9);
+		setDoor(53, 1, 1, 10, 9);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -3310,12 +3791,17 @@ void LogicManager::HAND_Anna_GiveMaxBack(HAND_PARAMS) {
 			_engine->getMessageManager()->setMessageHandle(kCharacterAnna, _functionsAnna[getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall]]);
 			fedEx(kCharacterAnna, kCharacterAnna, 18, 0);
 			break;
+		default:
+			break;
 		}
+
 		break;
 	case 156049968:
 		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 3;
 		AnnaCall(&LogicManager::CONS_Anna_DoCorrOtis, "629EF", 37, 0, 0);
 		break;
+	default:
+		break;
 	}
 }
 
@@ -3330,11 +3816,13 @@ void LogicManager::CONS_Anna_GoBagg(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Anna_GoBagg(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		_gameTimeTicksDelta = 3;
 		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
 		AnnaCall(&LogicManager::CONS_Anna_SaveGame, 1, 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8]) {
 		case 1:
 			setDoor(53, kCharacterCath, 1, 10, 9);
@@ -3358,8 +3846,10 @@ void LogicManager::HAND_Anna_GoBagg(HAND_PARAMS) {
 			break;
 		case 5:
 			startSeqOtis(kCharacterAnna, "802UD");
+
 			if (inSalon(kCharacterCath))
 				advanceFrame(kCharacterAnna);
+
 			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 6;
 			AnnaCall(&LogicManager::CONS_Anna_FinishSeqOtis, 0, 0, 0, 0);
 			break;
@@ -3368,8 +3858,12 @@ void LogicManager::HAND_Anna_GoBagg(HAND_PARAMS) {
 			CONS_Anna_InBagg(0, 0, 0, 0);
 			break;
 		default:
-			return;
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -3384,17 +3878,24 @@ void LogicManager::CONS_Anna_InBagg(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Anna_InBagg(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			getCharacter(kCharacterAnna).characterPosition.car = kCarBaggage;
-			_gameProgress[kProgressField54] = 1;
-		} else if (msg->action == 235856512) {
-			getCharacterCurrentParams(kCharacterAnna)[0] = 1;
+	switch (msg->action) {
+	case 0:
+		if (getCharacterCurrentParams(kCharacterAnna)[0] && _gameTime > 2259000 && !getCharacterCurrentParams(kCharacterAnna)[1]) {
+			getCharacterCurrentParams(kCharacterAnna)[1] = 1;
+			send(kCharacterAnna, kCharacterVesna, 189299008, 0);
+			CONS_Anna_DeadBagg(0, 0, 0, 0);
 		}
-	} else if (getCharacterCurrentParams(kCharacterAnna)[0] && _gameTime > 2259000 && !getCharacterCurrentParams(kCharacterAnna)[1]) {
-		getCharacterCurrentParams(kCharacterAnna)[1] = 1;
-		send(kCharacterAnna, kCharacterVesna, 189299008, 0);
-		CONS_Anna_DeadBagg(0, 0, 0, 0);
+
+		break;
+	case 12:
+		getCharacter(kCharacterAnna).characterPosition.car = kCarBaggage;
+		_gameProgress[kProgressField54] = 1;
+		break;
+	case 235856512:
+		getCharacterCurrentParams(kCharacterAnna)[0] = 1;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -3416,7 +3917,7 @@ void LogicManager::HAND_Anna_DeadBagg(HAND_PARAMS) {
 	case 18:
 		if (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 1) {
 			playNIS(kEventAnnaKilled);
-			endGame(1, 2250000, 58, 1);
+			endGame(1, 2250000, 58, true);
 		}
 
 		break;
@@ -3443,11 +3944,13 @@ void LogicManager::CONS_Anna_BaggageFight(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Anna_BaggageFight(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		endGraphics(kCharacterAnna);
 		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
 		AnnaCall(&LogicManager::CONS_Anna_SaveGame, 2, kEventAnnaBaggageArgument, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8]) {
 		case 1:
 			playNIS(kEventAnnaBaggageArgument);
@@ -3475,6 +3978,10 @@ void LogicManager::HAND_Anna_BaggageFight(HAND_PARAMS) {
 		default:
 			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -3489,7 +3996,8 @@ void LogicManager::CONS_Anna_PrepareVienna(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Anna_PrepareVienna(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterAnna).characterPosition.car = kCarRedSleeping;
 		getCharacter(kCharacterAnna).characterPosition.position = 4070;
 		getCharacter(kCharacterAnna).characterPosition.location = 1;
@@ -3498,6 +4006,9 @@ void LogicManager::HAND_Anna_PrepareVienna(HAND_PARAMS) {
 		setDoor(45, kCharacterCath, 1, 255, 255);
 		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
 		AnnaCall(&LogicManager::CONS_Anna_CompLogic, 15803100, "NONE", 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -3512,17 +4023,20 @@ void LogicManager::CONS_Anna_StartPart4(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Anna_StartPart4(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			endGraphics(kCharacterAnna);
-			getCharacter(kCharacterAnna).characterPosition.car = kCarRedSleeping;
-			getCharacter(kCharacterAnna).characterPosition.position = 4070;
-			getCharacter(kCharacterAnna).characterPosition.location = 1;
-			getCharacter(kCharacterAnna).clothes = 2;
-			getCharacter(kCharacterAnna).inventoryItem = 0;
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		CONS_Anna_Reading(0, 0, 0, 0);
+		break;
+	case 12:
+		endGraphics(kCharacterAnna);
+		getCharacter(kCharacterAnna).characterPosition.car = kCarRedSleeping;
+		getCharacter(kCharacterAnna).characterPosition.position = 4070;
+		getCharacter(kCharacterAnna).characterPosition.location = 1;
+		getCharacter(kCharacterAnna).clothes = 2;
+		getCharacter(kCharacterAnna).inventoryItem = 0;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -3537,61 +4051,65 @@ void LogicManager::CONS_Anna_Reading(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Anna_Reading(HAND_PARAMS) {
-	if (msg->action > 9) {
-		if (msg->action > 17) {
-			switch (msg->action) {
-			case 18:
-				switch (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8]) {
-				case 1:
-					playNIS(kEventAnnaConversation_34);
-					playDialog(0, "LIB015", -1, 0);
-					bumpCath(kCarRedSleeping, 8, 255);
-					CONS_Anna_Sulking(0, 0, 0, 0);
-					break;
-				case 2:
-				case 3:
-					getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 4;
-					AnnaCall(&LogicManager::CONS_Anna_DoDialog, "ANN1016", 0, 0, 0);
-					break;
-				case 4:
-					setDoor(53, kCharacterAnna, 1, 14, 0);
-					getCharacterCurrentParams(kCharacterAnna)[0] = 1;
-					break;
-				case 5:
-					getCharacterCurrentParams(kCharacterAnna)[0] = 0;
-					getCharacterCurrentParams(kCharacterAnna)[1] = 1;
+	switch (msg->action) {
+	case 0:
+		if (checkCathDir(kCarRedSleeping, 46)) {
+			if (getCharacterCurrentParams(kCharacterAnna)[3] || (getCharacterCurrentParams(kCharacterAnna)[3] = _currentGameSessionTicks + 30, _currentGameSessionTicks != -30)) {
+				if (getCharacterCurrentParams(kCharacterAnna)[3] >= _currentGameSessionTicks) {
+					if (getCharacterCurrentParams(kCharacterAnna)[0]) {
+						if (getCharacterCurrentParams(kCharacterAnna)[4] || (getCharacterCurrentParams(kCharacterAnna)[4] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
+							if (getCharacterCurrentParams(kCharacterAnna)[4] >= _currentGameSessionTicks)
+								break;
+
+							getCharacterCurrentParams(kCharacterAnna)[4] = 0x7FFFFFFF;
+						}
+
+						getCharacterCurrentParams(kCharacterAnna)[0] = 0;
+						getCharacterCurrentParams(kCharacterAnna)[1] = 1;
+
+						setDoor(53, kCharacterAnna, 1, 0, !inComp(kCharacterMax, kCarRedSleeping, 4070) ? 0 : 9);
+						getCharacterCurrentParams(kCharacterAnna)[4] = 0;
+					} else {
+						getCharacterCurrentParams(kCharacterAnna)[4] = 0;
+					}
+
 					break;
-				default:
-					return;
 				}
-				break;
-			case 191001984:
-				setDoor(37, kCharacterCath, 0, 10, 9);
-				getCharacter(kCharacterAnna).inventoryItem = 0;
-				CONS_Anna_GoSalon4(0, 0, 0, 0);
-				break;
-			case 219971920:
-				getCharacterCurrentParams(kCharacterAnna)[2] = 1;
-				getCharacter(kCharacterAnna).inventoryItem = 0x80;
-				break;
-			}
-		} else if (msg->action == 17) {
-			if (getCharacterCurrentParams(kCharacterAnna)[1] || getCharacterCurrentParams(kCharacterAnna)[0]) {
-				setDoor(53, kCharacterAnna, 1, 10, 9);
-				getCharacterCurrentParams(kCharacterAnna)[1] = 0;
-				getCharacterCurrentParams(kCharacterAnna)[0] = 0;
+
+				getCharacterCurrentParams(kCharacterAnna)[3] = 0x7FFFFFFF;
 			}
-		} else if (msg->action == 12) {
-			setDoor(37, kCharacterCath, 2, 0, 0);
-			setDoor(45, kCharacterCath, 1, 255, 255);
-			setDoor(53, kCharacterAnna, 1, 10, 9);
-			startCycOtis(kCharacterAnna, "511B");
+
+			bumpCath(kCarRedSleeping, 8, 255);
 		}
 
-		return;
-	}
+		getCharacterCurrentParams(kCharacterAnna)[3] = 0;
+
+		if (getCharacterCurrentParams(kCharacterAnna)[0]) {
+			if (getCharacterCurrentParams(kCharacterAnna)[4] || (getCharacterCurrentParams(kCharacterAnna)[4] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
+				if (getCharacterCurrentParams(kCharacterAnna)[4] >= _currentGameSessionTicks)
+					break;
+
+				getCharacterCurrentParams(kCharacterAnna)[4] = 0x7FFFFFFF;
+			}
+
+			getCharacterCurrentParams(kCharacterAnna)[0] = 0;
+			getCharacterCurrentParams(kCharacterAnna)[1] = 1;
+
+			setDoor(53, kCharacterAnna, 1, 0, !inComp(kCharacterMax, kCarRedSleeping, 4070) ? 0 : 9);
+			getCharacterCurrentParams(kCharacterAnna)[4] = 0;
+		} else {
+			getCharacterCurrentParams(kCharacterAnna)[4] = 0;
+		}
 
-	if (msg->action >= 8) {
+		break;
+	case 1:
+		getCharacter(kCharacterAnna).inventoryItem = 0;
+		getCharacter(kCharacterCath).characterPosition.location = 1;
+		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
+		AnnaCall(&LogicManager::CONS_Anna_SaveGame, 2, 34, 0, 0);
+		break;
+	case 8:
+	case 9:
 		if (getCharacterCurrentParams(kCharacterAnna)[0]) {
 			setDoor(53, kCharacterAnna, 1, 0, 0);
 			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 5;
@@ -3608,48 +4126,58 @@ void LogicManager::HAND_Anna_Reading(HAND_PARAMS) {
 			}
 		}
 
-		return;
-	}
-
-	if (msg->action) {
-		if (msg->action == 1) {
-			getCharacter(kCharacterAnna).inventoryItem = 0;
-			getCharacter(kCharacterCath).characterPosition.location = 1;
-			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
-			AnnaCall(&LogicManager::CONS_Anna_SaveGame, 2, 34, 0, 0);
-		}
-
-		return;
-	}
-
-	if (checkCathDir(kCarRedSleeping, 46)) {
-		if (getCharacterCurrentParams(kCharacterAnna)[3] || (getCharacterCurrentParams(kCharacterAnna)[3] = _currentGameSessionTicks + 30, _currentGameSessionTicks != -30)) {
-			if (getCharacterCurrentParams(kCharacterAnna)[3] >= _currentGameSessionTicks)
-				goto LABEL_21;
-
-			getCharacterCurrentParams(kCharacterAnna)[3] = 0x7FFFFFFF;
+		break;
+	case 12:
+		setDoor(37, kCharacterCath, 2, 0, 0);
+		setDoor(45, kCharacterCath, 1, 255, 255);
+		setDoor(53, kCharacterAnna, 1, 10, 9);
+		startCycOtis(kCharacterAnna, "511B");
+		break;
+	case 17:
+		if (getCharacterCurrentParams(kCharacterAnna)[1] || getCharacterCurrentParams(kCharacterAnna)[0]) {
+			setDoor(53, kCharacterAnna, 1, 10, 9);
+			getCharacterCurrentParams(kCharacterAnna)[1] = 0;
+			getCharacterCurrentParams(kCharacterAnna)[0] = 0;
 		}
 
-		bumpCath(kCarRedSleeping, 8, 255);
-	}
-
-	getCharacterCurrentParams(kCharacterAnna)[3] = 0;
-LABEL_21:
-	if (getCharacterCurrentParams(kCharacterAnna)[0]) {
-		if (getCharacterCurrentParams(kCharacterAnna)[4] || (getCharacterCurrentParams(kCharacterAnna)[4] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
-			if (getCharacterCurrentParams(kCharacterAnna)[4] >= _currentGameSessionTicks)
-				return;
-
-			getCharacterCurrentParams(kCharacterAnna)[4] = 0x7FFFFFFF;
+		break;
+	case 18:
+		switch (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8]) {
+		case 1:
+			playNIS(kEventAnnaConversation_34);
+			playDialog(0, "LIB015", -1, 0);
+			bumpCath(kCarRedSleeping, 8, 255);
+			CONS_Anna_Sulking(0, 0, 0, 0);
+			break;
+		case 2:
+		case 3:
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 4;
+			AnnaCall(&LogicManager::CONS_Anna_DoDialog, "ANN1016", 0, 0, 0);
+			break;
+		case 4:
+			setDoor(53, kCharacterAnna, 1, 14, 0);
+			getCharacterCurrentParams(kCharacterAnna)[0] = 1;
+			break;
+		case 5:
+			getCharacterCurrentParams(kCharacterAnna)[0] = 0;
+			getCharacterCurrentParams(kCharacterAnna)[1] = 1;
+			break;
+		default:
+			break;
 		}
 
-		getCharacterCurrentParams(kCharacterAnna)[0] = 0;
-		getCharacterCurrentParams(kCharacterAnna)[1] = 1;
-
-		setDoor(53, kCharacterAnna, 1, 0, !inComp(kCharacterMax, kCarRedSleeping, 4070) ? 0 : 9);
-		getCharacterCurrentParams(kCharacterAnna)[4] = 0;
-	} else {
-		getCharacterCurrentParams(kCharacterAnna)[4] = 0;
+		break;
+	case 191001984:
+		setDoor(37, kCharacterCath, 0, 10, 9);
+		getCharacter(kCharacterAnna).inventoryItem = 0;
+		CONS_Anna_GoSalon4(0, 0, 0, 0);
+		break;
+	case 219971920:
+		getCharacterCurrentParams(kCharacterAnna)[2] = 1;
+		getCharacter(kCharacterAnna).inventoryItem = 0x80;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -3664,24 +4192,30 @@ void LogicManager::CONS_Anna_Sulking(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Anna_Sulking(HAND_PARAMS) {
-	if (msg->action > 12) {
-		if (msg->action != 18) {
-			if (msg->action == 191001984) {
-				setDoor(37, kCharacterCath, 0, 10, 9);
-				CONS_Anna_GoSalon4(0, 0, 0, 0);
-			} else if (msg->action == 201431954) {
-				getCharacterCurrentParams(kCharacterAnna)[0] = 1;
-			}
+	switch (msg->action) {
+	case 0:
+		if (!getCharacterCurrentParams(kCharacterAnna)[0]) {
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
+			AnnaCall(&LogicManager::CONS_Anna_CompLogic, 2511900, "NONE", 0, 0);
 		}
-	} else if (msg->action == 12) {
+
+		break;
+	case 12:
 		setDoor(37, kCharacterCath, 1, 10, 9);
 		setDoor(53, kCharacterCath, 1, 10, 9);
 		getCharacter(kCharacterAnna).characterPosition.car = 4;
 		getCharacter(kCharacterAnna).characterPosition.position = 4070;
 		getCharacter(kCharacterAnna).characterPosition.location = 1;
-	} else if (msg->action == 0 && !getCharacterCurrentParams(kCharacterAnna)[0]) {
-		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
-		AnnaCall(&LogicManager::CONS_Anna_CompLogic, 2511900, "NONE", 0, 0);
+		break;
+	case 191001984:
+		setDoor(37, kCharacterCath, 0, 10, 9);
+		CONS_Anna_GoSalon4(0, 0, 0, 0);
+		break;
+	case 201431954:
+		getCharacterCurrentParams(kCharacterAnna)[0] = 1;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -3696,70 +4230,12 @@ void LogicManager::CONS_Anna_GoSalon4(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Anna_GoSalon4(HAND_PARAMS) {
-	if (msg->action > 12) {
-		if (msg->action > 100969180) {
-			if (msg->action == 122288808) {
-				startCycOtis(kCharacterAnna, "127E");
-				send(kCharacterAnna, kCharacterAbbot, 203073664, 0);
-			} else if (msg->action == 122358304) {
-				startCycOtis(kCharacterAnna, "BLANK");
-			}
-		} else {
-			switch (msg->action) {
-			case 100969180:
-				endGraphics(kCharacterAnna);
-				getCharacterCurrentParams(kCharacterAnna)[0] = 1;
-				break;
-			case 17:
-				if (getCharacterCurrentParams(kCharacterAnna)[0] && checkLoc(kCharacterCath, kCarRedSleeping)) {
-					getCharacter(kCharacterAnna).characterPosition.car = kCarRedSleeping;
-					getCharacter(kCharacterAnna).characterPosition.position = 8200;
-					getCharacter(kCharacterAnna).characterPosition.location = 0;
-					CONS_Anna_ReturnToComp4(0, 0, 0, 0);
-				}
-				break;
-			case 18:
-				switch (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8]) {
-				case 1:
-					getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 2;
-					AnnaCall(&LogicManager::CONS_Anna_WaitRCClear, 0, 0, 0, 0);
-					break;
-				case 2:
-					getCharacter(kCharacterAnna).characterPosition.position = 1540;
-					getCharacter(kCharacterAnna).characterPosition.location = 0;
-					getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 3;
-					AnnaCall(&LogicManager::CONS_Anna_DoBlockSeqOtis, "127A", 5, 56, 0);
-					break;
-				case 3:
-					getCharacter(kCharacterAnna).characterPosition.location = 1;
-					startCycOtis(kCharacterAnna, "127B");
-					send(kCharacterAnna, kCharacterWaiter2, 258136010, 0);
-					break;
-				case 4:
-					getCharacter(kCharacterAnna).characterPosition.location = 0;
-					getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 5;
-					AnnaCall(&LogicManager::CONS_Anna_DoBlockSeqOtis, "127G", 5, 56, 0);
-					break;
-				case 5:
-					CONS_Anna_ReturnToComp4(0, 0, 0, 0);
-					break;
-				default:
-					return;
-				}
-				break;
-			}
-		}
-	} else if (msg->action == 12) {
-		getCharacter(kCharacterAnna).characterPosition.car = kCarRedSleeping;
-		getCharacter(kCharacterAnna).characterPosition.position = 4070;
-		getCharacter(kCharacterAnna).characterPosition.location = 0;
-		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
-		AnnaCall(&LogicManager::CONS_Anna_DoWalk, 5, 850, 0, 0);
-	} else if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		if (getCharacterCurrentParams(kCharacterAnna)[0]) {
 			if (getCharacterCurrentParams(kCharacterAnna)[1] || (getCharacterCurrentParams(kCharacterAnna)[1] = _gameTime + 4500, _gameTime != -4500)) {
 				if (getCharacterCurrentParams(kCharacterAnna)[1] >= _gameTime)
-					return;
+					break;
 
 				getCharacterCurrentParams(kCharacterAnna)[1] = 0x7FFFFFFF;
 			}
@@ -3773,6 +4249,67 @@ void LogicManager::HAND_Anna_GoSalon4(HAND_PARAMS) {
 			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 4;
 			AnnaCall(&LogicManager::CONS_Anna_WaitRCClear, 0, 0, 0, 0);
 		}
+
+		break;
+	case 12:
+		getCharacter(kCharacterAnna).characterPosition.car = kCarRedSleeping;
+		getCharacter(kCharacterAnna).characterPosition.position = 4070;
+		getCharacter(kCharacterAnna).characterPosition.location = 0;
+		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
+		AnnaCall(&LogicManager::CONS_Anna_DoWalk, 5, 850, 0, 0);
+		break;
+	case 17:
+		if (getCharacterCurrentParams(kCharacterAnna)[0] && checkLoc(kCharacterCath, kCarRedSleeping)) {
+			getCharacter(kCharacterAnna).characterPosition.car = kCarRedSleeping;
+			getCharacter(kCharacterAnna).characterPosition.position = 8200;
+			getCharacter(kCharacterAnna).characterPosition.location = 0;
+			CONS_Anna_ReturnToComp4(0, 0, 0, 0);
+		}
+
+		break;
+	case 18:
+		switch (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8]) {
+		case 1:
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 2;
+			AnnaCall(&LogicManager::CONS_Anna_WaitRCClear, 0, 0, 0, 0);
+			break;
+		case 2:
+			getCharacter(kCharacterAnna).characterPosition.position = 1540;
+			getCharacter(kCharacterAnna).characterPosition.location = 0;
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 3;
+			AnnaCall(&LogicManager::CONS_Anna_DoBlockSeqOtis, "127A", 5, 56, 0);
+			break;
+		case 3:
+			getCharacter(kCharacterAnna).characterPosition.location = 1;
+			startCycOtis(kCharacterAnna, "127B");
+			send(kCharacterAnna, kCharacterWaiter2, 258136010, 0);
+			break;
+		case 4:
+			getCharacter(kCharacterAnna).characterPosition.location = 0;
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 5;
+			AnnaCall(&LogicManager::CONS_Anna_DoBlockSeqOtis, "127G", 5, 56, 0);
+			break;
+		case 5:
+			CONS_Anna_ReturnToComp4(0, 0, 0, 0);
+			break;
+		default:
+			break;
+		}
+
+		break;
+	case 100969180:
+		endGraphics(kCharacterAnna);
+		getCharacterCurrentParams(kCharacterAnna)[0] = 1;
+		break;
+	case 122288808:
+		startCycOtis(kCharacterAnna, "127E");
+		send(kCharacterAnna, kCharacterAbbot, 203073664, 0);
+		break;
+	case 122358304:
+		startCycOtis(kCharacterAnna, "BLANK");
+		break;
+	default:
+		break;
 	}
 }
 
@@ -3787,10 +4324,12 @@ void LogicManager::CONS_Anna_ReturnToComp4(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Anna_ReturnToComp4(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
 		AnnaCall(&LogicManager::CONS_Anna_DoWalkCathFollowsAnna, 4, 4070, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		if (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 1) {
 			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 2;
 			AnnaCall(&LogicManager::CONS_Anna_EnterCompCathFollowsAnna, 0, 0, 0, 0);
@@ -3799,6 +4338,10 @@ void LogicManager::HAND_Anna_ReturnToComp4(HAND_PARAMS) {
 			endGraphics(kCharacterAnna);
 			CONS_Anna_LetDownHair(0, 0, 0, 0);
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -3937,36 +4480,39 @@ void LogicManager::CONS_Anna_LetDownHair(CONS_PARAMS) {
 void LogicManager::HAND_Anna_LetDownHair(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
-		if (getCharacterCurrentParams(kCharacterAnna)[2] == 0x7FFFFFFF || getCharacterCurrentParams(kCharacterAnna)[0] >= _gameTime)
-			return;
-		if (getCharacterCurrentParams(kCharacterAnna)[1] < _gameTime)
-			goto LABEL_11;
-		if ((cathInCorridor(kCarGreenSleeping) || cathInCorridor(kCarRedSleeping)) && getCharacterCurrentParams(kCharacterAnna)[2] || (getCharacterCurrentParams(kCharacterAnna)[2] = _gameTime, _gameTime != 0)) {
-			if (getCharacterCurrentParams(kCharacterAnna)[2] >= _gameTime)
-				return;
-		LABEL_11:
-			getCharacterCurrentParams(kCharacterAnna)[2] = 0x7FFFFFFF;
-		}
-		if (!cathInCorridor(kCarGreenSleeping) && !cathInCorridor(kCarRedSleeping))
-			playDialog(0, "BUMP", -1, 0);
-		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
-		AnnaCall(&LogicManager::CONS_Anna_SaveGame, 2, kEventTrainHijacked, 0, 0);
+		if (getCharacterCurrentParams(kCharacterAnna)[2] != 0x7FFFFFFF && getCharacterCurrentParams(kCharacterAnna)[0] < _gameTime) {
+			if (getCharacterCurrentParams(kCharacterAnna)[1] < _gameTime) {
+				getCharacterCurrentParams(kCharacterAnna)[2] = 0x7FFFFFFF;
+			} else if ((cathInCorridor(kCarGreenSleeping) || cathInCorridor(kCarRedSleeping)) && getCharacterCurrentParams(kCharacterAnna)[2] || (getCharacterCurrentParams(kCharacterAnna)[2] = _gameTime, _gameTime != 0)) {
+				if (getCharacterCurrentParams(kCharacterAnna)[2] >= _gameTime)
+					break;
+	
+				getCharacterCurrentParams(kCharacterAnna)[2] = 0x7FFFFFFF;
+			}
+
+			if (!cathInCorridor(kCarGreenSleeping) && !cathInCorridor(kCarRedSleeping))
+				playDialog(0, "BUMP", -1, 0);
+
+			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
+			AnnaCall(&LogicManager::CONS_Anna_SaveGame, 2, kEventTrainHijacked, 0, 0);
+		}
+
 		break;
 	case 8:
 		setDoor(37, kCharacterAnna, 0, 0, 0);
 		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 2;
 		AnnaCall(&LogicManager::CONS_Anna_DoDialog, "LIB012", 0, 0, 0);
-		return;
+		break;
 	case 9:
 		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 4;
 		AnnaCall(&LogicManager::CONS_Anna_SaveGame, 2, kEventAnnaKissTrainHijacked, 0, 0);
-		return;
+		break;
 	case 12:
 		setDoor(37, kCharacterAnna, 0, 10, 9);
 		_gameTimeTicksDelta = 1;
 		getCharacterCurrentParams(kCharacterAnna)[0] = _gameTime + 4500;
 		getCharacterCurrentParams(kCharacterAnna)[1] = _gameTime + 9000;
-		return;
+		break;
 	case 18:
 		switch (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8]) {
 		case 1:
@@ -3985,11 +4531,12 @@ void LogicManager::HAND_Anna_LetDownHair(HAND_PARAMS) {
 			send(kCharacterAnna, kCharacterMaster, 139254416, 0);
 			break;
 		default:
-			return;
+			break;
 		}
-		return;
+
+		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -4004,18 +4551,21 @@ void LogicManager::CONS_Anna_StartPart5(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Anna_StartPart5(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			endGraphics(kCharacterAnna);
-			getCharacter(kCharacterAnna).characterPosition.car = 1;
-			getCharacter(kCharacterAnna).characterPosition.position = 3969;
-			getCharacter(kCharacterAnna).characterPosition.location = 1;
-			getCharacter(kCharacterAnna).clothes = 3;
-			getCharacter(kCharacterAnna).inventoryItem = 0;
-			setDoor(45, kCharacterCath, 0, 255, 255);
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		CONS_Anna_TiedUp(0, 0, 0, 0);
+		break;
+	case 12:
+		endGraphics(kCharacterAnna);
+		getCharacter(kCharacterAnna).characterPosition.car = 1;
+		getCharacter(kCharacterAnna).characterPosition.position = 3969;
+		getCharacter(kCharacterAnna).characterPosition.location = 1;
+		getCharacter(kCharacterAnna).clothes = 3;
+		getCharacter(kCharacterAnna).inventoryItem = 0;
+		setDoor(45, kCharacterCath, 0, 255, 255);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -4030,7 +4580,8 @@ void LogicManager::CONS_Anna_TiedUp(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Anna_TiedUp(HAND_PARAMS) {
-	if (msg->action == 18) {
+	switch (msg->action) {
+	case 18:
 		if (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 1) {
 			if (_gameProgress[kProgressFieldC]) {
 				if (_gameEvents[kEventAnnaKissTrainHijacked]) {
@@ -4047,9 +4598,14 @@ void LogicManager::HAND_Anna_TiedUp(HAND_PARAMS) {
 			bumpCath(kCarBaggageRear, 88, 255);
 			CONS_Anna_Outside(0, 0, 0, 0);
 		}
-	} else if (msg->action == 272177921) {
+
+		break;
+	case 272177921:
 		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
 		AnnaCall(&LogicManager::CONS_Anna_SaveGame, 2, kEventAnnaBaggageTies, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -4064,8 +4620,13 @@ void LogicManager::CONS_Anna_Outside(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Anna_Outside(HAND_PARAMS) {
-	if (msg->action == 158480160)
+	switch (msg->action) {
+	case 158480160:
 		CONS_Anna_ReadyToScore(0, 0, 0, 0);
+		break;
+	default:
+		break;
+	}
 }
 
 void LogicManager::CONS_Anna_ReadyToScore(CONS_PARAMS) {
@@ -4085,6 +4646,7 @@ void LogicManager::HAND_Anna_ReadyToScore(HAND_PARAMS) {
 			getCharacterCurrentParams(kCharacterAnna)[1] = 1;
 			_gameTimeTicksDelta = 0;
 		}
+
 		break;
 	case 8:
 	case 9:
@@ -4105,6 +4667,7 @@ void LogicManager::HAND_Anna_ReadyToScore(HAND_PARAMS) {
 			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
 			AnnaCall(&LogicManager::CONS_Anna_SaveGame, 1, 0, 0, 0);
 		}
+
 		break;
 	case 18:
 		switch (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8]) {
@@ -4124,10 +4687,13 @@ void LogicManager::HAND_Anna_ReadyToScore(HAND_PARAMS) {
 		case 3:
 			CONS_Anna_Kidnapped(0, 0, 0, 0);
 			break;
+		default:
+			break;
 		}
+
 		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -4142,26 +4708,33 @@ void LogicManager::CONS_Anna_Kidnapped(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Anna_Kidnapped(HAND_PARAMS) {
-	if (msg->action == 17) {
-		if (inDiningRoom(kCharacterCath) && cathHasItem(kItemFirebird))
-			goto LABEL_6;
+	switch (msg->action) {
+	case 17:
+		if (inDiningRoom(kCharacterCath) && cathHasItem(kItemFirebird)) {
+			CONS_Anna_FinalSequence(0, 0, 0, 0);
+			break;
+		}
+
 		if (!inSalon(kCharacterCath))
-			return;
+			break;
+
 		if (cathHasItem(kItemFirebird)) {
-		LABEL_6:
 			CONS_Anna_FinalSequence(0, 0, 0, 0);
-			return;
+			break;
 		}
 
 		_gameTime = 4920300;
-		if (_gameInventory[18].location == 4) {
+
+		if (_gameInventory[kItemFirebird].location == 4) {
 			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 2;
 			AnnaCall(&LogicManager::CONS_Anna_SaveGame, 2, kEventKronosHostageAnna, 0, 0);
 		} else {
 			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
 			AnnaCall(&LogicManager::CONS_Anna_SaveGame, 2, kEventKronosHostageAnnaNoFirebird, 0, 0);
 		}
-	} else if (msg->action == 18) {
+
+		break;
+	case 18:
 		if (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 1) {
 			playNIS(kEventKronosHostageAnnaNoFirebird);
 			endGame(3, 42, 0, 1);
@@ -4171,6 +4744,10 @@ void LogicManager::HAND_Anna_Kidnapped(HAND_PARAMS) {
 			playDialog(kCharacterAnna, "Mus024", 16, 0);
 			CONS_Anna_Waiting(0, 0, 0, 0);
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -4199,6 +4776,7 @@ void LogicManager::HAND_Anna_Waiting(HAND_PARAMS) {
 			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 2;
 			AnnaCall(&LogicManager::CONS_Anna_SaveGame, 2, kEventKahinaPunch, 0, 0);
 		}
+
 		break;
 	case 18:
 		if (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 1) {
@@ -4213,11 +4791,15 @@ void LogicManager::HAND_Anna_Waiting(HAND_PARAMS) {
 			} else if (checkLoc(kCharacterCath, kCarBaggage)) {
 				playNIS(kEventKahinaPunchBaggageCar);
 			}
-			endGame(0, 1, 0, 1);
+
+			endGame(0, 1, 0, true);
 		} else if (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 2) {
 			playNIS(kEventKahinaPunch);
-			endGame(0, 1, 0, 1);
+			endGame(0, 1, 0, true);
 		}
+
+		break;
+	default:
 		break;
 	}
 }
@@ -4233,54 +4815,62 @@ void LogicManager::CONS_Anna_FinalSequence(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Anna_FinalSequence(HAND_PARAMS) {
-	if (msg->action > 12) {
-		if (msg->action == 18) {
-			switch (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8]) {
-			case 1:
-				if (whoRunningDialog(kCharacterAnna))
-					fadeDialog(kCharacterAnna);
-				playNIS(kEventKronosBringFirebird);
-				bumpCathCloseUp(kItemFirebird);
-				playDialog(1, "Mus025", 16, 0);
-				break;
-			case 2:
-				playNIS(kEventKahinaPunch);
-				endGame(0, 1, 0, 1);
-				break;
-			case 3:
-				_gameProgress[kProgressIsEggOpen] = 1;
-				if (whoRunningDialog(kCharacterAnna))
-					fadeDialog(kCharacterAnna);
-				playNIS(kEventKronosOpenFirebird);
-				bumpCath(kCarRestaurant, 3, 255);
-				CONS_Anna_OpenFirebird(0, 0, 0, 0);
+	switch (msg->action) {
+	case 0:
+		if (getCharacterCurrentParams(kCharacterAnna)[0] || (getCharacterCurrentParams(kCharacterAnna)[0] = _currentGameSessionTicks + 450, _currentGameSessionTicks != -450)) {
+			if (getCharacterCurrentParams(kCharacterAnna)[0] >= _currentGameSessionTicks)
 				break;
-			}
-		} else if (msg->action == 205294778) {
-			_gameTime = 4929300;
-			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 3;
-			AnnaCall(&LogicManager::CONS_Anna_SaveGame, 2, kEventKronosOpenFirebird, 0, 0);
+
+			getCharacterCurrentParams(kCharacterAnna)[0] = 0x7FFFFFFF;
 		}
-	} else if (msg->action == 12) {
+
+		playDialog(0, "Kro5001", 16, 0);
+		break;
+	case 2:
+		playDialog(0, "Kro5002", 16, 0);
+		_gameTime = 4929300;
+		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 2;
+		AnnaCall(&LogicManager::CONS_Anna_SaveGame, 2, kEventKahinaPunch, 0, 0);
+		break;
+	case 12:
 		_gameTime = 4923000;
 		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
 		AnnaCall(&LogicManager::CONS_Anna_SaveGame, 2, kEventKronosBringFirebird, 0, 0);
-	} else if (msg->action) {
-		if (msg->action == 2) {
-			playDialog(0, "Kro5002", 16, 0);
-			_gameTime = 4929300;
-			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 2;
-			AnnaCall(&LogicManager::CONS_Anna_SaveGame, 2, kEventKahinaPunch, 0, 0);
-		}
-	} else {
-		if (getCharacterCurrentParams(kCharacterAnna)[0] || (getCharacterCurrentParams(kCharacterAnna)[0] = _currentGameSessionTicks + 450, _currentGameSessionTicks != -450)) {
-			if (getCharacterCurrentParams(kCharacterAnna)[0] >= _currentGameSessionTicks)
-				return;
+		break;
+	case 18:
+		switch (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8]) {
+		case 1:
+			if (whoRunningDialog(kCharacterAnna))
+				fadeDialog(kCharacterAnna);
 
-			getCharacterCurrentParams(kCharacterAnna)[0] = 0x7FFFFFFF;
+			playNIS(kEventKronosBringFirebird);
+			bumpCathCloseUp(kItemFirebird);
+			playDialog(1, "Mus025", 16, 0);
+			break;
+		case 2:
+			playNIS(kEventKahinaPunch);
+			endGame(0, 1, 0, true);
+			break;
+		case 3:
+			_gameProgress[kProgressIsEggOpen] = 1;
+
+			if (whoRunningDialog(kCharacterAnna))
+				fadeDialog(kCharacterAnna);
+
+			playNIS(kEventKronosOpenFirebird);
+			bumpCath(kCarRestaurant, 3, 255);
+			CONS_Anna_OpenFirebird(0, 0, 0, 0);
+			break;
 		}
 
-		playDialog(0, "Kro5001", 16, 0);
+		break;
+	case 205294778:
+		_gameTime = 4929300;
+		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 3;
+		AnnaCall(&LogicManager::CONS_Anna_SaveGame, 2, kEventKronosOpenFirebird, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -4295,20 +4885,19 @@ void LogicManager::CONS_Anna_OpenFirebird(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Anna_OpenFirebird(HAND_PARAMS) {
-	if (msg->action > 18) {
-		if (msg->action == 224309120) {
-			_gameProgress[kProgressIsEggOpen] = 0;
-			_gameTime = 4941000;
-			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
-			AnnaCall(&LogicManager::CONS_Anna_SaveGame, 2, kEventKronosGiveFirebird, 0, 0);
-		} else if (msg->action == 270751616) {
-			_gameProgress[kProgressIsEggOpen] = 0;
-			killGracePeriod();
-			_gameTime = 4941000;
-			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 2;
-			AnnaCall(&LogicManager::CONS_Anna_SaveGame, 2, kEventFinalSequence, 0, 0);
+	switch (msg->action) {
+	case 0:
+		if (getCharacterCurrentParams(kCharacterAnna)[0] || (getCharacterCurrentParams(kCharacterAnna)[0] = _currentGameSessionTicks + 180, _currentGameSessionTicks != -180)) {
+			if (getCharacterCurrentParams(kCharacterAnna)[0] >= _currentGameSessionTicks)
+				break;
+
+			getCharacterCurrentParams(kCharacterAnna)[0] = 0x7FFFFFFF;
 		}
-	} else if (msg->action == 18) {
+
+		playDialog(kCharacterClerk, "LIB069", 16, 0);
+		endGame(0, 0, 0, true);
+		break;
+	case 18:
 		if (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 1) {
 			playNIS(kEventCathCloseEggNoBackground);
 			playNIS(kEventKronosGiveFirebird);
@@ -4323,16 +4912,23 @@ void LogicManager::HAND_Anna_OpenFirebird(HAND_PARAMS) {
 			takeCathItem(kItemWhistle);
 			winGame();
 		}
-	} else if (msg->action == 0) {
-		if (getCharacterCurrentParams(kCharacterAnna)[0] || (getCharacterCurrentParams(kCharacterAnna)[0] = _currentGameSessionTicks + 180, _currentGameSessionTicks != -180)) {
-			if (getCharacterCurrentParams(kCharacterAnna)[0] >= _currentGameSessionTicks)
-				return;
-
-			getCharacterCurrentParams(kCharacterAnna)[0] = 0x7FFFFFFF;
-		}
 
-		playDialog(kCharacterClerk, "LIB069", 16, 0);
-		endGame(0, 0, 0, true);
+		break;
+	case 224309120:
+		_gameProgress[kProgressIsEggOpen] = 0;
+		_gameTime = 4941000;
+		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
+		AnnaCall(&LogicManager::CONS_Anna_SaveGame, 2, kEventKronosGiveFirebird, 0, 0);
+		break;
+	case 270751616:
+		_gameProgress[kProgressIsEggOpen] = 0;
+		killGracePeriod();
+		_gameTime = 4941000;
+		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 2;
+		AnnaCall(&LogicManager::CONS_Anna_SaveGame, 2, kEventFinalSequence, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 


Commit: 2ca65f13795de57071ae309064aa68c07ea81fef
    https://github.com/scummvm/scummvm/commit/2ca65f13795de57071ae309064aa68c07ea81fef
Author: AndywinXp (andywinxp at gmail.com)
Date: 2025-06-16T23:12:18+02:00

Commit Message:
LASTEXPRESS: Clean up Mitchell logic

Changed paths:
    engines/lastexpress/characters/mitchell.cpp


diff --git a/engines/lastexpress/characters/mitchell.cpp b/engines/lastexpress/characters/mitchell.cpp
index 143e510ef5c..20f0d55a414 100644
--- a/engines/lastexpress/characters/mitchell.cpp
+++ b/engines/lastexpress/characters/mitchell.cpp
@@ -48,7 +48,7 @@ void LogicManager::CONS_Mitchell(int chapter) {
 		CONS_Mitchell_StartPart5(0, 0, 0, 0);
 		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -63,8 +63,13 @@ void LogicManager::CONS_Mitchell_Birth(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Mitchell_Birth(HAND_PARAMS) {
-	if (msg->action == 12)
+	switch (msg->action) {
+	case 12:
 		CONS_Mitchell_OhBabyBaby(0, 0, 0, 0);
+		break;
+	default:
+		break;
+	}
 }
 
 void LogicManager::CONS_Mitchell_StartPart2(CONS_PARAMS) {
@@ -78,8 +83,13 @@ void LogicManager::CONS_Mitchell_StartPart2(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Mitchell_StartPart2(HAND_PARAMS) {
-	if (msg->action == 12)
+	switch (msg->action) {
+	case 12:
 		CONS_Mitchell_OhBabyBaby(0, 0, 0, 0);
+		break;
+	default:
+		break;
+	}
 }
 
 void LogicManager::CONS_Mitchell_StartPart3(CONS_PARAMS) {
@@ -93,8 +103,13 @@ void LogicManager::CONS_Mitchell_StartPart3(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Mitchell_StartPart3(HAND_PARAMS) {
-	if (msg->action == 12)
+	switch (msg->action) {
+	case 12:
 		CONS_Mitchell_OhBabyBaby(0, 0, 0, 0);
+		break;
+	default:
+		break;
+	}
 }
 
 void LogicManager::CONS_Mitchell_StartPart4(CONS_PARAMS) {
@@ -108,8 +123,13 @@ void LogicManager::CONS_Mitchell_StartPart4(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Mitchell_StartPart4(HAND_PARAMS) {
-	if (msg->action == 12)
+	switch (msg->action) {
+	case 12:
 		CONS_Mitchell_OhBabyBaby(0, 0, 0, 0);
+		break;
+	default:
+		break;
+	}
 }
 
 void LogicManager::CONS_Mitchell_StartPart5(CONS_PARAMS) {
@@ -123,8 +143,13 @@ void LogicManager::CONS_Mitchell_StartPart5(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Mitchell_StartPart5(HAND_PARAMS) {
-	if (msg->action == 12)
+	switch (msg->action) {
+	case 12:
 		CONS_Mitchell_OhBabyBaby(0, 0, 0, 0);
+		break;
+	default:
+		break;
+	}
 }
 
 void LogicManager::CONS_Mitchell_OhBabyBaby(CONS_PARAMS) {
@@ -145,6 +170,7 @@ void LogicManager::HAND_Mitchell_OhBabyBaby(HAND_PARAMS) {
 			_mitchellFlag = true;
 			startSeqOtis(kCharacterMitchell, _mitchellSequence.c_str());
 		}
+
 		break;
 	case 3:
 		startSeqOtis(kCharacterMitchell, _mitchellSequence.c_str());


Commit: 52cf72d4e94cfbcdb41fb7a77dec4281fcd2eaa9
    https://github.com/scummvm/scummvm/commit/52cf72d4e94cfbcdb41fb7a77dec4281fcd2eaa9
Author: AndywinXp (andywinxp at gmail.com)
Date: 2025-06-16T23:12:18+02:00

Commit Message:
LASTEXPRESS: Clean up Cook logic

Changed paths:
    engines/lastexpress/characters/cook.cpp


diff --git a/engines/lastexpress/characters/cook.cpp b/engines/lastexpress/characters/cook.cpp
index 90c43e4b2bc..661a8bedf11 100644
--- a/engines/lastexpress/characters/cook.cpp
+++ b/engines/lastexpress/characters/cook.cpp
@@ -48,7 +48,7 @@ void LogicManager::CONS_Cook(int chapter) {
 		CONS_Cook_StartPart5(0, 0, 0, 0);
 		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -71,12 +71,17 @@ void LogicManager::CONS_Cook_DoSeqOtis(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Cook_DoSeqOtis(HAND_PARAMS) {
-	if (msg->action == 3) {
+	switch (msg->action) {
+	case 3:
 		getCharacter(kCharacterCook).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterCook, _functionsAbbot[getCharacter(kCharacterCook).callbacks[getCharacter(kCharacterCook).currentCall]]);
 		fedEx(kCharacterCook, kCharacterCook, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		startSeqOtis(kCharacterCook, (char *)&getCharacterCurrentParams(kCharacterCook)[0]);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -93,12 +98,17 @@ void LogicManager::CONS_Cook_DoDialog(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Cook_DoDialog(HAND_PARAMS) {
-	if (msg->action == 2) {
+	switch (msg->action) {
+	case 2:
 		getCharacter(kCharacterCook).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterCook, _functionsAbbot[getCharacter(kCharacterCook).callbacks[getCharacter(kCharacterCook).currentCall]]);
 		fedEx(kCharacterCook, kCharacterCook, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		playDialog(kCharacterCook, (char *)&getCharacterCurrentParams(kCharacterCook)[0], -1, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -113,7 +123,8 @@ void LogicManager::CONS_Cook_UptrainVersion(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Cook_UptrainVersion(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		startCycOtis(kCharacterCook, "308A");
 		blockView(kCharacterCook, kCarRestaurant, 75);
 		blockView(kCharacterCook, kCarRestaurant, 78);
@@ -128,7 +139,9 @@ void LogicManager::HAND_Cook_UptrainVersion(HAND_PARAMS) {
 			getCharacter(kCharacterCook).callbacks[getCharacter(kCharacterCook).currentCall + 8] = 3;
 			CookCall(&LogicManager::CONS_Cook_DoSeqOtis, "308B", 0, 0, 0);
 		}
-	} else if (msg->action == 17) {
+
+		break;
+	case 17:
 		if (!inKitchen(kCharacterCath)) {
 			endGraphics(kCharacterCook);
 			getCharacter(kCharacterCook).currentCall--;
@@ -147,7 +160,7 @@ void LogicManager::HAND_Cook_UptrainVersion(HAND_PARAMS) {
 							fedEx(kCharacterCook, kCharacterCook, 18, 0);
 						}
 
-						return;
+						break;
 					}
 
 					playDialog(kCharacterCook, "KIT1011A", -1, 0);
@@ -165,7 +178,9 @@ void LogicManager::HAND_Cook_UptrainVersion(HAND_PARAMS) {
 				}
 			}
 		}
-	} else if (msg->action == 18) {
+
+		break;
+	case 18:
 		if (getCharacter(kCharacterCook).callbacks[getCharacter(kCharacterCook).currentCall + 8]) {
 			if (getCharacter(kCharacterCook).callbacks[getCharacter(kCharacterCook).currentCall + 8] > 2) {
 				if (getCharacter(kCharacterCook).callbacks[getCharacter(kCharacterCook).currentCall + 8] == 3) {
@@ -179,6 +194,10 @@ void LogicManager::HAND_Cook_UptrainVersion(HAND_PARAMS) {
 				CookCall(&LogicManager::CONS_Cook_DoSeqOtis, "308B", 0, 0, 0);
 			}
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -193,7 +212,8 @@ void LogicManager::CONS_Cook_DowntrainVersion(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Cook_DowntrainVersion(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		startCycOtis(kCharacterCook, "308A");
 		blockView(kCharacterCook, kCarRestaurant, 75);
 		blockView(kCharacterCook, kCarRestaurant, 78);
@@ -209,13 +229,14 @@ void LogicManager::HAND_Cook_DowntrainVersion(HAND_PARAMS) {
 			getCharacter(kCharacterCook).callbacks[getCharacter(kCharacterCook).currentCall + 8] = 3;
 			CookCall(&LogicManager::CONS_Cook_DoSeqOtis, "308B", 0, 0, 0);
 		}
-	} else if (msg->action == 17) {
+
+		break;
+	case 17:
 		if (!inKitchen(kCharacterCath)) {
 			endGraphics(kCharacterCath);
 			getCharacter(kCharacterCook).currentCall--;
 			_engine->getMessageManager()->setMessageHandle(8, _functionsCook[getCharacter(kCharacterCook).callbacks[getCharacter(kCharacterCook).currentCall]]);
 			fedEx(kCharacterCook, kCharacterCook, 18, 0);
-			return;
 		} else {
 			if (checkCathDir(kCarRestaurant, 80)) {
 				startCycOtis(kCharacterCook, "308D");
@@ -229,7 +250,7 @@ void LogicManager::HAND_Cook_DowntrainVersion(HAND_PARAMS) {
 							fedEx(kCharacterCook, kCharacterCook, 18, 0);
 						}
 
-						return;
+						break;
 					}
 
 					playDialog(kCharacterCook, "KIT1011A", -1, 0);
@@ -247,7 +268,9 @@ void LogicManager::HAND_Cook_DowntrainVersion(HAND_PARAMS) {
 				}
 			}
 		}
-	} else if (msg->action == 18) {
+
+		break;
+	case 18:
 		if (getCharacter(kCharacterCook).callbacks[getCharacter(kCharacterCook).currentCall + 8]) {
 			if (getCharacter(kCharacterCook).callbacks[getCharacter(kCharacterCook).currentCall + 8] > 2) {
 				if (getCharacter(kCharacterCook).callbacks[getCharacter(kCharacterCook).currentCall + 8] == 3) {
@@ -261,6 +284,10 @@ void LogicManager::HAND_Cook_DowntrainVersion(HAND_PARAMS) {
 				CookCall(&LogicManager::CONS_Cook_DoSeqOtis, "308B", 0, 0, 0);
 			}
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -275,16 +302,22 @@ void LogicManager::CONS_Cook_Birth(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Cook_Birth(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		if (_gameTime > 1062000 && !getCharacterCurrentParams(kCharacterCook)[0]) {
 			getCharacterCurrentParams(kCharacterCook)[0] = 1;
 			CONS_Cook_InKitchenDinner(0, 0, 0, 0);
 		}
-	} else if (msg->action == 12) {
+
+		break;
+	case 12:
 		getCharacter(kCharacterCook).characterPosition.car = kCarRestaurant;
 		getCharacter(kCharacterCook).characterPosition.position = 5900;
 		getCharacter(kCharacterCook).characterPosition.location = 0;
 		_gameProgress[kProgressField4C] = 0;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -330,6 +363,7 @@ void LogicManager::HAND_Cook_InKitchenDinner(HAND_PARAMS) {
 				CookCall(&LogicManager::CONS_Cook_DoDialog, "ZFX1012", 0, 0, 0);
 			}
 		}
+
 		break;
 	case 18:
 		if (getCharacter(kCharacterCook).callbacks[getCharacter(kCharacterCook).currentCall + 8] == 1) {
@@ -337,6 +371,7 @@ void LogicManager::HAND_Cook_InKitchenDinner(HAND_PARAMS) {
 		} else if (getCharacter(kCharacterCook).callbacks[getCharacter(kCharacterCook).currentCall + 8] >= 2 && getCharacter(kCharacterCook).callbacks[getCharacter(kCharacterCook).currentCall + 8] <= 3) {
 			getCharacterCurrentParams(kCharacterCook)[2] = getCharacterCurrentParams(kCharacterCook)[2] == 0;
 		}
+
 		break;
 	case 101632192:
 		CONS_Cook_LockUp(0, 0, 0, 0);
@@ -361,14 +396,19 @@ void LogicManager::CONS_Cook_LockUp(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Cook_LockUp(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		getCharacter(kCharacterCook).callbacks[getCharacter(kCharacterCook).currentCall + 8] = 1;
 		CookCall(&LogicManager::CONS_Cook_DoDialog, "WAT1200", 0, 0, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		getCharacter(kCharacterCook).characterPosition.car = kCarRestaurant;
 		getCharacter(kCharacterCook).characterPosition.position = 3650;
 		getCharacter(kCharacterCook).characterPosition.location = 0;
 		endGraphics(kCharacterCook);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -383,15 +423,20 @@ void LogicManager::CONS_Cook_StartPart2(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Cook_StartPart2(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		CONS_Cook_InKitchenBreakfast(0, 0, 0, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		endGraphics(kCharacterCook);
 		getCharacter(kCharacterCook).characterPosition.car = kCarRestaurant;
 		getCharacter(kCharacterCook).characterPosition.position = 5900;
 		getCharacter(kCharacterCook).characterPosition.location = 0;
 		getCharacter(kCharacterCook).inventoryItem = kItemNone;
 		_gameProgress[kProgressField4C] = 1;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -406,43 +451,41 @@ void LogicManager::CONS_Cook_InKitchenBreakfast(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Cook_InKitchenBreakfast(HAND_PARAMS) {
-	if (msg->action <= 18) {
-		switch (msg->action) {
-		case 0:
-			if (getCharacterCurrentParams(kCharacterCook)[2] || (getCharacterCurrentParams(kCharacterCook)[2] = _gameTime + getCharacterCurrentParams(kCharacterCook)[0], _gameTime + getCharacterCurrentParams(kCharacterCook)[0] != 0)) {
-				if (getCharacterCurrentParams(kCharacterCook)[2] >= _gameTime)
-					return;
-
-				getCharacterCurrentParams(kCharacterCook)[2] = 0x7FFFFFFF;
-			}
+	switch (msg->action) {
+	case 0:
+		if (getCharacterCurrentParams(kCharacterCook)[2] || (getCharacterCurrentParams(kCharacterCook)[2] = _gameTime + getCharacterCurrentParams(kCharacterCook)[0], _gameTime + getCharacterCurrentParams(kCharacterCook)[0] != 0)) {
+			if (getCharacterCurrentParams(kCharacterCook)[2] >= _gameTime)
+				break;
 
-			playDialog(0, "LIB122", getVolume(kCharacterCook), 0);
-			getCharacterCurrentParams(kCharacterCook)[0] = 225 * (4 * rnd(30) + 120);
-			getCharacterCurrentParams(kCharacterCook)[2] = 0;
-			break;
-		case 12:
-			getCharacterCurrentParams(kCharacterCook)[0] = 225 * (4 * rnd(30) + 120);
-			break;
-		case 17:
-			if (inKitchen(kCharacterCath)) {
-				if (getCharacterCurrentParams(kCharacterCook)[1]) {
-					getCharacter(kCharacterCook).callbacks[getCharacter(kCharacterCook).currentCall + 8] = 1;
-					CookCall(&LogicManager::CONS_Cook_DoDialog, "ZFX1011", 0, 0, 0);
-				} else {
-					getCharacter(kCharacterCook).callbacks[getCharacter(kCharacterCook).currentCall + 8] = 2;
-					CookCall(&LogicManager::CONS_Cook_DoDialog, "ZFX1012", 0, 0, 0);
-				}
+			getCharacterCurrentParams(kCharacterCook)[2] = 0x7FFFFFFF;
+		}
+
+		playDialog(0, "LIB122", getVolume(kCharacterCook), 0);
+		getCharacterCurrentParams(kCharacterCook)[0] = 225 * (4 * rnd(30) + 120);
+		getCharacterCurrentParams(kCharacterCook)[2] = 0;
+		break;
+	case 12:
+		getCharacterCurrentParams(kCharacterCook)[0] = 225 * (4 * rnd(30) + 120);
+		break;
+	case 17:
+		if (inKitchen(kCharacterCath)) {
+			if (getCharacterCurrentParams(kCharacterCook)[1]) {
+				getCharacter(kCharacterCook).callbacks[getCharacter(kCharacterCook).currentCall + 8] = 1;
+				CookCall(&LogicManager::CONS_Cook_DoDialog, "ZFX1011", 0, 0, 0);
+			} else {
+				getCharacter(kCharacterCook).callbacks[getCharacter(kCharacterCook).currentCall + 8] = 2;
+				CookCall(&LogicManager::CONS_Cook_DoDialog, "ZFX1012", 0, 0, 0);
 			}
+		}
 
-			break;
-		case 18:
-			if (getCharacter(kCharacterCook).callbacks[getCharacter(kCharacterCook).currentCall + 8] && getCharacter(kCharacterCook).callbacks[getCharacter(kCharacterCook).currentCall + 8] <= 2)
-				getCharacterCurrentParams(kCharacterCook)[1] = getCharacterCurrentParams(kCharacterCook)[1] == 0;
+		break;
+	case 18:
+		if (getCharacter(kCharacterCook).callbacks[getCharacter(kCharacterCook).currentCall + 8] && getCharacter(kCharacterCook).callbacks[getCharacter(kCharacterCook).currentCall + 8] <= 2)
+			getCharacterCurrentParams(kCharacterCook)[1] = getCharacterCurrentParams(kCharacterCook)[1] == 0;
 
-			break;
-		default:
-			return;
-		}
+		break;
+	default:
+		break;
 	}
 }
 
@@ -457,13 +500,18 @@ void LogicManager::CONS_Cook_StartPart3(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Cook_StartPart3(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		CONS_Cook_InKitchenLunch(0, 0, 0, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		endGraphics(kCharacterCook);
 		getCharacter(kCharacterCook).characterPosition.car = kCarRestaurant;
 		getCharacter(kCharacterCook).characterPosition.position = 5900;
 		_gameProgress[kProgressField4C] = 0;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -487,7 +535,7 @@ void LogicManager::HAND_Cook_InKitchenLunch(HAND_PARAMS) {
 					getCharacterCurrentParams(kCharacterCook)[0] = 0;
 				}
 
-				return;
+				break;
 			}
 
 			getCharacterCurrentParams(kCharacterCook)[3] = 0x7FFFFFFF;
@@ -551,15 +599,20 @@ void LogicManager::CONS_Cook_StartPart4(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Cook_StartPart4(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		CONS_Cook_InKitchenDinner2(0, 0, 0, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		endGraphics(kCharacterCook);
 		getCharacter(kCharacterCook).characterPosition.car = kCarRestaurant;
 		getCharacter(kCharacterCook).characterPosition.position = 5900;
 		getCharacter(kCharacterCook).characterPosition.location = 0;
 		getCharacter(kCharacterCook).inventoryItem = kItemNone;
 		_gameProgress[kProgressField4C] = 1;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -578,7 +631,7 @@ void LogicManager::HAND_Cook_InKitchenDinner2(HAND_PARAMS) {
 	case 0:
 		if (getCharacterCurrentParams(kCharacterCook)[2] || (getCharacterCurrentParams(kCharacterCook)[2] = _gameTime + getCharacterCurrentParams(kCharacterCook)[0], _gameTime + getCharacterCurrentParams(kCharacterCook)[0] != 0)) {
 			if (getCharacterCurrentParams(kCharacterCook)[2] >= _gameTime)
-				return;
+				break;
 
 			getCharacterCurrentParams(kCharacterCook)[2] = 0x7FFFFFFF;
 		}
@@ -623,8 +676,13 @@ void LogicManager::CONS_Cook_StartPart5(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Cook_StartPart5(HAND_PARAMS) {
-	if (msg->action == 12)
+	switch (msg->action) {
+	case 12:
 		endGraphics(kCharacterCook);
+		break;
+	default:
+		break;
+	}
 }
 
 void (LogicManager::*LogicManager::_functionsCook[])(HAND_PARAMS) = {


Commit: 00c39cabf245647465c35090ab348118992e6a7b
    https://github.com/scummvm/scummvm/commit/00c39cabf245647465c35090ab348118992e6a7b
Author: AndywinXp (andywinxp at gmail.com)
Date: 2025-06-16T23:12:18+02:00

Commit Message:
LASTEXPRESS: Clean up Monsieur logic

Changed paths:
    engines/lastexpress/characters/monsieur.cpp


diff --git a/engines/lastexpress/characters/monsieur.cpp b/engines/lastexpress/characters/monsieur.cpp
index d57d41d49ed..fbafb29faf4 100644
--- a/engines/lastexpress/characters/monsieur.cpp
+++ b/engines/lastexpress/characters/monsieur.cpp
@@ -48,7 +48,7 @@ void LogicManager::CONS_Monsieur(int chapter) {
 		CONS_Monsieur_StartPart5(0, 0, 0, 0);
 		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -69,19 +69,25 @@ void LogicManager::CONS_Monsieur_DebugWalks(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Monsieur_DebugWalks(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			getCharacter(kCharacterMonsieur).characterPosition.position = 0;
-			getCharacter(kCharacterMonsieur).characterPosition.location = 0;
-			getCharacter(kCharacterMonsieur).characterPosition.car = kCarGreenSleeping;
-			getCharacterCurrentParams(kCharacterMonsieur)[0] = 10000;
-		}
-	} else if (walk(kCharacterMonsieur, kCarGreenSleeping, getCharacterCurrentParams(kCharacterMonsieur)[0])) {
-		if (getCharacterCurrentParams(kCharacterMonsieur)[0] == 10000) {
-			getCharacterCurrentParams(kCharacterMonsieur)[0] = 0;
-		} else {
-			getCharacterCurrentParams(kCharacterMonsieur)[0] = 10000;
+	switch (msg->action) {
+	case 0:
+		if (walk(kCharacterMonsieur, kCarGreenSleeping, getCharacterCurrentParams(kCharacterMonsieur)[0])) {
+			if (getCharacterCurrentParams(kCharacterMonsieur)[0] == 10000) {
+				getCharacterCurrentParams(kCharacterMonsieur)[0] = 0;
+			} else {
+				getCharacterCurrentParams(kCharacterMonsieur)[0] = 10000;
+			}
 		}
+
+		break;
+	case 12:
+		getCharacter(kCharacterMonsieur).characterPosition.position = 0;
+		getCharacter(kCharacterMonsieur).characterPosition.location = 0;
+		getCharacter(kCharacterMonsieur).characterPosition.car = kCarGreenSleeping;
+		getCharacterCurrentParams(kCharacterMonsieur)[0] = 10000;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -98,12 +104,17 @@ void LogicManager::CONS_Monsieur_DoDialog(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Monsieur_DoDialog(HAND_PARAMS) {
-	if (msg->action == 2) {
+	switch (msg->action) {
+	case 2:
 		getCharacter(kCharacterMonsieur).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterMonsieur, _functionsMonsieur[getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall]]);
 		fedEx(kCharacterMonsieur, kCharacterMonsieur, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		playDialog(kCharacterMonsieur, (char *)&getCharacterCurrentParams(kCharacterMonsieur)[0], -1, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -120,12 +131,17 @@ void LogicManager::CONS_Monsieur_DoSeqOtis(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Monsieur_DoSeqOtis(HAND_PARAMS) {
-	if (msg->action == 3) {
+	switch (msg->action) {
+	case 3:
 		getCharacter(kCharacterMonsieur).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterMonsieur, _functionsMonsieur[getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall]]);
 		fedEx(kCharacterMonsieur, kCharacterMonsieur, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		startSeqOtis(kCharacterMonsieur, (char *)&getCharacterCurrentParams(kCharacterMonsieur)[0]);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -142,10 +158,11 @@ void LogicManager::CONS_Monsieur_DoWait(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Monsieur_DoWait(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		if (getCharacterCurrentParams(kCharacterMonsieur)[1] || (getCharacterCurrentParams(kCharacterMonsieur)[1] = _gameTime + getCharacterCurrentParams(kCharacterMonsieur)[0], _gameTime + getCharacterCurrentParams(kCharacterMonsieur)[0] != 0)) {
 			if (getCharacterCurrentParams(kCharacterMonsieur)[1] >= _gameTime)
-				return;
+				break;
 
 			getCharacterCurrentParams(kCharacterMonsieur)[1] = 0x7FFFFFFF;
 		}
@@ -153,6 +170,9 @@ void LogicManager::HAND_Monsieur_DoWait(HAND_PARAMS) {
 		getCharacter(kCharacterMonsieur).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterMonsieur, _functionsMonsieur[getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall]]);
 		fedEx(kCharacterMonsieur, kCharacterMonsieur, 18, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -172,15 +192,20 @@ void LogicManager::CONS_Monsieur_DoBlockSeqOtis(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Monsieur_DoBlockSeqOtis(HAND_PARAMS) {
-	if (msg->action == 3) {
+	switch (msg->action) {
+	case 3:
 		releaseView(kCharacterMonsieur, getCharacterCurrentParams(kCharacterMonsieur)[3], getCharacterCurrentParams(kCharacterMonsieur)[4]);
 
 		getCharacter(kCharacterMonsieur).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterMonsieur, _functionsMonsieur[getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall]]);
 		fedEx(kCharacterMonsieur, kCharacterMonsieur, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		startSeqOtis(kCharacterMonsieur, (char *)&getCharacterCurrentParams(kCharacterMonsieur)[0]);
 		blockView(kCharacterMonsieur, getCharacterCurrentParams(kCharacterMonsieur)[3], getCharacterCurrentParams(kCharacterMonsieur)[4]);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -199,15 +224,20 @@ void LogicManager::CONS_Monsieur_DoCorrOtis(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Monsieur_DoCorrOtis(HAND_PARAMS) {
-	if (msg->action == 3) {
+	switch (msg->action) {
+	case 3:
 		releaseAtDoor(kCharacterMonsieur, getCharacterCurrentParams(kCharacterMonsieur)[3]);
 
 		getCharacter(kCharacterMonsieur).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterMonsieur, _functionsMonsieur[getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall]]);
 		fedEx(kCharacterMonsieur, kCharacterMonsieur, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		startSeqOtis(kCharacterMonsieur, (char *)&getCharacterCurrentParams(kCharacterMonsieur)[0]);
 		blockAtDoor(kCharacterMonsieur, getCharacterCurrentParams(kCharacterMonsieur)[3]);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -226,14 +256,16 @@ void LogicManager::CONS_Monsieur_DoEnterCorrOtis(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Monsieur_DoEnterCorrOtis(HAND_PARAMS) {
-	if (msg->action == 3) {
+	switch (msg->action) {
+	case 3:
 		releaseAtDoor(kCharacterMonsieur, getCharacterCurrentParams(kCharacterMonsieur)[3]);
 		getCharacter(kCharacterMonsieur).characterPosition.position = 6470;
 
 		getCharacter(kCharacterMonsieur).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterMonsieur, _functionsMonsieur[getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall]]);
 		fedEx(kCharacterMonsieur, kCharacterMonsieur, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		startSeqOtis(kCharacterMonsieur, (char *)&getCharacterCurrentParams(kCharacterMonsieur)[0]);
 		blockAtDoor(kCharacterMonsieur, getCharacterCurrentParams(kCharacterMonsieur)[3]);
 		getCharacter(kCharacterMonsieur).characterPosition.location = 1;
@@ -242,6 +274,10 @@ void LogicManager::HAND_Monsieur_DoEnterCorrOtis(HAND_PARAMS) {
 			playDialog(0, "BUMP", -1, 0);
 			bumpCathFDoor(34);
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -256,16 +292,22 @@ void LogicManager::CONS_Monsieur_FinishSeqOtis(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Monsieur_FinishSeqOtis(HAND_PARAMS) {
-	if (msg->action == 0) {
-		if (getCharacter(kCharacterMonsieur).direction == 4)
-			return;
-		goto LABEL_5;
-	}
-	if (msg->action == 3) {
-	LABEL_5:
+	switch (msg->action) {
+	case 0:
+		if (getCharacter(kCharacterMonsieur).direction == 4) {
+			getCharacter(kCharacterMonsieur).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterMonsieur, _functionsMonsieur[getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall]]);
+			fedEx(kCharacterMonsieur, kCharacterMonsieur, 18, 0);
+		}
+
+		break;
+	case 3:
 		getCharacter(kCharacterMonsieur).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterMonsieur, _functionsMonsieur[getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall]]);
 		fedEx(kCharacterMonsieur, kCharacterMonsieur, 18, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -280,16 +322,18 @@ void LogicManager::CONS_Monsieur_WaitRCClear(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Monsieur_WaitRCClear(HAND_PARAMS) {
-	if (msg->action == 0) {
-		if (!rcClear())
-			return;
-		goto LABEL_7;
-	}
-	if (msg->action == 12 && rcClear()) {
-	LABEL_7:
-		getCharacter(kCharacterMonsieur).currentCall--;
-		_engine->getMessageManager()->setMessageHandle(kCharacterMonsieur, _functionsMonsieur[getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall]]);
-		fedEx(kCharacterMonsieur, kCharacterMonsieur, 18, 0);
+	switch (msg->action) {
+	case 0:
+	case 12:
+		if (rcClear()) {
+			getCharacter(kCharacterMonsieur).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterMonsieur, _functionsMonsieur[getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall]]);
+			fedEx(kCharacterMonsieur, kCharacterMonsieur, 18, 0);
+		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -309,28 +353,28 @@ void LogicManager::CONS_Monsieur_DoWalk(CONS_PARAMS) {
 void LogicManager::HAND_Monsieur_DoWalk(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
-		if (walk(kCharacterMonsieur, getCharacterCurrentParams(kCharacterMonsieur)[0], getCharacterCurrentParams(kCharacterMonsieur)[1]))
-			goto LABEL_11;
+	case 12:
+		if (walk(kCharacterMonsieur, getCharacterCurrentParams(kCharacterMonsieur)[0], getCharacterCurrentParams(kCharacterMonsieur)[1])) {
+			getCharacter(kCharacterMonsieur).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterMonsieur, _functionsMonsieur[getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall]]);
+			fedEx(kCharacterMonsieur, kCharacterMonsieur, 18, 0);
+		}
+
 		break;
 	case 5:
-		if (cathHasItem(kItemPassengerList) && _gameTime > 0x109DE8)
+		if (cathHasItem(kItemPassengerList) && _gameTime > 1089000) {
 			playDialog(kCharacterCath, "CAT1022", -1, 0);
-		else
+		} else {
 			playCathExcuseMe();
+		}
+
 		break;
 	case 6:
 		playChrExcuseMe(kCharacterMonsieur, kCharacterCath, 0);
 		break;
-	case 12:
-		if (walk(kCharacterMonsieur, getCharacterCurrentParams(kCharacterMonsieur)[0], getCharacterCurrentParams(kCharacterMonsieur)[1])) {
-		LABEL_11:
-			getCharacter(kCharacterMonsieur).currentCall--;
-			_engine->getMessageManager()->setMessageHandle(kCharacterMonsieur, _functionsMonsieur[getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall]]);
-			fedEx(kCharacterMonsieur, kCharacterMonsieur, 18, 0);
-		}
-		break;
+	
 	default:
-		return;
+		break;
 	}
 }
 
@@ -347,73 +391,83 @@ void LogicManager::CONS_Monsieur_GoDining(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Monsieur_GoDining(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			if (getCharacter(kCharacterMonsieur).callParams[getCharacter(kCharacterMonsieur).currentCall].parameters[0]) {
-				if (_gameProgress[kProgressChapter] == 4) {
-					setDoor(34, kCharacterCath, 0, 10, 9);
-					getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8] = 1;
-					MonsieurCall(&LogicManager::CONS_Monsieur_DoCorrOtis, "607Hc", 0x22, 0, 0);
-				} else {
-					setDoor(34, kCharacterCath, 1, 255, 255);
-					getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8] = 2;
-					MonsieurCall(&LogicManager::CONS_Monsieur_DoCorrOtis, "607Dc", 0x22, 0, 0);
-				}
+	switch (msg->action) {
+	case 0:
+		if (getCharacterParams(kCharacterMonsieur, 8)[0] && getCharacterParams(kCharacterMonsieur, 8)[1]) {
+			getCharacterParams(kCharacterMonsieur, 8)[1] = 0;
+			getCharacterParams(kCharacterMonsieur, 8)[0] = 0;
+			getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8] = 5;
+			MonsieurCall(&LogicManager::CONS_Monsieur_WaitRCClear, 0, 0, 0, 0);
+		}
+
+		break;
+	case 12:
+		if (getCharacterCurrentParams(kCharacterMonsieur)[0]) {
+			if (_gameProgress[kProgressChapter] == 4) {
+				setDoor(34, kCharacterCath, 0, 10, 9);
+				getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8] = 1;
+				MonsieurCall(&LogicManager::CONS_Monsieur_DoCorrOtis, "607Hc", 34, 0, 0);
 			} else {
-				getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8] = 3;
-				MonsieurCall(&LogicManager::CONS_Monsieur_DoCorrOtis, "607Bc", 0x22, 0, 0);
+				setDoor(34, kCharacterCath, 1, 255, 255);
+				getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8] = 2;
+				MonsieurCall(&LogicManager::CONS_Monsieur_DoCorrOtis, "607Dc", 34, 0, 0);
 			}
-		} else if (msg->action == 18) {
-			switch (getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8]) {
-			case 1:
-				goto LABEL_15;
-			case 2:
+		} else {
+			getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8] = 3;
+			MonsieurCall(&LogicManager::CONS_Monsieur_DoCorrOtis, "607Bc", 34, 0, 0);
+		}
+
+		break;
+	case 18:
+		switch (getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8]) {
+		case 1:
+		case 2:
+		case 3:
+			if (getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8] == 2) {
 				setDoor(34, kCharacterCath, 2, 255, 255);
-				goto LABEL_15;
-			case 3:
+			} else if (getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8] == 3) {
 				setDoor(34, kCharacterCath, 0, 10, 9);
-			LABEL_15:
-				setDoor(50, kCharacterCath, 0, 10, 9);
-				getCharacter(kCharacterMonsieur).characterPosition.location = 0;
-				send(kCharacterMonsieur, kCharacterFrancois, 101107728, 0);
-				getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8] = 4;
-				MonsieurCall(&LogicManager::CONS_Monsieur_DoWalk, 5, 0x352, 0, 0);
-				break;
-			case 4:
-				endGraphics(kCharacterMonsieur);
-				break;
-			case 5:
-				getCharacter(kCharacterMonsieur).characterPosition.position = 1540;
-				getCharacter(kCharacterMonsieur).characterPosition.location = 0;
-				getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8] = 6;
-				MonsieurCall(&LogicManager::CONS_Monsieur_DoSeqOtis, "812US", 0, 0, 0);
-				break;
-			case 6:
-				if (_gameProgress[kProgressChapter] == 1) {
-					playDialog(kCharacterMonsieur, "MRB1075", -1, 60);
-				} else if (_gameProgress[kProgressChapter] == 3) {
-					playDialog(kCharacterMonsieur, "MRB3101", -1, 0);
-				}
-
-				getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8] = 7;
-				MonsieurCall(&LogicManager::CONS_Monsieur_DoOtis5008A, 0, 0, 0, 0);
-				break;
-			case 7:
-				getCharacter(kCharacterMonsieur).characterPosition.location = 1;
+			}
 
-				getCharacter(kCharacterMonsieur).currentCall--;
-				_engine->getMessageManager()->setMessageHandle(kCharacterMonsieur, _functionsMonsieur[getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall]]);
-				fedEx(kCharacterMonsieur, kCharacterMonsieur, 18, 0);
-				break;
-			default:
-				return;
+			setDoor(50, kCharacterCath, 0, 10, 9);
+			getCharacter(kCharacterMonsieur).characterPosition.location = 0;
+			send(kCharacterMonsieur, kCharacterFrancois, 101107728, 0);
+			getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8] = 4;
+			MonsieurCall(&LogicManager::CONS_Monsieur_DoWalk, 5, 0x352, 0, 0);
+			break;
+		case 4:
+			endGraphics(kCharacterMonsieur);
+			break;
+		case 5:
+			getCharacter(kCharacterMonsieur).characterPosition.position = 1540;
+			getCharacter(kCharacterMonsieur).characterPosition.location = 0;
+			getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8] = 6;
+			MonsieurCall(&LogicManager::CONS_Monsieur_DoSeqOtis, "812US", 0, 0, 0);
+			break;
+		case 6:
+			if (_gameProgress[kProgressChapter] == 1) {
+				playDialog(kCharacterMonsieur, "MRB1075", -1, 60);
+			} else if (_gameProgress[kProgressChapter] == 3) {
+				playDialog(kCharacterMonsieur, "MRB3101", -1, 0);
 			}
+
+			getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8] = 7;
+			MonsieurCall(&LogicManager::CONS_Monsieur_DoOtis5008A, 0, 0, 0, 0);
+			break;
+		case 7:
+			getCharacter(kCharacterMonsieur).characterPosition.location = 1;
+
+			getCharacter(kCharacterMonsieur).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterMonsieur, _functionsMonsieur[getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall]]);
+			fedEx(kCharacterMonsieur, kCharacterMonsieur, 18, 0);
+			break;
+		default:
+			break;
 		}
-	} else if (getCharacter(kCharacterMonsieur).callParams[8].parameters[0] && getCharacter(kCharacterMonsieur).callParams[8].parameters[1]) {
-		getCharacter(kCharacterMonsieur).callParams[8].parameters[1] = 0;
-		getCharacter(kCharacterMonsieur).callParams[8].parameters[0] = 0;
-		getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8] = 5;
-		MonsieurCall(&LogicManager::CONS_Monsieur_WaitRCClear, 0, 0, 0, 0);
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -428,7 +482,8 @@ void LogicManager::CONS_Monsieur_DoOtis5008A(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Monsieur_DoOtis5008A(HAND_PARAMS) {
-	if (msg->action == 3) {
+	switch (msg->action) {
+	case 3:
 		endGraphics(kCharacterMadame);
 		send(kCharacterMonsieur, kCharacterTableC, 136455232, 0);
 		getCharacter(kCharacterMonsieur).characterPosition.location = 1;
@@ -436,7 +491,8 @@ void LogicManager::HAND_Monsieur_DoOtis5008A(HAND_PARAMS) {
 		getCharacter(kCharacterMonsieur).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterMonsieur, _functionsMonsieur[getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall]]);
 		fedEx(kCharacterMonsieur, kCharacterMonsieur, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		startSeqOtis(kCharacterTableC, "008A3");
 		startSeqOtis(kCharacterMadame, "008A2");
 		startSeqOtis(kCharacterMonsieur, "008A1");
@@ -445,6 +501,10 @@ void LogicManager::HAND_Monsieur_DoOtis5008A(HAND_PARAMS) {
 			getCharacter(kCharacterMadame).elapsedFrames = getCharacter(kCharacterMonsieur).elapsedFrames;
 			getCharacter(kCharacterTableC).elapsedFrames = getCharacter(kCharacterMonsieur).elapsedFrames;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -459,17 +519,22 @@ void LogicManager::CONS_Monsieur_DoOtis5008E(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Monsieur_DoOtis5008E(HAND_PARAMS) {
-	if (msg->action == 3) {
+	switch (msg->action) {
+	case 3:
 		send(kCharacterMonsieur, kCharacterTableC, 103798704, "008F");
 		endGraphics(kCharacterMadame);
 
 		getCharacter(kCharacterMonsieur).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterMonsieur, _functionsMonsieur[getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall]]);
 		fedEx(kCharacterMonsieur, kCharacterMonsieur, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		startSeqOtis(kCharacterTableC, "008E3");
 		startSeqOtis(kCharacterMadame, "008E2");
 		startSeqOtis(kCharacterMonsieur, "008E1");
+		break;
+	default:
+		break;
 	}
 }
 
@@ -486,10 +551,12 @@ void LogicManager::CONS_Monsieur_ExitDining(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Monsieur_ExitDining(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8] = 1;
 		MonsieurCall(&LogicManager::CONS_Monsieur_WaitRCClear, 0, 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8]) {
 		case 1:
 			getCharacter(kCharacterMonsieur).characterPosition.location = 0;
@@ -526,13 +593,14 @@ void LogicManager::HAND_Monsieur_ExitDining(HAND_PARAMS) {
 			MonsieurCall(&LogicManager::CONS_Monsieur_DoWalk, 4, 6470, 0, 0);
 			break;
 		case 6:
-			if (getCharacter(kCharacterMonsieur).callParams[getCharacter(kCharacterMonsieur).currentCall].parameters[0]) {
+			if (getCharacterCurrentParams(kCharacterMonsieur)[0]) {
 				getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8] = 7;
 				MonsieurCall(&LogicManager::CONS_Monsieur_DoEnterCorrOtis, "607Gc", 34, 0, 0);
 			} else {
 				getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8] = 8;
 				MonsieurCall(&LogicManager::CONS_Monsieur_DoEnterCorrOtis, "607Ac", 34, 0, 0);
 			}
+
 			break;
 		case 7:
 		case 8:
@@ -544,8 +612,12 @@ void LogicManager::HAND_Monsieur_ExitDining(HAND_PARAMS) {
 			fedEx(kCharacterMonsieur, kCharacterMonsieur, 18, 0);
 			break;
 		default:
-			return;
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -564,7 +636,8 @@ void LogicManager::CONS_Monsieur_GoSalon(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Monsieur_GoSalon(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		if (getCharacterCurrentParams(kCharacterMonsieur)[0]) {
 			setDoor(34, kCharacterCath, 1, 255, 255);
 			getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8] = 1;
@@ -573,14 +646,18 @@ void LogicManager::HAND_Monsieur_GoSalon(HAND_PARAMS) {
 			getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8] = 2;
 			MonsieurCall(&LogicManager::CONS_Monsieur_DoCorrOtis, "607Bc", 34, 0, 0);
 		}
-	} else if (msg->action == 18) {
+
+		break;
+	case 18:
 		switch (getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8]) {
 		case 1:
 			setDoor(34, kCharacterCath, 2, 255, 255);
-			goto LABEL_10;
+			setDoor(50, kCharacterCath, 0, 10, 9);
+			getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8] = 3;
+			MonsieurCall(&LogicManager::CONS_Monsieur_DoWalk, 5, 850, 0, 0);
+			break;
 		case 2:
 			setDoor(34, kCharacterCath, 0, 10, 9);
-		LABEL_10:
 			setDoor(50, kCharacterCath, 0, 10, 9);
 			getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8] = 3;
 			MonsieurCall(&LogicManager::CONS_Monsieur_DoWalk, 5, 850, 0, 0);
@@ -603,8 +680,12 @@ void LogicManager::HAND_Monsieur_GoSalon(HAND_PARAMS) {
 			fedEx(kCharacterMonsieur, kCharacterMonsieur, 18, 0);
 			break;
 		default:
-			return;
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -623,10 +704,12 @@ void LogicManager::CONS_Monsieur_ReturnSalon(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Monsieur_ReturnSalon(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8] = 1;
 		MonsieurCall(&LogicManager::CONS_Monsieur_WaitRCClear, 0, 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8]) {
 		case 1:
 			getCharacter(kCharacterMonsieur).characterPosition.location = 0;
@@ -656,8 +739,12 @@ void LogicManager::HAND_Monsieur_ReturnSalon(HAND_PARAMS) {
 			fedEx(kCharacterMonsieur, kCharacterMonsieur, 18, 0);
 			break;
 		default:
-			return;
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -676,31 +763,38 @@ void LogicManager::CONS_Monsieur_InSalon(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Monsieur_InSalon(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			startCycOtis(kCharacterMonsieur, (char *)&getCharacterCurrentParams(kCharacterMonsieur)[1]);
-		} else if (msg->action == 17) {
-			getCharacterCurrentParams(kCharacterMonsieur)[4] = checkCathDir(kCarRestaurant, 52);
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		if (getCharacterCurrentParams(kCharacterMonsieur)[0] < _gameTime && !getCharacterCurrentParams(kCharacterMonsieur)[5]) {
 			getCharacterCurrentParams(kCharacterMonsieur)[5] = 1;
 
 			getCharacter(kCharacterMonsieur).currentCall--;
 			_engine->getMessageManager()->setMessageHandle(kCharacterMonsieur, _functionsMonsieur[getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall]]);
 			fedEx(kCharacterMonsieur, kCharacterMonsieur, 18, 0);
-			return;
-		}
-		if (getCharacterCurrentParams(kCharacterMonsieur)[4]) {
-			if (getCharacterCurrentParams(kCharacterMonsieur)[6] || (getCharacterCurrentParams(kCharacterMonsieur)[6] = _currentGameSessionTicks + 90, _currentGameSessionTicks != -90)) {
-				if (getCharacterCurrentParams(kCharacterMonsieur)[6] >= _currentGameSessionTicks)
-					return;
-				getCharacterCurrentParams(kCharacterMonsieur)[6] = 0x7FFFFFFF;
-			}
-			bumpCath(kCarRestaurant, 51, 255);
 		} else {
-			getCharacterCurrentParams(kCharacterMonsieur)[6] = 0;
+			if (getCharacterCurrentParams(kCharacterMonsieur)[4]) {
+				if (getCharacterCurrentParams(kCharacterMonsieur)[6] || (getCharacterCurrentParams(kCharacterMonsieur)[6] = _currentGameSessionTicks + 90, _currentGameSessionTicks != -90)) {
+					if (getCharacterCurrentParams(kCharacterMonsieur)[6] >= _currentGameSessionTicks)
+						break;
+
+					getCharacterCurrentParams(kCharacterMonsieur)[6] = 0x7FFFFFFF;
+				}
+
+				bumpCath(kCarRestaurant, 51, 255);
+			} else {
+				getCharacterCurrentParams(kCharacterMonsieur)[6] = 0;
+			}
 		}
+
+		break;
+	case 12:
+		startCycOtis(kCharacterMonsieur, (char *)&getCharacterCurrentParams(kCharacterMonsieur)[1]);
+		break;
+	case 18:
+		getCharacterCurrentParams(kCharacterMonsieur)[4] = checkCathDir(kCarRestaurant, 52);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -717,62 +811,42 @@ void LogicManager::CONS_Monsieur_CompLogic(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Monsieur_CompLogic(HAND_PARAMS) {
-	if (msg->action > 9) {
-		if (msg->action > 17) {
-			switch (msg->action) {
-			case 18:
-				switch (getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8]) {
-				case 1:
-				case 2:
-					getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8] = 3;
-					if (rnd(2) == 0) {
-						MonsieurCall(&LogicManager::CONS_Monsieur_DoDialog, "MRB1001A", 0, 0, 0);
-					} else {
-						MonsieurCall(&LogicManager::CONS_Monsieur_DoDialog, "MRB1001", 0, 0, 0);
-					}
+	switch (msg->action) {
+	case 0:
+		if (getCharacterCurrentParams(kCharacterMonsieur)[0] < _gameTime && !getCharacterCurrentParams(kCharacterMonsieur)[3]) {
+			getCharacterCurrentParams(kCharacterMonsieur)[3] = 1;
+			setDoor(34, kCharacterCath, 0, 10, 9);
+			setDoor(50, kCharacterCath, 0, 10, 9);
 
-					break;
-				case 3:
-					setDoor(34, kCharacterMonsieur, 1, 14, 0);
-					setDoor(50, kCharacterMonsieur, 1, 14, 0);
-					getCharacterCurrentParams(kCharacterMonsieur)[1] = 1;
-					break;
-				case 4:
-				case 5:
-				case 6:
-					getCharacterCurrentParams(kCharacterMonsieur)[1] = 0;
-					getCharacterCurrentParams(kCharacterMonsieur)[2] = 1;
-					break;
-				case 7:
-					send(kCharacterMonsieur, kCharacterCond2, 123199584, 0);
-					break;
-				default:
-					return;
+			getCharacter(kCharacterMonsieur).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterMonsieur, _functionsMonsieur[getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall]]);
+			fedEx(kCharacterMonsieur, kCharacterMonsieur, 18, 0);
+		} else {
+			if (getCharacterCurrentParams(kCharacterMonsieur)[1]) {
+				if (getCharacterCurrentParams(kCharacterMonsieur)[4] || (getCharacterCurrentParams(kCharacterMonsieur)[4] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
+					if (getCharacterCurrentParams(kCharacterMonsieur)[4] >= _currentGameSessionTicks)
+						break;
+
+					getCharacterCurrentParams(kCharacterMonsieur)[4] = 0x7FFFFFFF;
 				}
-				break;
-			case 122865568:
-				send(kCharacterMonsieur, kCharacterCond2, 88652208, 0);
-				break;
-			case 221683008:
-				getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8] = 7;
-				MonsieurCall(&LogicManager::CONS_Monsieur_DoDialog, "Mrb1001", 0, 0, 0);
-				break;
-			}
-		} else if (msg->action == 17) {
-			if (getCharacterCurrentParams(kCharacterMonsieur)[2] || getCharacterCurrentParams(kCharacterMonsieur)[1]) {
-				setDoor(34, kCharacterMonsieur, 1, 10, 9);
-				setDoor(50, kCharacterMonsieur, 1, 10, 9);
-				getCharacterCurrentParams(kCharacterMonsieur)[2] = 0;
+
 				getCharacterCurrentParams(kCharacterMonsieur)[1] = 0;
+				getCharacterCurrentParams(kCharacterMonsieur)[2] = 1;
+				setDoor(34, kCharacterMonsieur, 1, 0, 0);
+				setDoor(50, kCharacterMonsieur, 1, 0, 0);
+				getCharacterCurrentParams(kCharacterMonsieur)[4] = 0;
+			} else {
+				getCharacterCurrentParams(kCharacterMonsieur)[4] = 0;
 			}
-		} else if (msg->action == 12) {
-			setDoor(34, kCharacterMonsieur, 1, 10, 9);
-			setDoor(50, kCharacterMonsieur, 1, 10, 9);
 		}
-	} else if (msg->action >= 8) {
+
+		break;
+	case 8:
+	case 9:
 		if (getCharacterCurrentParams(kCharacterMonsieur)[1]) {
 			setDoor(34, kCharacterMonsieur, 1, 0, 0);
 			setDoor(50, kCharacterMonsieur, 1, 0, 0);
+
 			if (msg->param.intParam == 50) {
 				getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8] = 4;
 				MonsieurCall(&LogicManager::CONS_Monsieur_DoDialog, getCathWCDialog(), 0, 0, 0);
@@ -791,6 +865,7 @@ void LogicManager::HAND_Monsieur_CompLogic(HAND_PARAMS) {
 		} else {
 			setDoor(34, kCharacterMonsieur, 1, 0, 0);
 			setDoor(50, kCharacterMonsieur, 1, 0, 0);
+
 			if (msg->action == 8) {
 				getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8] = 1;
 				MonsieurCall(&LogicManager::CONS_Monsieur_DoDialog, "LIB012", 0, 0, 0);
@@ -799,31 +874,61 @@ void LogicManager::HAND_Monsieur_CompLogic(HAND_PARAMS) {
 				MonsieurCall(&LogicManager::CONS_Monsieur_DoDialog, "LIB013", 0, 0, 0);
 			}
 		}
-	} else if (msg->action == 0) {
-		if (getCharacterCurrentParams(kCharacterMonsieur)[0] < _gameTime && !getCharacterCurrentParams(kCharacterMonsieur)[3]) {
-			getCharacterCurrentParams(kCharacterMonsieur)[3] = 1;
-			setDoor(34, kCharacterCath, 0, 10, 9);
-			setDoor(50, kCharacterCath, 0, 10, 9);
 
-			getCharacter(kCharacterMonsieur).currentCall--;
-			_engine->getMessageManager()->setMessageHandle(kCharacterMonsieur, _functionsMonsieur[getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall]]);
-			fedEx(kCharacterMonsieur, kCharacterMonsieur, 18, 0);
-			return;
+		break;
+	case 12:
+		setDoor(34, kCharacterMonsieur, 1, 10, 9);
+		setDoor(50, kCharacterMonsieur, 1, 10, 9);
+		break;
+	case 17:
+		if (getCharacterCurrentParams(kCharacterMonsieur)[2] || getCharacterCurrentParams(kCharacterMonsieur)[1]) {
+			setDoor(34, kCharacterMonsieur, 1, 10, 9);
+			setDoor(50, kCharacterMonsieur, 1, 10, 9);
+			getCharacterCurrentParams(kCharacterMonsieur)[2] = 0;
+			getCharacterCurrentParams(kCharacterMonsieur)[1] = 0;
 		}
-		if (getCharacterCurrentParams(kCharacterMonsieur)[1]) {
-			if (getCharacterCurrentParams(kCharacterMonsieur)[4] || (getCharacterCurrentParams(kCharacterMonsieur)[4] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
-				if (getCharacterCurrentParams(kCharacterMonsieur)[4] >= _currentGameSessionTicks)
-					return;
-				getCharacterCurrentParams(kCharacterMonsieur)[4] = 0x7FFFFFFF;
+
+		break;
+	case 18:
+		switch (getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8]) {
+		case 1:
+		case 2:
+			getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8] = 3;
+			if (rnd(2) == 0) {
+				MonsieurCall(&LogicManager::CONS_Monsieur_DoDialog, "MRB1001A", 0, 0, 0);
+			} else {
+				MonsieurCall(&LogicManager::CONS_Monsieur_DoDialog, "MRB1001", 0, 0, 0);
 			}
+
+			break;
+		case 3:
+			setDoor(34, kCharacterMonsieur, 1, 14, 0);
+			setDoor(50, kCharacterMonsieur, 1, 14, 0);
+			getCharacterCurrentParams(kCharacterMonsieur)[1] = 1;
+			break;
+		case 4:
+		case 5:
+		case 6:
 			getCharacterCurrentParams(kCharacterMonsieur)[1] = 0;
 			getCharacterCurrentParams(kCharacterMonsieur)[2] = 1;
-			setDoor(34, kCharacterMonsieur, 1, 0, 0);
-			setDoor(50, kCharacterMonsieur, 1, 0, 0);
-			getCharacterCurrentParams(kCharacterMonsieur)[4] = 0;
-		} else {
-			getCharacterCurrentParams(kCharacterMonsieur)[4] = 0;
+			break;
+		case 7:
+			send(kCharacterMonsieur, kCharacterCond2, 123199584, 0);
+			break;
+		default:
+			break;
 		}
+
+		break;
+	case 122865568:
+		send(kCharacterMonsieur, kCharacterCond2, 88652208, 0);
+		break;
+	case 221683008:
+		getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8] = 7;
+		MonsieurCall(&LogicManager::CONS_Monsieur_DoDialog, "Mrb1001", 0, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -838,20 +943,26 @@ void LogicManager::CONS_Monsieur_Birth(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Monsieur_Birth(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			autoMessage(kCharacterMonsieur, 203520448, 0);
-			autoMessage(kCharacterMonsieur, 237889408, 1);
-			setDoor(34, kCharacterCath, 0, 10, 9);
-			setDoor(50, kCharacterCath, 0, 10, 9);
-			setDoor(42, kCharacterCath, 0, 255, 255);
-			getCharacter(kCharacterMonsieur).characterPosition.position = 1750;
-			getCharacter(kCharacterMonsieur).characterPosition.location = 1;
-			getCharacter(kCharacterMonsieur).characterPosition.car = kCarRestaurant;
+	switch (msg->action) {
+	case 0:
+		if (_gameTime > 1062000 && !getCharacterCurrentParams(kCharacterMonsieur)[0]) {
+			getCharacterCurrentParams(kCharacterMonsieur)[0] = 1;
+			CONS_Monsieur_InPart1(0, 0, 0, 0);
 		}
-	} else if (_gameTime > 1062000 && !getCharacterCurrentParams(kCharacterMonsieur)[0]) {
-		getCharacterCurrentParams(kCharacterMonsieur)[0] = 1;
-		CONS_Monsieur_InPart1(0, 0, 0, 0);
+
+		break;
+	case 12:
+		autoMessage(kCharacterMonsieur, 203520448, 0);
+		autoMessage(kCharacterMonsieur, 237889408, 1);
+		setDoor(34, kCharacterCath, 0, 10, 9);
+		setDoor(50, kCharacterCath, 0, 10, 9);
+		setDoor(42, kCharacterCath, 0, 255, 255);
+		getCharacter(kCharacterMonsieur).characterPosition.position = 1750;
+		getCharacter(kCharacterMonsieur).characterPosition.location = 1;
+		getCharacter(kCharacterMonsieur).characterPosition.car = kCarRestaurant;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -866,67 +977,86 @@ void LogicManager::CONS_Monsieur_DoDinner(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Monsieur_DoDinner(HAND_PARAMS) {
-	if (msg->action > 12) {
-		if (msg->action > 134466544) {
-			if (msg->action == 135854206) {
-				getCharacterCurrentParams(kCharacterMonsieur)[1] = 1;
-			} else if (msg->action == 168717392) {
-				getCharacterCurrentParams(kCharacterMonsieur)[0] = 1;
-				startCycOtis(kCharacterMonsieur, "008D");
-				if (!getCharacterCurrentParams(kCharacterMonsieur)[1]) {
-					getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8] = 5;
-					MonsieurCall(&LogicManager::CONS_Monsieur_DoDialog, "MRB1078", 0, 0, 0);
+	switch (msg->action) {
+	case 0:
+		if (getCharacterCurrentParams(kCharacterMonsieur)[0]) {
+			if (!getCharacterCurrentParams(kCharacterMonsieur)[1]) {
+				if (!getCharacterCurrentParams(kCharacterMonsieur)[2]) {
+					getCharacterCurrentParams(kCharacterMonsieur)[2] = _gameTime + 4500;
+					if (_gameTime == -4500) {
+						getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8] = 3;
+						MonsieurCall(&LogicManager::CONS_Monsieur_DoDialog, "MRB1078A", 0, 0, 0);
+						break;
+					}
+				}
+
+				if (getCharacterCurrentParams(kCharacterMonsieur)[2] < _gameTime) {
+					getCharacterCurrentParams(kCharacterMonsieur)[2] = 0x7FFFFFFF;
+					getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8] = 3;
+					MonsieurCall(&LogicManager::CONS_Monsieur_DoDialog, "MRB1078A", 0, 0, 0);
+					break;
 				}
 			}
-		} else if (msg->action == 134466544) {
-			getCharacterCurrentParams(kCharacterMonsieur)[1] = 0;
-		} else if (msg->action == 18) {
-			switch (getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8]) {
-			case 1:
-				startCycOtis(kCharacterMonsieur, "008B");
-				getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8] = 2;
-				MonsieurCall(&LogicManager::CONS_Monsieur_DoDialog, "MRB1076", 0, 0, 0);
-				break;
-			case 2:
-				send(kCharacterMonsieur, kCharacterWaiter2, 256200848, 0);
-				break;
-			case 3:
-				goto LABEL_24;
-			case 4:
-				send(kCharacterMonsieur, kCharacterCook, 224849280, 0);
-
-				getCharacter(kCharacterMonsieur).currentCall--;
-				_engine->getMessageManager()->setMessageHandle(kCharacterMonsieur, _functionsMonsieur[getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall]]);
-				fedEx(kCharacterMonsieur, kCharacterMonsieur, 18, 0);
-				break;
-			default:
-				return;
+
+			if (_gameTime > 1138500 && !getCharacterCurrentParams(kCharacterMonsieur)[3]) {
+				getCharacterCurrentParams(kCharacterMonsieur)[3] = 1;
+				getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8] = 4;
+				MonsieurCall(&LogicManager::CONS_Monsieur_ExitDining, 0, 0, 0, 0);
 			}
 		}
-	} else if (msg->action == 12) {
+
+		break;
+	case 12:
 		getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8] = 1;
 		MonsieurCall(&LogicManager::CONS_Monsieur_GoDining, 0, 0, 0, 0);
-	} else if (msg->action == 0 && getCharacterCurrentParams(kCharacterMonsieur)[0]) {
-		if (!getCharacterCurrentParams(kCharacterMonsieur)[1]) {
-			if (!getCharacterCurrentParams(kCharacterMonsieur)[2]) {
-				getCharacterCurrentParams(kCharacterMonsieur)[2] = _gameTime + 4500;
-				if (_gameTime == -4500)
-					goto LABEL_18;
-			}
-			if (getCharacterCurrentParams(kCharacterMonsieur)[2] < _gameTime) {
-				getCharacterCurrentParams(kCharacterMonsieur)[2] = 0x7FFFFFFF;
-			LABEL_18:
-				getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8] = 3;
-				MonsieurCall(&LogicManager::CONS_Monsieur_DoDialog, "MRB1078A", 0, 0, 0);
-				return;
+		break;
+	case 18:
+		switch (getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8]) {
+		case 1:
+			startCycOtis(kCharacterMonsieur, "008B");
+			getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8] = 2;
+			MonsieurCall(&LogicManager::CONS_Monsieur_DoDialog, "MRB1076", 0, 0, 0);
+			break;
+		case 2:
+			send(kCharacterMonsieur, kCharacterWaiter2, 256200848, 0);
+			break;
+		case 3:
+			if (_gameTime > 1138500 && !getCharacterCurrentParams(kCharacterMonsieur)[3]) {
+				getCharacterCurrentParams(kCharacterMonsieur)[3] = 1;
+				getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8] = 4;
+				MonsieurCall(&LogicManager::CONS_Monsieur_ExitDining, 0, 0, 0, 0);
 			}
+
+			break;
+		case 4:
+			send(kCharacterMonsieur, kCharacterCook, 224849280, 0);
+
+			getCharacter(kCharacterMonsieur).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterMonsieur, _functionsMonsieur[getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall]]);
+			fedEx(kCharacterMonsieur, kCharacterMonsieur, 18, 0);
+			break;
+		default:
+			break;
 		}
-	LABEL_24:
-		if (_gameTime > 1138500 && !getCharacterCurrentParams(kCharacterMonsieur)[3]) {
-			getCharacterCurrentParams(kCharacterMonsieur)[3] = 1;
-			getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8] = 4;
-			MonsieurCall(&LogicManager::CONS_Monsieur_ExitDining, 0, 0, 0, 0);
+
+		break;
+	case 134466544:
+		getCharacterCurrentParams(kCharacterMonsieur)[1] = 0;
+		break;
+	case 135854206:
+		getCharacterCurrentParams(kCharacterMonsieur)[1] = 1;
+		break;
+	case 168717392:
+		getCharacterCurrentParams(kCharacterMonsieur)[0] = 1;
+		startCycOtis(kCharacterMonsieur, "008D");
+		if (!getCharacterCurrentParams(kCharacterMonsieur)[1]) {
+			getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8] = 5;
+			MonsieurCall(&LogicManager::CONS_Monsieur_DoDialog, "MRB1078", 0, 0, 0);
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -941,10 +1071,12 @@ void LogicManager::CONS_Monsieur_InPart1(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Monsieur_InPart1(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8] = 1;
 		MonsieurCall(&LogicManager::CONS_Monsieur_InSalon, 1071000, "101A", 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8]) {
 		case 1:
 			getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8] = 2;
@@ -957,8 +1089,10 @@ void LogicManager::HAND_Monsieur_InPart1(HAND_PARAMS) {
 		case 3:
 			setDoor(34, kCharacterCath, 1, 0, 0);
 			setDoor(50, kCharacterCath, 1, 0, 0);
+
 			if (checkCathDir(kCarRedSleeping, 54) || checkCathDir(kCarRedSleeping, 44))
 				bumpCath(kCarRedSleeping, 10, 255);
+
 			blockView(kCharacterMonsieur, kCarRedSleeping, 54);
 			blockView(kCharacterMonsieur, kCarRedSleeping, 44);
 			getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8] = 4;
@@ -994,8 +1128,12 @@ void LogicManager::HAND_Monsieur_InPart1(HAND_PARAMS) {
 			CONS_Monsieur_Asleep(0, 0, 0, 0);
 			break;
 		default:
-			return;
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1010,13 +1148,17 @@ void LogicManager::CONS_Monsieur_Asleep(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Monsieur_Asleep(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterMonsieur).characterPosition.car = kCarRedSleeping;
 		getCharacter(kCharacterMonsieur).characterPosition.position = 6470;
 		getCharacter(kCharacterMonsieur).characterPosition.location = 1;
 		setDoor(34, kCharacterCath, 1, 10, 9);
 		setDoor(50, kCharacterCath, 1, 10, 9);
 		endGraphics(kCharacterMonsieur);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1031,18 +1173,21 @@ void LogicManager::CONS_Monsieur_StartPart2(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Monsieur_StartPart2(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			endGraphics(kCharacterMonsieur);
-			getCharacter(kCharacterMonsieur).characterPosition.position = 4689;
-			getCharacter(kCharacterMonsieur).characterPosition.location = 1;
-			getCharacter(kCharacterMonsieur).characterPosition.car = kCarRestaurant;
-			getCharacter(kCharacterMonsieur).inventoryItem = 0;
-			setDoor(34, kCharacterCath, 0, 10, 9);
-			setDoor(50, kCharacterCath, 0, 10, 9);
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		CONS_Monsieur_AtBreakfast(0, 0, 0, 0);
+		break;
+	case 12:
+		endGraphics(kCharacterMonsieur);
+		getCharacter(kCharacterMonsieur).characterPosition.position = 4689;
+		getCharacter(kCharacterMonsieur).characterPosition.location = 1;
+		getCharacter(kCharacterMonsieur).characterPosition.car = kCarRestaurant;
+		getCharacter(kCharacterMonsieur).inventoryItem = 0;
+		setDoor(34, kCharacterCath, 0, 10, 9);
+		setDoor(50, kCharacterCath, 0, 10, 9);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1064,6 +1209,7 @@ void LogicManager::HAND_Monsieur_AtBreakfast(HAND_PARAMS) {
 			getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8] = 1;
 			MonsieurCall(&LogicManager::CONS_Monsieur_ExitDining, 1, 0, 0, 0);
 		}
+
 		break;
 	case 12:
 		startCycOtis(kCharacterMonsieur, "008D");
@@ -1073,13 +1219,15 @@ void LogicManager::HAND_Monsieur_AtBreakfast(HAND_PARAMS) {
 			playDialog(kCharacterMonsieur, "MRB2001", -1, 0);
 			getCharacterCurrentParams(kCharacterMonsieur)[0] = 1;
 		}
+
 		break;
 	case 18:
 		if (getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8] == 1)
 			CONS_Monsieur_InComp2(0, 0, 0, 0);
+
 		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -1094,9 +1242,13 @@ void LogicManager::CONS_Monsieur_InComp2(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Monsieur_InComp2(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		setDoor(34, kCharacterCath, 2, 255, 255);
 		startCycOtis(kCharacterMonsieur, "510");
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1111,18 +1263,21 @@ void LogicManager::CONS_Monsieur_StartPart3(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Monsieur_StartPart3(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			endGraphics(kCharacterMonsieur);
-			getCharacter(kCharacterMonsieur).characterPosition.location = 1;
-			getCharacter(kCharacterMonsieur).characterPosition.car = kCarRedSleeping;
-			getCharacter(kCharacterMonsieur).inventoryItem = 0;
-			getCharacter(kCharacterMonsieur).clothes = 0;
-			setDoor(34, kCharacterCath, 2, 255, 255);
-			setDoor(50, kCharacterCath, 1, 10, 9);
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		CONS_Monsieur_OpenComp3(0, 0, 0, 0);
+		break;
+	case 12:
+		endGraphics(kCharacterMonsieur);
+		getCharacter(kCharacterMonsieur).characterPosition.location = 1;
+		getCharacter(kCharacterMonsieur).characterPosition.car = kCarRedSleeping;
+		getCharacter(kCharacterMonsieur).inventoryItem = 0;
+		getCharacter(kCharacterMonsieur).clothes = 0;
+		setDoor(34, kCharacterCath, 2, 255, 255);
+		setDoor(50, kCharacterCath, 1, 10, 9);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1162,11 +1317,19 @@ void LogicManager::CONS_Monsieur_GoLunch(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Monsieur_GoLunch(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8] = 1;
 		MonsieurCall(&LogicManager::CONS_Monsieur_GoDining, 1, 0, 0, 0);
-	} else if (msg->action == 18 && getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8] == 1) {
-		CONS_Monsieur_AtLunch(0, 0, 0, 0);
+		break;
+	case 18:
+		if (getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8] == 1) {
+			CONS_Monsieur_AtLunch(0, 0, 0, 0);
+		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1181,63 +1344,111 @@ void LogicManager::CONS_Monsieur_AtLunch(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Monsieur_AtLunch(HAND_PARAMS) {
-	if (msg->action > 12) {
-		if (msg->action != 18) {
-			if (msg->action == 122288808) {
-				startCycOtis(kCharacterMonsieur, "008D");
-				getCharacterCurrentParams(kCharacterMonsieur)[0] = 1;
-			} else if (msg->action == 122358304) {
-				startCycOtis(kCharacterMonsieur, "BLANK");
-			}
-			return;
-		}
-
-		if (getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8] != 1) {
-			if (getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8] == 2)
-				CONS_Monsieur_AfterLunchOpen(0, 0, 0, 0);
-			return;
-		}
-		goto LABEL_31;
-	}
-	if (msg->action == 12) {
-		startCycOtis(kCharacterMonsieur, "008B");
-		return;
-	}
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		if (getCharacterCurrentParams(kCharacterMonsieur)[1] || (getCharacterCurrentParams(kCharacterMonsieur)[1] = _gameTime + 450, _gameTime != -450)) {
 			if (getCharacterCurrentParams(kCharacterMonsieur)[1] >= _gameTime) {
-			LABEL_14:
 				if (!getCharacterCurrentParams(kCharacterMonsieur)[0])
-					return;
+					break;
+
 				if (inDiningRoom(kCharacterAnna) && inDiningRoom(kCharacterAugust) && !whoRunningDialog(kCharacterMonsieur) && getCharacterCurrentParams(kCharacterMonsieur)[2] != 0x7FFFFFFF && _gameTime) {
-					if (_gameTime > 1998000)
-						goto LABEL_25;
+					if (_gameTime > 1998000) {
+						getCharacterCurrentParams(kCharacterMonsieur)[2] = 0x7FFFFFFF;
+						getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8] = 1;
+						MonsieurCall(&LogicManager::CONS_Monsieur_DoDialog, "MRB3102", 0, 0, 0);
+						break;
+					}
+
 					if (!inDiningRoom(kCharacterCath) || !getCharacterCurrentParams(kCharacterMonsieur)[2]) {
 						getCharacterCurrentParams(kCharacterMonsieur)[2] = _gameTime + 450;
-						if (_gameTime == -450)
-							goto LABEL_26;
+						if (_gameTime == -450) {
+							getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8] = 1;
+							MonsieurCall(&LogicManager::CONS_Monsieur_DoDialog, "MRB3102", 0, 0, 0);
+							break;
+						}
 					}
+
 					if (getCharacterCurrentParams(kCharacterMonsieur)[2] < _gameTime) {
-					LABEL_25:
 						getCharacterCurrentParams(kCharacterMonsieur)[2] = 0x7FFFFFFF;
-					LABEL_26:
 						getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8] = 1;
 						MonsieurCall(&LogicManager::CONS_Monsieur_DoDialog, "MRB3102", 0, 0, 0);
-						return;
+						break;
 					}
 				}
-			LABEL_31:
+
 				if (_gameTime > 2002500 && !getCharacterCurrentParams(kCharacterMonsieur)[3]) {
 					getCharacterCurrentParams(kCharacterMonsieur)[3] = 1;
 					getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8] = 2;
 					MonsieurCall(&LogicManager::CONS_Monsieur_ExitDining, 1, 0, 0, 0);
 				}
-				return;
+
+				break;
 			}
+
 			getCharacterCurrentParams(kCharacterMonsieur)[1] = 0x7FFFFFFF;
 		}
+
 		send(kCharacterMonsieur, kCharacterWaiter2, 256200848, 0);
-		goto LABEL_14;
+
+		if (!getCharacterCurrentParams(kCharacterMonsieur)[0])
+			break;
+
+		if (inDiningRoom(kCharacterAnna) && inDiningRoom(kCharacterAugust) && !whoRunningDialog(kCharacterMonsieur) && getCharacterCurrentParams(kCharacterMonsieur)[2] != 0x7FFFFFFF && _gameTime) {
+			if (_gameTime > 1998000) {
+				getCharacterCurrentParams(kCharacterMonsieur)[2] = 0x7FFFFFFF;
+				getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8] = 1;
+				MonsieurCall(&LogicManager::CONS_Monsieur_DoDialog, "MRB3102", 0, 0, 0);
+				break;
+			}
+
+			if (!inDiningRoom(kCharacterCath) || !getCharacterCurrentParams(kCharacterMonsieur)[2]) {
+				getCharacterCurrentParams(kCharacterMonsieur)[2] = _gameTime + 450;
+				if (_gameTime == -450) {
+					getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8] = 1;
+					MonsieurCall(&LogicManager::CONS_Monsieur_DoDialog, "MRB3102", 0, 0, 0);
+					break;
+				}
+			}
+
+			if (getCharacterCurrentParams(kCharacterMonsieur)[2] < _gameTime) {
+				getCharacterCurrentParams(kCharacterMonsieur)[2] = 0x7FFFFFFF;
+				getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8] = 1;
+				MonsieurCall(&LogicManager::CONS_Monsieur_DoDialog, "MRB3102", 0, 0, 0);
+				break;
+			}
+		}
+
+		if (_gameTime > 2002500 && !getCharacterCurrentParams(kCharacterMonsieur)[3]) {
+			getCharacterCurrentParams(kCharacterMonsieur)[3] = 1;
+			getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8] = 2;
+			MonsieurCall(&LogicManager::CONS_Monsieur_ExitDining, 1, 0, 0, 0);
+		}
+
+		break;
+	case 12:
+		startCycOtis(kCharacterMonsieur, "008B");
+		break;
+	case 18:
+
+		if (getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8] != 1) {
+			if (getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8] == 2)
+				CONS_Monsieur_AfterLunchOpen(0, 0, 0, 0);
+		} else if (_gameTime > 2002500 && !getCharacterCurrentParams(kCharacterMonsieur)[3]) {
+			getCharacterCurrentParams(kCharacterMonsieur)[3] = 1;
+			getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8] = 2;
+			MonsieurCall(&LogicManager::CONS_Monsieur_ExitDining, 1, 0, 0, 0);
+		}
+
+		break;
+	case 122288808:
+		startCycOtis(kCharacterMonsieur, "008D");
+		getCharacterCurrentParams(kCharacterMonsieur)[0] = 1;
+		break;
+	case 122358304:
+		startCycOtis(kCharacterMonsieur, "BLANK");
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1277,19 +1488,22 @@ void LogicManager::CONS_Monsieur_StartPart4(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Monsieur_StartPart4(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			endGraphics(kCharacterMonsieur);
-			getCharacter(kCharacterMonsieur).characterPosition.position = 6470;
-			getCharacter(kCharacterMonsieur).characterPosition.location = 1;
-			getCharacter(kCharacterMonsieur).characterPosition.car = kCarRedSleeping;
-			getCharacter(kCharacterMonsieur).inventoryItem = 0;
-			getCharacter(kCharacterMonsieur).clothes = 0;
-			setDoor(34, kCharacterCath, 2, 255, 255);
-			setDoor(50, kCharacterCath, 1, 10, 9);
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		CONS_Monsieur_OpenComp4(0, 0, 0, 0);
+		break;
+	case 12:
+		endGraphics(kCharacterMonsieur);
+		getCharacter(kCharacterMonsieur).characterPosition.position = 6470;
+		getCharacter(kCharacterMonsieur).characterPosition.location = 1;
+		getCharacter(kCharacterMonsieur).characterPosition.car = kCarRedSleeping;
+		getCharacter(kCharacterMonsieur).inventoryItem = 0;
+		getCharacter(kCharacterMonsieur).clothes = 0;
+		setDoor(34, kCharacterCath, 2, 255, 255);
+		setDoor(50, kCharacterCath, 1, 10, 9);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1304,14 +1518,20 @@ void LogicManager::CONS_Monsieur_OpenComp4(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Monsieur_OpenComp4(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			setDoor(34, kCarNone, 2, 255, 255);
-			startCycOtis(kCharacterMonsieur, "510");
+	switch (msg->action) {
+	case 0:
+		if (_gameTime > 2367000 && !getCharacterCurrentParams(kCharacterMonsieur)[0]) {
+			getCharacterCurrentParams(kCharacterMonsieur)[0] = 1;
+			CONS_Monsieur_Dinner4(0, 0, 0, 0);
 		}
-	} else if (_gameTime > 2367000 && !getCharacterCurrentParams(kCharacterMonsieur)[0]) {
-		getCharacterCurrentParams(kCharacterMonsieur)[0] = 1;
-		CONS_Monsieur_Dinner4(0, 0, 0, 0);
+
+		break;
+	case 12:
+		setDoor(34, kCarNone, 2, 255, 255);
+		startCycOtis(kCharacterMonsieur, "510");
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1326,38 +1546,46 @@ void LogicManager::CONS_Monsieur_Dinner4(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Monsieur_Dinner4(HAND_PARAMS) {
-	if (msg->action > 12) {
-		switch (msg->action) {
-		case 18:
-			switch (getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8]) {
-			case 1:
-				startCycOtis(kCharacterMonsieur, "008B");
-				getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8] = 2;
-				MonsieurCall(&LogicManager::CONS_Monsieur_DoWait, 450, 0, 0, 0);
-				break;
-			case 2:
-				send(kCharacterMonsieur, kCharacterWaiter2, 256200848, 0);
-				break;
-			case 3:
-				CONS_Monsieur_ReturnComp4(0, 0, 0, 0);
-				break;
-			}
+	switch (msg->action) {
+	case 0:
+		if (getCharacterCurrentParams(kCharacterMonsieur)[0] && _gameTime > 2389500 && !getCharacterCurrentParams(kCharacterMonsieur)[1]) {
+			getCharacterCurrentParams(kCharacterMonsieur)[1] = 1;
+			getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8] = 3;
+			MonsieurCall(&LogicManager::CONS_Monsieur_ExitDining, 0, 0, 0, 0);
+		}
+
+		break;
+	case 12:
+		getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8] = 1;
+		MonsieurCall(&LogicManager::CONS_Monsieur_GoDining, 1, 0, 0, 0);
+		break;
+	case 18:
+		switch (getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8]) {
+		case 1:
+			startCycOtis(kCharacterMonsieur, "008B");
+			getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8] = 2;
+			MonsieurCall(&LogicManager::CONS_Monsieur_DoWait, 450, 0, 0, 0);
 			break;
-		case 122288808:
-			getCharacterCurrentParams(kCharacterMonsieur)[0] = 1;
-			startCycOtis(kCharacterMonsieur, "008D");
+		case 2:
+			send(kCharacterMonsieur, kCharacterWaiter2, 256200848, 0);
 			break;
-		case 122358304:
-			startCycOtis(kCharacterMonsieur, "BLANK");
+		case 3:
+			CONS_Monsieur_ReturnComp4(0, 0, 0, 0);
+			break;
+		default:
 			break;
 		}
-	} else if (msg->action == 12) {
-		getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8] = 1;
-		MonsieurCall(&LogicManager::CONS_Monsieur_GoDining, 1, 0, 0, 0);
-	} else if (msg->action == 0 && getCharacterCurrentParams(kCharacterMonsieur)[0] && _gameTime > 2389500 && !getCharacterCurrentParams(kCharacterMonsieur)[1]) {
-		getCharacterCurrentParams(kCharacterMonsieur)[1] = 1;
-		getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8] = 3;
-		MonsieurCall(&LogicManager::CONS_Monsieur_ExitDining, 0, 0, 0, 0);
+
+		break;
+	case 122288808:
+		getCharacterCurrentParams(kCharacterMonsieur)[0] = 1;
+		startCycOtis(kCharacterMonsieur, "008D");
+		break;
+	case 122358304:
+		startCycOtis(kCharacterMonsieur, "BLANK");
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1372,61 +1600,8 @@ void LogicManager::CONS_Monsieur_ReturnComp4(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Monsieur_ReturnComp4(HAND_PARAMS) {
-	if (msg->action > 12) {
-		if (msg->action > 122865568) {
-			if (msg->action == 125039808) {
-				getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8] = 4;
-				MonsieurCall(&LogicManager::CONS_Monsieur_CompLogic, 2457000, 0, 0, 0);
-			} else if (msg->action == 221683008) {
-				getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8] = 9;
-				MonsieurCall(&LogicManager::CONS_Monsieur_DoDialog, "Mrb1001", 0, 0, 0);
-			}
-		} else if (msg->action == 122865568) {
-			send(kCharacterMonsieur, kCharacterCond2, 88652208, 0);
-		} else if (msg->action == 18) {
-			switch (getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8]) {
-			case 1:
-				getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8] = 2;
-				MonsieurCall(&LogicManager::CONS_Monsieur_InSalon, 2479500, "102B", 0, 0);
-				break;
-			case 2:
-				getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8] = 3;
-				MonsieurCall(&LogicManager::CONS_Monsieur_ReturnSalon, 0, "102C", 0, 0);
-				break;
-			case 3:
-			case 7:
-				goto LABEL_29;
-			case 4:
-			case 8:
-				if (_gameTime >= 2470500) {
-				LABEL_29:
-					CONS_Monsieur_Asleep4(0, 0, 0, 0);
-				} else if (_gameEvents[kEventAugustDrink]) {
-					getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8] = 5;
-					MonsieurCall(&LogicManager::CONS_Monsieur_GoSalon, 0, "102A", 0, 0);
-				} else {
-					getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8] = 8;
-					MonsieurCall(&LogicManager::CONS_Monsieur_CompLogic, _gameTime + 900, 0, 0, 0);
-				}
-				break;
-			case 5:
-				getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8] = 6;
-				MonsieurCall(&LogicManager::CONS_Monsieur_InSalon, 2479500, "102B", 0, 0);
-				break;
-			case 6:
-				getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8] = 7;
-				MonsieurCall(&LogicManager::CONS_Monsieur_ReturnSalon, 0, "102C", 0, 0);
-				break;
-			case 9:
-				send(kCharacterMonsieur, kCharacterCond2, 123199584, 0);
-				break;
-			default:
-				return;
-			}
-		}
-	} else if (msg->action == 12) {
-		send(kCharacterMonsieur, kCharacterAbbot, 101687594, 0);
-	} else if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		if (_gameTime <= 2470500 || getCharacterCurrentParams(kCharacterMonsieur)[0]) {
 			if (_gameTime > 2457000) {
 				if (_gameEvents[kEventAugustDrink]) {
@@ -1439,6 +1614,67 @@ void LogicManager::HAND_Monsieur_ReturnComp4(HAND_PARAMS) {
 			getCharacterCurrentParams(kCharacterMonsieur)[0] = 1;
 			CONS_Monsieur_Asleep4(0, 0, 0, 0);
 		}
+
+		break;
+	case 12:
+		send(kCharacterMonsieur, kCharacterAbbot, 101687594, 0);
+		break;
+	case 18:
+		switch (getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8]) {
+		case 1:
+			getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8] = 2;
+			MonsieurCall(&LogicManager::CONS_Monsieur_InSalon, 2479500, "102B", 0, 0);
+			break;
+		case 2:
+			getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8] = 3;
+			MonsieurCall(&LogicManager::CONS_Monsieur_ReturnSalon, 0, "102C", 0, 0);
+			break;
+		case 3:
+		case 7:
+			CONS_Monsieur_Asleep4(0, 0, 0, 0);
+			break;
+		case 4:
+		case 8:
+			if (_gameTime >= 2470500) {
+				CONS_Monsieur_Asleep4(0, 0, 0, 0);
+			} else if (_gameEvents[kEventAugustDrink]) {
+				getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8] = 5;
+				MonsieurCall(&LogicManager::CONS_Monsieur_GoSalon, 0, "102A", 0, 0);
+			} else {
+				getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8] = 8;
+				MonsieurCall(&LogicManager::CONS_Monsieur_CompLogic, _gameTime + 900, 0, 0, 0);
+			}
+
+			break;
+		case 5:
+			getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8] = 6;
+			MonsieurCall(&LogicManager::CONS_Monsieur_InSalon, 2479500, "102B", 0, 0);
+			break;
+		case 6:
+			getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8] = 7;
+			MonsieurCall(&LogicManager::CONS_Monsieur_ReturnSalon, 0, "102C", 0, 0);
+			break;
+		case 9:
+			send(kCharacterMonsieur, kCharacterCond2, 123199584, 0);
+			break;
+		default:
+			break;
+		}
+
+		break;
+	case 122865568:
+		send(kCharacterMonsieur, kCharacterCond2, 88652208, 0);
+		break;
+	case 125039808:
+		getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8] = 4;
+		MonsieurCall(&LogicManager::CONS_Monsieur_CompLogic, 2457000, 0, 0, 0);
+		break;
+	case 221683008:
+		getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8] = 9;
+		MonsieurCall(&LogicManager::CONS_Monsieur_DoDialog, "Mrb1001", 0, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1453,13 +1689,17 @@ void LogicManager::CONS_Monsieur_Asleep4(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Monsieur_Asleep4(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterMonsieur).characterPosition.car = kCarRedSleeping;
 		getCharacter(kCharacterMonsieur).characterPosition.position = 6470;
 		getCharacter(kCharacterMonsieur).characterPosition.location = 1;
 		endGraphics(kCharacterMonsieur);
 		setDoor(34, kCharacterCath, 1, 10, 9);
 		setDoor(50, kCharacterCath, 1, 10, 9);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1474,17 +1714,20 @@ void LogicManager::CONS_Monsieur_StartPart5(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Monsieur_StartPart5(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			endGraphics(kCharacterMonsieur);
-			getCharacter(kCharacterMonsieur).characterPosition.position = 3969;
-			getCharacter(kCharacterMonsieur).characterPosition.location = 1;
-			getCharacter(kCharacterMonsieur).characterPosition.car = kCarRestaurant;
-			getCharacter(kCharacterMonsieur).inventoryItem = 0;
-			getCharacter(kCharacterMonsieur).clothes = 0;
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		CONS_Monsieur_Prisoner(0, 0, 0, 0);
+		break;
+	case 12:
+		endGraphics(kCharacterMonsieur);
+		getCharacter(kCharacterMonsieur).characterPosition.position = 3969;
+		getCharacter(kCharacterMonsieur).characterPosition.location = 1;
+		getCharacter(kCharacterMonsieur).characterPosition.car = kCarRestaurant;
+		getCharacter(kCharacterMonsieur).inventoryItem = 0;
+		getCharacter(kCharacterMonsieur).clothes = 0;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1499,8 +1742,13 @@ void LogicManager::CONS_Monsieur_Prisoner(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Monsieur_Prisoner(HAND_PARAMS) {
-	if (msg->action == 70549068)
+	switch (msg->action) {
+	case 70549068:
 		CONS_Monsieur_Hiding(0, 0, 0, 0);
+		break;
+	default:
+		break;
+	}
 }
 
 void LogicManager::CONS_Monsieur_Hiding(CONS_PARAMS) {
@@ -1514,12 +1762,17 @@ void LogicManager::CONS_Monsieur_Hiding(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Monsieur_Hiding(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterMonsieur).characterPosition.position = 5790;
 		getCharacter(kCharacterMonsieur).characterPosition.location = 1;
 		getCharacter(kCharacterMonsieur).characterPosition.car = kCarRedSleeping;
-	} else if (msg->action == 135800432) {
+		break;
+	case 135800432:
 		CONS_Monsieur_Disappear(0, 0, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 


Commit: e25704807eee5483071b5f794b6d705efd0c184e
    https://github.com/scummvm/scummvm/commit/e25704807eee5483071b5f794b6d705efd0c184e
Author: AndywinXp (andywinxp at gmail.com)
Date: 2025-06-16T23:12:18+02:00

Commit Message:
LASTEXPRESS: Clean up Alouan logic

Changed paths:
    engines/lastexpress/characters/alouan.cpp


diff --git a/engines/lastexpress/characters/alouan.cpp b/engines/lastexpress/characters/alouan.cpp
index e77d3ea019a..99dc3342567 100644
--- a/engines/lastexpress/characters/alouan.cpp
+++ b/engines/lastexpress/characters/alouan.cpp
@@ -48,7 +48,7 @@ void LogicManager::CONS_Alouan(int chapter) {
 		CONS_Alouan_StartPart5(0, 0, 0, 0);
 		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -69,18 +69,24 @@ void LogicManager::CONS_Alouan_DebugWalks(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Alouan_DebugWalks(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			getCharacter(kCharacterAlouan).characterPosition.position = 0;
-			getCharacter(kCharacterAlouan).characterPosition.location = 0;
-			getCharacter(kCharacterAlouan).characterPosition.car = kCarGreenSleeping;
-			getCharacterCurrentParams(kCharacterAlouan)[0] = 10000;
+	switch (msg->action) {
+	case 0:
+		if (walk(kCharacterAlouan, kCarGreenSleeping, getCharacterCurrentParams(kCharacterAlouan)[0])) {
+			if (getCharacterCurrentParams(kCharacterAlouan)[0] == 10000)
+				getCharacterCurrentParams(kCharacterAlouan)[0] = 0;
+			else
+				getCharacterCurrentParams(kCharacterAlouan)[0] = 10000;
 		}
-	} else if (walk(kCharacterAlouan, kCarGreenSleeping, getCharacterCurrentParams(kCharacterAlouan)[0])) {
-		if (getCharacterCurrentParams(kCharacterAlouan)[0] == 10000)
-			getCharacterCurrentParams(kCharacterAlouan)[0] = 0;
-		else
-			getCharacterCurrentParams(kCharacterAlouan)[0] = 10000;
+
+		break;
+	case 12:
+		getCharacter(kCharacterAlouan).characterPosition.position = 0;
+		getCharacter(kCharacterAlouan).characterPosition.location = 0;
+		getCharacter(kCharacterAlouan).characterPosition.car = kCarGreenSleeping;
+		getCharacterCurrentParams(kCharacterAlouan)[0] = 10000;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -99,14 +105,19 @@ void LogicManager::CONS_Alouan_DoCorrOtis(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Alouan_DoCorrOtis(HAND_PARAMS) {
-	if (msg->action == 3) {
+	switch (msg->action) {
+	case 3:
 		releaseAtDoor(kCharacterAlouan, getCharacterCurrentParams(kCharacterAlouan)[3]);
 		getCharacter(kCharacterAlouan).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterAlouan, _functionsAlouan[getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall]]);
 		fedEx(kCharacterAlouan, kCharacterAlouan, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		startSeqOtis(kCharacterAlouan, (char *)&getCharacterCurrentParams(kCharacterAlouan)[0]);
 		blockAtDoor(kCharacterAlouan, getCharacterCurrentParams(kCharacterAlouan)[3]);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -123,12 +134,17 @@ void LogicManager::CONS_Alouan_DoDialog(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Alouan_DoDialog(HAND_PARAMS) {
-	if (msg->action == 2) {
+	switch (msg->action) {
+	case 2:
 		getCharacter(kCharacterAlouan).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterAlouan, _functionsAlouan[getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall]]);
 		fedEx(kCharacterAlouan, kCharacterAlouan, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		playDialog(kCharacterAlouan, (char *)&getCharacterCurrentParams(kCharacterAlouan)[0], -1, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -145,10 +161,11 @@ void LogicManager::CONS_Alouan_DoWait(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Alouan_DoWait(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		if (getCharacterCurrentParams(kCharacterAlouan)[1] || (getCharacterCurrentParams(kCharacterAlouan)[1] = _gameTime + getCharacterCurrentParams(kCharacterAlouan)[0], _gameTime + getCharacterCurrentParams(kCharacterAlouan)[0] != 0)) {
 			if (getCharacterCurrentParams(kCharacterAlouan)[1] >= _gameTime)
-				return;
+				break;
 
 			getCharacterCurrentParams(kCharacterAlouan)[1] = 0x7FFFFFFF;
 		}
@@ -156,6 +173,9 @@ void LogicManager::HAND_Alouan_DoWait(HAND_PARAMS) {
 		getCharacter(kCharacterAlouan).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterAlouan, _functionsAlouan[getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall]]);
 		fedEx(kCharacterAlouan, kCharacterAlouan, 18, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -212,11 +232,13 @@ void LogicManager::CONS_Alouan_PeekF(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Alouan_PeekF(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterAlouan).characterPosition.position = 4070;
 		getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] = 1;
 		AlouanCall(&LogicManager::CONS_Alouan_DoCorrOtis, "621Cf", 6, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		if (getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] == 1) {
 			getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] = 2;
 			AlouanCall(&LogicManager::CONS_Alouan_DoCorrOtis, "621Df", 6, 0, 0);
@@ -227,6 +249,10 @@ void LogicManager::HAND_Alouan_PeekF(HAND_PARAMS) {
 			_engine->getMessageManager()->setMessageHandle(kCharacterAlouan, _functionsAlouan[getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall]]);
 			fedEx(kCharacterAlouan, kCharacterAlouan, 18, 0);
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -241,11 +267,13 @@ void LogicManager::CONS_Alouan_PeekH(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Alouan_PeekH(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterAlouan).characterPosition.position = 2740;
 		getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] = 1;
 		AlouanCall(&LogicManager::CONS_Alouan_DoCorrOtis, "621Ch", 8, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		if (getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] == 1) {
 			getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] = 2;
 			AlouanCall(&LogicManager::CONS_Alouan_DoCorrOtis, "621Dh", 8, 0, 0);
@@ -256,6 +284,10 @@ void LogicManager::HAND_Alouan_PeekH(HAND_PARAMS) {
 			_engine->getMessageManager()->setMessageHandle(kCharacterAlouan, _functionsAlouan[getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall]]);
 			fedEx(kCharacterAlouan, kCharacterAlouan, 18, 0);
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -270,12 +302,14 @@ void LogicManager::CONS_Alouan_GoFtoH(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Alouan_GoFtoH(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterAlouan).characterPosition.position = 4070;
 		getCharacter(kCharacterAlouan).characterPosition.location = 0;
 		getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] = 1;
 		AlouanCall(&LogicManager::CONS_Alouan_DoCorrOtis, "621Bf", 6, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8]) {
 		case 1:
 			getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] = 2;
@@ -293,7 +327,13 @@ void LogicManager::HAND_Alouan_GoFtoH(HAND_PARAMS) {
 			_engine->getMessageManager()->setMessageHandle(kCharacterAlouan, _functionsAlouan[getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall]]);
 			fedEx(kCharacterAlouan, kCharacterAlouan, 18, 0);
 			break;
+		default:
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -308,12 +348,14 @@ void LogicManager::CONS_Alouan_GoHtoF(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Alouan_GoHtoF(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterAlouan).characterPosition.position = 2740;
 		getCharacter(kCharacterAlouan).characterPosition.location = 0;
 		getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] = 1;
 		AlouanCall(&LogicManager::CONS_Alouan_DoCorrOtis, "621Bh", 8, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8]) {
 		case 1:
 			getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] = 2;
@@ -331,7 +373,13 @@ void LogicManager::HAND_Alouan_GoHtoF(HAND_PARAMS) {
 			_engine->getMessageManager()->setMessageHandle(kCharacterAlouan, _functionsAlouan[getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall]]);
 			fedEx(kCharacterAlouan, kCharacterAlouan, 18, 0);
 			break;
+		default:
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -346,15 +394,21 @@ void LogicManager::CONS_Alouan_Birth(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Alouan_Birth(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			getCharacter(kCharacterAlouan).characterPosition.position = 2740;
-			getCharacter(kCharacterAlouan).characterPosition.location = 1;
-			getCharacter(kCharacterAlouan).characterPosition.car = kCarGreenSleeping;
+	switch (msg->action) {
+	case 0:
+		if (_gameTime > 1062000 && !getCharacterCurrentParams(kCharacterAlouan)[0]) {
+			getCharacterCurrentParams(kCharacterAlouan)[0] = 1;
+			CONS_Alouan_Part1(0, 0, 0, 0);
 		}
-	} else if (_gameTime > 1062000 && !getCharacterCurrentParams(kCharacterAlouan)[0]) {
-		getCharacterCurrentParams(kCharacterAlouan)[0] = 1;
-		CONS_Alouan_Part1(0, 0, 0, 0);
+
+		break;
+	case 12:
+		getCharacter(kCharacterAlouan).characterPosition.position = 2740;
+		getCharacter(kCharacterAlouan).characterPosition.location = 1;
+		getCharacter(kCharacterAlouan).characterPosition.car = kCarGreenSleeping;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -369,27 +423,34 @@ void LogicManager::CONS_Alouan_Part1(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Alouan_Part1(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action != 18 || getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] != 1)
-			return;
+	switch (msg->action) {
+	case 0:
+		if (_gameTime > 1096200 && !getCharacterCurrentParams(kCharacterAlouan)[0]) {
+			getCharacterCurrentParams(kCharacterAlouan)[0] = 1;
+			getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] = 1;
+			AlouanCall(&LogicManager::CONS_Alouan_GoHtoF, 0, 0, 0, 0);
+		} else {
+			if (_gameTime > 1162800 && !getCharacterCurrentParams(kCharacterAlouan)[1]) {
+				getCharacterCurrentParams(kCharacterAlouan)[1] = 1;
+				send(kCharacterAlouan, kCharacterClerk, 191070912, 4070);
+				getCharacter(kCharacterAlouan).characterPosition.position = 4070;
+			}
+			if (_gameTime > 1179000 && !getCharacterCurrentParams(kCharacterAlouan)[2]) {
+				getCharacterCurrentParams(kCharacterAlouan)[2] = 1;
+				send(kCharacterAlouan, kCharacterClerk, 191070912, 4840);
+				getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] = 2;
+				AlouanCall(&LogicManager::CONS_Alouan_GoFtoH, 0, 0, 0, 0);
+			}
+		}
 
-		getCharacter(kCharacterAlouan).characterPosition.position = 4840;
-	} else if (_gameTime > 1096200 && !getCharacterCurrentParams(kCharacterAlouan)[0]) {
-		getCharacterCurrentParams(kCharacterAlouan)[0] = 1;
-		getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] = 1;
-		AlouanCall(&LogicManager::CONS_Alouan_GoHtoF, 0, 0, 0, 0);
-		return;
-	}
-	if (_gameTime > 1162800 && !getCharacterCurrentParams(kCharacterAlouan)[1]) {
-		getCharacterCurrentParams(kCharacterAlouan)[1] = 1;
-		send(kCharacterAlouan, kCharacterClerk, 191070912, 4070);
-		getCharacter(kCharacterAlouan).characterPosition.position = 4070;
-	}
-	if (_gameTime > 1179000 && !getCharacterCurrentParams(kCharacterAlouan)[2]) {
-		getCharacterCurrentParams(kCharacterAlouan)[2] = 1;
-		send(kCharacterAlouan, kCharacterClerk, 191070912, 4840);
-		getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] = 2;
-		AlouanCall(&LogicManager::CONS_Alouan_GoFtoH, 0, 0, 0, 0);
+		break;
+	case 18:
+		if (getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] != 1)
+			getCharacter(kCharacterAlouan).characterPosition.position = 4840;
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -404,13 +465,17 @@ void LogicManager::CONS_Alouan_Asleep(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Alouan_Asleep(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		setDoor(7, kCharacterCath, 3, 10, 9);
 		setDoor(5, kCharacterCath, 3, 10, 9);
 		getCharacter(kCharacterAlouan).characterPosition.position = 4070;
 		getCharacter(kCharacterAlouan).characterPosition.location = 1;
 		getCharacter(kCharacterAlouan).characterPosition.car = kCarGreenSleeping;
 		endGraphics(kCharacterAlouan);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -425,7 +490,8 @@ void LogicManager::CONS_Alouan_StartPart2(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Alouan_StartPart2(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		endGraphics(kCharacterAlouan);
 		getCharacter(kCharacterAlouan).characterPosition.position = 2740;
 		getCharacter(kCharacterAlouan).characterPosition.location = 1;
@@ -433,6 +499,9 @@ void LogicManager::HAND_Alouan_StartPart2(HAND_PARAMS) {
 		getCharacter(kCharacterAlouan).clothes = 0;
 		getCharacter(kCharacterAlouan).inventoryItem = kItemNone;
 		CONS_Alouan_Part2(0, 0, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -447,44 +516,29 @@ void LogicManager::CONS_Alouan_Part2(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Alouan_Part2(HAND_PARAMS) {
-	if (msg->action > 12) {
-		if (msg->action == 18) {
-			switch (getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8]) {
-			case 3:
-				getCharacterCurrentParams(kCharacterAlouan)[0] = 0;
-				getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] = 4;
-				AlouanCall(&LogicManager::CONS_Alouan_DoDialog, "Har2011", 0, 0, 0);
-				break;
-			case 4:
-				getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] = 5;
-				AlouanCall(&LogicManager::CONS_Alouan_DoWait, 900, 0, 0, 0);
-				break;
-			case 5:
-				send(kCharacterAlouan, kCharacterFrancois, 190219584, 0);
-				break;
-			}
-		} else if (msg->action == 189489753) {
-			getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] = 3;
-			AlouanCall(&LogicManager::CONS_Alouan_GoHtoF, 0, 0, 0, 0);
-		}
-	} else {
-		if (msg->action == 12) {
-			send(kCharacterAlouan, kCharacterClerk, 191070912, 4840);
-			getCharacterCurrentParams(kCharacterAlouan)[0] = 1;
-			return;
-		}
-		if (msg->action == 0 && getCharacterCurrentParams(kCharacterAlouan)[1] != 0x7FFFFFFF && _gameTime) {
+	switch (msg->action) {
+	case 0:
+		if (getCharacterCurrentParams(kCharacterAlouan)[1] != 0x7FFFFFFF && _gameTime) {
 			if (_gameTime <= 1777500) {
 				if (!cathInCorridor(kCarGreenSleeping) || !getCharacterCurrentParams(kCharacterAlouan)[1]) {
 					getCharacterCurrentParams(kCharacterAlouan)[1] = _gameTime + 75;
-					if (_gameTime == -75)
-						goto LABEL_16;
+					if (_gameTime == -75) {
+						if (getCharacterCurrentParams(kCharacterAlouan)[0]) {
+							getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] = 1;
+							AlouanCall(&LogicManager::CONS_Alouan_PeekH, 0, 0, 0, 0);
+						} else {
+							getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] = 2;
+							AlouanCall(&LogicManager::CONS_Alouan_PeekF, 0, 0, 0, 0);
+						}
+					}
 				}
+
 				if (getCharacterCurrentParams(kCharacterAlouan)[1] >= _gameTime)
-					return;
+					break;
 			}
+
 			getCharacterCurrentParams(kCharacterAlouan)[1] = 0x7FFFFFFF;
-		LABEL_16:
+
 			if (getCharacterCurrentParams(kCharacterAlouan)[0]) {
 				getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] = 1;
 				AlouanCall(&LogicManager::CONS_Alouan_PeekH, 0, 0, 0, 0);
@@ -493,6 +547,37 @@ void LogicManager::HAND_Alouan_Part2(HAND_PARAMS) {
 				AlouanCall(&LogicManager::CONS_Alouan_PeekF, 0, 0, 0, 0);
 			}
 		}
+
+		break;
+	case 12:
+		send(kCharacterAlouan, kCharacterClerk, 191070912, 4840);
+		getCharacterCurrentParams(kCharacterAlouan)[0] = 1;
+		break;
+	case 18:
+		switch (getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8]) {
+		case 3:
+			getCharacterCurrentParams(kCharacterAlouan)[0] = 0;
+			getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] = 4;
+			AlouanCall(&LogicManager::CONS_Alouan_DoDialog, "Har2011", 0, 0, 0);
+			break;
+		case 4:
+			getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] = 5;
+			AlouanCall(&LogicManager::CONS_Alouan_DoWait, 900, 0, 0, 0);
+			break;
+		case 5:
+			send(kCharacterAlouan, kCharacterFrancois, 190219584, 0);
+			break;
+		default:
+			break;
+		}
+
+		break;
+	case 189489753:
+		getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] = 3;
+		AlouanCall(&LogicManager::CONS_Alouan_GoHtoF, 0, 0, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -507,13 +592,18 @@ void LogicManager::CONS_Alouan_StartPart3(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Alouan_StartPart3(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		CONS_Alouan_Part3(0, 0, 0, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		endGraphics(kCharacterAlouan);
 		getCharacter(kCharacterAlouan).characterPosition.position = 2740;
 		getCharacter(kCharacterAlouan).characterPosition.location = 1;
 		getCharacter(kCharacterAlouan).characterPosition.car = kCarGreenSleeping;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -528,79 +618,155 @@ void LogicManager::CONS_Alouan_Part3(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Alouan_Part3(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			send(kCharacterAlouan, kCharacterClerk, 191070912, 4840);
-		} else if (msg->action == 18) {
-			switch (getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8]) {
-			case 1:
-				getCharacter(kCharacterAlouan).characterPosition.position = 4840;
-				goto LABEL_11;
-			case 2:
-				goto LABEL_20;
-			case 3:
-				goto LABEL_23;
-			case 4:
-				goto LABEL_26;
-			default:
-				return;
+	switch (msg->action) {
+	case 0:
+		if (_gameTime > 1984500 && !getCharacterCurrentParams(kCharacterAlouan)[0]) {
+			getCharacterCurrentParams(kCharacterAlouan)[0] = 1;
+			getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] = 1;
+			AlouanCall(&LogicManager::CONS_Alouan_GoHtoF, 0, 0, 0, 0);
+			break;
+		}
+
+		if (getCharacterCurrentParams(kCharacterAlouan)[1] != 0x7FFFFFFF && _gameTime > 1989000) {
+			if (_gameTime > 2119500) {
+				getCharacterCurrentParams(kCharacterAlouan)[1] = 0x7FFFFFFF;
+				getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] = 2;
+				AlouanCall(&LogicManager::CONS_Alouan_PeekF, 0, 0, 0, 0);
+				break;
+			}
+
+			if (!cathInCorridor(kCarGreenSleeping) || !getCharacterCurrentParams(kCharacterAlouan)[1]) {
+				getCharacterCurrentParams(kCharacterAlouan)[1] = _gameTime + 75;
+				if (_gameTime == -75) {
+					getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] = 2;
+					AlouanCall(&LogicManager::CONS_Alouan_PeekF, 0, 0, 0, 0);
+					break;
+				}
+			}
+
+			if (getCharacterCurrentParams(kCharacterAlouan)[1] < _gameTime) {
+				getCharacterCurrentParams(kCharacterAlouan)[1] = 0x7FFFFFFF;
+				getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] = 2;
+				AlouanCall(&LogicManager::CONS_Alouan_PeekF, 0, 0, 0, 0);
+				break;
 			}
 		}
-		return;
-	}
-	if (_gameTime > 1984500 && !getCharacterCurrentParams(kCharacterAlouan)[0]) {
-		getCharacterCurrentParams(kCharacterAlouan)[0] = 1;
-		getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] = 1;
-		AlouanCall(&LogicManager::CONS_Alouan_GoHtoF, 0, 0, 0, 0);
-		return;
-	}
-LABEL_11:
-	if (getCharacterCurrentParams(kCharacterAlouan)[1] != 0x7FFFFFFF && _gameTime > 1989000) {
-		if (_gameTime > 2119500)
-			goto LABEL_18;
-		if (!cathInCorridor(kCarGreenSleeping) || !getCharacterCurrentParams(kCharacterAlouan)[1]) {
-			getCharacterCurrentParams(kCharacterAlouan)[1] = _gameTime + 75;
-			if (_gameTime == -75)
-				goto LABEL_19;
+
+		if (_gameTime > 2052000 && !getCharacterCurrentParams(kCharacterAlouan)[2]) {
+			getCharacterCurrentParams(kCharacterAlouan)[2] = 1;
+			getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] = 3;
+			AlouanCall(&LogicManager::CONS_Alouan_DoDialog, "Har1005", 0, 0, 0);
+			break;
 		}
-		if (getCharacterCurrentParams(kCharacterAlouan)[1] < _gameTime) {
-		LABEL_18:
-			getCharacterCurrentParams(kCharacterAlouan)[1] = 0x7FFFFFFF;
-		LABEL_19:
-			getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] = 2;
-			AlouanCall(&LogicManager::CONS_Alouan_PeekF, 0, 0, 0, 0);
-			return;
+
+		if (_gameTime > 2133000 && !getCharacterCurrentParams(kCharacterAlouan)[3]) {
+			getCharacterCurrentParams(kCharacterAlouan)[3] = 1;
+			getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] = 4;
+			AlouanCall(&LogicManager::CONS_Alouan_GoFtoH, 0, 0, 0, 0);
+			break;
 		}
-	}
-LABEL_20:
-	if (_gameTime > 2052000 && !getCharacterCurrentParams(kCharacterAlouan)[2]) {
-		getCharacterCurrentParams(kCharacterAlouan)[2] = 1;
-		getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] = 3;
-		AlouanCall(&LogicManager::CONS_Alouan_DoDialog, "Har1005", 0, 0, 0);
-		return;
-	}
-LABEL_23:
-	if (_gameTime > 2133000 && !getCharacterCurrentParams(kCharacterAlouan)[3]) {
-		getCharacterCurrentParams(kCharacterAlouan)[3] = 1;
-		getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] = 4;
-		AlouanCall(&LogicManager::CONS_Alouan_GoFtoH, 0, 0, 0, 0);
-		return;
-	}
-LABEL_26:
-	if (getCharacterCurrentParams(kCharacterAlouan)[4] != 0x7FFFFFFF && _gameTime > 2151000) {
-		if (_gameTime <= 2241000) {
-			if (!cathInCorridor(kCarGreenSleeping) || !getCharacterCurrentParams(kCharacterAlouan)[4]) {
-				getCharacterCurrentParams(kCharacterAlouan)[4] = _gameTime + 75;
-				if (_gameTime == -75)
-					goto LABEL_34;
+
+		if (getCharacterCurrentParams(kCharacterAlouan)[4] != 0x7FFFFFFF && _gameTime > 2151000) {
+			if (_gameTime <= 2241000) {
+				if (!cathInCorridor(kCarGreenSleeping) || !getCharacterCurrentParams(kCharacterAlouan)[4]) {
+					getCharacterCurrentParams(kCharacterAlouan)[4] = _gameTime + 75;
+					if (_gameTime == -75) {
+						getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] = 5;
+						AlouanCall(&LogicManager::CONS_Alouan_PeekH, 0, 0, 0, 0);
+						break;
+					}
+				}
+
+				if (getCharacterCurrentParams(kCharacterAlouan)[4] >= _gameTime)
+					break;
 			}
-			if (getCharacterCurrentParams(kCharacterAlouan)[4] >= _gameTime)
-				return;
+
+			getCharacterCurrentParams(kCharacterAlouan)[4] = 0x7FFFFFFF;
+			getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] = 5;
+			AlouanCall(&LogicManager::CONS_Alouan_PeekH, 0, 0, 0, 0);
 		}
-		getCharacterCurrentParams(kCharacterAlouan)[4] = 0x7FFFFFFF;
-	LABEL_34:
-		getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] = 5;
-		AlouanCall(&LogicManager::CONS_Alouan_PeekH, 0, 0, 0, 0);
+
+		break;
+	case 12:
+		send(kCharacterAlouan, kCharacterClerk, 191070912, 4840);
+		break;
+	case 18:
+		switch (getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8]) {
+		case 1:
+			getCharacter(kCharacterAlouan).characterPosition.position = 4840;
+			if (getCharacterCurrentParams(kCharacterAlouan)[1] != 0x7FFFFFFF && _gameTime > 1989000) {
+				if (_gameTime > 2119500) {
+					getCharacterCurrentParams(kCharacterAlouan)[1] = 0x7FFFFFFF;
+					getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] = 2;
+					AlouanCall(&LogicManager::CONS_Alouan_PeekF, 0, 0, 0, 0);
+					break;
+				}
+
+				if (!cathInCorridor(kCarGreenSleeping) || !getCharacterCurrentParams(kCharacterAlouan)[1]) {
+					getCharacterCurrentParams(kCharacterAlouan)[1] = _gameTime + 75;
+					if (_gameTime == -75) {
+						getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] = 2;
+						AlouanCall(&LogicManager::CONS_Alouan_PeekF, 0, 0, 0, 0);
+						break;
+					}
+				}
+
+				if (getCharacterCurrentParams(kCharacterAlouan)[1] < _gameTime) {
+					getCharacterCurrentParams(kCharacterAlouan)[1] = 0x7FFFFFFF;
+					getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] = 2;
+					AlouanCall(&LogicManager::CONS_Alouan_PeekF, 0, 0, 0, 0);
+					break;
+				}
+			}
+
+			// fall through
+		case 2:
+			if (_gameTime > 2052000 && !getCharacterCurrentParams(kCharacterAlouan)[2]) {
+				getCharacterCurrentParams(kCharacterAlouan)[2] = 1;
+				getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] = 3;
+				AlouanCall(&LogicManager::CONS_Alouan_DoDialog, "Har1005", 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 3:
+			if (_gameTime > 2133000 && !getCharacterCurrentParams(kCharacterAlouan)[3]) {
+				getCharacterCurrentParams(kCharacterAlouan)[3] = 1;
+				getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] = 4;
+				AlouanCall(&LogicManager::CONS_Alouan_GoFtoH, 0, 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 4:
+			if (getCharacterCurrentParams(kCharacterAlouan)[4] != 0x7FFFFFFF && _gameTime > 2151000) {
+				if (_gameTime <= 2241000) {
+					if (!cathInCorridor(kCarGreenSleeping) || !getCharacterCurrentParams(kCharacterAlouan)[4]) {
+						getCharacterCurrentParams(kCharacterAlouan)[4] = _gameTime + 75;
+						if (_gameTime == -75) {
+							getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] = 5;
+							AlouanCall(&LogicManager::CONS_Alouan_PeekH, 0, 0, 0, 0);
+							break;
+						}
+					}
+
+					if (getCharacterCurrentParams(kCharacterAlouan)[4] >= _gameTime)
+						break;
+				}
+
+				getCharacterCurrentParams(kCharacterAlouan)[4] = 0x7FFFFFFF;
+				getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] = 5;
+				AlouanCall(&LogicManager::CONS_Alouan_PeekH, 0, 0, 0, 0);
+			}
+
+			break;
+		default:
+			break;
+		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -615,13 +781,18 @@ void LogicManager::CONS_Alouan_StartPart4(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Alouan_StartPart4(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		CONS_Alouan_Part4(0, 0, 0, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		endGraphics(kCharacterAlouan);
 		getCharacter(kCharacterAlouan).characterPosition.position = 2740;
 		getCharacter(kCharacterAlouan).characterPosition.location = 1;
 		getCharacter(kCharacterAlouan).characterPosition.car = kCarGreenSleeping;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -638,49 +809,78 @@ void LogicManager::CONS_Alouan_Part4(CONS_PARAMS) {
 void LogicManager::HAND_Alouan_Part4(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
-		if (getCharacterCurrentParams(kCharacterAlouan)[0] == 0x7FFFFFFF || !_gameTime)
-			goto LABEL_22;
+		if (getCharacterCurrentParams(kCharacterAlouan)[0] == 0x7FFFFFFF || !_gameTime) {
+			if (_gameTime > 2455200 && !getCharacterCurrentParams(kCharacterAlouan)[1]) {
+				getCharacterCurrentParams(kCharacterAlouan)[1] = 1;
+				getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] = 2;
+				AlouanCall(&LogicManager::CONS_Alouan_GoHtoF, 0, 0, 0, 0);
+			} else if (_gameTime > 2475000 && !getCharacterCurrentParams(kCharacterAlouan)[2]) {
+				getCharacterCurrentParams(kCharacterAlouan)[2] = 1;
+				send(kCharacterAlouan, kCharacterClerk, 191070912, 4840);
+				getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] = 3;
+				AlouanCall(&LogicManager::CONS_Alouan_GoFtoH, 0, 0, 0, 0);
+			}
+
+			break;
+		}
 
 		if (_gameTime <= 2443500) {
 			if (!cathInCorridor(kCarGreenSleeping) || !getCharacterCurrentParams(kCharacterAlouan)[0]) {
 				getCharacterCurrentParams(kCharacterAlouan)[0] = _gameTime + 75;
-				if (_gameTime == -75)
-					goto LABEL_13;
+				if (_gameTime == -75) {
+					getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] = 1;
+					AlouanCall(&LogicManager::CONS_Alouan_PeekH, 0, 0, 0, 0);
+					break;
+				}
 			}
 
-			if (getCharacterCurrentParams(kCharacterAlouan)[0] >= _gameTime)
-				goto LABEL_22;
+			if (getCharacterCurrentParams(kCharacterAlouan)[0] >= _gameTime) {
+				if (_gameTime > 2455200 && !getCharacterCurrentParams(kCharacterAlouan)[1]) {
+					getCharacterCurrentParams(kCharacterAlouan)[1] = 1;
+					getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] = 2;
+					AlouanCall(&LogicManager::CONS_Alouan_GoHtoF, 0, 0, 0, 0);
+				} else if (_gameTime > 2475000 && !getCharacterCurrentParams(kCharacterAlouan)[2]) {
+					getCharacterCurrentParams(kCharacterAlouan)[2] = 1;
+					send(kCharacterAlouan, kCharacterClerk, 191070912, 4840);
+					getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] = 3;
+					AlouanCall(&LogicManager::CONS_Alouan_GoFtoH, 0, 0, 0, 0);
+				}
+
+				break;
+			}
 		}
 
 		getCharacterCurrentParams(kCharacterAlouan)[0] = 0x7FFFFFFF;
-	LABEL_13:
 		getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] = 1;
 		AlouanCall(&LogicManager::CONS_Alouan_PeekH, 0, 0, 0, 0);
-		return;
+		break;
 	case 12:
 		send(kCharacterAlouan, kCharacterClerk, 191070912, 4840);
-		return;
+		break;
 	case 18:
 		if (getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] != 1) {
 			if (getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] != 2)
-				return;
+				break;
 
 			send(kCharacterAlouan, kCharacterClerk, 191070912, 4070);
-			goto LABEL_18;
-		}
-	LABEL_22:
-		if (_gameTime > 2455200 && !getCharacterCurrentParams(kCharacterAlouan)[1]) {
-			getCharacterCurrentParams(kCharacterAlouan)[1] = 1;
-			getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] = 2;
-			AlouanCall(&LogicManager::CONS_Alouan_GoHtoF, 0, 0, 0, 0);
-			return;
-		}
-	LABEL_18:
-		if (_gameTime > 2475000 && !getCharacterCurrentParams(kCharacterAlouan)[2]) {
-			getCharacterCurrentParams(kCharacterAlouan)[2] = 1;
-			send(kCharacterAlouan, kCharacterClerk, 191070912, 4840);
-			getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] = 3;
-			AlouanCall(&LogicManager::CONS_Alouan_GoFtoH, 0, 0, 0, 0);
+
+			if (_gameTime > 2475000 && !getCharacterCurrentParams(kCharacterAlouan)[2]) {
+				getCharacterCurrentParams(kCharacterAlouan)[2] = 1;
+				send(kCharacterAlouan, kCharacterClerk, 191070912, 4840);
+				getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] = 3;
+				AlouanCall(&LogicManager::CONS_Alouan_GoFtoH, 0, 0, 0, 0);
+			}
+		} else {
+			if (_gameTime > 2455200 && !getCharacterCurrentParams(kCharacterAlouan)[1]) {
+				getCharacterCurrentParams(kCharacterAlouan)[1] = 1;
+				getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] = 2;
+				AlouanCall(&LogicManager::CONS_Alouan_GoHtoF, 0, 0, 0, 0);
+			} else if (_gameTime > 2475000 && !getCharacterCurrentParams(kCharacterAlouan)[2]) {
+				getCharacterCurrentParams(kCharacterAlouan)[2] = 1;
+				send(kCharacterAlouan, kCharacterClerk, 191070912, 4840);
+				getCharacter(kCharacterAlouan).callbacks[getCharacter(kCharacterAlouan).currentCall + 8] = 3;
+				AlouanCall(&LogicManager::CONS_Alouan_GoFtoH, 0, 0, 0, 0);
+			}
 		}
 
 		break;
@@ -698,13 +898,17 @@ void LogicManager::CONS_Alouan_Asleep4(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Alouan_Asleep4(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		setDoor(7, kCharacterCath, 3, 10, 9);
 		setDoor(5, kCharacterCath, 3, 10, 9);
 		getCharacter(kCharacterAlouan).characterPosition.position = 2740;
 		getCharacter(kCharacterAlouan).characterPosition.location = 1;
 		getCharacter(kCharacterAlouan).characterPosition.car = kCarGreenSleeping;
 		endGraphics(kCharacterAlouan);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -719,15 +923,20 @@ void LogicManager::CONS_Alouan_StartPart5(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Alouan_StartPart5(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		CONS_Alouan_Prisoner(0, 0, 0, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		endGraphics(kCharacterAlouan);
 		getCharacter(kCharacterAlouan).characterPosition.car = kCarRestaurant;
 		getCharacter(kCharacterAlouan).characterPosition.position = 3969;
 		getCharacter(kCharacterAlouan).characterPosition.location = 1;
 		getCharacter(kCharacterAlouan).clothes = 0;
 		getCharacter(kCharacterAlouan).inventoryItem = kItemNone;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -742,8 +951,13 @@ void LogicManager::CONS_Alouan_Prisoner(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Alouan_Prisoner(HAND_PARAMS) {
-	if (msg->action == 70549068)
+	switch (msg->action) {
+	case 70549068:
 		CONS_Alouan_Free(0, 0, 0, 0);
+		break;
+	default:
+		break;
+	}
 }
 
 void LogicManager::CONS_Alouan_Free(CONS_PARAMS) {
@@ -757,25 +971,31 @@ void LogicManager::CONS_Alouan_Free(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Alouan_Free(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		if (getCharacterCurrentParams(kCharacterAlouan)[0] ||
 			(getCharacterCurrentParams(kCharacterAlouan)[0] = _gameTime + 2700, _gameTime != -2700)) {
 			if (getCharacterCurrentParams(kCharacterAlouan)[0] >= _gameTime)
-				return;
+				break;
 
 			getCharacterCurrentParams(kCharacterAlouan)[0] = 0x7FFFFFFF;
 		}
 
 		CONS_Alouan_Hiding(0, 0, 0, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		getCharacter(kCharacterAlouan).characterPosition.car = kCarGreenSleeping;
 		getCharacter(kCharacterAlouan).characterPosition.position = 5000;
 		getCharacter(kCharacterAlouan).characterPosition.location = 0;
-
-	} else if (msg->action == 17) {
+		break;
+	case 17:
 		if (checkLoc(kCharacterCath, 3)) {
 			CONS_Alouan_Hiding(0, 0, 0, 0);
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -810,6 +1030,8 @@ void LogicManager::HAND_Alouan_Hiding(HAND_PARAMS) {
 	case 135800432:
 		CONS_Alouan_Disappear(0, 0, 0, 0);
 		break;
+	default:
+		break;
 	}
 }
 


Commit: 2f22a8586a076f6669e9a9587c7eee22f09c0d5a
    https://github.com/scummvm/scummvm/commit/2f22a8586a076f6669e9a9587c7eee22f09c0d5a
Author: AndywinXp (andywinxp at gmail.com)
Date: 2025-06-16T23:12:18+02:00

Commit Message:
LASTEXPRESS: Clean up Vassili logic

Changed paths:
    engines/lastexpress/characters/vassili.cpp


diff --git a/engines/lastexpress/characters/vassili.cpp b/engines/lastexpress/characters/vassili.cpp
index 84d038f88c2..1246d0978a8 100644
--- a/engines/lastexpress/characters/vassili.cpp
+++ b/engines/lastexpress/characters/vassili.cpp
@@ -48,7 +48,7 @@ void LogicManager::CONS_Vassili(int chapter) {
 		CONS_Vassili_StartPart5(0, 0, 0, 0);
 		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -69,19 +69,25 @@ void LogicManager::CONS_Vassili_DebugWalks(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Vassili_DebugWalks(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			getCharacter(kCharacterVassili).characterPosition.position = 0;
-			getCharacter(kCharacterVassili).characterPosition.location = 0;
-			getCharacter(kCharacterVassili).characterPosition.car = kCarGreenSleeping;
-			getCharacterCurrentParams(kCharacterVassili)[0] = 10000;
-		}
-	} else if (walk(kCharacterVassili, kCarGreenSleeping, getCharacterCurrentParams(kCharacterVassili)[0])) {
-		if (getCharacterCurrentParams(kCharacterVassili)[0] == 10000) {
-			getCharacterCurrentParams(kCharacterVassili)[0] = 0;
-		} else {
-			getCharacterCurrentParams(kCharacterVassili)[0] = 10000;
+	switch (msg->action) {
+	case 0:
+		if (walk(kCharacterVassili, kCarGreenSleeping, getCharacterCurrentParams(kCharacterVassili)[0])) {
+			if (getCharacterCurrentParams(kCharacterVassili)[0] == 10000) {
+				getCharacterCurrentParams(kCharacterVassili)[0] = 0;
+			} else {
+				getCharacterCurrentParams(kCharacterVassili)[0] = 10000;
+			}
 		}
+
+		break;
+	case 12:
+		getCharacter(kCharacterVassili).characterPosition.position = 0;
+		getCharacter(kCharacterVassili).characterPosition.location = 0;
+		getCharacter(kCharacterVassili).characterPosition.car = kCarGreenSleeping;
+		getCharacterCurrentParams(kCharacterVassili)[0] = 10000;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -98,12 +104,17 @@ void LogicManager::CONS_Vassili_DoSeqOtis(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Vassili_DoSeqOtis(HAND_PARAMS) {
-	if (msg->action == 3) {
+	switch (msg->action) {
+	case 3:
 		getCharacter(kCharacterVassili).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterVassili, _functionsVassili[getCharacter(kCharacterVassili).callbacks[getCharacter(kCharacterVassili).currentCall]]);
 		fedEx(kCharacterVassili, kCharacterVassili, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		startSeqOtis(kCharacterVassili, (char *)&getCharacterCurrentParams(kCharacterVassili)[0]);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -121,12 +132,14 @@ void LogicManager::CONS_Vassili_SaveGame(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Vassili_SaveGame(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		getCharacter(kCharacterVassili).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterVassili, _functionsVassili[getCharacter(kCharacterVassili).callbacks[getCharacter(kCharacterVassili).currentCall]]);
 
 		fedEx(kCharacterVassili, kCharacterVassili, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		save(
 			kCharacterVassili,
 			getCharacterCurrentParams(kCharacterVassili)[0],
@@ -137,6 +150,9 @@ void LogicManager::HAND_Vassili_SaveGame(HAND_PARAMS) {
 		_engine->getMessageManager()->setMessageHandle(kCharacterVassili, _functionsVassili[getCharacter(kCharacterVassili).callbacks[getCharacter(kCharacterVassili).currentCall]]);
 
 		fedEx(kCharacterVassili, kCharacterVassili, 18, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -151,14 +167,20 @@ void LogicManager::CONS_Vassili_Birth(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Vassili_Birth(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		if (_gameTime > 1062000 && !getCharacterCurrentParams(kCharacterVassili)[0]) {
 			getCharacterCurrentParams(kCharacterVassili)[0] = 1;
 			CONS_Vassili_WithTatiana(0, 0, 0, 0);
 		}
-	} else if (msg->action == 12) {
+
+		break;
+	case 12:
 		setDoor(32, kCharacterCath, 0, 10, 9);
 		setDoor(40, kCharacterCath, 0, 255, 255);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -173,24 +195,32 @@ void LogicManager::CONS_Vassili_WithTatiana(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Vassili_WithTatiana(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		if (getCharacterCurrentParams(kCharacterVassili)[0]) {
 			getCharacter(kCharacterVassili).characterPosition = getCharacter(kCharacterTatiana).characterPosition;
 		} else if (!getCharacterCurrentParams(kCharacterVassili)[2] &&
 			(getCharacterCurrentParams(kCharacterVassili)[2] = _gameTime + 450, _gameTime == -450) || getCharacterCurrentParams(kCharacterVassili)[2] < _gameTime) {
 			if (!getCharacterCurrentParams(kCharacterVassili)[1] && getModel(32) == 1) {
 				getCharacterCurrentParams(kCharacterVassili)[1] = 1;
-				startCycOtis(11, "303A");
+				startCycOtis(kCharacterVassili, "303A");
 				setDoor(32, kCharacterCath, 0, 10, 9);
 			}
 		}
-	} else if (msg->action == 12) {
+
+		break;
+	case 12:
 		getCharacterCurrentParams(kCharacterVassili)[0] = 1;
-	} else if (msg->action == 122732000) {
+		break;
+	case 122732000:
 		CONS_Vassili_InBed(0, 0, 0, 0);
-	} else if (msg->action == 168459827) {
+		break;
+	case 168459827:
 		getCharacterCurrentParams(kCharacterVassili)[0] = 0;
 		setDoor(32, kCharacterCath, 1, 10, 9);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -205,8 +235,9 @@ void LogicManager::CONS_Vassili_InBed(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Vassili_InBed(HAND_PARAMS) {
-	if (msg->action == 0) {
-		if (inComp(0, 4, 8200)) {
+	switch (msg->action) {
+	case 0:
+		if (inComp(kCharacterCath, kCarRedSleeping, 8200)) {
 			if (getCharacterCurrentParams(kCharacterVassili)[2] ||
 				((getCharacterCurrentParams(kCharacterVassili)[2] = _currentGameSessionTicks + getCharacterCurrentParams(kCharacterVassili)[0]),
 				 _currentGameSessionTicks + getCharacterCurrentParams(kCharacterVassili)[0] != 0)) {
@@ -215,49 +246,56 @@ void LogicManager::HAND_Vassili_InBed(HAND_PARAMS) {
 					getCharacterCurrentParams(kCharacterVassili)[2] = 0x7FFFFFFF;
 					getCharacter(kCharacterVassili).callbacks[getCharacter(kCharacterVassili).currentCall + 8] = 1;
 					VassiliCall(&LogicManager::CONS_Vassili_DoSeqOtis, "303B", 0, 0, 0);
-					return;
+					break;
 				}
 			} else {
 				getCharacter(kCharacterVassili).callbacks[getCharacter(kCharacterVassili).currentCall + 8] = 1;
 				VassiliCall(&LogicManager::CONS_Vassili_DoSeqOtis, "303B", 0, 0, 0);
-				return;
+				break;
 			}
 		} else {
 			getCharacterCurrentParams(kCharacterVassili)[2] = 0;
 			if (getCharacterCurrentParams(kCharacterVassili)[1])
-				startCycOtis(11, "303A");
+				startCycOtis(kCharacterVassili, "303A");
 		}
 
 		if (getCharacterCurrentParams(kCharacterVassili)[3] != 0x7FFFFFFF && _gameTime > 1489500) {
 			if (_gameTime <= 1503000) {
-				if (inComp(0, 4, 8200) || !getCharacterCurrentParams(kCharacterVassili)[3]) {
+				if (inComp(kCharacterCath, kCarRedSleeping, 8200) || !getCharacterCurrentParams(kCharacterVassili)[3]) {
 					getCharacterCurrentParams(kCharacterVassili)[3] = _gameTime;
 					if (!_gameTime) {
 						CONS_Vassili_InBed2(0, 0, 0, 0);
-						return;
+						break;
 					}
 				}
 
 				if (getCharacterCurrentParams(kCharacterVassili)[3] >= _gameTime)
-					return;
+					break;
 			}
 
 			getCharacterCurrentParams(kCharacterVassili)[3] = 0x7FFFFFFF;
 			CONS_Vassili_InBed2(0, 0, 0, 0);
 		}
-	} else if (msg->action == 12) {
+
+		break;
+	case 12:
 		getCharacter(kCharacterVassili).characterPosition.car = kCarRedSleeping;
 		getCharacter(kCharacterVassili).characterPosition.location = 1;
 		getCharacter(kCharacterVassili).characterPosition.position = 8200;
-		setDoor(32, 0, 0, 10, 9);
+		setDoor(32, kCharacterCath, 0, 10, 9);
 		getCharacterCurrentParams(kCharacterVassili)[0] = 5 * (3 * rnd(25) + 15);
-		startCycOtis(11, "303A");
-	} else if (msg->action == 18) {
+		startCycOtis(kCharacterVassili, "303A");
+		break;
+	case 18:
 		if (getCharacter(kCharacterVassili).callbacks[getCharacter(kCharacterVassili).currentCall + 8] == 1) {
-			startCycOtis(11, "303C");
+			startCycOtis(kCharacterVassili, "303C");
 			getCharacterCurrentParams(kCharacterVassili)[1] = 1;
 			getCharacterCurrentParams(kCharacterVassili)[0] = 5 * (3 * rnd(25) + 15);
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -275,24 +313,24 @@ void LogicManager::HAND_Vassili_InBed2(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
 		if (getCharacterCurrentParams(kCharacterVassili)[0] == 0x7FFFFFFF || _gameTime <= 1503000)
-			return;
+			break;
 
 		if (_gameTime <= 1512000) {
 			if (!cathInCorridor(kCarRedSleeping) || !getCharacterCurrentParams(kCharacterVassili)[0]) {
 				getCharacterCurrentParams(kCharacterVassili)[0] = _gameTime + 150;
 				if (_gameTime == -150) {
 					CONS_Vassili_HaveSeizureNow(0, 0, 0, 0);
-					return;
+					break;
 				}
 			}
 
 			if (getCharacterCurrentParams(kCharacterVassili)[0] >= _gameTime)
-				return;
+				break;
 		}
 
 		getCharacterCurrentParams(kCharacterVassili)[0] = 0x7FFFFFFF;
 		CONS_Vassili_HaveSeizureNow(0, 0, 0, 0);
-		return;
+		break;
 	case 12:
 		getCharacter(kCharacterVassili).characterPosition.car = 4;
 		getCharacter(kCharacterVassili).characterPosition.location = 1;
@@ -321,9 +359,11 @@ void LogicManager::CONS_Vassili_HaveSeizureNow(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Vassili_HaveSeizureNow(HAND_PARAMS) {
-	if (msg->action == 2) {
+	switch (msg->action) {
+	case 2:
 		CONS_Vassili_HavingSeizure(0, 0, 0, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		if (!checkLoc(kCharacterCath, kCarRedSleeping)) {
 			playDialog(0, "BUMP", -1, 0);
 
@@ -338,6 +378,9 @@ void LogicManager::HAND_Vassili_HaveSeizureNow(HAND_PARAMS) {
 		send(kCharacterVassili, kCharacterTrainM, 226031488, 0);
 		send(kCharacterVassili, kCharacterCond2, 226031488, 0);
 		playDialog(kCharacterVassili, "VAS1027", 16, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -352,14 +395,16 @@ void LogicManager::CONS_Vassili_HavingSeizure(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Vassili_HavingSeizure(HAND_PARAMS) {
-	if (msg->action == 2) {
+	switch (msg->action) {
+	case 2:
 		if (!nearChar(kCharacterVassili, kCharacterCath, 2500))
 			playDialog(0, "BUMP", -1, 0);
 
 		CONS_Vassili_CathArrives(0, 0, 0, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		if ((checkDoor(32) != 2 ||
-			!checkCathDir(4, 17)) &&
+			!checkCathDir(kCarRedSleeping, 17)) &&
 			!checkCathDir(kCarRedSleeping, 18) &&
 			!checkCathDir(kCarRedSleeping, 37) &&
 			!checkCathDir(kCarRedSleeping, 38) &&
@@ -369,7 +414,9 @@ void LogicManager::HAND_Vassili_HavingSeizure(HAND_PARAMS) {
 		} else {
 			CONS_Vassili_CathArrives(0, 0, 0, 0);
 		}
-	} else if (msg->action == 17) {
+
+		break;
+	case 17:
 		if (checkDoor(32) == 2 &&
 			checkCathDir(kCarRedSleeping, 17) ||
 			checkCathDir(kCarRedSleeping, 18) ||
@@ -380,6 +427,10 @@ void LogicManager::HAND_Vassili_HavingSeizure(HAND_PARAMS) {
 			fadeDialog(kCharacterVassili);
 			CONS_Vassili_CathArrives(0, 0, 0, 0);
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -394,7 +445,8 @@ void LogicManager::CONS_Vassili_CathArrives(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Vassili_CathArrives(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		if (_gameProgress[kProgressEventCorpseMovedFromFloor]) {
 			if (_gameProgress[kProgressEventCorpseThrown]) {
 				if (_gameProgress[kProgressJacket] == 1) {
@@ -414,17 +466,25 @@ void LogicManager::HAND_Vassili_CathArrives(HAND_PARAMS) {
 			playNIS(kEventMertensCorpseFloor);
 			endGame(0, 0, 0, true);
 		}
-	} else if (msg->action == 18 && getCharacter(kCharacterVassili).callbacks[getCharacter(kCharacterVassili).currentCall + 8] == 1) {
-		getCharacter(kCharacterCath).characterPosition.location = 1;
-		playNIS(kEventVassiliSeizure);
-		setDoor(32, kCharacterCath, 0, 10, 9);
-		setDoor(1, kCharacterCath, 0, 10, 9);
-		_gameProgress[kProgressField18] = 2;
-		send(kCharacterVassili, kCharacterAnna, 191477936, 0);
-		send(kCharacterVassili, kCharacterTrainM, 191477936, 0);
-		send(kCharacterVassili, kCharacterCond2, 191477936, 0);
-		bumpCathRDoor(32);
-		CONS_Vassili_AsleepAgain(0, 0, 0, 0);
+
+		break;
+	case 18:
+		if (getCharacter(kCharacterVassili).callbacks[getCharacter(kCharacterVassili).currentCall + 8] == 1) {
+			getCharacter(kCharacterCath).characterPosition.location = 1;
+			playNIS(kEventVassiliSeizure);
+			setDoor(32, kCharacterCath, 0, 10, 9);
+			setDoor(1, kCharacterCath, 0, 10, 9);
+			_gameProgress[kProgressField18] = 2;
+			send(kCharacterVassili, kCharacterAnna, 191477936, 0);
+			send(kCharacterVassili, kCharacterTrainM, 191477936, 0);
+			send(kCharacterVassili, kCharacterCond2, 191477936, 0);
+			bumpCathRDoor(32);
+			CONS_Vassili_AsleepAgain(0, 0, 0, 0);
+		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -439,8 +499,13 @@ void LogicManager::CONS_Vassili_AsleepAgain(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Vassili_AsleepAgain(HAND_PARAMS) {
-	if (msg->action == 12)
+	switch (msg->action) {
+	case 12:
 		startCycOtis(kCharacterVassili, "303A");
+		break;
+	default:
+		break;
+	}
 }
 
 void LogicManager::CONS_Vassili_StartPart2(CONS_PARAMS) {
@@ -454,9 +519,11 @@ void LogicManager::CONS_Vassili_StartPart2(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Vassili_StartPart2(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		CONS_Vassili_InPart2(0, 0, 0, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		endGraphics(kCharacterVassili);
 		getCharacter(kCharacterVassili).characterPosition.position = 8200;
 		getCharacter(kCharacterVassili).characterPosition.location = 1;
@@ -465,6 +532,9 @@ void LogicManager::HAND_Vassili_StartPart2(HAND_PARAMS) {
 		getCharacter(kCharacterVassili).clothes = 0;
 		setDoor(32, kCharacterCath, 0, 10, 9);
 		setModel(32, 1);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -479,7 +549,8 @@ void LogicManager::CONS_Vassili_InPart2(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Vassili_InPart2(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		if (inComp(kCharacterCath, kCarRedSleeping, 8200)) {
 			if (getCharacterCurrentParams(kCharacterVassili)[2] ||
 				(getCharacterCurrentParams(kCharacterVassili)[2] = _currentGameSessionTicks + getCharacterCurrentParams(kCharacterVassili)[0],
@@ -493,17 +564,24 @@ void LogicManager::HAND_Vassili_InPart2(HAND_PARAMS) {
 		} else {
 			getCharacterCurrentParams(kCharacterVassili)[2] = 0;
 			if (getCharacterCurrentParams(kCharacterVassili)[1])
-				startCycOtis(11, "303A");
+				startCycOtis(kCharacterVassili, "303A");
 		}
-	} else if (msg->action == 12) {
+
+		break;
+	case 12:
 		getCharacterCurrentParams(kCharacterVassili)[0] = 5 * (3 * rnd(25) + 15);
 		startCycOtis(kCharacterVassili, "303A");
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		if (getCharacter(kCharacterVassili).callbacks[getCharacter(kCharacterVassili).currentCall + 8] == 1) {
 			startCycOtis(kCharacterVassili, "303C");
 			getCharacterCurrentParams(kCharacterVassili)[1] = 1;
 			getCharacterCurrentParams(kCharacterVassili)[0] = 5 * (3 * rnd(25) + 15);
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -518,9 +596,11 @@ void LogicManager::CONS_Vassili_StartPart3(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Vassili_StartPart3(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		CONS_Vassili_Asleep(0, 0, 0, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		endGraphics(kCharacterVassili);
 		getCharacter(kCharacterVassili).characterPosition.position = 8200;
 		getCharacter(kCharacterVassili).characterPosition.location = 1;
@@ -528,6 +608,9 @@ void LogicManager::HAND_Vassili_StartPart3(HAND_PARAMS) {
 		getCharacter(kCharacterVassili).inventoryItem = kItemNone;
 		getCharacter(kCharacterVassili).clothes = 0;
 		setDoor(32, kCharacterCath, 0, 10, 9);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -550,7 +633,7 @@ void LogicManager::HAND_Vassili_Asleep(HAND_PARAMS) {
 				 _currentGameSessionTicks + getCharacterCurrentParams(kCharacterVassili)[0] != 0)) {
 
 				if (getCharacterCurrentParams(kCharacterVassili)[2] >= _currentGameSessionTicks)
-					return;
+					break;
 
 				getCharacterCurrentParams(kCharacterVassili)[2] = 0x7FFFFFFF;
 			}
@@ -566,11 +649,11 @@ void LogicManager::HAND_Vassili_Asleep(HAND_PARAMS) {
 		break;
 	case 9:
 		getCharacter(kCharacterVassili).callbacks[getCharacter(kCharacterVassili).currentCall + 8] = 2;
-		VassiliCall(&LogicManager::CONS_Vassili_SaveGame, 2, 91, 0, 0);
+		VassiliCall(&LogicManager::CONS_Vassili_SaveGame, 2, kEventVassiliCompartmentStealEgg, 0, 0);
 		break;
 	case 12:
 		getCharacterCurrentParams(kCharacterVassili)[0] = 5 * (3 * rnd(25) + 15);
-		startCycOtis(11, "303A");
+		startCycOtis(kCharacterVassili, "303A");
 		break;
 	case 17:
 		if (inComp(kCharacterCath, kCarRedSleeping, 7850) && cathHasItem(kItemFirebird) && !_gameEvents[kEventVassiliCompartmentStealEgg]) {
@@ -607,9 +690,11 @@ void LogicManager::CONS_Vassili_StartPart4(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Vassili_StartPart4(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		CONS_Vassili_InPart4(0, 0, 0, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		endGraphics(kCharacterVassili);
 		getCharacter(kCharacterVassili).characterPosition.position = 8200;
 		getCharacter(kCharacterVassili).characterPosition.location = 1;
@@ -618,6 +703,9 @@ void LogicManager::HAND_Vassili_StartPart4(HAND_PARAMS) {
 		getCharacter(kCharacterVassili).clothes = 0;
 		setDoor(32, kCharacterCath, 0, 10, 9);
 		setModel(32, 1);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -632,13 +720,14 @@ void LogicManager::CONS_Vassili_InPart4(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Vassili_InPart4(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		if (inComp(kCharacterCath, kCarRedSleeping, 8200)) {
 			if (getCharacterCurrentParams(kCharacterVassili)[2] ||
 				(getCharacterCurrentParams(kCharacterVassili)[2] = _currentGameSessionTicks + getCharacterCurrentParams(kCharacterVassili)[0],
 				 _currentGameSessionTicks + getCharacterCurrentParams(kCharacterVassili)[0] != 0)) {
 				if (getCharacterCurrentParams(kCharacterVassili)[2] >= _currentGameSessionTicks)
-					return;
+					break;
 
 				getCharacterCurrentParams(kCharacterVassili)[2] = 0x7FFFFFFF;
 			}
@@ -648,17 +737,24 @@ void LogicManager::HAND_Vassili_InPart4(HAND_PARAMS) {
 		} else {
 			getCharacterCurrentParams(kCharacterVassili)[2] = 0;
 			if (getCharacterCurrentParams(kCharacterVassili)[1])
-				startCycOtis(11, "303A");
+				startCycOtis(kCharacterVassili, "303A");
 		}
-	} else if (msg->action == 12) {
+
+		break;
+	case 12:
 		getCharacterCurrentParams(kCharacterVassili)[0] = 5 * (3 * rnd(25) + 15);
-		startCycOtis(11, "303A");
-	} else if (msg->action == 18) {
+		startCycOtis(kCharacterVassili, "303A");
+		break;
+	case 18:
 		if (getCharacter(kCharacterVassili).callbacks[getCharacter(kCharacterVassili).currentCall + 8] == 1) {
-			startCycOtis(11, "303C");
+			startCycOtis(kCharacterVassili, "303C");
 			getCharacterCurrentParams(kCharacterVassili)[1] = 1;
 			getCharacterCurrentParams(kCharacterVassili)[0] = 5 * (3 * rnd(25) + 15);
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -673,13 +769,17 @@ void LogicManager::CONS_Vassili_StartPart5(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Vassili_StartPart5(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		endGraphics(kCharacterVassili);
 		getCharacter(kCharacterVassili).characterPosition.location = 1;
 		getCharacter(kCharacterVassili).characterPosition.position = 3969;
 		getCharacter(kCharacterVassili).characterPosition.car = kCarRestaurant;
 		getCharacter(kCharacterVassili).inventoryItem = kItemNone;
 		getCharacter(kCharacterVassili).clothes = 0;
+		break;
+	default:
+		break;
 	}
 }
 


Commit: 8c0ebf3e17391d36df9ba56c5b39f71cf26b9fa4
    https://github.com/scummvm/scummvm/commit/8c0ebf3e17391d36df9ba56c5b39f71cf26b9fa4
Author: AndywinXp (andywinxp at gmail.com)
Date: 2025-06-16T23:12:18+02:00

Commit Message:
LASTEXPRESS: Clean up August logic

Changed paths:
    engines/lastexpress/characters/august.cpp


diff --git a/engines/lastexpress/characters/august.cpp b/engines/lastexpress/characters/august.cpp
index f4faa34d82d..0bebad61cf6 100644
--- a/engines/lastexpress/characters/august.cpp
+++ b/engines/lastexpress/characters/august.cpp
@@ -48,7 +48,7 @@ void LogicManager::CONS_August(int chapter) {
 		CONS_August_StartPart5(0, 0, 0, 0);
 		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -69,24 +69,32 @@ void LogicManager::CONS_August_DebugWalks(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_August_DebugWalks(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 1) {
-			getCharacter(kCharacterAugust).clothes++;
-			if (getCharacter(kCharacterAugust).clothes > 2)
-				getCharacter(kCharacterAugust).clothes = 0;
-		} else if (msg->action == 12) {
-			getCharacter(kCharacterAugust).characterPosition.position = 0;
-			getCharacter(kCharacterAugust).characterPosition.location = 0;
-			getCharacter(kCharacterAugust).characterPosition.car = kCarGreenSleeping;
-			getCharacter(kCharacterAugust).inventoryItem = kItemInvalid;
-			getCharacterCurrentParams(kCharacterAugust)[0] = 10000;
-		}
-	} else if (walk(kCharacterAugust, kCarGreenSleeping, getCharacterCurrentParams(kCharacterAugust)[0])) {
-		if (getCharacterCurrentParams(kCharacterAugust)[0] == 10000) {
-			getCharacterCurrentParams(kCharacterAugust)[0] = 0;
-		} else {
-			getCharacterCurrentParams(kCharacterAugust)[0] = 10000;
+	switch (msg->action) {
+	case 0:
+		if (walk(kCharacterAugust, kCarGreenSleeping, getCharacterCurrentParams(kCharacterAugust)[0])) {
+			if (getCharacterCurrentParams(kCharacterAugust)[0] == 10000) {
+				getCharacterCurrentParams(kCharacterAugust)[0] = 0;
+			} else {
+				getCharacterCurrentParams(kCharacterAugust)[0] = 10000;
+			}
 		}
+
+		break;
+	case 1:
+		getCharacter(kCharacterAugust).clothes++;
+		if (getCharacter(kCharacterAugust).clothes > 2)
+			getCharacter(kCharacterAugust).clothes = 0;
+
+		break;
+	case 12:
+		getCharacter(kCharacterAugust).characterPosition.position = 0;
+		getCharacter(kCharacterAugust).characterPosition.location = 0;
+		getCharacter(kCharacterAugust).characterPosition.car = kCarGreenSleeping;
+		getCharacter(kCharacterAugust).inventoryItem = kItemInvalid;
+		getCharacterCurrentParams(kCharacterAugust)[0] = 10000;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -103,11 +111,12 @@ void LogicManager::CONS_August_DoWait(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_August_DoWait(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		if (getCharacterCurrentParams(kCharacterAugust)[1] ||
 			(getCharacterCurrentParams(kCharacterAugust)[1] = _gameTime + getCharacterCurrentParams(kCharacterAugust)[0], _gameTime + getCharacterCurrentParams(kCharacterAugust)[0] != 0)) {
 			if (getCharacterCurrentParams(kCharacterAugust)[1] >= _gameTime)
-				return;
+				break;
 
 			getCharacterCurrentParams(kCharacterAugust)[1] = 0x7FFFFFFF;
 		}
@@ -115,6 +124,9 @@ void LogicManager::HAND_August_DoWait(HAND_PARAMS) {
 		getCharacter(kCharacterAugust).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterAugust, _functionsAugust[getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall]]);
 		fedEx(kCharacterAugust, kCharacterAugust, 18, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -131,12 +143,17 @@ void LogicManager::CONS_August_DoSeqOtis(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_August_DoSeqOtis(HAND_PARAMS) {
-	if (msg->action == 3) {
+	switch (msg->action) {
+	case 3:
 		getCharacter(kCharacterAugust).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterAugust, _functionsAugust[getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall]]);
 		fedEx(kCharacterAugust, kCharacterAugust, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		startSeqOtis(kCharacterAugust, (char *)&getCharacterCurrentParams(kCharacterAugust)[0]);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -156,15 +173,20 @@ void LogicManager::CONS_August_DoBlockSeqOtis(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_August_DoBlockSeqOtis(HAND_PARAMS) {
-	if (msg->action == 3) {
+	switch (msg->action) {
+	case 3:
 		releaseView(kCharacterAugust, getCharacterCurrentParams(kCharacterAugust)[3], getCharacterCurrentParams(kCharacterAugust)[4]);
 
 		getCharacter(kCharacterAugust).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterAugust, _functionsAugust[getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall]]);
 		fedEx(kCharacterAugust, kCharacterAugust, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		startSeqOtis(kCharacterAugust, (char *)&getCharacterCurrentParams(kCharacterAugust)[0]);
 		blockView(kCharacterAugust, getCharacterCurrentParams(kCharacterAugust)[3], getCharacterCurrentParams(kCharacterAugust)[4]);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -183,15 +205,20 @@ void LogicManager::CONS_August_DoCorrOtis(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_August_DoCorrOtis(HAND_PARAMS) {
-	if (msg->action == 3) {
+	switch (msg->action) {
+	case 3:
 		releaseAtDoor(kCharacterAugust, getCharacterCurrentParams(kCharacterAugust)[3]);
 
 		getCharacter(kCharacterAugust).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterAugust, _functionsAugust[getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall]]);
 		fedEx(kCharacterAugust, kCharacterAugust, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		startSeqOtis(kCharacterAugust, (char *)&getCharacterCurrentParams(kCharacterAugust)[0]);
 		blockAtDoor(kCharacterAugust, getCharacterCurrentParams(kCharacterAugust)[3]);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -210,7 +237,8 @@ void LogicManager::CONS_August_DoEnterCorrOtis(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_August_DoEnterCorrOtis(HAND_PARAMS) {
-	if (msg->action == 3) {
+	switch (msg->action) {
+	case 3:
 		releaseAtDoor(kCharacterAugust, getCharacterCurrentParams(kCharacterAugust)[3]);
 		getCharacter(kCharacterAugust).characterPosition.position = 6470;
 		getCharacter(kCharacterAugust).characterPosition.location = 1;
@@ -218,7 +246,8 @@ void LogicManager::HAND_August_DoEnterCorrOtis(HAND_PARAMS) {
 		getCharacter(kCharacterAugust).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterAugust, _functionsAugust[getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall]]);
 		fedEx(kCharacterAugust, kCharacterAugust, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		startSeqOtis(kCharacterAugust, (char *)&getCharacterCurrentParams(kCharacterAugust)[0]);
 		blockAtDoor(kCharacterAugust, getCharacterCurrentParams(kCharacterAugust)[3]);
 		getCharacter(kCharacterAugust).characterPosition.location = 1;
@@ -232,6 +261,10 @@ void LogicManager::HAND_August_DoEnterCorrOtis(HAND_PARAMS) {
 			playDialog(0, "BUMP", -1, 0);
 			bumpCathFDoor(3);
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -250,17 +283,21 @@ void LogicManager::CONS_August_DoBriefCorrOtis(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_August_DoBriefCorrOtis(HAND_PARAMS) {
-	if (msg->action >= 3) {
-		if (msg->action <= 4) {
-			releaseAtDoor(kCharacterAugust, getCharacterCurrentParams(kCharacterAugust)[3]);
+	switch (msg->action) {
+	case 3:
+	case 4:
+		releaseAtDoor(kCharacterAugust, getCharacterCurrentParams(kCharacterAugust)[3]);
 
-			getCharacter(kCharacterAugust).currentCall--;
-			_engine->getMessageManager()->setMessageHandle(kCharacterAugust, _functionsAugust[getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall]]);
-			fedEx(kCharacterAugust, kCharacterAugust, 18, 0);
-		} else if (msg->action == 12) {
-			startSeqOtis(kCharacterAugust, (char *)&getCharacterCurrentParams(kCharacterAugust)[0]);
-			blockAtDoor(kCharacterAugust, getCharacterCurrentParams(kCharacterAugust)[3]);
-		}
+		getCharacter(kCharacterAugust).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterAugust, _functionsAugust[getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall]]);
+		fedEx(kCharacterAugust, kCharacterAugust, 18, 0);
+		break;
+	case 12:
+		startSeqOtis(kCharacterAugust, (char *)&getCharacterCurrentParams(kCharacterAugust)[0]);
+		blockAtDoor(kCharacterAugust, getCharacterCurrentParams(kCharacterAugust)[3]);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -275,16 +312,22 @@ void LogicManager::CONS_August_FinishSeqOtis(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_August_FinishSeqOtis(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		if (getCharacter(kCharacterAugust).direction != 4) {
 			getCharacter(kCharacterAugust).currentCall--;
 			_engine->getMessageManager()->setMessageHandle(kCharacterAugust, _functionsAugust[getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall]]);
 			fedEx(kCharacterAugust, kCharacterAugust, 18, 0);
 		}
-	} else if (msg->action == 3) {
+
+		break;
+	case 3:
 		getCharacter(kCharacterAugust).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterAugust, _functionsAugust[getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall]]);
 		fedEx(kCharacterAugust, kCharacterAugust, 18, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -321,10 +364,13 @@ void LogicManager::HAND_August_DoJoinedSeqOtis(HAND_PARAMS) {
 			fedEx(kCharacterAugust, getCharacterCurrentParams(kCharacterAugust)[3], getCharacterCurrentParams(kCharacterAugust)[4], (char *)&getCharacterCurrentParams(kCharacterAugust)[5]);
 			getCharacterCurrentParams(kCharacterAugust)[8] = 1;
 		}
+
 		break;
 	case 12:
 		startSeqOtis(kCharacterAugust, (char *)&getCharacterCurrentParams(kCharacterAugust)[0]);
 		break;
+	default:
+		break;
 	}
 }
 
@@ -344,16 +390,24 @@ void LogicManager::CONS_August_FinishJoinedSeqOtis(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_August_FinishJoinedSeqOtis(HAND_PARAMS) {
-	if (msg->action == 3) {
+	switch (msg->action) {
+	case 3:
 		if (!getCharacterCurrentParams(kCharacterAugust)[5])
 			fedEx(kCharacterAugust, getCharacterCurrentParams(kCharacterAugust)[0], getCharacterCurrentParams(kCharacterAugust)[1], (char *)&getCharacterCurrentParams(kCharacterAugust)[2]);
 
 		getCharacter(kCharacterAugust).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterAugust, _functionsAugust[getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall]]);
 		fedEx(kCharacterAugust, kCharacterAugust, 18, 0);
-	} else if (msg->action == 10 && !getCharacterCurrentParams(kCharacterAugust)[5]) {
-		fedEx(kCharacterAugust, getCharacterCurrentParams(kCharacterAugust)[0], getCharacterCurrentParams(kCharacterAugust)[1], (char *)&getCharacterCurrentParams(kCharacterAugust)[2]);
-		getCharacterCurrentParams(kCharacterAugust)[5] = 1;
+		break;
+	case 10:
+		if (!getCharacterCurrentParams(kCharacterAugust)[5]) {
+			fedEx(kCharacterAugust, getCharacterCurrentParams(kCharacterAugust)[0], getCharacterCurrentParams(kCharacterAugust)[1], (char *)&getCharacterCurrentParams(kCharacterAugust)[2]);
+			getCharacterCurrentParams(kCharacterAugust)[5] = 1;
+		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -373,13 +427,18 @@ void LogicManager::CONS_August_DoComplexSeqOtis(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_August_DoComplexSeqOtis(HAND_PARAMS) {
-	if (msg->action == 3) {
+	switch (msg->action) {
+	case 3:
 		getCharacter(kCharacterAugust).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterAugust, _functionsAugust[getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall]]);
 		fedEx(kCharacterAugust, kCharacterAugust, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		startSeqOtis(kCharacterAugust, (char *)&getCharacterCurrentParams(kCharacterAugust)[0]);
 		startSeqOtis(getCharacterCurrentParams(kCharacterAugust)[6], (char *)&getCharacterCurrentParams(kCharacterAugust)[3]);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -396,12 +455,17 @@ void LogicManager::CONS_August_DoDialog(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_August_DoDialog(HAND_PARAMS) {
-	if (msg->action == 2) {
+	switch (msg->action) {
+	case 2:
 		getCharacter(kCharacterAugust).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterAugust, _functionsAugust[getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall]]);
 		fedEx(kCharacterAugust, kCharacterAugust, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		playDialog(kCharacterAugust, (char *)&getCharacterCurrentParams(kCharacterAugust)[0], -1, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -418,12 +482,17 @@ void LogicManager::CONS_August_DoDialogFullVol(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_August_DoDialogFullVol(HAND_PARAMS) {
-	if (msg->action == 2) {
+	switch (msg->action) {
+	case 2:
 		getCharacter(kCharacterAugust).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterAugust, _functionsAugust[getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall]]);
 		fedEx(kCharacterAugust, kCharacterAugust, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		playDialog(kCharacterAugust, (char *)&getCharacterCurrentParams(kCharacterAugust)[0], 16, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -438,16 +507,18 @@ void LogicManager::CONS_August_WaitRCClear(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_August_WaitRCClear(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
+	case 12:
 		if (rcClear()) {
 			getCharacter(kCharacterAugust).currentCall--;
 			_engine->getMessageManager()->setMessageHandle(kCharacterAugust, _functionsAugust[getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall]]);
 			fedEx(kCharacterAugust, kCharacterAugust, 18, 0);
 		}
-	} else if (msg->action == 12 && rcClear()) {
-		getCharacter(kCharacterAugust).currentCall--;
-		_engine->getMessageManager()->setMessageHandle(kCharacterAugust, _functionsAugust[getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall]]);
-		fedEx(kCharacterAugust, kCharacterAugust, 18, 0);
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -465,22 +536,25 @@ void LogicManager::CONS_August_SaveGame(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_August_SaveGame(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			save(
-				kCharacterAugust,
-				getCharacterCurrentParams(kCharacterAugust)[0],
-				getCharacterCurrentParams(kCharacterAugust)[1]
-			);
+	switch (msg->action) {
+	case 0:
+		getCharacter(kCharacterAugust).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterAugust, _functionsAugust[getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall]]);
+		fedEx(kCharacterAugust, kCharacterAugust, 18, 0);
+		break;
+	case 12:
+		save(
+			kCharacterAugust,
+			getCharacterCurrentParams(kCharacterAugust)[0],
+			getCharacterCurrentParams(kCharacterAugust)[1]
+		);
 
-			getCharacter(kCharacterAugust).currentCall--;
-			_engine->getMessageManager()->setMessageHandle(kCharacterAugust, _functionsAugust[getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall]]);
-			fedEx(kCharacterAugust, kCharacterAugust, 18, 0);
-		}
-	} else {
 		getCharacter(kCharacterAugust).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterAugust, _functionsAugust[getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall]]);
 		fedEx(kCharacterAugust, kCharacterAugust, 18, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -500,11 +574,13 @@ void LogicManager::CONS_August_DoWalk(CONS_PARAMS) {
 void LogicManager::HAND_August_DoWalk(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
+	case 12:
 		if (walk(kCharacterAugust, getCharacterCurrentParams(kCharacterAugust)[0], getCharacterCurrentParams(kCharacterAugust)[1])) {
 			getCharacter(kCharacterAugust).currentCall--;
 			_engine->getMessageManager()->setMessageHandle(kCharacterAugust, _functionsAugust[getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall]]);
 			fedEx(kCharacterAugust, kCharacterAugust, 18, 0);
 		}
+
 		break;
 	case 5:
 		if (_gameProgress[kProgressEventMetAugust]) {
@@ -516,19 +592,13 @@ void LogicManager::HAND_August_DoWalk(HAND_PARAMS) {
 		} else {
 			playCathExcuseMe();
 		}
+
 		break;
 	case 6:
 		playChrExcuseMe(kCharacterAugust, kCharacterCath, 0);
 		break;
-	case 12:
-		if (walk(kCharacterAugust, getCharacterCurrentParams(kCharacterAugust)[0], getCharacterCurrentParams(kCharacterAugust)[1])) {
-			getCharacter(kCharacterAugust).currentCall--;
-			_engine->getMessageManager()->setMessageHandle(kCharacterAugust, _functionsAugust[getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall]]);
-			fedEx(kCharacterAugust, kCharacterAugust, 18, 0);
-		}
-		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -545,60 +615,78 @@ void LogicManager::CONS_August_LookingForCath(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_August_LookingForCath(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			getCharacterParams(kCharacterAugust, 8)[0] = 0;
-			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 1;
-			AugustCall(&LogicManager::CONS_August_DoWalkSearchingForCath, 4, 540, 0, 0);
-		} else if (msg->action == 18) {
-			switch (getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8]) {
-			case 1:
-				if (!getCharacterParams(kCharacterAugust, 8)[0])
-					goto LABEL_23;
-				goto LABEL_22;
-			case 2:
-			case 3:
-				if (getCharacterParams(kCharacterAugust, 8)[0])
-					goto LABEL_22;
-				endGraphics(kCharacterAugust);
-				getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 4;
-				AugustCall(&LogicManager::CONS_August_DoWait, 450, 0, 0, 0);
-				break;
-			case 4:
-				getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 5;
-				AugustCall(&LogicManager::CONS_August_DoWalkSearchingForCath, 4, 540, 0, 0);
-				return;
-			case 5:
-				if (getCharacterParams(kCharacterAugust, 8)[0]) {
-				LABEL_22:
-					getCharacter(kCharacterAugust).currentCall--;
-					_engine->getMessageManager()->setMessageHandle(kCharacterAugust, _functionsAugust[getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall]]);
-					fedEx(kCharacterAugust, kCharacterAugust, 18, 0);
+	switch (msg->action) {
+	case 0:
+		if (getCharacterCurrentParams(kCharacterAugust)[0] >= _gameTime || getCharacterCurrentParams(kCharacterAugust)[1]) {
+			if (cathInCorridor(kCarGreenSleeping) || cathInCorridor(kCarRedSleeping)) {
+				if (checkLoc(kCharacterCath, kCarGreenSleeping)) {
+					getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 2;
+					AugustCall(&LogicManager::CONS_August_DoWalkSearchingForCath, 3, 540, 0, 0);
 				} else {
-				LABEL_23:
-					endGraphics(kCharacterAugust);
+					getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 3;
+					AugustCall(&LogicManager::CONS_August_DoWalkSearchingForCath, 4, 9460, 0, 0);
 				}
-				break;
-			default:
-				return;
 			}
+		} else {
+			getCharacterCurrentParams(kCharacterAugust)[1] = 1;
+
+			getCharacter(kCharacterAugust).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterAugust, _functionsAugust[getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall]]);
+			fedEx(kCharacterAugust, kCharacterAugust, 18, 0);
 		}
-	} else if (getCharacterCurrentParams(kCharacterAugust)[0] >= _gameTime || getCharacterCurrentParams(kCharacterAugust)[1]) {
-		if (cathInCorridor(kCarGreenSleeping) || cathInCorridor(kCarRedSleeping)) {
-			if (checkLoc(kCharacterCath, kCarGreenSleeping)) {
-				getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 2;
-				AugustCall(&LogicManager::CONS_August_DoWalkSearchingForCath, 3, 540, 0, 0);
+
+		break;
+	case 12:
+		getCharacterParams(kCharacterAugust, 8)[0] = 0;
+		getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 1;
+		AugustCall(&LogicManager::CONS_August_DoWalkSearchingForCath, 4, 540, 0, 0);
+		break;
+	case 18:
+		switch (getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8]) {
+		case 1:
+			if (!getCharacterParams(kCharacterAugust, 8)[0]) {
+				endGraphics(kCharacterAugust);
 			} else {
-				getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 3;
-				AugustCall(&LogicManager::CONS_August_DoWalkSearchingForCath, 4, 9460, 0, 0);
+				getCharacter(kCharacterAugust).currentCall--;
+				_engine->getMessageManager()->setMessageHandle(kCharacterAugust, _functionsAugust[getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall]]);
+				fedEx(kCharacterAugust, kCharacterAugust, 18, 0);
+			}
+
+			break;
+		case 2:
+		case 3:
+			if (getCharacterParams(kCharacterAugust, 8)[0]) {
+				getCharacter(kCharacterAugust).currentCall--;
+				_engine->getMessageManager()->setMessageHandle(kCharacterAugust, _functionsAugust[getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall]]);
+				fedEx(kCharacterAugust, kCharacterAugust, 18, 0);
+			} else {
+				endGraphics(kCharacterAugust);
+				getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 4;
+				AugustCall(&LogicManager::CONS_August_DoWait, 450, 0, 0, 0);
+			}
+
+			break;
+		case 4:
+			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 5;
+			AugustCall(&LogicManager::CONS_August_DoWalkSearchingForCath, 4, 540, 0, 0);
+			break;
+		case 5:
+			if (getCharacterParams(kCharacterAugust, 8)[0]) {
+				getCharacter(kCharacterAugust).currentCall--;
+				_engine->getMessageManager()->setMessageHandle(kCharacterAugust, _functionsAugust[getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall]]);
+				fedEx(kCharacterAugust, kCharacterAugust, 18, 0);
+			} else {
+				endGraphics(kCharacterAugust);
 			}
+
+			break;
+		default:
+			break;
 		}
-	} else {
-		getCharacterCurrentParams(kCharacterAugust)[1] = 1;
 
-		getCharacter(kCharacterAugust).currentCall--;
-		_engine->getMessageManager()->setMessageHandle(kCharacterAugust, _functionsAugust[getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall]]);
-		fedEx(kCharacterAugust, kCharacterAugust, 18, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -616,18 +704,13 @@ void LogicManager::CONS_August_DoWalkSearchingForCath(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_August_DoWalkSearchingForCath(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12 && walk(kCharacterAugust, getCharacterCurrentParams(kCharacterAugust)[0], getCharacterCurrentParams(kCharacterAugust)[1]))
-			goto LABEL_13;
-	} else {
+	switch (msg->action) {
+	case 0:
 		if (walk(kCharacterAugust, getCharacterCurrentParams(kCharacterAugust)[0], getCharacterCurrentParams(kCharacterAugust)[1])) {
-		LABEL_13:
 			getCharacter(kCharacterAugust).currentCall--;
 			_engine->getMessageManager()->setMessageHandle(kCharacterAugust, _functionsAugust[getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall]]);
 			fedEx(kCharacterAugust, kCharacterAugust, 18, 0);
-			return;
-		}
-		if (nearChar(kCharacterAugust, kCharacterCath, 1000) && !onLowPlatform(kCharacterCath) && !inComp(kCharacterCath) && !whoOutside(kCharacterCath)) {
+		} else if (nearChar(kCharacterAugust, kCharacterCath, 1000) && !onLowPlatform(kCharacterCath) && !inComp(kCharacterCath) && !whoOutside(kCharacterCath)) {
 			if (getCharacter(kCharacterAugust).characterPosition.car == kCarGreenSleeping || getCharacter(kCharacterAugust).characterPosition.car == kCarRedSleeping) {
 				getCharacterParams(kCharacterAugust, 8)[0] = 1;
 
@@ -636,6 +719,18 @@ void LogicManager::HAND_August_DoWalkSearchingForCath(HAND_PARAMS) {
 				fedEx(kCharacterAugust, kCharacterAugust, 18, 0);
 			}
 		}
+
+		break;
+	case 12:
+		if (walk(kCharacterAugust, getCharacterCurrentParams(kCharacterAugust)[0], getCharacterCurrentParams(kCharacterAugust)[1])) {
+			getCharacter(kCharacterAugust).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterAugust, _functionsAugust[getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall]]);
+			fedEx(kCharacterAugust, kCharacterAugust, 18, 0);
+		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -653,43 +748,13 @@ void LogicManager::CONS_August_EnterComp(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_August_EnterComp(HAND_PARAMS) {
-	if (msg->action > 12) {
-		if (msg->action == 18) {
-			switch (getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8]) {
-			case 1:
-				Common::strcpy_s((char *)&getCharacterCurrentParams(kCharacterAugust)[5], 12, (char *)&getCharacterCurrentParams(kCharacterAugust)[2]);
-				Common::strcat_s((char *)&getCharacterCurrentParams(kCharacterAugust)[5], 12, "Qc");
-				startCycOtis(kCharacterAugust, (char *)&getCharacterCurrentParams(kCharacterAugust)[5]);
-				if (getCharacterCurrentParams(kCharacterAugust)[1])
-					getCharacter(kCharacterAugust).inventoryItem = 147;
-				break;
-			case 2:
-				Common::strcpy_s((char *)&getCharacterCurrentParams(kCharacterAugust)[5], 12, (char *)&getCharacterCurrentParams(kCharacterAugust)[2]);
-				if (getCharacterCurrentParams(kCharacterAugust)[0]) {
-					Common::strcat_s((char *)&getCharacterCurrentParams(kCharacterAugust)[5], 12, "Fc");
-				} else {
-					Common::strcat_s((char *)&getCharacterCurrentParams(kCharacterAugust)[5], 12, "Dc");
-				}
-
-				getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 3;
-				AugustCall(&LogicManager::CONS_August_DoEnterCorrOtis, (char *)&getCharacterCurrentParams(kCharacterAugust)[5], 3, 0, 0);
-				break;
-			case 3:
-				softReleaseAtDoor(kCharacterAugust, 3);
-				getCharacter(kCharacterAugust).characterPosition.location = 1;
-				endGraphics(kCharacterAugust);
-
-				getCharacter(kCharacterAugust).currentCall--;
-				_engine->getMessageManager()->setMessageHandle(kCharacterAugust, _functionsAugust[getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall]]);
-				fedEx(kCharacterAugust, kCharacterAugust, 18, 0);
-				break;
-			}
-		} else if (msg->action == 69239528) {
-			getCharacter(kCharacterAugust).inventoryItem = 0;
-			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 2;
-			AugustCall(&LogicManager::CONS_August_DoWait, 75, 0, 0, 0);
-		}
-	} else if (msg->action == 12) {
+	switch (msg->action) {
+	case 1:
+		getCharacter(kCharacterAugust).inventoryItem = 0;
+		playDialog(kCharacterCath, "CAT1002", -1, 0);
+		playDialog(kCharacterAugust, "AUG3101", -1, 15);
+		break;
+	case 12:
 		getCharacter(kCharacterAugust).inventoryItem = 0;
 		switch (_gameProgress[kProgressChapter]) {
 		case 1:
@@ -719,10 +784,49 @@ void LogicManager::HAND_August_EnterComp(HAND_PARAMS) {
 		softBlockAtDoor(kCharacterAugust, 3);
 		getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 1;
 		AugustCall(&LogicManager::CONS_August_DoDialog, "AUG2096", 0, 0, 0);
-	} else if (msg->action == 1) {
+		break;
+	case 18:
+		switch (getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8]) {
+		case 1:
+			Common::strcpy_s((char *)&getCharacterCurrentParams(kCharacterAugust)[5], 12, (char *)&getCharacterCurrentParams(kCharacterAugust)[2]);
+			Common::strcat_s((char *)&getCharacterCurrentParams(kCharacterAugust)[5], 12, "Qc");
+			startCycOtis(kCharacterAugust, (char *)&getCharacterCurrentParams(kCharacterAugust)[5]);
+			if (getCharacterCurrentParams(kCharacterAugust)[1])
+				getCharacter(kCharacterAugust).inventoryItem = 147;
+
+			break;
+		case 2:
+			Common::strcpy_s((char *)&getCharacterCurrentParams(kCharacterAugust)[5], 12, (char *)&getCharacterCurrentParams(kCharacterAugust)[2]);
+			if (getCharacterCurrentParams(kCharacterAugust)[0]) {
+				Common::strcat_s((char *)&getCharacterCurrentParams(kCharacterAugust)[5], 12, "Fc");
+			} else {
+				Common::strcat_s((char *)&getCharacterCurrentParams(kCharacterAugust)[5], 12, "Dc");
+			}
+
+			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 3;
+			AugustCall(&LogicManager::CONS_August_DoEnterCorrOtis, (char *)&getCharacterCurrentParams(kCharacterAugust)[5], 3, 0, 0);
+			break;
+		case 3:
+			softReleaseAtDoor(kCharacterAugust, 3);
+			getCharacter(kCharacterAugust).characterPosition.location = 1;
+			endGraphics(kCharacterAugust);
+
+			getCharacter(kCharacterAugust).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterAugust, _functionsAugust[getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall]]);
+			fedEx(kCharacterAugust, kCharacterAugust, 18, 0);
+			break;
+		default:
+			break;
+		}
+
+		break;
+	case 69239528:
 		getCharacter(kCharacterAugust).inventoryItem = 0;
-		playDialog(kCharacterCath, "CAT1002", -1, 0);
-		playDialog(kCharacterAugust, "AUG3101", -1, 15);
+		getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 2;
+		AugustCall(&LogicManager::CONS_August_DoWait, 75, 0, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -793,6 +897,7 @@ void LogicManager::HAND_August_ExitComp(HAND_PARAMS) {
 			Common::strcat_s((char *)&getCharacterCurrentParams(kCharacterAugust)[4], 12, "Qc");
 			startCycOtis(kCharacterAugust, (char *)&getCharacterCurrentParams(kCharacterAugust)[4]);
 		}
+
 		break;
 	case 69239528:
 		setDoor(3, kCharacterCath, 1, 10, 9);
@@ -802,6 +907,8 @@ void LogicManager::HAND_August_ExitComp(HAND_PARAMS) {
 		_engine->getMessageManager()->setMessageHandle(kCharacterAugust, _functionsAugust[getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall]]);
 		fedEx(kCharacterAugust, kCharacterAugust, 18, 0);
 		break;
+	default:
+		break;
 	}
 }
 
@@ -818,264 +925,306 @@ void LogicManager::CONS_August_CompLogic(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_August_CompLogic(HAND_PARAMS) {
-	if (msg->action <= 8) {
-		if (msg->action != 8) {
-			if (msg->action)
-				return;
-
-			if (!getCharacterCurrentParams(kCharacterAugust)[3] && getCharacterCurrentParams(kCharacterAugust)[0] < _gameTime && !getCharacterCurrentParams(kCharacterAugust)[6]) {
-				getCharacterCurrentParams(kCharacterAugust)[6] = 1;
-				setDoor(3, kCharacterCath, 0, 10, 9);
+	switch (msg->action) {
+	case 0:
+		if (!getCharacterCurrentParams(kCharacterAugust)[3] && getCharacterCurrentParams(kCharacterAugust)[0] < _gameTime && !getCharacterCurrentParams(kCharacterAugust)[6]) {
+			getCharacterCurrentParams(kCharacterAugust)[6] = 1;
+			setDoor(3, kCharacterCath, 0, 10, 9);
 
-				getCharacter(kCharacterAugust).currentCall--;
-				_engine->getMessageManager()->setMessageHandle(kCharacterAugust, _functionsAugust[getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall]]);
-				fedEx(kCharacterAugust, kCharacterAugust, 18, 0);
-				return;
-			}
-			if (getCharacterCurrentParams(kCharacterAugust)[1]) {
-				if (getCharacterCurrentParams(kCharacterAugust)[7] ||
-					(getCharacterCurrentParams(kCharacterAugust)[7] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
-					if (getCharacterCurrentParams(kCharacterAugust)[7] >= _currentGameSessionTicks)
-						goto LABEL_31;
-					getCharacterCurrentParams(kCharacterAugust)[7] = 0x7FFFFFFF;
-				}
+			getCharacter(kCharacterAugust).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterAugust, _functionsAugust[getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall]]);
+			fedEx(kCharacterAugust, kCharacterAugust, 18, 0);
+			break;
+		}
 
-				getCharacterCurrentParams(kCharacterAugust)[1] = 0;
-				getCharacterCurrentParams(kCharacterAugust)[2] = 1;
+		if (getCharacterCurrentParams(kCharacterAugust)[1]) {
+			if (getCharacterCurrentParams(kCharacterAugust)[7] ||
+				(getCharacterCurrentParams(kCharacterAugust)[7] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
+				if (getCharacterCurrentParams(kCharacterAugust)[7] >= _currentGameSessionTicks) {
+					if (_gameProgress[kProgressChapter] == 1) {
+						if (getCharacterCurrentParams(kCharacterAugust)[5] != 0) {
+							if (getCharacterCurrentParams(kCharacterAugust)[8] ||
+								(getCharacterCurrentParams(kCharacterAugust)[8] = _gameTime + 6300, _gameTime != -6300)) {
+								if (getCharacterCurrentParams(kCharacterAugust)[8] >= _gameTime) {
+
+									if (!getCharacterCurrentParams(kCharacterAugust)[3] && !_gameProgress[kProgressEventMetAugust] && !getCharacterCurrentParams(kCharacterAugust)[5] && getCharacterCurrentParams(kCharacterAugust)[0] - 4500 > _gameTime && !_gameProgress[kProgressField14]) {
+										_gameProgress[kProgressField14] = 2;
+										getCharacter(kCharacterAugust).characterPosition.location = 0;
+										getCharacter(kCharacterAugust).characterPosition.position = 8200;
+										getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 1;
+										AugustCall(&LogicManager::CONS_August_ExitComp, 0, 0, 0, 0);
+									}
+
+									break;
+								}
+
+								getCharacterCurrentParams(kCharacterAugust)[8] = 0x7FFFFFFF;
+							}
+
+							getCharacterCurrentParams(kCharacterAugust)[5] = 0;
+							getCharacterCurrentParams(kCharacterAugust)[8] = 0;
+						}
 
-				if (_gameProgress[kProgressEventMetAugust] || _gameProgress[kProgressJacket] != 2) {
-					setDoor(3, kCharacterAugust, 1, 0, 0);
-				} else {
-					setDoor(3, kCharacterAugust, 1, 0, 9);
-				}
-			}
-			getCharacterCurrentParams(kCharacterAugust)[7] = 0;
-		LABEL_31:
-			if (_gameProgress[kProgressChapter] != 1)
-				return;
-			if (!getCharacterCurrentParams(kCharacterAugust)[5])
-				goto LABEL_38;
-			if (getCharacterCurrentParams(kCharacterAugust)[8] ||
-				(getCharacterCurrentParams(kCharacterAugust)[8] = _gameTime + 6300, _gameTime != -6300)) {
-				if (getCharacterCurrentParams(kCharacterAugust)[8] >= _gameTime) {
-				LABEL_38:
-					if (!getCharacterCurrentParams(kCharacterAugust)[3] && !_gameProgress[kProgressEventMetAugust] && !getCharacterCurrentParams(kCharacterAugust)[5] && getCharacterCurrentParams(kCharacterAugust)[0] - 4500 > _gameTime && !_gameProgress[kProgressField14]) {
-						_gameProgress[kProgressField14] = 2;
-						getCharacter(kCharacterAugust).characterPosition.location = 0;
-						getCharacter(kCharacterAugust).characterPosition.position = 8200;
-						getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 1;
-						AugustCall(&LogicManager::CONS_August_ExitComp, 0, 0, 0, 0);
+						if (!getCharacterCurrentParams(kCharacterAugust)[3] && !_gameProgress[kProgressEventMetAugust] && !getCharacterCurrentParams(kCharacterAugust)[5] && getCharacterCurrentParams(kCharacterAugust)[0] - 4500 > _gameTime && !_gameProgress[kProgressField14]) {
+							_gameProgress[kProgressField14] = 2;
+							getCharacter(kCharacterAugust).characterPosition.location = 0;
+							getCharacter(kCharacterAugust).characterPosition.position = 8200;
+							getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 1;
+							AugustCall(&LogicManager::CONS_August_ExitComp, 0, 0, 0, 0);
+						}
 					}
-					return;
+
+					break;
 				}
-				getCharacterCurrentParams(kCharacterAugust)[8] = 0x7FFFFFFF;
+
+				getCharacterCurrentParams(kCharacterAugust)[7] = 0x7FFFFFFF;
 			}
-			getCharacterCurrentParams(kCharacterAugust)[5] = 0;
-			getCharacterCurrentParams(kCharacterAugust)[8] = 0;
-			goto LABEL_38;
-		}
-		goto LABEL_93;
-	}
-	if (msg->action > 12) {
-		if (msg->action > 124697504) {
-			if (msg->action == 192849856) {
-				getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 17;
-				AugustCall(&LogicManager::CONS_August_DoCorrOtis, "626Kc", 3, 0, 0);
-			} else if (msg->action == 221617184) {
-				getCharacterCurrentParams(kCharacterAugust)[3] = 1;
-				send(kCharacterAugust, kCharacterCond1, 102675536, 0);
-				getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 14;
-				AugustCall(&LogicManager::CONS_August_DoDialog, "CON1023", 0, 0, 0);
+
+			getCharacterCurrentParams(kCharacterAugust)[1] = 0;
+			getCharacterCurrentParams(kCharacterAugust)[2] = 1;
+
+			if (_gameProgress[kProgressEventMetAugust] || _gameProgress[kProgressJacket] != 2) {
+				setDoor(3, kCharacterAugust, 1, 0, 0);
+			} else {
+				setDoor(3, kCharacterAugust, 1, 0, 9);
 			}
-		} else {
-			switch (msg->action) {
-			case 124697504:
-				playDialog(kCharacterAugust, "CON1023A", -1, 0);
-				getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 18;
-				AugustCall(&LogicManager::CONS_August_DoCorrOtis, "626Mc", 3, 0, 0);
-				break;
-			case 17:
-				if (getCharacterCurrentParams(kCharacterAugust)[2] || getCharacterCurrentParams(kCharacterAugust)[1]) {
-					setDoor(3, kCharacterAugust, 1, 10, 9);
-					getCharacterCurrentParams(kCharacterAugust)[2] = 0;
-					getCharacterCurrentParams(kCharacterAugust)[1] = 0;
-					getCharacterCurrentParams(kCharacterAugust)[4] = 0;
-				}
-				break;
-			case 18:
-				switch (getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8]) {
-				case 1:
-					getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 2;
-					AugustCall(&LogicManager::CONS_August_DoWalk, 3, 8200, 0, 0);
-					break;
-				case 2:
-					getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 3;
-					AugustCall(&LogicManager::CONS_August_KnockTyler, getCharacterCurrentParams(kCharacterAugust)[0] - 2700, 0, 0, 0);
-					break;
-				case 3:
-					getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 4;
-					AugustCall(&LogicManager::CONS_August_DoWalk, 3, 6470, 0, 0);
-					break;
-				case 4:
-					getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 5;
-					AugustCall(&LogicManager::CONS_August_EnterComp, 0, 0, 0, 0);
-					break;
-				case 5:
-					if (_gameProgress[kProgressField14] == 2)
-						_gameProgress[kProgressField14] = 0;
-					getCharacterCurrentParams(kCharacterAugust)[5] = 1;
-					getCharacterCurrentParams(kCharacterAugust)[1] = 0;
-					getCharacterCurrentParams(kCharacterAugust)[2] = 0;
-					setDoor(3, kCharacterAugust, 1, 10, 9);
-					getCharacterCurrentParams(kCharacterAugust)[4] = 0;
-					getCharacterCurrentParams(kCharacterAugust)[8] = 0;
-					break;
-				case 6:
-					if (getModel(3) == 1)
-						playNIS(kEventMeetAugustHisCompartmentBed);
-					else
-						playNIS(kEventMeetAugustHisCompartment);
-					_gameProgress[kProgressEventMetAugust] = 1;
-					setDoor(3, 2, 1, 0, 0);
-					getCharacterCurrentParams(kCharacterAugust)[1] = 0;
-					getCharacterCurrentParams(kCharacterAugust)[2] = 1;
-					bumpCathFDoor(3);
-					break;
-				case 7:
-				case 8:
-					getCharacterCurrentParams(kCharacterAugust)[4]++;
-					switch (getCharacterCurrentParams(kCharacterAugust)[4]) {
-					case 1:
-						getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 9;
-						if (rnd(2) == 0) {
-							AugustCall(&LogicManager::CONS_August_DoDialog, "AUG1128B", 0, 0, 0);
-						} else {
-							AugustCall(&LogicManager::CONS_August_DoDialog, "AUG1128A", 0, 0, 0);
-						}
-						break;
-					case 2:
-						getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 10;
-						if (!_gameProgress[kProgressEventMetAugust]) {
-							AugustCall(&LogicManager::CONS_August_DoDialog, "AUG1128G", 0, 0, 0);
-						} else {
-							AugustCall(&LogicManager::CONS_August_DoDialog, "AUG1128E", 0, 0, 0);
-						}
-						break;
-					case 3:
-						getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 11;
-						if (!_gameProgress[kProgressEventMetAugust]) {
-							AugustCall(&LogicManager::CONS_August_DoDialog, "AUG1128H", 0, 0, 0);
-						} else {
-							AugustCall(&LogicManager::CONS_August_DoDialog, "AUG1128F", 0, 0, 0);
-						}
+		}
 
-						break;
-					default:
-						if (_gameProgress[kProgressEventMetAugust] || _gameProgress[kProgressJacket] != 2) {
-							setDoor(3, kCharacterAugust, 1, 14, 0);
-						} else {
-							setDoor(3, kCharacterAugust, 1, 14, 9);
+		getCharacterCurrentParams(kCharacterAugust)[7] = 0;
+
+		if (_gameProgress[kProgressChapter] == 1) {
+			if (getCharacterCurrentParams(kCharacterAugust)[5] != 0) {
+				if (getCharacterCurrentParams(kCharacterAugust)[8] ||
+					(getCharacterCurrentParams(kCharacterAugust)[8] = _gameTime + 6300, _gameTime != -6300)) {
+					if (getCharacterCurrentParams(kCharacterAugust)[8] >= _gameTime) {
+
+						if (!getCharacterCurrentParams(kCharacterAugust)[3] && !_gameProgress[kProgressEventMetAugust] && !getCharacterCurrentParams(kCharacterAugust)[5] && getCharacterCurrentParams(kCharacterAugust)[0] - 4500 > _gameTime && !_gameProgress[kProgressField14]) {
+							_gameProgress[kProgressField14] = 2;
+							getCharacter(kCharacterAugust).characterPosition.location = 0;
+							getCharacter(kCharacterAugust).characterPosition.position = 8200;
+							getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 1;
+							AugustCall(&LogicManager::CONS_August_ExitComp, 0, 0, 0, 0);
 						}
 
-						getCharacterCurrentParams(kCharacterAugust)[1] = 1;
 						break;
 					}
-					
-					break;
-				case 9:
-				case 10:
-				case 11:
-					if (_gameProgress[kProgressEventMetAugust] || _gameProgress[kProgressJacket] != 2) {
-						setDoor(3, kCharacterAugust, 1, 14, 0);
-					} else {
-						setDoor(3, kCharacterAugust, 1, 14, 9);
-					}
-					
-					getCharacterCurrentParams(kCharacterAugust)[1] = 1;
-					break;
-				case 12:
-				case 13:
-					if (_gameProgress[kProgressEventMetAugust] || _gameProgress[kProgressJacket] != 2) {
-						setDoor(3, kCharacterAugust, 1, 0, 0);
+
+					getCharacterCurrentParams(kCharacterAugust)[8] = 0x7FFFFFFF;
+				}
+
+				getCharacterCurrentParams(kCharacterAugust)[5] = 0;
+				getCharacterCurrentParams(kCharacterAugust)[8] = 0;
+			}
+
+			if (!getCharacterCurrentParams(kCharacterAugust)[3] && !_gameProgress[kProgressEventMetAugust] && !getCharacterCurrentParams(kCharacterAugust)[5] && getCharacterCurrentParams(kCharacterAugust)[0] - 4500 > _gameTime && !_gameProgress[kProgressField14]) {
+				_gameProgress[kProgressField14] = 2;
+				getCharacter(kCharacterAugust).characterPosition.location = 0;
+				getCharacter(kCharacterAugust).characterPosition.position = 8200;
+				getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 1;
+				AugustCall(&LogicManager::CONS_August_ExitComp, 0, 0, 0, 0);
+			}
+		}
+
+		break;
+	case 8:
+	case 9:
+		if (msg->action == 9 && _gameProgress[kProgressChapter] == 1 && !_gameProgress[kProgressEventMetAugust] && _gameProgress[kProgressJacket] == 2) {
+			setDoor(9, kCharacterCath, 0, 255, 255);
+			getCharacter(kCharacterCath).characterPosition.location = 1;
+			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 6;
+			AugustCall(&LogicManager::CONS_August_SaveGame, 2, kEventMeetAugustHisCompartment, 0, 0);
+		} else if (getCharacterCurrentParams(kCharacterAugust)[1]) {
+			setDoor(3, kCharacterAugust, 1, 0, 0);
+			if (cathHasItem(kItemPassengerList)) {
+				getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 12;
+				if (rnd(2)) {
+					AugustCall(&LogicManager::CONS_August_DoDialog, getCathSorryDialog(), 0, 0, 0);
+				} else {
+					if (rnd(2) == 0) {
+						AugustCall(&LogicManager::CONS_August_DoDialog, "CAT1502A", 0, 0, 0);
 					} else {
-						setDoor(3, kCharacterAugust, 1, 0, 9);
+						AugustCall(&LogicManager::CONS_August_DoDialog, "CAT1502", 0, 0, 0);
 					}
-
-					getCharacterCurrentParams(kCharacterAugust)[1] = 0;
-					getCharacterCurrentParams(kCharacterAugust)[2] = 1;
-					break;
-				case 14:
-					getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 15;
-					AugustCall(&LogicManager::CONS_August_DoWait, 75, 0, 0, 0);
-					break;
-				case 15:
-					getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 16;
-					AugustCall(&LogicManager::CONS_August_DoDialog, "AUG1128I", 0, 0, 0);
-					break;
-				case 16:
-					send(kCharacterAugust, kCharacterCond1, 100906246, 0);
-					break;
-				case 17:
-					getCharacter(kCharacterAugust).characterPosition.location = 0;
-					send(kCharacterAugust, kCharacterCond1, 156567128, 0);
-					startCycOtis(kCharacterAugust, "626Lc");
-					softBlockAtDoor(kCharacterAugust, 3);
-					break;
-				case 18:
-					softReleaseAtDoor(kCharacterAugust, 3);
-					getCharacter(kCharacterAugust).characterPosition.location = 6470;
-					endGraphics(kCharacterAugust);
-					setDoor(3, kCharacterAugust, 1, 10, 9);
-					getCharacterCurrentParams(kCharacterAugust)[3] = 0;
-					break;
-				default:
-					return;
 				}
-				break;
+			} else {
+				getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 13;
+				AugustCall(&LogicManager::CONS_August_DoDialog, getCathSorryDialog(), 0, 0, 0);
+			}
+		} else {
+			setDoor(3, kCharacterAugust, 1, 0, 0);
+			if (msg->action == 8) {
+				getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 7;
+				AugustCall(&LogicManager::CONS_August_DoDialog, "LIB012", 0, 0, 0);
+			} else {
+				getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 8;
+				AugustCall(&LogicManager::CONS_August_DoDialog, "LIB013", 0, 0, 0);
 			}
 		}
-	} else {
-		if (msg->action == 12) {
+
+		break;
+	case 12:
+		setDoor(3, kCharacterAugust, 1, 10, 9);
+		break;
+	case 17:
+		if (getCharacterCurrentParams(kCharacterAugust)[2] || getCharacterCurrentParams(kCharacterAugust)[1]) {
 			setDoor(3, kCharacterAugust, 1, 10, 9);
-			return;
+			getCharacterCurrentParams(kCharacterAugust)[2] = 0;
+			getCharacterCurrentParams(kCharacterAugust)[1] = 0;
+			getCharacterCurrentParams(kCharacterAugust)[4] = 0;
 		}
-		if (msg->action == 9) {
-			if (_gameProgress[kProgressChapter] == 1 && !_gameProgress[kProgressEventMetAugust] && _gameProgress[kProgressJacket] == 2) {
-				setDoor(9, kCharacterCath, 0, 255, 255);
-				getCharacter(kCharacterCath).characterPosition.location = 1;
-				getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 6;
-				AugustCall(&LogicManager::CONS_August_SaveGame, 2, kEventMeetAugustHisCompartment, 0, 0);
-				return;
-			}
-		LABEL_93:
-			if (getCharacterCurrentParams(kCharacterAugust)[1]) {
-				setDoor(3, kCharacterAugust, 1, 0, 0);
-				if (cathHasItem(kItemPassengerList)) {
-					getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 12;
-					if (rnd(2)) {
-						AugustCall(&LogicManager::CONS_August_DoDialog, getCathSorryDialog(), 0, 0, 0);
-					} else {
-						if (rnd(2) == 0) {
-							AugustCall(&LogicManager::CONS_August_DoDialog, "CAT1502A", 0, 0, 0);
-						} else {
-							AugustCall(&LogicManager::CONS_August_DoDialog, "CAT1502", 0, 0, 0);
-						}
-					}
+
+		break;
+	case 18:
+		switch (getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8]) {
+		case 1:
+			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 2;
+			AugustCall(&LogicManager::CONS_August_DoWalk, 3, 8200, 0, 0);
+			break;
+		case 2:
+			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 3;
+			AugustCall(&LogicManager::CONS_August_KnockTyler, getCharacterCurrentParams(kCharacterAugust)[0] - 2700, 0, 0, 0);
+			break;
+		case 3:
+			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 4;
+			AugustCall(&LogicManager::CONS_August_DoWalk, 3, 6470, 0, 0);
+			break;
+		case 4:
+			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 5;
+			AugustCall(&LogicManager::CONS_August_EnterComp, 0, 0, 0, 0);
+			break;
+		case 5:
+			if (_gameProgress[kProgressField14] == 2)
+				_gameProgress[kProgressField14] = 0;
+			getCharacterCurrentParams(kCharacterAugust)[5] = 1;
+			getCharacterCurrentParams(kCharacterAugust)[1] = 0;
+			getCharacterCurrentParams(kCharacterAugust)[2] = 0;
+			setDoor(3, kCharacterAugust, 1, 10, 9);
+			getCharacterCurrentParams(kCharacterAugust)[4] = 0;
+			getCharacterCurrentParams(kCharacterAugust)[8] = 0;
+			break;
+		case 6:
+			if (getModel(3) == 1)
+				playNIS(kEventMeetAugustHisCompartmentBed);
+			else
+				playNIS(kEventMeetAugustHisCompartment);
+
+			_gameProgress[kProgressEventMetAugust] = 1;
+			setDoor(3, 2, 1, 0, 0);
+			getCharacterCurrentParams(kCharacterAugust)[1] = 0;
+			getCharacterCurrentParams(kCharacterAugust)[2] = 1;
+			bumpCathFDoor(3);
+			break;
+		case 7:
+		case 8:
+			getCharacterCurrentParams(kCharacterAugust)[4]++;
+			switch (getCharacterCurrentParams(kCharacterAugust)[4]) {
+			case 1:
+				getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 9;
+				if (rnd(2) == 0) {
+					AugustCall(&LogicManager::CONS_August_DoDialog, "AUG1128B", 0, 0, 0);
 				} else {
-					getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 13;
-					AugustCall(&LogicManager::CONS_August_DoDialog, getCathSorryDialog(), 0, 0, 0);
+					AugustCall(&LogicManager::CONS_August_DoDialog, "AUG1128A", 0, 0, 0);
 				}
-			} else {
-				setDoor(3, kCharacterAugust, 1, 0, 0);
-				if (msg->action == 8) {
-					getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 7;
-					AugustCall(&LogicManager::CONS_August_DoDialog, "LIB012", 0, 0, 0);
+
+				break;
+			case 2:
+				getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 10;
+				if (!_gameProgress[kProgressEventMetAugust]) {
+					AugustCall(&LogicManager::CONS_August_DoDialog, "AUG1128G", 0, 0, 0);
 				} else {
-					getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 8;
-					AugustCall(&LogicManager::CONS_August_DoDialog, "LIB013", 0, 0, 0);
+					AugustCall(&LogicManager::CONS_August_DoDialog, "AUG1128E", 0, 0, 0);
 				}
+
+				break;
+			case 3:
+				getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 11;
+				if (!_gameProgress[kProgressEventMetAugust]) {
+					AugustCall(&LogicManager::CONS_August_DoDialog, "AUG1128H", 0, 0, 0);
+				} else {
+					AugustCall(&LogicManager::CONS_August_DoDialog, "AUG1128F", 0, 0, 0);
+				}
+
+				break;
+			default:
+				if (_gameProgress[kProgressEventMetAugust] || _gameProgress[kProgressJacket] != 2) {
+					setDoor(3, kCharacterAugust, 1, 14, 0);
+				} else {
+					setDoor(3, kCharacterAugust, 1, 14, 9);
+				}
+
+				getCharacterCurrentParams(kCharacterAugust)[1] = 1;
+				break;
+			}
+
+			break;
+		case 9:
+		case 10:
+		case 11:
+			if (_gameProgress[kProgressEventMetAugust] || _gameProgress[kProgressJacket] != 2) {
+				setDoor(3, kCharacterAugust, 1, 14, 0);
+			} else {
+				setDoor(3, kCharacterAugust, 1, 14, 9);
+			}
+
+			getCharacterCurrentParams(kCharacterAugust)[1] = 1;
+			break;
+		case 12:
+		case 13:
+			if (_gameProgress[kProgressEventMetAugust] || _gameProgress[kProgressJacket] != 2) {
+				setDoor(3, kCharacterAugust, 1, 0, 0);
+			} else {
+				setDoor(3, kCharacterAugust, 1, 0, 9);
 			}
+
+			getCharacterCurrentParams(kCharacterAugust)[1] = 0;
+			getCharacterCurrentParams(kCharacterAugust)[2] = 1;
+			break;
+		case 14:
+			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 15;
+			AugustCall(&LogicManager::CONS_August_DoWait, 75, 0, 0, 0);
+			break;
+		case 15:
+			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 16;
+			AugustCall(&LogicManager::CONS_August_DoDialog, "AUG1128I", 0, 0, 0);
+			break;
+		case 16:
+			send(kCharacterAugust, kCharacterCond1, 100906246, 0);
+			break;
+		case 17:
+			getCharacter(kCharacterAugust).characterPosition.location = 0;
+			send(kCharacterAugust, kCharacterCond1, 156567128, 0);
+			startCycOtis(kCharacterAugust, "626Lc");
+			softBlockAtDoor(kCharacterAugust, 3);
+			break;
+		case 18:
+			softReleaseAtDoor(kCharacterAugust, 3);
+			getCharacter(kCharacterAugust).characterPosition.location = 6470;
+			endGraphics(kCharacterAugust);
+			setDoor(3, kCharacterAugust, 1, 10, 9);
+			getCharacterCurrentParams(kCharacterAugust)[3] = 0;
+			break;
+		default:
+			break;
 		}
+
+		break;
+	case 124697504:
+		playDialog(kCharacterAugust, "CON1023A", -1, 0);
+		getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 18;
+		AugustCall(&LogicManager::CONS_August_DoCorrOtis, "626Mc", 3, 0, 0);
+		break;
+	case 192849856:
+		getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 17;
+		AugustCall(&LogicManager::CONS_August_DoCorrOtis, "626Kc", 3, 0, 0);
+		break;
+	case 221617184:
+		getCharacterCurrentParams(kCharacterAugust)[3] = 1;
+		send(kCharacterAugust, kCharacterCond1, 102675536, 0);
+		getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 14;
+		AugustCall(&LogicManager::CONS_August_DoDialog, "CON1023", 0, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1090,19 +1239,25 @@ void LogicManager::CONS_August_Birth(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_August_Birth(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			setDoor(3, kCharacterCath, 1, 10, 9);
-			setDoor(11, kCharacterCath, 0, 255, 255);
-			getCharacter(kCharacterAugust).characterPosition.position = 4691;
-			getCharacter(kCharacterAugust).characterPosition.location = 1;
-			getCharacter(kCharacterAugust).characterPosition.car = kCarRestaurant;
-			getCharacter(kCharacterAugust).clothes = 0;
-			_gameProgress[kProgressEventMetAugust] = 0;
+	switch (msg->action) {
+	case 0:
+		if (_gameTime > 1062000 && !getCharacterCurrentParams(kCharacterAugust)[0]) {
+			getCharacterCurrentParams(kCharacterAugust)[0] = 1;
+			CONS_August_WaitTyler(0, 0, 0, 0);
 		}
-	} else if (_gameTime > 1062000 && !getCharacterCurrentParams(kCharacterAugust)[0]) {
-		getCharacterCurrentParams(kCharacterAugust)[0] = 1;
-		CONS_August_WaitTyler(0, 0, 0, 0);
+
+		break;
+	case 12:
+		setDoor(3, kCharacterCath, 1, 10, 9);
+		setDoor(11, kCharacterCath, 0, 255, 255);
+		getCharacter(kCharacterAugust).characterPosition.position = 4691;
+		getCharacter(kCharacterAugust).characterPosition.location = 1;
+		getCharacter(kCharacterAugust).characterPosition.car = kCarRestaurant;
+		getCharacter(kCharacterAugust).clothes = 0;
+		_gameProgress[kProgressEventMetAugust] = 0;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1128,15 +1283,16 @@ void LogicManager::HAND_August_KnockTyler(HAND_PARAMS) {
 				AugustCall(&LogicManager::CONS_August_DoCorrOtis, "626Ea", 1, 0, 0);
 			} else {
 				softReleaseAtDoor(kCharacterAugust, 1);
-			LABEL_38:
 				setDoor(1, kCharacterCath, 0, 10, 9);
 
 				getCharacter(kCharacterAugust).currentCall--;
 				_engine->getMessageManager()->setMessageHandle(kCharacterAugust, _functionsAugust[getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall]]);
 				fedEx(kCharacterAugust, kCharacterAugust, 18, 0);
 			}
-			return;
+
+			break;
 		}
+
 		if (!getCharacterCurrentParams(kCharacterAugust)[1]) {
 			if (!getCharacterCurrentParams(kCharacterAugust)[10] &&
 				(getCharacterCurrentParams(kCharacterAugust)[10] = _currentGameSessionTicks + 75, _currentGameSessionTicks == -75) ||
@@ -1144,18 +1300,32 @@ void LogicManager::HAND_August_KnockTyler(HAND_PARAMS) {
 				if (!getCharacterCurrentParams(kCharacterAugust)[4]) {
 					getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 8;
 					AugustCall(&LogicManager::CONS_August_DoDialog, "AUG1002B", 0, 0, 0);
-					return;
+					break;
 				}
-			LABEL_69:
+
 				if (!getCharacterCurrentParams(kCharacterAugust)[11]) {
 					getCharacterCurrentParams(kCharacterAugust)[11] = _currentGameSessionTicks + 75;
-					if (_currentGameSessionTicks == -75)
-						goto LABEL_73;
+					if (_currentGameSessionTicks == -75) {
+						softReleaseAtDoor(kCharacterAugust, 1);
+						if (_gameProgress[kProgressEventCorpseMovedFromFloor]) {
+							getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 9;
+							AugustCall(&LogicManager::CONS_August_DoCorrOtis, "626Da", 1, 0, 0);
+						} else if (checkLoc(kCharacterCath, kCarGreenSleeping)) {
+							getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 10;
+							AugustCall(&LogicManager::CONS_August_DoBriefCorrOtis, "626Da", 1, 0, 0);
+						} else {
+							bumpCath(kCarNone, 1, 255);
+							setDoor(9, kCharacterCath, 0, 255, 255);
+							getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 11;
+							AugustCall(&LogicManager::CONS_August_SaveGame, 2, kEventAugustFindCorpse, 0, 0);
+						}
+
+						break;
+					}
 				}
 
 				if (getCharacterCurrentParams(kCharacterAugust)[11] < _currentGameSessionTicks) {
 					getCharacterCurrentParams(kCharacterAugust)[11] = 0x7FFFFFFF;
-				LABEL_73:
 					softReleaseAtDoor(kCharacterAugust, 1);
 					if (_gameProgress[kProgressEventCorpseMovedFromFloor]) {
 						getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 9;
@@ -1165,28 +1335,30 @@ void LogicManager::HAND_August_KnockTyler(HAND_PARAMS) {
 						AugustCall(&LogicManager::CONS_August_DoBriefCorrOtis, "626Da", 1, 0, 0);
 					} else {
 						bumpCath(kCarNone, 1, 255);
-					LABEL_78:
 						setDoor(9, kCharacterCath, 0, 255, 255);
 						getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 11;
 						AugustCall(&LogicManager::CONS_August_SaveGame, 2, kEventAugustFindCorpse, 0, 0);
 					}
-					return;
+
+					break;
 				}
 			}
-		LABEL_80:
+
 			if (getCharacterCurrentParams(kCharacterAugust)[2] && getCharacterCurrentParams(kCharacterAugust)[0] < _gameTime && !getCharacterCurrentParams(kCharacterAugust)[12]) {
 				getCharacterCurrentParams(kCharacterAugust)[12] = 1;
 				setDoor(1, kCharacterCath, 0, 10, 9);
 				getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 12;
 				AugustCall(&LogicManager::CONS_August_DoCorrOtis, "626Ea", 1, 0, 0);
 			}
-			return;
+
+			break;
 		}
+
 		if (!getCharacterCurrentParams(kCharacterAugust)[8] && (getCharacterCurrentParams(kCharacterAugust)[8] = _currentGameSessionTicks + 45, _currentGameSessionTicks == -45) || getCharacterCurrentParams(kCharacterAugust)[8] < _currentGameSessionTicks) {
 			if (checkDoor(1) == 1) {
 				if (getCharacterCurrentParams(kCharacterAugust)[9] || (getCharacterCurrentParams(kCharacterAugust)[9] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
 					if (getCharacterCurrentParams(kCharacterAugust)[9] >= _currentGameSessionTicks)
-						return;
+						break;
 
 					getCharacterCurrentParams(kCharacterAugust)[9] = 0x7FFFFFFF;
 				}
@@ -1198,11 +1370,11 @@ void LogicManager::HAND_August_KnockTyler(HAND_PARAMS) {
 				case 1:
 					getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 5;
 					AugustCall(&LogicManager::CONS_August_DoDialog, "LIB013", 0, 0, 0);
-					return;
+					break;
 				case 2:
 					getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 7;
 					AugustCall(&LogicManager::CONS_August_DoDialog, "LIB012", 0, 0, 0);
-					return;
+					break;
 				case 3:
 					getCharacterCurrentParams(kCharacterAugust)[7]++;
 					if (getCharacterCurrentParams(kCharacterAugust)[7] >= 3) {
@@ -1211,12 +1383,13 @@ void LogicManager::HAND_August_KnockTyler(HAND_PARAMS) {
 						getCharacter(kCharacterAugust).currentCall--;
 						_engine->getMessageManager()->setMessageHandle(kCharacterAugust, _functionsAugust[getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall]]);
 						fedEx(kCharacterAugust, kCharacterAugust, 18, 0);
-						return;
+						break;
 					}
+
 					getCharacterCurrentParams(kCharacterAugust)[5] = 0;
 					break;
 				}
-			LABEL_23:
+
 				setDoor(1, kCharacterAugust, checkDoor(1), getCharacterCurrentParams(kCharacterAugust)[3] == 0 ? 14 : 0, 9);
 				getCharacterCurrentParams(kCharacterAugust)[9] = 0;
 			} else if (!_gameProgress[kProgressEventCorpseMovedFromFloor] || _gameProgress[kProgressJacket] == 1) {
@@ -1232,7 +1405,8 @@ void LogicManager::HAND_August_KnockTyler(HAND_PARAMS) {
 				AugustCall(&LogicManager::CONS_August_SaveGame, 2, kEventMeetAugustTylerCompartment, 0, 0);
 			}
 		}
-		return;
+
+		break;
 	case 8:
 		if (getCharacterCurrentParams(kCharacterAugust)[2]) {
 			setDoor(1, kCharacterAugust, 0, 0, 0);
@@ -1243,7 +1417,8 @@ void LogicManager::HAND_August_KnockTyler(HAND_PARAMS) {
 			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 17;
 			AugustCall(&LogicManager::CONS_August_DoDialogFullVol, "AUG1002A", 0, 0, 0);
 		}
-		return;
+
+		break;
 	case 9:
 		if (!_gameProgress[kProgressEventCorpseMovedFromFloor] || _gameProgress[kProgressJacket] == 1) {
 			setDoor(9, kCharacterCath, 0, 255, 255);
@@ -1264,7 +1439,8 @@ void LogicManager::HAND_August_KnockTyler(HAND_PARAMS) {
 			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 14;
 			AugustCall(&LogicManager::CONS_August_SaveGame, 2, kEventMeetAugustTylerCompartment, 0, 0);
 		}
-		return;
+
+		break;
 	case 12:
 		if (inComp(kCharacterCath, kCarGreenSleeping, 8200) || inComp(kCharacterCath, kCarGreenSleeping, 7850) || cathOutHisWindow()) {
 			setDoor(1, kCharacterAugust, checkDoor(1), 0, 0);
@@ -1279,23 +1455,34 @@ void LogicManager::HAND_August_KnockTyler(HAND_PARAMS) {
 			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 1;
 			AugustCall(&LogicManager::CONS_August_DoCorrOtis, "626Aa", 1, 0, 0);
 		}
-		return;
+
+		break;
 	case 18:
 		switch (getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8]) {
 		case 1:
 			startCycOtis(kCharacterAugust, "626Ba");
 			softBlockAtDoor(kCharacterAugust, 1);
-			return;
+			break;
 		case 2:
-			goto LABEL_38;
+			setDoor(1, kCharacterCath, 0, 10, 9);
+
+			getCharacter(kCharacterAugust).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterAugust, _functionsAugust[getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall]]);
+			fedEx(kCharacterAugust, kCharacterAugust, 18, 0);
+			break;
 		case 3:
 			playDialog(0, "LIB014", -1, 0);
 			playNIS(kEventAugustFindCorpse);
-			if (_gameEvents[kEventDinerAugustOriginalJacket])
-				goto LABEL_85;
-			if (_gameProgress[kProgressEventCorpseMovedFromFloor])
-				goto LABEL_65;
-			goto LABEL_92;
+
+			if (_gameEvents[kEventDinerAugustOriginalJacket]) {
+				endGame(3, 4, _gameProgress[kProgressEventFoundCorpse] == kProgressField0 ? 56 : 50, true);
+			} else if (_gameProgress[kProgressEventCorpseMovedFromFloor]) {
+				endGame(0, 1, 55, true);
+			} else {
+				endGame(0, 1, _gameProgress[kProgressEventFoundCorpse] == kProgressField0 ? 56 : 50, true);
+			}
+
+			break;
 		case 4:
 			setDoor(1, 0, 0, 10, 9);
 			playDialog(0, "LIB014", -1, 0);
@@ -1310,37 +1497,100 @@ void LogicManager::HAND_August_KnockTyler(HAND_PARAMS) {
 			getCharacter(kCharacterAugust).currentCall--;
 			_engine->getMessageManager()->setMessageHandle(kCharacterAugust, _functionsAugust[getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall]]);
 			fedEx(kCharacterAugust, kCharacterAugust, 18, 0);
-			return;
+			break;
 		case 5:
 			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 6;
 			AugustCall(&LogicManager::CONS_August_DoDialogFullVol, "AUG1002B", 0, 0, 0);
-			return;
+			break;
 		case 6:
 		case 7:
-			goto LABEL_23;
+			setDoor(1, kCharacterAugust, checkDoor(1), getCharacterCurrentParams(kCharacterAugust)[3] == 0 ? 14 : 0, 9);
+			getCharacterCurrentParams(kCharacterAugust)[9] = 0;
+			break;
 		case 8:
 			getCharacterCurrentParams(kCharacterAugust)[4] = 1;
-			goto LABEL_69;
+			if (!getCharacterCurrentParams(kCharacterAugust)[11]) {
+				getCharacterCurrentParams(kCharacterAugust)[11] = _currentGameSessionTicks + 75;
+				if (_currentGameSessionTicks == -75) {
+					softReleaseAtDoor(kCharacterAugust, 1);
+					if (_gameProgress[kProgressEventCorpseMovedFromFloor]) {
+						getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 9;
+						AugustCall(&LogicManager::CONS_August_DoCorrOtis, "626Da", 1, 0, 0);
+					} else if (checkLoc(kCharacterCath, kCarGreenSleeping)) {
+						getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 10;
+						AugustCall(&LogicManager::CONS_August_DoBriefCorrOtis, "626Da", 1, 0, 0);
+					} else {
+						bumpCath(kCarNone, 1, 255);
+						setDoor(9, kCharacterCath, 0, 255, 255);
+						getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 11;
+						AugustCall(&LogicManager::CONS_August_SaveGame, 2, kEventAugustFindCorpse, 0, 0);
+					}
+
+					break;
+				}
+			}
+
+			if (getCharacterCurrentParams(kCharacterAugust)[11] < _currentGameSessionTicks) {
+				getCharacterCurrentParams(kCharacterAugust)[11] = 0x7FFFFFFF;
+				softReleaseAtDoor(kCharacterAugust, 1);
+				if (_gameProgress[kProgressEventCorpseMovedFromFloor]) {
+					getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 9;
+					AugustCall(&LogicManager::CONS_August_DoCorrOtis, "626Da", 1, 0, 0);
+				} else if (checkLoc(kCharacterCath, kCarGreenSleeping)) {
+					getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 10;
+					AugustCall(&LogicManager::CONS_August_DoBriefCorrOtis, "626Da", 1, 0, 0);
+				} else {
+					bumpCath(kCarNone, 1, 255);
+					setDoor(9, kCharacterCath, 0, 255, 255);
+					getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 11;
+					AugustCall(&LogicManager::CONS_August_SaveGame, 2, kEventAugustFindCorpse, 0, 0);
+				}
+
+				break;
+			}
+
+			if (getCharacterCurrentParams(kCharacterAugust)[2] && getCharacterCurrentParams(kCharacterAugust)[0] < _gameTime && !getCharacterCurrentParams(kCharacterAugust)[12]) {
+				getCharacterCurrentParams(kCharacterAugust)[12] = 1;
+				setDoor(1, kCharacterCath, 0, 10, 9);
+				getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 12;
+				AugustCall(&LogicManager::CONS_August_DoCorrOtis, "626Ea", 1, 0, 0);
+			}
+
+			break;
 		case 9:
 			getCharacterCurrentParams(kCharacterAugust)[2] = 1;
 			endGraphics(kCharacterAugust);
 			getCharacter(kCharacterAugust).characterPosition.location = 1;
 			setDoor(1, kCharacterAugust, 0, 10, 9);
-			goto LABEL_80;
+			if (getCharacterCurrentParams(kCharacterAugust)[2] && getCharacterCurrentParams(kCharacterAugust)[0] < _gameTime && !getCharacterCurrentParams(kCharacterAugust)[12]) {
+				getCharacterCurrentParams(kCharacterAugust)[12] = 1;
+				setDoor(1, kCharacterCath, 0, 10, 9);
+				getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 12;
+				AugustCall(&LogicManager::CONS_August_DoCorrOtis, "626Ea", 1, 0, 0);
+			}
+
+			break;
 		case 10:
-			goto LABEL_78;
+			setDoor(9, kCharacterCath, 0, 255, 255);
+			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 11;
+			AugustCall(&LogicManager::CONS_August_SaveGame, 2, kEventAugustFindCorpse, 0, 0);
+			break;
 		case 11:
 			playNIS(kEventAugustFindCorpse);
-			if (_gameEvents[kEventDinerAugustOriginalJacket])
-				goto LABEL_85;
-			goto LABEL_92;
+			if (_gameEvents[kEventDinerAugustOriginalJacket]) {
+				endGame(3, 4, _gameProgress[kProgressEventFoundCorpse] == kProgressField0 ? 56 : 50, true);
+			} else {
+				endGame(0, 1, _gameProgress[kProgressEventFoundCorpse] == kProgressField0 ? 56 : 50, true);
+			}
+
+			break;
 		case 12:
 			getCharacter(kCharacterAugust).characterPosition.location = 0;
 
 			getCharacter(kCharacterAugust).currentCall--;
 			_engine->getMessageManager()->setMessageHandle(kCharacterAugust, _functionsAugust[getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall]]);
 			fedEx(kCharacterAugust, kCharacterAugust, 18, 0);
-			return;
+			break;
 		case 13:
 			if (checkDoor(1) != 1) {
 				playDialog(0, "LIB014", -1, 0);
@@ -1349,16 +1599,15 @@ void LogicManager::HAND_August_KnockTyler(HAND_PARAMS) {
 			}
 
 			playNIS(kEventAugustFindCorpse);
+
 			if (_gameEvents[kEventDinerAugustOriginalJacket]) {
-			LABEL_85:
 				endGame(3, 4, _gameProgress[kProgressEventFoundCorpse] == kProgressField0 ? 56 : 50, true);
 			} else if (_gameProgress[kProgressEventCorpseMovedFromFloor]) {
-			LABEL_65:
 				endGame(0, 1, 55, true);
 			} else {
-			LABEL_92:
 				endGame(0, 1, _gameProgress[kProgressEventFoundCorpse] == kProgressField0 ? 56 : 50, true);
 			}
+
 			break;
 		case 14:
 			if (!getCharacterCurrentParams(kCharacterAugust)[2]) {
@@ -1379,24 +1628,25 @@ void LogicManager::HAND_August_KnockTyler(HAND_PARAMS) {
 			getCharacter(kCharacterAugust).currentCall--;
 			_engine->getMessageManager()->setMessageHandle(kCharacterAugust, _functionsAugust[getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall]]);
 			fedEx(kCharacterAugust, kCharacterAugust, 18, 0);
-			return;
+			break;
 		case 15:
 			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 16;
 			AugustCall(&LogicManager::CONS_August_DoDialog, "AUG1128A", 0, 0, 0);
-			return;
+			break;
 		case 16:
 			setDoor(1, kCharacterAugust, 0, 10, 9);
-			return;
+			break;
 		case 17:
 			getCharacterCurrentParams(kCharacterAugust)[3] = 1;
 			setDoor(1, kCharacterAugust, checkDoor(1), 0, 9);
-			return;
+			break;
 		default:
-			return;
+			break;
 		}
-		return;
+
+		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -1411,20 +1661,29 @@ void LogicManager::CONS_August_DoNIS1006(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_August_DoNIS1006(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 1;
 		AugustCall(&LogicManager::CONS_August_SaveGame, 2, kEventDinerAugust, 0, 0);
-	} else if (msg->action == 18 && getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] == 1) {
-		if (inDiningRoom(kCharacterAlexei))
-			playNIS(kEventDinerAugustAlexeiBackground);
-		else
-			playNIS(kEventDinerAugust);
-		_gameProgress[kProgressEventMetAugust] = 1;
-		bumpCath(kCarRestaurant, 61, 255);
+		break;
+	case 18:
+		if (getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] == 1) {
+			if (inDiningRoom(kCharacterAlexei))
+				playNIS(kEventDinerAugustAlexeiBackground);
+			else
+				playNIS(kEventDinerAugust);
 
-		getCharacter(kCharacterAugust).currentCall--;
-		_engine->getMessageManager()->setMessageHandle(kCharacterAugust, _functionsAugust[getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall]]);
-		fedEx(kCharacterAugust, kCharacterAugust, 18, 0);
+			_gameProgress[kProgressEventMetAugust] = 1;
+			bumpCath(kCarRestaurant, 61, 255);
+
+			getCharacter(kCharacterAugust).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterAugust, _functionsAugust[getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall]]);
+			fedEx(kCharacterAugust, kCharacterAugust, 18, 0);
+		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1439,90 +1698,13 @@ void LogicManager::CONS_August_WaitTyler(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_August_WaitTyler(HAND_PARAMS) {
-	if (msg->action > 12) {
-		switch (msg->action) {
-		case 18:
-			switch (getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8]) {
-			case 1:
-				send(kCharacterAugust, kCharacterWaiter1, 204704037, 0);
-				startSeqOtis(kCharacterAugust, "803DS");
-				if (inDiningRoom(kCharacterCath))
-					advanceFrame(kCharacterAugust);
-				getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 2;
-				AugustCall(&LogicManager::CONS_August_FinishSeqOtis, 0, 0, 0, 0);
-				break;
-			case 2:
-				CONS_August_SeekTyler(0, 0, 0, 0);
-				break;
-			case 3:
-				CONS_August_OrderDinner(0, 0, 0, 0);
-				break;
-			case 4:
-				send(kCharacterAugust, kCharacterAlexei, 225182640, 0);
-				playNIS(kEventDinerAugustOriginalJacket);
-				setDoor(1, kCharacterCath, 3, 0, 0);
-				getCharacter(kCharacterAugust).characterPosition.location = 0;
-				send(kCharacterAugust, kCharacterTableD, 103798704, "010K");
-				startSeqOtis(kCharacterAugust, "010P");
-				bumpCath(kCarRestaurant, 65, 255);
-				getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 5;
-				AugustCall(&LogicManager::CONS_August_FinishSeqOtis, 0, 0, 0, 0);
-				break;
-			case 5:
-				send(kCharacterAugust, kCharacterWaiter1, 204704037, 0);
-				startSeqOtis(kCharacterAugust, "803DS");
-				if (inDiningRoom(kCharacterCath))
-					advanceFrame(kCharacterAugust);
-				getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 6;
-				AugustCall(&LogicManager::CONS_August_FinishSeqOtis, 0, 0, 0, 0);
-				break;
-			case 6:
-				_gameProgress[kProgressField14] = 2;
-				getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 7;
-				AugustCall(&LogicManager::CONS_August_DoWalk, 3, 8200, 0, 0);
-				break;
-			case 7:
-				getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 8;
-				AugustCall(&LogicManager::CONS_August_KnockTyler, 0, 0, 0, 0);
-				break;
-			case 8:
-				endGame(0, 0, 0, 1);
-				break;
-			default:
-				return;
-			}
-			break;
-		case 168046720:
-			getCharacter(kCharacterAugust).inventoryItem = 0;
-			break;
-		case 168627977:
-			getCharacter(kCharacterAugust).inventoryItem = getCharacterCurrentParams(kCharacterAugust)[1];
-			break;
-		}
-	} else if (msg->action == 12) {
-		send(kCharacterAugust, kCharacterTableD, 136455232, 0);
-		startCycOtis(kCharacterAugust, "010B");
-		if (!_gameProgress[kProgressEventMetAugust])
-			getCharacterCurrentParams(kCharacterAugust)[1] = 128;
-		getCharacter(kCharacterAugust).inventoryItem = getCharacterCurrentParams(kCharacterAugust)[1];
-	} else if (msg->action) {
-		if (msg->action == 1) {
-			getCharacterCurrentParams(kCharacterAugust)[1] = 0;
-			getCharacter(kCharacterAugust).inventoryItem = 0;
-			send(kCharacterAugust, kCharacterHeadWait, 191604416, 0);
-			if (_gameProgress[1] == 2) {
-				getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 3;
-				AugustCall(&LogicManager::CONS_August_DoNIS1006, 0, 0, 0, 0);
-			} else {
-				getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 4;
-				AugustCall(&LogicManager::CONS_August_SaveGame, 2, kEventDinerAugustOriginalJacket, 0, 0);
-			}
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		if (!getCharacterCurrentParams(kCharacterAugust)[0] && _gameProgress[kProgressEventFoundCorpse]) {
 			send(kCharacterAugust, kCharacterHeadWait, 239072064, 0);
 			getCharacterCurrentParams(kCharacterAugust)[0] = 1;
 		}
+
 		if (_gameTime > 1080000 && !getCharacterCurrentParams(kCharacterAugust)[2]) {
 			getCharacterCurrentParams(kCharacterAugust)[2] = 1;
 			if (!getCharacterCurrentParams(kCharacterAugust)[0]) {
@@ -1530,12 +1712,99 @@ void LogicManager::HAND_August_WaitTyler(HAND_PARAMS) {
 				getCharacterCurrentParams(kCharacterAugust)[0] = 1;
 			}
 		}
+
 		if (_gameTime > 1093500 && rcClear()) {
 			getCharacter(kCharacterAugust).characterPosition.location = 0;
 			getCharacter(kCharacterAugust).inventoryItem = 0;
 			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 1;
 			AugustCall(&LogicManager::CONS_August_DoJoinedSeqOtis, "010J", 36, 103798704, "010K");
 		}
+
+		break;
+	case 1:
+		getCharacterCurrentParams(kCharacterAugust)[1] = 0;
+		getCharacter(kCharacterAugust).inventoryItem = 0;
+		send(kCharacterAugust, kCharacterHeadWait, 191604416, 0);
+		if (_gameProgress[kProgressJacket] == 2) {
+			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 3;
+			AugustCall(&LogicManager::CONS_August_DoNIS1006, 0, 0, 0, 0);
+		} else {
+			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 4;
+			AugustCall(&LogicManager::CONS_August_SaveGame, 2, kEventDinerAugustOriginalJacket, 0, 0);
+		}
+
+		break;
+	case 12:
+		send(kCharacterAugust, kCharacterTableD, 136455232, 0);
+		startCycOtis(kCharacterAugust, "010B");
+
+		if (!_gameProgress[kProgressEventMetAugust])
+			getCharacterCurrentParams(kCharacterAugust)[1] = 128;
+
+		getCharacter(kCharacterAugust).inventoryItem = getCharacterCurrentParams(kCharacterAugust)[1];
+		break;
+	case 18:
+		switch (getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8]) {
+		case 1:
+			send(kCharacterAugust, kCharacterWaiter1, 204704037, 0);
+			startSeqOtis(kCharacterAugust, "803DS");
+
+			if (inDiningRoom(kCharacterCath))
+				advanceFrame(kCharacterAugust);
+
+			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 2;
+			AugustCall(&LogicManager::CONS_August_FinishSeqOtis, 0, 0, 0, 0);
+			break;
+		case 2:
+			CONS_August_SeekTyler(0, 0, 0, 0);
+			break;
+		case 3:
+			CONS_August_OrderDinner(0, 0, 0, 0);
+			break;
+		case 4:
+			send(kCharacterAugust, kCharacterAlexei, 225182640, 0);
+			playNIS(kEventDinerAugustOriginalJacket);
+			setDoor(1, kCharacterCath, 3, 0, 0);
+			getCharacter(kCharacterAugust).characterPosition.location = 0;
+			send(kCharacterAugust, kCharacterTableD, 103798704, "010K");
+			startSeqOtis(kCharacterAugust, "010P");
+			bumpCath(kCarRestaurant, 65, 255);
+			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 5;
+			AugustCall(&LogicManager::CONS_August_FinishSeqOtis, 0, 0, 0, 0);
+			break;
+		case 5:
+			send(kCharacterAugust, kCharacterWaiter1, 204704037, 0);
+			startSeqOtis(kCharacterAugust, "803DS");
+			if (inDiningRoom(kCharacterCath))
+				advanceFrame(kCharacterAugust);
+			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 6;
+			AugustCall(&LogicManager::CONS_August_FinishSeqOtis, 0, 0, 0, 0);
+			break;
+		case 6:
+			_gameProgress[kProgressField14] = 2;
+			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 7;
+			AugustCall(&LogicManager::CONS_August_DoWalk, 3, 8200, 0, 0);
+			break;
+		case 7:
+			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 8;
+			AugustCall(&LogicManager::CONS_August_KnockTyler, 0, 0, 0, 0);
+			break;
+		case 8:
+			endGame(0, 0, 0, 1);
+			break;
+		default:
+			break;
+		}
+
+		break;
+	case 168046720:
+		getCharacter(kCharacterAugust).inventoryItem = 0;
+		break;
+	case 168627977:
+		getCharacter(kCharacterAugust).inventoryItem = getCharacterCurrentParams(kCharacterAugust)[1];
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1550,7 +1819,8 @@ void LogicManager::CONS_August_SeekTyler(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_August_SeekTyler(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		if (_gameProgress[kProgressEventMetAugust] || _gameProgress[kProgressField14]) {
 			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 5;
 			AugustCall(&LogicManager::CONS_August_DoWalk, 3, 6470, 0, 0);
@@ -1559,7 +1829,9 @@ void LogicManager::HAND_August_SeekTyler(HAND_PARAMS) {
 			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 1;
 			AugustCall(&LogicManager::CONS_August_DoWalk, 3, 8200, 0, 0);
 		}
-	} else if (msg->action == 18) {
+
+		break;
+	case 18:
 		switch (getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8]) {
 		case 1:
 			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 2;
@@ -1576,13 +1848,15 @@ void LogicManager::HAND_August_SeekTyler(HAND_PARAMS) {
 		case 4:
 			if (_gameProgress[kProgressField14] == 2)
 				_gameProgress[kProgressField14] = 0;
-			goto LABEL_14;
+
+			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 7;
+			AugustCall(&LogicManager::CONS_August_CompLogic, _gameTime + 900, 0, 0, 0);
+			break;
 		case 5:
 			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 6;
 			AugustCall(&LogicManager::CONS_August_EnterComp, 0, 0, 0, 0);
 			break;
 		case 6:
-		LABEL_14:
 			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 7;
 			AugustCall(&LogicManager::CONS_August_CompLogic, _gameTime + 900, 0, 0, 0);
 			break;
@@ -1590,8 +1864,12 @@ void LogicManager::HAND_August_SeekTyler(HAND_PARAMS) {
 			CONS_August_GotoDinner(0, 0, 0, 0);
 			break;
 		default:
-			return;
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1606,10 +1884,12 @@ void LogicManager::CONS_August_GotoDinner(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_August_GotoDinner(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 1;
 		AugustCall(&LogicManager::CONS_August_ExitComp, 0, 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8]) {
 		case 1:
 			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 2;
@@ -1637,8 +1917,12 @@ void LogicManager::HAND_August_GotoDinner(HAND_PARAMS) {
 			CONS_August_OrderDinner(0, 0, 0, 0);
 			break;
 		default:
-			return;
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1653,50 +1937,54 @@ void LogicManager::CONS_August_OrderDinner(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_August_OrderDinner(HAND_PARAMS) {
-	if (msg->action > 12) {
-		if (msg->action > 168046720) {
-			switch (msg->action) {
-			case 168627977:
-				getCharacter(kCharacterAugust).inventoryItem = getCharacterCurrentParams(kCharacterAugust)[0];
-				break;
-			case 170016384:
-				getCharacter(kCharacterAugust).inventoryItem = 0;
-				startCycOtis(kCharacterWaiter1, "BLANK");
-				startCycOtis(kCharacterAugust, "010G");
-				getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 2;
-				AugustCall(&LogicManager::CONS_August_DoDialog, "AUG1053", 0, 0, 0);
-				break;
-			case 268773672:
-				getCharacter(kCharacterAugust).inventoryItem = 0;
-				startCycOtis(kCharacterAugust, "010D");
-				getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 1;
-				AugustCall(&LogicManager::CONS_August_DoDialog, "AUG1052", 0, 0, 0);
-				break;
-			}
-		} else if (msg->action == 168046720) {
-			getCharacter(kCharacterAugust).inventoryItem = 0;
-		} else if (msg->action == 18) {
-			if (getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] == 1) {
-				send(kCharacterAugust, kCharacterWaiter1, 203859488, 0);
-				getCharacter(kCharacterAugust).inventoryItem = getCharacterCurrentParams(kCharacterAugust)[0];
-				startCycOtis(kCharacterAugust, "010B");
-			} else if (getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] == 2) {
-				send(kCharacterAugust, kCharacterWaiter1, 136702400, 0);
-				startCycOtis(kCharacterAugust, "010B");
-				CONS_August_EatingDinner(0, 0, 0, 0);
-			}
-		}
-	} else if (msg->action == 12) {
+	switch (msg->action) {
+	case 1:
+		getCharacter(kCharacterAugust).inventoryItem = 0;
+		getCharacterCurrentParams(kCharacterAugust)[0] = 0;
+		getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 3;
+		AugustCall(&LogicManager::CONS_August_DoNIS1006, 0, 0, 0, 0);
+		break;
+	case 12:
 		if (!_gameProgress[kProgressEventMetAugust] && _gameProgress[kProgressJacket] == 2)
 			getCharacterCurrentParams(kCharacterAugust)[0] = 128;
+
 		startCycOtis(kCharacterAugust, "010B");
 		send(kCharacterAugust, kCharacterWaiter1, 304061224, 0);
 		getCharacter(kCharacterAugust).inventoryItem = getCharacterCurrentParams(kCharacterAugust)[0];
-	} else if (msg->action == 1) {
+		break;
+	case 18:
+		if (getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] == 1) {
+			send(kCharacterAugust, kCharacterWaiter1, 203859488, 0);
+			getCharacter(kCharacterAugust).inventoryItem = getCharacterCurrentParams(kCharacterAugust)[0];
+			startCycOtis(kCharacterAugust, "010B");
+		} else if (getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] == 2) {
+			send(kCharacterAugust, kCharacterWaiter1, 136702400, 0);
+			startCycOtis(kCharacterAugust, "010B");
+			CONS_August_EatingDinner(0, 0, 0, 0);
+		}
+
+		break;
+	case 168046720:
+		getCharacter(kCharacterAugust).inventoryItem = 0;
+		break;
+	case 168627977:
+		getCharacter(kCharacterAugust).inventoryItem = getCharacterCurrentParams(kCharacterAugust)[0];
+		break;
+	case 170016384:
 		getCharacter(kCharacterAugust).inventoryItem = 0;
-		getCharacterCurrentParams(kCharacterAugust)[0] = 0;
-		getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 3;
-		AugustCall(&LogicManager::CONS_August_DoNIS1006, 0, 0, 0, 0);
+		startCycOtis(kCharacterWaiter1, "BLANK");
+		startCycOtis(kCharacterAugust, "010G");
+		getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 2;
+		AugustCall(&LogicManager::CONS_August_DoDialog, "AUG1053", 0, 0, 0);
+		break;
+	case 268773672:
+		getCharacter(kCharacterAugust).inventoryItem = 0;
+		startCycOtis(kCharacterAugust, "010D");
+		getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 1;
+		AugustCall(&LogicManager::CONS_August_DoDialog, "AUG1052", 0, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1711,53 +1999,58 @@ void LogicManager::CONS_August_EatingDinner(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_August_EatingDinner(HAND_PARAMS) {
-	if (msg->action > 12) {
-		if (msg->action > 168046720) {
-			switch (msg->action) {
-			case 168627977:
-				getCharacter(kCharacterAugust).inventoryItem = getCharacterCurrentParams(kCharacterAugust)[0];
-				break;
-			case 189426612:
-				getCharacterCurrentParams(kCharacterAugust)[1] = 1;
-				break;
-			case 235257824:
-				getCharacterCurrentParams(kCharacterAugust)[1] = 0;
-				break;
-			}
-		} else if (msg->action == 168046720) {
-			getCharacter(kCharacterAugust).inventoryItem = 0;
-		}
-	} else if (msg->action == 12) {
-		if (!_gameProgress[kProgressEventMetAugust] && _gameProgress[kProgressJacket] == 2)
-			getCharacterCurrentParams(kCharacterAugust)[0] = 128;
-		getCharacter(kCharacterAugust).inventoryItem = getCharacterCurrentParams(kCharacterAugust)[0];
-		startCycOtis(kCharacterAugust, "010H");
-	} else {
-		if (msg->action) {
-			if (msg->action == 1) {
-				getCharacter(kCharacterAugust).inventoryItem = 0;
-				getCharacterCurrentParams(kCharacterAugust)[0] = 0;
-				getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 1;
-				AugustCall(&LogicManager::CONS_August_DoNIS1006, 0, 0, 0, 0);
-			}
-			return;
-		}
+	switch (msg->action) {
+	case 0:
 		if (_gameProgress[kProgressField28] && !getCharacterCurrentParams(kCharacterAugust)[1] && getCharacterCurrentParams(kCharacterAugust)[2] != 0x7FFFFFFF && _gameTime) {
 			if (_gameTime <= 1134000) {
 				if (!inDiningRoom(kCharacterCath) || dialogRunning("MRB1076") || dialogRunning("MRB1078") || dialogRunning("MRB1078A") || !getCharacterCurrentParams(kCharacterAugust)[2]) {
 					getCharacterCurrentParams(kCharacterAugust)[2] = _gameTime + 225;
-					if (_gameTime == -225)
-						goto LABEL_27;
+					if (_gameTime == -225) {
+						getCharacter(kCharacterAugust).inventoryItem = 0;
+						_gameProgress[kProgressField28] = 0;
+						CONS_August_GreetAnna(0, 0, 0, 0);
+						break;
+					}
 				}
+
 				if (getCharacterCurrentParams(kCharacterAugust)[2] >= _gameTime)
-					return;
+					break;
 			}
+
 			getCharacterCurrentParams(kCharacterAugust)[2] = 0x7FFFFFFF;
-		LABEL_27:
 			getCharacter(kCharacterAugust).inventoryItem = 0;
 			_gameProgress[kProgressField28] = 0;
 			CONS_August_GreetAnna(0, 0, 0, 0);
 		}
+
+		break;
+	case 1:
+		getCharacter(kCharacterAugust).inventoryItem = 0;
+		getCharacterCurrentParams(kCharacterAugust)[0] = 0;
+		getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 1;
+		AugustCall(&LogicManager::CONS_August_DoNIS1006, 0, 0, 0, 0);
+		break;
+	case 12:
+		if (!_gameProgress[kProgressEventMetAugust] && _gameProgress[kProgressJacket] == 2)
+			getCharacterCurrentParams(kCharacterAugust)[0] = 128;
+
+		getCharacter(kCharacterAugust).inventoryItem = getCharacterCurrentParams(kCharacterAugust)[0];
+		startCycOtis(kCharacterAugust, "010H");
+		break;
+	case 168046720:
+		getCharacter(kCharacterAugust).inventoryItem = 0;
+		break;
+	case 168627977:
+		getCharacter(kCharacterAugust).inventoryItem = getCharacterCurrentParams(kCharacterAugust)[0];
+		break;
+	case 189426612:
+		getCharacterCurrentParams(kCharacterAugust)[1] = 1;
+		break;
+	case 235257824:
+		getCharacterCurrentParams(kCharacterAugust)[1] = 0;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1776,9 +2069,11 @@ void LogicManager::HAND_August_GreetAnna(HAND_PARAMS) {
 	case 0:
 		if (getCharacterCurrentParams(kCharacterAugust)[2] || (getCharacterCurrentParams(kCharacterAugust)[2] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
 			if (getCharacterCurrentParams(kCharacterAugust)[2] >= _currentGameSessionTicks)
-				return;
+				break;
+
 			getCharacterCurrentParams(kCharacterAugust)[2] = 0x7FFFFFFF;
 		}
+
 		getCharacter(kCharacterAugust).inventoryItem = 0x80;
 		break;
 	case 1:
@@ -1797,8 +2092,10 @@ void LogicManager::HAND_August_GreetAnna(HAND_PARAMS) {
 			AugustCall(&LogicManager::CONS_August_SaveGame, 2, kEventAugustPresentAnna, 0, 0);
 		} else if (getCharacterCurrentParams(kCharacterAugust)[1]) {
 			getCharacterCurrentParams(kCharacterAugust)[1] = 0;
+
 			if (_gameProgress[kProgressEventMetAugust])
 				getCharacter(kCharacterAugust).inventoryItem = 0;
+
 			playDialog(kCharacterAugust, "AUG1003A", -1, 0);
 		} else {
 			getCharacter(kCharacterAugust).inventoryItem = 0;
@@ -1806,6 +2103,7 @@ void LogicManager::HAND_August_GreetAnna(HAND_PARAMS) {
 			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 8;
 			AugustCall(&LogicManager::CONS_August_DoSeqOtis, "010P", 0, 0, 0);
 		}
+
 		break;
 	case 12:
 		send(kCharacterAugust, kCharacterMonsieur, 135854206, 0);
@@ -1829,8 +2127,10 @@ void LogicManager::HAND_August_GreetAnna(HAND_PARAMS) {
 			send(kCharacterAugust, kCharacterAnna, 122358304, 0);
 			startCycOtis(kCharacterAugust, "001K");
 			playDialog(kCharacterAugust, "AUG1003", -1, 0);
+
 			if (inDiningRoom(kCharacterCath))
 				_gameProgress[kProgressField60] = 1;
+
 			getCharacterCurrentParams(kCharacterAugust)[1] = 1;
 			break;
 		case 4:
@@ -1847,6 +2147,7 @@ void LogicManager::HAND_August_GreetAnna(HAND_PARAMS) {
 				bumpCath(kCarRestaurant, 65, 255);
 				getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 6;
 			}
+
 			AugustCall(&LogicManager::CONS_August_FinishSeqOtis, 0, 0, 0, 0);
 			break;
 		case 5:
@@ -1857,24 +2158,29 @@ void LogicManager::HAND_August_GreetAnna(HAND_PARAMS) {
 			break;
 		case 6:
 			startSeqOtis(kCharacterAugust, "803DS");
+
 			if (inDiningRoom(kCharacterCath))
 				advanceFrame(kCharacterAugust);
+
 			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 7;
 			AugustCall(&LogicManager::CONS_August_FinishSeqOtis, 0, 0, 0, 0);
 			break;
 		case 8:
 			startSeqOtis(kCharacterAugust, "803DS");
+
 			if (inDiningRoom(kCharacterCath))
 				advanceFrame(kCharacterAugust);
+
 			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 9;
 			AugustCall(&LogicManager::CONS_August_FinishSeqOtis, 0, 0, 0, 0);
 			break;
 		default:
-			return;
+			break;
 		}
+
 		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -1889,10 +2195,12 @@ void LogicManager::CONS_August_ReturnFromDinner(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_August_ReturnFromDinner(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 1;
 		AugustCall(&LogicManager::CONS_August_DoWalk, 3, 6470, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8]) {
 		case 1:
 			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 2;
@@ -1913,8 +2221,12 @@ void LogicManager::HAND_August_ReturnFromDinner(HAND_PARAMS) {
 
 			break;
 		default:
-			return;
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1929,125 +2241,143 @@ void LogicManager::CONS_August_GoSalon(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_August_GoSalon(HAND_PARAMS) {
-	if (msg->action > 12) {
-		if (msg->action > 122358304) {
-			if (msg->action == 159332865) {
-				startCycOtis(kCharacterAugust, "106E");
-				getCharacterCurrentParams(kCharacterAugust)[0] = 1;
-			}
-		} else {
-			switch (msg->action) {
-			case 122358304:
-				getCharacterCurrentParams(kCharacterAugust)[1] = 0;
-				startCycOtis(kCharacterAugust, "BLANK");
-				break;
-			case 17:
-				if (getCharacterCurrentParams(kCharacterAugust)[1]) {
-					if (checkCathDir(kCarRestaurant, 57)) {
-						bumpCath(kCarRestaurant, 50, 255);
-						getCharacterCurrentParams(kCharacterAugust)[2] = 1;
-					} else if (!checkCathDir(kCarRestaurant, 50)) {
-						getCharacterCurrentParams(kCharacterAugust)[2] = 0;
-					}
-				} else {
-					getCharacterCurrentParams(kCharacterAugust)[2] = (checkCathDir(kCarRestaurant, 56) && getCharacterCurrentParams(kCharacterAugust)[0]) ? 1 : 0;
-				}
-				break;
-			case 18:
-				switch (getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8]) {
-				case 1:
-					getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 2;
-					AugustCall(&LogicManager::CONS_August_DoWalk, 5, 850, 0, 0);
-					break;
-				case 2:
-					getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 3;
-					AugustCall(&LogicManager::CONS_August_WaitRCClear, 0, 0, 0, 0);
-					break;
-				case 3:
-					getCharacter(kCharacterAugust).characterPosition.position = 1540;
-					getCharacter(kCharacterAugust).characterPosition.location = 0;
-					getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 4;
-					AugustCall(&LogicManager::CONS_August_DoBlockSeqOtis, "105A", 5, 0x39, 0);
-					break;
-				case 4:
-					getCharacter(kCharacterAugust).characterPosition.location = 1;
-					startCycOtis(kCharacterAugust, "105B");
-					getCharacterCurrentParams(kCharacterAugust)[1] = 1;
-					break;
-				case 5:
-					getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 6;
-					AugustCall(&LogicManager::CONS_August_DoWalk, 3, 6470, 0, 0);
-					break;
-				case 6:
-					getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 7;
-					AugustCall(&LogicManager::CONS_August_EnterComp, 0, 0, 0, 0);
-					break;
-				case 7:
-					CONS_August_BackFromSalon(0, 0, 0, 0);
-					break;
-				default:
-					return;
-				}
-				break;
-			}
-		}
-		return;
-	}
-	if (msg->action == 12) {
-		getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 1;
-		AugustCall(&LogicManager::CONS_August_ExitComp, 0, 0, 0, 0);
-		return;
-	}
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		if (getCharacterCurrentParams(kCharacterAugust)[5] != 0x7FFFFFFF && _gameTime) {
-			if (_gameTime > 1179000)
-				goto LABEL_20;
-			if (!inSalon(kCharacterAnna) || inSalon(kCharacterCath) || !getCharacterCurrentParams(kCharacterAugust)[5]) {
-				getCharacterCurrentParams(kCharacterAugust)[5] = _gameTime;
-				if (!_gameTime)
-					goto LABEL_21;
-			}
-			if (getCharacterCurrentParams(kCharacterAugust)[5] < _gameTime) {
-			LABEL_20:
+			if (_gameTime > 1179000) {
 				getCharacterCurrentParams(kCharacterAugust)[5] = 0x7FFFFFFF;
-			LABEL_21:
 				send(kCharacterAugust, kCharacterAnna, 123712592, 0);
+			} else {
+				bool skip = false; // Horrible way to unroll a goto...
+
+				if (!inSalon(kCharacterAnna) || inSalon(kCharacterCath) || !getCharacterCurrentParams(kCharacterAugust)[5]) {
+					getCharacterCurrentParams(kCharacterAugust)[5] = _gameTime;
+					if (!_gameTime) {
+						skip = true;
+						send(kCharacterAugust, kCharacterAnna, 123712592, 0);
+					}
+				}
+
+				if (!skip && getCharacterCurrentParams(kCharacterAugust)[5] < _gameTime) {
+					getCharacterCurrentParams(kCharacterAugust)[5] = 0x7FFFFFFF;
+					send(kCharacterAugust, kCharacterAnna, 123712592, 0);
+				}
 			}
 		}
+
 		if (getCharacterCurrentParams(kCharacterAugust)[0] && rcClear()) {
 			if (!getCharacterCurrentParams(kCharacterAugust)[3]) {
 				getCharacterCurrentParams(kCharacterAugust)[3] = _gameTime + 1800;
 				getCharacterCurrentParams(kCharacterAugust)[4] = _gameTime + 9000;
 			}
+
 			if (getCharacterCurrentParams(kCharacterAugust)[6] != 0x7FFFFFFF && getCharacterCurrentParams(kCharacterAugust)[3] < _gameTime) {
-				if (getCharacterCurrentParams(kCharacterAugust)[4] < _gameTime)
-					goto LABEL_33;
+				if (getCharacterCurrentParams(kCharacterAugust)[4] < _gameTime) {
+					getCharacterCurrentParams(kCharacterAugust)[6] = 0x7FFFFFFF;
+					getCharacter(kCharacterAugust).characterPosition.location = 0;
+					getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 5;
+					AugustCall(&LogicManager::CONS_August_DoBlockSeqOtis, "109D", 5, 0x38, 0);
+					break;
+				}
+
 				if (inSalon(kCharacterCath) || !getCharacterCurrentParams(kCharacterAugust)[6]) {
 					getCharacterCurrentParams(kCharacterAugust)[6] = _gameTime;
-					if (!_gameTime)
-						goto LABEL_34;
+					if (!_gameTime) {
+						getCharacter(kCharacterAugust).characterPosition.location = 0;
+						getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 5;
+						AugustCall(&LogicManager::CONS_August_DoBlockSeqOtis, "109D", 5, 0x38, 0);
+						break;
+					}
 				}
+
 				if (getCharacterCurrentParams(kCharacterAugust)[6] < _gameTime) {
-				LABEL_33:
 					getCharacterCurrentParams(kCharacterAugust)[6] = 0x7FFFFFFF;
-				LABEL_34:
 					getCharacter(kCharacterAugust).characterPosition.location = 0;
 					getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 5;
 					AugustCall(&LogicManager::CONS_August_DoBlockSeqOtis, "109D", 5, 0x38, 0);
-					return;
+					break;
 				}
 			}
 		}
+
 		if (getCharacterCurrentParams(kCharacterAugust)[2]) {
 			if (getCharacterCurrentParams(kCharacterAugust)[7] || (getCharacterCurrentParams(kCharacterAugust)[7] = _currentGameSessionTicks + 90, _currentGameSessionTicks != -90)) {
 				if (getCharacterCurrentParams(kCharacterAugust)[7] >= _currentGameSessionTicks)
-					return;
+					break;
+
 				getCharacterCurrentParams(kCharacterAugust)[7] = 0x7FFFFFFF;
 			}
+
 			bumpCath(kCarRestaurant, 55, 255);
 		} else {
 			getCharacterCurrentParams(kCharacterAugust)[7] = 0;
 		}
+
+		break;
+	case 12:
+		getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 1;
+		AugustCall(&LogicManager::CONS_August_ExitComp, 0, 0, 0, 0);
+		break;
+	case 17:
+		if (getCharacterCurrentParams(kCharacterAugust)[1]) {
+			if (checkCathDir(kCarRestaurant, 57)) {
+				bumpCath(kCarRestaurant, 50, 255);
+				getCharacterCurrentParams(kCharacterAugust)[2] = 1;
+			} else if (!checkCathDir(kCarRestaurant, 50)) {
+				getCharacterCurrentParams(kCharacterAugust)[2] = 0;
+			}
+		} else {
+			getCharacterCurrentParams(kCharacterAugust)[2] = (checkCathDir(kCarRestaurant, 56) && getCharacterCurrentParams(kCharacterAugust)[0]) ? 1 : 0;
+		}
+
+		break;
+	case 18:
+		switch (getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8]) {
+		case 1:
+			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 2;
+			AugustCall(&LogicManager::CONS_August_DoWalk, 5, 850, 0, 0);
+			break;
+		case 2:
+			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 3;
+			AugustCall(&LogicManager::CONS_August_WaitRCClear, 0, 0, 0, 0);
+			break;
+		case 3:
+			getCharacter(kCharacterAugust).characterPosition.position = 1540;
+			getCharacter(kCharacterAugust).characterPosition.location = 0;
+			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 4;
+			AugustCall(&LogicManager::CONS_August_DoBlockSeqOtis, "105A", 5, 57, 0);
+			break;
+		case 4:
+			getCharacter(kCharacterAugust).characterPosition.location = 1;
+			startCycOtis(kCharacterAugust, "105B");
+			getCharacterCurrentParams(kCharacterAugust)[1] = 1;
+			break;
+		case 5:
+			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 6;
+			AugustCall(&LogicManager::CONS_August_DoWalk, 3, 6470, 0, 0);
+			break;
+		case 6:
+			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 7;
+			AugustCall(&LogicManager::CONS_August_EnterComp, 0, 0, 0, 0);
+			break;
+		case 7:
+			CONS_August_BackFromSalon(0, 0, 0, 0);
+			break;
+		default:
+			break;
+		}
+
+		break;
+	case 122358304:
+		getCharacterCurrentParams(kCharacterAugust)[1] = 0;
+		startCycOtis(kCharacterAugust, "BLANK");
+		break;
+	case 159332865:
+		startCycOtis(kCharacterAugust, "106E");
+		getCharacterCurrentParams(kCharacterAugust)[0] = 1;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -2062,7 +2392,8 @@ void LogicManager::CONS_August_BackFromSalon(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_August_BackFromSalon(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		if (_gameProgress[kProgressEventMetAugust]) {
 			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 1;
 			AugustCall(&LogicManager::CONS_August_CompLogic, _gameTime + 9000, 0, 0, 0);
@@ -2070,11 +2401,17 @@ void LogicManager::HAND_August_BackFromSalon(HAND_PARAMS) {
 			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 2;
 			AugustCall(&LogicManager::CONS_August_CompLogic, 1404000, 0, 0, 0);
 		}
-	} else if (msg->action == 18) {
+
+		break;
+	case 18:
 		if (getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8]) {
 			if (getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] <= 2)
 				CONS_August_Asleep(0, 0, 0, 0);
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -2089,16 +2426,22 @@ void LogicManager::CONS_August_Asleep(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_August_Asleep(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			setDoor(3, kCharacterCath, 1, 10, 9);
-			getCharacter(kCharacterAugust).characterPosition.car = kCarGreenSleeping;
-			getCharacter(kCharacterAugust).characterPosition.position = 6470;
-			getCharacter(kCharacterAugust).characterPosition.location = 1;
-			endGraphics(kCharacterAugust);
+	switch (msg->action) {
+	case 0:
+		if (!whoRunningDialog(kCharacterAugust) && _gameProgress[kProgressField18] != 4) {
+			playDialog(kCharacterAugust, "AUG1057", -1, 0);
 		}
-	} else if (!whoRunningDialog(kCharacterAugust) && _gameProgress[kProgressField18] != 4) {
-		playDialog(kCharacterAugust, "AUG1057", -1, 0);
+
+		break;
+	case 12:
+		setDoor(3, kCharacterCath, 1, 10, 9);
+		getCharacter(kCharacterAugust).characterPosition.car = kCarGreenSleeping;
+		getCharacter(kCharacterAugust).characterPosition.position = 6470;
+		getCharacter(kCharacterAugust).characterPosition.location = 1;
+		endGraphics(kCharacterAugust);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -2113,19 +2456,22 @@ void LogicManager::CONS_August_StartPart2(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_August_StartPart2(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			endGraphics(kCharacterAugust);
-			getCharacter(kCharacterAugust).characterPosition.position = 3970;
-			getCharacter(kCharacterAugust).characterPosition.location = 1;
-			getCharacter(kCharacterAugust).characterPosition.car = kCarRestaurant;
-			getCharacter(kCharacterAugust).clothes = 1;
-			getCharacter(kCharacterAugust).inventoryItem = 0;
-			setDoor(3, kCharacterCath, 1, 10, 9);
-			setDoor(11, kCharacterCath, 0, 255, 255);
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		CONS_August_AtBreakfast(0, 0, 0, 0);
+		break;
+	case 12:
+		endGraphics(kCharacterAugust);
+		getCharacter(kCharacterAugust).characterPosition.position = 3970;
+		getCharacter(kCharacterAugust).characterPosition.location = 1;
+		getCharacter(kCharacterAugust).characterPosition.car = kCarRestaurant;
+		getCharacter(kCharacterAugust).clothes = 1;
+		getCharacter(kCharacterAugust).inventoryItem = 0;
+		setDoor(3, kCharacterCath, 1, 10, 9);
+		setDoor(11, kCharacterCath, 0, 255, 255);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -2140,65 +2486,13 @@ void LogicManager::CONS_August_AtBreakfast(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_August_AtBreakfast(HAND_PARAMS) {
-	if (msg->action > 12) {
-		if (msg->action == 18) {
-			switch (getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8]) {
-			case 1:
-				playNIS(kEventAugustGoodMorning);
-				bumpCath(kCarRestaurant, 61, 255);
-				break;
-			case 2:
-				releaseView(kCharacterAugust, kCarRestaurant, 62);
-				startSeqOtis(kCharacterAugust, "803ES");
-				if (inDiningRoom(kCharacterCath))
-					advanceFrame(kCharacterAugust);
-				getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 3;
-				AugustCall(&LogicManager::CONS_August_FinishSeqOtis, 0, 0, 0, 0);
-				break;
-			case 3:
-				send(kCharacterAugust, kCharacterWaiter1, 286534136, 0);
-				getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 4;
-				AugustCall(&LogicManager::CONS_August_DoWalk, 3, 6470, 0, 0);
-				break;
-			case 4:
-				getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 5;
-				AugustCall(&LogicManager::CONS_August_EnterComp, 1, 0, 0, 0);
-				break;
-			case 5:
-				CONS_August_OpenComp(0, 0, 0, 0);
-				break;
-			case 6:
-				if (!_gameEvents[kEventAugustGoodMorning])
-					getCharacter(kCharacterAugust).inventoryItem = 0x80;
-				send(kCharacterAugust, kCharacterWaiter1, 219522616, 0);
-				startCycOtis(kCharacterAugust, "016B");
-				getCharacterCurrentParams(kCharacterAugust)[0] = 1;
-				break;
-			default:
-				return;
-			}
-		} else if (msg->action == 123712592) {
-			startCycOtis(kCharacterAugust, "016A");
-			getCharacter(kCharacterAugust).inventoryItem = 0;
-			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 6;
-			AugustCall(&LogicManager::CONS_August_DoDialog, "AUG2113", 0, 0, 0);
-		}
-	} else if (msg->action == 12) {
-		if (!_gameEvents[kEventAugustGoodMorning])
-			getCharacter(kCharacterAugust).inventoryItem = 0x80;
-		send(kCharacterAugust, kCharacterTableA, 136455232, 0);
-		startCycOtis(kCharacterAugust, "016B");
-	} else if (msg->action) {
-		if (msg->action == 1) {
-			getCharacter(kCharacterAugust).inventoryItem = 0;
-			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 1;
-			AugustCall(&LogicManager::CONS_August_SaveGame, 2, kEventAugustGoodMorning, 0, 0);
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		if (_gameTime > 1755000 && !getCharacterCurrentParams(kCharacterAugust)[1]) {
 			getCharacterCurrentParams(kCharacterAugust)[1] = 1;
 			send(kCharacterAugust, kCharacterWaiter1, 252568704, 0);
 		}
+
 		if (_gameTime > 1773000 && getCharacterCurrentParams(kCharacterAugust)[0] && rcClear()) {
 			getCharacter(kCharacterAugust).characterPosition.location = 0;
 			getCharacter(kCharacterAugust).inventoryItem = 0;
@@ -2206,6 +2500,66 @@ void LogicManager::HAND_August_AtBreakfast(HAND_PARAMS) {
 			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 2;
 			AugustCall(&LogicManager::CONS_August_DoJoinedSeqOtis, "016C", 33, 103798704, "016D");
 		}
+
+		break;
+	case 1:
+		getCharacter(kCharacterAugust).inventoryItem = 0;
+		getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 1;
+		AugustCall(&LogicManager::CONS_August_SaveGame, 2, kEventAugustGoodMorning, 0, 0);
+		break;
+	case 12:
+		if (!_gameEvents[kEventAugustGoodMorning])
+			getCharacter(kCharacterAugust).inventoryItem = 0x80;
+
+		send(kCharacterAugust, kCharacterTableA, 136455232, 0);
+		startCycOtis(kCharacterAugust, "016B");
+		break;
+	case 18:
+		switch (getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8]) {
+		case 1:
+			playNIS(kEventAugustGoodMorning);
+			bumpCath(kCarRestaurant, 61, 255);
+			break;
+		case 2:
+			releaseView(kCharacterAugust, kCarRestaurant, 62);
+			startSeqOtis(kCharacterAugust, "803ES");
+			if (inDiningRoom(kCharacterCath))
+				advanceFrame(kCharacterAugust);
+			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 3;
+			AugustCall(&LogicManager::CONS_August_FinishSeqOtis, 0, 0, 0, 0);
+			break;
+		case 3:
+			send(kCharacterAugust, kCharacterWaiter1, 286534136, 0);
+			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 4;
+			AugustCall(&LogicManager::CONS_August_DoWalk, 3, 6470, 0, 0);
+			break;
+		case 4:
+			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 5;
+			AugustCall(&LogicManager::CONS_August_EnterComp, 1, 0, 0, 0);
+			break;
+		case 5:
+			CONS_August_OpenComp(0, 0, 0, 0);
+			break;
+		case 6:
+			if (!_gameEvents[kEventAugustGoodMorning])
+				getCharacter(kCharacterAugust).inventoryItem = 0x80;
+			send(kCharacterAugust, kCharacterWaiter1, 219522616, 0);
+			startCycOtis(kCharacterAugust, "016B");
+			getCharacterCurrentParams(kCharacterAugust)[0] = 1;
+			break;
+		default:
+			break;
+		}
+
+		break;
+	case 123712592:
+		startCycOtis(kCharacterAugust, "016A");
+		getCharacter(kCharacterAugust).inventoryItem = 0;
+		getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 6;
+		AugustCall(&LogicManager::CONS_August_DoDialog, "AUG2113", 0, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -2227,6 +2581,7 @@ void LogicManager::HAND_August_OpenComp(HAND_PARAMS) {
 			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 5;
 			AugustCall(&LogicManager::CONS_August_ExitComp, 1, 0, 0, 0);
 		}
+
 		break;
 	case 12:
 		setDoor(3, kCharacterCath, 2, 0, 0);
@@ -2243,6 +2598,7 @@ void LogicManager::HAND_August_OpenComp(HAND_PARAMS) {
 				AugustCall(&LogicManager::CONS_August_DoSeqOtis, "506B2", 0, 0, 0);
 			}
 		}
+
 		break;
 	case 18:
 		switch (getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8]) {
@@ -2266,11 +2622,12 @@ void LogicManager::HAND_August_OpenComp(HAND_PARAMS) {
 			AugustCall(&LogicManager::CONS_August_DoWalk, 5, 850, 0, 0);
 			break;
 		default:
-			return;
+			break;
 		}
+
 		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -2285,80 +2642,88 @@ void LogicManager::CONS_August_InSalon(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_August_InSalon(HAND_PARAMS) {
-	if (msg->action > 12) {
-		if (msg->action == 18) {
-			switch (getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8]) {
-			case 1:
-				getCharacter(kCharacterAugust).characterPosition.position = 1540;
-				getCharacter(kCharacterAugust).characterPosition.location = 0;
-				getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 2;
-				AugustCall(&LogicManager::CONS_August_DoBlockSeqOtis, "109A", 5, 56, 0);
-				break;
-			case 2:
-				takeItem(kItem3);
-				getCharacter(kCharacterAugust).characterPosition.location = 1;
-				startCycOtis(kCharacterAugust, "109B");
-				break;
-			case 3:
-				getCharacter(kCharacterAugust).characterPosition.location = 0;
-				getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 4;
-				AugustCall(&LogicManager::CONS_August_DoBlockSeqOtis, "109D2", 5, 56, 0);
-				break;
-			case 4:
-				dropItem(kItem3, 1);
-				getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 5;
-				AugustCall(&LogicManager::CONS_August_LookingForCath, 1849500, 0, 0, 0);
-				break;
-			case 5:
-				CONS_August_EndPart2(0, 0, 0, 0);
-				break;
-			case 6:
-				getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 7;
-				AugustCall(&LogicManager::CONS_August_DoDialog, "AUG2114", 0, 0, 0);
-				break;
-			case 7:
-				startCycOtis(kCharacterAugust, "108C");
-				blockView(kCharacterAugust, kCarRestaurant, 56);
-				blockView(kCharacterAugust, kCarRestaurant, 57);
-				getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 8;
-				AugustCall(&LogicManager::CONS_August_DoDialog, "AUG2114A", 0, 0, 0);
-				break;
-			case 8:
-				getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 9;
-				AugustCall(&LogicManager::CONS_August_DoDialog, "AUG2115", 0, 0, 0);
-				break;
-			case 9:
-				getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 10;
-				AugustCall(&LogicManager::CONS_August_DoComplexSeqOtis, "108D1", "108D2", 0x17, 0);
-				break;
-			case 0xA:
-				startCycOtis(kCharacterAugust, "109B");
-				releaseView(kCharacterAugust, kCarRestaurant, 56);
-				releaseView(kCharacterAugust, kCarRestaurant, 57);
-				send(kCharacterAugust, kCharacterRebecca, 125496184, 0);
-				break;
-			default:
-				return;
-			}
-		} else if (msg->action == 169358379) {
-			send(kCharacterAugust, kCharacterRebecca, 155465152, 0);
-			startCycOtis(kCharacterAugust, "108A");
-			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 6;
-			AugustCall(&LogicManager::CONS_August_DoWait, 900, 0, 0, 0);
-		}
-	} else if (msg->action == 12) {
-		getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 1;
-		AugustCall(&LogicManager::CONS_August_WaitRCClear, 0, 0, 0, 0);
-	} else if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		if (_gameTime > 1801800 && !getCharacterCurrentParams(kCharacterAugust)[0]) {
 			getCharacterCurrentParams(kCharacterAugust)[0] = 1;
 			send(kCharacterAugust, kCharacterRebecca, 155980128, 0);
 		}
+
 		if (_gameTime > 1820700 && !getCharacterCurrentParams(kCharacterAugust)[1]) {
 			getCharacterCurrentParams(kCharacterAugust)[1] = 1;
 			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 3;
 			AugustCall(&LogicManager::CONS_August_WaitRCClear, 0, 0, 0, 0);
 		}
+
+		break;
+	case 12:
+		getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 1;
+		AugustCall(&LogicManager::CONS_August_WaitRCClear, 0, 0, 0, 0);
+		break;
+	case 18:
+		switch (getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8]) {
+		case 1:
+			getCharacter(kCharacterAugust).characterPosition.position = 1540;
+			getCharacter(kCharacterAugust).characterPosition.location = 0;
+			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 2;
+			AugustCall(&LogicManager::CONS_August_DoBlockSeqOtis, "109A", 5, 56, 0);
+			break;
+		case 2:
+			takeItem(kItem3);
+			getCharacter(kCharacterAugust).characterPosition.location = 1;
+			startCycOtis(kCharacterAugust, "109B");
+			break;
+		case 3:
+			getCharacter(kCharacterAugust).characterPosition.location = 0;
+			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 4;
+			AugustCall(&LogicManager::CONS_August_DoBlockSeqOtis, "109D2", 5, 56, 0);
+			break;
+		case 4:
+			dropItem(kItem3, 1);
+			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 5;
+			AugustCall(&LogicManager::CONS_August_LookingForCath, 1849500, 0, 0, 0);
+			break;
+		case 5:
+			CONS_August_EndPart2(0, 0, 0, 0);
+			break;
+		case 6:
+			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 7;
+			AugustCall(&LogicManager::CONS_August_DoDialog, "AUG2114", 0, 0, 0);
+			break;
+		case 7:
+			startCycOtis(kCharacterAugust, "108C");
+			blockView(kCharacterAugust, kCarRestaurant, 56);
+			blockView(kCharacterAugust, kCarRestaurant, 57);
+			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 8;
+			AugustCall(&LogicManager::CONS_August_DoDialog, "AUG2114A", 0, 0, 0);
+			break;
+		case 8:
+			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 9;
+			AugustCall(&LogicManager::CONS_August_DoDialog, "AUG2115", 0, 0, 0);
+			break;
+		case 9:
+			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 10;
+			AugustCall(&LogicManager::CONS_August_DoComplexSeqOtis, "108D1", "108D2", 23, 0);
+			break;
+		case 10:
+			startCycOtis(kCharacterAugust, "109B");
+			releaseView(kCharacterAugust, kCarRestaurant, 56);
+			releaseView(kCharacterAugust, kCarRestaurant, 57);
+			send(kCharacterAugust, kCharacterRebecca, 125496184, 0);
+			break;
+		default:
+			break;
+		}
+
+		break;
+	case 169358379:
+		send(kCharacterAugust, kCharacterRebecca, 155465152, 0);
+		startCycOtis(kCharacterAugust, "108A");
+		getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 6;
+		AugustCall(&LogicManager::CONS_August_DoWait, 900, 0, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -2373,15 +2738,24 @@ void LogicManager::CONS_August_EndPart2(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_August_EndPart2(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		if (!getCharacterParams(kCharacterAugust, 8)[0])
 			playDialog(0, "BUMP", -1, 0);
+
 		getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 1;
 		AugustCall(&LogicManager::CONS_August_SaveGame, 2, kEventAugustArrivalInMunich, 0, 0);
-	} else if (msg->action == 18 && getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] == 1) {
-		playNIS(kEventAugustArrivalInMunich);
-		send(kCharacterAugust, kCharacterMaster, 139122728, 0);
-		endGraphics(kCharacterAugust);
+		break;
+	case 18:
+		if (getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] == 1) {
+			playNIS(kEventAugustArrivalInMunich);
+			send(kCharacterAugust, kCharacterMaster, 139122728, 0);
+			endGraphics(kCharacterAugust);
+		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -2396,17 +2770,20 @@ void LogicManager::CONS_August_StartPart3(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_August_StartPart3(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			endGraphics(kCharacterAugust);
-			getCharacter(kCharacterAugust).characterPosition.position = 6470;
-			getCharacter(kCharacterAugust).characterPosition.location = 0;
-			getCharacter(kCharacterAugust).characterPosition.car = kCarGreenSleeping;
-			getCharacter(kCharacterAugust).inventoryItem = 0;
-			getCharacter(kCharacterAugust).clothes = 1;
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		CONS_August_GoLunch(0, 0, 0, 0);
+		break;
+	case 12:
+		endGraphics(kCharacterAugust);
+		getCharacter(kCharacterAugust).characterPosition.position = 6470;
+		getCharacter(kCharacterAugust).characterPosition.location = 0;
+		getCharacter(kCharacterAugust).characterPosition.car = kCarGreenSleeping;
+		getCharacter(kCharacterAugust).inventoryItem = 0;
+		getCharacter(kCharacterAugust).clothes = 1;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -2449,11 +2826,13 @@ void LogicManager::HAND_August_DoWalkP3A(HAND_PARAMS) {
 				break;
 			}
 		}
+
 		break;
 	case 1:
 		getCharacterCurrentParams(kCharacterAugust)[2] = 0;
 		getCharacter(kCharacterAugust).inventoryItem = 0;
 		playNIS(((getCharacter(kCharacterAugust).characterPosition.position < getCharacter(kCharacterCath).characterPosition.position) + 22));
+
 		if (getCharacter(kCharacterAugust).direction == 1)
 			bumpCathFx(getCharacter(kCharacterAugust).characterPosition.car, getCharacter(kCharacterAugust).characterPosition.position - 750);
 		else
@@ -2470,6 +2849,7 @@ void LogicManager::HAND_August_DoWalkP3A(HAND_PARAMS) {
 		} else {
 			playCathExcuseMe();
 		}
+
 		break;
 	case 6:
 		playChrExcuseMe(kCharacterAugust, kCharacterCath, 0);
@@ -2482,9 +2862,10 @@ void LogicManager::HAND_August_DoWalkP3A(HAND_PARAMS) {
 		} else if (_gameEvents[kEventAugustMerchandise] && !_gameEvents[kEventAugustTalkGold] && !_gameEvents[kEventAugustTalkGoldDay]) {
 			getCharacterCurrentParams(kCharacterAugust)[2] = 128;
 		}
+
 		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -2518,6 +2899,7 @@ void LogicManager::HAND_August_DoWalkP3B(HAND_PARAMS) {
 			_engine->getMessageManager()->setMessageHandle(kCharacterAugust, _functionsAugust[getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall]]);
 			fedEx(kCharacterAugust, kCharacterAugust, 18, 0);
 		}
+
 		break;
 	case 1:
 		getCharacterCurrentParams(kCharacterAugust)[3] = 0;
@@ -2549,7 +2931,7 @@ void LogicManager::HAND_August_DoWalkP3B(HAND_PARAMS) {
 
 		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -2564,77 +2946,84 @@ void LogicManager::CONS_August_GoLunch(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_August_GoLunch(HAND_PARAMS) {
-	if (msg->action > 12) {
-		switch (msg->action) {
-		case 18:
-			switch (getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8]) {
-			case 1:
-				getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 2;
-				AugustCall(&LogicManager::CONS_August_DoWalkP3A, 5, 850, 0, 0);
-				break;
-			case 2:
-				getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 3;
-				AugustCall(&LogicManager::CONS_August_WaitRCClear, 0, 0, 0, 0);
-				break;
-			case 3:
-				getCharacter(kCharacterAugust).characterPosition.position = 1540;
-				getCharacter(kCharacterAugust).characterPosition.location = 0;
-				getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 4;
-				AugustCall(&LogicManager::CONS_August_DoSeqOtis, "803VS", 0, 0, 0);
-				break;
-			case 4:
-				startSeqOtis(kCharacterAugust, "010A2");
-				if (inSalon(kCharacterCath))
-					advanceFrame(kCharacterAugust);
-				getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 5;
-				AugustCall(&LogicManager::CONS_August_FinishJoinedSeqOtis, 36, 136455232, "BOGUS", 0);
-				break;
-			case 5:
-				getCharacter(kCharacterAugust).characterPosition.location = 1;
-				startCycOtis(kCharacterAugust, "010B2");
-				if (!_gameEvents[kEventAugustLunch])
-					getCharacter(kCharacterAugust).inventoryItem = 0x80;
-				break;
-			case 6:
-				playNIS(kEventAugustLunch);
-				cleanNIS();
-				break;
-			default:
-				return;
-			}
-
-			break;
-		case 122288808:
-			getCharacterCurrentParams(kCharacterAugust)[0] = 0;
-			getCharacter(kCharacterAugust).inventoryItem = 0;
-			getCharacter(kCharacterAugust).characterPosition.location = 1;
-			startCycOtis(kCharacterAugust, "112G");
-			break;
-		case 122358304:
-			getCharacterCurrentParams(kCharacterAugust)[0] = 1;
-			getCharacter(kCharacterAugust).inventoryItem = 0;
-			break;
-		}
-	} else if (msg->action == 12) {
-		getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 1;
-		AugustCall(&LogicManager::CONS_August_ExitComp, 1, 0, 0, 0);
-	} else if (msg->action) {
-		if (msg->action == 1) {
-			getCharacter(kCharacterAugust).inventoryItem = 0;
-			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 6;
-			AugustCall(&LogicManager::CONS_August_SaveGame, 2, kEventAugustLunch, 0, 0);
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		if (_gameTime > 1953000 && !getCharacterCurrentParams(kCharacterAugust)[1]) {
 			getCharacterCurrentParams(kCharacterAugust)[1] = 1;
 			send(kCharacterAugust, kCharacterAnna, 291662081, 0);
 		}
+
 		if (getCharacterCurrentParams(kCharacterAugust)[0])
 			getCharacter(kCharacterAugust).characterPosition = getCharacter(kCharacterAnna).characterPosition;
+
 		if (_gameTime > 2016000 && !getCharacterCurrentParams(kCharacterAugust)[0] && rcClear()) {
 			getCharacter(kCharacterAugust).inventoryItem = 0;
 			CONS_August_ReturnLunch(0, 0, 0, 0);
 		}
+
+		break;
+	case 1:
+		getCharacter(kCharacterAugust).inventoryItem = 0;
+		getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 6;
+		AugustCall(&LogicManager::CONS_August_SaveGame, 2, kEventAugustLunch, 0, 0);
+		break;
+	case 12:
+		getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 1;
+		AugustCall(&LogicManager::CONS_August_ExitComp, 1, 0, 0, 0);
+		break;
+	case 18:
+		switch (getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8]) {
+		case 1:
+			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 2;
+			AugustCall(&LogicManager::CONS_August_DoWalkP3A, 5, 850, 0, 0);
+			break;
+		case 2:
+			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 3;
+			AugustCall(&LogicManager::CONS_August_WaitRCClear, 0, 0, 0, 0);
+			break;
+		case 3:
+			getCharacter(kCharacterAugust).characterPosition.position = 1540;
+			getCharacter(kCharacterAugust).characterPosition.location = 0;
+			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 4;
+			AugustCall(&LogicManager::CONS_August_DoSeqOtis, "803VS", 0, 0, 0);
+			break;
+		case 4:
+			startSeqOtis(kCharacterAugust, "010A2");
+
+			if (inSalon(kCharacterCath))
+				advanceFrame(kCharacterAugust);
+
+			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 5;
+			AugustCall(&LogicManager::CONS_August_FinishJoinedSeqOtis, 36, 136455232, "BOGUS", 0);
+			break;
+		case 5:
+			getCharacter(kCharacterAugust).characterPosition.location = 1;
+			startCycOtis(kCharacterAugust, "010B2");
+			if (!_gameEvents[kEventAugustLunch])
+				getCharacter(kCharacterAugust).inventoryItem = 0x80;
+
+			break;
+		case 6:
+			playNIS(kEventAugustLunch);
+			cleanNIS();
+			break;
+		default:
+			break;
+		}
+
+		break;
+	case 122288808:
+		getCharacterCurrentParams(kCharacterAugust)[0] = 0;
+		getCharacter(kCharacterAugust).inventoryItem = 0;
+		getCharacter(kCharacterAugust).characterPosition.location = 1;
+		startCycOtis(kCharacterAugust, "112G");
+		break;
+	case 122358304:
+		getCharacterCurrentParams(kCharacterAugust)[0] = 1;
+		getCharacter(kCharacterAugust).inventoryItem = 0;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -2649,34 +3038,46 @@ void LogicManager::CONS_August_ReturnLunch(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_August_ReturnLunch(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterAugust).characterPosition.location = 0;
 		getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 1;
 		AugustCall(&LogicManager::CONS_August_DoBlockSeqOtis, "112H", 5, 57, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8]) {
 		case 1:
-			if (_gameEvents[kEventAugustMerchandise])
-				goto LABEL_16;
-			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 2;
-			AugustCall(&LogicManager::CONS_August_LookingForCath, 2043000, 0, 0, 0);
+			if (_gameEvents[kEventAugustMerchandise]) {
+				getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 4;
+				AugustCall(&LogicManager::CONS_August_DoWalkP3A, 3, 6470, 0, 0);
+			} else {
+				getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 2;
+				AugustCall(&LogicManager::CONS_August_LookingForCath, 2043000, 0, 0, 0);
+			}
+
 			break;
 		case 2:
-			if (!getCharacterParams(kCharacterAugust, 8)[0])
-				goto LABEL_16;
-			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 3;
-			AugustCall(&LogicManager::CONS_August_SaveGame, 2, kEventAugustMerchandise, 0, 0);
+			if (!getCharacterParams(kCharacterAugust, 8)[0]) {
+				getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 4;
+				AugustCall(&LogicManager::CONS_August_DoWalkP3A, 3, 6470, 0, 0);
+			} else {
+				getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 3;
+				AugustCall(&LogicManager::CONS_August_SaveGame, 2, kEventAugustMerchandise, 0, 0);
+			}
+
 			break;
 		case 3:
 			playNIS(kEventAugustMerchandise);
 			if (getCharacter(kCharacterAugust).characterPosition.car == kCarGreenSleeping && nearX(kCharacterAugust, 6470, 500))
 				getCharacter(kCharacterAugust).characterPosition.position = 5970;
+
 			walk(kCharacterAugust, kCarGreenSleeping, 6470);
+
 			if (getCharacter(kCharacterAugust).direction == 1)
 				bumpCathFx(getCharacter(kCharacterAugust).characterPosition.car, getCharacter(kCharacterAugust).characterPosition.position - 750);
 			else
 				bumpCathRx(getCharacter(kCharacterAugust).characterPosition.car, getCharacter(kCharacterAugust).characterPosition.position + 750);
-		LABEL_16:
+
 			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 4;
 			AugustCall(&LogicManager::CONS_August_DoWalkP3A, 3, 6470, 0, 0);
 			break;
@@ -2688,8 +3089,12 @@ void LogicManager::HAND_August_ReturnLunch(HAND_PARAMS) {
 			CONS_August_AfterLunch(0, 0, 0, 0);
 			break;
 		default:
-			return;
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -2704,20 +3109,27 @@ void LogicManager::CONS_August_AfterLunch(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_August_AfterLunch(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 1) {
+	switch (msg->action) {
+	case 0:
+		if (_gameTime > 2061000 && !getCharacterCurrentParams(kCharacterAugust)[0]) {
+			getCharacterCurrentParams(kCharacterAugust)[0] = 1;
 			getCharacter(kCharacterAugust).inventoryItem = 0;
-			playDialog(kCharacterCath, "CAT1002", -1, 0);
-			playDialog(kCharacterAugust, "AUG3102", -1, 15);
-		} else if (msg->action == 12) {
-			setDoor(3, 0, 2, 0, 0);
-			startCycOtis(kCharacterAugust, "506A2");
-			getCharacter(kCharacterAugust).inventoryItem = 0x92;
-		}
-	} else if (_gameTime > 2061000 && !getCharacterCurrentParams(kCharacterAugust)[0]) {
-		getCharacterCurrentParams(kCharacterAugust)[0] = 1;
+			CONS_August_Reading(0, 0, 0, 0);
+		}
+
+		break;
+	case 1:
 		getCharacter(kCharacterAugust).inventoryItem = 0;
-		CONS_August_Reading(0, 0, 0, 0);
+		playDialog(kCharacterCath, "CAT1002", -1, 0);
+		playDialog(kCharacterAugust, "AUG3102", -1, 15);
+		break;
+	case 12:
+		setDoor(3, 0, 2, 0, 0);
+		startCycOtis(kCharacterAugust, "506A2");
+		getCharacter(kCharacterAugust).inventoryItem = 0x92;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -2731,26 +3143,36 @@ void LogicManager::CONS_August_Reading(CONS_PARAMS) {
 	fedEx(kCharacterAugust, kCharacterAugust, 12, 0);
 }
 
-void LogicManager::HAND_August_Reading(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 17) {
-			if (checkCathDir(kCarGreenSleeping, 43)) {
-				getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 2;
-				AugustCall(&LogicManager::CONS_August_DoSeqOtis, "507B2", 0, 0, 0);
-			}
-		} else if (msg->action == 18) {
-			if (getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] == 1) {
-				CONS_August_Dressing(0, 0, 0, 0);
-			} else if (getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] == 2) {
-				if (checkCathDir(kCarGreenSleeping, 43))
-					bumpCath(kCarGreenSleeping, 34, 255);
-				endGraphics(kCharacterAugust);
-			}
+void LogicManager::HAND_August_Reading(HAND_PARAMS) {
+	switch (msg->action) {
+	case 0:
+		if (_gameTime > 2088000 && !getCharacterCurrentParams(kCharacterAugust)[0]) {
+			getCharacterCurrentParams(kCharacterAugust)[0] = 1;
+			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 1;
+			AugustCall(&LogicManager::CONS_August_BathroomTrip, 0, 0, 0, 0);
+		}
+
+		break;
+	case 17:
+		if (checkCathDir(kCarGreenSleeping, 43)) {
+			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 2;
+			AugustCall(&LogicManager::CONS_August_DoSeqOtis, "507B2", 0, 0, 0);
+		}
+
+		break;
+	case 18:
+		if (getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] == 1) {
+			CONS_August_Dressing(0, 0, 0, 0);
+		} else if (getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] == 2) {
+			if (checkCathDir(kCarGreenSleeping, 43))
+				bumpCath(kCarGreenSleeping, 34, 255);
+
+			endGraphics(kCharacterAugust);
 		}
-	} else if (_gameTime > 2088000 && !getCharacterCurrentParams(kCharacterAugust)[0]) {
-		getCharacterCurrentParams(kCharacterAugust)[0] = 1;
-		getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 1;
-		AugustCall(&LogicManager::CONS_August_BathroomTrip, 0, 0, 0, 0);
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -2765,10 +3187,12 @@ void LogicManager::CONS_August_BathroomTrip(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_August_BathroomTrip(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 1;
 		AugustCall(&LogicManager::CONS_August_ExitComp, 1, 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8]) {
 		case 1:
 			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 2;
@@ -2793,8 +3217,12 @@ void LogicManager::HAND_August_BathroomTrip(HAND_PARAMS) {
 			fedEx(kCharacterAugust, kCharacterAugust, 18, 0);
 			break;
 		default:
-			return;
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -2815,15 +3243,18 @@ void LogicManager::HAND_August_Dressing(HAND_PARAMS) {
 			getCharacterCurrentParams(kCharacterAugust)[0] = 1;
 			CONS_August_GoConcert(0, 0, 0, 0);
 		}
+
 		break;
 	case 8:
 	case 9:
 		if (!_gameEvents[kEventAugustTalkCompartmentDoorBlueRedingote] && !_gameEvents[kEventAugustTalkCompartmentDoor] && !_gameEvents[kEventAugustBringEgg] && !_gameEvents[kEventAugustBringBriefcase]) {
 			if (msg->action == 8)
 				playDialog(0, "LIB012", -1, 0);
+
 			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 1;
 			AugustCall(&LogicManager::CONS_August_SaveGame, 2, kEventAugustTalkCompartmentDoor, 0, 0);
 		}
+
 		break;
 	case 12:
 		setDoor(3, kCharacterAugust, 1, 10, 9);
@@ -2838,9 +3269,10 @@ void LogicManager::HAND_August_Dressing(HAND_PARAMS) {
 		} else if (getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] == 2) {
 			CONS_August_GoConcert(0, 0, 0, 0);
 		}
+
 		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -2855,16 +3287,22 @@ void LogicManager::CONS_August_GoConcert(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_August_GoConcert(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 1;
 		AugustCall(&LogicManager::CONS_August_ExitComp, 0, 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		if (getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] == 1) {
 			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 2;
 			AugustCall(&LogicManager::CONS_August_DoWalk, 2, 9270, 0, 0);
 		} else if (getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] == 2) {
 			CONS_August_Concert(0, 0, 0, 0);
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -2879,14 +3317,19 @@ void LogicManager::CONS_August_Concert(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_August_Concert(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		setDoor(3, kCharacterCath, 1, 10, 9);
 		endGraphics(kCharacterAugust);
 		getCharacter(kCharacterAugust).characterPosition.car = kCarKronos;
 		getCharacter(kCharacterAugust).characterPosition.position = 6000;
 		getCharacter(kCharacterAugust).characterPosition.location = 1;
-	} else if (msg->action == 191668032) {
+		break;
+	case 191668032:
 		CONS_August_StalkAnna(0, 0, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -2901,20 +3344,15 @@ void LogicManager::CONS_August_StalkAnna(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_August_StalkAnna(HAND_PARAMS) {
-	if (msg->action > 18) {
-		switch (msg->action) {
-		case 122288808:
-			CONS_August_AfterConcert(0, 0, 0, 0);
-			break;
-		case 122358304:
-			startCycOtis(kCharacterAugust, "BLANK");
-			break;
-		case 169032608:
-			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 3;
-			AugustCall(&LogicManager::CONS_August_DoWalkP3B, 4, 3820, 1, 0);
-			break;
-		}
-	} else if (msg->action == 18) {
+	switch (msg->action) {
+	case 12:
+		getCharacter(kCharacterAugust).characterPosition.car = kCarGreenSleeping;
+		getCharacter(kCharacterAugust).characterPosition.position = 850;
+		getCharacter(kCharacterAugust).characterPosition.location = 0;
+		getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 1;
+		AugustCall(&LogicManager::CONS_August_DoWalkP3B, 3, 5790, 0, 0);
+		break;
+	case 18:
 		switch (getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8]) {
 		case 1:
 			send(kCharacterAugust, kCharacterTatiana, 191668032, 0);
@@ -2928,13 +3366,23 @@ void LogicManager::HAND_August_StalkAnna(HAND_PARAMS) {
 			startCycOtis(kCharacterAugust, "BLANK");
 			send(kCharacterAugust, kCharacterAnna, 123712592, 0);
 			break;
+		default:
+			break;
 		}
-	} else if (msg->action == 12) {
-		getCharacter(kCharacterAugust).characterPosition.car = kCarGreenSleeping;
-		getCharacter(kCharacterAugust).characterPosition.position = 850;
-		getCharacter(kCharacterAugust).characterPosition.location = 0;
-		getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 1;
-		AugustCall(&LogicManager::CONS_August_DoWalkP3B, 3, 5790, 0, 0);
+
+		break;
+	case 122288808:
+		CONS_August_AfterConcert(0, 0, 0, 0);
+		break;
+	case 122358304:
+		startCycOtis(kCharacterAugust, "BLANK");
+		break;
+	case 169032608:
+		getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 3;
+		AugustCall(&LogicManager::CONS_August_DoWalkP3B, 4, 3820, 1, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -2956,11 +3404,13 @@ void LogicManager::HAND_August_AfterConcert(HAND_PARAMS) {
 			getCharacter(kCharacterCath).characterPosition.location = 1;
 			if (msg->action == 8)
 				playDialog(0, "LIB012", -1, 0);
+
 			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 3;
 			AugustCall(&LogicManager::CONS_August_SaveGame, 2, kEventAugustBringBriefcase, 0, 0);
 		} else if (!cathHasItem(kItemFirebird) || _gameEvents[kEventAugustBringEgg]) {
 			if (_gameEvents[kEventAugustTalkCompartmentDoorBlueRedingote] || _gameEvents[kEventAugustBringEgg] || _gameEvents[kEventAugustBringBriefcase]) {
 				setDoor(3, kCharacterAugust, 1, 0, 0);
+
 				if (msg->action == 8) {
 					getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 6;
 					AugustCall(&LogicManager::CONS_August_DoDialog, "LIB012", 0, 0, 0);
@@ -2971,6 +3421,7 @@ void LogicManager::HAND_August_AfterConcert(HAND_PARAMS) {
 			} else {
 				if (msg->action == 8)
 					playDialog(0, "LIB012", -1, 0);
+
 				getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 5;
 				AugustCall(&LogicManager::CONS_August_SaveGame, 2, kEventAugustBringEgg, 0, 0);
 			}
@@ -2978,6 +3429,7 @@ void LogicManager::HAND_August_AfterConcert(HAND_PARAMS) {
 			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 4;
 			AugustCall(&LogicManager::CONS_August_SaveGame, 2, kEventAugustBringEgg, 0, 0);
 		}
+
 		break;
 	case 12:
 		getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 1;
@@ -3017,11 +3469,12 @@ void LogicManager::HAND_August_AfterConcert(HAND_PARAMS) {
 			setDoor(3, kCharacterAugust, 1, 10, 9);
 			break;
 		default:
-			return;
+			break;
 		}
+
 		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -3036,10 +3489,12 @@ void LogicManager::CONS_August_Satisfied(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_August_Satisfied(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 1;
 		AugustCall(&LogicManager::CONS_August_DoWait, 2700, 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8]) {
 		case 1:
 			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 2;
@@ -3052,7 +3507,13 @@ void LogicManager::HAND_August_Satisfied(HAND_PARAMS) {
 		case 3:
 			CONS_August_InSalon3(0, 0, 0, 0);
 			break;
+		default:
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -3067,74 +3528,8 @@ void LogicManager::CONS_August_InSalon3(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_August_InSalon3(HAND_PARAMS) {
-	if (msg->action > 12) {
-		if (msg->action > 122288808) {
-			if (msg->action == 122358304) {
-				startCycOtis(kCharacterAugust, "BLANK");
-				getCharacterCurrentParams(kCharacterAugust)[1] = 1;
-				getCharacterCurrentParams(kCharacterAugust)[2] = 1;
-			} else if (msg->action == 136196244) {
-				getCharacterCurrentParams(kCharacterAugust)[1] = 1;
-				getCharacter(kCharacterAugust).inventoryItem = 0;
-			}
-		} else {
-			switch (msg->action) {
-			case 122288808:
-				startCycOtis(kCharacterAugust, "122B");
-				getCharacterCurrentParams(kCharacterAugust)[1] = 0;
-				if (_gameEvents[kEventAugustTalkCigar])
-					getCharacterCurrentParams(kCharacterAugust)[0] = 9000;
-				break;
-			case 17:
-				if (!checkCathDir(kCarRestaurant, 60) || getCharacterCurrentParams(kCharacterAugust)[2]) {
-					if (!getCharacterCurrentParams(kCharacterAugust)[1] && checkCathDir(kCarRestaurant, 57))
-						bumpCath(kCarRestaurant, 50, 255);
-				} else if (!getCharacterCurrentParams(kCharacterAugust)[1]) {
-					blockView(kCharacterAugust, kCarRestaurant, 57);
-					startSeqOtis(kCharacterAugust, "105C3");
-				}
-				break;
-			case 18:
-				switch (getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8]) {
-				case 1:
-					getCharacter(kCharacterAugust).characterPosition.position = 1540;
-					getCharacter(kCharacterAugust).characterPosition.location = 0;
-					getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 2;
-					AugustCall(&LogicManager::CONS_August_DoBlockSeqOtis, "105A3", 5, 57, 0);
-					break;
-				case 2:
-					getCharacter(kCharacterAugust).characterPosition.location = 1;
-					send(kCharacterAugust, kCharacterAbbot, 123712592, 0);
-					startCycOtis(kCharacterAugust, "105B3");
-					getCharacterCurrentParams(kCharacterAugust)[3] = 1;
-					break;
-				case 3:
-					playNIS(kEventAugustTalkCigar);
-					if (getCharacterCurrentParams(kCharacterAugust)[2])
-						startCycOtis(kCharacterAugust, "122B");
-					else
-						startCycOtis(kCharacterAugust, "105B3");
-					cleanNIS();
-					getCharacterCurrentParams(kCharacterAugust)[0] = 9000;
-					getCharacterCurrentParams(kCharacterAugust)[3] = 0;
-					break;
-				}
-				break;
-			}
-		}
-	} else if (msg->action == 12) {
-		getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 1;
-		AugustCall(&LogicManager::CONS_August_WaitRCClear, 0, 0, 0, 0);
-	} else if (msg->action) {
-		if (msg->action == 1) {
-			getCharacter(kCharacterAugust).inventoryItem = 0;
-			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 3;
-			AugustCall(&LogicManager::CONS_August_SaveGame, 2, kEventAugustTalkCigar, 0, 0);
-		} else if (msg->action == 3) {
-			releaseView(kCharacterAugust, kCarRestaurant, 57);
-			startCycOtis(kCharacterAugust, "105B3");
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		if (!getCharacterCurrentParams(kCharacterAugust)[3] || getCharacterCurrentParams(kCharacterAugust)[1] || _gameProgress[kProgressField44]) {
 			getCharacter(kCharacterAugust).inventoryItem = 0;
 		} else {
@@ -3145,7 +3540,7 @@ void LogicManager::HAND_August_InSalon3(HAND_PARAMS) {
 			if (getCharacterCurrentParams(kCharacterAugust)[0]) {
 				if (getCharacterCurrentParams(kCharacterAugust)[4] || (getCharacterCurrentParams(kCharacterAugust)[4] = _gameTime + getCharacterCurrentParams(kCharacterAugust)[0], _gameTime + getCharacterCurrentParams(kCharacterAugust)[0] != 0)) {
 					if (getCharacterCurrentParams(kCharacterAugust)[4] >= _gameTime)
-						return;
+						break;
 
 					getCharacterCurrentParams(kCharacterAugust)[4] = 0x7FFFFFFF;
 				}
@@ -3154,6 +3549,78 @@ void LogicManager::HAND_August_InSalon3(HAND_PARAMS) {
 				CONS_August_LeaveSalon(0, 0, 0, 0);
 			}
 		}
+
+		break;
+	case 1:
+		getCharacter(kCharacterAugust).inventoryItem = 0;
+		getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 3;
+		AugustCall(&LogicManager::CONS_August_SaveGame, 2, kEventAugustTalkCigar, 0, 0);
+		break;
+	case 3:
+		releaseView(kCharacterAugust, kCarRestaurant, 57);
+		startCycOtis(kCharacterAugust, "105B3");
+		break;
+	case 12:
+		getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 1;
+		AugustCall(&LogicManager::CONS_August_WaitRCClear, 0, 0, 0, 0);
+		break;
+	case 17:
+		if (!checkCathDir(kCarRestaurant, 60) || getCharacterCurrentParams(kCharacterAugust)[2]) {
+			if (!getCharacterCurrentParams(kCharacterAugust)[1] && checkCathDir(kCarRestaurant, 57))
+				bumpCath(kCarRestaurant, 50, 255);
+		} else if (!getCharacterCurrentParams(kCharacterAugust)[1]) {
+			blockView(kCharacterAugust, kCarRestaurant, 57);
+			startSeqOtis(kCharacterAugust, "105C3");
+		}
+
+		break;
+	case 18:
+		switch (getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8]) {
+		case 1:
+			getCharacter(kCharacterAugust).characterPosition.position = 1540;
+			getCharacter(kCharacterAugust).characterPosition.location = 0;
+			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 2;
+			AugustCall(&LogicManager::CONS_August_DoBlockSeqOtis, "105A3", 5, 57, 0);
+			break;
+		case 2:
+			getCharacter(kCharacterAugust).characterPosition.location = 1;
+			send(kCharacterAugust, kCharacterAbbot, 123712592, 0);
+			startCycOtis(kCharacterAugust, "105B3");
+			getCharacterCurrentParams(kCharacterAugust)[3] = 1;
+			break;
+		case 3:
+			playNIS(kEventAugustTalkCigar);
+			if (getCharacterCurrentParams(kCharacterAugust)[2])
+				startCycOtis(kCharacterAugust, "122B");
+			else
+				startCycOtis(kCharacterAugust, "105B3");
+			cleanNIS();
+			getCharacterCurrentParams(kCharacterAugust)[0] = 9000;
+			getCharacterCurrentParams(kCharacterAugust)[3] = 0;
+			break;
+		default:
+			break;
+		}
+
+		break;
+	case 122288808:
+		startCycOtis(kCharacterAugust, "122B");
+		getCharacterCurrentParams(kCharacterAugust)[1] = 0;
+		if (_gameEvents[kEventAugustTalkCigar])
+			getCharacterCurrentParams(kCharacterAugust)[0] = 9000;
+
+		break;
+	case 122358304:
+		startCycOtis(kCharacterAugust, "BLANK");
+		getCharacterCurrentParams(kCharacterAugust)[1] = 1;
+		getCharacterCurrentParams(kCharacterAugust)[2] = 1;
+		break;
+	case 136196244:
+		getCharacterCurrentParams(kCharacterAugust)[1] = 1;
+		getCharacter(kCharacterAugust).inventoryItem = 0;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -3168,10 +3635,12 @@ void LogicManager::CONS_August_LeaveSalon(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_August_LeaveSalon(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 1;
 		AugustCall(&LogicManager::CONS_August_WaitRCClear, 0, 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8]) {
 		case 1:
 			getCharacter(kCharacterAugust).characterPosition.location = 0;
@@ -3190,8 +3659,12 @@ void LogicManager::HAND_August_LeaveSalon(HAND_PARAMS) {
 			CONS_August_BeforeVienna(0, 0, 0, 0);
 			break;
 		default:
-			return;
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -3206,17 +3679,27 @@ void LogicManager::CONS_August_BeforeVienna(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_August_BeforeVienna(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		setDoor(3, kCharacterCath, 2, 0, 0);
 		startCycOtis(kCharacterAugust, "507A3");
-	} else if (msg->action == 17) {
+		break;
+	case 17:
 		if (!getCharacterCurrentParams(kCharacterAugust)[0] && checkCathDir(kCarGreenSleeping, 43)) {
 			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 1;
 			AugustCall(&LogicManager::CONS_August_DoSeqOtis, "507B3", 0, 0, 0);
 		}
-	} else if (msg->action == 18 && getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] == 1) {
-		getCharacterCurrentParams(kCharacterAugust)[0] = 1;
-		startCycOtis(kCharacterAugust, "507A3");
+
+		break;
+	case 18:
+		if (getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] == 1) {
+			getCharacterCurrentParams(kCharacterAugust)[0] = 1;
+			startCycOtis(kCharacterAugust, "507A3");
+		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -3231,18 +3714,21 @@ void LogicManager::CONS_August_StartPart4(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_August_StartPart4(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			endGraphics(kCharacterAugust);
-			getCharacter(kCharacterAugust).characterPosition.car = kCarGreenSleeping;
-			getCharacter(kCharacterAugust).characterPosition.position = 6470;
-			getCharacter(kCharacterAugust).characterPosition.location = 1;
-			getCharacter(kCharacterAugust).inventoryItem = 0;
-			getCharacter(kCharacterAugust).clothes = 2;
-			setDoor(3, 0, 2, 0, 0);
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		CONS_August_GoDinner(0, 0, 0, 0);
+		break;
+	case 12:
+		endGraphics(kCharacterAugust);
+		getCharacter(kCharacterAugust).characterPosition.car = kCarGreenSleeping;
+		getCharacter(kCharacterAugust).characterPosition.position = 6470;
+		getCharacter(kCharacterAugust).characterPosition.location = 1;
+		getCharacter(kCharacterAugust).inventoryItem = 0;
+		getCharacter(kCharacterAugust).clothes = 2;
+		setDoor(3, 0, 2, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -3257,10 +3743,12 @@ void LogicManager::CONS_August_GoDinner(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_August_GoDinner(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 1;
 		AugustCall(&LogicManager::CONS_August_ExitComp, 1, 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8]) {
 		case 1:
 			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 2;
@@ -3288,8 +3776,12 @@ void LogicManager::HAND_August_GoDinner(HAND_PARAMS) {
 			CONS_August_WaitingAnna(0, 0, 0, 0);
 			break;
 		default:
-			return;
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -3315,6 +3807,8 @@ void LogicManager::HAND_August_WaitingAnna(HAND_PARAMS) {
 	case 123793792:
 		CONS_August_Dinner(0, 0, 0, 0);
 		break;
+	default:
+		break;
 	}
 }
 
@@ -3329,63 +3823,62 @@ void LogicManager::CONS_August_Dinner(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_August_Dinner(HAND_PARAMS) {
-	if (msg->action > 12) {
-		if (msg->action > 122288808) {
-			if (msg->action == 122358304) {
-				startCycOtis(kCharacterAugust, "BLANK");
-			} else if (msg->action == 201964801) {
-				startCycOtis(kCharacterAugust, "010H3");
-				getCharacterCurrentParams(kCharacterAugust)[0] = 1;
-			}
-			return;
-		}
-		if (msg->action != 122288808) {
-			if (msg->action == 18) {
-				if (getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] == 1) {
-					getCharacter(kCharacterAugust).characterPosition.location = 0;
-					getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 2;
-					AugustCall(&LogicManager::CONS_August_DoJoinedSeqOtis, "010J3", 36, 103798704, "010M");
-				} else if (getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] == 2) {
-					send(kCharacterAugust, kCharacterWaiter1, 286403504, 0);
-					CONS_August_ReturnComp4(0, 0, 0, 0);
-				}
+	switch (msg->action) {
+	case 0:
+	{
+		bool skip = false; // Horrible way to unroll a goto...
+
+		if (!getCharacterCurrentParams(kCharacterAugust)[1]) {
+			getCharacterCurrentParams(kCharacterAugust)[1] = _gameTime + 450;
+			if (_gameTime == -450) {
+				skip = true;
+				send(kCharacterAugust, kCharacterWaiter1, 207330561, 0);
 			}
-			return;
 		}
-	LABEL_23:
-		startCycOtis(kCharacterAugust, "010B3");
-		return;
-	}
 
-	if (msg->action == 12)
-		goto LABEL_23;
+		if (!skip && getCharacterCurrentParams(kCharacterAugust)[1] < _gameTime) {
+			getCharacterCurrentParams(kCharacterAugust)[1] = 0x7FFFFFFF;
+			send(kCharacterAugust, kCharacterWaiter1, 207330561, 0);
+		}
 
-	if (msg->action)
-		return;
+		if (getCharacterCurrentParams(kCharacterAugust)[0] != 0) {
+			if (getCharacterCurrentParams(kCharacterAugust)[2] || (getCharacterCurrentParams(kCharacterAugust)[2] = _gameTime + 9000, _gameTime != -9000)) {
+				if (getCharacterCurrentParams(kCharacterAugust)[2] >= _gameTime)
+					break;
 
-	if (!getCharacterCurrentParams(kCharacterAugust)[1]) {
-		getCharacterCurrentParams(kCharacterAugust)[1] = _gameTime + 450;
-		if (_gameTime == -450)
-			goto LABEL_16;
-	}
-	if (getCharacterCurrentParams(kCharacterAugust)[1] < _gameTime) {
-		getCharacterCurrentParams(kCharacterAugust)[1] = 0x7FFFFFFF;
-	LABEL_16:
-		send(kCharacterAugust, kCharacterWaiter1, 207330561, 0);
-	}
+				getCharacterCurrentParams(kCharacterAugust)[2] = 0x7FFFFFFF;
+			}
 
-	if (!getCharacterCurrentParams(kCharacterAugust)[0])
-		return;
+			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 1;
+			AugustCall(&LogicManager::CONS_August_WaitRCClear, 0, 0, 0, 0);
+		}
 
-	if (getCharacterCurrentParams(kCharacterAugust)[2] || (getCharacterCurrentParams(kCharacterAugust)[2] = _gameTime + 9000, _gameTime != -9000)) {
-		if (getCharacterCurrentParams(kCharacterAugust)[2] >= _gameTime)
-			return;
+		break;
+	}
+	case 12:
+	case 122288808:
+		break;
+	case 18:
+		if (getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] == 1) {
+			getCharacter(kCharacterAugust).characterPosition.location = 0;
+			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 2;
+			AugustCall(&LogicManager::CONS_August_DoJoinedSeqOtis, "010J3", 36, 103798704, "010M");
+		} else if (getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] == 2) {
+			send(kCharacterAugust, kCharacterWaiter1, 286403504, 0);
+			CONS_August_ReturnComp4(0, 0, 0, 0);
+		}
 
-		getCharacterCurrentParams(kCharacterAugust)[2] = 0x7FFFFFFF;
+		break;
+	case 122358304:
+		startCycOtis(kCharacterAugust, "BLANK");
+		break;
+	case 201964801:
+		startCycOtis(kCharacterAugust, "010H3");
+		getCharacterCurrentParams(kCharacterAugust)[0] = 1;
+		break;
+	default:
+		break;
 	}
-
-	getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 1;
-	AugustCall(&LogicManager::CONS_August_WaitRCClear, 0, 0, 0, 0);
 }
 
 void LogicManager::CONS_August_ReturnComp4(CONS_PARAMS) {
@@ -3399,14 +3892,18 @@ void LogicManager::CONS_August_ReturnComp4(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_August_ReturnComp4(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterAugust).characterPosition.location = 0;
 		startSeqOtis(kCharacterAugust, "803FS");
+
 		if (inDiningRoom(kCharacterCath))
 			advanceFrame(kCharacterAugust);
+
 		getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 1;
 		AugustCall(&LogicManager::CONS_August_FinishSeqOtis, 0, 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8]) {
 		case 1:
 			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 2;
@@ -3424,8 +3921,12 @@ void LogicManager::HAND_August_ReturnComp4(HAND_PARAMS) {
 			CONS_August_GoSalon4(0, 0, 0, 0);
 			break;
 		default:
-			return;
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -3440,61 +3941,11 @@ void LogicManager::CONS_August_GoSalon4(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_August_GoSalon4(HAND_PARAMS) {
-	if (msg->action > 12) {
-		if (msg->action > 122358304) {
-			if (msg->action == 125826561) {
-				CONS_August_Drinking(0, 0, 0, 0);
-			} else if (msg->action == 134486752) {
-				startCycOtis(kCharacterAugust, "122B");
-			}
-		} else {
-			switch (msg->action) {
-			case 122358304:
-				startCycOtis(kCharacterAugust, "BLANK");
-				break;
-			case 17:
-				if (checkCathDir(kCarRestaurant, 57))
-					bumpCath(kCarRestaurant, 50, 255);
-				break;
-			case 18:
-				switch (getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8]) {
-				case 1:
-					setDoor(3, 0, 0, 10, 9);
-					getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 2;
-					AugustCall(&LogicManager::CONS_August_DoWalk, 5, 850, 0, 0);
-					break;
-				case 2:
-					getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 3;
-					AugustCall(&LogicManager::CONS_August_WaitRCClear, 0, 0, 0, 0);
-					break;
-				case 3:
-					getCharacter(kCharacterAugust).characterPosition.position = 1540;
-					getCharacter(kCharacterAugust).characterPosition.location = 0;
-					getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 4;
-					AugustCall(&LogicManager::CONS_August_DoBlockSeqOtis, "122A", 5, 57, 0);
-					break;
-				case 4:
-					getCharacter(kCharacterAugust).characterPosition.location = 1;
-					startCycOtis(kCharacterAugust, "122B");
-					break;
-				case 5:
-					startCycOtis(kCharacterAugust, "122B");
-					send(kCharacterAugust, kCharacterWaiter2, 291721418, 0);
-					break;
-				default:
-					return;
-				}
-				break;
-			}
-		}
-	} else if (msg->action == 12) {
-		getCharacter(kCharacterAugust).characterPosition.location = 0;
-		getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 1;
-		AugustCall(&LogicManager::CONS_August_DoCorrOtis, "696Ec", 3, 0, 0);
-	} else if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		if (getCharacterCurrentParams(kCharacterAugust)[0] || (getCharacterCurrentParams(kCharacterAugust)[0] = _gameTime + 900, _gameTime != -900)) {
 			if (getCharacterCurrentParams(kCharacterAugust)[0] >= _gameTime)
-				return;
+				break;
 
 			getCharacterCurrentParams(kCharacterAugust)[0] = 0x7FFFFFFF;
 		}
@@ -3502,6 +3953,58 @@ void LogicManager::HAND_August_GoSalon4(HAND_PARAMS) {
 		playDialog(kCharacterAugust, "Aug4003A", -1, 0);
 		getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 5;
 		AugustCall(&LogicManager::CONS_August_DoBlockSeqOtis, "122C", 5, 57, 0);
+		break;
+	case 12:
+		getCharacter(kCharacterAugust).characterPosition.location = 0;
+		getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 1;
+		AugustCall(&LogicManager::CONS_August_DoCorrOtis, "696Ec", 3, 0, 0);
+		break;
+	case 17:
+		if (checkCathDir(kCarRestaurant, 57))
+			bumpCath(kCarRestaurant, 50, 255);
+
+		break;
+	case 18:
+		switch (getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8]) {
+		case 1:
+			setDoor(3, 0, 0, 10, 9);
+			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 2;
+			AugustCall(&LogicManager::CONS_August_DoWalk, 5, 850, 0, 0);
+			break;
+		case 2:
+			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 3;
+			AugustCall(&LogicManager::CONS_August_WaitRCClear, 0, 0, 0, 0);
+			break;
+		case 3:
+			getCharacter(kCharacterAugust).characterPosition.position = 1540;
+			getCharacter(kCharacterAugust).characterPosition.location = 0;
+			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 4;
+			AugustCall(&LogicManager::CONS_August_DoBlockSeqOtis, "122A", 5, 57, 0);
+			break;
+		case 4:
+			getCharacter(kCharacterAugust).characterPosition.location = 1;
+			startCycOtis(kCharacterAugust, "122B");
+			break;
+		case 5:
+			startCycOtis(kCharacterAugust, "122B");
+			send(kCharacterAugust, kCharacterWaiter2, 291721418, 0);
+			break;
+		default:
+			break;
+		}
+
+		break;
+	case 122358304:
+		startCycOtis(kCharacterAugust, "BLANK");
+		break;
+	case 125826561:
+		CONS_August_Drinking(0, 0, 0, 0);
+		break;
+	case 134486752:
+		startCycOtis(kCharacterAugust, "122B");
+		break;
+	default:
+		break;
 	}
 }
 
@@ -3516,19 +4019,21 @@ void LogicManager::CONS_August_Drinking(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_August_Drinking(HAND_PARAMS) {
-	bool tmp;
-
 	switch (msg->action) {
 	case 0:
+	{
+		bool skip = false; // Horrible way to unroll a goto...
+
 		if (!getCharacterCurrentParams(kCharacterAugust)[2]) {
 			getCharacterCurrentParams(kCharacterAugust)[2] = _gameTime + 1800;
-			if (_gameTime == -1800)
-				goto LABEL_7;
+			if (_gameTime == -1800) {
+				skip = true;
+				getCharacter(kCharacterAugust).inventoryItem = 0x80;
+			}
 		}
 
-		if (getCharacterCurrentParams(kCharacterAugust)[2] < _gameTime) {
+		if (!skip && getCharacterCurrentParams(kCharacterAugust)[2] < _gameTime) {
 			getCharacterCurrentParams(kCharacterAugust)[2] = 0x7FFFFFFF;
-		LABEL_7:
 			getCharacter(kCharacterAugust).inventoryItem = 0x80;
 		}
 
@@ -3536,17 +4041,18 @@ void LogicManager::HAND_August_Drinking(HAND_PARAMS) {
 			getCharacterCurrentParams(kCharacterAugust)[3] = 1;
 			getCharacter(kCharacterAugust).inventoryItem = 0;
 			CONS_August_Drunk(0, 0, 0, 0);
-			return;
+			break;
 		}
 
 		if (getCharacterCurrentParams(kCharacterAugust)[4] ||
 			(getCharacterCurrentParams(kCharacterAugust)[4] = _currentGameSessionTicks + getCharacterCurrentParams(kCharacterAugust)[0], _currentGameSessionTicks + getCharacterCurrentParams(kCharacterAugust)[0] != 0)) {
 			if (getCharacterCurrentParams(kCharacterAugust)[4] >= _currentGameSessionTicks)
-				return;
+				break;
+
 			getCharacterCurrentParams(kCharacterAugust)[4] = 0x7FFFFFFF;
 		}
 
-		tmp = getCharacterCurrentParams(kCharacterAugust)[1] == 0;
+		bool tmp = getCharacterCurrentParams(kCharacterAugust)[1] == 0;
 		getCharacterCurrentParams(kCharacterAugust)[1] = tmp;
 
 		if (tmp) {
@@ -3558,6 +4064,7 @@ void LogicManager::HAND_August_Drinking(HAND_PARAMS) {
 		getCharacterCurrentParams(kCharacterAugust)[0] = 5 * (3 * rnd(20) + 15);
 		getCharacterCurrentParams(kCharacterAugust)[4] = 0;
 		break;
+	}
 	case 1:
 		if (inSalon(kCharacterAlexei))
 			forceJump(kCharacterAlexei, &LogicManager::CONS_Alexei_GoToPlatform);
@@ -3565,24 +4072,26 @@ void LogicManager::HAND_August_Drinking(HAND_PARAMS) {
 		getCharacter(kCharacterAugust).inventoryItem = 0;
 		getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 1;
 		AugustCall(&LogicManager::CONS_August_SaveGame, 2, kEventAugustDrink, 0, 0);
-		return;
+		break;
 	case 12:
 		getCharacterCurrentParams(kCharacterAugust)[0] = 5 * (3 * rnd(20) + 15);
 		startCycOtis(kCharacterAugust, "122F");
-		return;
+		break;
 	case 17:
 		if (checkCathDir(kCarRestaurant, 57))
 			bumpCath(kCarRestaurant, 50, 255);
-		return;
+
+		break;
 	case 18:
 		if (getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] == 1) {
 			playNIS(kEventAugustDrink);
 			bumpCath(kCarRestaurant, 55, 255);
 			CONS_August_Drunk(0, 0, 0, 0);
 		}
-		return;
+
+		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -3599,8 +4108,7 @@ void LogicManager::CONS_August_Drunk(CONS_PARAMS) {
 void LogicManager::HAND_August_Drunk(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
-		if (!getCharacterCurrentParams(kCharacterAugust)[0] &&
-				(getCharacterCurrentParams(kCharacterAugust)[0] = _gameTime + 1800, _gameTime == -1800) || getCharacterCurrentParams(kCharacterAugust)[0] < _gameTime) {
+		if (!getCharacterCurrentParams(kCharacterAugust)[0] && (getCharacterCurrentParams(kCharacterAugust)[0] = _gameTime + 1800, _gameTime == -1800) || getCharacterCurrentParams(kCharacterAugust)[0] < _gameTime) {
 			if (_gameTime > 2430000) {
 				if (rcClear()) {
 					getCharacter(kCharacterAugust).characterPosition.location = 0;
@@ -3609,6 +4117,7 @@ void LogicManager::HAND_August_Drunk(HAND_PARAMS) {
 				}
 			}
 		}
+
 		break;
 	case 12:
 		startCycOtis(kCharacterAugust, "122H");
@@ -3616,6 +4125,7 @@ void LogicManager::HAND_August_Drunk(HAND_PARAMS) {
 	case 17:
 		if (checkCathDir(kCarRestaurant, 57))
 			bumpCath(kCarRestaurant, 50, 255);
+
 		break;
 	case 18:
 		switch (getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8]) {
@@ -3631,10 +4141,13 @@ void LogicManager::HAND_August_Drunk(HAND_PARAMS) {
 			endGraphics(kCharacterAugust);
 			CONS_August_Asleep4(0, 0, 0, 0);
 			break;
+		default:
+			break;
 		}
+
 		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -3649,13 +4162,21 @@ void LogicManager::CONS_August_Asleep4(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_August_Asleep4(HAND_PARAMS) {
-	if (msg->action == 2 || msg->action == 12 && (getCharacter(kCharacterAugust).characterPosition.car = kCarGreenSleeping,
-										getCharacter(kCharacterAugust).characterPosition.position = 6470,
-										getCharacter(kCharacterAugust).characterPosition.location = 1,
-										endGraphics(kCharacterAugust),
-										setDoor(3, kCharacterCath, 1, 10, 9),
-										!whoRunningDialog(kCharacterAugust))) {
-		playDialog(kCharacterAugust, "AUG1057", -1, 0);
+	switch (msg->action) {
+	case 2:
+	case 12:
+		if (getCharacter(kCharacterAugust).characterPosition.car = kCarGreenSleeping,
+			getCharacter(kCharacterAugust).characterPosition.position = 6470,
+			getCharacter(kCharacterAugust).characterPosition.location = 1,
+			endGraphics(kCharacterAugust),
+			setDoor(3, kCharacterCath, 1, 10, 9),
+			!whoRunningDialog(kCharacterAugust)) {
+			playDialog(kCharacterAugust, "AUG1057", -1, 0);
+		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -3670,17 +4191,20 @@ void LogicManager::CONS_August_StartPart5(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_August_StartPart5(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			endGraphics(kCharacterAugust);
-			getCharacter(kCharacterAugust).characterPosition.position = 3969;
-			getCharacter(kCharacterAugust).characterPosition.location = 1;
-			getCharacter(kCharacterAugust).characterPosition.car = kCarRestaurant;
-			getCharacter(kCharacterAugust).inventoryItem = 0;
-			getCharacter(kCharacterAugust).clothes = 2;
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		CONS_August_Prisoner(0, 0, 0, 0);
+		break;
+	case 12:
+		endGraphics(kCharacterAugust);
+		getCharacter(kCharacterAugust).characterPosition.position = 3969;
+		getCharacter(kCharacterAugust).characterPosition.location = 1;
+		getCharacter(kCharacterAugust).characterPosition.car = kCarRestaurant;
+		getCharacter(kCharacterAugust).inventoryItem = 0;
+		getCharacter(kCharacterAugust).clothes = 2;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -3695,8 +4219,13 @@ void LogicManager::CONS_August_Prisoner(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_August_Prisoner(HAND_PARAMS) {
-	if (msg->action == 70549068)
+	switch (msg->action) {
+	case 70549068:
 		CONS_August_Hiding(0, 0, 0, 0);
+		break;
+	default:
+		break;
+	}
 }
 
 void LogicManager::CONS_August_Hiding(CONS_PARAMS) {
@@ -3710,66 +4239,28 @@ void LogicManager::CONS_August_Hiding(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_August_Hiding(HAND_PARAMS) {
-	if (msg->action > 9) {
-		if (msg->action > 17) {
-			if (msg->action == 18) {
-				switch (getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8]) {
-				case 1:
-					getCharacterCurrentParams(kCharacterAugust)[0] = 0;
-					setDoor(3, kCharacterAugust, 1, 10, 9);
-					break;
-				case 2:
-				case 3:
-					getCharacterCurrentParams(kCharacterAugust)[2]++;
-					switch (getCharacterCurrentParams(kCharacterAugust)[2]) {
-					case 1:
-						setDoor(3, kCharacterAugust, 1, 0, 0);
-						getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 4;
-						AugustCall(&LogicManager::CONS_August_DoDialog, "Aug5002", 0, 0, 0);
-						break;
-					case 2:
-						setDoor(3, kCharacterAugust, 1, 0, 0);
-						getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 5;
-						AugustCall(&LogicManager::CONS_August_DoDialog, "Aug5002A", 0, 0, 0);
-						break;
-					case 3:
-						setDoor(3, kCharacterAugust, 1, 0, 0);
-						getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 6;
-						AugustCall(&LogicManager::CONS_August_DoDialog, "Aug5002B", 0, 0, 0);
-						break;
-					}
-					break;
-				case 4:
-					getCharacterCurrentParams(kCharacterAugust)[0] = 1;
-					setDoor(3, kCharacterAugust, 1, 14, 0);
-					break;
-				case 5:
-					setDoor(3, kCharacterAugust, 1, 10, 9);
-					break;
-				case 6:
-					getCharacterCurrentParams(kCharacterAugust)[1] = 1;
+	switch (msg->action) {
+	case 0:
+		if (getCharacterCurrentParams(kCharacterAugust)[0]) {
+			if (getCharacterCurrentParams(kCharacterAugust)[3] ||
+				(getCharacterCurrentParams(kCharacterAugust)[3] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
+				if (getCharacterCurrentParams(kCharacterAugust)[3] >= _currentGameSessionTicks)
 					break;
-				default:
-					return;
-				}
-			} else if (msg->action == 203078272) {
-				send(kCharacterAugust, kCharacterTatiana, 203078272, 0);
-				CONS_August_CutLoose(0, 0, 0, 0);
-			}
-		} else if (msg->action == 17) {
-			if (getCharacterCurrentParams(kCharacterAugust)[1] || getCharacterCurrentParams(kCharacterAugust)[0]) {
-				getCharacterCurrentParams(kCharacterAugust)[1] = 0;
-				getCharacterCurrentParams(kCharacterAugust)[0] = 0;
-				setDoor(3, kCharacterAugust, 1, 10, 9);
-				getCharacterCurrentParams(kCharacterAugust)[2] = 0;
+
+				getCharacterCurrentParams(kCharacterAugust)[3] = 0x7FFFFFFF;
 			}
-		} else if (msg->action == 12) {
-			getCharacter(kCharacterAugust).characterPosition.position = 6470;
-			getCharacter(kCharacterAugust).characterPosition.location = 1;
-			getCharacter(kCharacterAugust).characterPosition.car = 3;
-			setDoor(3, 2, 1, 10, 9);
+
+			getCharacterCurrentParams(kCharacterAugust)[0] = 0;
+			getCharacterCurrentParams(kCharacterAugust)[1] = 1;
+			setDoor(3, kCharacterAugust, 1, 0, 0);
+			getCharacterCurrentParams(kCharacterAugust)[3] = 0;
+		} else {
+			getCharacterCurrentParams(kCharacterAugust)[3] = 0;
 		}
-	} else if (msg->action >= 8) {
+
+		break;
+	case 8:
+	case 9:
 		if (getCharacterCurrentParams(kCharacterAugust)[0]) {
 			setDoor(3, kCharacterAugust, 1, 0, 0);
 			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 1;
@@ -3781,23 +4272,74 @@ void LogicManager::HAND_August_Hiding(HAND_PARAMS) {
 			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 3;
 			AugustCall(&LogicManager::CONS_August_DoDialog, "LIB013", 0, 0, 0);
 		}
-	} else if (msg->action == 0) {
-		if (getCharacterCurrentParams(kCharacterAugust)[0]) {
-			if (getCharacterCurrentParams(kCharacterAugust)[3] ||
-				(getCharacterCurrentParams(kCharacterAugust)[3] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
-				if (getCharacterCurrentParams(kCharacterAugust)[3] >= _currentGameSessionTicks)
-					return;
 
-				getCharacterCurrentParams(kCharacterAugust)[3] = 0x7FFFFFFF;
-			}
+		break;
+	case 12:
+		getCharacter(kCharacterAugust).characterPosition.position = 6470;
+		getCharacter(kCharacterAugust).characterPosition.location = 1;
+		getCharacter(kCharacterAugust).characterPosition.car = 3;
+		setDoor(3, 2, 1, 10, 9);
+		break;
+	case 17:
+		if (getCharacterCurrentParams(kCharacterAugust)[1] || getCharacterCurrentParams(kCharacterAugust)[0]) {
+			getCharacterCurrentParams(kCharacterAugust)[1] = 0;
+			getCharacterCurrentParams(kCharacterAugust)[0] = 0;
+			setDoor(3, kCharacterAugust, 1, 10, 9);
+			getCharacterCurrentParams(kCharacterAugust)[2] = 0;
+		}
 
+		break;
+	case 18:
+		switch (getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8]) {
+		case 1:
 			getCharacterCurrentParams(kCharacterAugust)[0] = 0;
+			setDoor(3, kCharacterAugust, 1, 10, 9);
+			break;
+		case 2:
+		case 3:
+			getCharacterCurrentParams(kCharacterAugust)[2]++;
+			switch (getCharacterCurrentParams(kCharacterAugust)[2]) {
+			case 1:
+				setDoor(3, kCharacterAugust, 1, 0, 0);
+				getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 4;
+				AugustCall(&LogicManager::CONS_August_DoDialog, "Aug5002", 0, 0, 0);
+				break;
+			case 2:
+				setDoor(3, kCharacterAugust, 1, 0, 0);
+				getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 5;
+				AugustCall(&LogicManager::CONS_August_DoDialog, "Aug5002A", 0, 0, 0);
+				break;
+			case 3:
+				setDoor(3, kCharacterAugust, 1, 0, 0);
+				getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 6;
+				AugustCall(&LogicManager::CONS_August_DoDialog, "Aug5002B", 0, 0, 0);
+				break;
+			default:
+				break;
+			}
+
+			break;
+		case 4:
+			getCharacterCurrentParams(kCharacterAugust)[0] = 1;
+			setDoor(3, kCharacterAugust, 1, 14, 0);
+			break;
+		case 5:
+			setDoor(3, kCharacterAugust, 1, 10, 9);
+			break;
+		case 6:
 			getCharacterCurrentParams(kCharacterAugust)[1] = 1;
-			setDoor(3, kCharacterAugust, 1, 0, 0);
-			getCharacterCurrentParams(kCharacterAugust)[3] = 0;
-		} else {
-			getCharacterCurrentParams(kCharacterAugust)[3] = 0;
+			break;
+		default:
+			break;
 		}
+
+		break;
+	case 203078272:
+		send(kCharacterAugust, kCharacterTatiana, 203078272, 0);
+		CONS_August_CutLoose(0, 0, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -3812,18 +4354,25 @@ void LogicManager::CONS_August_CutLoose(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_August_CutLoose(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			_engine->getSoundManager()->endAmbient();
-			if (dialogRunning("ARRIVE"))
-				endDialog("ARRIVE");
-			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 1;
-			AugustCall(&LogicManager::CONS_August_SaveGame, 2, kEventAugustUnhookCarsBetrayal, 0, 0);
-		} else if (msg->action == 18 && getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] == 1) {
+	switch (msg->action) {
+	case 0:
+		sendAll(kCharacterAugust, 135800432, 0);
+		CONS_August_Disappear(0, 0, 0, 0);
+		break;
+	case 12:
+		_engine->getSoundManager()->endAmbient();
+		if (dialogRunning("ARRIVE"))
+			endDialog("ARRIVE");
+		getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 1;
+		AugustCall(&LogicManager::CONS_August_SaveGame, 2, kEventAugustUnhookCarsBetrayal, 0, 0);
+		break;
+	case 18:
+		if (getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] == 1) {
 			if (_gameProgress[kProgressFieldC])
 				playNIS(kEventAugustUnhookCarsBetrayal);
 			else
 				playNIS(kEventAugustUnhookCars);
+
 			endGraphics(kCharacterAugust);
 			_engine->getSoundManager()->startAmbient();
 			playDialog(0, "MUS050", -1, 0);
@@ -3831,9 +4380,10 @@ void LogicManager::HAND_August_CutLoose(HAND_PARAMS) {
 			sendAll(kCharacterAugust, 70549068, 0);
 			forceJump(kCharacterTrainM, &LogicManager::CONS_TrainM_Disappear);
 		}
-	} else {
-		sendAll(kCharacterAugust, 135800432, 0);
-		CONS_August_Disappear(0, 0, 0, 0);
+
+		break;
+	default:
+		break;
 	}
 }
 


Commit: 3879c981887fb40d19cfd81ed50a5138308e0a66
    https://github.com/scummvm/scummvm/commit/3879c981887fb40d19cfd81ed50a5138308e0a66
Author: AndywinXp (andywinxp at gmail.com)
Date: 2025-06-16T23:12:18+02:00

Commit Message:
LASTEXPRESS: Clean up Abbot logic

Changed paths:
    engines/lastexpress/characters/abbot.cpp


diff --git a/engines/lastexpress/characters/abbot.cpp b/engines/lastexpress/characters/abbot.cpp
index 50e75ec1a0f..473f1b79939 100644
--- a/engines/lastexpress/characters/abbot.cpp
+++ b/engines/lastexpress/characters/abbot.cpp
@@ -49,7 +49,7 @@ void LogicManager::CONS_Abbot(int chapter) {
 		CONS_Abbot_StartPart5(0, 0, 0, 0);
 		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -70,19 +70,25 @@ void LogicManager::CONS_Abbot_DebugWalks(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Abbot_DebugWalks(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			getCharacter(kCharacterAbbot).characterPosition.position = 0;
-			getCharacter(kCharacterAbbot).characterPosition.location = 0;
-			getCharacter(kCharacterAbbot).characterPosition.car = kCarGreenSleeping;
-			getCharacterCurrentParams(kCharacterAbbot)[0] = 10000;
-		}
-	} else if (walk(kCharacterAbbot, kCarGreenSleeping, getCharacterCurrentParams(kCharacterAbbot)[0])) {
-		if (getCharacterCurrentParams(kCharacterAbbot)[0] == 10000) {
-			getCharacterCurrentParams(kCharacterAbbot)[0] = 0;
-		} else {
-			getCharacterCurrentParams(kCharacterAbbot)[0] = 10000;
+	switch (msg->action) {
+	case 0:
+		if (walk(kCharacterAbbot, kCarGreenSleeping, getCharacterCurrentParams(kCharacterAbbot)[0])) {
+			if (getCharacterCurrentParams(kCharacterAbbot)[0] == 10000) {
+				getCharacterCurrentParams(kCharacterAbbot)[0] = 0;
+			} else {
+				getCharacterCurrentParams(kCharacterAbbot)[0] = 10000;
+			}
 		}
+
+		break;
+	case 12:
+		getCharacter(kCharacterAbbot).characterPosition.position = 0;
+		getCharacter(kCharacterAbbot).characterPosition.location = 0;
+		getCharacter(kCharacterAbbot).characterPosition.car = kCarGreenSleeping;
+		getCharacterCurrentParams(kCharacterAbbot)[0] = 10000;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -99,12 +105,17 @@ void LogicManager::CONS_Abbot_DoSeqOtis(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Abbot_DoSeqOtis(HAND_PARAMS) {
-	if (msg->action == 3) {
+	switch (msg->action) {
+	case 3:
 		getCharacter(kCharacterAbbot).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, _functionsAbbot[getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall]]);
 		fedEx(kCharacterAbbot, kCharacterAbbot, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		startSeqOtis(kCharacterAbbot, (char *)&getCharacterCurrentParams(kCharacterAbbot)[0]);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -123,16 +134,21 @@ void LogicManager::CONS_Abbot_DoCorrOtis(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Abbot_DoCorrOtis(HAND_PARAMS) {
-	if (msg->action == 3) {
+	switch (msg->action) {
+	case 3:
 		releaseAtDoor(kCharacterAbbot, getCharacterCurrentParams(kCharacterAbbot)[3]);
 
 		getCharacter(kCharacterAbbot).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, _functionsAbbot[getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall]]);
 
 		fedEx(kCharacterAbbot, kCharacterAbbot, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		startSeqOtis(kCharacterAbbot, (char *)&getCharacterCurrentParams(kCharacterAbbot)[0]);
 		blockAtDoor(kCharacterAbbot, getCharacterCurrentParams(kCharacterAbbot)[3]);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -151,7 +167,8 @@ void LogicManager::CONS_Abbot_DoEnterCorrOtis(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Abbot_DoEnterCorrOtis(HAND_PARAMS) {
-	if (msg->action == 3) {
+	switch (msg->action) {
+	case 3:
 		releaseAtDoor(kCharacterAbbot, getCharacterCurrentParams(kCharacterAbbot)[3]);
 		getCharacter(kCharacterAbbot).characterPosition.position = 6470;
 		getCharacter(kCharacterAbbot).characterPosition.location = 1;
@@ -160,7 +177,8 @@ void LogicManager::HAND_Abbot_DoEnterCorrOtis(HAND_PARAMS) {
 		_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, _functionsAbbot[getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall]]);
 
 		fedEx(kCharacterAbbot, kCharacterAbbot, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		startSeqOtis(kCharacterAbbot, (char *)&getCharacterCurrentParams(kCharacterAbbot)[0]);
 		blockAtDoor(kCharacterAbbot, getCharacterCurrentParams(kCharacterAbbot)[3]);
 		getCharacter(kCharacterAbbot).characterPosition.location = 1;
@@ -175,6 +193,10 @@ void LogicManager::HAND_Abbot_DoEnterCorrOtis(HAND_PARAMS) {
 			playDialog(kCharacterCath, "BUMP", -1, 0);
 			bumpCathFDoor(34);
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -189,10 +211,18 @@ void LogicManager::CONS_Abbot_FinishSeqOtis(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Abbot_FinishSeqOtis(HAND_PARAMS) {
-	if (msg->action == 3 || (msg->action == 0 && getCharacter(kCharacterAbbot).direction != 4)) {
-		getCharacter(kCharacterAbbot).currentCall--;
-		_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, _functionsAbbot[getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall]]);
-		fedEx(kCharacterAbbot, kCharacterAbbot, 18, 0);
+	switch (msg->action) {
+	case 0:
+	case 3:
+		if (msg->action == 3 || (msg->action == 0 && getCharacter(kCharacterAbbot).direction != 4)) {
+			getCharacter(kCharacterAbbot).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, _functionsAbbot[getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall]]);
+			fedEx(kCharacterAbbot, kCharacterAbbot, 18, 0);
+		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -212,14 +242,19 @@ void LogicManager::CONS_Abbot_DoComplexSeqOtis(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Abbot_DoComplexSeqOtis(HAND_PARAMS) {
-	if (msg->action == 3) {
+	switch (msg->action) {
+	case 3:
 		getCharacter(kCharacterAbbot).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, _functionsAbbot[getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall]]);
 
 		fedEx(kCharacterAbbot, kCharacterAbbot, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		startSeqOtis(kCharacterAbbot, (char *)&getCharacterCurrentParams(kCharacterAbbot)[0]);
 		startSeqOtis(getCharacterCurrentParams(kCharacterAbbot)[6], (char *)&getCharacterCurrentParams(kCharacterAbbot)[3]);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -236,20 +271,21 @@ void LogicManager::CONS_Abbot_DoWait(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Abbot_DoWait(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		if (getCharacterCurrentParams(kCharacterAbbot)[1]) {
 			if (getCharacterCurrentParams(kCharacterAbbot)[1] >= _gameTime)
-				return;
+				break;
 
 			getCharacterCurrentParams(kCharacterAbbot)[1] = 0x7FFFFFFF;
 		} else {
 			getCharacterCurrentParams(kCharacterAbbot)[1] = _gameTime + getCharacterCurrentParams(kCharacterAbbot)[0];
 
 			if (_gameTime + getCharacterCurrentParams(kCharacterAbbot)[0] == 0)
-				return;
+				break;
 
 			if (getCharacterCurrentParams(kCharacterAbbot)[1] >= _gameTime)
-				return;
+				break;
 
 			getCharacterCurrentParams(kCharacterAbbot)[1] = 0x7FFFFFFF;
 		}
@@ -258,6 +294,9 @@ void LogicManager::HAND_Abbot_DoWait(HAND_PARAMS) {
 		_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, _functionsAbbot[getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall]]);
 
 		fedEx(kCharacterAbbot, kCharacterAbbot, 18, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -274,20 +313,21 @@ void LogicManager::CONS_Abbot_DoWaitReal(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Abbot_DoWaitReal(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		if (getCharacterCurrentParams(kCharacterAbbot)[1]) {
 			if (getCharacterCurrentParams(kCharacterAbbot)[1] >= _currentGameSessionTicks)
-				return;
+				break;
 
 			getCharacterCurrentParams(kCharacterAbbot)[1] = 0x7FFFFFFF;
 		} else {
 			getCharacterCurrentParams(kCharacterAbbot)[1] = _currentGameSessionTicks + getCharacterCurrentParams(kCharacterAbbot)[0];
 
 			if (_currentGameSessionTicks + getCharacterCurrentParams(kCharacterAbbot)[0] == 0)
-				return;
+				break;
 
 			if (getCharacterCurrentParams(kCharacterAbbot)[1] >= _currentGameSessionTicks)
-				return;
+				break;
 
 			getCharacterCurrentParams(kCharacterAbbot)[1] = 0x7FFFFFFF;
 		}
@@ -296,6 +336,9 @@ void LogicManager::HAND_Abbot_DoWaitReal(HAND_PARAMS) {
 		_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, _functionsAbbot[getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall]]);
 
 		fedEx(kCharacterAbbot, kCharacterAbbot, 18, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -312,13 +355,18 @@ void LogicManager::CONS_Abbot_DoDialog(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Abbot_DoDialog(HAND_PARAMS) {
-	if (msg->action == 2) {
+	switch (msg->action) {
+	case 2:
 		getCharacter(kCharacterAbbot).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, _functionsAbbot[getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall]]);
 
 		fedEx(kCharacterAbbot, kCharacterAbbot, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		playDialog(kCharacterAbbot, (char *)&getCharacterCurrentParams(kCharacterAbbot)[0], -1, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -336,12 +384,14 @@ void LogicManager::CONS_Abbot_SaveGame(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Abbot_SaveGame(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		getCharacter(kCharacterAbbot).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, _functionsAbbot[getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall]]);
 
 		fedEx(kCharacterAbbot, kCharacterAbbot, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		save(
 			kCharacterAbbot,
 			getCharacterCurrentParams(kCharacterAbbot)[0],
@@ -352,6 +402,9 @@ void LogicManager::HAND_Abbot_SaveGame(HAND_PARAMS) {
 		_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, _functionsAbbot[getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall]]);
 
 		fedEx(kCharacterAbbot, kCharacterAbbot, 18, 0);
+		break;
+	default:
+		break;
 	} 
 }
 
@@ -446,6 +499,8 @@ void LogicManager::HAND_Abbot_DoJoinedSeqOtis(HAND_PARAMS) {
 	case 12:
 		startSeqOtis(kCharacterAbbot, (char *)&getCharacterCurrentParams(kCharacterAbbot));
 		break;
+	default:
+		break;
 	}
 }
 
@@ -465,14 +520,19 @@ void LogicManager::CONS_Abbot_DoBlockSeqOtis(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Abbot_DoBlockSeqOtis(HAND_PARAMS) {
-	if (msg->action == 3) {
+	switch (msg->action) {
+	case 3:
 		releaseView(kCharacterAbbot, getCharacterCurrentParams(kCharacterAbbot)[3], getCharacterCurrentParams(kCharacterAbbot)[4]);
 		getCharacter(kCharacterAbbot).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, _functionsAbbot[getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall]]);
 		fedEx(kCharacterAbbot, kCharacterAbbot, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		startSeqOtis(kCharacterAbbot, (char *)&getCharacterCurrentParams(kCharacterAbbot));
 		blockView(kCharacterAbbot, getCharacterCurrentParams(kCharacterAbbot)[3], getCharacterCurrentParams(kCharacterAbbot)[4]);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -506,8 +566,13 @@ void LogicManager::CONS_Abbot_Birth(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Abbot_Birth(HAND_PARAMS) {
-	if (msg->action == 12)
+	switch (msg->action) {
+	case 12:
 		autoMessage(kCharacterAbbot, 203073664, 0);
+		break;
+	default:
+		break;
+	}
 }
 
 void LogicManager::CONS_Abbot_StartPart2(CONS_PARAMS) {
@@ -521,8 +586,13 @@ void LogicManager::CONS_Abbot_StartPart2(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Abbot_StartPart2(HAND_PARAMS) {
-	if (msg->action == 12)
+	switch (msg->action) {
+	case 12:
 		endGraphics(kCharacterAbbot);
+		break;
+	default:
+		break;
+	}
 }
 
 void LogicManager::CONS_Abbot_StartPart3(CONS_PARAMS) {
@@ -536,9 +606,11 @@ void LogicManager::CONS_Abbot_StartPart3(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Abbot_StartPart3(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		CONS_Abbot_InKitchen(0, 0, 0, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		endGraphics(kCharacterAbbot);
 
 		getCharacter(kCharacterAbbot).characterPosition.location = 1;
@@ -546,6 +618,9 @@ void LogicManager::HAND_Abbot_StartPart3(HAND_PARAMS) {
 		getCharacter(kCharacterAbbot).characterPosition.position = 5900;
 		getCharacter(kCharacterAbbot).inventoryItem = 0;
 		getCharacter(kCharacterAbbot).clothes = 0;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -560,15 +635,14 @@ void LogicManager::CONS_Abbot_InKitchen(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Abbot_InKitchen(HAND_PARAMS) {
-	if (msg->action == 18) {
+	switch (msg->action) {
+	case 18:
 		switch (getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8]) {
 		case 1:
 			getCharacter(kCharacterAbbot).characterPosition.position = 5800;
 			getCharacter(kCharacterAbbot).characterPosition.location = 0;
 			getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 2;
-
 			AbbotCall(&LogicManager::CONS_Abbot_DoSeqOtis, "804DD", 0, 0, 0);
-
 			break;
 		case 2:
 			send(kCharacterAbbot, kCharacterCook, 236976550, 0);
@@ -578,22 +652,17 @@ void LogicManager::HAND_Abbot_InKitchen(HAND_PARAMS) {
 				advanceFrame(kCharacterAbbot);
 
 			getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 3;
-
 			AbbotCall(&LogicManager::CONS_Abbot_FinishSeqOtis, 0, 0, 0, 0);
-
 			break;
 		case 3:
 			getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 4;
-
 			AbbotCall(&LogicManager::CONS_Abbot_DoWalk, 4, 6470, 0, 0);
-
 			break;
 		case 4:
 			setDoor(34, kCharacterCath, 1, 255, 255);
 			getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 5;
 
 			AbbotCall(&LogicManager::CONS_Abbot_DoCorrOtis, "617AC", 34, 0, 0);
-
 			break;
 		case 5:
 			setDoor(34, kCharacterCath, 2, 255, 255);
@@ -601,14 +670,18 @@ void LogicManager::HAND_Abbot_InKitchen(HAND_PARAMS) {
 			getCharacter(kCharacterAbbot).characterPosition.location = 1;
 
 			CONS_Abbot_OpenComp(0, 0, 0, 0);
-
 			break;
 		default:
-			return;
+			break;
 		}
-	} else if (msg->action == 192054567) {
+
+		break;
+	case 192054567:
 		getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 1;
 		AbbotCall(&LogicManager::CONS_Abbot_WaitRCClear, 0, 0, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -623,18 +696,22 @@ void LogicManager::CONS_Abbot_OpenComp(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Abbot_OpenComp(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		if (_gameTime > 1953000 && !getCharacterCurrentParams(kCharacterAbbot)[0]) {
 			getCharacterCurrentParams(kCharacterAbbot)[0] = 1;
 			getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 3;
 			AbbotCall(&LogicManager::CONS_Abbot_DoDialog, "MrB3010", 0, 0, 0);
 		}
-	} else if (msg->action == 12) {
+
+		break;
+	case 12:
 		startCycOtis(kCharacterAbbot, "508A");
 		send(kCharacterAbbot, kCharacterMonsieur, 122358304, 0);
 		getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 1;
 		AbbotCall(&LogicManager::CONS_Abbot_DoDialog, "Abb3010", 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8]) {
 		case 1:
 			getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 2;
@@ -647,7 +724,13 @@ void LogicManager::HAND_Abbot_OpenComp(HAND_PARAMS) {
 			send(kCharacterAbbot, kCharacterMonsieur, 122288808, 0);
 			CONS_Abbot_AloneComp(0, 0, 0, 0);
 			break;
+		default:
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -662,12 +745,16 @@ void LogicManager::CONS_Abbot_AloneComp(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Abbot_AloneComp(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		if (_gameTime > 1966500 && inDiningRoom(kCharacterMonsieur)) {
 			CONS_Abbot_GoLunch(0, 0, 0, 0);
 		}
-	} else if (msg->action == 12) {
+
+		break;
+	case 12:
 		startCycOtis(kCharacterAbbot, "509A");
+		break;
 	}
 }
 
@@ -725,8 +812,9 @@ void LogicManager::HAND_Abbot_GoLunch(HAND_PARAMS) {
 			CONS_Abbot_EatingLunch(0, 0, 0, 0);
 			break;
 		default:
-			return;
+			break;
 		}
+
 		break;
 	case 122288808:
 		send(kCharacterAbbot, kCharacterTableE, 136455232, 0);
@@ -734,6 +822,8 @@ void LogicManager::HAND_Abbot_GoLunch(HAND_PARAMS) {
 		getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 7;
 		AbbotCall(&LogicManager::CONS_Abbot_DoSeqOtis, "029B", 0, 0, 0);
 		break;
+	default:
+		break;
 	}
 }
 
@@ -764,7 +854,7 @@ void LogicManager::HAND_Abbot_EatingLunch(HAND_PARAMS) {
 	case 1:
 		getCharacter(kCharacterAbbot).inventoryItem = kItemNone;
 		getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 1;
-		AbbotCall(&LogicManager::CONS_Abbot_SaveGame, 2, 110, 0, 0);
+		AbbotCall(&LogicManager::CONS_Abbot_SaveGame, 2, kEventAbbotIntroduction, 0, 0);
 		break;
 	case 12:
 		startCycOtis(kCharacterAbbot, "029E");
@@ -803,12 +893,14 @@ void LogicManager::CONS_Abbot_LeaveLunch(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Abbot_LeaveLunch(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterAbbot).characterPosition.location = 0;
 		blockView(kCharacterAbbot, kCarRestaurant, 67);
 		getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 1;
 		AbbotCall(&LogicManager::CONS_Abbot_DoJoinedSeqOtis, "029F", 37, 103798704, "029G");
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8]) {
 		case 1:
 			releaseView(kCharacterAbbot, kCarRestaurant, 67);
@@ -835,8 +927,12 @@ void LogicManager::HAND_Abbot_LeaveLunch(HAND_PARAMS) {
 			CONS_Abbot_ClosedComp(0, 0, 0, 0);
 			break;
 		default:
-			return;
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -855,7 +951,7 @@ void LogicManager::HAND_Abbot_ClosedComp(HAND_PARAMS) {
 	case 0:
 		if (getCharacterCurrentParams(kCharacterAbbot)[0] || (getCharacterCurrentParams(kCharacterAbbot)[0] = _gameTime + 900, _gameTime != -900)) {
 			if (getCharacterCurrentParams(kCharacterAbbot)[0] >= _gameTime)
-				return;
+				break;
 
 			getCharacterCurrentParams(kCharacterAbbot)[0] = 0x7FFFFFFF;
 		}
@@ -894,7 +990,7 @@ void LogicManager::HAND_Abbot_ClosedComp(HAND_PARAMS) {
 
 		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -909,10 +1005,12 @@ void LogicManager::CONS_Abbot_GoSalon1(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Abbot_GoSalon1(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 1;
 		AbbotCall(&LogicManager::CONS_Abbot_DoCorrOtis, "617Dc", 34, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8]) {
 		case 1:
 			getCharacter(kCharacterAbbot).characterPosition.location = 0;
@@ -937,8 +1035,12 @@ void LogicManager::HAND_Abbot_GoSalon1(HAND_PARAMS) {
 			CONS_Abbot_InSalon(0, 0, 0, 0);
 			break;
 		default:
-			return;
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -953,7 +1055,8 @@ void LogicManager::CONS_Abbot_InSalon(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Abbot_InSalon(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		if (getCharacterCurrentParams(kCharacterAbbot)[0]) {
 			if ((!getCharacterCurrentParams(kCharacterAbbot)[1] &&
 				 (getCharacterCurrentParams(kCharacterAbbot)[1] = _gameTime + 4500, _gameTime == -4500)) ||
@@ -962,11 +1065,17 @@ void LogicManager::HAND_Abbot_InSalon(HAND_PARAMS) {
 					CONS_Abbot_GoComp(0, 0, 0, 0);
 			}
 		}
-	} else if (msg->action == 12) {
+
+		break;
+	case 12:
 		send(kCharacterAbbot, kCharacterKronos, 157159392, 0);
 		startCycOtis(kCharacterAbbot, "115B");
-	} else if (msg->action == 101169422) {
+		break;
+	case 101169422:
 		getCharacterCurrentParams(kCharacterAbbot)[0] = 1;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -981,10 +1090,12 @@ void LogicManager::CONS_Abbot_GoComp(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Abbot_GoComp(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 1;
 		AbbotCall(&LogicManager::CONS_Abbot_WaitRCClear, 0, 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8]) {
 		case 1:
 			getCharacter(kCharacterAbbot).characterPosition.location = 0;
@@ -1008,8 +1119,12 @@ void LogicManager::HAND_Abbot_GoComp(HAND_PARAMS) {
 			CONS_Abbot_OpenComp2(0, 0, 0, 0);
 			break;
 		default:
-			return;
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1024,22 +1139,31 @@ void LogicManager::CONS_Abbot_OpenComp2(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Abbot_OpenComp2(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		if (_gameTime > 2052000 && !getCharacterCurrentParams(kCharacterAbbot)[0]) {
 			getCharacterCurrentParams(kCharacterAbbot)[0] = 1;
 			getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 2;
 			AbbotCall(&LogicManager::CONS_Abbot_GoWander, 0, 0, 0, 0);
 		}
-	} else if (msg->action == 12) {
+
+		break;
+	case 12:
 		send(kCharacterAbbot, kCharacterMonsieur, 122358304, 0);
 		startCycOtis(kCharacterAbbot, "508A");
 		getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 1;
 		AbbotCall(&LogicManager::CONS_Abbot_DoDialog, "Abb3013", 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		if (getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] == 1)
 			startCycOtis(kCharacterAbbot, "508B");
-	} else if (msg->action == 222609266) {
+
+		break;
+	case 222609266:
 		CONS_Abbot_GoSalon2(0, 0, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1054,12 +1178,14 @@ void LogicManager::CONS_Abbot_GoWander(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Abbot_GoWander(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		send(kCharacterAbbot, kCharacterMonsieur, 122288808, 0);
 		setDoor(34, kCharacterCath, 1, 255, 255);
 		getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 1;
 		AbbotCall(&LogicManager::CONS_Abbot_DoCorrOtis, "617Bc", 34, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8]) {
 		case 1:
 			setDoor(34, kCharacterCath, 2, 255, 255);
@@ -1098,8 +1224,12 @@ void LogicManager::HAND_Abbot_GoWander(HAND_PARAMS) {
 			fedEx(kCharacterAbbot, kCharacterAbbot, 18, 0);
 			break;
 		default:
-			return;
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1114,16 +1244,18 @@ void LogicManager::CONS_Abbot_GoSalon2(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Abbot_GoSalon2(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 1;
 		AbbotCall(&LogicManager::CONS_Abbot_DoDialog, "Abb3030", 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8]) {
 		case 1:
 			send(kCharacterAbbot, kCharacterMonsieur, 122288808, 0);
 			setDoor(34, kCharacterCath, 1, 255, 255);
 			getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 2;
-			AbbotCall(&LogicManager::CONS_Abbot_DoCorrOtis, "617Bc", 0x22, 0, 0);
+			AbbotCall(&LogicManager::CONS_Abbot_DoCorrOtis, "617Bc", 34, 0, 0);
 			break;
 		case 2:
 			setDoor(34, kCharacterCath, 2, 255, 255);
@@ -1147,8 +1279,12 @@ void LogicManager::HAND_Abbot_GoSalon2(HAND_PARAMS) {
 			CONS_Abbot_InSalon2(0, 0, 0, 0);
 			break;
 		default:
-			return;
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1163,92 +1299,112 @@ void LogicManager::CONS_Abbot_InSalon2(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Abbot_InSalon2(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			getCharacterCurrentParams(kCharacterAbbot)[1] = _gameTime + 4500;
-			getCharacterCurrentParams(kCharacterAbbot)[2] = _gameTime + 18000;
-			startCycOtis(kCharacterAbbot, "115B");
-		} else if (msg->action == 18) {
-			switch (getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8]) {
-			case 1:
-				getCharacter(kCharacterAbbot).characterPosition.location = 0;
-				getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 2;
-				AbbotCall(&LogicManager::CONS_Abbot_DoBlockSeqOtis, "115E", 5, 56, 0);
-				break;
-			case 2:
-				dropItem(kItem3, 1);
-				send(kCharacterAbbot, kCharacterAlexei, 122358304, 0);
-				playDialog(kCharacterAbbot, "Abb3020", -1, 0);
-				getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 3;
-				AbbotCall(&LogicManager::CONS_Abbot_DoBlockSeqOtis, "125A", 5, 52, 0);
-				break;
-			case 3:
-				getCharacter(kCharacterAbbot).characterPosition.location = 1;
-				startCycOtis(kCharacterAbbot, "125B");
-				getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 4;
-				AbbotCall(&LogicManager::CONS_Abbot_DoDialog, "Abb3021", 0, 0, 0);
-				break;
-			case 4:
-				playDialog(kCharacterAbbot, "Abb3023", -1, 0);
-				blockView(kCharacterAbbot, kCarRestaurant, 52);
-				getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 5;
-				AbbotCall(&LogicManager::CONS_Abbot_DoComplexSeqOtis, "125C1", "125C2", 12, 0);
-				break;
-			case 5:
-				releaseView(kCharacterAbbot, kCarRestaurant, 52);
-				startCycOtis(kCharacterAbbot, "125D");
-				send(kCharacterAbbot, kCharacterAlexei, 122288808, 0);
-				getCharacterCurrentParams(kCharacterAbbot)[0] = 1;
-				goto LABEL_21;
-			case 6:
-				getCharacter(kCharacterAbbot).characterPosition.location = 0;
-				getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 7;
-				AbbotCall(&LogicManager::CONS_Abbot_DoBlockSeqOtis, "125E", 5, 52, 0);
+	switch (msg->action) {
+	case 0:
+		if (getCharacterCurrentParams(kCharacterAbbot)[3] != 0x7FFFFFFF && getCharacterCurrentParams(kCharacterAbbot)[1] < _gameTime) {
+			if (getCharacterCurrentParams(kCharacterAbbot)[2] < _gameTime) {
+				getCharacterCurrentParams(kCharacterAbbot)[3] = 0x7FFFFFFF;
+				getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 1;
+				AbbotCall(&LogicManager::CONS_Abbot_WaitRCClear, 0, 0, 0, 0);
 				break;
-			case 7:
-				CONS_Abbot_GoComp3(0, 0, 0, 0);
+			}
+
+			if (!inSalon(kCharacterCath) || !getCharacterCurrentParams(kCharacterAbbot)[3]) {
+				getCharacterCurrentParams(kCharacterAbbot)[3] = _gameTime + 450;
+				if (_gameTime == -450) {
+					getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 1;
+					AbbotCall(&LogicManager::CONS_Abbot_WaitRCClear, 0, 0, 0, 0);
+					break;
+				}
+			}
+
+			if (getCharacterCurrentParams(kCharacterAbbot)[3] < _gameTime) {
+				getCharacterCurrentParams(kCharacterAbbot)[3] = 0x7FFFFFFF;
+				getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 1;
+				AbbotCall(&LogicManager::CONS_Abbot_WaitRCClear, 0, 0, 0, 0);
 				break;
-			default:
-				return;
 			}
 		}
 
-		return;
-	}
+		if (getCharacterCurrentParams(kCharacterAbbot)[0] != 0) {
+			if (getCharacterCurrentParams(kCharacterAbbot)[4] || (getCharacterCurrentParams(kCharacterAbbot)[4] = _gameTime + 450, _gameTime != -450)) {
+				if (getCharacterCurrentParams(kCharacterAbbot)[4] >= _gameTime)
+					break;
 
-	if (getCharacterCurrentParams(kCharacterAbbot)[3] != 0x7FFFFFFF && getCharacterCurrentParams(kCharacterAbbot)[1] < _gameTime) {
-		if (getCharacterCurrentParams(kCharacterAbbot)[2] < _gameTime)
-			goto LABEL_12;
+				getCharacterCurrentParams(kCharacterAbbot)[4] = 0x7FFFFFFF;
+			}
 
-		if (!inSalon(kCharacterCath) || !getCharacterCurrentParams(kCharacterAbbot)[3]) {
-			getCharacterCurrentParams(kCharacterAbbot)[3] = _gameTime + 450;
-			if (_gameTime == -450)
-				goto LABEL_13;
-		}
-
-		if (getCharacterCurrentParams(kCharacterAbbot)[3] < _gameTime) {
-		LABEL_12:
-			getCharacterCurrentParams(kCharacterAbbot)[3] = 0x7FFFFFFF;
-		LABEL_13:
-			getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 1;
+			getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 6;
 			AbbotCall(&LogicManager::CONS_Abbot_WaitRCClear, 0, 0, 0, 0);
-			return;
 		}
-	}
 
-LABEL_21:
-	if (!getCharacterCurrentParams(kCharacterAbbot)[0])
-		return;
+		break;
+	case 12:
+		getCharacterCurrentParams(kCharacterAbbot)[1] = _gameTime + 4500;
+		getCharacterCurrentParams(kCharacterAbbot)[2] = _gameTime + 18000;
+		startCycOtis(kCharacterAbbot, "115B");
+		break;
+	case 18:
+		switch (getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8]) {
+		case 1:
+			getCharacter(kCharacterAbbot).characterPosition.location = 0;
+			getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 2;
+			AbbotCall(&LogicManager::CONS_Abbot_DoBlockSeqOtis, "115E", 5, 56, 0);
+			break;
+		case 2:
+			dropItem(kItem3, 1);
+			send(kCharacterAbbot, kCharacterAlexei, 122358304, 0);
+			playDialog(kCharacterAbbot, "Abb3020", -1, 0);
+			getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 3;
+			AbbotCall(&LogicManager::CONS_Abbot_DoBlockSeqOtis, "125A", 5, 52, 0);
+			break;
+		case 3:
+			getCharacter(kCharacterAbbot).characterPosition.location = 1;
+			startCycOtis(kCharacterAbbot, "125B");
+			getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 4;
+			AbbotCall(&LogicManager::CONS_Abbot_DoDialog, "Abb3021", 0, 0, 0);
+			break;
+		case 4:
+			playDialog(kCharacterAbbot, "Abb3023", -1, 0);
+			blockView(kCharacterAbbot, kCarRestaurant, 52);
+			getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 5;
+			AbbotCall(&LogicManager::CONS_Abbot_DoComplexSeqOtis, "125C1", "125C2", 12, 0);
+			break;
+		case 5:
+			releaseView(kCharacterAbbot, kCarRestaurant, 52);
+			startCycOtis(kCharacterAbbot, "125D");
+			send(kCharacterAbbot, kCharacterAlexei, 122288808, 0);
+			getCharacterCurrentParams(kCharacterAbbot)[0] = 1;
+
+			if (getCharacterCurrentParams(kCharacterAbbot)[0] != 0) {
+				if (getCharacterCurrentParams(kCharacterAbbot)[4] || (getCharacterCurrentParams(kCharacterAbbot)[4] = _gameTime + 450, _gameTime != -450)) {
+					if (getCharacterCurrentParams(kCharacterAbbot)[4] >= _gameTime)
+						break;
 
-	if (getCharacterCurrentParams(kCharacterAbbot)[4] || (getCharacterCurrentParams(kCharacterAbbot)[4] = _gameTime + 450, _gameTime != -450)) {
-		if (getCharacterCurrentParams(kCharacterAbbot)[4] >= _gameTime)
-			return;
+					getCharacterCurrentParams(kCharacterAbbot)[4] = 0x7FFFFFFF;
+				}
 
-		getCharacterCurrentParams(kCharacterAbbot)[4] = 0x7FFFFFFF;
-	}
+				getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 6;
+				AbbotCall(&LogicManager::CONS_Abbot_WaitRCClear, 0, 0, 0, 0);
+			}
+
+			break;
+		case 6:
+			getCharacter(kCharacterAbbot).characterPosition.location = 0;
+			getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 7;
+			AbbotCall(&LogicManager::CONS_Abbot_DoBlockSeqOtis, "125E", 5, 52, 0);
+			break;
+		case 7:
+			CONS_Abbot_GoComp3(0, 0, 0, 0);
+			break;
+		default:
+			break;
+		}
 
-	getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 6;
-	AbbotCall(&LogicManager::CONS_Abbot_WaitRCClear, 0, 0, 0, 0);
+		break;
+	default:
+		break;
+	}
 }
 
 void LogicManager::CONS_Abbot_GoComp3(CONS_PARAMS) {
@@ -1262,10 +1418,12 @@ void LogicManager::CONS_Abbot_GoComp3(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Abbot_GoComp3(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 1;
 		AbbotCall(&LogicManager::CONS_Abbot_DoWalk, 4, 6470, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		if (getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] == 1) {
 			setDoor(34, kCharacterCath, 1, 255, 255);
 			getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 2;
@@ -1277,6 +1435,10 @@ void LogicManager::HAND_Abbot_GoComp3(HAND_PARAMS) {
 			send(kCharacterAbbot, kCharacterMonsieur, 122358304, 0);
 			CONS_Abbot_OpenComp3(0, 0, 0, 0);
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1291,7 +1453,8 @@ void LogicManager::CONS_Abbot_OpenComp3(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Abbot_OpenComp3(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		if (getCharacterCurrentParams(kCharacterAbbot)[0] != 0x7FFFFFFF && _gameTime > 2115000) {
 			if (_gameTime <= 2124000) {
 				if (!nearChar(kCharacterAbbot, kCharacterCath, 2000) || !getCharacterCurrentParams(kCharacterAbbot)[0]) {
@@ -1299,12 +1462,12 @@ void LogicManager::HAND_Abbot_OpenComp3(HAND_PARAMS) {
 					if (!_gameTime) {
 						getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 1;
 						AbbotCall(&LogicManager::CONS_Abbot_DoDialog, "Abb3014", 0, 0, 0);
-						return;
+						break;
 					}
 				}
 
 				if (getCharacterCurrentParams(kCharacterAbbot)[0] >= _gameTime)
-					return;
+					break;
 			}
 
 			getCharacterCurrentParams(kCharacterAbbot)[0] = 0x7FFFFFFF;
@@ -1312,13 +1475,19 @@ void LogicManager::HAND_Abbot_OpenComp3(HAND_PARAMS) {
 
 			AbbotCall(&LogicManager::CONS_Abbot_DoDialog, "Abb3014", 0, 0, 0);
 		}
-	} else if (msg->action == 12) {
+
+		break;
+	case 12:
 		startCycOtis(kCharacterAbbot, "508A");
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		if (getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] == 1)
 			startCycOtis(kCharacterAbbot, "508B");
-	} else if (msg->action == 123712592) {
+
+		break;
+	case 123712592:
 		CONS_Abbot_GoSalon3(0, 0, 0, 0);
+		break;
 	}
 }
 
@@ -1333,10 +1502,12 @@ void LogicManager::CONS_Abbot_GoSalon3(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Abbot_GoSalon3(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 1;
 		AbbotCall(&LogicManager::CONS_Abbot_DoDialog, "Abb3031", 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8]) {
 		case 1:
 			send(kCharacterAbbot, kCharacterMonsieur, 122288808, 0);
@@ -1368,6 +1539,10 @@ void LogicManager::HAND_Abbot_GoSalon3(HAND_PARAMS) {
 		default:
 			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1385,7 +1560,7 @@ void LogicManager::HAND_Abbot_InSalon3(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
 		if (getCharacterCurrentParams(kCharacterAbbot)[1] == 0x7FFFFFFF || !_gameTime)
-			return;
+			break;
 
 		if (getCharacterCurrentParams(kCharacterAbbot)[0] >= _gameTime) {
 			if (!inSalon(kCharacterCath) || !getCharacterCurrentParams(kCharacterAbbot)[1]) {
@@ -1394,19 +1569,19 @@ void LogicManager::HAND_Abbot_InSalon3(HAND_PARAMS) {
 					send(kCharacterAbbot, kCharacterAugust, 136196244, 0);
 					getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 1;
 					AbbotCall(&LogicManager::CONS_Abbot_DoWait, 0, 0, 0, 0);
-					return;
+					break;
 				}
 			}
 
 			if (getCharacterCurrentParams(kCharacterAbbot)[1] >= _gameTime)
-				return;
+				break;
 		}
 
 		getCharacterCurrentParams(kCharacterAbbot)[1] = 0x7FFFFFFF;
 		send(kCharacterAbbot, kCharacterAugust, 136196244, 0);
 		getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 1;
 		AbbotCall(&LogicManager::CONS_Abbot_DoWait, 0, 0, 0, 0);
-		return;
+		break;
 	case 12:
 		startCycOtis(kCharacterAbbot, "115B");
 		getCharacterCurrentParams(kCharacterAbbot)[0] = _gameTime + 9000;
@@ -1456,19 +1631,19 @@ void LogicManager::HAND_Abbot_WithAugust(HAND_PARAMS) {
 		switch (getCharacterCurrentParams(kCharacterAbbot)[1]) {
 		case 1:
 			if (getCharacterCurrentParams(kCharacterAbbot)[2] == 0x7FFFFFFF || !_gameTime)
-				return;
+				break;
 
 			if (getCharacterCurrentParams(kCharacterAbbot)[0] >= _gameTime) {
 				if (!inSalon(kCharacterCath) || !getCharacterCurrentParams(kCharacterAbbot)[2]) {
 					getCharacterCurrentParams(kCharacterAbbot)[2] = _gameTime + 675;
 					if (_gameTime == -675) {
 						playDialog(kCharacterAbbot, "Abb3041", -1, 0);
-						return;
+						break;
 					}
 				}
 
 				if (getCharacterCurrentParams(kCharacterAbbot)[2] >= _gameTime)
-					return;
+					break;
 			}
 
 			getCharacterCurrentParams(kCharacterAbbot)[2] = 0x7FFFFFFF;
@@ -1477,7 +1652,7 @@ void LogicManager::HAND_Abbot_WithAugust(HAND_PARAMS) {
 		case 2:
 			if (getCharacterCurrentParams(kCharacterAbbot)[3] || (getCharacterCurrentParams(kCharacterAbbot)[3] = _gameTime + 900, _gameTime != -900)) {
 				if (getCharacterCurrentParams(kCharacterAbbot)[3] >= _gameTime)
-					return;
+					break;
 
 				getCharacterCurrentParams(kCharacterAbbot)[3] = 0x7FFFFFFF;
 			}
@@ -1529,10 +1704,12 @@ void LogicManager::CONS_Abbot_GoComp4(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Abbot_GoComp4(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 1;
 		AbbotCall(&LogicManager::CONS_Abbot_DoWalk, 4, 6470, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		if (getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] == 1) {
 			setDoor(34, kCharacterCath, 1, 255, 255);
 			getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 2;
@@ -1544,6 +1721,10 @@ void LogicManager::HAND_Abbot_GoComp4(HAND_PARAMS) {
 			send(kCharacterAbbot, kCharacterMonsieur, 122358304, 0);
 			CONS_Abbot_InComp4(0, 0, 0, 0);
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1558,14 +1739,20 @@ void LogicManager::CONS_Abbot_InComp4(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Abbot_InComp4(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		startCycOtis(kCharacterAbbot, "508A");
 		getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 1;
 		AbbotCall(&LogicManager::CONS_Abbot_DoDialog, "Abb3014A", 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		if (getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] == 1) {
 			startCycOtis(kCharacterAbbot, "508B");
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1580,13 +1767,18 @@ void LogicManager::CONS_Abbot_StartPart4(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Abbot_StartPart4(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		CONS_Abbot_AtDinner(0, 0, 0, 0);
-	} else if (msg->action == 12) {
-		endGraphics(13);
+		break;
+	case 12:
+		endGraphics(kCharacterAbbot);
 		getCharacter(kCharacterAbbot).inventoryItem = 0;
 		getCharacter(kCharacterAbbot).characterPosition.car = kCarRestaurant;
 		getCharacterParams(kCharacterAbbot, 8)[0] = 0;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1604,31 +1796,42 @@ void LogicManager::CONS_Abbot_DoWalkSearchingForCath(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Abbot_DoWalkSearchingForCath(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		if (walk(kCharacterAbbot, getCharacterCurrentParams(kCharacterAbbot)[0], getCharacterCurrentParams(kCharacterAbbot)[1])) {
 			getCharacter(kCharacterAbbot).currentCall--;
 			_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, _functionsAbbot[getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall]]);
 			fedEx(kCharacterAbbot, kCharacterAbbot, 18, 0);
 		} else if (!_gameEvents[kEventAbbotInvitationDrink] && nearChar(kCharacterAbbot, kCharacterCath, 1000) && !inComp(kCharacterCath) && !whoOutside(kCharacterCath)) {
-			if (getCharacter(kCharacterAbbot).characterPosition.car == 3 || getCharacter(kCharacterAbbot).characterPosition.car == 4) {
+			if (getCharacter(kCharacterAbbot).characterPosition.car == kCarGreenSleeping || getCharacter(kCharacterAbbot).characterPosition.car == kCarRedSleeping) {
 				getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 1;
-				AbbotCall(&LogicManager::CONS_Abbot_SaveGame, 2, 113, 0, 0);
+				AbbotCall(&LogicManager::CONS_Abbot_SaveGame, 2, kEventAbbotInvitationDrink, 0, 0);
 			}
 		}
-	} else if (msg->action == 12) {
+
+		break;
+	case 12:
 		if (walk(kCharacterAbbot, getCharacterCurrentParams(kCharacterAbbot)[0], getCharacterCurrentParams(kCharacterAbbot)[1])) {
 			getCharacter(kCharacterAbbot).currentCall--;
 			_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, _functionsAbbot[getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall]]);
 			fedEx(kCharacterAbbot, kCharacterAbbot, 18, 0);
 		}
-	} else if (msg->action == 18 && getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] == 1) {
-		playNIS(kEventAbbotInvitationDrink);
 
-		if (getCharacter(kCharacterAbbot).direction == 1) {
-			bumpCathFx(getCharacter(kCharacterAbbot).characterPosition.car, getCharacter(kCharacterAbbot).characterPosition.position - 750);
-		} else {
-			bumpCathRx(getCharacter(kCharacterAbbot).characterPosition.car, getCharacter(kCharacterAbbot).characterPosition.position + 750);
+		break;
+	case 18:
+		if (getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] == 1) {
+			playNIS(kEventAbbotInvitationDrink);
+
+			if (getCharacter(kCharacterAbbot).direction == 1) {
+				bumpCathFx(getCharacter(kCharacterAbbot).characterPosition.car, getCharacter(kCharacterAbbot).characterPosition.position - 750);
+			} else {
+				bumpCathRx(getCharacter(kCharacterAbbot).characterPosition.car, getCharacter(kCharacterAbbot).characterPosition.position + 750);
+			}
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1643,23 +1846,32 @@ void LogicManager::CONS_Abbot_AtDinner(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Abbot_AtDinner(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		if (_gameTime > 2358000 && !getCharacterCurrentParams(kCharacterAbbot)[0]) {
 			getCharacterCurrentParams(kCharacterAbbot)[0] = 1;
 			send(kCharacterAbbot, kCharacterWaiter1, 218128129, 0);
 		}
+
 		if (_gameTime > 2389500) {
 			if (rcClear())
 				CONS_Abbot_LeaveDinner(0, 0, 0, 0);
 		}
-	} else if (msg->action == 12) {
+
+		break;
+	case 12:
 		send(kCharacterAbbot, kCharacterTableE, 136455232, 0);
 		startCycOtis(kCharacterAbbot, "029E");
 		getCharacter(kCharacterAbbot).characterPosition.location = 1;
-	} else if (msg->action == 122288808) {
+		break;
+	case 122288808:
 		startCycOtis(kCharacterAbbot, "029E");
-	} else if (msg->action == 122358304) {
+		break;
+	case 122358304:
 		startCycOtis(kCharacterAbbot, "BLANK");
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1674,12 +1886,14 @@ void LogicManager::CONS_Abbot_LeaveDinner(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Abbot_LeaveDinner(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterAbbot).characterPosition.location = 0;
 		blockView(kCharacterAbbot, kCarRestaurant, 67);
 		getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 1;
 		AbbotCall(&LogicManager::CONS_Abbot_DoJoinedSeqOtis, "029F", 37, 103798704, "029G");
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8]) {
 		case 1:
 			releaseView(kCharacterAbbot, kCarRestaurant, 67);
@@ -1704,8 +1918,12 @@ void LogicManager::HAND_Abbot_LeaveDinner(HAND_PARAMS) {
 			CONS_Abbot_InComp(0, 0, 0, 0);
 			break;
 		default:
-			return;
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1720,106 +1938,14 @@ void LogicManager::CONS_Abbot_InComp(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Abbot_InComp(HAND_PARAMS) {
-	if (msg->action > 9) {
-		if (msg->action > 17) {
-			switch (msg->action) {
-			case 18:
-				switch (getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8]) {
-				case 1:
-					if (_gameTime > 2466000 && !getCharacterCurrentParams(kCharacterAbbot)[4]) {
-						getCharacterCurrentParams(kCharacterAbbot)[4] = 1;
-						CONS_Abbot_Asleep4(0, 0, 0, 0);
-						return;
-					}
-
-					if (getCharacterCurrentParams(kCharacterAbbot)[2]) {
-						if (getCharacterCurrentParams(kCharacterAbbot)[5] || (getCharacterCurrentParams(kCharacterAbbot)[5] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
-							if (getCharacterCurrentParams(kCharacterAbbot)[5] >= _currentGameSessionTicks)
-								return;
-
-							getCharacterCurrentParams(kCharacterAbbot)[5] = 0x7FFFFFFF;
-						}
-
-						getCharacterCurrentParams(kCharacterAbbot)[2] = 0;
-						getCharacterCurrentParams(kCharacterAbbot)[1] = 1;
-
-						setDoor(34, kCharacterAbbot, 1, 0, 0);
-						setDoor(50, kCharacterAbbot, 1, 0, 0);
-
-						getCharacterCurrentParams(kCharacterAbbot)[5] = 0;
-					} else {
-						getCharacterCurrentParams(kCharacterAbbot)[5] = 0;
-					}
-
-					break;
-				case 2:
-				case 3:
-					getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 4;
-					AbbotCall(&LogicManager::CONS_Abbot_DoDialog, "Abb3001", 0, 0, 0);
-					break;
-				case 4:
-					setDoor(34, kCharacterAbbot, 1, 14, 0);
-					setDoor(50, kCharacterAbbot, 1, 14, 0);
-					getCharacterCurrentParams(kCharacterAbbot)[2] = 1;
-					break;
-				case 5:
-				case 6:
-					getCharacterCurrentParams(kCharacterAbbot)[2] = 0;
-					getCharacterCurrentParams(kCharacterAbbot)[1] = 1;
-					break;
-				default:
-					return;
-				}
-				break;
-			case 101687594:
-				getCharacterCurrentParams(kCharacterAbbot)[0] = 1;
-				break;
-			case 159003408:
-				getCharacterCurrentParams(kCharacterAbbot)[0] = 0;
-				break;
-			}
-		} else if (msg->action == 17) {
-			if (getCharacterCurrentParams(kCharacterAbbot)[1] || getCharacterCurrentParams(kCharacterAbbot)[2]) {
-				setDoor(34, kCharacterAbbot, 1, 10, 9);
-				setDoor(50, kCharacterAbbot, 1, 10, 9);
-				getCharacterCurrentParams(kCharacterAbbot)[1] = 0;
-				getCharacterCurrentParams(kCharacterAbbot)[2] = 0;
-			}
-		} else if (msg->action == 12) {
-			setDoor(34, kCharacterAbbot, 1, 10, 9);
-			setDoor(50, kCharacterAbbot, 1, 10, 9);
-		}
-	} else if (msg->action >= 8) {
-		if (getCharacterCurrentParams(kCharacterAbbot)[2]) {
-			setDoor(34, kCharacterAbbot, 1, 0, 0);
-			setDoor(50, kCharacterAbbot, 1, 0, 0);
-
-			if (msg->param.intParam == 50) {
-				getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 5;
-				AbbotCall(&LogicManager::CONS_Abbot_DoDialog, getCathWCDialog(), 0, 0, 0);
-			} else {
-				getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 6;
-				AbbotCall(&LogicManager::CONS_Abbot_DoDialog, getCathSorryDialog(), 0, 0, 0);
-			}
-		} else {
-			setDoor(34, kCharacterAbbot, 1, 0, 0);
-			setDoor(50, kCharacterAbbot, 1, 0, 0);
-
-			if (msg->action == 8) {
-				getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 2;
-				AbbotCall(&LogicManager::CONS_Abbot_DoDialog, "LIB012", 0, 0, 0);
-			} else {
-				getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 3;
-				AbbotCall(&LogicManager::CONS_Abbot_DoDialog, "LIB013", 0, 0, 0);
-			}
-		}
-	} else if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		if (getCharacterCurrentParams(kCharacterAbbot)[0] && getCharacterCurrentParams(kCharacterAbbot)[3] != 0x7FFFFFFF && _gameTime) {
 			if (_gameTime > 2452500) {
 				getCharacterCurrentParams(kCharacterAbbot)[3] = 0x7FFFFFFF;
 				getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 1;
 				AbbotCall(&LogicManager::CONS_Abbot_DoDialog, "Abb4002", 0, 0, 0);
-				return;
+				break;
 			}
 
 			if (!nearChar(kCharacterAbbot, kCharacterCath, 1000) || whoRunningDialog(kCharacterMonsieur) || !getCharacterCurrentParams(kCharacterAbbot)[3]) {
@@ -1828,7 +1954,7 @@ void LogicManager::HAND_Abbot_InComp(HAND_PARAMS) {
 				if (!_gameTime) {
 					getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 1;
 					AbbotCall(&LogicManager::CONS_Abbot_DoDialog, "Abb4002", 0, 0, 0);
-					return;
+					break;
 				}
 			}
 
@@ -1836,20 +1962,20 @@ void LogicManager::HAND_Abbot_InComp(HAND_PARAMS) {
 				getCharacterCurrentParams(kCharacterAbbot)[3] = 0x7FFFFFFF;
 				getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 1;
 				AbbotCall(&LogicManager::CONS_Abbot_DoDialog, "Abb4002", 0, 0, 0);
-				return;
+				break;
 			}
 		}
 
 		if (_gameTime > 2466000 && !getCharacterCurrentParams(kCharacterAbbot)[4]) {
 			getCharacterCurrentParams(kCharacterAbbot)[4] = 1;
 			CONS_Abbot_Asleep4(0, 0, 0, 0);
-			return;
+			break;
 		}
 
 		if (getCharacterCurrentParams(kCharacterAbbot)[2]) {
 			if (getCharacterCurrentParams(kCharacterAbbot)[5] || (getCharacterCurrentParams(kCharacterAbbot)[5] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
 				if (getCharacterCurrentParams(kCharacterAbbot)[5] >= _currentGameSessionTicks)
-					return;
+					break;
 
 				getCharacterCurrentParams(kCharacterAbbot)[5] = 0x7FFFFFFF;
 			}
@@ -1864,6 +1990,105 @@ void LogicManager::HAND_Abbot_InComp(HAND_PARAMS) {
 		} else {
 			getCharacterCurrentParams(kCharacterAbbot)[5] = 0;
 		}
+
+		break;
+	case 8:
+	case 9:
+		if (getCharacterCurrentParams(kCharacterAbbot)[2]) {
+			setDoor(34, kCharacterAbbot, 1, 0, 0);
+			setDoor(50, kCharacterAbbot, 1, 0, 0);
+
+			if (msg->param.intParam == 50) {
+				getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 5;
+				AbbotCall(&LogicManager::CONS_Abbot_DoDialog, getCathWCDialog(), 0, 0, 0);
+			} else {
+				getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 6;
+				AbbotCall(&LogicManager::CONS_Abbot_DoDialog, getCathSorryDialog(), 0, 0, 0);
+			}
+		} else {
+			setDoor(34, kCharacterAbbot, 1, 0, 0);
+			setDoor(50, kCharacterAbbot, 1, 0, 0);
+
+			if (msg->action == 8) {
+				getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 2;
+				AbbotCall(&LogicManager::CONS_Abbot_DoDialog, "LIB012", 0, 0, 0);
+			} else {
+				getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 3;
+				AbbotCall(&LogicManager::CONS_Abbot_DoDialog, "LIB013", 0, 0, 0);
+			}
+		}
+
+		break;
+	case 12:
+		setDoor(34, kCharacterAbbot, 1, 10, 9);
+		setDoor(50, kCharacterAbbot, 1, 10, 9);
+		break;
+	case 17:
+		if (getCharacterCurrentParams(kCharacterAbbot)[1] || getCharacterCurrentParams(kCharacterAbbot)[2]) {
+			setDoor(34, kCharacterAbbot, 1, 10, 9);
+			setDoor(50, kCharacterAbbot, 1, 10, 9);
+			getCharacterCurrentParams(kCharacterAbbot)[1] = 0;
+			getCharacterCurrentParams(kCharacterAbbot)[2] = 0;
+		}
+
+		break;
+	case 18:
+		switch (getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8]) {
+		case 1:
+			if (_gameTime > 2466000 && !getCharacterCurrentParams(kCharacterAbbot)[4]) {
+				getCharacterCurrentParams(kCharacterAbbot)[4] = 1;
+				CONS_Abbot_Asleep4(0, 0, 0, 0);
+				break;
+			}
+
+			if (getCharacterCurrentParams(kCharacterAbbot)[2]) {
+				if (getCharacterCurrentParams(kCharacterAbbot)[5] || (getCharacterCurrentParams(kCharacterAbbot)[5] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
+					if (getCharacterCurrentParams(kCharacterAbbot)[5] >= _currentGameSessionTicks)
+						break;
+
+					getCharacterCurrentParams(kCharacterAbbot)[5] = 0x7FFFFFFF;
+				}
+
+				getCharacterCurrentParams(kCharacterAbbot)[2] = 0;
+				getCharacterCurrentParams(kCharacterAbbot)[1] = 1;
+
+				setDoor(34, kCharacterAbbot, 1, 0, 0);
+				setDoor(50, kCharacterAbbot, 1, 0, 0);
+
+				getCharacterCurrentParams(kCharacterAbbot)[5] = 0;
+			} else {
+				getCharacterCurrentParams(kCharacterAbbot)[5] = 0;
+			}
+
+			break;
+		case 2:
+		case 3:
+			getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 4;
+			AbbotCall(&LogicManager::CONS_Abbot_DoDialog, "Abb3001", 0, 0, 0);
+			break;
+		case 4:
+			setDoor(34, kCharacterAbbot, 1, 14, 0);
+			setDoor(50, kCharacterAbbot, 1, 14, 0);
+			getCharacterCurrentParams(kCharacterAbbot)[2] = 1;
+			break;
+		case 5:
+		case 6:
+			getCharacterCurrentParams(kCharacterAbbot)[2] = 0;
+			getCharacterCurrentParams(kCharacterAbbot)[1] = 1;
+			break;
+		default:
+			break;
+		}
+
+		break;
+	case 101687594:
+		getCharacterCurrentParams(kCharacterAbbot)[0] = 1;
+		break;
+	case 159003408:
+		getCharacterCurrentParams(kCharacterAbbot)[0] = 0;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1878,8 +2103,8 @@ void LogicManager::CONS_Abbot_Asleep4(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Abbot_Asleep4(HAND_PARAMS) {
-
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterAbbot).characterPosition.car = kCarRedSleeping;
 		getCharacter(kCharacterAbbot).characterPosition.position = 6470;
 		getCharacter(kCharacterAbbot).characterPosition.location = 1;
@@ -1888,8 +2113,12 @@ void LogicManager::HAND_Abbot_Asleep4(HAND_PARAMS) {
 
 		setDoor(34, kCharacterCath, 1, 10, 9);
 		setDoor(50, kCharacterCath, 1, 10, 9);
-	} else if (msg->action == 104060776) {
+		break;
+	case 104060776:
 		CONS_Abbot_Conferring(0, 0, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1904,7 +2133,8 @@ void LogicManager::CONS_Abbot_Conferring(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Abbot_Conferring(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterAbbot).characterPosition.position = 6471;
 		getCharacter(kCharacterAbbot).characterPosition.location = 0;
 		getCharacter(kCharacterAbbot).characterPosition.car = kCarRedSleeping;
@@ -1916,7 +2146,8 @@ void LogicManager::HAND_Abbot_Conferring(HAND_PARAMS) {
 		getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 1;
 
 		AbbotCall(&LogicManager::CONS_Abbot_DoDialog, "Abb4010", 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		if (getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] == 1) {
 			getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 2;
 			AbbotCall(&LogicManager::CONS_Abbot_DoCorrOtis, "617Kc", 34, 0, 0);
@@ -1926,6 +2157,10 @@ void LogicManager::HAND_Abbot_Conferring(HAND_PARAMS) {
 
 			CONS_Abbot_GoSalon4(0, 0, 0, 0);
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1940,14 +2175,20 @@ void LogicManager::CONS_Abbot_GoSalon4(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Abbot_GoSalon4(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterAbbot).characterPosition.position = 6471;
 		getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 1;
 		AbbotCall(&LogicManager::CONS_Abbot_DoWalkSearchingForCath, 5, 850, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		if (getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] == 1) {
 			CONS_Abbot_BeforeBomb(0, 0, 0, 0);
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1965,7 +2206,7 @@ void LogicManager::HAND_Abbot_BeforeBomb(HAND_PARAMS) {
 	switch (msg->action) {
 	case 1:
 		getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 3;
-		AbbotCall(&LogicManager::CONS_Abbot_SaveGame, 2, 114, 0, 0);
+		AbbotCall(&LogicManager::CONS_Abbot_SaveGame, 2, kEventAbbotDrinkGiveDetonator, 0, 0);
 		break;
 	case 12:
 		getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 1;
@@ -1988,8 +2229,12 @@ void LogicManager::HAND_Abbot_BeforeBomb(HAND_PARAMS) {
 			playNIS(kEventAbbotDrinkGiveDetonator);
 			endGame(0, 1, 0, true);
 			break;
+		default:
+			break;
 		}
 
+		break;
+	default:
 		break;
 	}
 }
@@ -2017,7 +2262,7 @@ void LogicManager::HAND_Abbot_AfterBomb(HAND_PARAMS) {
 				getCharacter(kCharacterAbbot).inventoryItem = 0;
 				getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 4;
 				AbbotCall(&LogicManager::CONS_Abbot_DoBlockSeqOtis, "126C", 5, 52, 0);
-				return;
+				break;
 			}
 		}
 
@@ -2037,7 +2282,7 @@ void LogicManager::HAND_Abbot_AfterBomb(HAND_PARAMS) {
 	case 1:
 		getCharacter(kCharacterAbbot).inventoryItem = 0;
 		getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 9;
-		AbbotCall(&LogicManager::CONS_Abbot_SaveGame, 2, 117, 0, 0);
+		AbbotCall(&LogicManager::CONS_Abbot_SaveGame, 2, kEventAbbotDrinkDefuse, 0, 0);
 		break;
 	case 12:
 		getCharacter(kCharacterAbbot).characterPosition.position = 850;
@@ -2124,25 +2369,29 @@ void LogicManager::CONS_Abbot_CatchCath(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Abbot_CatchCath(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		if (getCharacterCurrentParams(kCharacterAbbot)[0] || (getCharacterCurrentParams(kCharacterAbbot)[0] = _currentGameSessionTicks + 150, _currentGameSessionTicks != -150)) {
 			if (getCharacterCurrentParams(kCharacterAbbot)[0] >= _currentGameSessionTicks)
-				return;
+				break;
 
 			getCharacterCurrentParams(kCharacterAbbot)[0] = 0x7FFFFFFF;
 		}
 
 		send(kCharacterAbbot, kCharacterAbbot, 157489665, 0);
-	} else if (msg->action == 8) {
+	case 8:
 		if (!cathRunningDialog("LIB012"))
 			playDialog(0, "LIB012", -1, 0);
-	} else if (msg->action == 9) {
+
+		break;
+	case 9:
 		send(kCharacterAbbot, kCharacterTatiana, 238790488, 0);
 		setDoor(2, kCharacterCath, 0, 10, 9);
 		setDoor(18, kCharacterCath, 0, 10, 9);
 		getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 1;
-		AbbotCall(&LogicManager::CONS_Abbot_SaveGame, 2, 111, 0, 0);
-	} else if (msg->action == 12) {
+		AbbotCall(&LogicManager::CONS_Abbot_SaveGame, 2, kEventAbbotWrongCompartment, 0, 0);
+		break;
+	case 12:
 		getCharacter(kCharacterAbbot).characterPosition.car = kCarGreenSleeping;
 		getCharacter(kCharacterAbbot).characterPosition.position = 7500;
 		getCharacter(kCharacterAbbot).characterPosition.location = 1;
@@ -2151,7 +2400,8 @@ void LogicManager::HAND_Abbot_CatchCath(HAND_PARAMS) {
 		send(kCharacterAbbot, kCharacterMonsieur, 125039808, 0);
 		setDoor(2, kCharacterAbbot, 1, 10, 9);
 		setDoor(18, kCharacterAbbot, 1, 10, 9);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8]) {
 		case 1:
 			if (getModel(2) == 1) {
@@ -2160,7 +2410,7 @@ void LogicManager::HAND_Abbot_CatchCath(HAND_PARAMS) {
 				playNIS(kEventAbbotWrongCompartment);
 			}
 
-			walk(kCharacterAbbot, kCarRedSleeping, 6470u);
+			walk(kCharacterAbbot, kCarRedSleeping, 6470);
 			playDialog(0, "LIB015", -1, 0);
 			bumpCathFDoor(2);
 			getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 2;
@@ -2176,13 +2426,20 @@ void LogicManager::HAND_Abbot_CatchCath(HAND_PARAMS) {
 			setDoor(34, kCharacterAbbot, 1, 10, 9);
 			CONS_Abbot_InComp(0, 0, 0, 0);
 			break;
+		default:
+			break;
 		}
-	} else if (msg->action == 157489665) {
+
+		break;
+	case 157489665:
 		send(kCharacterAbbot, kCharacterTatiana, 238790488, 0);
 		setDoor(2, kCharacterCath, 0, 10, 9);
 		setDoor(18, kCharacterCath, 0, 10, 9);
 		getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 1;
-		AbbotCall(&LogicManager::CONS_Abbot_SaveGame, 2, 111, 0, 0);
+		AbbotCall(&LogicManager::CONS_Abbot_SaveGame, 2, kEventAbbotWrongCompartment, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -2197,9 +2454,11 @@ void LogicManager::CONS_Abbot_StartPart5(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Abbot_StartPart5(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		CONS_Abbot_Prisoner(0, 0, 0, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		endGraphics(kCharacterAbbot);
 
 		getCharacter(kCharacterAbbot).characterPosition.location = 1;
@@ -2207,6 +2466,9 @@ void LogicManager::HAND_Abbot_StartPart5(HAND_PARAMS) {
 		getCharacter(kCharacterAbbot).characterPosition.car = kCarRestaurant;
 		getCharacter(kCharacterAbbot).inventoryItem = 0;
 		getCharacter(kCharacterAbbot).clothes = 0;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -2221,8 +2483,13 @@ void LogicManager::CONS_Abbot_Prisoner(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Abbot_Prisoner(HAND_PARAMS) {
-	if (msg->action == 70549068)
+	switch (msg->action) {
+	case 70549068:
 		CONS_Abbot_Free(0, 0, 0, 0);
+		break;
+	default:
+		break;
+	}
 }
 
 void LogicManager::CONS_Abbot_Free(CONS_PARAMS) {
@@ -2236,13 +2503,18 @@ void LogicManager::CONS_Abbot_Free(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Abbot_Free(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		endGraphics(kCharacterAbbot);
 		getCharacter(kCharacterAbbot).characterPosition.car = kCarNone;
 		getCharacter(kCharacterAbbot).characterPosition.position = 0;
 		getCharacter(kCharacterAbbot).characterPosition.location = 0;
-	} else if (msg->action == 135600432) {
+		break;
+	case 135600432:
 		CONS_Abbot_RunningTrain(0, 0, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -2257,10 +2529,12 @@ void LogicManager::CONS_Abbot_RunningTrain(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Abbot_RunningTrain(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		dropItem(kItem25, 1);
 		send(kCharacterAbbot, kCharacterAnna, 158480160, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		if (getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] == 1) {
 			playNIS(kEventLocomotiveAbbotGetSomeRest);
 			cleanNIS();
@@ -2268,17 +2542,23 @@ void LogicManager::HAND_Abbot_RunningTrain(HAND_PARAMS) {
 			playNIS(kEventLocomotiveAbbotShoveling);
 			cleanNIS();
 		}
-	} else if (msg->action == 168646401) {
+
+		break;
+	case 168646401:
 		if (!_gameEvents[kEventLocomotiveAbbotGetSomeRest]) {
 			getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 1;
-			AbbotCall(&LogicManager::CONS_Abbot_SaveGame, 2, 194, 0, 0);
+			AbbotCall(&LogicManager::CONS_Abbot_SaveGame, 2, kEventLocomotiveAbbotGetSomeRest, 0, 0);
 		} else if (!_gameEvents[kEventLocomotiveAbbotShoveling]) {
 			getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 2;
-			AbbotCall(&LogicManager::CONS_Abbot_SaveGame, 2, 195, 0, 0);
+			AbbotCall(&LogicManager::CONS_Abbot_SaveGame, 2, kEventLocomotiveAbbotShoveling, 0, 0);
 		} else {
 			playNIS(kEventLocomotiveAbbotShoveling);
 			cleanNIS();
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 


Commit: 1361402186cb5a86982a9b3310b823fe70e6a93b
    https://github.com/scummvm/scummvm/commit/1361402186cb5a86982a9b3310b823fe70e6a93b
Author: AndywinXp (andywinxp at gmail.com)
Date: 2025-06-16T23:12:18+02:00

Commit Message:
LASTEXPRESS: Clean up Alexei logic

Changed paths:
    engines/lastexpress/characters/alexei.cpp


diff --git a/engines/lastexpress/characters/alexei.cpp b/engines/lastexpress/characters/alexei.cpp
index acde40960d4..8f45bd11f1d 100644
--- a/engines/lastexpress/characters/alexei.cpp
+++ b/engines/lastexpress/characters/alexei.cpp
@@ -70,18 +70,24 @@ void LogicManager::CONS_Alexei_DebugWalks(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Alexei_DebugWalks(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			getCharacter(kCharacterAlexei).characterPosition.position = 0;
-			getCharacter(kCharacterAlexei).characterPosition.location = 0;
-			getCharacter(kCharacterAlexei).characterPosition.car = kCarGreenSleeping;
-			getCharacterCurrentParams(kCharacterAlexei)[0] = 10000;
+	switch (msg->action) {
+	case 0:
+		if (walk(kCharacterAlexei, kCarGreenSleeping, getCharacterCurrentParams(kCharacterAlexei)[0])) {
+			if (getCharacterCurrentParams(kCharacterAlexei)[0] == 10000)
+				getCharacterCurrentParams(kCharacterAlexei)[0] = 0;
+			else
+				getCharacterCurrentParams(kCharacterAlexei)[0] = 10000;
 		}
-	} else if (walk(kCharacterAlexei, kCarGreenSleeping, getCharacterCurrentParams(kCharacterAlexei)[0])) {
-		if (getCharacterCurrentParams(kCharacterAlexei)[0] == 10000)
-			getCharacterCurrentParams(kCharacterAlexei)[0] = 0;
-		else
-			getCharacterCurrentParams(kCharacterAlexei)[0] = 10000;
+
+		break;
+	case 12:
+		getCharacter(kCharacterAlexei).characterPosition.position = 0;
+		getCharacter(kCharacterAlexei).characterPosition.location = 0;
+		getCharacter(kCharacterAlexei).characterPosition.car = kCarGreenSleeping;
+		getCharacterCurrentParams(kCharacterAlexei)[0] = 10000;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -98,12 +104,17 @@ void LogicManager::CONS_Alexei_DoDialog(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Alexei_DoDialog(HAND_PARAMS) {
-	if (msg->action == 2) {
+	switch (msg->action) {
+	case 2:
 		getCharacter(kCharacterAlexei).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterAlexei, _functionsAlexei[getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall]]);
 		fedEx(kCharacterAlexei, kCharacterAlexei, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		playDialog(kCharacterAlexei, (char *)&getCharacterCurrentParams(kCharacterAlexei)[0], -1, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -120,11 +131,12 @@ void LogicManager::CONS_Alexei_DoWait(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Alexei_DoWait(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		if (getCharacterCurrentParams(kCharacterAlexei)[1] ||
 			(getCharacterCurrentParams(kCharacterAlexei)[1] = _gameTime + getCharacterCurrentParams(kCharacterAlexei)[0], _gameTime + getCharacterCurrentParams(kCharacterAlexei)[0] != 0)) {
 			if (getCharacterCurrentParams(kCharacterAlexei)[1] >= _gameTime)
-				return;
+				break;
 
 			getCharacterCurrentParams(kCharacterAlexei)[1] = 0x7FFFFFFF;
 		}
@@ -132,6 +144,9 @@ void LogicManager::HAND_Alexei_DoWait(HAND_PARAMS) {
 		getCharacter(kCharacterAlexei).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterAlexei, _functionsAlexei[getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall]]);
 		fedEx(kCharacterAlexei, kCharacterAlexei, 18, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -148,12 +163,17 @@ void LogicManager::CONS_Alexei_DoSeqOtis(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Alexei_DoSeqOtis(HAND_PARAMS) {
-	if (msg->action == 3) {
+	switch (msg->action) {
+	case 3:
 		getCharacter(kCharacterAlexei).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterAlexei, _functionsAlexei[getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall]]);
 		fedEx(kCharacterAlexei, kCharacterAlexei, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		startSeqOtis(kCharacterAlexei, (char *)&getCharacterCurrentParams(kCharacterAlexei)[0]);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -173,15 +193,20 @@ void LogicManager::CONS_Alexei_DoBlockSeqOtis(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Alexei_DoBlockSeqOtis(HAND_PARAMS) {
-	if (msg->action == 3) {
+	switch (msg->action) {
+	case 3:
 		releaseView(kCharacterAlexei, getCharacterCurrentParams(kCharacterAlexei)[3], getCharacterCurrentParams(kCharacterAlexei)[4]);
 
 		getCharacter(kCharacterAlexei).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterAlexei, _functionsAlexei[getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall]]);
 		fedEx(kCharacterAlexei, kCharacterAlexei, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		startSeqOtis(kCharacterAlexei, (char *)&getCharacterCurrentParams(kCharacterAlexei)[0]);
 		blockView(kCharacterAlexei, getCharacterCurrentParams(kCharacterAlexei)[3], getCharacterCurrentParams(kCharacterAlexei)[4]);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -200,15 +225,20 @@ void LogicManager::CONS_Alexei_DoCorrOtis(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Alexei_DoCorrOtis(HAND_PARAMS) {
-	if (msg->action == 3) {
+	switch (msg->action) {
+	case 3:
 		releaseAtDoor(kCharacterAlexei, getCharacterCurrentParams(kCharacterAlexei)[3]);
 
 		getCharacter(kCharacterAlexei).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterAlexei, _functionsAlexei[getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall]]);
 		fedEx(kCharacterAlexei, kCharacterAlexei, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		startSeqOtis(kCharacterAlexei, (char *)&getCharacterCurrentParams(kCharacterAlexei)[0]);
 		blockAtDoor(kCharacterAlexei, getCharacterCurrentParams(kCharacterAlexei)[3]);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -223,16 +253,22 @@ void LogicManager::CONS_Alexei_FinishSeqOtis(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Alexei_FinishSeqOtis(HAND_PARAMS) {
-	if (msg->action == 0) {
-		if (getCharacter(kCharacterAlexei).direction == 4)
-			return;
-		goto LABEL_5;
-	}
-	if (msg->action == 3) {
-	LABEL_5:
+	switch (msg->action) {
+	case 0:
+		if (getCharacter(kCharacterAlexei).direction != 4) {
+			getCharacter(kCharacterAlexei).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterAlexei, _functionsAlexei[getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall]]);
+			fedEx(kCharacterAlexei, kCharacterAlexei, 18, 0);
+		}
+
+		break;
+	case 3:
 		getCharacter(kCharacterAlexei).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterAlexei, _functionsAlexei[getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall]]);
 		fedEx(kCharacterAlexei, kCharacterAlexei, 18, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -268,10 +304,13 @@ void LogicManager::HAND_Alexei_DoJoinedSeqOtis(HAND_PARAMS) {
 			fedEx(kCharacterAlexei, getCharacterCurrentParams(kCharacterAlexei)[3], getCharacterCurrentParams(kCharacterAlexei)[4], (char *)&getCharacterCurrentParams(kCharacterAlexei)[5]);
 			getCharacterCurrentParams(kCharacterAlexei)[8] = 1;
 		}
+
 		break;
 	case 12:
 		startSeqOtis(kCharacterAlexei, (char *)&getCharacterCurrentParams(kCharacterAlexei)[0]);
 		break;
+	default:
+		break;
 	}
 }
 
@@ -289,22 +328,25 @@ void LogicManager::CONS_Alexei_SaveGame(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Alexei_SaveGame(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			save(
-				kCharacterAlexei,
-				getCharacterCurrentParams(kCharacterAlexei)[0],
-				getCharacterCurrentParams(kCharacterAlexei)[1]
-			);
+	switch (msg->action) {
+	case 0:
+		getCharacter(kCharacterAlexei).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterAlexei, _functionsAlexei[getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall]]);
+		fedEx(kCharacterAlexei, kCharacterAlexei, 18, 0);
+		break;
+	case 12:
+		save(
+			kCharacterAlexei,
+			getCharacterCurrentParams(kCharacterAlexei)[0],
+			getCharacterCurrentParams(kCharacterAlexei)[1]
+		);
 
-			getCharacter(kCharacterAlexei).currentCall--;
-			_engine->getMessageManager()->setMessageHandle(kCharacterAlexei, _functionsAlexei[getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall]]);
-			fedEx(kCharacterAlexei, kCharacterAlexei, 18, 0);
-		}
-	} else {
 		getCharacter(kCharacterAlexei).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterAlexei, _functionsAlexei[getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall]]);
 		fedEx(kCharacterAlexei, kCharacterAlexei, 18, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -324,12 +366,20 @@ void LogicManager::CONS_Alexei_DoWalk(CONS_PARAMS) {
 void LogicManager::HAND_Alexei_DoWalk(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
-		if (walk(kCharacterAlexei, getCharacterCurrentParams(kCharacterAlexei)[0], getCharacterCurrentParams(kCharacterAlexei)[1]))
-			goto LABEL_16;
+	case 12:
+		if (walk(kCharacterAlexei, getCharacterCurrentParams(kCharacterAlexei)[0], getCharacterCurrentParams(kCharacterAlexei)[1])) {
+			getCharacter(kCharacterAlexei).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterAlexei, _functionsAlexei[getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall]]);
+			fedEx(kCharacterAlexei, kCharacterAlexei, 18, 0);
+		}
+
 		break;
 	case 5:
-		if (checkCathDir(kCarGreenSleeping, 18) || checkCathDir(kCarRedSleeping, 18))
-			goto LABEL_14;
+		if (checkCathDir(kCarGreenSleeping, 18) || checkCathDir(kCarRedSleeping, 18)) {
+			playChrExcuseMe(kCharacterAlexei, kCharacterCath, 0);
+			break;
+		}
+
 		if (_gameEvents[kEventAlexeiSalonVassili] || _gameEvents[kEventTatianaAskMatchSpeakRussian] && cathHasItem(kItemPassengerList)) {
 			if (rnd(2) == 0) {
 				playDialog(kCharacterCath, "CAT1012A", -1, 0);
@@ -339,22 +389,13 @@ void LogicManager::HAND_Alexei_DoWalk(HAND_PARAMS) {
 		} else {
 			playCathExcuseMe();
 		}
+
 		break;
 	case 6:
-	LABEL_14:
 		playChrExcuseMe(kCharacterAlexei, kCharacterCath, 0);
 		break;
-	case 12:
-		getCharacter(kCharacterAlexei).inventoryItem = 0;
-		if (walk(kCharacterAlexei, getCharacterCurrentParams(kCharacterAlexei)[0], getCharacterCurrentParams(kCharacterAlexei)[1])) {
-		LABEL_16:
-			getCharacter(kCharacterAlexei).currentCall--;
-			_engine->getMessageManager()->setMessageHandle(kCharacterAlexei, _functionsAlexei[getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall]]);
-			fedEx(kCharacterAlexei, kCharacterAlexei, 18, 0);
-		}
-		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -369,13 +410,18 @@ void LogicManager::CONS_Alexei_DoComplexSeqOtis(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Alexei_DoComplexSeqOtis(HAND_PARAMS) {
-	if (msg->action == 3) {
+	switch (msg->action) {
+	case 3:
 		getCharacter(kCharacterAlexei).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterAlexei, _functionsAlexei[getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall]]);
 		fedEx(kCharacterAlexei, kCharacterAlexei, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		startSeqOtis(kCharacterAlexei, (char *)&getCharacterCurrentParams(kCharacterAlexei)[0]);
 		startSeqOtis(getCharacterCurrentParams(kCharacterAlexei)[6], (char *)&getCharacterCurrentParams(kCharacterAlexei)[3]);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -390,16 +436,18 @@ void LogicManager::CONS_Alexei_WaitRCClear(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Alexei_WaitRCClear(HAND_PARAMS) {
-	if (msg->action == 0) {
-		if (!rcClear())
-			return;
-		goto LABEL_7;
-	}
-	if (msg->action == 12 && rcClear()) {
-	LABEL_7:
-		getCharacter(kCharacterAlexei).currentCall--;
-		_engine->getMessageManager()->setMessageHandle(kCharacterAlexei, _functionsAlexei[getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall]]);
-		fedEx(kCharacterAlexei, kCharacterAlexei, 18, 0);
+	switch (msg->action) {
+	case 0:
+	case 12:
+		if (rcClear()) {
+			getCharacter(kCharacterAlexei).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterAlexei, _functionsAlexei[getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall]]);
+			fedEx(kCharacterAlexei, kCharacterAlexei, 18, 0);
+		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -440,11 +488,14 @@ void LogicManager::HAND_Alexei_EnterComp(HAND_PARAMS) {
 			_engine->getMessageManager()->setMessageHandle(kCharacterAlexei, _functionsAlexei[getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall]]);
 			fedEx(kCharacterAlexei, kCharacterAlexei, 18, 0);
 		}
+
 		break;
 	case 135664192:
 		getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 2;
 		AlexeiCall(&LogicManager::CONS_Alexei_DoCorrOtis, "602Eb", 2, 0, 0);
 		break;
+	default:
+		break;
 	}
 }
 
@@ -471,6 +522,7 @@ void LogicManager::HAND_Alexei_ExitComp(HAND_PARAMS) {
 			startCycOtis(kCharacterAlexei, "602DB");
 			softBlockAtDoor(kCharacterAlexei, 2);
 		}
+
 		break;
 	case 135664192:
 		setDoor(2, 0, 1, 10, 9);
@@ -480,6 +532,8 @@ void LogicManager::HAND_Alexei_ExitComp(HAND_PARAMS) {
 		_engine->getMessageManager()->setMessageHandle(kCharacterAlexei, _functionsAlexei[getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall]]);
 		fedEx(kCharacterAlexei, kCharacterAlexei, 18, 0);
 		break;
+	default:
+		break;
 	}
 }
 
@@ -494,40 +548,49 @@ void LogicManager::CONS_Alexei_PacingAtWindow(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Alexei_PacingAtWindow(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			getCharacterCurrentParams(kCharacterAlexei)[0] = 5 * (3 * rnd(60) + 90);
-			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 1;
-			AlexeiCall(&LogicManager::CONS_Alexei_WaitRCClear, 0, 0, 0, 0);
-		} else if (msg->action == 18) {
-			switch (getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8]) {
-			case 1:
+	switch (msg->action) {
+	case 0:
+		if (!getCharacterCurrentParams(kCharacterAlexei)[1] && (getCharacterCurrentParams(kCharacterAlexei)[1] = _gameTime + getCharacterCurrentParams(kCharacterAlexei)[0], _gameTime + getCharacterCurrentParams(kCharacterAlexei)[0] == 0) ||
+			getCharacterCurrentParams(kCharacterAlexei)[1] < _gameTime) {
+			if (rcClear()) {
 				getCharacter(kCharacterAlexei).characterPosition.location = 0;
-				getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 2;
-				AlexeiCall(&LogicManager::CONS_Alexei_DoBlockSeqOtis, "103C", 5, 0x34, 0);
-				break;
-			case 2:
-				getCharacter(kCharacterAlexei).characterPosition.location = 1;
-				startCycOtis(kCharacterAlexei, "103E");
-				break;
-			case 3:
-				getCharacter(kCharacterAlexei).characterPosition.location = 1;
-				startCycOtis(kCharacterAlexei, "103B");
-
-				getCharacter(kCharacterAlexei).currentCall--;
-				_engine->getMessageManager()->setMessageHandle(kCharacterAlexei, _functionsAlexei[getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall]]);
-				fedEx(kCharacterAlexei, kCharacterAlexei, 18, 0);
-				break;
+				getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 3;
+				AlexeiCall(&LogicManager::CONS_Alexei_DoBlockSeqOtis, "103D", 5, 52, 0);
 			}
 		}
-	} else if (!getCharacterCurrentParams(kCharacterAlexei)[1] &&
-				   (getCharacterCurrentParams(kCharacterAlexei)[1] = _gameTime + getCharacterCurrentParams(kCharacterAlexei)[0], _gameTime + getCharacterCurrentParams(kCharacterAlexei)[0] == 0) ||
-			   getCharacterCurrentParams(kCharacterAlexei)[1] < _gameTime) {
-		if (rcClear()) {
+
+		break;
+	case 12:
+		getCharacterCurrentParams(kCharacterAlexei)[0] = 5 * (3 * rnd(60) + 90);
+		getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 1;
+		AlexeiCall(&LogicManager::CONS_Alexei_WaitRCClear, 0, 0, 0, 0);
+		break;
+	case 18:
+		switch (getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8]) {
+		case 1:
 			getCharacter(kCharacterAlexei).characterPosition.location = 0;
-			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 3;
-			AlexeiCall(&LogicManager::CONS_Alexei_DoBlockSeqOtis, "103D", 5, 52, 0);
+			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 2;
+			AlexeiCall(&LogicManager::CONS_Alexei_DoBlockSeqOtis, "103C", 5, 52, 0);
+			break;
+		case 2:
+			getCharacter(kCharacterAlexei).characterPosition.location = 1;
+			startCycOtis(kCharacterAlexei, "103E");
+			break;
+		case 3:
+			getCharacter(kCharacterAlexei).characterPosition.location = 1;
+			startCycOtis(kCharacterAlexei, "103B");
+
+			getCharacter(kCharacterAlexei).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterAlexei, _functionsAlexei[getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall]]);
+			fedEx(kCharacterAlexei, kCharacterAlexei, 18, 0);
+			break;
+		default:
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -546,81 +609,42 @@ void LogicManager::CONS_Alexei_CompLogic(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Alexei_CompLogic(HAND_PARAMS) {
-	if (msg->action > 9) {
-		if (msg->action > 17) {
-			switch (msg->action) {
-			case 18:
-				switch (getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8]) {
-				case 1:
-				case 2:
-					getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 3;
-					AlexeiCall(&LogicManager::CONS_Alexei_DoDialog, "ALX1134A", 0, 0, 0);
-					break;
-				case 3:
-					setDoor(2, 12, 1, 14, 0);
-					setDoor(18, 12, 1, 14, 0);
-					getCharacterCurrentParams(kCharacterAlexei)[4] = 1;
-					break;
-				case 4:
-				case 5:
-				case 6:
-					getCharacterCurrentParams(kCharacterAlexei)[4] = 0;
-					getCharacterCurrentParams(kCharacterAlexei)[5] = 1;
-					break;
-				case 7:
-					getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 8;
-					AlexeiCall(&LogicManager::CONS_Alexei_DoWait, 0x12C, 0, 0, 0);
-					break;
-				case 8:
-					getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 9;
-					AlexeiCall(&LogicManager::CONS_Alexei_DoCorrOtis, "602Gb", 2, 0, 0);
-					break;
-				case 9:
-					getCharacter(kCharacterAlexei).characterPosition.location = 0;
-					send(kCharacterAlexei, kCharacterCond1, 156567128, 0);
-					startCycOtis(kCharacterAlexei, "602Hb");
-					softBlockAtDoor(kCharacterAlexei, 2);
-					break;
-				case 10:
-					softReleaseAtDoor(kCharacterAlexei, 2);
-					getCharacter(kCharacterAlexei).characterPosition.location = 1;
-					getCharacter(kCharacterAlexei).characterPosition.position = 7500;
-					startCycOtis(kCharacterAlexei, (char *)&getCharacterCurrentParams(kCharacterAlexei)[1]);
-					setDoor(2, 12, 1, 10, 9);
-					setDoor(18, 12, 1, 10, 9);
-					getCharacterCurrentParams(kCharacterAlexei)[6] = 0;
-					break;
-				default:
-					return;
+	switch (msg->action) {
+	case 0:
+		if (!getCharacterCurrentParams(kCharacterAlexei)[6] && getCharacterCurrentParams(kCharacterAlexei)[0] < _gameTime && !getCharacterCurrentParams(kCharacterAlexei)[7]) {
+			getCharacterCurrentParams(kCharacterAlexei)[7] = 1;
+			setDoor(2, kCharacterCath, 1, 10, 9);
+			setDoor(18, kCharacterCath, 1, 10, 9);
+
+			getCharacter(kCharacterAlexei).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterAlexei, _functionsAlexei[getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall]]);
+			fedEx(kCharacterAlexei, kCharacterAlexei, 18, 0);
+		} else {
+			if (getCharacterCurrentParams(kCharacterAlexei)[4]) {
+				if (getCharacterCurrentParams(kCharacterAlexei)[8] || (getCharacterCurrentParams(kCharacterAlexei)[8] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
+					if (getCharacterCurrentParams(kCharacterAlexei)[8] >= _currentGameSessionTicks)
+						break;
+
+					getCharacterCurrentParams(kCharacterAlexei)[8] = 0x7FFFFFFF;
 				}
-				break;
-			case 124697504:
-				getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 10;
-				AlexeiCall(&LogicManager::CONS_Alexei_DoCorrOtis, "602Ib", 2, 0, 0);
-				break;
-			case 221617184:
-				getCharacterCurrentParams(kCharacterAlexei)[6] = 1;
-				send(kCharacterAlexei, kCharacterCond1, 100906246, 0);
-				getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 7;
-				AlexeiCall(&LogicManager::CONS_Alexei_DoDialog, "CON1024", 0, 0, 0);
-				break;
-			}
-		} else if (msg->action == 17) {
-			if (getCharacterCurrentParams(kCharacterAlexei)[5] || getCharacterCurrentParams(kCharacterAlexei)[4]) {
-				setDoor(2, 12, 1, 10, 9);
-				setDoor(18, 12, 1, 10, 9);
-				getCharacterCurrentParams(kCharacterAlexei)[5] = 0;
+
 				getCharacterCurrentParams(kCharacterAlexei)[4] = 0;
+				getCharacterCurrentParams(kCharacterAlexei)[5] = 1;
+				setDoor(2, kCharacterAlexei, 1, 0, 0);
+				setDoor(18, kCharacterAlexei, 1, 0, 0);
+				getCharacterCurrentParams(kCharacterAlexei)[8] = 0;
+			} else {
+				getCharacterCurrentParams(kCharacterAlexei)[8] = 0;
 			}
-		} else if (msg->action == 12) {
-			startCycOtis(kCharacterAlexei, (char *)&getCharacterCurrentParams(kCharacterAlexei)[1]);
-			setDoor(2, 12, 1, 10, 9);
-			setDoor(18, 12, 1, 10, 9);
 		}
-	} else if (msg->action >= 8) {
+
+		break;
+	case 8:
+	case 9:
 		if (getCharacterCurrentParams(kCharacterAlexei)[4]) {
-			setDoor(2, 12, 1, 0, 0);
-			setDoor(18, 12, 1, 0, 0);
+			setDoor(2, kCharacterAlexei, 1, 0, 0);
+			setDoor(18, kCharacterAlexei, 1, 0, 0);
+
 			if (msg->param.intParam == 18) {
 				getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 4;
 				AlexeiCall(&LogicManager::CONS_Alexei_DoDialog, getCathWCDialog(), 0, 0, 0);
@@ -631,14 +655,15 @@ void LogicManager::HAND_Alexei_CompLogic(HAND_PARAMS) {
 					AlexeiCall(&LogicManager::CONS_Alexei_DoDialog, getCathSorryDialog(), 0, 0, 0);
 				} else {
 					AlexeiCall(&LogicManager::CONS_Alexei_DoDialog, "CAT1503", 0, 0, 0);
-				}		
+				}
 			} else {
 				getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 6;
 				AlexeiCall(&LogicManager::CONS_Alexei_DoDialog, getCathSorryDialog(), 0, 0, 0);
 			}
 		} else {
-			setDoor(2, 12, 1, 0, 0);
-			setDoor(18, 12, 1, 0, 0);
+			setDoor(2, kCharacterAlexei, 1, 0, 0);
+			setDoor(18, kCharacterAlexei, 1, 0, 0);
+
 			if (msg->action == 8) {
 				getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 1;
 				AlexeiCall(&LogicManager::CONS_Alexei_DoDialog, "LIB012", 0, 0, 0);
@@ -647,31 +672,80 @@ void LogicManager::HAND_Alexei_CompLogic(HAND_PARAMS) {
 				AlexeiCall(&LogicManager::CONS_Alexei_DoDialog, "LIB013", 0, 0, 0);
 			}
 		}
-	} else if (msg->action == 0) {
-		if (!getCharacterCurrentParams(kCharacterAlexei)[6] && getCharacterCurrentParams(kCharacterAlexei)[0] < _gameTime && !getCharacterCurrentParams(kCharacterAlexei)[7]) {
-			getCharacterCurrentParams(kCharacterAlexei)[7] = 1;
-			setDoor(2, 0, 1, 10, 9);
-			setDoor(18, 0, 1, 10, 9);
 
-			getCharacter(kCharacterAlexei).currentCall--;
-			_engine->getMessageManager()->setMessageHandle(kCharacterAlexei, _functionsAlexei[getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall]]);
-			fedEx(kCharacterAlexei, kCharacterAlexei, 18, 0);
-			return;
+		break;
+	case 12:
+		startCycOtis(kCharacterAlexei, (char *)&getCharacterCurrentParams(kCharacterAlexei)[1]);
+		setDoor(2, kCharacterAlexei, 1, 10, 9);
+		setDoor(18, kCharacterAlexei, 1, 10, 9);
+		break;
+	case 17:
+		if (getCharacterCurrentParams(kCharacterAlexei)[5] || getCharacterCurrentParams(kCharacterAlexei)[4]) {
+			setDoor(2, 12, 1, 10, 9);
+			setDoor(18, 12, 1, 10, 9);
+			getCharacterCurrentParams(kCharacterAlexei)[5] = 0;
+			getCharacterCurrentParams(kCharacterAlexei)[4] = 0;
 		}
-		if (getCharacterCurrentParams(kCharacterAlexei)[4]) {
-			if (getCharacterCurrentParams(kCharacterAlexei)[8] || (getCharacterCurrentParams(kCharacterAlexei)[8] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
-				if (getCharacterCurrentParams(kCharacterAlexei)[8] >= _currentGameSessionTicks)
-					return;
-				getCharacterCurrentParams(kCharacterAlexei)[8] = 0x7FFFFFFF;
-			}
+
+		break;
+	case 18:
+		switch (getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8]) {
+		case 1:
+		case 2:
+			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 3;
+			AlexeiCall(&LogicManager::CONS_Alexei_DoDialog, "ALX1134A", 0, 0, 0);
+			break;
+		case 3:
+			setDoor(2, kCharacterAlexei, 1, 14, 0);
+			setDoor(18, kCharacterAlexei, 1, 14, 0);
+			getCharacterCurrentParams(kCharacterAlexei)[4] = 1;
+			break;
+		case 4:
+		case 5:
+		case 6:
 			getCharacterCurrentParams(kCharacterAlexei)[4] = 0;
 			getCharacterCurrentParams(kCharacterAlexei)[5] = 1;
-			setDoor(2, 12, 1, 0, 0);
-			setDoor(18, 12, 1, 0, 0);
-			getCharacterCurrentParams(kCharacterAlexei)[8] = 0;
-		} else {
-			getCharacterCurrentParams(kCharacterAlexei)[8] = 0;
+			break;
+		case 7:
+			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 8;
+			AlexeiCall(&LogicManager::CONS_Alexei_DoWait, 0x12C, 0, 0, 0);
+			break;
+		case 8:
+			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 9;
+			AlexeiCall(&LogicManager::CONS_Alexei_DoCorrOtis, "602Gb", 2, 0, 0);
+			break;
+		case 9:
+			getCharacter(kCharacterAlexei).characterPosition.location = 0;
+			send(kCharacterAlexei, kCharacterCond1, 156567128, 0);
+			startCycOtis(kCharacterAlexei, "602Hb");
+			softBlockAtDoor(kCharacterAlexei, 2);
+			break;
+		case 10:
+			softReleaseAtDoor(kCharacterAlexei, 2);
+			getCharacter(kCharacterAlexei).characterPosition.location = 1;
+			getCharacter(kCharacterAlexei).characterPosition.position = 7500;
+			startCycOtis(kCharacterAlexei, (char *)&getCharacterCurrentParams(kCharacterAlexei)[1]);
+			setDoor(2, kCharacterAlexei, 1, 10, 9);
+			setDoor(18, kCharacterAlexei, 1, 10, 9);
+			getCharacterCurrentParams(kCharacterAlexei)[6] = 0;
+			break;
+		default:
+			break;
 		}
+
+		break;
+	case 124697504:
+		getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 10;
+		AlexeiCall(&LogicManager::CONS_Alexei_DoCorrOtis, "602Ib", 2, 0, 0);
+		break;
+	case 221617184:
+		getCharacterCurrentParams(kCharacterAlexei)[6] = 1;
+		send(kCharacterAlexei, kCharacterCond1, 100906246, 0);
+		getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 7;
+		AlexeiCall(&LogicManager::CONS_Alexei_DoDialog, "CON1024", 0, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -686,18 +760,24 @@ void LogicManager::CONS_Alexei_Birth(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Alexei_Birth(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			setDoor(2, 0, 1, 10, 9);
-			setDoor(10, 0, 0, 255, 255);
-			setDoor(18, 0, 1, 10, 9);
-			getCharacter(kCharacterAlexei).characterPosition.position = 3969;
-			getCharacter(kCharacterAlexei).characterPosition.location = 1;
-			getCharacter(kCharacterAlexei).characterPosition.car = 5;
-		}
-	} else if (_gameTime > 1062000 && !getCharacterCurrentParams(kCharacterAlexei)[0]) {
-		getCharacterCurrentParams(kCharacterAlexei)[0] = 1;
-		CONS_Alexei_AtDinner(0, 0, 0, 0);
+	switch (msg->action) {
+	case 0:
+		if (_gameTime > 1062000 && !getCharacterCurrentParams(kCharacterAlexei)[0]) {
+			getCharacterCurrentParams(kCharacterAlexei)[0] = 1;
+			CONS_Alexei_AtDinner(0, 0, 0, 0);
+		}
+
+		break;
+	case 12:
+		setDoor(2, kCharacterCath, 1, 10, 9);
+		setDoor(10, kCharacterCath, 0, 255, 255);
+		setDoor(18, kCharacterCath, 1, 10, 9);
+		getCharacter(kCharacterAlexei).characterPosition.position = 3969;
+		getCharacter(kCharacterAlexei).characterPosition.location = 1;
+		getCharacter(kCharacterAlexei).characterPosition.car = kCarRestaurant;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -712,54 +792,8 @@ void LogicManager::CONS_Alexei_AtDinner(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Alexei_AtDinner(HAND_PARAMS) {
-	if (msg->action > 12) {
-		if (msg->action > 168046720) {
-			if (msg->action == 168627977) {
-				getCharacter(kCharacterAlexei).inventoryItem = getCharacterCurrentParams(kCharacterAlexei)[1];
-			} else if (msg->action == 225182640) {
-				getCharacter(kCharacterAlexei).inventoryItem = 0;
-			}
-		} else {
-			switch (msg->action) {
-			case 168046720:
-				getCharacter(kCharacterAlexei).inventoryItem = 0;
-				break;
-			case 17:
-				getCharacterCurrentParams(kCharacterAlexei)[0] = checkCathDir(kCarRestaurant, 63);
-				break;
-			case 18:
-				if (getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] == 1) {
-					releaseView(kCharacterAlexei, kCarRestaurant, 63);
-					CONS_Alexei_ReturnComp(0, 0, 0, 0);
-				} else if (getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] == 2) {
-					if (_gameProgress[kProgressJacket] == 2)
-						playNIS(kEventAlexeiDiner);
-					else
-						playNIS(kEventAlexeiDinerOriginalJacket);
-					send(kCharacterAlexei, kCharacterTableB, 103798704, "005E");
-					getCharacter(kCharacterAlexei).characterPosition.position = 3650;
-					getCharacter(kCharacterAlexei).characterPosition.location = 0;
-					endGraphics(kCharacterAlexei);
-					_gameInventory[kItem17].location = 1;
-					bumpCath(kCarRestaurant, 63, 255);
-					CONS_Alexei_ReturnComp(0, 0, 0, 0);
-				}
-				break;
-			}
-		}
-	} else if (msg->action == 12) {
-		send(kCharacterAlexei, kCharacterTableB, 136455232, 0);
-		startCycOtis(kCharacterAlexei, "005B");
-		getCharacterCurrentParams(kCharacterAlexei)[1] = 128;
-		getCharacter(kCharacterAlexei).inventoryItem = 0x80;
-	} else if (msg->action) {
-		if (msg->action == 1) {
-			getCharacterCurrentParams(kCharacterAlexei)[1] = 0;
-			getCharacter(kCharacterAlexei).inventoryItem = 0;
-			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 2;
-			AlexeiCall(&LogicManager::CONS_Alexei_SaveGame, 2, kEventAlexeiDiner, 0, 0);
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		if (_gameTime > 1089000 && rcClear()) {
 			getCharacter(kCharacterAlexei).characterPosition.location = 0;
 			getCharacterCurrentParams(kCharacterAlexei)[1] = 0;
@@ -768,18 +802,68 @@ void LogicManager::HAND_Alexei_AtDinner(HAND_PARAMS) {
 			dropItem(kItem17, 1);
 			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 1;
 			AlexeiCall(&LogicManager::CONS_Alexei_DoJoinedSeqOtis, "005D", 34, 103798704, "005E");
-			return;
-		}
-		if (getCharacterCurrentParams(kCharacterAlexei)[0]) {
-			if (getCharacterCurrentParams(kCharacterAlexei)[2] || (getCharacterCurrentParams(kCharacterAlexei)[2] = _currentGameSessionTicks + 90, _currentGameSessionTicks != -90)) {
-				if (getCharacterCurrentParams(kCharacterAlexei)[2] >= _currentGameSessionTicks)
-					return;
-				getCharacterCurrentParams(kCharacterAlexei)[2] = 0x7FFFFFFF;
-			}
-			bumpCath(kCarRestaurant, 61, 255);
 		} else {
-			getCharacterCurrentParams(kCharacterAlexei)[2] = 0;
+			if (getCharacterCurrentParams(kCharacterAlexei)[0]) {
+				if (getCharacterCurrentParams(kCharacterAlexei)[2] || (getCharacterCurrentParams(kCharacterAlexei)[2] = _currentGameSessionTicks + 90, _currentGameSessionTicks != -90)) {
+					if (getCharacterCurrentParams(kCharacterAlexei)[2] >= _currentGameSessionTicks)
+						break;
+
+					getCharacterCurrentParams(kCharacterAlexei)[2] = 0x7FFFFFFF;
+				}
+
+				bumpCath(kCarRestaurant, 61, 255);
+			} else {
+				getCharacterCurrentParams(kCharacterAlexei)[2] = 0;
+			}
+		}
+
+		break;
+	case 1:
+		getCharacterCurrentParams(kCharacterAlexei)[1] = 0;
+		getCharacter(kCharacterAlexei).inventoryItem = 0;
+		getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 2;
+		AlexeiCall(&LogicManager::CONS_Alexei_SaveGame, 2, kEventAlexeiDiner, 0, 0);
+		break;
+	case 12:
+		send(kCharacterAlexei, kCharacterTableB, 136455232, 0);
+		startCycOtis(kCharacterAlexei, "005B");
+		getCharacterCurrentParams(kCharacterAlexei)[1] = 128;
+		getCharacter(kCharacterAlexei).inventoryItem = 0x80;
+		break;
+	case 17:
+		getCharacterCurrentParams(kCharacterAlexei)[0] = checkCathDir(kCarRestaurant, 63);
+		break;
+	case 18:
+		if (getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] == 1) {
+			releaseView(kCharacterAlexei, kCarRestaurant, 63);
+			CONS_Alexei_ReturnComp(0, 0, 0, 0);
+		} else if (getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] == 2) {
+			if (_gameProgress[kProgressJacket] == 2)
+				playNIS(kEventAlexeiDiner);
+			else
+				playNIS(kEventAlexeiDinerOriginalJacket);
+
+			send(kCharacterAlexei, kCharacterTableB, 103798704, "005E");
+			getCharacter(kCharacterAlexei).characterPosition.position = 3650;
+			getCharacter(kCharacterAlexei).characterPosition.location = 0;
+			endGraphics(kCharacterAlexei);
+			_gameInventory[kItem17].location = 1;
+			bumpCath(kCarRestaurant, 63, 255);
+			CONS_Alexei_ReturnComp(0, 0, 0, 0);
 		}
+
+		break;
+	case 168046720:
+		getCharacter(kCharacterAlexei).inventoryItem = 0;
+		break;
+	case 168627977:
+		getCharacter(kCharacterAlexei).inventoryItem = getCharacterCurrentParams(kCharacterAlexei)[1];
+		break;
+	case 225182640:
+		getCharacter(kCharacterAlexei).inventoryItem = 0;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -794,10 +878,12 @@ void LogicManager::CONS_Alexei_ReturnComp(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Alexei_ReturnComp(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 1;
 		AlexeiCall(&LogicManager::CONS_Alexei_DoSeqOtis, "811DS", 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8]) {
 		case 1:
 			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 2;
@@ -845,6 +931,7 @@ void LogicManager::HAND_Alexei_ReturnComp(HAND_PARAMS) {
 		case 10:
 			if (checkCathDir(kCarGreenSleeping, 61))
 				bumpCath(kCarGreenSleeping, 49, 255);
+
 			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 11;
 			AlexeiCall(&LogicManager::CONS_Alexei_CompLogic, 1098000, "411", 0, 0);
 			break;
@@ -852,8 +939,12 @@ void LogicManager::HAND_Alexei_ReturnComp(HAND_PARAMS) {
 			CONS_Alexei_GoSalon(0, 0, 0, 0);
 			break;
 		default:
-			return;
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -868,10 +959,12 @@ void LogicManager::CONS_Alexei_GoSalon(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Alexei_GoSalon(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 1;
 		AlexeiCall(&LogicManager::CONS_Alexei_ExitComp, 0, 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8]) {
 		case 1:
 			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 2;
@@ -892,8 +985,12 @@ void LogicManager::HAND_Alexei_GoSalon(HAND_PARAMS) {
 			CONS_Alexei_Sitting(0, 0, 0, 0);
 			break;
 		default:
-			return;
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -918,6 +1015,7 @@ void LogicManager::HAND_Alexei_Sitting(HAND_PARAMS) {
 				AlexeiCall(&LogicManager::CONS_Alexei_DoBlockSeqOtis, "103C", 5, 52, 0);
 			}
 		}
+
 		break;
 	case 1:
 		getCharacter(kCharacterAlexei).inventoryItem = 0;
@@ -927,8 +1025,10 @@ void LogicManager::HAND_Alexei_Sitting(HAND_PARAMS) {
 	case 12:
 		startCycOtis(kCharacterAlexei, "103B");
 		getCharacterCurrentParams(kCharacterAlexei)[0] = 225 * (4 * rnd(3) + 4);
+
 		if (!_gameEvents[kEventAlexeiSalonPoem])
 			getCharacter(kCharacterAlexei).inventoryItem = 10;
+
 		break;
 	case 18:
 		switch (getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8]) {
@@ -950,10 +1050,13 @@ void LogicManager::HAND_Alexei_Sitting(HAND_PARAMS) {
 			releaseView(kCharacterAlexei, kCarRestaurant, 52);
 			getCharacter(kCharacterAlexei).characterPosition.location = 1;
 			break;
+		default:
+			break;
 		}
+
 		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -970,40 +1073,48 @@ void LogicManager::CONS_Alexei_StandingAtWindow(CONS_PARAMS) {
 void LogicManager::HAND_Alexei_StandingAtWindow(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
-		if (!getCharacterCurrentParams(kCharacterAlexei)[1] &&
-				(getCharacterCurrentParams(kCharacterAlexei)[1] = _gameTime + getCharacterCurrentParams(kCharacterAlexei)[0], _gameTime + getCharacterCurrentParams(kCharacterAlexei)[0] == 0) ||
+		if (!getCharacterCurrentParams(kCharacterAlexei)[1] && (getCharacterCurrentParams(kCharacterAlexei)[1] = _gameTime + getCharacterCurrentParams(kCharacterAlexei)[0], _gameTime + getCharacterCurrentParams(kCharacterAlexei)[0] == 0) ||
 			getCharacterCurrentParams(kCharacterAlexei)[1] < _gameTime) {
 			if (rcClear()) {
 				getCharacter(kCharacterAlexei).characterPosition.location = 0;
 				getCharacter(kCharacterAlexei).inventoryItem = 0;
 				getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 1;
 				AlexeiCall(&LogicManager::CONS_Alexei_DoBlockSeqOtis, "103D", 5, 52, 0);
-				return;
+				break;
 			}
 		}
-		if (getCharacterCurrentParams(kCharacterAlexei)[2] == 0x7FFFFFFF || _gameTime <= 1111500)
-			return;
-		if (_gameTime > 1138500)
-			goto LABEL_16;
-		if ((inSalon(kCharacterCath) || inDiningRoom(kCharacterCath)) && getCharacterCurrentParams(kCharacterAlexei)[2] || (getCharacterCurrentParams(kCharacterAlexei)[2] = _gameTime, _gameTime)) {
-			if (getCharacterCurrentParams(kCharacterAlexei)[2] >= _gameTime)
-				return;
-		LABEL_16:
-			getCharacterCurrentParams(kCharacterAlexei)[2] = 0x7FFFFFFF;
+
+		if (getCharacterCurrentParams(kCharacterAlexei)[2] != 0x7FFFFFFF && _gameTime > 1111500) {
+			if (_gameTime > 1138500) {
+				getCharacterCurrentParams(kCharacterAlexei)[2] = 0x7FFFFFFF;
+				getCharacter(kCharacterAlexei).inventoryItem = 0;
+				CONS_Alexei_WaitingForTat(0, 0, 0, 0);
+				break;
+			}
+
+			if ((inSalon(kCharacterCath) || inDiningRoom(kCharacterCath)) && getCharacterCurrentParams(kCharacterAlexei)[2] || (getCharacterCurrentParams(kCharacterAlexei)[2] = _gameTime, _gameTime)) {
+				if (getCharacterCurrentParams(kCharacterAlexei)[2] >= _gameTime)
+					break;
+
+				getCharacterCurrentParams(kCharacterAlexei)[2] = 0x7FFFFFFF;
+			}
+
+			getCharacter(kCharacterAlexei).inventoryItem = 0;
+			CONS_Alexei_WaitingForTat(0, 0, 0, 0);
 		}
-		getCharacter(kCharacterAlexei).inventoryItem = 0;
-		CONS_Alexei_WaitingForTat(0, 0, 0, 0);
-		return;
+
+		break;
 	case 1:
 		getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 2;
 		AlexeiCall(&LogicManager::CONS_Alexei_SaveGame, 2, kEventAlexeiSalonPoem, 0, 0);
-		return;
+		break;
 	case 12:
 		getCharacterCurrentParams(kCharacterAlexei)[0] = 225 * (4 * rnd(4) + 8);
 		startCycOtis(kCharacterAlexei, "103E");
-		if (!_gameEvents[80])
+		if (!_gameEvents[kEventAlexeiSalonPoem])
 			getCharacter(kCharacterAlexei).inventoryItem = 10;
-		return;
+
+		break;
 	case 18:
 		switch (getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8]) {
 		case 1:
@@ -1025,10 +1136,13 @@ void LogicManager::HAND_Alexei_StandingAtWindow(HAND_PARAMS) {
 			getCharacter(kCharacterAlexei).characterPosition.location = 1;
 			CONS_Alexei_Sitting(0, 0, 0, 0);
 			break;
+		default:
+			break;
 		}
-		return;
+
+		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -1043,48 +1157,51 @@ void LogicManager::CONS_Alexei_WaitingForTat(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Alexei_WaitingForTat(HAND_PARAMS) {
-	if (msg->action <= 12) {
-		if (msg->action == 12) {
-			getCharacter(kCharacterAlexei).characterPosition.location = 1;
-			send(kCharacterAlexei, kCharacterTatiana, 124973510, 0);
-		} else if (msg->action) {
-			if (msg->action == 1) {
-				getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 2;
-				AlexeiCall(&LogicManager::CONS_Alexei_SaveGame, 2, kEventAlexeiSalonPoem, 0, 0);
-			}
-		} else if (!inDiningRoom(kCharacterTatiana) || _gameEvents[kEventAlexeiSalonPoem]) {
+	switch (msg->action) {
+	case 0:
+		if (!inDiningRoom(kCharacterTatiana) || _gameEvents[kEventAlexeiSalonPoem]) {
 			getCharacter(kCharacterAlexei).inventoryItem = 0;
 		} else {
 			getCharacter(kCharacterAlexei).inventoryItem = 10;
 		}
-		return;
-	}
-	if (msg->action != 18) {
-		if (msg->action == 157159392) {
-			if (inSalon(kCharacterCath)) {
-				getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 1;
-				AlexeiCall(&LogicManager::CONS_Alexei_SaveGame, 2, kEventAlexeiSalonVassili, 0, 0);
-				return;
+
+		break;
+	case 1:
+		getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 2;
+		AlexeiCall(&LogicManager::CONS_Alexei_SaveGame, 2, kEventAlexeiSalonPoem, 0, 0);
+		break;
+	case 12:
+		getCharacter(kCharacterAlexei).characterPosition.location = 1;
+		send(kCharacterAlexei, kCharacterTatiana, 124973510, 0);
+		break;
+	case 18:
+		if (getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] == 1) {
+			playNIS(kEventAlexeiSalonVassili);
+			getCharacter(kCharacterAlexei).characterPosition.location = 0;
+			startCycOtis(kCharacterAlexei, "103F");
+			cleanNIS();
+			CONS_Alexei_Upset(0, 0, 0, 0);
+		} else {
+			if (getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] == 2) {
+				playNIS(kEventAlexeiSalonPoem);
+				getCharacter(kCharacterAlexei).inventoryItem = 0;
+				bumpCath(kCarRestaurant, 55, 255);
 			}
-		} else if (msg->action != 188784532) {
-			return;
 		}
-	LABEL_24:
-		CONS_Alexei_Upset(0, 0, 0, 0);
-		return;
-	}
 
-	if (getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] == 1) {
-		playNIS(kEventAlexeiSalonVassili);
-		getCharacter(kCharacterAlexei).characterPosition.location = 0;
-		startCycOtis(kCharacterAlexei, "103F");
-		cleanNIS();
-		goto LABEL_24;
-	}
-	if (getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] == 2) {
-		playNIS(kEventAlexeiSalonPoem);
-		getCharacter(kCharacterAlexei).inventoryItem = 0;
-		bumpCath(kCarRestaurant, 55, 255);
+		break;
+	case 157159392:
+		if (inSalon(kCharacterCath)) {
+			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 1;
+			AlexeiCall(&LogicManager::CONS_Alexei_SaveGame, 2, kEventAlexeiSalonVassili, 0, 0);
+		}
+
+		break;
+	case 188784532:
+		CONS_Alexei_Upset(0, 0, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1099,30 +1216,37 @@ void LogicManager::CONS_Alexei_Upset(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Alexei_Upset(HAND_PARAMS) {
-	if (msg->action > 12) {
-		if (msg->action == 18) {
-			if (getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] == 1) {
-				playNIS(kEventAlexeiSalonCath);
-				getCharacter(kCharacterAlexei).characterPosition.car = 4;
-				getCharacter(kCharacterAlexei).characterPosition.position = 9460;
-				endGraphics(kCharacterAlexei);
-				bumpCath(kCarRestaurant, 55, 255);
-				CONS_Alexei_ReturnCompNight(0, 0, 0, 0);
-			} else if (getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] == 2) {
-				CONS_Alexei_ReturnCompNight(0, 0, 0, 0);
-			}
-		} else if (msg->action == 135854208) {
-			getCharacter(kCharacterAlexei).inventoryItem = 0;
-			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 2;
-			AlexeiCall(&LogicManager::CONS_Alexei_DoSeqOtis, "103G", 0, 0, 0);
-		}
-	} else if (msg->action == 12) {
+	switch (msg->action) {
+	case 1:
+		getCharacter(kCharacterAlexei).inventoryItem = 0;
+		getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 1;
+		AlexeiCall(&LogicManager::CONS_Alexei_SaveGame, 2, kEventAlexeiSalonCath, 0, 0);
+		break;
+	case 12:
 		if (_gameEvents[kEventAlexeiSalonVassili])
 			getCharacter(kCharacterAlexei).inventoryItem = 0x80;
-	} else if (msg->action == 1) {
+
+		break;
+	case 18:
+		if (getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] == 1) {
+			playNIS(kEventAlexeiSalonCath);
+			getCharacter(kCharacterAlexei).characterPosition.car = kCarRedSleeping;
+			getCharacter(kCharacterAlexei).characterPosition.position = 9460;
+			endGraphics(kCharacterAlexei);
+			bumpCath(kCarRestaurant, 55, 255);
+			CONS_Alexei_ReturnCompNight(0, 0, 0, 0);
+		} else if (getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] == 2) {
+			CONS_Alexei_ReturnCompNight(0, 0, 0, 0);
+		}
+
+		break;
+	case 135854208:
 		getCharacter(kCharacterAlexei).inventoryItem = 0;
-		getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 1;
-		AlexeiCall(&LogicManager::CONS_Alexei_SaveGame, 2, 79, 0, 0);
+		getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 2;
+		AlexeiCall(&LogicManager::CONS_Alexei_DoSeqOtis, "103G", 0, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1137,14 +1261,17 @@ void LogicManager::CONS_Alexei_ReturnCompNight(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Alexei_ReturnCompNight(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 1;
 		AlexeiCall(&LogicManager::CONS_Alexei_EnterComp, 0, 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8]) {
 		case 1:
 			if (checkCathDir(kCarGreenSleeping, 61))
 				bumpCath(kCarGreenSleeping, 49, 255);
+
 			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 2;
 			AlexeiCall(&LogicManager::CONS_Alexei_CompLogic, 1179000, "411", 0, 0);
 			break;
@@ -1155,7 +1282,13 @@ void LogicManager::HAND_Alexei_ReturnCompNight(HAND_PARAMS) {
 		case 3:
 			CONS_Alexei_Asleep(0, 0, 0, 0);
 			break;
+		default:
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1170,23 +1303,29 @@ void LogicManager::CONS_Alexei_Asleep(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Alexei_Asleep(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			getCharacter(kCharacterAlexei).characterPosition.car = 3;
-			getCharacter(kCharacterAlexei).characterPosition.position = 7500;
-			getCharacter(kCharacterAlexei).characterPosition.location = 1;
-			setDoor(2, 0, 1, 10, 9);
-			setDoor(18, 0, 1, 10, 9);
-			setDoor(10, 0, 1, 255, 255);
+	switch (msg->action) {
+	case 0:
+		if (_gameTime > 1512000 && !getCharacterCurrentParams(kCharacterAlexei)[0]) {
+			getCharacterCurrentParams(kCharacterAlexei)[0] = 1;
+			CONS_Alexei_WakeUp(0, 0, 0, 0);
+		}
 
-			if (checkCathDir(kCarGreenSleeping, 61))
-				bumpCath(kCarGreenSleeping, 66, 255);
+		break;
+	case 12:
+		getCharacter(kCharacterAlexei).characterPosition.car = kCarGreenSleeping;
+		getCharacter(kCharacterAlexei).characterPosition.position = 7500;
+		getCharacter(kCharacterAlexei).characterPosition.location = 1;
+		setDoor(2, kCharacterCath, 1, 10, 9);
+		setDoor(18, kCharacterCath, 1, 10, 9);
+		setDoor(10, kCharacterCath, 1, 255, 255);
 
-			endGraphics(kCharacterAlexei);
-		}
-	} else if (_gameTime > 1512000 && !getCharacterCurrentParams(kCharacterAlexei)[0]) {
-		getCharacterCurrentParams(kCharacterAlexei)[0] = 1;
-		CONS_Alexei_WakeUp(0, 0, 0, 0);
+		if (checkCathDir(kCarGreenSleeping, 61))
+			bumpCath(kCarGreenSleeping, 66, 255);
+
+		endGraphics(kCharacterAlexei);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1201,11 +1340,17 @@ void LogicManager::CONS_Alexei_WakeUp(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Alexei_WakeUp(HAND_PARAMS) {
-	if (msg->action == 12) {
-		setDoor(10, 0, 0, 255, 255);
+	switch (msg->action) {
+	case 12:
+		setDoor(10, kCharacterCath, 0, 255, 255);
+
 		if (checkCathDir(kCarGreenSleeping, 66))
 			bumpCath(kCarGreenSleeping, 49, 255);
+
 		startCycOtis(kCharacterAlexei, "412");
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1220,20 +1365,23 @@ void LogicManager::CONS_Alexei_StartPart2(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Alexei_StartPart2(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			endGraphics(kCharacterAlexei);
-			getCharacter(kCharacterAlexei).characterPosition.car = 3;
-			getCharacter(kCharacterAlexei).characterPosition.position = 7500;
-			getCharacter(kCharacterAlexei).characterPosition.location = 1;
-			getCharacter(kCharacterAlexei).inventoryItem = 0;
-			getCharacter(kCharacterAlexei).clothes = 0;
-			setDoor(2, 12, 1, 10, 9);
-			setDoor(18, 12, 1, 10, 9);
-			setDoor(10, 0, 0, 255, 255);
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		CONS_Alexei_InComp2(0, 0, 0, 0);
+		break;
+	case 12:
+		endGraphics(kCharacterAlexei);
+		getCharacter(kCharacterAlexei).characterPosition.car = kCarGreenSleeping;
+		getCharacter(kCharacterAlexei).characterPosition.position = 7500;
+		getCharacter(kCharacterAlexei).characterPosition.location = 1;
+		getCharacter(kCharacterAlexei).inventoryItem = 0;
+		getCharacter(kCharacterAlexei).clothes = 0;
+		setDoor(2, kCharacterAlexei, 1, 10, 9);
+		setDoor(18, kCharacterAlexei, 1, 10, 9);
+		setDoor(10, kCharacterCath, 0, 255, 255);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1248,11 +1396,13 @@ void LogicManager::CONS_Alexei_InComp2(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Alexei_InComp2(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 1;
 		AlexeiCall(&LogicManager::CONS_Alexei_CompLogic, 1791000, "411", 0, 0);
-	} else if (msg->action == 18) {
-		switch (getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8]) {
+		break;
+	case 18:
+		switch (getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8]) {
 		case 1:
 			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 2;
 			AlexeiCall(&LogicManager::CONS_Alexei_ExitComp, 0, 0, 0, 0);
@@ -1282,8 +1432,12 @@ void LogicManager::HAND_Alexei_InComp2(HAND_PARAMS) {
 			CONS_Alexei_AtBreakfast(0, 0, 0, 0);
 			break;
 		default:
-			return;
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1300,7 +1454,7 @@ void LogicManager::CONS_Alexei_AtBreakfast(CONS_PARAMS) {
 void LogicManager::HAND_Alexei_AtBreakfast(HAND_PARAMS) {
 	switch (msg->action) {
 	case 12:
-		setDoor(2, 0, 1, 10, 9);
+		setDoor(2, kCharacterCath, 1, 10, 9);
 		getCharacter(kCharacterAlexei).characterPosition.car = 5;
 		getCharacter(kCharacterAlexei).characterPosition.location = 1;
 		startCycOtis(kCharacterAlexei, "018C");
@@ -1312,8 +1466,10 @@ void LogicManager::HAND_Alexei_AtBreakfast(HAND_PARAMS) {
 			releaseView(kCharacterAlexei, kCarRestaurant, 63);
 			send(kCharacterAlexei, kCharacterTatiana, 156444784, 0);
 			startCycOtis(kCharacterAlexei, "018E");
+
 			if (inDiningRoom(kCharacterCath))
 				_gameProgress[kProgressField68] = 1;
+
 			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 2;
 			AlexeiCall(&LogicManager::CONS_Alexei_DoDialog, "TAT2116", 0, 0, 0);
 			break;
@@ -1327,7 +1483,10 @@ void LogicManager::HAND_Alexei_AtBreakfast(HAND_PARAMS) {
 			releaseView(kCharacterAlexei, kCarRestaurant, 63);
 			CONS_Alexei_ReturnCompPart2(0, 0, 0, 0);
 			break;
+		default:
+			break;
 		}
+
 		break;
 	case 236053296:
 		startSeqOtis(kCharacterAlexei, "018D1");
@@ -1340,6 +1499,8 @@ void LogicManager::HAND_Alexei_AtBreakfast(HAND_PARAMS) {
 		getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 1;
 		AlexeiCall(&LogicManager::CONS_Alexei_FinishSeqOtis, 0, 0, 0, 0);
 		break;
+	default:
+		break;
 	}
 }
 
@@ -1354,22 +1515,31 @@ void LogicManager::CONS_Alexei_ReturnCompPart2(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Alexei_ReturnCompPart2(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		startSeqOtis(kCharacterAlexei, "811DS");
+
 		if (inDiningRoom(kCharacterCath))
 			advanceFrame(kCharacterAlexei);
+
 		getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 1;
 		AlexeiCall(&LogicManager::CONS_Alexei_FinishSeqOtis, 0, 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		if (getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] == 1) {
 			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 2;
 			AlexeiCall(&LogicManager::CONS_Alexei_EnterComp, 0, 0, 0, 0);
 		} else if (getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] == 2) {
 			if (checkCathDir(kCarGreenSleeping, 61))
 				bumpCath(kCarGreenSleeping, 49, 255);
+
 			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 3;
 			AlexeiCall(&LogicManager::CONS_Alexei_CompLogic, 15803100, "411", 0, 0);
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1384,19 +1554,22 @@ void LogicManager::CONS_Alexei_StartPart3(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Alexei_StartPart3(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			endGraphics(kCharacterAlexei);
-			getCharacter(kCharacterAlexei).characterPosition.car = 5;
-			getCharacter(kCharacterAlexei).characterPosition.location = 1;
-			getCharacter(kCharacterAlexei).inventoryItem = 0;
-			getCharacter(kCharacterAlexei).clothes = 0;
-			setDoor(2, 0, 1, 10, 9);
-			setDoor(18, 0, 1, 10, 9);
-			setDoor(10, 0, 0, 255, 255);
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		CONS_Alexei_PlayingChess(0, 0, 0, 0);
+		break;
+	case 12:
+		endGraphics(kCharacterAlexei);
+		getCharacter(kCharacterAlexei).characterPosition.car = kCarRestaurant;
+		getCharacter(kCharacterAlexei).characterPosition.location = 1;
+		getCharacter(kCharacterAlexei).inventoryItem = 0;
+		getCharacter(kCharacterAlexei).clothes = 0;
+		setDoor(2, kCharacterCath, 1, 10, 9);
+		setDoor(18, kCharacterCath, 1, 10, 9);
+		setDoor(10, kCharacterCath, 0, 255, 255);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1415,9 +1588,10 @@ void LogicManager::HAND_Alexei_PlayingChess(HAND_PARAMS) {
 	case 18:
 		if (getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] == 1)
 			CONS_Alexei_InPart3(0, 0, 0, 0);
+
 		break;
 	case 122288808:
-		getCharacter(kCharacterAlexei).characterPosition.car = 4;
+		getCharacter(kCharacterAlexei).characterPosition.car = kCarRedSleeping;
 		getCharacter(kCharacterAlexei).characterPosition.location = 0;
 		getCharacter(kCharacterAlexei).characterPosition.position = 9270;
 		getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 1;
@@ -1426,6 +1600,8 @@ void LogicManager::HAND_Alexei_PlayingChess(HAND_PARAMS) {
 	case 122358304:
 		startCycOtis(kCharacterAlexei, "BLANK");
 		break;
+	default:
+		break;
 	}
 }
 
@@ -1440,12 +1616,15 @@ void LogicManager::CONS_Alexei_InPart3(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Alexei_InPart3(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		if (checkCathDir(kCarGreenSleeping, 61))
 			bumpCath(kCarGreenSleeping, 49, 255);
+
 		getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 1;
 		AlexeiCall(&LogicManager::CONS_Alexei_CompLogic, 2083500, "411", 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8]) {
 		case 1:
 			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 2;
@@ -1474,9 +1653,11 @@ void LogicManager::HAND_Alexei_InPart3(HAND_PARAMS) {
 			AlexeiCall(&LogicManager::CONS_Alexei_EnterComp, 0, 0, 0, 0);
 			break;
 		case 7:
-			setDoor(10, 0, 1, 255, 255);
+			setDoor(10, kCharacterCath, 1, 255, 255);
+
 			if (checkCathDir(kCarGreenSleeping, 61))
 				bumpCath(kCarGreenSleeping, 66, 255);
+
 			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 8;
 			AlexeiCall(&LogicManager::CONS_Alexei_CompLogic, 2124000, "NONE", 0, 0);
 			break;
@@ -1488,16 +1669,22 @@ void LogicManager::HAND_Alexei_InPart3(HAND_PARAMS) {
 			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 10;
 			AlexeiCall(&LogicManager::CONS_Alexei_GoSalon3, 0, 0, 0, 0);
 			break;
-		case 0xA:
-			setDoor(10, 0, 0, 255, 255);
+		case 10:
+			setDoor(10, kCharacterCath, 0, 255, 255);
+
 			if (checkCathDir(kCarGreenSleeping, 66))
 				bumpCath(kCarGreenSleeping, 49, 255);
+
 			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 11;
 			AlexeiCall(&LogicManager::CONS_Alexei_CompLogic, 16451100, "411", 0, 0);
 			break;
 		default:
-			return;
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1512,43 +1699,13 @@ void LogicManager::CONS_Alexei_Pacing3(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Alexei_Pacing3(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			getCharacterCurrentParams(kCharacterAlexei)[0] = 15 * rnd(120);
-			startCycOtis(kCharacterAlexei, "103B");
-			getCharacter(kCharacterAlexei).characterPosition.location = 1;
-		} else if (msg->action == 18) {
-			switch (getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8]) {
-			case 1:
-				getCharacter(kCharacterAlexei).characterPosition.location = 0;
-				getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 2;
-				AlexeiCall(&LogicManager::CONS_Alexei_DoBlockSeqOtis, "124C", 5, 52, 0);
-				break;
-			case 2:
-			case 5:
-				getCharacter(kCharacterAlexei).currentCall--;
-				_engine->getMessageManager()->setMessageHandle(kCharacterAlexei, _functionsAlexei[getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall]]);
-				fedEx(kCharacterAlexei, kCharacterAlexei, 18, 0);
-				break;
-			case 3:
-				getCharacterCurrentParams(kCharacterAlexei)[0] = 15 * rnd(120);
-				getCharacterCurrentParams(kCharacterAlexei)[2] = 0;
-				goto LABEL_20;
-			case 4:
-				getCharacter(kCharacterAlexei).characterPosition.location = 0;
-				getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 5;
-				AlexeiCall(&LogicManager::CONS_Alexei_DoBlockSeqOtis, "124C", 5, 52, 0);
-				break;
-			default:
-				return;
-			}
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		if (inSalon(kCharacterCath)) {
 			if (!getCharacterCurrentParams(kCharacterAlexei)[1] && (getCharacterCurrentParams(kCharacterAlexei)[1] = _gameTime + 2700, _gameTime == -2700) || getCharacterCurrentParams(kCharacterAlexei)[1] < _gameTime) {
 				getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 1;
 				AlexeiCall(&LogicManager::CONS_Alexei_WaitRCClear, 0, 0, 0, 0);
-				return;
+				break;
 			}
 		} else {
 			getCharacterCurrentParams(kCharacterAlexei)[1] = 0;
@@ -1557,17 +1714,64 @@ void LogicManager::HAND_Alexei_Pacing3(HAND_PARAMS) {
 			if (rcClear()) {
 				getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 3;
 				AlexeiCall(&LogicManager::CONS_Alexei_PacingAtWindow, 0, 0, 0, 0);
-				return;
+				break;
 			}
 		}
-	LABEL_20:
+
 		if (getCharacterCurrentParams(kCharacterAlexei)[3] || (getCharacterCurrentParams(kCharacterAlexei)[3] = _gameTime + 9000, _gameTime != -9000)) {
 			if (getCharacterCurrentParams(kCharacterAlexei)[3] >= _gameTime)
-				return;
+				break;
+
 			getCharacterCurrentParams(kCharacterAlexei)[3] = 0x7FFFFFFF;
 		}
+
 		getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 4;
 		AlexeiCall(&LogicManager::CONS_Alexei_WaitRCClear, 0, 0, 0, 0);
+		break;
+	case 12:
+		getCharacterCurrentParams(kCharacterAlexei)[0] = 15 * rnd(120);
+		startCycOtis(kCharacterAlexei, "103B");
+		getCharacter(kCharacterAlexei).characterPosition.location = 1;
+		break;
+	case 18:
+		switch (getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8]) {
+		case 1:
+			getCharacter(kCharacterAlexei).characterPosition.location = 0;
+			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 2;
+			AlexeiCall(&LogicManager::CONS_Alexei_DoBlockSeqOtis, "124C", 5, 52, 0);
+			break;
+		case 2:
+		case 5:
+			getCharacter(kCharacterAlexei).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterAlexei, _functionsAlexei[getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall]]);
+			fedEx(kCharacterAlexei, kCharacterAlexei, 18, 0);
+			break;
+		case 3:
+			getCharacterCurrentParams(kCharacterAlexei)[0] = 15 * rnd(120);
+			getCharacterCurrentParams(kCharacterAlexei)[2] = 0;
+
+			if (getCharacterCurrentParams(kCharacterAlexei)[3] || (getCharacterCurrentParams(kCharacterAlexei)[3] = _gameTime + 9000, _gameTime != -9000)) {
+				if (getCharacterCurrentParams(kCharacterAlexei)[3] >= _gameTime)
+					break;
+
+				getCharacterCurrentParams(kCharacterAlexei)[3] = 0x7FFFFFFF;
+			}
+
+			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 4;
+			AlexeiCall(&LogicManager::CONS_Alexei_WaitRCClear, 0, 0, 0, 0);
+			break;
+		case 4:
+			getCharacter(kCharacterAlexei).characterPosition.location = 0;
+			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 5;
+			AlexeiCall(&LogicManager::CONS_Alexei_DoBlockSeqOtis, "124C", 5, 52, 0);
+			break;
+		default:
+			break;
+		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1582,61 +1786,73 @@ void LogicManager::CONS_Alexei_GoSalon3(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Alexei_GoSalon3(HAND_PARAMS) {
-	if (msg->action > 3) {
-		if (msg->action > 18) {
-			if (msg->action == 122288808) {
-				getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 4;
-				AlexeiCall(&LogicManager::CONS_Alexei_EnterComp, 0, 0, 0, 0);
-			} else if (msg->action == 122358304) {
-				startCycOtis(kCharacterAlexei, "BLANK");
-				getCharacterCurrentParams(kCharacterAlexei)[2] = 1;
-			}
-		} else if (msg->action == 18) {
-			switch (getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8]) {
-			case 1:
-				getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 2;
-				AlexeiCall(&LogicManager::CONS_Alexei_WaitRCClear, 0, 0, 0, 0);
-				break;
-			case 2:
-				send(kCharacterAlexei, kCharacterAbbot, 222609266, 0);
-				getCharacter(kCharacterAlexei).characterPosition.position = 1540;
-				getCharacter(kCharacterAlexei).characterPosition.location = 0;
-				getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 3;
-				AlexeiCall(&LogicManager::CONS_Alexei_DoBlockSeqOtis, "103A", 5, 52, 0);
-				break;
-			case 3:
-				getCharacter(kCharacterAlexei).characterPosition.location = 1;
-				startCycOtis(kCharacterAlexei, "124A");
-				break;
-			case 4:
-				getCharacter(kCharacterAlexei).currentCall--;
-				_engine->getMessageManager()->setMessageHandle(kCharacterAlexei, _functionsAlexei[getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall]]);
-				fedEx(kCharacterAlexei, kCharacterAlexei, 18, 0);
-				break;
-			default:
-				return;
+	switch (msg->action) {
+	case 0:
+		if (!getCharacterCurrentParams(kCharacterAlexei)[2] && !getCharacterCurrentParams(kCharacterAlexei)[1]) {
+			if (getCharacterCurrentParams(kCharacterAlexei)[3] || (getCharacterCurrentParams(kCharacterAlexei)[3] = _currentGameSessionTicks + getCharacterCurrentParams(kCharacterAlexei)[0],
+																   _currentGameSessionTicks + getCharacterCurrentParams(kCharacterAlexei)[0] != 0)) {
+				if (getCharacterCurrentParams(kCharacterAlexei)[3] >= _currentGameSessionTicks)
+					break;
+
+				getCharacterCurrentParams(kCharacterAlexei)[3] = 0x7FFFFFFF;
 			}
-		} else if (msg->action == 12) {
-			getCharacterCurrentParams(kCharacterAlexei)[0] = 5 * (3 * rnd(15) + 15);
-			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 1;
-			AlexeiCall(&LogicManager::CONS_Alexei_DoWalk, 5, 850, 0, 0);
+
+			startSeqOtis(kCharacterAlexei, "124B");
+			getCharacterCurrentParams(kCharacterAlexei)[1] = 1;
+			getCharacterCurrentParams(kCharacterAlexei)[3] = 0;
 		}
-	} else if (msg->action == 3) {
+
+		break;
+	case 3:
 		if (getCharacterCurrentParams(kCharacterAlexei)[1]) {
 			startCycOtis(kCharacterAlexei, "124A");
 			getCharacterCurrentParams(kCharacterAlexei)[0] = 5 * (3 * rnd(15) + 15);
 			getCharacterCurrentParams(kCharacterAlexei)[1] = 0;
 		}
-	} else if (msg->action == 0 && !getCharacterCurrentParams(kCharacterAlexei)[2] && !getCharacterCurrentParams(kCharacterAlexei)[1]) {
-		if (getCharacterCurrentParams(kCharacterAlexei)[3] || (getCharacterCurrentParams(kCharacterAlexei)[3] = _currentGameSessionTicks + getCharacterCurrentParams(kCharacterAlexei)[0],
-															   _currentGameSessionTicks + getCharacterCurrentParams(kCharacterAlexei)[0] != 0)) {
-			if (getCharacterCurrentParams(kCharacterAlexei)[3] >= _currentGameSessionTicks)
-				return;
-			getCharacterCurrentParams(kCharacterAlexei)[3] = 0x7FFFFFFF;
+
+		break;
+	case 12:
+		getCharacterCurrentParams(kCharacterAlexei)[0] = 5 * (3 * rnd(15) + 15);
+		getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 1;
+		AlexeiCall(&LogicManager::CONS_Alexei_DoWalk, 5, 850, 0, 0);
+		break;
+	case 18:
+		switch (getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8]) {
+		case 1:
+			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 2;
+			AlexeiCall(&LogicManager::CONS_Alexei_WaitRCClear, 0, 0, 0, 0);
+			break;
+		case 2:
+			send(kCharacterAlexei, kCharacterAbbot, 222609266, 0);
+			getCharacter(kCharacterAlexei).characterPosition.position = 1540;
+			getCharacter(kCharacterAlexei).characterPosition.location = 0;
+			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 3;
+			AlexeiCall(&LogicManager::CONS_Alexei_DoBlockSeqOtis, "103A", 5, 52, 0);
+			break;
+		case 3:
+			getCharacter(kCharacterAlexei).characterPosition.location = 1;
+			startCycOtis(kCharacterAlexei, "124A");
+			break;
+		case 4:
+			getCharacter(kCharacterAlexei).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterAlexei, _functionsAlexei[getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall]]);
+			fedEx(kCharacterAlexei, kCharacterAlexei, 18, 0);
+			break;
+		default:
+			break;
 		}
-		startSeqOtis(kCharacterAlexei, "124B");
-		getCharacterCurrentParams(kCharacterAlexei)[1] = 1;
-		getCharacterCurrentParams(kCharacterAlexei)[3] = 0;
+
+		break;
+	case 122288808:
+		getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 4;
+		AlexeiCall(&LogicManager::CONS_Alexei_EnterComp, 0, 0, 0, 0);
+		break;
+	case 122358304:
+		startCycOtis(kCharacterAlexei, "BLANK");
+		getCharacterCurrentParams(kCharacterAlexei)[2] = 1;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1651,19 +1867,22 @@ void LogicManager::CONS_Alexei_StartPart4(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Alexei_StartPart4(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			endGraphics(kCharacterAlexei);
-			getCharacter(kCharacterAlexei).characterPosition.position = 7500;
-			getCharacter(kCharacterAlexei).characterPosition.location = 1;
-			getCharacter(kCharacterAlexei).characterPosition.car = 3;
-			getCharacter(kCharacterAlexei).inventoryItem = 0;
-			setDoor(2, 0, 1, 10, 9);
-			setDoor(18, 0, 1, 10, 9);
-			setDoor(10, 0, 0, 255, 255);
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		CONS_Alexei_InComp4(0, 0, 0, 0);
+		break;
+	case 12:
+		endGraphics(kCharacterAlexei);
+		getCharacter(kCharacterAlexei).characterPosition.position = 7500;
+		getCharacter(kCharacterAlexei).characterPosition.location = 1;
+		getCharacter(kCharacterAlexei).characterPosition.car = kCarGreenSleeping;
+		getCharacter(kCharacterAlexei).inventoryItem = 0;
+		setDoor(2, kCharacterCath, 1, 10, 9);
+		setDoor(18, kCharacterCath, 1, 10, 9);
+		setDoor(10, kCharacterCath, 0, 255, 255);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1678,11 +1897,19 @@ void LogicManager::CONS_Alexei_InComp4(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Alexei_InComp4(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 1;
 		AlexeiCall(&LogicManager::CONS_Alexei_CompLogic, 2354400, "411", 0, 0);
-	} else if (msg->action == 18 && getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] == 1) {
-		CONS_Alexei_MeetTat(0, 0, 0, 0);
+		break;
+	case 18:
+		if (getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] == 1) {
+			CONS_Alexei_MeetTat(0, 0, 0, 0);
+		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1697,82 +1924,99 @@ void LogicManager::CONS_Alexei_MeetTat(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Alexei_MeetTat(HAND_PARAMS) {
-	if (msg->action > 3) {
-		if (msg->action > 17) {
-			switch (msg->action) {
-			case 18:
-				if (getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] == 1) {
-					setDoor(2, 0, 0, 10, 9);
-					getCharacter(kCharacterAlexei).characterPosition.location = 0;
-					getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 2;
-					AlexeiCall(&LogicManager::CONS_Alexei_DoWalk, 3, 540, 0, 0);
-				} else if (getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] == 2) {
-					endGraphics(kCharacterAlexei);
-					if (onLowPlatform(kCharacterCath)) {
-						playChrExcuseMe(kCharacterAlexei, kCharacterCath, 0);
-						if (checkCathDir(kCarGreenSleeping, 62))
-							bumpCath(kCarGreenSleeping, 72, 255);
+	switch (msg->action) {
+	case 0:
+		if (getCharacterCurrentParams(kCharacterAlexei)[1]) {
+			if (!getCharacterCurrentParams(kCharacterAlexei)[3]) {
+				getCharacterCurrentParams(kCharacterAlexei)[2] = _gameTime + 4500;
+				getCharacterCurrentParams(kCharacterAlexei)[3] = _gameTime + 9000;
+			}
+			if (getCharacterCurrentParams(kCharacterAlexei)[4] != 0x7FFFFFFF && getCharacterCurrentParams(kCharacterAlexei)[2] < _gameTime) {
+				if (getCharacterCurrentParams(kCharacterAlexei)[3] >= _gameTime) {
+					if (onLowPlatform(kCharacterCath) || !getCharacterCurrentParams(kCharacterAlexei)[4]) {
+						getCharacterCurrentParams(kCharacterAlexei)[4] = _gameTime;
+						if (!_gameTime) {
+							releaseView(kCharacterAlexei, kCarGreenSleeping, 70);
+							releaseView(kCharacterAlexei, kCarGreenSleeping, 71);
+							if (onLowPlatform(kCharacterCath)) {
+								playChrExcuseMe(kCharacterAlexei, kCharacterCath, 0);
+								if (checkCathDir(kCarGreenSleeping, 62))
+									bumpCath(kCarGreenSleeping, 72, 255);
+							}
+
+							CONS_Alexei_LeavePlat(0, 0, 0, 0);
+						}
 					}
-					blockView(kCharacterAlexei, kCarGreenSleeping, 70);
-					blockView(kCharacterAlexei, kCarGreenSleeping, 71);
+
+					if (getCharacterCurrentParams(kCharacterAlexei)[4] >= _gameTime)
+						break;
 				}
-				break;
-			case 123536024:
-				getCharacterCurrentParams(kCharacterAlexei)[1] = 1;
-				break;
-			case 123712592:
-				endGraphics(kCharacterAlexei);
-				getCharacterCurrentParams(kCharacterAlexei)[0] = 1;
-				break;
-			}
-		} else {
-			if (msg->action == 17) {
-				if (!checkCathDir(kCarGreenSleeping, 62))
-					return;
-				if (getCharacterCurrentParams(kCharacterAlexei)[0]) {
-					if (!getCharacterCurrentParams(kCharacterAlexei)[1])
-						return;
-				} else if (!getCharacterCurrentParams(kCharacterAlexei)[1]) {
-					startSeqOtis(kCharacterAlexei, "306A");
-					return;
+
+				getCharacterCurrentParams(kCharacterAlexei)[4] = 0x7FFFFFFF;
+				releaseView(kCharacterAlexei, kCarGreenSleeping, 70);
+				releaseView(kCharacterAlexei, kCarGreenSleeping, 71);
+				if (onLowPlatform(kCharacterCath)) {
+					playChrExcuseMe(kCharacterAlexei, kCharacterCath, 0);
+					if (checkCathDir(kCarGreenSleeping, 62))
+						bumpCath(kCarGreenSleeping, 72, 255);
 				}
-				goto LABEL_37;
-			}
-			if (msg->action == 12) {
-				getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 1;
-				AlexeiCall(&LogicManager::CONS_Alexei_DoCorrOtis, "602FB", 2, 0, 0);
+
+				CONS_Alexei_LeavePlat(0, 0, 0, 0);
 			}
 		}
-	} else if (msg->action == 3) {
+
+		break;
+	case 3:
 		if (!getCharacterCurrentParams(kCharacterAlexei)[0] && !getCharacterCurrentParams(kCharacterAlexei)[1])
 			startCycOtis(kCharacterAlexei, "306F");
-	} else if (msg->action == 0 && getCharacterCurrentParams(kCharacterAlexei)[1]) {
-		if (!getCharacterCurrentParams(kCharacterAlexei)[3]) {
-			getCharacterCurrentParams(kCharacterAlexei)[2] = _gameTime + 4500;
-			getCharacterCurrentParams(kCharacterAlexei)[3] = _gameTime + 9000;
-		}
-		if (getCharacterCurrentParams(kCharacterAlexei)[4] != 0x7FFFFFFF && getCharacterCurrentParams(kCharacterAlexei)[2] < _gameTime) {
-			if (getCharacterCurrentParams(kCharacterAlexei)[3] >= _gameTime) {
-				if (onLowPlatform(kCharacterCath) || !getCharacterCurrentParams(kCharacterAlexei)[4]) {
-					getCharacterCurrentParams(kCharacterAlexei)[4] = _gameTime;
-					if (!_gameTime)
-						goto LABEL_24;
-				}
-				if (getCharacterCurrentParams(kCharacterAlexei)[4] >= _gameTime)
-					return;
+
+		break;
+	case 12:
+		getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 1;
+		AlexeiCall(&LogicManager::CONS_Alexei_DoCorrOtis, "602FB", 2, 0, 0);
+		break;
+	case 17:
+		if (checkCathDir(kCarGreenSleeping, 62)) {
+			if (getCharacterCurrentParams(kCharacterAlexei)[0]) {
+				if (!getCharacterCurrentParams(kCharacterAlexei)[1])
+					break;
+			} else if (!getCharacterCurrentParams(kCharacterAlexei)[1]) {
+				startSeqOtis(kCharacterAlexei, "306A");
+				break;
 			}
-			getCharacterCurrentParams(kCharacterAlexei)[4] = 0x7FFFFFFF;
-		LABEL_24:
-			releaseView(kCharacterAlexei, kCarGreenSleeping, 70);
-			releaseView(kCharacterAlexei, kCarGreenSleeping, 71);
+
+			CONS_Alexei_LeavePlat(0, 0, 0, 0);
+		}
+
+		break;
+	case 18:
+		if (getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] == 1) {
+			setDoor(2, kCharacterCath, 0, 10, 9);
+			getCharacter(kCharacterAlexei).characterPosition.location = 0;
+			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 2;
+			AlexeiCall(&LogicManager::CONS_Alexei_DoWalk, 3, 540, 0, 0);
+		} else if (getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] == 2) {
+			endGraphics(kCharacterAlexei);
 			if (onLowPlatform(kCharacterCath)) {
 				playChrExcuseMe(kCharacterAlexei, kCharacterCath, 0);
+
 				if (checkCathDir(kCarGreenSleeping, 62))
 					bumpCath(kCarGreenSleeping, 72, 255);
 			}
-		LABEL_37:
-			CONS_Alexei_LeavePlat(0, 0, 0, 0);
+
+			blockView(kCharacterAlexei, kCarGreenSleeping, 70);
+			blockView(kCharacterAlexei, kCarGreenSleeping, 71);
 		}
+		break;
+	case 123536024:
+		getCharacterCurrentParams(kCharacterAlexei)[1] = 1;
+		break;
+	case 123712592:
+		endGraphics(kCharacterAlexei);
+		getCharacterCurrentParams(kCharacterAlexei)[0] = 1;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1787,16 +2031,23 @@ void LogicManager::CONS_Alexei_LeavePlat(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Alexei_LeavePlat(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 1;
 		AlexeiCall(&LogicManager::CONS_Alexei_DoWalk, 3, 7500, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		if (getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] == 1) {
 			startSeqOtis(kCharacterAlexei, "602Eb");
 			blockAtDoor(kCharacterAlexei, 2);
 			getCharacter(kCharacterAlexei).characterPosition.location = 1;
 			if (inComp(kCharacterCath, kCarGreenSleeping, 7500)) {
-				playNIS((kEventCathTurningNight - !isNight()));
+				if (isNight()) {
+					playNIS(kEventCathTurningNight);
+				} else {
+					playNIS(kEventCathTurningDay);
+				}
+
 				playDialog(0, "BUMP", -1, 0);
 				bumpCathRDoor(2);
 			}
@@ -1809,6 +2060,10 @@ void LogicManager::HAND_Alexei_LeavePlat(HAND_PARAMS) {
 			endGraphics(kCharacterAlexei);
 			CONS_Alexei_InCompAgain(0, 0, 0, 0);
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1823,13 +2078,21 @@ void LogicManager::CONS_Alexei_InCompAgain(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Alexei_InCompAgain(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		if (checkCathDir(kCarGreenSleeping, 66))
 			bumpCath(kCarGreenSleeping, 49, 255);
 		getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 1;
 		AlexeiCall(&LogicManager::CONS_Alexei_CompLogic, 2403000, "411", 0, 0);
-	} else if (msg->action == 18 && getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] == 1) {
-		CONS_Alexei_GoSalon4(0, 0, 0, 0);
+		break;
+	case 18:
+		if (getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] == 1) {
+			CONS_Alexei_GoSalon4(0, 0, 0, 0);
+		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1844,10 +2107,12 @@ void LogicManager::CONS_Alexei_GoSalon4(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Alexei_GoSalon4(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 1;
 		AlexeiCall(&LogicManager::CONS_Alexei_ExitComp, 0, 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8]) {
 		case 1:
 			send(kCharacterAlexei, kCharacterTatiana, 191198209, 0);
@@ -1862,7 +2127,13 @@ void LogicManager::HAND_Alexei_GoSalon4(HAND_PARAMS) {
 			getCharacter(kCharacterAlexei).characterPosition.location = 1;
 			CONS_Alexei_Pacing(0, 0, 0, 0);
 			break;
+		default:
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1884,20 +2155,22 @@ void LogicManager::HAND_Alexei_Pacing(HAND_PARAMS) {
 				if (rcClear()) {
 					getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 1;
 					AlexeiCall(&LogicManager::CONS_Alexei_PacingAtWindow, 0, 0, 0, 0);
-					return;
+					break;
 				}
 			}
 		}
+
 		if (_gameTime > 2457000 && !getCharacterCurrentParams(kCharacterAlexei)[2]) {
 			getCharacterCurrentParams(kCharacterAlexei)[2] = 1;
 			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 2;
 			AlexeiCall(&LogicManager::CONS_Alexei_WaitRCClear, 0, 0, 0, 0);
 		}
-		return;
+
+		break;
 	case 12:
 		getCharacterCurrentParams(kCharacterAlexei)[0] = 5 * (3 * rnd(120) + 180);
 		startCycOtis(kCharacterAlexei, "103B");
-		return;
+		break;
 	case 18:
 		if (getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] != 1) {
 			if (getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] == 2) {
@@ -1907,8 +2180,10 @@ void LogicManager::HAND_Alexei_Pacing(HAND_PARAMS) {
 			} else if (getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] == 3) {
 				CONS_Alexei_GoToPlatform(0, 0, 0, 0);
 			}
-			return;
+
+			break;
 		}
+
 		getCharacterCurrentParams(kCharacterAlexei)[0] = 5 * (3 * rnd(120) + 180);
 		getCharacterCurrentParams(kCharacterAlexei)[1] = 0;
 		if (_gameTime > 2457000 && !getCharacterCurrentParams(kCharacterAlexei)[2]) {
@@ -1916,7 +2191,10 @@ void LogicManager::HAND_Alexei_Pacing(HAND_PARAMS) {
 			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 2;
 			AlexeiCall(&LogicManager::CONS_Alexei_WaitRCClear, 0, 0, 0, 0);
 		}
-		return;
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1937,13 +2215,16 @@ void LogicManager::HAND_Alexei_GoToPlatform(HAND_PARAMS) {
 			getCharacterCurrentParams(kCharacterAlexei)[0] = 1;
 			releaseView(kCharacterAlexei, kCarGreenSleeping, 70);
 			releaseView(kCharacterAlexei, kCarGreenSleeping, 71);
+
 			if (onLowPlatform(kCharacterCath)) {
 				playChrExcuseMe(kCharacterAlexei, kCharacterCath, 0);
 				if (checkCathDir(kCarGreenSleeping, 62))
 					bumpCath(kCarGreenSleeping, 72, 255);
 			}
+
 			CONS_Alexei_ReturnComp4(0, 0, 0, 0);
 		}
+
 		break;
 	case 12:
 		getCharacter(kCharacterAlexei).characterPosition.car = 4;
@@ -1957,23 +2238,28 @@ void LogicManager::HAND_Alexei_GoToPlatform(HAND_PARAMS) {
 			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 2;
 			AlexeiCall(&LogicManager::CONS_Alexei_DoSeqOtis, "306A", 0, 0, 0);
 		}
+
 		break;
 	case 18:
 		if (getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] == 1) {
 			endGraphics(kCharacterAlexei);
+
 			if (onLowPlatform(kCharacterCath)) {
 				playChrExcuseMe(kCharacterAlexei, kCharacterCath, 0);
+
 				if (checkCathDir(kCarGreenSleeping, 62))
 					bumpCath(kCarGreenSleeping, 72, 255);
 			}
+
 			blockView(kCharacterAlexei, kCarGreenSleeping, 70);
 			blockView(kCharacterAlexei, kCarGreenSleeping, 71);
 		} else if (getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] == 2) {
 			startCycOtis(kCharacterAlexei, "306F");
 		}
+
 		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -1988,18 +2274,26 @@ void LogicManager::CONS_Alexei_ReturnComp4(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Alexei_ReturnComp4(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 1;
 		AlexeiCall(&LogicManager::CONS_Alexei_EnterComp, 0, 0, 0, 0);
-	} else if (msg->action == 18 && getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] == 1) {
-		if (checkCathDir(kCarGreenSleeping, 66))
-			bumpCath(kCarGreenSleeping, 49, 255);
-		if (cathHasItem(kItemBomb)) {
-			CONS_Alexei_BombPlanB(0, 0, 0, 0);
-		} else {
-			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 2;
-			AlexeiCall(&LogicManager::CONS_Alexei_CompLogic, 15803100, "412", 0, 0);
+		break;
+	case 18:
+		if (getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] == 1) {
+			if (checkCathDir(kCarGreenSleeping, 66))
+				bumpCath(kCarGreenSleeping, 49, 255);
+			if (cathHasItem(kItemBomb)) {
+				CONS_Alexei_BombPlanB(0, 0, 0, 0);
+			} else {
+				getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 2;
+				AlexeiCall(&LogicManager::CONS_Alexei_CompLogic, 15803100, "412", 0, 0);
+			}
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -2014,88 +2308,109 @@ void LogicManager::CONS_Alexei_BombPlanB(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Alexei_BombPlanB(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 1;
-			AlexeiCall(&LogicManager::CONS_Alexei_CompLogic, 2488500, "411", 0, 0);
-		} else if (msg->action == 18) {
-			switch (getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8]) {
-			case 1:
-				getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 2;
-				AlexeiCall(&LogicManager::CONS_Alexei_ExitComp, 0, 0, 0, 0);
-				break;
-			case 2:
-				getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 3;
-				AlexeiCall(&LogicManager::CONS_Alexei_DoWalk, 4, 0x24F4, 0, 0);
-				break;
-			case 4:
-				if (checkCathDir(kCarGreenSleeping, 66))
-					bumpCath(kCarGreenSleeping, 49, 255);
-				getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 5;
-				AlexeiCall(&LogicManager::CONS_Alexei_CompLogic, 2507400, "412", 0, 0);
-				break;
-			case 5:
-				getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 6;
-				AlexeiCall(&LogicManager::CONS_Alexei_DoCorrOtis, "602Fb", 2, 0, 0);
-				break;
-			case 6:
-				setDoor(2, 0, 0, 10, 9);
-				getCharacter(kCharacterAlexei).characterPosition.location = 0;
-				getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 7;
-				AlexeiCall(&LogicManager::CONS_Alexei_DoWalk, 4, 7500, 0, 0);
-				break;
-			case 7:
-				startSeqOtis(kCharacterAlexei, "602Eb");
-				blockAtDoor(kCharacterAlexei, 33);
-				getCharacter(kCharacterAlexei).characterPosition.location = 1;
-				if (inSuite(kCharacterCath, kCarRedSleeping, 7850)) {
-					playNIS((158 - !isNight()));
-					playDialog(0, "BUMP", -1, 0);
-					bumpCathRDoor(33);
+	switch (msg->action) {
+	case 0:
+		if (getCharacterCurrentParams(kCharacterAlexei)[0] != 0x7FFFFFFF && _gameTime != 0) {
+			if (_gameTime <= 2493000) {
+				if (inSalon(kCharacterCath) || inSalon(kCharacterAugust) || !getCharacterCurrentParams(kCharacterAlexei)[0]) {
+					getCharacterCurrentParams(kCharacterAlexei)[0] = _gameTime;
+					if (!_gameTime) {
+						takeItem(kItem22);
+						if (inSalon(kCharacterCath)) {
+							playChrExcuseMe(kCharacterAlexei, kCharacterCath, 0);
+							bumpCath(kCarRestaurant, checkCathDir(), 255);
+						}
+
+						getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 4;
+						AlexeiCall(&LogicManager::CONS_Alexei_EnterComp, 0, 0, 0, 0);
+						break;
+					}
 				}
-				getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 8;
-				AlexeiCall(&LogicManager::CONS_Alexei_FinishSeqOtis, 0, 0, 0, 0);
-				break;
-			case 8:
-				releaseAtDoor(kCharacterAlexei, 33);
-				endGraphics(kCharacterAlexei);
-				getCharacter(kCharacterAlexei).characterPosition.position = 8200;
-				getCharacter(kCharacterAlexei).characterPosition.location = 1;
-				setDoor(32, 0, 1, 0, 0);
-				setDoor(48, 0, 1, 0, 0);
-				getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 9;
-				AlexeiCall(&LogicManager::CONS_Alexei_DoDialog, "TAT4167", 0, 0, 0);
-				break;
-			case 9:
-				send(kCharacterAlexei, kCharacterMaster, 156435676, 0);
-				CONS_Alexei_Dead(0, 0, 0, 0);
-				break;
-			default:
-				return;
+
+				if (getCharacterCurrentParams(kCharacterAlexei)[0] >= _gameTime)
+					break;
+			}
+
+			getCharacterCurrentParams(kCharacterAlexei)[0] = 0x7FFFFFFF;
+
+			takeItem(kItem22);
+			if (inSalon(kCharacterCath)) {
+				playChrExcuseMe(kCharacterAlexei, kCharacterCath, 0);
+				bumpCath(kCarRestaurant, checkCathDir(), 255);
 			}
+
+			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 4;
+			AlexeiCall(&LogicManager::CONS_Alexei_EnterComp, 0, 0, 0, 0);
 		}
-		return;
-	}
-	if (getCharacterCurrentParams(kCharacterAlexei)[0] == 0x7FFFFFFF || !_gameTime)
-		return;
-	if (_gameTime <= 2493000) {
-		if (inSalon(kCharacterCath) || inSalon(kCharacterAugust) || !getCharacterCurrentParams(kCharacterAlexei)[0]) {
-			getCharacterCurrentParams(kCharacterAlexei)[0] = _gameTime;
-			if (!_gameTime)
-				goto LABEL_14;
+
+		break;
+	case 12:
+		getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 1;
+		AlexeiCall(&LogicManager::CONS_Alexei_CompLogic, 2488500, "411", 0, 0);
+		break;
+	case 18:
+		switch (getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8]) {
+		case 1:
+			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 2;
+			AlexeiCall(&LogicManager::CONS_Alexei_ExitComp, 0, 0, 0, 0);
+			break;
+		case 2:
+			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 3;
+			AlexeiCall(&LogicManager::CONS_Alexei_DoWalk, 4, 9460, 0, 0);
+			break;
+		case 4:
+			if (checkCathDir(kCarGreenSleeping, 66))
+				bumpCath(kCarGreenSleeping, 49, 255);
+
+			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 5;
+			AlexeiCall(&LogicManager::CONS_Alexei_CompLogic, 2507400, "412", 0, 0);
+			break;
+		case 5:
+			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 6;
+			AlexeiCall(&LogicManager::CONS_Alexei_DoCorrOtis, "602Fb", 2, 0, 0);
+			break;
+		case 6:
+			setDoor(2, 0, 0, 10, 9);
+			getCharacter(kCharacterAlexei).characterPosition.location = 0;
+			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 7;
+			AlexeiCall(&LogicManager::CONS_Alexei_DoWalk, 4, 7500, 0, 0);
+			break;
+		case 7:
+			startSeqOtis(kCharacterAlexei, "602Eb");
+			blockAtDoor(kCharacterAlexei, 33);
+			getCharacter(kCharacterAlexei).characterPosition.location = 1;
+
+			if (inSuite(kCharacterCath, kCarRedSleeping, 7850)) {
+				playNIS((158 - !isNight()));
+				playDialog(0, "BUMP", -1, 0);
+				bumpCathRDoor(33);
+			}
+
+			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 8;
+			AlexeiCall(&LogicManager::CONS_Alexei_FinishSeqOtis, 0, 0, 0, 0);
+			break;
+		case 8:
+			releaseAtDoor(kCharacterAlexei, 33);
+			endGraphics(kCharacterAlexei);
+			getCharacter(kCharacterAlexei).characterPosition.position = 8200;
+			getCharacter(kCharacterAlexei).characterPosition.location = 1;
+			setDoor(32, kCharacterCath, 1, 0, 0);
+			setDoor(48, kCharacterCath, 1, 0, 0);
+			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 9;
+			AlexeiCall(&LogicManager::CONS_Alexei_DoDialog, "TAT4167", 0, 0, 0);
+			break;
+		case 9:
+			send(kCharacterAlexei, kCharacterMaster, 156435676, 0);
+			CONS_Alexei_Dead(0, 0, 0, 0);
+			break;
+		default:
+			break;
 		}
-		if (getCharacterCurrentParams(kCharacterAlexei)[0] >= _gameTime)
-			return;
-	}
-	getCharacterCurrentParams(kCharacterAlexei)[0] = 0x7FFFFFFF;
-LABEL_14:
-	takeItem(kItem22);
-	if (inSalon(kCharacterCath)) {
-		playChrExcuseMe(kCharacterAlexei, kCharacterCath, 0);
-		bumpCath(kCarRestaurant, checkCathDir(), 255);
+
+		break;
+	default:
+		break;
 	}
-	getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 4;
-	AlexeiCall(&LogicManager::CONS_Alexei_EnterComp, 0, 0, 0, 0);
 }
 
 void LogicManager::CONS_Alexei_Dead(CONS_PARAMS) {
@@ -2109,13 +2424,17 @@ void LogicManager::CONS_Alexei_Dead(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Alexei_Dead(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		endGraphics(kCharacterAlexei);
 		getCharacter(kCharacterAlexei).characterPosition.car = kCarLocomotive;
 		getCharacter(kCharacterAlexei).characterPosition.position = 0;
 		getCharacter(kCharacterAlexei).characterPosition.location = 0;
-		setDoor(2, 0, 0, 10, 9);
-		setDoor(18, 0, 0, 10, 9);
+		setDoor(2, kCharacterCath, 0, 10, 9);
+		setDoor(18, kCharacterCath, 0, 10, 9);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -2130,8 +2449,13 @@ void LogicManager::CONS_Alexei_StartPart5(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Alexei_StartPart5(HAND_PARAMS) {
-	if (msg->action == 12)
+	switch (msg->action) {
+	case 12:
 		endGraphics(kCharacterAlexei);
+		break;
+	default:
+		break;
+	}
 }
 
 void (LogicManager::*LogicManager::_functionsAlexei[])(HAND_PARAMS) = {


Commit: c93bd7407846501df3a6ece8d24c7fe3aceed715
    https://github.com/scummvm/scummvm/commit/c93bd7407846501df3a6ece8d24c7fe3aceed715
Author: AndywinXp (andywinxp at gmail.com)
Date: 2025-06-16T23:12:18+02:00

Commit Message:
LASTEXPRESS: Add experimental support for Gold Edition

No sound, no cutscenes... that's as far as I will go for this edition.

Changed paths:
  A engines/lastexpress/data/gold_archive.cpp
  A engines/lastexpress/data/gold_archive.h
    engines/lastexpress/data/archive.cpp
    engines/lastexpress/data/archive.h
    engines/lastexpress/detection.cpp
    engines/lastexpress/game/beetle.cpp
    engines/lastexpress/game/logic.cpp
    engines/lastexpress/game/logic.h
    engines/lastexpress/game/nis.cpp
    engines/lastexpress/graphics.h
    engines/lastexpress/lastexpress.cpp
    engines/lastexpress/lastexpress.h
    engines/lastexpress/metaengine.cpp
    engines/lastexpress/module.mk


diff --git a/engines/lastexpress/data/archive.cpp b/engines/lastexpress/data/archive.cpp
index 47339b6fbe2..7d318e8b0fb 100644
--- a/engines/lastexpress/data/archive.cpp
+++ b/engines/lastexpress/data/archive.cpp
@@ -19,9 +19,6 @@
  *
  */
 
-// Based on the Xentax Wiki documentation:
-// http://wiki.xentax.com/index.php/The_Last_Express_SND
-
 #include "lastexpress/lastexpress.h"
 #include "lastexpress/data/archive.h"
 
diff --git a/engines/lastexpress/data/archive.h b/engines/lastexpress/data/archive.h
index caa9e87f008..91c8902c962 100644
--- a/engines/lastexpress/data/archive.h
+++ b/engines/lastexpress/data/archive.h
@@ -19,8 +19,8 @@
  *
  */
 
-#ifndef LASTEXPRESS_HPF_H
-#define LASTEXPRESS_HPF_H
+#ifndef LASTEXPRESS_ARCHIVE_H
+#define LASTEXPRESS_ARCHIVE_H
 
 #include "lastexpress/lastexpress.h"
 
@@ -52,14 +52,20 @@ typedef struct HPF {
 	uint16 currentPos;
 	uint16 status;
 
+	// For Gold Edition only
+	Common::ArchiveMemberPtr archiveRef;
+	Common::String archiveName;
+
 	HPF() {
 		memset(name, 0, sizeof(name));
 		offset = 0;
 		size = 0;
 		currentPos = 0;
 		status = 0;
-	};
 
+		archiveRef = nullptr;
+		archiveName = "";
+	};
 } HPF;
 
 enum HPFFlags {
@@ -74,24 +80,24 @@ public:
 	~ArchiveManager();
 
 	HPF *search(const char *name, HPF *archive, int archiveSize);
-	bool lockCD(int32 index);
-	bool isCDAvailable(int cdNum, char *outPath, int pathSize);
-	bool lockCache(char *filename);
-	void initHPFS();
-	void shutDownHPFS();
+	virtual bool lockCD(int32 index);
+	virtual bool isCDAvailable(int cdNum, char *outPath, int pathSize);
+	virtual bool lockCache(char *filename);
+	virtual void initHPFS();
+	virtual void shutDownHPFS();
 	void unlockCD();
-	HPF *openHPF(const char *filename);
+	virtual HPF *openHPF(const char *filename);
 	void readHD(void *dstBuf, int offset, uint32 size);
 	void readCD(void *dstBuf, int offset, uint32 size);
-	void readHPF(HPF *archive, void *dstBuf, uint32 size);
+	virtual void readHPF(HPF *archive, void *dstBuf, uint32 size);
 	void seekHPF(HPF *archive, uint32 position);
 	void closeHPF(HPF *archive);
 
-	int loadBG(const char *filename);
+	virtual int loadBG(const char *filename);
 	Seq *loadSeq(const char *filename, uint8 ticksToWaitUntilCycleRestart, int character);
 	void loadMice();
 
-private:
+protected:
 	LastExpressEngine *_engine = nullptr;
 
 	Common::File *_cdFilePointer = nullptr;
@@ -109,4 +115,4 @@ private:
 
 } // End of namespace LastExpress
 
-#endif // LASTEXPRESS_HPF_H
+#endif // LASTEXPRESS_ARCHIVE_H
diff --git a/engines/lastexpress/data/gold_archive.cpp b/engines/lastexpress/data/gold_archive.cpp
new file mode 100644
index 00000000000..0f74f8e5180
--- /dev/null
+++ b/engines/lastexpress/data/gold_archive.cpp
@@ -0,0 +1,301 @@
+/* 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 3 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, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "lastexpress/lastexpress.h"
+#include "lastexpress/data/gold_archive.h"
+
+#include "common/debug.h"
+#include "common/file.h"
+#include "common/memstream.h"
+#include "common/compression/unzip.h"
+#include "image/jpeg.h"
+
+namespace LastExpress {
+
+GoldArchiveManager::GoldArchiveManager(LastExpressEngine *engine) : ArchiveManager(engine) {
+}
+
+GoldArchiveManager::~GoldArchiveManager() {
+	ArchiveManager::~ArchiveManager();
+}
+
+
+bool GoldArchiveManager::lockCD(int32 index) {
+	return true;
+}
+
+bool GoldArchiveManager::isCDAvailable(int cdNum, char *outPath, int pathSize) {
+	return true;
+}
+
+bool GoldArchiveManager::lockCache(char *filename) {
+	return true;
+}
+
+void GoldArchiveManager::initHPFS() {
+	// This will act as a cache of files
+	_hdArchiveNumFiles = 6000;
+	_hdArchive = new HPF[_hdArchiveNumFiles];
+	
+	Common::StringArray resCategories = {
+		"BG", "DATA", "LNK", "NIS",
+		"SBE", "SEQ", "SND", "TGA"
+	};
+
+	for (uint i = 0; i < resCategories.size(); i++) {
+		Common::Archive *tmpArch = Common::makeZipArchive(Common::Path(Common::String::format("%s.zip", resCategories[i].c_str())), false);
+
+		if (tmpArch) {
+			SearchMan.add(resCategories[i], tmpArch);
+		} else {
+			warning("GoldArchiveManager::initHPFS(): %s.zip could't be loaded, the game might not function properly", resCategories[i].c_str());
+		}
+	}
+}
+
+void GoldArchiveManager::shutDownHPFS() {
+	delete[] _hdArchive;
+}
+
+HPF *GoldArchiveManager::openHPF(const char *filename) {
+	HPF *result = nullptr;
+	for (int32 i = 0; i < _hdArchiveNumFiles; i++) {
+		if ((_hdArchive[i].status & kHPFFileIsLoaded) == 0) {
+			result = &_hdArchive[i];
+			break;
+		}
+	}
+
+	if (!result) {
+		error("GoldArchiveManager::openHPF(): Couldn't allocate cache for file %s", filename);
+	}
+	
+	Common::String filenameStr(filename);
+	filenameStr.toUppercase();
+
+	Common::ArchiveMemberPtr archiveItem = SearchMan.getMember(Common::Path(filenameStr));
+
+	if (!archiveItem.get()) {
+		archiveItem = SearchMan.getMember(Common::Path(Common::Path(Common::String::format("COMMON/%s", filenameStr.c_str()))));
+	}
+
+	if (!archiveItem.get()) {
+		archiveItem = SearchMan.getMember(Common::Path(Common::Path(Common::String::format("%s/%s", _languagePrefix.c_str(), filenameStr.c_str()))));
+	}
+
+	if (!archiveItem.get()) {
+		for (int i = 1; i <= 3; i++) {
+			archiveItem = SearchMan.getMember(Common::Path(Common::Path(Common::String::format("%s/CD%d/%s", _languagePrefix.c_str(), i, filenameStr.c_str()))));
+			if (archiveItem.get())
+				break;
+
+			archiveItem = SearchMan.getMember(Common::Path(Common::Path(Common::String::format("CD%d/%s", i, filenameStr.c_str()))));
+			if (archiveItem.get())
+				break;
+		}
+	}
+
+	if (!archiveItem.get()) {
+		warning("GoldArchiveManager::openHPF(): Can't find file %s", filename);
+		return nullptr;
+	}
+
+	Common::strcpy_s(result->name, filename);
+	int64 archiveSize = archiveItem.get()->createReadStream()->size();
+	result->size = (uint16)((archiveSize / PAGE_SIZE) + ((archiveSize % PAGE_SIZE) > 0 ? 1 : 0));
+	result->status |= kHPFFileIsLoaded;
+	result->currentPos = 0;
+	result->archiveName = archiveItem.get()->getPathInArchive().toString();
+	result->archiveRef = archiveItem;
+
+	return result;
+}
+
+void GoldArchiveManager::readHPF(HPF *archive, void *dstBuf, uint32 size) {
+	if (!archive)
+		return;
+
+	uint32 effSize;
+
+	if ((archive->status & kHPFFileIsLoaded) != 0) {
+		if (archive->size > archive->currentPos) {
+			effSize = size;
+			if (archive->currentPos + size > archive->size)
+				effSize = archive->size - archive->currentPos;
+
+			Common::ArchiveMember *archivePtr = archive->archiveRef.get();
+			assert(archivePtr);
+
+			Common::SeekableReadStream *readStream = archivePtr->createReadStream();
+
+			readStream->seek((archive->currentPos + archive->offset) * PAGE_SIZE, SEEK_SET);
+			readStream->read(dstBuf, effSize * PAGE_SIZE);
+
+			delete readStream;
+
+			archive->currentPos += effSize;
+		}
+	}
+}
+
+int GoldArchiveManager::loadBG(const char *filename) {
+	TBM tbm;
+	char bgFilename[84];
+
+	memset(bgFilename, 0, sizeof(bgFilename));
+
+	tbm.x = _engine->getGraphicsManager()->_renderBox1.x;
+	tbm.y = _engine->getGraphicsManager()->_renderBox1.y;
+	tbm.width = _engine->getGraphicsManager()->_renderBox1.width;
+	tbm.height = _engine->getGraphicsManager()->_renderBox1.height;
+
+	PixMap *bgSurface = _engine->getGraphicsManager()->_backgroundBuffer;
+
+	if (_engine->getLogicManager()->_doubleClickFlag &&
+		(_engine->mouseHasLeftClicked() || _engine->mouseHasRightClicked()) &&
+		_engine->getLogicManager()->_trainData[_engine->getLogicManager()->_trainNodeIndex].car != 128) {
+		return -1;
+	}
+
+	Common::strcpy_s(bgFilename, filename);
+	Common::strcat_s(bgFilename, ".bg");
+
+	HPF *archive = openHPF(bgFilename);
+
+	if (!archive) {
+		Common::strcpy_s(bgFilename, "DEFAULT.BG");
+		archive = openHPF(bgFilename);
+	}
+
+	if (archive) {
+		// The background format in the Gold Edition is basically JPEG but with an header on top, containing:
+		// - X coordinate
+		// - Y coordinate
+		// - Width
+		// - Height
+		//
+		// All these fields are 32-bit LE.
+
+		Image::JPEGDecoder *dec = new Image::JPEGDecoder();
+		byte *backgroundCompBuffer = (byte *)malloc(archive->size * PAGE_SIZE);
+		assert(backgroundCompBuffer);
+		readHPF(archive, backgroundCompBuffer, archive->size);
+		Common::SeekableReadStream *seqDataStream = new Common::MemoryReadStream(backgroundCompBuffer, PAGE_SIZE * archive->size, DisposeAfterUse::YES);
+
+		_engine->getGraphicsManager()->_renderBox1.x = seqDataStream->readUint32LE();
+		_engine->getGraphicsManager()->_renderBox1.y = seqDataStream->readUint32LE();
+		_engine->getGraphicsManager()->_renderBox1.width = seqDataStream->readUint32LE();
+		_engine->getGraphicsManager()->_renderBox1.height = seqDataStream->readUint32LE();
+
+		dec->setOutputPixelFormat(Graphics::PixelFormat(2, 5, 5, 5, 0, 10, 5, 0, 0));
+		const Graphics::Surface *decodedSurf = dec->decodeFrame(*seqDataStream);
+
+		memcpy(bgSurface, decodedSurf->getPixels(), _engine->getGraphicsManager()->_renderBox1.width * _engine->getGraphicsManager()->_renderBox1.height * sizeof(PixMap));
+
+		_engine->getGraphicsManager()->modifyPalette(bgSurface, 640 * 480);
+		closeHPF(archive);
+
+		delete dec;
+
+		if (_engine->getLogicManager()->_doubleClickFlag &&
+			(_engine->mouseHasLeftClicked() || _engine->mouseHasRightClicked()) &&
+			_engine->getLogicManager()->_trainData[_engine->getLogicManager()->_trainNodeIndex].car != 128) {
+			return -1;
+		} else {
+			for (int32 i = _engine->getGraphicsManager()->_renderBox1.y - 1 + _engine->getGraphicsManager()->_renderBox1.height; i >= _engine->getGraphicsManager()->_renderBox1.y; i--) {
+				memmove(
+					&bgSurface[640 * i + _engine->getGraphicsManager()->_renderBox1.x],
+					&bgSurface[_engine->getGraphicsManager()->_renderBox1.width * (i - _engine->getGraphicsManager()->_renderBox1.y)],
+					2 * _engine->getGraphicsManager()->_renderBox1.width
+				);
+			}
+
+			if (_engine->getGraphicsManager()->_renderBox1.x) {
+				_engine->getGraphicsManager()->clear(_engine->getGraphicsManager()->_backgroundBuffer, 0, 0, _engine->getGraphicsManager()->_renderBox1.x, 480);
+				_engine->getGraphicsManager()->clear(_engine->getGraphicsManager()->_backgroundBuffer, 640 - _engine->getGraphicsManager()->_renderBox1.x, 0, _engine->getGraphicsManager()->_renderBox1.x, 480);
+			}
+
+			if (_engine->getGraphicsManager()->_renderBox1.y) {
+				_engine->getGraphicsManager()->clear(_engine->getGraphicsManager()->_backgroundBuffer, _engine->getGraphicsManager()->_renderBox1.x, 0, _engine->getGraphicsManager()->_renderBox1.width, _engine->getGraphicsManager()->_renderBox1.y);
+				_engine->getGraphicsManager()->clear(
+					_engine->getGraphicsManager()->_backgroundBuffer,
+					_engine->getGraphicsManager()->_renderBox1.x,
+					480 - _engine->getGraphicsManager()->_renderBox1.y,
+					_engine->getGraphicsManager()->_renderBox1.width,
+					_engine->getGraphicsManager()->_renderBox1.y
+				);
+			}
+
+			if (_engine->getLogicManager()->_doubleClickFlag &&
+				(_engine->mouseHasLeftClicked() || _engine->mouseHasRightClicked()) &&
+				_engine->getLogicManager()->_trainData[_engine->getLogicManager()->_trainNodeIndex].car != 128) {
+				return -1;
+
+			} else {
+				_engine->getGraphicsManager()->copy(_engine->getGraphicsManager()->_backgroundBuffer, _engine->getGraphicsManager()->_screenBuffer, 0, 0, 640, 480);
+
+				if (tbm.x      != _engine->getGraphicsManager()->_renderBox1.x     ||
+					tbm.y      != _engine->getGraphicsManager()->_renderBox1.y     ||
+					tbm.width  != _engine->getGraphicsManager()->_renderBox1.width ||
+					tbm.height != _engine->getGraphicsManager()->_renderBox1.height) {
+
+					_engine->getGraphicsManager()->_renderBox2.x = tbm.x;
+					_engine->getGraphicsManager()->_renderBox2.y = tbm.y;
+					_engine->getGraphicsManager()->_renderBox2.width = tbm.width;
+					_engine->getGraphicsManager()->_renderBox2.height = tbm.height;
+
+					if (_engine->getGraphicsManager()->_renderBox2.x > _engine->getGraphicsManager()->_renderBox1.x)
+						_engine->getGraphicsManager()->_renderBox2.x = _engine->getGraphicsManager()->_renderBox1.x;
+
+					if (_engine->getGraphicsManager()->_renderBox2.y > _engine->getGraphicsManager()->_renderBox1.y)
+						_engine->getGraphicsManager()->_renderBox2.y = _engine->getGraphicsManager()->_renderBox1.y;
+
+					if (_engine->getGraphicsManager()->_renderBox1.height + _engine->getGraphicsManager()->_renderBox1.y > (_engine->getGraphicsManager()->_renderBox2.height + _engine->getGraphicsManager()->_renderBox2.y))
+						_engine->getGraphicsManager()->_renderBox2.height = _engine->getGraphicsManager()->_renderBox1.height + _engine->getGraphicsManager()->_renderBox1.y - _engine->getGraphicsManager()->_renderBox2.y;
+
+					if (_engine->getGraphicsManager()->_renderBox1.x + _engine->getGraphicsManager()->_renderBox1.width > (_engine->getGraphicsManager()->_renderBox2.x + _engine->getGraphicsManager()->_renderBox2.width))
+						_engine->getGraphicsManager()->_renderBox2.width = _engine->getGraphicsManager()->_renderBox1.x + _engine->getGraphicsManager()->_renderBox1.width - _engine->getGraphicsManager()->_renderBox2.x;
+
+					return 1;
+				}
+
+				return 0;
+			}
+		}
+	} else {
+		memset(_engine->getGraphicsManager()->_screenBuffer, 0, (640 * 480 * sizeof(PixMap)));
+
+		_engine->getGraphicsManager()->copy(_engine->getGraphicsManager()->_screenBuffer, _engine->getGraphicsManager()->_backgroundBuffer, 0, 0, 640, 480);
+		_engine->getGraphicsManager()->_renderBox1.x = 0;
+		_engine->getGraphicsManager()->_renderBox1.y = 0;
+		_engine->getGraphicsManager()->_renderBox1.width = 640;
+		_engine->getGraphicsManager()->_renderBox1.height = 480;
+
+		_engine->getGraphicsManager()->_renderBox2.x = 0;
+		_engine->getGraphicsManager()->_renderBox2.y = _engine->getGraphicsManager()->_renderBox1.y;
+		_engine->getGraphicsManager()->_renderBox2.width = _engine->getGraphicsManager()->_renderBox1.width;
+		_engine->getGraphicsManager()->_renderBox2.height = _engine->getGraphicsManager()->_renderBox1.height;
+
+		return 1;
+	}
+}
+
+} // End of namespace LastExpress
diff --git a/engines/lastexpress/data/gold_archive.h b/engines/lastexpress/data/gold_archive.h
new file mode 100644
index 00000000000..9125d989a70
--- /dev/null
+++ b/engines/lastexpress/data/gold_archive.h
@@ -0,0 +1,59 @@
+/* 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 3 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, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#ifndef LASTEXPRESS_GOLD_ARCHIVE_H
+#define LASTEXPRESS_GOLD_ARCHIVE_H
+
+#include "lastexpress/data/archive.h"
+
+#include "common/file.h"
+
+namespace LastExpress {
+
+class LastExpressEngine;
+class ArchiveManager;
+
+struct Seq;
+struct HPF;
+
+class GoldArchiveManager : public ArchiveManager {
+public:
+	GoldArchiveManager(LastExpressEngine *engine);
+	~GoldArchiveManager();
+
+	bool lockCD(int32 index) override;
+	bool isCDAvailable(int cdNum, char *outPath, int pathSize) override;
+	bool lockCache(char *filename) override;
+	void initHPFS() override;
+	void shutDownHPFS() override;
+
+	HPF *openHPF(const char *filename) override;
+	void readHPF(HPF *archive, void *dstBuf, uint32 size) override;
+
+	int loadBG(const char *filename) override;
+
+protected:
+	Common::String _languagePrefix = "EN";
+};
+
+} // End of namespace LastExpress
+
+#endif // LASTEXPRESS_GOLD_ARCHIVE_H
diff --git a/engines/lastexpress/detection.cpp b/engines/lastexpress/detection.cpp
index 8902ad2fce6..f3aecd56477 100644
--- a/engines/lastexpress/detection.cpp
+++ b/engines/lastexpress/detection.cpp
@@ -213,11 +213,34 @@ static const ADGameDescription gameDescriptions[] = {
 		GUIO2(GUIO_NOASPECT, GUIO_NOMIDI)
 	},
 
+	// The Last Express (Multilanguage) - Gold Edition by DotEmu (Steam)
+	{
+		"lastexpress",
+		"Gold Edition",
+		{
+			{"BG.zip",                  0, "f7aa689629280e464293dd674126cfe6", 844756591},
+			{"DATA.zip",                0, "bd1602f10cf20a7f4add620fb6e5571f", 587488},
+			{"LNK.zip",                 0, "b281b3332a88e514543efd533643e627", 21296565},
+			{"NIS.zip",                 0, "bc108966f7142135f661cde4563390f3", 671323510},
+			{"SBE.zip",                 0, "a0345b2c6e6fa5d811767fd12283d0f8", 1380014},
+			{"SEQ.zip",                 0, "a6a6cb45b976e2ba4af546a31312afe3", 170652650},
+			{"SND.zip",                 0, "9c39b2b997f1d2504538c0b5fd1ff05f", 1160618591},
+			{"TGA.zip",                 0, "66c7c74553f635a86fad8f333825ad7d", 833177},
+			{"TheLastExpressSteam.exe", 0, "9173ea82f613b007479be0ca194ece39", 2060288},
+			AD_LISTEND
+		},
+		Common::UNK_LANG,
+		Common::kPlatformWindows,
+		ADGF_UNSTABLE | ADGF_REMASTERED,
+		GUIO2(GUIO_NOASPECT, GUIO_NOMIDI)
+	},
+
 	AD_TABLE_END_MARKER
 };
 
 static const char *const directoryGlobs[] = {
 		"data", // GOG release
+		"roms", // Gold Edition
 		nullptr
 };
 
diff --git a/engines/lastexpress/game/beetle.cpp b/engines/lastexpress/game/beetle.cpp
index a798fe07f45..4f53bfb282d 100644
--- a/engines/lastexpress/game/beetle.cpp
+++ b/engines/lastexpress/game/beetle.cpp
@@ -20,7 +20,7 @@
  */
 
 #include "lastexpress/data/archive.h"
-
+#include "lastexpress/data/gold_archive.h"
 #include "lastexpress/game/beetle.h"
 #include "lastexpress/game/logic.h"
 
diff --git a/engines/lastexpress/game/logic.cpp b/engines/lastexpress/game/logic.cpp
index 0074c0c87ed..7f5cb68357e 100644
--- a/engines/lastexpress/game/logic.cpp
+++ b/engines/lastexpress/game/logic.cpp
@@ -1730,10 +1730,14 @@ void LogicManager::playNIS(int nisId) {
 		_engine->getGraphicsManager()->_renderBox1.x = 80;
 		_engine->getGraphicsManager()->_renderBox1.width = 480;
 
-		if (videoWithoutFade) {
-			_engine->getNISManager()->doNIS(filename, kNisFlagBaseFlag);
+		if (_engine->isGoldEdition()) {
+			warning("NIS support for Gold Edition is currently missing. Skipping cutscene");
 		} else {
-			_engine->getNISManager()->doNIS(filename, kNisFlagBaseFlag | kNisFlagSoundFade);
+			if (videoWithoutFade) {
+				_engine->getNISManager()->doNIS(filename, kNisFlagBaseFlag);
+			} else {
+				_engine->getNISManager()->doNIS(filename, kNisFlagBaseFlag | kNisFlagSoundFade);
+			}
 		}
 
 		if (dialogRunning("TIMER"))
diff --git a/engines/lastexpress/game/logic.h b/engines/lastexpress/game/logic.h
index c37ec713a29..c7a43a90e28 100644
--- a/engines/lastexpress/game/logic.h
+++ b/engines/lastexpress/game/logic.h
@@ -50,6 +50,7 @@ struct ConsCallParam;
 
 class LogicManager {
 	friend class ArchiveManager;
+	friend class GoldArchiveManager;
 	friend class CBeetle;
 	friend class LastExpressEngine;
 	friend class MemoryManager;
diff --git a/engines/lastexpress/game/nis.cpp b/engines/lastexpress/game/nis.cpp
index 1ec73a63975..d1e39ca5fce 100644
--- a/engines/lastexpress/game/nis.cpp
+++ b/engines/lastexpress/game/nis.cpp
@@ -518,6 +518,9 @@ void NISManager::showNISStatus(int32 status) {
 }
 
 bool NISManager::doNIS(const char *name, int32 flags) {
+	if (_engine->isGoldEdition())
+		return true;
+
 	Slot *slot;
 
 	if (_engine->mouseHasRightClicked())
diff --git a/engines/lastexpress/graphics.h b/engines/lastexpress/graphics.h
index 8ab3e39b822..f9e76578072 100644
--- a/engines/lastexpress/graphics.h
+++ b/engines/lastexpress/graphics.h
@@ -68,6 +68,7 @@ class GraphicsManager {
 	friend class LogicManager;
 	friend class SubtitleManager;
 	friend class ArchiveManager;
+	friend class GoldArchiveManager;
 	friend class NISManager;
 	friend class Menu;
 	friend class SpriteManager;
diff --git a/engines/lastexpress/lastexpress.cpp b/engines/lastexpress/lastexpress.cpp
index 8fb7889e0f1..c38979c4500 100644
--- a/engines/lastexpress/lastexpress.cpp
+++ b/engines/lastexpress/lastexpress.cpp
@@ -22,6 +22,7 @@
 #include "lastexpress/lastexpress.h"
 
 #include "lastexpress/game/logic.h"
+#include "lastexpress/data/gold_archive.h"
 
 #include "lastexpress/menu/menu.h"
 #include "lastexpress/menu/clock.h"
@@ -51,7 +52,12 @@ LastExpressEngine::LastExpressEngine(OSystem *syst, const ADGameDescription *gd)
 
 	// Adding the default directories
 	const Common::FSNode gameDataDir(ConfMan.getPath("path"));
-	SearchMan.addSubDirectoryMatching(gameDataDir, "data");
+
+	if (isGoldEdition()) {
+		SearchMan.addSubDirectoryMatching(gameDataDir, "roms");
+	} else {
+		SearchMan.addSubDirectoryMatching(gameDataDir, "data");
+	}
 
 	_soundMutex = new Common::Mutex();
 }
@@ -152,7 +158,11 @@ Common::Error LastExpressEngine::run() {
 	_otisMan = new OtisManager(this);
 
 	// Archive manager
-	_archiveMan = new ArchiveManager(this);
+	if (isGoldEdition()) {
+		_archiveMan = new GoldArchiveManager(this);
+	} else {
+		_archiveMan = new ArchiveManager(this);
+	}
 
 	// Memory manager
 	_memMan = new MemoryManager(this);
diff --git a/engines/lastexpress/lastexpress.h b/engines/lastexpress/lastexpress.h
index cb139b7d692..cc0c3df2194 100644
--- a/engines/lastexpress/lastexpress.h
+++ b/engines/lastexpress/lastexpress.h
@@ -73,6 +73,7 @@ struct ADGameDescription;
 namespace LastExpress {
 
 class ArchiveManager;
+class GoldArchiveManager;
 class CBeetle;
 class CFight;
 class Clock;
@@ -547,6 +548,7 @@ public:
 	bool handleEvents();
 
 	bool isDemo() const;
+	bool isGoldEdition() const;
 
 	Common::String getTargetName() const;
 
diff --git a/engines/lastexpress/metaengine.cpp b/engines/lastexpress/metaengine.cpp
index 98bd5362535..5e592e598bd 100644
--- a/engines/lastexpress/metaengine.cpp
+++ b/engines/lastexpress/metaengine.cpp
@@ -46,6 +46,10 @@ bool LastExpressEngine::isDemo() const {
 	return (bool)(_gameDescription->flags & ADGF_DEMO);
 }
 
+bool LastExpressEngine::isGoldEdition() const {
+	return (Common::String(_gameDescription->extra) == "Gold Edition");
+}
+
 bool LastExpressMetaEngine::hasFeature(MetaEngineFeature f) const {
 	return f == kSupportsListSaves
 	    || f == kSupportsDeleteSave;
diff --git a/engines/lastexpress/module.mk b/engines/lastexpress/module.mk
index 924acf7a94d..4de45aabaca 100644
--- a/engines/lastexpress/module.mk
+++ b/engines/lastexpress/module.mk
@@ -61,6 +61,7 @@ MODULE_OBJS := \
 	characters/yasmin.o \
 	data/archive.o \
 	data/cvcrfile.o \
+	data/gold_archive.o \
 	data/sprites.o \
 	fight/fight.o \
 	fight/fighter.o \
@@ -78,7 +79,6 @@ MODULE_OBJS := \
 	game/logic.o \
 	game/navigation.o \
 	game/nis.o \
-	game/object.o \
 	game/otis.o \
 	game/savegame.o \
 	game/vcr.o \
@@ -93,8 +93,7 @@ MODULE_OBJS := \
 	graphics.o \
 	lastexpress.o \
 	memory.o \
-	metaengine.o \
-	resource.o
+	metaengine.o
 
 # This module can be built as a plugin
 ifeq ($(ENABLE_LASTEXPRESS), DYNAMIC_PLUGIN)


Commit: 1c9f84a625ad1b8a6480624cf32ec908d8d6ddfc
    https://github.com/scummvm/scummvm/commit/1c9f84a625ad1b8a6480624cf32ec908d8d6ddfc
Author: AndywinXp (andywinxp at gmail.com)
Date: 2025-06-16T23:12:18+02:00

Commit Message:
LASTEXPRESS: Clean up Cond1 logic

Changed paths:
    engines/lastexpress/characters/cond1.cpp


diff --git a/engines/lastexpress/characters/cond1.cpp b/engines/lastexpress/characters/cond1.cpp
index e907bcfaf18..678e16b773a 100644
--- a/engines/lastexpress/characters/cond1.cpp
+++ b/engines/lastexpress/characters/cond1.cpp
@@ -48,7 +48,7 @@ void LogicManager::CONS_Cond1(int chapter) {
 		CONS_Cond1_StartPart5(0, 0, 0, 0);
 		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -69,19 +69,25 @@ void LogicManager::CONS_Cond1_DebugWalks(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Cond1_DebugWalks(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			getCharacter(kCharacterCond1).characterPosition.position = 0;
-			getCharacter(kCharacterCond1).characterPosition.location = 0;
-			getCharacter(kCharacterCond1).characterPosition.car = kCarGreenSleeping;
-			getCharacterCurrentParams(kCharacterCond1)[0] = 10000;
-		}
-	} else if (walk(kCharacterCond1, kCarGreenSleeping, getCharacterCurrentParams(kCharacterCond1)[0])) {
-		if (getCharacterCurrentParams(kCharacterCond1)[0] == 10000) {
-			getCharacterCurrentParams(kCharacterCond1)[0] = 0;
-		} else {
-			getCharacterCurrentParams(kCharacterCond1)[0] = 10000;
+	switch (msg->action) {
+	case 0:
+		if (walk(kCharacterCond1, kCarGreenSleeping, getCharacterCurrentParams(kCharacterCond1)[0])) {
+			if (getCharacterCurrentParams(kCharacterCond1)[0] == 10000) {
+				getCharacterCurrentParams(kCharacterCond1)[0] = 0;
+			} else {
+				getCharacterCurrentParams(kCharacterCond1)[0] = 10000;
+			}
 		}
+
+		break;
+	case 12:
+		getCharacter(kCharacterCond1).characterPosition.position = 0;
+		getCharacter(kCharacterCond1).characterPosition.location = 0;
+		getCharacter(kCharacterCond1).characterPosition.car = kCarGreenSleeping;
+		getCharacterCurrentParams(kCharacterCond1)[0] = 10000;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -222,7 +228,7 @@ void LogicManager::HAND_Cond1_DoBriefCorrOtis(HAND_PARAMS) {
 
 		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -302,7 +308,8 @@ void LogicManager::CONS_Cond1_FinishSeqOtis(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Cond1_FinishSeqOtis(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		if (getCharacter(kCharacterCond1).direction == 4) {
 			if (_gameProgress[kProgressJacket] == 1 &&
 				nearChar(kCharacterCond1, kCharacterCath, 1000) &&
@@ -316,15 +323,22 @@ void LogicManager::HAND_Cond1_FinishSeqOtis(HAND_PARAMS) {
 			_engine->getMessageManager()->setMessageHandle(kCharacterCond1, _functionsCond1[getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall]]);
 			fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
 		}
-	} else if (msg->action == 3) {
+
+		break;
+	case 3:
 		getCharacter(kCharacterCond1).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterCond1, _functionsCond1[getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall]]);
 		fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		if (getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] == 1) {
 			playNIS(kEventMertensBloodJacket);
 			endGame(0, 1, 55, true);
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -368,7 +382,7 @@ void LogicManager::HAND_Cond1_DoDialog(HAND_PARAMS) {
 
 		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -412,7 +426,7 @@ void LogicManager::HAND_Cond1_DoDialogFullVol(HAND_PARAMS) {
 
 		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -430,11 +444,13 @@ void LogicManager::CONS_Cond1_SaveGame(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Cond1_SaveGame(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		getCharacter(kCharacterCond1).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterCond1, _functionsCond1[getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall]]);
 		fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		save(
 			kCharacterCond1,
 			getCharacterCurrentParams(kCharacterCond1)[0],
@@ -444,6 +460,9 @@ void LogicManager::HAND_Cond1_SaveGame(HAND_PARAMS) {
 		getCharacter(kCharacterCond1).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(3, _functionsCond1[getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall]]);
 		fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -471,7 +490,14 @@ void LogicManager::HAND_Cond1_DoWalk(HAND_PARAMS) {
 
 		if (!nearChar(kCharacterCond1, kCharacterCath, 1000) ||
 			inComp(kCharacterCath) || whoOutside(kCharacterCath)) {
-			goto LABEL_67;
+			if (walk(kCharacterCond1, getCharacterCurrentParams(kCharacterCond1)[0], getCharacterCurrentParams(kCharacterCond1)[1])) {
+				getCharacter(kCharacterCond1).inventoryItem = kItemNone;
+				getCharacter(kCharacterCond1).currentCall--;
+				_engine->getMessageManager()->setMessageHandle(kCharacterCond1, _functionsCond1[getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall]]);
+				fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
+			}
+
+			break;
 		}
 
 		if (_gameProgress[kProgressJacket] == 1) {
@@ -484,8 +510,16 @@ void LogicManager::HAND_Cond1_DoWalk(HAND_PARAMS) {
 			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 3;
 			Cond1Call(&LogicManager::CONS_Cond1_SaveGame, 2, kEventMertensAugustWaiting, 0, 0);
 		} else {
-			if (!getCharacterParams(kCharacterCond1, 8)[19] || _gameTime >= 2133000)
-				goto LABEL_67;
+			if (!getCharacterParams(kCharacterCond1, 8)[19] || _gameTime >= 2133000) {
+				if (walk(kCharacterCond1, getCharacterCurrentParams(kCharacterCond1)[0], getCharacterCurrentParams(kCharacterCond1)[1])) {
+					getCharacter(kCharacterCond1).inventoryItem = kItemNone;
+					getCharacter(kCharacterCond1).currentCall--;
+					_engine->getMessageManager()->setMessageHandle(kCharacterCond1, _functionsCond1[getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall]]);
+					fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
+				}
+
+				break;
+			}
 
 			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 4;
 			Cond1Call(&LogicManager::CONS_Cond1_SaveGame, 2, kEventMertensKronosConcertInvitation, 0, 0);
@@ -530,7 +564,7 @@ void LogicManager::HAND_Cond1_DoWalk(HAND_PARAMS) {
 		case 1:
 			playNIS(kEventMertensBloodJacket);
 			endGame(0, 1, 55, true);
-			return;
+			break;
 		case 2:
 			if (getCharacter(kCharacterCond1).characterPosition.position < getCharacter(kCharacterCath).characterPosition.position) {
 				playNIS(kEventMertensKronosInvitation);
@@ -547,70 +581,88 @@ void LogicManager::HAND_Cond1_DoWalk(HAND_PARAMS) {
 					getCharacter(kCharacterCond1).inventoryItem = kItemNone;
 					if (getCharacter(kCharacterCond1).characterPosition.car == kCarGreenSleeping && nearX(kCharacterCond1, 2000, 500))
 						getCharacter(kCharacterCond1).characterPosition.position = 2500;
-					goto LABEL_53;
+
+					walk(kCharacterCond1, kCharacterCond1, 2000);
+					bumpCathRx(getCharacter(kCharacterCond1).characterPosition.car, getCharacter(kCharacterCond1).characterPosition.position + 750);
+					getCharacter(kCharacterCond1).currentCall--;
+					_engine->getMessageManager()->setMessageHandle(kCharacterCond1, _functionsCond1[getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall]]);
+					fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
+					break;
 				}
 			}
 
-			if (getCharacter(kCharacterCond1).direction != 1)
-				goto LABEL_66;
-
-			goto LABEL_65;
+			if (getCharacter(kCharacterCond1).direction == 1)
+				bumpCathFx(getCharacter(kCharacterCond1).characterPosition.car, getCharacter(kCharacterCond1).characterPosition.position - 750);
+			else
+				bumpCathRx(getCharacter(kCharacterCond1).characterPosition.car, getCharacter(kCharacterCond1).characterPosition.position + 750);
 
 			break;
 		case 3:
 			playNIS(kEventMertensAugustWaiting);
 			_gameProgress[kProgressEventMertensAugustWaiting] = 1;
 			getCharacterParams(kCharacterCond1, 8)[9] = 0;
+
 			if (getCharacterCurrentParams(kCharacterCond1)[0] == 3 && getCharacterCurrentParams(kCharacterCond1)[1] == 8200) {
 				if (getCharacter(kCharacterCond1).characterPosition.car == kCarGreenSleeping && nearX(kCharacterCond1, 2000, 500))
 					getCharacter(kCharacterCond1).characterPosition.position = 2500;
-			LABEL_53:
+
 				walk(kCharacterCond1, kCharacterCond1, 2000);
 				bumpCathRx(getCharacter(kCharacterCond1).characterPosition.car, getCharacter(kCharacterCond1).characterPosition.position + 750);
 				getCharacter(kCharacterCond1).currentCall--;
 				_engine->getMessageManager()->setMessageHandle(kCharacterCond1, _functionsCond1[getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall]]);
 				fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
-				return;
+				break;
 			}
+
 			if (getCharacter(kCharacterCond1).direction == 1)
-			LABEL_65:
 				bumpCathFx(getCharacter(kCharacterCond1).characterPosition.car, getCharacter(kCharacterCond1).characterPosition.position - 750);
 			else
-			LABEL_66:
 				bumpCathRx(getCharacter(kCharacterCond1).characterPosition.car, getCharacter(kCharacterCond1).characterPosition.position + 750);
+
 			break;
 		case 4:
 			playNIS(kEventMertensKronosConcertInvitation);
 			getCharacterParams(kCharacterCond1, 8)[19] = 0;
+
 			if (getCharacter(kCharacterCond1).direction == 1)
-				goto LABEL_65;
-			goto LABEL_66;
+				bumpCathFx(getCharacter(kCharacterCond1).characterPosition.car, getCharacter(kCharacterCond1).characterPosition.position - 750);
+			else
+				bumpCathRx(getCharacter(kCharacterCond1).characterPosition.car, getCharacter(kCharacterCond1).characterPosition.position + 750);
+
+			break;
 		case 5:
-			playNIS(
-				(getCharacter(kCharacterCond1).characterPosition.position < getCharacter(kCharacterCath).characterPosition.position) + kEventMertensAskTylerCompartment);
+			if (getCharacter(kCharacterCond1).characterPosition.position < getCharacter(kCharacterCath).characterPosition.position)
+				playNIS(kEventMertensAskTylerCompartmentD);
+			else
+				playNIS(kEventMertensAskTylerCompartment);
+
 			if (getCharacter(kCharacterCond1).direction == 1)
 				bumpCathFx(getCharacter(kCharacterCond1).characterPosition.car, getCharacter(kCharacterCond1).characterPosition.position - 750);
 			else
 				bumpCathRx(getCharacter(kCharacterCond1).characterPosition.car, getCharacter(kCharacterCond1).characterPosition.position + 750);
-			return;
+
+			break;
 		case 6:
 			playNIS(kEventMertensDontMakeBed);
+
 			if (getCharacter(kCharacterCond1).direction == 1)
 				bumpCathFx(getCharacter(kCharacterCond1).characterPosition.car, getCharacter(kCharacterCond1).characterPosition.position - 750);
 			else
 				bumpCathRx(getCharacter(kCharacterCond1).characterPosition.car, getCharacter(kCharacterCond1).characterPosition.position + 750);
+
 			getCharacterParams(kCharacterCond1, 8)[3] = 0;
-			return;
+			break;
 		default:
-			return;
+			break;
 		}
-	LABEL_67:
+
 		if (walk(kCharacterCond1, getCharacterCurrentParams(kCharacterCond1)[0], getCharacterCurrentParams(kCharacterCond1)[1])) {
 			getCharacter(kCharacterCond1).inventoryItem = kItemNone;
 			getCharacter(kCharacterCond1).currentCall--;
 			_engine->getMessageManager()->setMessageHandle(kCharacterCond1, _functionsCond1[getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall]]);
 			fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
 		}
+
 		break;
 	default:
 		break;
@@ -630,25 +682,21 @@ void LogicManager::CONS_Cond1_DoWait(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Cond1_DoWait(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 18 && getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] == 1) {
-			playNIS(kEventMertensBloodJacket);
-			endGame(0, 1, 55, true);
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		if (_gameProgress[kProgressJacket] == 1 &&
 			nearChar(kCharacterCond1, kCharacterCath, 1000) &&
 			!inComp(kCharacterCath) && !whoOutside(kCharacterCath)) {
 
 			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 1;
 			Cond1Call(&LogicManager::CONS_Cond1_SaveGame, 2, kEventMertensBloodJacket, 0, 0);
-			return;
+			break;
 		}
 
 		if (getCharacterCurrentParams(kCharacterCond1)[1] ||
 			(getCharacterCurrentParams(kCharacterCond1)[1] = _gameTime + getCharacterCurrentParams(kCharacterCond1)[0], _gameTime + getCharacterCurrentParams(kCharacterCond1)[0] != 0)) {
 			if (getCharacterCurrentParams(kCharacterCond1)[1] >= _gameTime)
-				return;
+				break;
 
 			getCharacterCurrentParams(kCharacterCond1)[1] = 0x7FFFFFFF;
 		}
@@ -656,6 +704,16 @@ void LogicManager::HAND_Cond1_DoWait(HAND_PARAMS) {
 		getCharacter(kCharacterCond1).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterCond1, _functionsCond1[getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall]]);
 		fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
+		break;
+	case 18:
+		if (getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] == 1) {
+			playNIS(kEventMertensBloodJacket);
+			endGame(0, 1, 55, true);
+		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -672,7 +730,8 @@ void LogicManager::CONS_Cond1_StandAsideDialog(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Cond1_StandAsideDialog(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		if (!whoRunningDialog(kCharacterCond1)) {
 			if (isNight()) {
 				if (!isFemale(getCharacterCurrentParams(kCharacterCond1)[0])) {
@@ -723,6 +782,9 @@ void LogicManager::HAND_Cond1_StandAsideDialog(HAND_PARAMS) {
 		getCharacter(kCharacterCond1).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterCond1, _functionsCond1[getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall]]);
 		fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -747,72 +809,91 @@ void LogicManager::HAND_Cond1_Passing(HAND_PARAMS) {
 			!inComp(kCharacterCath) && !whoOutside(kCharacterCath)) {
 			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 4;
 			Cond1Call(&LogicManager::CONS_Cond1_SaveGame, 2, kEventMertensBloodJacket, 0, 0);
-			return;
-		}
-		if (getCharacterCurrentParams(kCharacterCond1)[1] || getCharacterCurrentParams(kCharacterCond1)[2])
-			goto LABEL_15;
-		if (!getCharacterCurrentParams(kCharacterCond1)[3]) {
-			getCharacterCurrentParams(kCharacterCond1)[3] = _currentGameSessionTicks + 75;
-			if (_currentGameSessionTicks + 75 == 0)
-				goto LABEL_14;
+			break;
 		}
-		if (getCharacterCurrentParams(kCharacterCond1)[3] < _currentGameSessionTicks) {
-			getCharacterCurrentParams(kCharacterCond1)[3] = 0x7FFFFFFF;
-		LABEL_14:
-			getCharacter(kCharacterCond1).inventoryItem = kItemNone;
-			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 5;
-			Cond1Call(&LogicManager::CONS_Cond1_SitDownFast, 0, 0, 0, 0);
-			return;
+		if (!getCharacterCurrentParams(kCharacterCond1)[1] && !getCharacterCurrentParams(kCharacterCond1)[2]) {
+			if (!getCharacterCurrentParams(kCharacterCond1)[3]) {
+				getCharacterCurrentParams(kCharacterCond1)[3] = _currentGameSessionTicks + 75;
+				if (_currentGameSessionTicks + 75 == 0) {
+					getCharacter(kCharacterCond1).inventoryItem = kItemNone;
+					getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 5;
+					Cond1Call(&LogicManager::CONS_Cond1_SitDownFast, 0, 0, 0, 0);
+					break;
+				}
+			}
+
+			if (getCharacterCurrentParams(kCharacterCond1)[3] < _currentGameSessionTicks) {
+				getCharacterCurrentParams(kCharacterCond1)[3] = 0x7FFFFFFF;
+				getCharacter(kCharacterCond1).inventoryItem = kItemNone;
+				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 5;
+				Cond1Call(&LogicManager::CONS_Cond1_SitDownFast, 0, 0, 0, 0);
+				break;
+			}
 		}
-	LABEL_15:
+
 		if (!getCharacterCurrentParams(kCharacterCond1)[4]) {
 			getCharacterCurrentParams(kCharacterCond1)[4] = _currentGameSessionTicks + 225;
-			if (_currentGameSessionTicks + 225 == 0)
-				goto LABEL_19;
+			if (_currentGameSessionTicks + 225 == 0) {
+				getCharacter(kCharacterCond1).inventoryItem = kItemNone;
+				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 6;
+				Cond1Call(&LogicManager::CONS_Cond1_SitDownFast, 0, 0, 0, 0);
+				break;
+			}
 		}
+
 		if (getCharacterCurrentParams(kCharacterCond1)[4] >= _currentGameSessionTicks) {
 			getCharacter(kCharacterCond1).inventoryItem = _gameProgress[kProgressChapter] == 1 && !getCharacterParams(kCharacterCond1, 8)[16] && !_gameProgress[kProgressEventFoundCorpse] && !_gameEvents[kEventMertensAskTylerCompartment] && !_gameEvents[kEventMertensAskTylerCompartmentD];
 		} else {
 			getCharacterCurrentParams(kCharacterCond1)[4] = 0x7FFFFFFF;
-		LABEL_19:
 			getCharacter(kCharacterCond1).inventoryItem = kItemNone;
 			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 6;
 			Cond1Call(&LogicManager::CONS_Cond1_SitDownFast, 0, 0, 0, 0);
 		}
-		return;
+
+		break;
 	case 1:
 		getCharacter(kCharacterCond1).inventoryItem = kItemNone;
 		getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 7;
 		Cond1Call(&LogicManager::CONS_Cond1_SaveGame, 2, kEventMertensAskTylerCompartmentD, 0, 0);
-		return;
+		break;
 	case 11:
-		++getCharacterCurrentParams(kCharacterCond1)[2];
+		getCharacterCurrentParams(kCharacterCond1)[2]++;
 		getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 11;
 		Cond1Call(&LogicManager::CONS_Cond1_StandAsideDialog, msg->sender, 0, 0, 0);
-		return;
+		break;
 	case 12:
 		if (getCharacterCurrentParams(kCharacterCond1)[1])
 			getCharacterCurrentParams(kCharacterCond1)[2] = 1;
-		if (whoRunningDialog(kCharacterCond1))
-			goto LABEL_40;
+
+		if (whoRunningDialog(kCharacterCond1)) {
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 3;
+			Cond1Call(&LogicManager::CONS_Cond1_GetUpListen, 0, 0, 0, 0);
+			break;
+		}
+
 		if (_gameProgress[kProgressChapter] == 3 && !getCharacterCurrentParams(kCharacterCond1)[0] && _gameTime < 2173500 && (_gameTime > 2106000 || getCharacterCurrentParams(kCharacterCond1)[1] && _gameTime > 2079000)) {
 			if (getCharacterCurrentParams(kCharacterCond1)[1] == 2) {
 				playDialog(kCharacterCond1, "CON3052", -1, 0);
-			LABEL_40:
 				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 3;
 				Cond1Call(&LogicManager::CONS_Cond1_GetUpListen, 0, 0, 0, 0);
-				return;
+				break;
 			}
+
 			if (isFemale(getCharacterCurrentParams(kCharacterCond1)[1])) {
 				playDialog(kCharacterCond1, "CON3051", -1, 0);
-				goto LABEL_40;
+				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 3;
+				Cond1Call(&LogicManager::CONS_Cond1_GetUpListen, 0, 0, 0, 0);
+				break;
 			}
 			if (!getCharacterCurrentParams(kCharacterCond1)[1]) {
 				if (_gameProgress[kProgressField40])
 					playDialog(kCharacterCond1, "CON3054", -1, 0);
 				else
 					playDialog(kCharacterCond1, "CON3053", -1, 0);
-				goto LABEL_40;
+
+				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 3;
+				Cond1Call(&LogicManager::CONS_Cond1_GetUpListen, 0, 0, 0, 0);
+				break;
 			}
 			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 1;
 			Cond1Call(&LogicManager::CONS_Cond1_StandAsideDialog, getCharacterCurrentParams(kCharacterCond1)[1], 0, 0, 0);
@@ -820,6 +901,7 @@ void LogicManager::HAND_Cond1_Passing(HAND_PARAMS) {
 			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 2;
 			Cond1Call(&LogicManager::CONS_Cond1_StandAsideDialog, getCharacterCurrentParams(kCharacterCond1)[1], 0, 0, 0);
 		}
+
 		break;
 	case 16:
 		getCharacterCurrentParams(kCharacterCond1)[2]--;
@@ -835,19 +917,21 @@ void LogicManager::HAND_Cond1_Passing(HAND_PARAMS) {
 			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 8;
 			Cond1Call(&LogicManager::CONS_Cond1_SaveGame, 2, kEventMertensKronosInvitation, 0, 0);
 		} else {
-		LABEL_64:
 			if (!getCharacterCurrentParams(kCharacterCond1)[2]) {
 				getCharacter(kCharacterCond1).inventoryItem = kItemNone;
 				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 9;
 				Cond1Call(&LogicManager::CONS_Cond1_SitDownFast, 0, 0, 0, 0);
 			}
 		}
-		return;
+
+		break;
 	case 18:
 		switch (getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8]) {
 		case 1:
 		case 2:
-			goto LABEL_40;
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 3;
+			Cond1Call(&LogicManager::CONS_Cond1_GetUpListen, 0, 0, 0, 0);
+			break;
 		case 3:
 			if (!getCharacterCurrentParams(kCharacterCond1)[0]) {
 				startCycOtis(kCharacterCond1, "601H");
@@ -870,20 +954,28 @@ void LogicManager::HAND_Cond1_Passing(HAND_PARAMS) {
 			break;
 		case 7:
 			playNIS(kEventMertensAskTylerCompartmentD);
-			bumpCath(3, 25, 255);
+			bumpCath(kCarGreenSleeping, 25, 255);
 			break;
 		case 8:
 			playNIS(kEventMertensKronosInvitation);
 			getCharacterParams(kCharacterCond1, 8)[6] = 0;
 			getCharacterParams(kCharacterCond1, 8)[5] = 0;
 			cleanNIS();
-			goto LABEL_64;
+
+			if (!getCharacterCurrentParams(kCharacterCond1)[2]) {
+				getCharacter(kCharacterCond1).inventoryItem = kItemNone;
+				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 9;
+				Cond1Call(&LogicManager::CONS_Cond1_SitDownFast, 0, 0, 0, 0);
+			}
+
+			break;
 		default:
-			return;
+			break;
 		}
-		return;
+
+		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -900,43 +992,17 @@ void LogicManager::CONS_Cond1_Listen(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Cond1_Listen(HAND_PARAMS) {
-	if (msg->action > 12) {
-		if (msg->action == 18) {
-			switch (getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8]) {
-			case 1:
-				send(kCharacterCond1, getCharacterCurrentParams(kCharacterCond1)[0], 202558662, 0);
-				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 2;
-				Cond1Call(&LogicManager::CONS_Cond1_GetUpListen, 0, 0, 0, 0);
-				break;
-			case 2:
-				send(kCharacterCond1, getCharacterCurrentParams(kCharacterCond1)[0], 155853632, 0);
-				startCycOtis(kCharacterCond1, "601K");
-				break;
-			case 3:
-				send(kCharacterCond1, getCharacterCurrentParams(kCharacterCond1)[0], 202558662, 0);
-				send(kCharacterCond1, getCharacterCurrentParams(kCharacterCond1)[0], 155853632, 0);
-				startCycOtis(kCharacterCond1, "601K");
-				takeItem(kItem7);
-				break;
-			case 4:
-				playNIS(kEventMertensBloodJacket);
-				endGame(0, 1, 55, true);
-				break;
-			case 5:
-				getCharacter(kCharacterCond1).currentCall--;
-				_engine->getMessageManager()->setMessageHandle(kCharacterCond1, _functionsCond1[getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall]]);
-				fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
-				break;
-			default:
-				return;
-			}
-		} else if (msg->action == 125499160) {
-			if (getCharacterCurrentParams(kCharacterCond1)[0] == 9)
-				getCharacterParams(kCharacterCond1, 8)[7] = 0;
-			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 5;
-			Cond1Call(&LogicManager::CONS_Cond1_SitDownFast, 0, 0, 0, 0);
+	switch (msg->action) {
+	case 0:
+		if (_gameProgress[kProgressJacket] == 1 &&
+			nearChar(kCharacterCond1, kCharacterCath, 1000) &&
+			!inComp(kCharacterCath) && !whoOutside(kCharacterCath)) {
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 4;
+			Cond1Call(&LogicManager::CONS_Cond1_SaveGame, 2, kEventMertensBloodJacket, 0, 0);
 		}
-	} else if (msg->action == 12) {
+
+		break;
+	case 12:
 		getCharacter(kCharacterCond1).inventoryItem = kItemNone;
 		if (getCharacterParams(kCharacterCond1, 8)[16]) {
 			getCharacterParams(kCharacterCond1, 8)[16] = 0;
@@ -946,11 +1012,48 @@ void LogicManager::HAND_Cond1_Listen(HAND_PARAMS) {
 			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 1;
 			Cond1Call(&LogicManager::CONS_Cond1_DoWait, 15, 0, 0, 0);
 		}
-	} else if (msg->action == 0 && _gameProgress[kProgressJacket] == 1 &&
-		nearChar(kCharacterCond1, kCharacterCath, 1000) &&
-		!inComp(kCharacterCath) && !whoOutside(kCharacterCath)) {
-		getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 4;
-		Cond1Call(&LogicManager::CONS_Cond1_SaveGame, 2, 123, 0, 0);
+
+		break;
+	case 18:
+		switch (getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8]) {
+		case 1:
+			send(kCharacterCond1, getCharacterCurrentParams(kCharacterCond1)[0], 202558662, 0);
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 2;
+			Cond1Call(&LogicManager::CONS_Cond1_GetUpListen, 0, 0, 0, 0);
+			break;
+		case 2:
+			send(kCharacterCond1, getCharacterCurrentParams(kCharacterCond1)[0], 155853632, 0);
+			startCycOtis(kCharacterCond1, "601K");
+			break;
+		case 3:
+			send(kCharacterCond1, getCharacterCurrentParams(kCharacterCond1)[0], 202558662, 0);
+			send(kCharacterCond1, getCharacterCurrentParams(kCharacterCond1)[0], 155853632, 0);
+			startCycOtis(kCharacterCond1, "601K");
+			takeItem(kItem7);
+			break;
+		case 4:
+			playNIS(kEventMertensBloodJacket);
+			endGame(0, 1, 55, true);
+			break;
+		case 5:
+			getCharacter(kCharacterCond1).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterCond1, _functionsCond1[getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall]]);
+			fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
+			break;
+		default:
+			break;
+		}
+
+		break;
+	case 125499160:
+		if (getCharacterCurrentParams(kCharacterCond1)[0] == 9)
+			getCharacterParams(kCharacterCond1, 8)[7] = 0;
+
+		getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 5;
+		Cond1Call(&LogicManager::CONS_Cond1_SitDownFast, 0, 0, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -965,12 +1068,14 @@ void LogicManager::CONS_Cond1_AlexeiLockUnlockMyComp(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Cond1_AlexeiLockUnlockMyComp(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacterParams(kCharacterCond1, 8)[11] = 0;
 		getCharacterParams(kCharacterCond1, 8)[12] = 0;
 		getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 1;
 		Cond1Call(&LogicManager::CONS_Cond1_GetUp, 0, 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8]) {
 		case 1:
 			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 2;
@@ -1005,8 +1110,12 @@ void LogicManager::HAND_Cond1_AlexeiLockUnlockMyComp(HAND_PARAMS) {
 			fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
 			break;
 		default:
-			return;
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1023,12 +1132,14 @@ void LogicManager::CONS_Cond1_AugustLockUnlockMyComp(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Cond1_AugustLockUnlockMyComp(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacterParams(kCharacterCond1, 8)[14] = 0;
 		getCharacterParams(kCharacterCond1, 8)[13] = 0;
 		getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 1;
 		Cond1Call(&LogicManager::CONS_Cond1_GetUp, 0, 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8]) {
 		case 1:
 			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 2;
@@ -1080,8 +1191,12 @@ void LogicManager::HAND_Cond1_AugustLockUnlockMyComp(HAND_PARAMS) {
 			fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
 			break;
 		default:
-			return;
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1098,7 +1213,8 @@ void LogicManager::CONS_Cond1_SitDown(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Cond1_SitDown(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		if (getCharacterParams(kCharacterCond1, 8)[5]  ||
 			getCharacterParams(kCharacterCond1, 8)[9]  ||
 			getCharacterParams(kCharacterCond1, 8)[13] ||
@@ -1139,7 +1255,9 @@ void LogicManager::HAND_Cond1_SitDown(HAND_PARAMS) {
 			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 3;
 			Cond1Call(&LogicManager::CONS_Cond1_FinishSeqOtis, 0, 0, 0, 0);
 		}
-	} else if (msg->action == 18) {
+
+		break;
+	case 18:
 		switch (getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8]) {
 		case 1:
 			endGraphics(kCharacterCond1);
@@ -1170,6 +1288,10 @@ void LogicManager::HAND_Cond1_SitDown(HAND_PARAMS) {
 			fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
 			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1184,14 +1306,15 @@ void LogicManager::CONS_Cond1_SitDownFast(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Cond1_SitDownFast(HAND_PARAMS) {
-	if (msg->action == 12) {
-		if (getCharacterParams(kCharacterCond1, 8)[5] ||
-			getCharacterParams(kCharacterCond1, 8)[9] ||
+	switch (msg->action) {
+	case 12:
+		if (getCharacterParams(kCharacterCond1, 8)[5]  ||
+			getCharacterParams(kCharacterCond1, 8)[9]  ||
 			getCharacterParams(kCharacterCond1, 8)[13] ||
 			getCharacterParams(kCharacterCond1, 8)[14] ||
 			getCharacterParams(kCharacterCond1, 8)[11] ||
 			getCharacterParams(kCharacterCond1, 8)[12] ||
-			getCharacterParams(kCharacterCond1, 8)[8] ||
+			getCharacterParams(kCharacterCond1, 8)[8]  ||
 			getCharacterParams(kCharacterCond1, 8)[10] ||
 			getCharacterParams(kCharacterCond1, 8)[15]) {
 
@@ -1223,7 +1346,9 @@ void LogicManager::HAND_Cond1_SitDownFast(HAND_PARAMS) {
 			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 1;
 			Cond1Call(&LogicManager::CONS_Cond1_FinishSeqOtis, 0, 0, 0, 0);
 		}
-	} else if (msg->action == 18) {
+
+		break;
+	case 18:
 		if (getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] == 1) {
 			if (!getCharacterParams(kCharacterCond1, 8)[2] && !cathHasItem(kItemPassengerList)) {
 				if (getCharacterParams(kCharacterCond1, 8)[1]) {
@@ -1240,6 +1365,10 @@ void LogicManager::HAND_Cond1_SitDownFast(HAND_PARAMS) {
 			_engine->getMessageManager()->setMessageHandle(kCharacterCond1, _functionsCond1[getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall]]);
 			fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1254,7 +1383,8 @@ void LogicManager::CONS_Cond1_GetUp(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Cond1_GetUp(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		if (getCharacterParams(kCharacterCond1, 8)[16]) {
 			dropItem(kItem7, 1);
 			getCharacterParams(kCharacterCond1, 8)[16] = 0;
@@ -1266,14 +1396,20 @@ void LogicManager::HAND_Cond1_GetUp(HAND_PARAMS) {
 			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 1;
 			Cond1Call(&LogicManager::CONS_Cond1_DoSeqOtis, "601C", 0, 0, 0);
 		}
-	} else if (msg->action == 18 && getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] == 1) {
-		dropItem(kItem7, 1);
-		if (!checkCathDir(kCarGreenSleeping, 2))
-			getCharacter(kCharacterCond1).characterPosition.position = 2088;
 
-		getCharacter(kCharacterCond1).currentCall--;
-		_engine->getMessageManager()->setMessageHandle(kCharacterCond1, _functionsCond1[getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall]]);
-		fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
+		break;
+	case 18:
+		if (getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] == 1) {
+			dropItem(kItem7, 1);
+			if (!checkCathDir(kCarGreenSleeping, 2))
+				getCharacter(kCharacterCond1).characterPosition.position = 2088;
+
+			getCharacter(kCharacterCond1).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterCond1, _functionsCond1[getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall]]);
+			fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
+		}
+
+		break;
 	}
 }
 
@@ -1288,7 +1424,8 @@ void LogicManager::CONS_Cond1_GetUpListen(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Cond1_GetUpListen(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		takeItem(kItem7);
 
 		if (getCharacterParams(kCharacterCond1, 8)[16]) {
@@ -1300,12 +1437,18 @@ void LogicManager::HAND_Cond1_GetUpListen(HAND_PARAMS) {
 			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 1;
 			Cond1Call(&LogicManager::CONS_Cond1_DoSeqOtis, "601C", 0, 0, 0);
 		}
-	} else if (msg->action == 18) {
+
+		break;
+	case 18:
 		if (getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] == 1) {
 			getCharacter(kCharacterCond1).currentCall--;
 			_engine->getMessageManager()->setMessageHandle(kCharacterCond1, _functionsCond1[getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall]]);
 			fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1325,21 +1468,26 @@ void LogicManager::CONS_Cond1_MakeBed(CONS_PARAMS) {
 void LogicManager::HAND_Cond1_MakeBed(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
+	{
+		bool skip = false; // Horrible way to unroll a goto...
+
 		if (!getCharacterCurrentParams(kCharacterCond1)[11]) {
 			getCharacterCurrentParams(kCharacterCond1)[11] = _gameTime + 300;
-			if (_gameTime + 300 == 0)
-				goto LABEL_7;
+			if (_gameTime + 300 == 0) {
+				skip = true;
+				playDialog(0, "ZFX1004", getVolume(kCharacterCond1), 0);
+			}
 		}
 
-		if (getCharacterCurrentParams(kCharacterCond1)[11] < _gameTime) {
+		if (!skip && getCharacterCurrentParams(kCharacterCond1)[11] < _gameTime) {
 			getCharacterCurrentParams(kCharacterCond1)[11] = 0x7FFFFFFF;
-		LABEL_7:
 			playDialog(0, "ZFX1004", getVolume(kCharacterCond1), 0);
 		}
 
 		if (getCharacterCurrentParams(kCharacterCond1)[12] || (getCharacterCurrentParams(kCharacterCond1)[12] = _gameTime + 900, _gameTime != -900)) {
 			if (getCharacterCurrentParams(kCharacterCond1)[12] >= _gameTime)
-				return;
+				break;
+
 			getCharacterCurrentParams(kCharacterCond1)[12] = 0x7FFFFFFF;
 		}
 
@@ -1350,11 +1498,12 @@ void LogicManager::HAND_Cond1_MakeBed(HAND_PARAMS) {
 
 		if (getCharacterCurrentParams(kCharacterCond1)[1])
 			setDoor(getCharacterCurrentParams(kCharacterCond1)[1], getCharacterCurrentParams(kCharacterCond1)[7], getCharacterCurrentParams(kCharacterCond1)[8], getCharacterCurrentParams(kCharacterCond1)[9], getCharacterCurrentParams(kCharacterCond1)[10]);
+
 		getCharacter(kCharacterCond1).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterCond1, _functionsCond1[getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall]]);
 		fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
-
 		break;
+	}
 	case 8:
 	case 9:
 		setDoor(getCharacterCurrentParams(kCharacterCond1)[0], kCharacterCond1, 1, 0, 0);
@@ -1431,15 +1580,12 @@ void LogicManager::CONS_Cond1_MakeBedMahmud(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Cond1_MakeBedMahmud(HAND_PARAMS) {
-	if (msg->action > 18) {
-		if (msg->action == 102227384) {
-			startCycOtis(kCharacterCond1, "671Dh");
-		} else if (msg->action == 156567128) {
-			softReleaseAtDoor(kCharacterCond1, 8);
-			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 5;
-			Cond1Call(&LogicManager::CONS_Cond1_DoWalk, 3, 5790, 0, 0);
-		}
-	} else if (msg->action == 18) {
+	switch (msg->action) {
+	case 12:
+		getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 1;
+		Cond1Call(&LogicManager::CONS_Cond1_DoWalk, 3, 2740, 0, 0);
+		break;
+	case 18:
 		switch (getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8]) {
 		case 1:
 			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 2;
@@ -1492,9 +1638,18 @@ void LogicManager::HAND_Cond1_MakeBedMahmud(HAND_PARAMS) {
 		default:
 			break;
 		}
-	} else if (msg->action == 12) {
-		getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 1;
-		Cond1Call(&LogicManager::CONS_Cond1_DoWalk, 3, 2740, 0, 0);
+
+		break;
+	case 102227384:
+		startCycOtis(kCharacterCond1, "671Dh");
+		break;
+	case 156567128:
+		softReleaseAtDoor(kCharacterCond1, 8);
+		getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 5;
+		Cond1Call(&LogicManager::CONS_Cond1_DoWalk, 3, 5790, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1509,10 +1664,12 @@ void LogicManager::CONS_Cond1_MakeBedMahmud2(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Cond1_MakeBedMahmud2(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 1;
 		Cond1Call(&LogicManager::CONS_Cond1_DoWalk, 3, 5790, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8]) {
 		case 1:
 			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 2;
@@ -1547,8 +1704,12 @@ void LogicManager::HAND_Cond1_MakeBedMahmud2(HAND_PARAMS) {
 			fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
 			break;
 		default:
-			return;
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1563,86 +1724,95 @@ void LogicManager::CONS_Cond1_MakeBedAugust(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Cond1_MakeBedAugust(HAND_PARAMS) {
-	if (msg->action > 12) {
-		if (msg->action > 100906246) {
-			if (msg->action == 102675536) {
-				getCharacterCurrentParams(kCharacterCond1)[0] = 1;
-			} else if (msg->action == 156567128) {
-				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 6;
-				Cond1Call(&LogicManager::CONS_Cond1_DoCorrOtis, "601Tc", 3, 0, 0);
-			}
-		} else if (msg->action == 100906246) {
-			send(kCharacterCond1, kCharacterAugust, 192849856, 0);
-			startCycOtis(kCharacterCond1, "601Qc");
-		} else if (msg->action == 18) {
-			switch (getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8]) {
-			case 1:
-				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 2;
-				Cond1Call(&LogicManager::CONS_Cond1_DoCorrOtis, "601Mc", 3, 0, 0);
-				break;
-			case 2:
-				send(kCharacterCond1, kCharacterAugust, 221617184, 0);
-				startCycOtis(kCharacterCond1, "601Nc");
-				softBlockAtDoor(kCharacterCond1, 3);
-				break;
-			case 3:
-				softReleaseAtDoor(kCharacterCond1, 3);
-				getCharacter(kCharacterCond1).characterPosition.location = 1;
-				endGraphics(kCharacterCond1);
-				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 4;
-				Cond1Call(&LogicManager::CONS_Cond1_MakeBed, 3, 19, 0, 0);
-				break;
-			case 4:
-				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 5;
-				Cond1Call(&LogicManager::CONS_Cond1_DoCorrOtis, "601Sc", 3, 0, 0);
-				break;
-			case 5:
-				getCharacter(kCharacterCond1).characterPosition.location = 0;
-				getCharacter(kCharacterCond1).currentCall--;
-				_engine->getMessageManager()->setMessageHandle(kCharacterCond1, _functionsCond1[getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall]]);
-				fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
-				break;
-			case 6:
-				softReleaseAtDoor(kCharacterCond1, 3);
-				setDoor(3, kCharacterCath, 2, 255, 255);
-				getCharacter(kCharacterCond1).characterPosition.location = 1;
-				endGraphics(kCharacterCond1);
-				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 7;
-				Cond1Call(&LogicManager::CONS_Cond1_MakeBed, 3, 19, 0, 0);
-				break;
-			case 7:
-				setDoor(3, kCharacterCath, 1, 255, 255);
-				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 8;
-				Cond1Call(&LogicManager::CONS_Cond1_DoCorrOtis, "601Uc", 3, 0, 0);
-				break;
-			case 8:
-				getCharacter(kCharacterCond1).characterPosition.location = 0;
-				send(kCharacterCond1, kCharacterAugust, 124697504, 0);
-				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 9;
-				Cond1Call(&LogicManager::CONS_Cond1_DoWalk, 3, 540, 0, 0);
-				break;
-			case 9:
-				getCharacter(kCharacterCond1).currentCall--;
-				_engine->getMessageManager()->setMessageHandle(kCharacterCond1, _functionsCond1[getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall]]);
-				fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
-				break;
-			default:
-				break;
+	switch (msg->action) {
+	case 0:
+		if (!getCharacterCurrentParams(kCharacterCond1)[0]) {
+			if (getCharacterCurrentParams(kCharacterCond1)[1] || (getCharacterCurrentParams(kCharacterCond1)[1] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
+				if (getCharacterCurrentParams(kCharacterCond1)[1] >= _currentGameSessionTicks)
+					break;
+
+				getCharacterCurrentParams(kCharacterCond1)[1] = 0x7FFFFFFF;
 			}
+
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 3;
+			Cond1Call(&LogicManager::CONS_Cond1_DoEnterCorrOtis, "601Rc", 3, 6470, 6130);
 		}
-	} else if (msg->action == 12) {
+
+		break;
+	case 12:
 		getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 1;
 		Cond1Call(&LogicManager::CONS_Cond1_DoWalk, 3, 6470, 0, 0);
-	} else if (msg->action == 0 && !getCharacterCurrentParams(kCharacterCond1)[0]) {
-		if (getCharacterCurrentParams(kCharacterCond1)[1] || (getCharacterCurrentParams(kCharacterCond1)[1] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
-			if (getCharacterCurrentParams(kCharacterCond1)[1] >= _currentGameSessionTicks)
-				return;
-
-			getCharacterCurrentParams(kCharacterCond1)[1] = 0x7FFFFFFF;
+		break;
+	case 18:
+		switch (getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8]) {
+		case 1:
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 2;
+			Cond1Call(&LogicManager::CONS_Cond1_DoCorrOtis, "601Mc", 3, 0, 0);
+			break;
+		case 2:
+			send(kCharacterCond1, kCharacterAugust, 221617184, 0);
+			startCycOtis(kCharacterCond1, "601Nc");
+			softBlockAtDoor(kCharacterCond1, 3);
+			break;
+		case 3:
+			softReleaseAtDoor(kCharacterCond1, 3);
+			getCharacter(kCharacterCond1).characterPosition.location = 1;
+			endGraphics(kCharacterCond1);
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 4;
+			Cond1Call(&LogicManager::CONS_Cond1_MakeBed, 3, 19, 0, 0);
+			break;
+		case 4:
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 5;
+			Cond1Call(&LogicManager::CONS_Cond1_DoCorrOtis, "601Sc", 3, 0, 0);
+			break;
+		case 5:
+			getCharacter(kCharacterCond1).characterPosition.location = 0;
+			getCharacter(kCharacterCond1).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterCond1, _functionsCond1[getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall]]);
+			fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
+			break;
+		case 6:
+			softReleaseAtDoor(kCharacterCond1, 3);
+			setDoor(3, kCharacterCath, 2, 255, 255);
+			getCharacter(kCharacterCond1).characterPosition.location = 1;
+			endGraphics(kCharacterCond1);
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 7;
+			Cond1Call(&LogicManager::CONS_Cond1_MakeBed, 3, 19, 0, 0);
+			break;
+		case 7:
+			setDoor(3, kCharacterCath, 1, 255, 255);
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 8;
+			Cond1Call(&LogicManager::CONS_Cond1_DoCorrOtis, "601Uc", 3, 0, 0);
+			break;
+		case 8:
+			getCharacter(kCharacterCond1).characterPosition.location = 0;
+			send(kCharacterCond1, kCharacterAugust, 124697504, 0);
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 9;
+			Cond1Call(&LogicManager::CONS_Cond1_DoWalk, 3, 540, 0, 0);
+			break;
+		case 9:
+			getCharacter(kCharacterCond1).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterCond1, _functionsCond1[getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall]]);
+			fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
+			break;
+		default:
+			break;
 		}
 
-		getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 3;
-		Cond1Call(&LogicManager::CONS_Cond1_DoEnterCorrOtis, "601Rc", 3, 6470, 6130);
+		break;
+	case 100906246:
+		send(kCharacterCond1, kCharacterAugust, 192849856, 0);
+		startCycOtis(kCharacterCond1, "601Qc");
+		break;
+	case 102675536:
+		getCharacterCurrentParams(kCharacterCond1)[0] = 1;
+		break;
+	case 156567128:
+		getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 6;
+		Cond1Call(&LogicManager::CONS_Cond1_DoCorrOtis, "601Tc", 3, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1657,103 +1827,107 @@ void LogicManager::CONS_Cond1_MakeBedAlexei(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Cond1_MakeBedAlexei(HAND_PARAMS) {
-	if (msg->action > 12) {
-		switch (msg->action) {
-		case 18:
-			switch (getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8]) {
-			case 1:
-				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 2;
-				Cond1Call(&LogicManager::CONS_Cond1_DoCorrOtis, "601Vb", 2, 0, 0);
-				break;
-			case 2:
-				send(kCharacterCond1, kCharacterAlexei, 221617184, 0);
-				startCycOtis(kCharacterCond1, "601Wb");
-				softBlockAtDoor(kCharacterCond1, 2);
-				break;
-			case 3:
-				softReleaseAtDoor(kCharacterCond1, 2);
-				getCharacter(kCharacterCond1).characterPosition.location = 1;
-				endGraphics(kCharacterCond1);
+	switch (msg->action) {
+	case 0:
+		if (!getCharacterCurrentParams(kCharacterCond1)[0]) {
+			if (getCharacterCurrentParams(kCharacterCond1)[1] ||
+				(getCharacterCurrentParams(kCharacterCond1)[1] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
+				if (getCharacterCurrentParams(kCharacterCond1)[1] >= _currentGameSessionTicks)
+					break;
 
-				if (_gameProgress[kProgressChapter] == 1 &&
-					getCharacterParams(kCharacterCond1, 8)[3] &&
-					_gameProgress[kProgressField14] != 29) {
-					_gameProgress[kProgressField14] = 3;
-				}
+				getCharacterCurrentParams(kCharacterCond1)[1] = 0x7FFFFFFF;
+			}
 
-				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 4;
-				Cond1Call(&LogicManager::CONS_Cond1_MakeBed, 2, 18, 0, 0);
-				break;
-			case 4:
-				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 5;
-				Cond1Call(&LogicManager::CONS_Cond1_DoCorrOtis, "671Ab", 2, 0, 0);
-				break;
-			case 5:
-				getCharacter(kCharacterCond1).characterPosition.location = 0;
-				getCharacter(kCharacterCond1).currentCall--;
-				_engine->getMessageManager()->setMessageHandle(kCharacterCond1, _functionsCond1[getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall]]);
-				fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
-				break;
-			case 6:
-				softReleaseAtDoor(kCharacterCond1, 2);
-				setDoor(2, kCharacterCath, 2, 255, 255);
-				getCharacter(kCharacterCond1).characterPosition.location = 1;
-				endGraphics(kCharacterCond1);
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 3;
+			Cond1Call(&LogicManager::CONS_Cond1_DoEnterCorrOtis, "601Zb", 2, 7500, 0);
+		}
 
-				if (_gameProgress[kProgressChapter] == 1 &&
-					getCharacterParams(kCharacterCond1, 8)[3] &&
-					_gameProgress[kProgressField14] != 29) {
-					_gameProgress[kProgressField14] = 3;
-				}
+		break;
+	case 12:
+		getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 1;
+		Cond1Call(&LogicManager::CONS_Cond1_DoWalk, 3, 7500, 0, 0);
+		break;
+	case 18:
+		switch (getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8]) {
+		case 1:
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 2;
+			Cond1Call(&LogicManager::CONS_Cond1_DoCorrOtis, "601Vb", 2, 0, 0);
+			break;
+		case 2:
+			send(kCharacterCond1, kCharacterAlexei, 221617184, 0);
+			startCycOtis(kCharacterCond1, "601Wb");
+			softBlockAtDoor(kCharacterCond1, 2);
+			break;
+		case 3:
+			softReleaseAtDoor(kCharacterCond1, 2);
+			getCharacter(kCharacterCond1).characterPosition.location = 1;
+			endGraphics(kCharacterCond1);
 
-				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 7;
-				Cond1Call(&LogicManager::CONS_Cond1_MakeBed, 2, 0x12, 0, 0);
-				break;
-			case 7:
-				playDialog(kCharacterCond1, "Con1024A", -1, 0);
-				setDoor(2, kCharacterCath, 1, 255, 255);
-				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 8;
-				Cond1Call(&LogicManager::CONS_Cond1_DoCorrOtis, "641Ub", 2, 0, 0);
-				break;
-			case 8:
-				getCharacter(kCharacterCond1).characterPosition.location = 0;
-				send(kCharacterCond1, kCharacterAlexei, 124697504, 0);
-				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 9;
-				Cond1Call(&LogicManager::CONS_Cond1_DoWalk, 3, 9460, 0, 0);
-				break;
-			case 9:
-				getCharacter(kCharacterCond1).currentCall--;
-				_engine->getMessageManager()->setMessageHandle(kCharacterCond1, _functionsCond1[getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall]]);
-				fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
-				break;
-			default:
-				break;
+			if (_gameProgress[kProgressChapter] == 1 &&
+				getCharacterParams(kCharacterCond1, 8)[3] &&
+				_gameProgress[kProgressField14] != 29) {
+				_gameProgress[kProgressField14] = 3;
 			}
+
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 4;
+			Cond1Call(&LogicManager::CONS_Cond1_MakeBed, 2, 18, 0, 0);
 			break;
-		case 100906246:
-			getCharacterCurrentParams(kCharacterCond1)[0] = 1;
-			break;
-		case 156567128:
-			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 6;
-			Cond1Call(&LogicManager::CONS_Cond1_DoCorrOtis, "641Tb", 2, 0, 0);
+		case 4:
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 5;
+			Cond1Call(&LogicManager::CONS_Cond1_DoCorrOtis, "671Ab", 2, 0, 0);
 			break;
-		default:
+		case 5:
+			getCharacter(kCharacterCond1).characterPosition.location = 0;
+			getCharacter(kCharacterCond1).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterCond1, _functionsCond1[getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall]]);
+			fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
 			break;
-		}
-	} else if (msg->action == 12) {
-		getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 1;
-		Cond1Call(&LogicManager::CONS_Cond1_DoWalk, 3, 7500, 0, 0);
-	} else if (msg->action == 0 && !getCharacterCurrentParams(kCharacterCond1)[0]) {
-		if (getCharacterCurrentParams(kCharacterCond1)[1] ||
-			(getCharacterCurrentParams(kCharacterCond1)[1] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
-			if (getCharacterCurrentParams(kCharacterCond1)[1] >= _currentGameSessionTicks)
-				return;
+		case 6:
+			softReleaseAtDoor(kCharacterCond1, 2);
+			setDoor(2, kCharacterCath, 2, 255, 255);
+			getCharacter(kCharacterCond1).characterPosition.location = 1;
+			endGraphics(kCharacterCond1);
 
-			getCharacterCurrentParams(kCharacterCond1)[1] = 0x7FFFFFFF;
+			if (_gameProgress[kProgressChapter] == 1 &&
+				getCharacterParams(kCharacterCond1, 8)[3] &&
+				_gameProgress[kProgressField14] != 29) {
+				_gameProgress[kProgressField14] = 3;
+			}
+
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 7;
+			Cond1Call(&LogicManager::CONS_Cond1_MakeBed, 2, 0x12, 0, 0);
+			break;
+		case 7:
+			playDialog(kCharacterCond1, "Con1024A", -1, 0);
+			setDoor(2, kCharacterCath, 1, 255, 255);
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 8;
+			Cond1Call(&LogicManager::CONS_Cond1_DoCorrOtis, "641Ub", 2, 0, 0);
+			break;
+		case 8:
+			getCharacter(kCharacterCond1).characterPosition.location = 0;
+			send(kCharacterCond1, kCharacterAlexei, 124697504, 0);
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 9;
+			Cond1Call(&LogicManager::CONS_Cond1_DoWalk, 3, 9460, 0, 0);
+			break;
+		case 9:
+			getCharacter(kCharacterCond1).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterCond1, _functionsCond1[getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall]]);
+			fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
+			break;
+		default:
+			break;
 		}
 
-		getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 3;
-		Cond1Call(&LogicManager::CONS_Cond1_DoEnterCorrOtis, "601Zb", 2, 7500, 0);
+		break;
+	case 100906246:
+		getCharacterCurrentParams(kCharacterCond1)[0] = 1;
+		break;
+	case 156567128:
+		getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 6;
+		Cond1Call(&LogicManager::CONS_Cond1_DoCorrOtis, "641Tb", 2, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1770,7 +1944,8 @@ void LogicManager::CONS_Cond1_SubMakeBed(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Cond1_SubMakeBed(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		if (!_gameProgress[kProgressEventCorpseThrown] &&
 			getCharacterCurrentParams(kCharacterCond1)[0] &&
 			_gameProgress[kProgressChapter] == 1 && _gameProgress[kProgressJacket] == 2) {
@@ -1779,19 +1954,21 @@ void LogicManager::HAND_Cond1_SubMakeBed(HAND_PARAMS) {
 		} else {
 			getCharacter(kCharacterCond1).characterPosition.location = 1;
 			endGraphics(kCharacterCond1);
-			setDoor(1, 0, checkDoor(1), 0, 0);
+			setDoor(1, kCharacterCath, checkDoor(1), 0, 0);
 			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 3;
 			Cond1Call(&LogicManager::CONS_Cond1_DoDialogFullVol, "ZNU1001", 0, 0, 0);
 		}
-	} else if (msg->action == 18) {
+
+		break;
+	case 18:
 		switch (getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8]) {
 		case 1:
-			setDoor(1, 0, checkDoor(1), 0, 0);
+			setDoor(1, kCharacterCath, checkDoor(1), 0, 0);
 			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 2;
 			Cond1Call(&LogicManager::CONS_Cond1_DoDialogFullVol, "CON1062", 0, 0, 0);
 			break;
 		case 2:
-			setDoor(1, 0, checkDoor(1), 10, 9);
+			setDoor(1, kCharacterCath, checkDoor(1), 10, 9);
 
 			getCharacter(kCharacterCond1).currentCall--;
 			_engine->getMessageManager()->setMessageHandle(kCharacterCond1, _functionsCond1[getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall]]);
@@ -1800,7 +1977,7 @@ void LogicManager::HAND_Cond1_SubMakeBed(HAND_PARAMS) {
 		case 3:
 			if (_gameProgress[kProgressJacket] == 1) {
 				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 4;
-				Cond1Call(&LogicManager::CONS_Cond1_SaveGame, 2, 123, 0, 0);
+				Cond1Call(&LogicManager::CONS_Cond1_SaveGame, 2, kEventMertensBloodJacket, 0, 0);
 			} else if (_gameProgress[kProgressEventCorpseMovedFromFloor]) {
 				blockAtDoor(kCharacterCond1, 1);
 				startSeqOtis(kCharacterCond1, "601Ra");
@@ -1809,7 +1986,7 @@ void LogicManager::HAND_Cond1_SubMakeBed(HAND_PARAMS) {
 				Cond1Call(&LogicManager::CONS_Cond1_FinishSeqOtis, 0, 0, 0, 0);
 			} else {
 				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 5;
-				Cond1Call(&LogicManager::CONS_Cond1_SaveGame, 2, 125, 0, 0);
+				Cond1Call(&LogicManager::CONS_Cond1_SaveGame, 2, kEventMertensCorpseFloor, 0, 0);
 			}
 
 			break;
@@ -1840,7 +2017,7 @@ void LogicManager::HAND_Cond1_SubMakeBed(HAND_PARAMS) {
 					bumpCath(kCarNone, 1, 255);
 
 				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 8;
-				Cond1Call(&LogicManager::CONS_Cond1_SaveGame, 2, 126, 0, 0);
+				Cond1Call(&LogicManager::CONS_Cond1_SaveGame, 2, kEventMertensCorpseBed, 0, 0);
 			}
 
 			break;
@@ -1859,6 +2036,10 @@ void LogicManager::HAND_Cond1_SubMakeBed(HAND_PARAMS) {
 		default:
 			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1875,84 +2056,41 @@ void LogicManager::CONS_Cond1_EnterTyler(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Cond1_EnterTyler(HAND_PARAMS) {
-	if (msg->action <= 18) {
-
-		switch (msg->action) {
-		case 0:
+	switch (msg->action) {
+	case 0:
+	case 10:
+		if (msg->action == 0) {
 			if (_gameProgress[kProgressField14] == 29) {
-			LABEL_4:
 				getCharacter(kCharacterCond1).currentCall--;
 				_engine->getMessageManager()->setMessageHandle(kCharacterCond1, _functionsCond1[getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall]]);
 				fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
-				return;
+				break;
 			}
 
 			if (!getCharacterCurrentParams(kCharacterCond1)[1]) {
 				getCharacterCurrentParams(kCharacterCond1)[1] = _currentGameSessionTicks + 150;
-				if (_currentGameSessionTicks == -150)
-					goto LABEL_9;
+				if (_currentGameSessionTicks == -150) {
+					setDoor(1, kCharacterCath, checkDoor(1), 0, 0);
+					getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 10;
+					Cond1Call(&LogicManager::CONS_Cond1_DoDialogFullVol, "CON1018A", 0, 0, 0);
+					break;
+				}
 			}
 
 			if (getCharacterCurrentParams(kCharacterCond1)[1] < _currentGameSessionTicks) {
 				getCharacterCurrentParams(kCharacterCond1)[1] = 0x7FFFFFFF;
-			LABEL_9:
 				setDoor(1, kCharacterCath, checkDoor(1), 0, 0);
 				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 10;
 				Cond1Call(&LogicManager::CONS_Cond1_DoDialogFullVol, "CON1018A", 0, 0, 0);
-				return;
-			}
-
-		LABEL_61:
-			if (!getCharacterCurrentParams(kCharacterCond1)[2]) {
-				getCharacterCurrentParams(kCharacterCond1)[2] = _currentGameSessionTicks + 300;
-				if (_currentGameSessionTicks == -300)
-					goto LABEL_65;
+				break;
 			}
+		} else if (msg->action == 10) {
+			setDoor(1, kCharacterCond1, checkDoor(1), 14, 9);
+		}
 
-			if (getCharacterCurrentParams(kCharacterCond1)[2] >= _currentGameSessionTicks) {
-			LABEL_83:
-				if (getCharacterCurrentParams(kCharacterCond1)[3] || (getCharacterCurrentParams(kCharacterCond1)[3] = _currentGameSessionTicks + 375, _currentGameSessionTicks != -375)) {
-					if (getCharacterCurrentParams(kCharacterCond1)[3] >= _currentGameSessionTicks)
-						return;
-
-					getCharacterCurrentParams(kCharacterCond1)[3] = 0x7FFFFFFF;
-				}
-
-				playDialog(0, "LIB033", -1, 0);
-
-				if (_gameProgress[kProgressEventCorpseMovedFromFloor]) {
-					if (_gameProgress[kProgressJacket] == 1) {
-						getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 18;
-						Cond1Call(&LogicManager::CONS_Cond1_SaveGame, 2, 123, 0, 0);
-					} else if (getCharacterCurrentParams(kCharacterCond1)[0]) {
-						setDoor(1, kCharacterCath, 0, 10, 9);
-
-						if (getCharacterCurrentParams(kCharacterCond1)[0] == 1) {
-							getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 20;
-							Cond1Call(&LogicManager::CONS_Cond1_SaveGame, 2, 143, 0, 0);
-						} else {
-							if (getCharacterCurrentParams(kCharacterCond1)[0] != 2) {
-								if (getCharacterCurrentParams(kCharacterCond1)[0] != 3)
-									goto LABEL_115;
-								goto LABEL_33;
-							}
-
-							getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 21;
-							Cond1Call(&LogicManager::CONS_Cond1_SaveGame, 2, 0x79, 0, 0);
-						}
-					} else {
-						getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 19;
-						Cond1Call(&LogicManager::CONS_Cond1_SubMakeBed, 0, 0, 0, 0);
-					}
-				} else {
-					if (!checkLoc(kCharacterCath, 3))
-						bumpCath(kCarNone, 1, 255);
-					getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 17;
-					Cond1Call(&LogicManager::CONS_Cond1_SaveGame, 2, 125, 0, 0);
-				}
-			} else {
-				getCharacterCurrentParams(kCharacterCond1)[2] = 0x7FFFFFFF;
-			LABEL_65:
+		if (!getCharacterCurrentParams(kCharacterCond1)[2]) {
+			getCharacterCurrentParams(kCharacterCond1)[2] = _currentGameSessionTicks + 300;
+			if (_currentGameSessionTicks == -300) {
 				if (checkDoor(1) == 1) {
 					setDoor(1, kCharacterCath, checkDoor(1), 0, 0);
 					getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 11;
@@ -1962,22 +2100,42 @@ void LogicManager::HAND_Cond1_EnterTyler(HAND_PARAMS) {
 					if (_gameProgress[kProgressEventCorpseMovedFromFloor]) {
 						if (_gameProgress[kProgressJacket] == 1) {
 							getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 13;
-							Cond1Call(&LogicManager::CONS_Cond1_SaveGame, 2, 123, 0, 0);
+							Cond1Call(&LogicManager::CONS_Cond1_SaveGame, 2, kEventMertensBloodJacket, 0, 0);
 						} else if (getCharacterCurrentParams(kCharacterCond1)[0]) {
 							setDoor(1, kCharacterCath, 0, 10, 9);
 
 							if (getCharacterCurrentParams(kCharacterCond1)[0] == 1) {
 								getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 15;
-								Cond1Call(&LogicManager::CONS_Cond1_SaveGame, 2, 143, 0, 0);
+								Cond1Call(&LogicManager::CONS_Cond1_SaveGame, 2, kEventMertensAugustWaitingCompartment, 0, 0);
 							} else {
 								if (getCharacterCurrentParams(kCharacterCond1)[0] != 2) {
-									if (getCharacterCurrentParams(kCharacterCond1)[0] != 3)
-										goto LABEL_115;
-									goto LABEL_33;
+									if (getCharacterCurrentParams(kCharacterCond1)[0] != 3) {
+										playDialog(0, "LIB015", -1, 0);
+										bumpCathTylerComp();
+
+										getCharacter(kCharacterCond1).currentCall--;
+										_engine->getMessageManager()->setMessageHandle(kCharacterCond1, _functionsCond1[getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall]]);
+										fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
+										break;
+									}
+
+									if (isNight()) {
+										playNIS(kEventMertensPushCallNight);
+									} else {
+										playNIS(kEventMertensPushCall);
+									}
+
+									playDialog(0, "LIB015", -1, 0);
+									bumpCathTylerComp();
+
+									getCharacter(kCharacterCond1).currentCall--;
+									_engine->getMessageManager()->setMessageHandle(kCharacterCond1, _functionsCond1[getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall]]);
+									fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
+									break;
 								}
 
 								getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 16;
-								Cond1Call(&LogicManager::CONS_Cond1_SaveGame, 2, 121, 0, 0);
+								Cond1Call(&LogicManager::CONS_Cond1_SaveGame, 2, kEventMertensKronosInvitationCompartment, 0, 0);
 							}
 						} else {
 							getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 14;
@@ -1988,1091 +2146,995 @@ void LogicManager::HAND_Cond1_EnterTyler(HAND_PARAMS) {
 							bumpCath(kCarNone, 1, 255);
 
 						getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 12;
-						Cond1Call(&LogicManager::CONS_Cond1_SaveGame, 2, 125, 0, 0);
+						Cond1Call(&LogicManager::CONS_Cond1_SaveGame, 2, kEventMertensCorpseFloor, 0, 0);
 					}
 				}
 			}
-			break;
-		case 8:
-			if (getCharacterCurrentParams(kCharacterCond1)[0]) {
-				setDoor(1, kCharacterCath, checkDoor(1), 0, 0);
+		}
 
-				if (getCharacterCurrentParams(kCharacterCond1)[0] == 1) {
-					getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 23;
-					Cond1Call(&LogicManager::CONS_Cond1_DoDialogFullVol, "CON1018D", 0, 0, 0);
-				} else if (getCharacterCurrentParams(kCharacterCond1)[0] == 2) {
-					getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 24;
-					Cond1Call(&LogicManager::CONS_Cond1_DoDialogFullVol, "CON1018E", 0, 0, 0);
-				} else if (getCharacterCurrentParams(kCharacterCond1)[0] == 3) {
-					getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 25;
-					Cond1Call(&LogicManager::CONS_Cond1_DoDialogFullVol, "CON1025", 0, 0, 0);
-				} else {
-				LABEL_109:
-					setDoor(1, kCharacterCath, checkDoor(1), 10, 9);
+		if (getCharacterCurrentParams(kCharacterCond1)[2] >= _currentGameSessionTicks) {
+			if (getCharacterCurrentParams(kCharacterCond1)[3] || (getCharacterCurrentParams(kCharacterCond1)[3] = _currentGameSessionTicks + 375, _currentGameSessionTicks != -375)) {
+				if (getCharacterCurrentParams(kCharacterCond1)[3] >= _currentGameSessionTicks)
+					break;
 
-					getCharacter(kCharacterCond1).currentCall--;
-					_engine->getMessageManager()->setMessageHandle(kCharacterCond1, _functionsCond1[getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall]]);
-					fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
-				}
-			} else {
-				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 22;
-				Cond1Call(&LogicManager::CONS_Cond1_SubMakeBed, 1, 0, 0, 0);
+				getCharacterCurrentParams(kCharacterCond1)[3] = 0x7FFFFFFF;
 			}
 
-			return;
-		case 9:
-			if (checkDoor(1) != 1) {
-				playDialog(0, "LIB014", -1, 0);
-			} else {
-				playDialog(0, "LIB032", -1, 0);
-			}
+			playDialog(0, "LIB033", -1, 0);
 
 			if (_gameProgress[kProgressEventCorpseMovedFromFloor]) {
 				if (_gameProgress[kProgressJacket] == 1) {
-					getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 27;
-					Cond1Call(&LogicManager::CONS_Cond1_SaveGame, 2, 123, 0, 0);
+					getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 18;
+					Cond1Call(&LogicManager::CONS_Cond1_SaveGame, 2, kEventMertensBloodJacket, 0, 0);
 				} else if (getCharacterCurrentParams(kCharacterCond1)[0]) {
 					setDoor(1, kCharacterCath, 0, 10, 9);
 
 					if (getCharacterCurrentParams(kCharacterCond1)[0] == 1) {
-						getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 29;
-						Cond1Call(&LogicManager::CONS_Cond1_SaveGame, 2, 143, 0, 0);
-					} else if (getCharacterCurrentParams(kCharacterCond1)[0] == 2) {
-						getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 30;
-						Cond1Call(&LogicManager::CONS_Cond1_SaveGame, 2, 121, 0, 0);
+						getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 20;
+						Cond1Call(&LogicManager::CONS_Cond1_SaveGame, 2, kEventMertensAugustWaitingCompartment, 0, 0);
 					} else {
-						if (getCharacterCurrentParams(kCharacterCond1)[0] == 3) {
-						LABEL_33:
+						if (getCharacterCurrentParams(kCharacterCond1)[0] != 2) {
+							if (getCharacterCurrentParams(kCharacterCond1)[0] != 3) {
+								playDialog(0, "LIB015", -1, 0);
+								bumpCathTylerComp();
+
+								getCharacter(kCharacterCond1).currentCall--;
+								_engine->getMessageManager()->setMessageHandle(kCharacterCond1, _functionsCond1[getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall]]);
+								fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
+								break;
+							}
+
 							if (isNight()) {
 								playNIS(kEventMertensPushCallNight);
 							} else {
 								playNIS(kEventMertensPushCall);
 							}
+
+							playDialog(0, "LIB015", -1, 0);
+							bumpCathTylerComp();
+
+							getCharacter(kCharacterCond1).currentCall--;
+							_engine->getMessageManager()->setMessageHandle(kCharacterCond1, _functionsCond1[getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall]]);
+							fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
+							break;
 						}
-					LABEL_115:
-						playDialog(0, "LIB015", -1, 0);
-						bumpCathTylerComp();
 
-						getCharacter(kCharacterCond1).currentCall--;
-						_engine->getMessageManager()->setMessageHandle(kCharacterCond1, _functionsCond1[getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall]]);
-						fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
+						getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 21;
+						Cond1Call(&LogicManager::CONS_Cond1_SaveGame, 2, kEventMertensKronosInvitationCompartment, 0, 0);
 					}
 				} else {
-					getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 28;
+					getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 19;
 					Cond1Call(&LogicManager::CONS_Cond1_SubMakeBed, 0, 0, 0, 0);
 				}
 			} else {
 				if (!checkLoc(kCharacterCath, 3))
 					bumpCath(kCarNone, 1, 255);
 
-				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 26;
-				Cond1Call(&LogicManager::CONS_Cond1_SaveGame, 2, 125, 0, 0);
+				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 17;
+				Cond1Call(&LogicManager::CONS_Cond1_SaveGame, 2, kEventMertensCorpseFloor, 0, 0);
 			}
+		} else {
+			getCharacterCurrentParams(kCharacterCond1)[2] = 0x7FFFFFFF;
 
-			return;
-		case 12:
-			getCharacter(kCharacterCond1).inventoryItem = kItemNone;
-			if (inComp(kCharacterCath, kCarGreenSleeping, 8200) ||
-				inComp(kCharacterCath, kCarGreenSleeping, 7850) ||
-				cathOutHisWindow()) {
-
+			if (checkDoor(1) == 1) {
 				setDoor(1, kCharacterCath, checkDoor(1), 0, 0);
-				if (cathOutHisWindow())
-					bumpCath(kCarGreenSleeping, 49, 255);
-				if (getCharacterCurrentParams(kCharacterCond1)[0]) {
-					getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 9;
-					Cond1Call(&LogicManager::CONS_Cond1_DoDialogFullVol, "CON1018", 0, 0, 0);
-				} else {
-					getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 8;
-					Cond1Call(&LogicManager::CONS_Cond1_DoDialogFullVol, "CON1060", 0, 0, 0);
-				}
+				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 11;
+				Cond1Call(&LogicManager::CONS_Cond1_DoDialogFullVol, "CON1018B", 0, 0, 0);
 			} else {
-				playDialog(kCharacterCond1, "CON1019", -1, 0);
-				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 1;
-				Cond1Call(&LogicManager::CONS_Cond1_DoCorrOtis, "601Ma", 1, 0, 0);
-			}
-			return;
-		case 18:
-			switch (getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8]) {
-			case 1:
+				playDialog(0, "LIB014", -1, 0);
 				if (_gameProgress[kProgressEventCorpseMovedFromFloor]) {
-					getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 4;
-					Cond1Call(&LogicManager::CONS_Cond1_DoCorrOtis, "601Ra", 1, 0, 0);
-				} else if (checkLoc(kCharacterCath, 3)) {
-					getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 2;
-					Cond1Call(&LogicManager::CONS_Cond1_DoBriefCorrOtis, "601Ra", 1, 0, 0);
-				} else {
-					bumpCath(kCarNone, 1, 255);
-				LABEL_48:
-					getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 3;
-					Cond1Call(&LogicManager::CONS_Cond1_SaveGame, 2, 125, 0, 0);
-				}
-				break;
-			case 2:
-				goto LABEL_48;
-			case 3:
-			case 12:
-			case 17:
-			case 26:
-				playNIS(kEventMertensCorpseFloor);
-				endGame(0, 1, _gameProgress[kProgressEventFoundCorpse] == 0 ? 56 : 50, true);
-				return;
-			case 4:
-				setDoor(1, kCharacterCath, 1, 0, 0);
-				getCharacter(kCharacterCond1).characterPosition.location = 1;
-				endGraphics(kCharacterCond1);
-				if (getCharacterCurrentParams(kCharacterCond1)[0])
-					goto LABEL_116;
-				if (_gameProgress[kProgressEventCorpseThrown] || _gameProgress[kProgressChapter] != 1) {
-					getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 6;
-					Cond1Call(&LogicManager::CONS_Cond1_MakeBed, 1, 17, 0, 0);
+					if (_gameProgress[kProgressJacket] == 1) {
+						getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 13;
+						Cond1Call(&LogicManager::CONS_Cond1_SaveGame, 2, kEventMertensBloodJacket, 0, 0);
+					} else if (getCharacterCurrentParams(kCharacterCond1)[0]) {
+						setDoor(1, kCharacterCath, 0, 10, 9);
+
+						if (getCharacterCurrentParams(kCharacterCond1)[0] == 1) {
+							getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 15;
+							Cond1Call(&LogicManager::CONS_Cond1_SaveGame, 2, kEventMertensAugustWaitingCompartment, 0, 0);
+						} else {
+							if (getCharacterCurrentParams(kCharacterCond1)[0] != 2) {
+								if (getCharacterCurrentParams(kCharacterCond1)[0] != 3) {
+									playDialog(0, "LIB015", -1, 0);
+									bumpCathTylerComp();
+
+									getCharacter(kCharacterCond1).currentCall--;
+									_engine->getMessageManager()->setMessageHandle(kCharacterCond1, _functionsCond1[getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall]]);
+									fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
+									break;
+								}
+
+								if (isNight()) {
+									playNIS(kEventMertensPushCallNight);
+								} else {
+									playNIS(kEventMertensPushCall);
+								}
+
+								playDialog(0, "LIB015", -1, 0);
+								bumpCathTylerComp();
+
+								getCharacter(kCharacterCond1).currentCall--;
+								_engine->getMessageManager()->setMessageHandle(kCharacterCond1, _functionsCond1[getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall]]);
+								fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
+								break;
+							}
+
+							getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 16;
+							Cond1Call(&LogicManager::CONS_Cond1_SaveGame, 2, kEventMertensKronosInvitationCompartment, 0, 0);
+						}
+					} else {
+						getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 14;
+						Cond1Call(&LogicManager::CONS_Cond1_SubMakeBed, 0, 0, 0, 0);
+					}
 				} else {
 					if (!checkLoc(kCharacterCath, 3))
 						bumpCath(kCarNone, 1, 255);
-					getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 5;
-					Cond1Call(&LogicManager::CONS_Cond1_SaveGame, 2, 126, 0, 0);
-				}
-				break;
-			case 5:
-				playNIS(kEventMertensCorpseBed);
-				endGame(0, 1, 57, true);
-				return;
-			case 6:
-			LABEL_116:
-				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 7;
-				Cond1Call(&LogicManager::CONS_Cond1_DoCorrOtis, "601Sa", 1, 0, 0);
-				break;
-			case 7:
-				getCharacter(kCharacterCond1).characterPosition.location = 0;
-				setDoor(1, kCharacterCath, 0, 10, 9);
 
-				getCharacter(kCharacterCond1).currentCall--;
-				_engine->getMessageManager()->setMessageHandle(kCharacterCond1, _functionsCond1[getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall]]);
-				fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
-				break;
-			case 8:
-			case 9:
-				setDoor(1, kCharacterCond1, checkDoor(1), 14, 9);
-				break;
-			case 10:
-				setDoor(1, kCharacterCond1, checkDoor(1), 14, 9);
-				goto LABEL_61;
-			case 11:
-				setDoor(1, kCharacterCond1, checkDoor(1), 14, 9);
-				goto LABEL_83;
-			case 13:
-				playNIS(kEventMertensBloodJacket);
-				endGame(0, 1, 55, 1);
-				goto LABEL_83;
-			case 14:
-			case 19:
-			case 22:
-			case 28:
-				goto LABEL_4;
-			case 15:
-				playNIS(kEventMertensAugustWaitingCompartment);
-				_gameProgress[kProgressEventMertensAugustWaiting] = 1;
-				goto LABEL_115;
-			case 16:
-				playNIS(kEventMertensKronosInvitationCompartment);
-				_gameProgress[kProgressEventMertensChronosInvitation] = 1;
-				goto LABEL_115;
-			case 18:
-			case 27:
-				playNIS(kEventMertensBloodJacket);
-				endGame(0, 1, 55, true);
-				break;
-			case 20:
-				playNIS(kEventMertensAugustWaitingCompartment);
-				_gameProgress[kProgressEventMertensAugustWaiting] = 1;
-				goto LABEL_115;
-			case 21:
-				playNIS(kEventMertensKronosInvitationCompartment);
-				_gameProgress[kProgressEventMertensChronosInvitation] = 1;
-				goto LABEL_115;
-			case 23:
-				_gameProgress[kProgressEventMertensAugustWaiting] = 1;
-				goto LABEL_109;
-			case 24:
-				_gameProgress[kProgressEventMertensChronosInvitation] = 1;
-				goto LABEL_109;
-			case 25:
-				goto LABEL_109;
-			case 29:
-				playNIS(kEventMertensAugustWaitingCompartment);
-				_gameProgress[kProgressEventMertensAugustWaiting] = 1;
-				goto LABEL_115;
-			case 30:
-				playNIS(kEventMertensKronosInvitationCompartment);
-				_gameProgress[kProgressEventMertensChronosInvitation] = 1;
-				goto LABEL_115;
-			default:
-				return;
+					getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 12;
+					Cond1Call(&LogicManager::CONS_Cond1_SaveGame, 2, kEventMertensCorpseFloor, 0, 0);
+				}
 			}
-			return;
-		default:
-			return;
 		}
-	}
-}
-
-void LogicManager::CONS_Cond1_VisitCond2(CONS_PARAMS) {
-	CharacterCallParams *params = &getCharacter(kCharacterCond1).callParams[getCharacter(kCharacterCond1).currentCall];
-	_engine->getMessageManager()->setMessageHandle(kCharacterCond1, &LogicManager::HAND_Cond1_VisitCond2);
-	getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall] = 28;
-
-	params->clear();
 
-	strncpy((char *)&params->parameters[0], param1.stringParam, 12);
+		break;
+	case 8:
+		if (getCharacterCurrentParams(kCharacterCond1)[0]) {
+			setDoor(1, kCharacterCath, checkDoor(1), 0, 0);
 
-	fedEx(kCharacterCond1, kCharacterCond1, 12, 0);
-}
+			if (getCharacterCurrentParams(kCharacterCond1)[0] == 1) {
+				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 23;
+				Cond1Call(&LogicManager::CONS_Cond1_DoDialogFullVol, "CON1018D", 0, 0, 0);
+			} else if (getCharacterCurrentParams(kCharacterCond1)[0] == 2) {
+				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 24;
+				Cond1Call(&LogicManager::CONS_Cond1_DoDialogFullVol, "CON1018E", 0, 0, 0);
+			} else if (getCharacterCurrentParams(kCharacterCond1)[0] == 3) {
+				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 25;
+				Cond1Call(&LogicManager::CONS_Cond1_DoDialogFullVol, "CON1025", 0, 0, 0);
+			} else {
+				setDoor(1, kCharacterCath, checkDoor(1), 10, 9);
 
-void LogicManager::HAND_Cond1_VisitCond2(HAND_PARAMS) {
-	if (msg->action > 12) {
-		switch (msg->action) {
-		case 18:
-			switch (getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8]) {
-			case 1:
-				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 2;
-				Cond1Call(&LogicManager::CONS_Cond1_DoWalk, 4, 1500, 0, 0);
-				break;
-			case 2:
-				startCycOtis(kCharacterCond1, "601O");
-				send(kCharacterCond1, kCharacterCond2, 154005632, 0);
-				break;
-			case 3:
-				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 4;
-				Cond1Call(&LogicManager::CONS_Cond1_SitDown, 0, 0, 0, 0);
-				break;
-			case 4:
 				getCharacter(kCharacterCond1).currentCall--;
 				_engine->getMessageManager()->setMessageHandle(kCharacterCond1, _functionsCond1[getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall]]);
 				fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
-				break;
-			default:
-				return;
 			}
-			break;
-		case 155853632:
-			getCharacterCurrentParams(kCharacterCond1)[4] = 1;
-			break;
-		case 202558662:
-			startCycOtis(kCharacterCond1, "601L");
-			playDialog(kCharacterCond1, (char *)&getCharacterCurrentParams(kCharacterCond1)[0], -1, 0);
-			break;
+		} else {
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 22;
+			Cond1Call(&LogicManager::CONS_Cond1_SubMakeBed, 1, 0, 0, 0);
 		}
-	} else if (msg->action == 12) {
-		getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 1;
-		Cond1Call(&LogicManager::CONS_Cond1_GetUp, 0, 0, 0, 0);
-	} else if (msg->action) {
-		if (msg->action == 2)
-			getCharacterCurrentParams(kCharacterCond1)[3] = 1;
-	} else if (getCharacterCurrentParams(kCharacterCond1)[3] && getCharacterCurrentParams(kCharacterCond1)[4]) {
-		send(kCharacterCond1, kCharacterCond2, 125499160, 0);
-		getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 3;
-		Cond1Call(&LogicManager::CONS_Cond1_DoWalk, 3, 2000, 0, 0);
-	}
-}
 
-void LogicManager::CONS_Cond1_VisitCond2Double(CONS_PARAMS) {
-	CharacterCallParams *params = &getCharacter(kCharacterCond1).callParams[getCharacter(kCharacterCond1).currentCall];
-	_engine->getMessageManager()->setMessageHandle(kCharacterCond1, &LogicManager::HAND_Cond1_VisitCond2Double);
-	getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall] = 29;
+		break;
+	case 9:
+		if (checkDoor(1) != 1) {
+			playDialog(0, "LIB014", -1, 0);
+		} else {
+			playDialog(0, "LIB032", -1, 0);
+		}
 
-	params->clear();
+		if (_gameProgress[kProgressEventCorpseMovedFromFloor]) {
+			if (_gameProgress[kProgressJacket] == 1) {
+				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 27;
+				Cond1Call(&LogicManager::CONS_Cond1_SaveGame, 2, kEventMertensBloodJacket, 0, 0);
+			} else if (getCharacterCurrentParams(kCharacterCond1)[0]) {
+				setDoor(1, kCharacterCath, 0, 10, 9);
 
-	strncpy((char *)&params->parameters[0], param1.stringParam, 12);
-	strncpy((char *)&params->parameters[3], param2.stringParam, 12);
+				if (getCharacterCurrentParams(kCharacterCond1)[0] == 1) {
+					getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 29;
+					Cond1Call(&LogicManager::CONS_Cond1_SaveGame, 2, kEventMertensAugustWaitingCompartment, 0, 0);
+				} else if (getCharacterCurrentParams(kCharacterCond1)[0] == 2) {
+					getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 30;
+					Cond1Call(&LogicManager::CONS_Cond1_SaveGame, 2, kEventMertensKronosInvitationCompartment, 0, 0);
+				} else {
+					if (getCharacterCurrentParams(kCharacterCond1)[0] == 3) {
+						if (isNight()) {
+							playNIS(kEventMertensPushCallNight);
+						} else {
+							playNIS(kEventMertensPushCall);
+						}
+					}
 
-	fedEx(kCharacterCond1, kCharacterCond1, 12, 0);
-}
+					playDialog(0, "LIB015", -1, 0);
+					bumpCathTylerComp();
 
-void LogicManager::HAND_Cond1_VisitCond2Double(HAND_PARAMS) {
-	if (msg->action > 12) {
-		switch (msg->action) {
-		case 18:
-			switch (getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8]) {
-			case 1:
-				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 2;
-				Cond1Call(&LogicManager::CONS_Cond1_DoWalk, 4, 1500, 0, 0);
-				break;
-			case 2:
-				startCycOtis(kCharacterCond1, "601O");
-				send(kCharacterCond1, kCharacterCond2, 154005632, 0);
-				break;
-			case 3:
-				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 4;
-				Cond1Call(&LogicManager::CONS_Cond1_SitDown, 0, 0, 0, 0);
-				break;
-			case 4:
-				getCharacter(kCharacterCond1).currentCall--;
-				_engine->getMessageManager()->setMessageHandle(kCharacterCond1, _functionsCond1[getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall]]);
-				fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
-				break;
-			default:
-				return;
+					getCharacter(kCharacterCond1).currentCall--;
+					_engine->getMessageManager()->setMessageHandle(kCharacterCond1, _functionsCond1[getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall]]);
+					fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
+				}
+			} else {
+				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 28;
+				Cond1Call(&LogicManager::CONS_Cond1_SubMakeBed, 0, 0, 0, 0);
 			}
-			break;
-		case 155853632:
-			getCharacterCurrentParams(kCharacterCond1)[7] = 1;
-			break;
-		case 202558662:
-			startCycOtis(kCharacterCond1, "601L");
-			playDialog(kCharacterCond1, (char *)&getCharacterCurrentParams(kCharacterCond1)[0], -1, 0);
-			break;
-		}
-	} else if (msg->action == 12) {
-		getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 1;
-		Cond1Call(&LogicManager::CONS_Cond1_GetUp, 0, 0, 0, 0);
-	} else if (msg->action) {
-		if (msg->action == 2) {
-			getCharacterCurrentParams(kCharacterCond1)[6]++;
-			if (getCharacterCurrentParams(kCharacterCond1)[6] == 1)
-				playDialog(kCharacterCond1, (char *)&getCharacterCurrentParams(kCharacterCond1)[3], -1, 0);
-		}
-	} else if (getCharacterCurrentParams(kCharacterCond1)[6] > 1 && getCharacterCurrentParams(kCharacterCond1)[7]) {
-		send(kCharacterCond1, kCharacterCond2, 125499160, 0);
-		getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 3;
-		Cond1Call(&LogicManager::CONS_Cond1_DoWalk, 3, 2000, 0, 0);
-	}
-}
-
-void LogicManager::CONS_Cond1_CathBuzzing(CONS_PARAMS) {
-	CharacterCallParams *params = &getCharacter(kCharacterCond1).callParams[getCharacter(kCharacterCond1).currentCall];
-	_engine->getMessageManager()->setMessageHandle(kCharacterCond1, &LogicManager::HAND_Cond1_CathBuzzing);
-	getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall] = 30;
-
-	params->clear();
-
-	params->parameters[0] = param1.intParam;
-
-	fedEx(kCharacterCond1, kCharacterCond1, 12, 0);
-}
-
-void LogicManager::HAND_Cond1_CathBuzzing(HAND_PARAMS) {
-	if (msg->action == 12) {
-		if (getCharacterCurrentParams(kCharacterCond1)[0] == 1) {
-			getCharacterCurrentParams(kCharacterCond1)[1] = 8200;
-		} else if (getCharacterCurrentParams(kCharacterCond1)[0] == 2) {
-			getCharacterCurrentParams(kCharacterCond1)[1] = 7500;
 		} else {
-			if (getCharacterCurrentParams(kCharacterCond1)[0] != 3) {
-			LABEL_42:
-				getCharacter(kCharacterCond1).currentCall--;
-				_engine->getMessageManager()->setMessageHandle(kCharacterCond1, _functionsCond1[getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall]]);
-				fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
-				return;
-			}
+			if (!checkLoc(kCharacterCath, 3))
+				bumpCath(kCarNone, 1, 255);
 
-			getCharacterCurrentParams(kCharacterCond1)[1] = 6470;
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 26;
+			Cond1Call(&LogicManager::CONS_Cond1_SaveGame, 2, kEventMertensCorpseFloor, 0, 0);
 		}
 
-		if (getCharacterCurrentParams(kCharacterCond1)[0] == 1) {
-			if (_gameProgress[kProgressField14]) {
-				getCharacter(kCharacterCond1).currentCall--;
-				_engine->getMessageManager()->setMessageHandle(kCharacterCond1, _functionsCond1[getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall]]);
-				fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
-				return;
-			}
+		break;
+	case 12:
+		getCharacter(kCharacterCond1).inventoryItem = kItemNone;
+		if (inComp(kCharacterCath, kCarGreenSleeping, 8200) ||
+			inComp(kCharacterCath, kCarGreenSleeping, 7850) ||
+			cathOutHisWindow()) {
 
-			_gameProgress[kProgressField14] = 3;
+			setDoor(1, kCharacterCath, checkDoor(1), 0, 0);
+			if (cathOutHisWindow())
+				bumpCath(kCarGreenSleeping, 49, 255);
+			if (getCharacterCurrentParams(kCharacterCond1)[0]) {
+				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 9;
+				Cond1Call(&LogicManager::CONS_Cond1_DoDialogFullVol, "CON1018", 0, 0, 0);
+			} else {
+				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 8;
+				Cond1Call(&LogicManager::CONS_Cond1_DoDialogFullVol, "CON1060", 0, 0, 0);
+			}
+		} else {
+			playDialog(kCharacterCond1, "CON1019", -1, 0);
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 1;
+			Cond1Call(&LogicManager::CONS_Cond1_DoCorrOtis, "601Ma", 1, 0, 0);
 		}
 
-		getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 1;
-		Cond1Call(&LogicManager::CONS_Cond1_GetUp, 0, 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8]) {
 		case 1:
-			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 2;
-			Cond1Call(&LogicManager::CONS_Cond1_DoWalk, 3, getCharacterCurrentParams(kCharacterCond1)[1], 0, 0);
-			return;
-		case 2:
-			if (getCharacterCurrentParams(kCharacterCond1)[0] == 1) {
-				if (_gameProgress[kProgressChapter] == 4)
-					send(kCharacterCond1, kCharacterTatiana, 238790488, 0);
-				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 3;
-				Cond1Call(&LogicManager::CONS_Cond1_EnterTyler, 3, 0, 0, 0);
-			} else if (getCharacterCurrentParams(kCharacterCond1)[0] == 2) {
-				if (inComp(kCharacterCath, kCarGreenSleeping, 7500)) {
-					setDoor(2, kCharacterCath, checkDoor(2), 0, 0);
-					getCharacterCurrentParams(kCharacterCond1)[2] = 1;
-				}
+			if (_gameProgress[kProgressEventCorpseMovedFromFloor]) {
 				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 4;
-				Cond1Call(&LogicManager::CONS_Cond1_DoCorrOtis, "601Vb", 2, 0, 0);
-			} else if (getCharacterCurrentParams(kCharacterCond1)[0] == 3) {
-				if (inComp(kCharacterCath, kCarGreenSleeping, 6470)) {
-					setDoor(3, kCharacterCath, checkDoor(3), 0, 0);
-					getCharacterCurrentParams(kCharacterCond1)[2] = 1;
-				}
-
-				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 6;
-				Cond1Call(&LogicManager::CONS_Cond1_DoCorrOtis, "601Mc", 3, 0, 0);
+				Cond1Call(&LogicManager::CONS_Cond1_DoCorrOtis, "601Ra", 1, 0, 0);
+			} else if (checkLoc(kCharacterCath, 3)) {
+				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 2;
+				Cond1Call(&LogicManager::CONS_Cond1_DoBriefCorrOtis, "601Ra", 1, 0, 0);
 			} else {
-			LABEL_34:
-				if (_gameProgress[kProgressField14] == 3)
-					_gameProgress[kProgressField14] = 0;
-				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 8;
-				Cond1Call(&LogicManager::CONS_Cond1_DoWalk, 3, 2000, 0, 0);
+				bumpCath(kCarNone, 1, 255);
+				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 3;
+				Cond1Call(&LogicManager::CONS_Cond1_SaveGame, 2, kEventMertensCorpseFloor, 0, 0);
 			}
+
+			break;
+		case 2:
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 3;
+			Cond1Call(&LogicManager::CONS_Cond1_SaveGame, 2, kEventMertensCorpseFloor, 0, 0);
 			break;
 		case 3:
-			goto LABEL_34;
-		case 4:
-			startCycOtis(kCharacterCond1, "601Wb");
-			softBlockAtDoor(kCharacterCond1, 2);
-			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 5;
-			Cond1Call(&LogicManager::CONS_Cond1_DoDialog, "CON3020", 0, 0, 0);
+		case 12:
+		case 17:
+		case 26:
+			playNIS(kEventMertensCorpseFloor);
+			endGame(0, 1, _gameProgress[kProgressEventFoundCorpse] == 0 ? 56 : 50, true);
 			return;
-		case 5:
-			if (getCharacterCurrentParams(kCharacterCond1)[2]) {
-				setDoor(2, kCharacterCath, checkDoor(2), 10, 9);
+		case 4:
+			setDoor(1, kCharacterCath, 1, 0, 0);
+			getCharacter(kCharacterCond1).characterPosition.location = 1;
+			endGraphics(kCharacterCond1);
+
+			if (getCharacterCurrentParams(kCharacterCond1)[0]) {
+				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 7;
+				Cond1Call(&LogicManager::CONS_Cond1_DoCorrOtis, "601Sa", 1, 0, 0);
+				break;
 			}
 
-			softReleaseAtDoor(kCharacterCond1, 2);
-			goto LABEL_34;
+			if (_gameProgress[kProgressEventCorpseThrown] || _gameProgress[kProgressChapter] != 1) {
+				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 6;
+				Cond1Call(&LogicManager::CONS_Cond1_MakeBed, 1, 17, 0, 0);
+			} else {
+				if (!checkLoc(kCharacterCath, 3))
+					bumpCath(kCarNone, 1, 255);
+
+				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 5;
+				Cond1Call(&LogicManager::CONS_Cond1_SaveGame, 2, kEventMertensCorpseBed, 0, 0);
+			}
+
+			break;
+		case 5:
+			playNIS(kEventMertensCorpseBed);
+			endGame(0, 1, 57, true);
+			break;
 		case 6:
-			startCycOtis(kCharacterCond1, "601Nc");
-			softBlockAtDoor(kCharacterCond1, 3);
 			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 7;
-			Cond1Call(&LogicManager::CONS_Cond1_DoDialog, "CON3020", 0, 0, 0);
-			return;
+			Cond1Call(&LogicManager::CONS_Cond1_DoCorrOtis, "601Sa", 1, 0, 0);
+			break;
 		case 7:
-			if (getCharacterCurrentParams(kCharacterCond1)[2]) {
-				setDoor(3, kCharacterCath, checkDoor(3), 10, 9);
-			}
+			getCharacter(kCharacterCond1).characterPosition.location = 0;
+			setDoor(1, kCharacterCath, 0, 10, 9);
 
-			softReleaseAtDoor(kCharacterCond1, 3);
-			goto LABEL_34;
+			getCharacter(kCharacterCond1).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterCond1, _functionsCond1[getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall]]);
+			fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
+			break;
 		case 8:
-			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 9;
-			Cond1Call(&LogicManager::CONS_Cond1_SitDown, 0, 0, 0, 0);
-			return;
 		case 9:
-			goto LABEL_42;
-		default:
-			return;
-		}
-	}
-}
+			setDoor(1, kCharacterCond1, checkDoor(1), 14, 9);
+			break;
+		case 11:
+		case 13:
+			if (getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] == 11) {
+				setDoor(1, kCharacterCond1, checkDoor(1), 14, 9);
+			} else if (getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] == 13) {
+				playNIS(kEventMertensBloodJacket);
+				endGame(0, 1, 55, 1);
+			}
 
-void LogicManager::CONS_Cond1_CathRattling(CONS_PARAMS) {
-	CharacterCallParams *params = &getCharacter(kCharacterCond1).callParams[getCharacter(kCharacterCond1).currentCall];
-	_engine->getMessageManager()->setMessageHandle(kCharacterCond1, &LogicManager::HAND_Cond1_CathRattling);
-	getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall] = 31;
+			if (getCharacterCurrentParams(kCharacterCond1)[3] || (getCharacterCurrentParams(kCharacterCond1)[3] = _currentGameSessionTicks + 375, _currentGameSessionTicks != -375)) {
+				if (getCharacterCurrentParams(kCharacterCond1)[3] >= _currentGameSessionTicks)
+					break;
 
-	params->clear();
+				getCharacterCurrentParams(kCharacterCond1)[3] = 0x7FFFFFFF;
+			}
 
-	params->parameters[0] = param1.intParam;
+			playDialog(0, "LIB033", -1, 0);
 
-	fedEx(kCharacterCond1, kCharacterCond1, 12, 0);
-}
+			if (_gameProgress[kProgressEventCorpseMovedFromFloor]) {
+				if (_gameProgress[kProgressJacket] == 1) {
+					getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 18;
+					Cond1Call(&LogicManager::CONS_Cond1_SaveGame, 2, kEventMertensBloodJacket, 0, 0);
+				} else if (getCharacterCurrentParams(kCharacterCond1)[0]) {
+					setDoor(1, kCharacterCath, 0, 10, 9);
 
-void LogicManager::HAND_Cond1_CathRattling(HAND_PARAMS) {
-	switch (msg->action) {
-	case 2:
-		getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 3;
-		Cond1Call(&LogicManager::CONS_Cond1_SitDown, 0, 0, 0, 0);
-		break;
-	case 12:
-		getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 1;
-		Cond1Call(&LogicManager::CONS_Cond1_DoSeqOtis, "601G", 0, 0, 0);
-		break;
-	case 18:
-		if (getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] == 1) {
-			if (whoRunningDialog(kCharacterCond1)) {
-				startCycOtis(kCharacterCond1, "601J");
+					if (getCharacterCurrentParams(kCharacterCond1)[0] == 1) {
+						getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 20;
+						Cond1Call(&LogicManager::CONS_Cond1_SaveGame, 2, kEventMertensAugustWaitingCompartment, 0, 0);
+					} else {
+						if (getCharacterCurrentParams(kCharacterCond1)[0] != 2) {
+							if (getCharacterCurrentParams(kCharacterCond1)[0] != 3) {
+								playDialog(0, "LIB015", -1, 0);
+								bumpCathTylerComp();
+
+								getCharacter(kCharacterCond1).currentCall--;
+								_engine->getMessageManager()->setMessageHandle(kCharacterCond1, _functionsCond1[getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall]]);
+								fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
+								break;
+							}
+
+							if (isNight()) {
+								playNIS(kEventMertensPushCallNight);
+							} else {
+								playNIS(kEventMertensPushCall);
+							}
+
+							playDialog(0, "LIB015", -1, 0);
+							bumpCathTylerComp();
+
+							getCharacter(kCharacterCond1).currentCall--;
+							_engine->getMessageManager()->setMessageHandle(kCharacterCond1, _functionsCond1[getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall]]);
+							fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
+							break;
+						}
+
+						getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 21;
+						Cond1Call(&LogicManager::CONS_Cond1_SaveGame, 2, kEventMertensKronosInvitationCompartment, 0, 0);
+					}
+				} else {
+					getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 19;
+					Cond1Call(&LogicManager::CONS_Cond1_SubMakeBed, 0, 0, 0, 0);
+				}
 			} else {
-				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 2;
-				Cond1Call(&LogicManager::CONS_Cond1_SitDown, 0, 0, 0, 0);
+				if (!checkLoc(kCharacterCath, 3))
+					bumpCath(kCarNone, 1, 255);
+
+				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 17;
+				Cond1Call(&LogicManager::CONS_Cond1_SaveGame, 2, kEventMertensCorpseFloor, 0, 0);
 			}
-		} else if (getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] == 2 ||
-				   getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] == 3) {
+
+			break;
+		case 14:
+		case 19:
+		case 22:
+		case 28:
 			getCharacter(kCharacterCond1).currentCall--;
 			_engine->getMessageManager()->setMessageHandle(kCharacterCond1, _functionsCond1[getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall]]);
 			fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
-		}
-
-		break;
-	}
-}
+			break;
+		case 15:
+			playNIS(kEventMertensAugustWaitingCompartment);
+			_gameProgress[kProgressEventMertensAugustWaiting] = 1;
+			playDialog(0, "LIB015", -1, 0);
+			bumpCathTylerComp();
 
-void LogicManager::CONS_Cond1_BathroomTrip(CONS_PARAMS) {
-	CharacterCallParams *params = &getCharacter(kCharacterCond1).callParams[getCharacter(kCharacterCond1).currentCall];
-	_engine->getMessageManager()->setMessageHandle(kCharacterCond1, &LogicManager::HAND_Cond1_BathroomTrip);
-	getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall] = 32;
+			getCharacter(kCharacterCond1).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterCond1, _functionsCond1[getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall]]);
+			fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
+			break;
+		case 16:
+			playNIS(kEventMertensKronosInvitationCompartment);
+			_gameProgress[kProgressEventMertensChronosInvitation] = 1;
+			playDialog(0, "LIB015", -1, 0);
+			bumpCathTylerComp();
 
-	params->clear();
+			getCharacter(kCharacterCond1).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterCond1, _functionsCond1[getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall]]);
+			fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
+			break;
+		case 18:
+		case 27:
+			playNIS(kEventMertensBloodJacket);
+			endGame(0, 1, 55, true);
+			break;
+		case 20:
+			playNIS(kEventMertensAugustWaitingCompartment);
+			_gameProgress[kProgressEventMertensAugustWaiting] = 1;
+			playDialog(0, "LIB015", -1, 0);
+			bumpCathTylerComp();
 
-	fedEx(kCharacterCond1, kCharacterCond1, 12, 0);
-}
+			getCharacter(kCharacterCond1).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterCond1, _functionsCond1[getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall]]);
+			fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
+			break;
+		case 21:
+			playNIS(kEventMertensKronosInvitationCompartment);
+			_gameProgress[kProgressEventMertensChronosInvitation] = 1;
+			playDialog(0, "LIB015", -1, 0);
+			bumpCathTylerComp();
 
-void LogicManager::HAND_Cond1_BathroomTrip(HAND_PARAMS) {
-	if (msg->action == 12) {
-		getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 1;
-		Cond1Call(&LogicManager::CONS_Cond1_GetUp, 0, 0, 0, 0);
-	} else if (msg->action == 18) {
-		switch (getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8]) {
-		case 1:
-			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 2;
-			Cond1Call(&LogicManager::CONS_Cond1_DoWalk, 3, 9510, 0, 0);
+			getCharacter(kCharacterCond1).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterCond1, _functionsCond1[getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall]]);
+			fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
 			break;
-		case 2:
-			if (getCharacter(kCharacterCond1).characterPosition.position < 9460)
-				goto LABEL_11;
-			endGraphics(kCharacterCond1);
-			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 3;
-			Cond1Call(&LogicManager::CONS_Cond1_DoWait, 900, 0, 0, 0);
+		case 23:
+			_gameProgress[kProgressEventMertensAugustWaiting] = 1;
+			setDoor(1, kCharacterCath, checkDoor(1), 10, 9);
+
+			getCharacter(kCharacterCond1).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterCond1, _functionsCond1[getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall]]);
+			fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
 			break;
-		case 3:
-		LABEL_11:
-			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 4;
-			Cond1Call(&LogicManager::CONS_Cond1_DoWalk, 3, 2000, 0, 0);
+		case 24:
+			_gameProgress[kProgressEventMertensChronosInvitation] = 1;
+			setDoor(1, kCharacterCath, checkDoor(1), 10, 9);
+
+			getCharacter(kCharacterCond1).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterCond1, _functionsCond1[getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall]]);
+			fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
 			break;
-		case 4:
-			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 5;
-			Cond1Call(&LogicManager::CONS_Cond1_SitDown, 0, 0, 0, 0);
+		case 25:
+			setDoor(1, kCharacterCath, checkDoor(1), 10, 9);
+
+			getCharacter(kCharacterCond1).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterCond1, _functionsCond1[getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall]]);
+			fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
 			break;
-		case 5:
+		case 29:
+			playNIS(kEventMertensAugustWaitingCompartment);
+			_gameProgress[kProgressEventMertensAugustWaiting] = 1;
+			playDialog(0, "LIB015", -1, 0);
+			bumpCathTylerComp();
+
+			getCharacter(kCharacterCond1).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterCond1, _functionsCond1[getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall]]);
+			fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
+			break;
+		case 30:
+			playNIS(kEventMertensKronosInvitationCompartment);
+			_gameProgress[kProgressEventMertensChronosInvitation] = 1;
+			playDialog(0, "LIB015", -1, 0);
+			bumpCathTylerComp();
+
 			getCharacter(kCharacterCond1).currentCall--;
 			_engine->getMessageManager()->setMessageHandle(kCharacterCond1, _functionsCond1[getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall]]);
 			fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
 			break;
 		default:
-			return;
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
-void LogicManager::CONS_Cond1_DoPending(CONS_PARAMS) {
+void LogicManager::CONS_Cond1_VisitCond2(CONS_PARAMS) {
 	CharacterCallParams *params = &getCharacter(kCharacterCond1).callParams[getCharacter(kCharacterCond1).currentCall];
-	_engine->getMessageManager()->setMessageHandle(kCharacterCond1, &LogicManager::HAND_Cond1_DoPending);
-	getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall] = 33;
+	_engine->getMessageManager()->setMessageHandle(kCharacterCond1, &LogicManager::HAND_Cond1_VisitCond2);
+	getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall] = 28;
 
 	params->clear();
 
+	strncpy((char *)&params->parameters[0], param1.stringParam, 12);
+
 	fedEx(kCharacterCond1, kCharacterCond1, 12, 0);
 }
 
-void LogicManager::HAND_Cond1_DoPending(HAND_PARAMS) {
-	if (msg->action == 12) {
-		if (getCharacterParams(kCharacterCond1, 8)[7]  ||
-			getCharacterParams(kCharacterCond1, 8)[13] ||
-			getCharacterParams(kCharacterCond1, 8)[14] ||
-			getCharacterParams(kCharacterCond1, 8)[12] ||
-			getCharacterParams(kCharacterCond1, 8)[11] ||
-			getCharacterParams(kCharacterCond1, 8)[9]  ||
-			getCharacterParams(kCharacterCond1, 8)[5]  ||
-			getCharacterParams(kCharacterCond1, 8)[10] ||
-			getCharacterParams(kCharacterCond1, 8)[8]  ||
-			getCharacterParams(kCharacterCond1, 8)[17]) {
-
-			getCharacterParams(kCharacterCond1, 8)[15] = 1;
-
-			if (getCharacterParams(kCharacterCond1, 8)[7]) {
-				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 1;
-				Cond1Call(&LogicManager::CONS_Cond1_DoWalk, 3, 1500, 0, 0);
-			} else {
-				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 3;
-				Cond1Call(&LogicManager::CONS_Cond1_DoWalk, 3, 540, 0, 0);
-			}
-		} else {
-			getCharacter(kCharacterCond1).currentCall--;
-			_engine->getMessageManager()->setMessageHandle(kCharacterCond1, _functionsCond1[getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall]]);
-			fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
+void LogicManager::HAND_Cond1_VisitCond2(HAND_PARAMS) {
+	switch (msg->action) {
+	case 0:
+		if (getCharacterCurrentParams(kCharacterCond1)[3] && getCharacterCurrentParams(kCharacterCond1)[4]) {
+			send(kCharacterCond1, kCharacterCond2, 125499160, 0);
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 3;
+			Cond1Call(&LogicManager::CONS_Cond1_DoWalk, 3, 2000, 0, 0);
 		}
-	} else if (msg->action == 18) {
+
+		break;
+	case 2:
+		getCharacterCurrentParams(kCharacterCond1)[3] = 1;
+		break;
+	case 12:
+		getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 1;
+		Cond1Call(&LogicManager::CONS_Cond1_GetUp, 0, 0, 0, 0);
+		break;
+	case 18:
 		switch (getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8]) {
 		case 1:
-			getCharacterParams(kCharacterCond1, 8)[16] = 1;
 			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 2;
-			Cond1Call(&LogicManager::CONS_Cond1_Listen, 9, 0, 0, 0);
+			Cond1Call(&LogicManager::CONS_Cond1_DoWalk, 4, 1500, 0, 0);
 			break;
 		case 2:
-			getCharacterParams(kCharacterCond1, 8)[15] = 0;
-			getCharacter(kCharacterCond1).currentCall--;
-			_engine->getMessageManager()->setMessageHandle(kCharacterCond1, _functionsCond1[getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall]]);
-			fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
+			startCycOtis(kCharacterCond1, "601O");
+			send(kCharacterCond1, kCharacterCond2, 154005632, 0);
 			break;
 		case 3:
-			endGraphics(kCharacterCond1);
 			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 4;
-			Cond1Call(&LogicManager::CONS_Cond1_DoWait, 75, 0, 0, 0);
+			Cond1Call(&LogicManager::CONS_Cond1_SitDown, 0, 0, 0, 0);
 			break;
 		case 4:
-			if (!getCharacterParams(kCharacterCond1, 8)[13])
-				goto LABEL_29;
-			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 5;
-			Cond1Call(&LogicManager::CONS_Cond1_AugustLockUnlockMyComp, 1, 0, 0, 0);
-			break;
-		case 5:
-		LABEL_29:
-			if (!getCharacterParams(kCharacterCond1, 8)[14])
-				goto LABEL_31;
-			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 6;
-			Cond1Call(&LogicManager::CONS_Cond1_AugustLockUnlockMyComp, 0, 0, 0, 0);
-			break;
-		case 6:
-		LABEL_31:
-			if (!getCharacterParams(kCharacterCond1, 8)[12])
-				goto LABEL_33;
-			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 7;
-			Cond1Call(&LogicManager::CONS_Cond1_AlexeiLockUnlockMyComp, 1, 0, 0, 0);
-			break;
-		case 7:
-		LABEL_33:
-			if (!getCharacterParams(kCharacterCond1, 8)[11])
-				goto LABEL_35;
-			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 8;
-			Cond1Call(&LogicManager::CONS_Cond1_AlexeiLockUnlockMyComp, 0, 0, 0, 0);
-			break;
-		case 8:
-		LABEL_35:
-			if (!getCharacterParams(kCharacterCond1, 8)[9])
-				goto LABEL_37;
-			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 9;
-			Cond1Call(&LogicManager::CONS_Cond1_DeliverAugustMessage, 0, 0, 0, 0);
-			break;
-		case 9:
-		LABEL_37:
-			if (!getCharacterParams(kCharacterCond1, 8)[5])
-				goto LABEL_39;
-			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 10;
-			Cond1Call(&LogicManager::CONS_Cond1_DeliverKronosMessage, 0, 0, 0, 0);
-			break;
-		case 10:
-		LABEL_39:
-			if (!getCharacterParams(kCharacterCond1, 8)[10])
-				goto LABEL_41;
-			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 11;
-			Cond1Call(&LogicManager::CONS_Cond1_VisitKahina, 0, 0, 0, 0);
-			break;
-		case 11:
-		LABEL_41:
-			if (!getCharacterParams(kCharacterCond1, 8)[8])
-				goto LABEL_25;
-			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 12;
-			Cond1Call(&LogicManager::CONS_Cond1_VisitCond2, "CON1200", 0, 0, 0);
-			break;
-		case 12:
-			send(kCharacterCond1, kCharacterCond2, 168254872, 0);
-			getCharacterParams(kCharacterCond1, 8)[8] = 0;
-		LABEL_25:
-			if (!getCharacterParams(kCharacterCond1, 8)[17])
-				goto LABEL_28;
-			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 13;
-			Cond1Call(&LogicManager::CONS_Cond1_VisitCond2Special, 0, 0, 0, 0);
-			break;
-		case 13:
-			getCharacterParams(kCharacterCond1, 8)[17] = 0;
-		LABEL_28:
-			getCharacterParams(kCharacterCond1, 8)[15] = 0;
 			getCharacter(kCharacterCond1).currentCall--;
 			_engine->getMessageManager()->setMessageHandle(kCharacterCond1, _functionsCond1[getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall]]);
 			fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
 			break;
 		default:
-			return;
+			break;
 		}
+
+		break;
+	case 155853632:
+		getCharacterCurrentParams(kCharacterCond1)[4] = 1;
+		break;
+	case 202558662:
+		startCycOtis(kCharacterCond1, "601L");
+		playDialog(kCharacterCond1, (char *)&getCharacterCurrentParams(kCharacterCond1)[0], -1, 0);
+		break;
+	default:
+		break;
 	}
 }
 
-void LogicManager::CONS_Cond1_Birth(CONS_PARAMS) {
+void LogicManager::CONS_Cond1_VisitCond2Double(CONS_PARAMS) {
 	CharacterCallParams *params = &getCharacter(kCharacterCond1).callParams[getCharacter(kCharacterCond1).currentCall];
-	_engine->getMessageManager()->setMessageHandle(kCharacterCond1, &LogicManager::HAND_Cond1_Birth);
-	getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall] = 34;
+	_engine->getMessageManager()->setMessageHandle(kCharacterCond1, &LogicManager::HAND_Cond1_VisitCond2Double);
+	getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall] = 29;
 
 	params->clear();
 
+	strncpy((char *)&params->parameters[0], param1.stringParam, 12);
+	strncpy((char *)&params->parameters[3], param2.stringParam, 12);
+
 	fedEx(kCharacterCond1, kCharacterCond1, 12, 0);
 }
 
-void LogicManager::HAND_Cond1_Birth(HAND_PARAMS) {
-	if (msg->action == 0) {
-		if (_gameTime > 1062000 && !getCharacterCurrentParams(kCharacterCond1)[0]) {
-			getCharacterCurrentParams(kCharacterCond1)[0] = 1;
-			CONS_Cond1_StartPart1(0, 0, 0, 0);
+void LogicManager::HAND_Cond1_VisitCond2Double(HAND_PARAMS) {
+	switch (msg->action) {
+	case 0:
+		if (getCharacterCurrentParams(kCharacterCond1)[6] > 1 && getCharacterCurrentParams(kCharacterCond1)[7]) {
+			send(kCharacterCond1, kCharacterCond2, 125499160, 0);
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 3;
+			Cond1Call(&LogicManager::CONS_Cond1_DoWalk, 3, 2000, 0, 0);
 		}
-	} else if (msg->action == 12) {
-		autoMessage(kCharacterCond1, 171394341, 7);
-		autoMessage(kCharacterCond1, 169633856, 9);
-		autoMessage(kCharacterCond1, 238732837, 10);
-		autoMessage(kCharacterCond1, 269624833, 12);
-		autoMessage(kCharacterCond1, 302614416, 11);
-		autoMessage(kCharacterCond1, 190082817, 8);
-		autoMessage(kCharacterCond1, 269436673, 13);
-		autoMessage(kCharacterCond1, 303343617, 14);
-		autoMessage(kCharacterCond1, 224122407, 17);
-		autoMessage(kCharacterCond1, 201431954, 18);
-		autoMessage(kCharacterCond1, 188635520, 19);
-		autoMessage(kCharacterCond1, 204379649, 4);
-		getCharacterParams(kCharacterCond1, 8)[0] = 0;
-		getCharacter(kCharacterCond1).characterPosition.position = 9460;
-		getCharacter(kCharacterCond1).characterPosition.location = 0;
-		getCharacter(kCharacterCond1).characterPosition.car = kCarGreenSleeping;
-	}
-}
-
-void LogicManager::CONS_Cond1_DeliverAugustMessage(CONS_PARAMS) {
-	CharacterCallParams *params = &getCharacter(kCharacterCond1).callParams[getCharacter(kCharacterCond1).currentCall];
-	_engine->getMessageManager()->setMessageHandle(kCharacterCond1, &LogicManager::HAND_Cond1_DeliverAugustMessage);
-	getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall] = 35;
-
-	params->clear();
 
-	fedEx(kCharacterCond1, kCharacterCond1, 12, 0);
-}
+		break;
+	case 2:
+		getCharacterCurrentParams(kCharacterCond1)[6]++;
+		if (getCharacterCurrentParams(kCharacterCond1)[6] == 1)
+			playDialog(kCharacterCond1, (char *)&getCharacterCurrentParams(kCharacterCond1)[3], -1, 0);
 
-void LogicManager::HAND_Cond1_DeliverAugustMessage(HAND_PARAMS) {
-	if (msg->action == 12) {
-		if (_gameProgress[kProgressField14] == 29) {
-		LABEL_21:
-			getCharacter(kCharacterCond1).currentCall--;
-			_engine->getMessageManager()->setMessageHandle(kCharacterCond1, _functionsCond1[getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall]]);
-			fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
-		} else {
-			_gameProgress[kProgressField14] = 3;
-			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 1;
-			Cond1Call(&LogicManager::CONS_Cond1_GetUp, 0, 0, 0, 0);
-		}
-	} else if (msg->action == 18) {
+		break;
+	case 12:
+		getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 1;
+		Cond1Call(&LogicManager::CONS_Cond1_GetUp, 0, 0, 0, 0);
+		break;
+	case 18:
 		switch (getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8]) {
 		case 1:
 			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 2;
-			Cond1Call(&LogicManager::CONS_Cond1_DoWalk, 3, 8200, 0, 0);
+			Cond1Call(&LogicManager::CONS_Cond1_DoWalk, 4, 1500, 0, 0);
 			break;
 		case 2:
-			if (!getCharacterParams(kCharacterCond1, 8)[9] ||
-				_gameProgress[kProgressEventMetAugust]) {
-				getCharacterParams(kCharacterCond1, 8)[9] = 0;
-
-				if (_gameProgress[kProgressField14] == 3)
-					_gameProgress[kProgressField14] = 0;
-
-				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 3;
-				Cond1Call(&LogicManager::CONS_Cond1_DoWalk, 3, 2000, 0, 0);
-			} else {
-				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 5;
-				Cond1Call(&LogicManager::CONS_Cond1_EnterTyler, 1, 0, 0, 0);
-			}
-
+			startCycOtis(kCharacterCond1, "601O");
+			send(kCharacterCond1, kCharacterCond2, 154005632, 0);
 			break;
 		case 3:
 			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 4;
 			Cond1Call(&LogicManager::CONS_Cond1_SitDown, 0, 0, 0, 0);
 			break;
 		case 4:
-		case 7:
-			goto LABEL_21;
-		case 5:
-			if (_gameProgress[kProgressField14] == 3)
-				_gameProgress[kProgressField14] = 0;
-
-			if (_gameProgress[kProgressEventMertensAugustWaiting])
-				getCharacterParams(kCharacterCond1, 8)[9] = 0;
-
-			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 6;
-			Cond1Call(&LogicManager::CONS_Cond1_DoWalk, 3, 2000, 0, 0);
-			break;
-		case 6:
-			getCharacterParams(kCharacterCond1, 8)[9] = 0;
-			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 7;
-			Cond1Call(&LogicManager::CONS_Cond1_SitDown, 0, 0, 0, 0);
+			getCharacter(kCharacterCond1).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterCond1, _functionsCond1[getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall]]);
+			fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
 			break;
 		default:
 			return;
 		}
-	}
-}
-
-void LogicManager::CONS_Cond1_DeliverKronosMessage(CONS_PARAMS) {
+		break;
+	case 155853632:
+		getCharacterCurrentParams(kCharacterCond1)[7] = 1;
+		break;
+	case 202558662:
+		startCycOtis(kCharacterCond1, "601L");
+		playDialog(kCharacterCond1, (char *)&getCharacterCurrentParams(kCharacterCond1)[0], -1, 0);
+		break;
+	}
+}
+
+void LogicManager::CONS_Cond1_CathBuzzing(CONS_PARAMS) {
 	CharacterCallParams *params = &getCharacter(kCharacterCond1).callParams[getCharacter(kCharacterCond1).currentCall];
-	_engine->getMessageManager()->setMessageHandle(kCharacterCond1, &LogicManager::HAND_Cond1_DeliverKronosMessage);
-	getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall] = 36;
+	_engine->getMessageManager()->setMessageHandle(kCharacterCond1, &LogicManager::HAND_Cond1_CathBuzzing);
+	getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall] = 30;
 
 	params->clear();
 
+	params->parameters[0] = param1.intParam;
+
 	fedEx(kCharacterCond1, kCharacterCond1, 12, 0);
 }
 
-void LogicManager::HAND_Cond1_DeliverKronosMessage(HAND_PARAMS) {
-	if (msg->action == 12) {
-		if (_gameProgress[kProgressField14] == 29) {
-		LABEL_5:
-			getCharacter(kCharacterCond1).currentCall--;
-			_engine->getMessageManager()->setMessageHandle(kCharacterCond1, _functionsCond1[getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall]]);
-			fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
+void LogicManager::HAND_Cond1_CathBuzzing(HAND_PARAMS) {
+	switch (msg->action) {
+	case 12:
+		if (getCharacterCurrentParams(kCharacterCond1)[0] == 1) {
+			getCharacterCurrentParams(kCharacterCond1)[1] = 8200;
+		} else if (getCharacterCurrentParams(kCharacterCond1)[0] == 2) {
+			getCharacterCurrentParams(kCharacterCond1)[1] = 7500;
 		} else {
+			if (getCharacterCurrentParams(kCharacterCond1)[0] != 3) {
+				getCharacter(kCharacterCond1).currentCall--;
+				_engine->getMessageManager()->setMessageHandle(kCharacterCond1, _functionsCond1[getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall]]);
+				fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
+				break;
+			}
+
+			getCharacterCurrentParams(kCharacterCond1)[1] = 6470;
+		}
+
+		if (getCharacterCurrentParams(kCharacterCond1)[0] == 1) {
+			if (_gameProgress[kProgressField14]) {
+				getCharacter(kCharacterCond1).currentCall--;
+				_engine->getMessageManager()->setMessageHandle(kCharacterCond1, _functionsCond1[getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall]]);
+				fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
+				break;
+			}
+
 			_gameProgress[kProgressField14] = 3;
-			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 1;
-			Cond1Call(&LogicManager::CONS_Cond1_GetUp, 0, 0, 0, 0);
 		}
-	} else if (msg->action == 18) {
+
+		getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 1;
+		Cond1Call(&LogicManager::CONS_Cond1_GetUp, 0, 0, 0, 0);
+		break;
+	case 18:
 		switch (getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8]) {
 		case 1:
 			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 2;
-			Cond1Call(&LogicManager::CONS_Cond1_DoWalk, 3, 8200, 0, 0);
+			Cond1Call(&LogicManager::CONS_Cond1_DoWalk, 3, getCharacterCurrentParams(kCharacterCond1)[1], 0, 0);
 			return;
 		case 2:
-			if (!getCharacterParams(kCharacterCond1, 8)[5])
-				goto LABEL_22;
-			if (cathInCorridor(kCarGreenSleeping) &&
-				getCharacter(kCharacterCond1).characterPosition.position < getCharacter(kCharacterCath).characterPosition.position) {
+			if (getCharacterCurrentParams(kCharacterCond1)[0] == 1) {
+				if (_gameProgress[kProgressChapter] == 4)
+					send(kCharacterCond1, kCharacterTatiana, 238790488, 0);
 				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 3;
-				Cond1Call(&LogicManager::CONS_Cond1_DoWalk, 3, 9460, 0, 0);
-			} else {
-			LABEL_21:
-				if (getCharacterParams(kCharacterCond1, 8)[5]) {
-					getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 7;
-					Cond1Call(&LogicManager::CONS_Cond1_EnterTyler, 2, 0, 0, 0);
-				} else {
-				LABEL_22:
-					getCharacterParams(kCharacterCond1, 8)[5] = 0;
-					getCharacterParams(kCharacterCond1, 8)[6] = 0;
-					if (_gameProgress[kProgressField14] == 3)
-						_gameProgress[kProgressField14] = 0;
-					getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 5;
-					Cond1Call(&LogicManager::CONS_Cond1_DoWalk, 3, 2000, 0, 0);
+				Cond1Call(&LogicManager::CONS_Cond1_EnterTyler, 3, 0, 0, 0);
+			} else if (getCharacterCurrentParams(kCharacterCond1)[0] == 2) {
+				if (inComp(kCharacterCath, kCarGreenSleeping, 7500)) {
+					setDoor(2, kCharacterCath, checkDoor(2), 0, 0);
+					getCharacterCurrentParams(kCharacterCond1)[2] = 1;
+				}
+				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 4;
+				Cond1Call(&LogicManager::CONS_Cond1_DoCorrOtis, "601Vb", 2, 0, 0);
+			} else if (getCharacterCurrentParams(kCharacterCond1)[0] == 3) {
+				if (inComp(kCharacterCath, kCarGreenSleeping, 6470)) {
+					setDoor(3, kCharacterCath, checkDoor(3), 0, 0);
+					getCharacterCurrentParams(kCharacterCond1)[2] = 1;
 				}
+
+				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 6;
+				Cond1Call(&LogicManager::CONS_Cond1_DoCorrOtis, "601Mc", 3, 0, 0);
+			} else {
+				if (_gameProgress[kProgressField14] == 3)
+					_gameProgress[kProgressField14] = 0;
+
+				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 8;
+				Cond1Call(&LogicManager::CONS_Cond1_DoWalk, 3, 2000, 0, 0);
 			}
+
 			break;
 		case 3:
-			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 4;
-			Cond1Call(&LogicManager::CONS_Cond1_DoWalk, 3, 8200, 0, 0);
-			return;
+			if (_gameProgress[kProgressField14] == 3)
+				_gameProgress[kProgressField14] = 0;
+
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 8;
+			Cond1Call(&LogicManager::CONS_Cond1_DoWalk, 3, 2000, 0, 0);
+			break;
 		case 4:
-			goto LABEL_21;
-		case 5:
-			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 6;
-			Cond1Call(&LogicManager::CONS_Cond1_SitDown, 0, 0, 0, 0);
+			startCycOtis(kCharacterCond1, "601Wb");
+			softBlockAtDoor(kCharacterCond1, 2);
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 5;
+			Cond1Call(&LogicManager::CONS_Cond1_DoDialog, "CON3020", 0, 0, 0);
 			return;
+		case 5:
+			if (getCharacterCurrentParams(kCharacterCond1)[2]) {
+				setDoor(2, kCharacterCath, checkDoor(2), 10, 9);
+			}
+
+			softReleaseAtDoor(kCharacterCond1, 2);
+			if (_gameProgress[kProgressField14] == 3)
+				_gameProgress[kProgressField14] = 0;
+
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 8;
+			Cond1Call(&LogicManager::CONS_Cond1_DoWalk, 3, 2000, 0, 0);
+			break;
 		case 6:
-		case 9:
-			goto LABEL_5;
+			startCycOtis(kCharacterCond1, "601Nc");
+			softBlockAtDoor(kCharacterCond1, 3);
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 7;
+			Cond1Call(&LogicManager::CONS_Cond1_DoDialog, "CON3020", 0, 0, 0);
+			break;
 		case 7:
+			if (getCharacterCurrentParams(kCharacterCond1)[2]) {
+				setDoor(3, kCharacterCath, checkDoor(3), 10, 9);
+			}
+
+			softReleaseAtDoor(kCharacterCond1, 3);
 			if (_gameProgress[kProgressField14] == 3)
 				_gameProgress[kProgressField14] = 0;
-			if (!_gameProgress[kProgressEventMertensChronosInvitation])
-				getCharacterParams(kCharacterCond1, 8)[6] = 1;
-			getCharacterParams(kCharacterCond1, 8)[5] = 0;
+
 			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 8;
 			Cond1Call(&LogicManager::CONS_Cond1_DoWalk, 3, 2000, 0, 0);
-			return;
+			break;
 		case 8:
 			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 9;
 			Cond1Call(&LogicManager::CONS_Cond1_SitDown, 0, 0, 0, 0);
-			return;
+			break;
+		case 9:
+			getCharacter(kCharacterCond1).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterCond1, _functionsCond1[getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall]]);
+			fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
+			break;
 		default:
-			return;
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
-void LogicManager::CONS_Cond1_VisitCond2Special(CONS_PARAMS) {
+void LogicManager::CONS_Cond1_CathRattling(CONS_PARAMS) {
 	CharacterCallParams *params = &getCharacter(kCharacterCond1).callParams[getCharacter(kCharacterCond1).currentCall];
-	_engine->getMessageManager()->setMessageHandle(kCharacterCond1, &LogicManager::HAND_Cond1_VisitCond2Special);
-	getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall] = 37;
+	_engine->getMessageManager()->setMessageHandle(kCharacterCond1, &LogicManager::HAND_Cond1_CathRattling);
+	getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall] = 31;
 
 	params->clear();
 
+	params->parameters[0] = param1.intParam;
+
 	fedEx(kCharacterCond1, kCharacterCond1, 12, 0);
 }
 
-void LogicManager::HAND_Cond1_VisitCond2Special(HAND_PARAMS) {
-	if (msg->action > 12) {
-		switch (msg->action) {
-		case 18:
-			switch (getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8]) {
-			case 1:
+void LogicManager::HAND_Cond1_CathRattling(HAND_PARAMS) {
+	switch (msg->action) {
+	case 2:
+		getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 3;
+		Cond1Call(&LogicManager::CONS_Cond1_SitDown, 0, 0, 0, 0);
+		break;
+	case 12:
+		getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 1;
+		Cond1Call(&LogicManager::CONS_Cond1_DoSeqOtis, "601G", 0, 0, 0);
+		break;
+	case 18:
+		if (getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] == 1) {
+			if (whoRunningDialog(kCharacterCond1)) {
+				startCycOtis(kCharacterCond1, "601J");
+			} else {
 				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 2;
-				Cond1Call(&LogicManager::CONS_Cond1_DoWalk, 4, 1500, 0, 0);
-				break;
-			case 2:
-				startCycOtis(kCharacterCond1, "601O");
-				send(kCharacterCond1, kCharacterCond2, 154005632, 0);
-				break;
-			case 3:
-				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 4;
 				Cond1Call(&LogicManager::CONS_Cond1_SitDown, 0, 0, 0, 0);
-				break;
-			case 4:
-				getCharacter(kCharacterCond1).currentCall--;
-				_engine->getMessageManager()->setMessageHandle(kCharacterCond1, _functionsCond1[getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall]]);
-				fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
-				break;
-			default:
-				return;
-			}
-			break;
-		case 155853632:
-			getCharacterCurrentParams(kCharacterCond1)[1] = 1;
-			break;
-		case 202558662:
-			startCycOtis(kCharacterCond1, "601L");
-			playDialog(kCharacterCond1, "CON1150", -1, 0);
-			break;
-		}
-	} else if (msg->action == 12) {
-		getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 1;
-		Cond1Call(&LogicManager::CONS_Cond1_GetUp, 0, 0, 0, 0);
-	} else if (msg->action) {
-		if (msg->action == 2) {
-			getCharacterCurrentParams(kCharacterCond1)[0]++;
-			if (getCharacterCurrentParams(kCharacterCond1)[0] == 1) {
-				if (nearChar(kCharacterCond1, kCharacterCath, 2000u))
-					playDialog(kCharacterCond1, "CON1152", -1, 0);
-				else
-					playDialog(kCharacterCond1, "CON1151", -1, 0);
 			}
+		} else if (getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] == 2 ||
+				   getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] == 3) {
+			getCharacter(kCharacterCond1).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterCond1, _functionsCond1[getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall]]);
+			fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
 		}
-	} else if (getCharacterCurrentParams(kCharacterCond1)[0] >= 2 && getCharacterCurrentParams(kCharacterCond1)[1]) {
-		send(kCharacterCond1, kCharacterCond2, 125499160, 0);
-		getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 3;
-		Cond1Call(&LogicManager::CONS_Cond1_DoWalk, 3, 2000, 0, 0);
-	}
-}
-
-void LogicManager::CONS_Cond1_MakeBedTyler(CONS_PARAMS) {
-	CharacterCallParams *params = &getCharacter(kCharacterCond1).callParams[getCharacter(kCharacterCond1).currentCall];
-	_engine->getMessageManager()->setMessageHandle(kCharacterCond1, &LogicManager::HAND_Cond1_MakeBedTyler);
-	getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall] = 38;
-
-	params->clear();
-
-	fedEx(kCharacterCond1, kCharacterCond1, 12, 0);
-}
-
-void LogicManager::HAND_Cond1_MakeBedTyler(HAND_PARAMS) {
-	if (msg->action == 12) {
-		if (getCharacterParams(kCharacterCond1, 8)[3] && _gameProgress[kProgressField14] != 29) {
-			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 1;
-			Cond1Call(&LogicManager::CONS_Cond1_DoWalk, 3, 8200, 0, 0);
-			return;
-		}
-		goto LABEL_14;
-	}
-	if (msg->action != 18)
-		return;
 
-	if (getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] == 1) {
-		if (getCharacterParams(kCharacterCond1, 8)[3]) {
-			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 2;
-			Cond1Call(&LogicManager::CONS_Cond1_EnterTyler, 0, 0, 0, 0);
-			return;
-		}
-		goto LABEL_14;
-	}
-	if (getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] == 2) {
-		getCharacterParams(kCharacterCond1, 8)[3] = 0;
-	LABEL_14:
-		getCharacter(kCharacterCond1).currentCall--;
-		_engine->getMessageManager()->setMessageHandle(kCharacterCond1, _functionsCond1[getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall]]);
-		fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
+		break;
+	default:
+		break;
 	}
 }
 
-void LogicManager::CONS_Cond1_MakeAllBeds(CONS_PARAMS) {
+void LogicManager::CONS_Cond1_BathroomTrip(CONS_PARAMS) {
 	CharacterCallParams *params = &getCharacter(kCharacterCond1).callParams[getCharacter(kCharacterCond1).currentCall];
-	_engine->getMessageManager()->setMessageHandle(kCharacterCond1, &LogicManager::HAND_Cond1_MakeAllBeds);
-	getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall] = 39;
+	_engine->getMessageManager()->setMessageHandle(kCharacterCond1, &LogicManager::HAND_Cond1_BathroomTrip);
+	getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall] = 32;
 
 	params->clear();
 
 	fedEx(kCharacterCond1, kCharacterCond1, 12, 0);
 }
 
-void LogicManager::HAND_Cond1_MakeAllBeds(HAND_PARAMS) {
-	if (msg->action == 12) {
-		getCharacterParams(kCharacterCond1, 8)[3] = 1;
+void LogicManager::HAND_Cond1_BathroomTrip(HAND_PARAMS) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 1;
 		Cond1Call(&LogicManager::CONS_Cond1_GetUp, 0, 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8]) {
 		case 1:
 			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 2;
-			Cond1Call(&LogicManager::CONS_Cond1_MakeBedMahmud, 0, 0, 0, 0);
+			Cond1Call(&LogicManager::CONS_Cond1_DoWalk, 3, 9510, 0, 0);
 			break;
 		case 2:
-			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 3;
-			Cond1Call(&LogicManager::CONS_Cond1_DoPending, 0, 0, 0, 0);
-			break;
-		case 3:
+			if (getCharacter(kCharacterCond1).characterPosition.position < 9460) {
+				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 4;
+				Cond1Call(&LogicManager::CONS_Cond1_DoWalk, 3, 2000, 0, 0);
+			} else {
+				endGraphics(kCharacterCond1);
+				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 3;
+				Cond1Call(&LogicManager::CONS_Cond1_DoWait, 900, 0, 0, 0);
+			}
+
+			break;
+		case 3:
 			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 4;
-			Cond1Call(&LogicManager::CONS_Cond1_MakeBedAugust, 0, 0, 0, 0);
+			Cond1Call(&LogicManager::CONS_Cond1_DoWalk, 3, 2000, 0, 0);
 			break;
 		case 4:
 			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 5;
-			Cond1Call(&LogicManager::CONS_Cond1_DoPending, 0, 0, 0, 0);
-			break;
-		case 5:
-			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 6;
-			Cond1Call(&LogicManager::CONS_Cond1_MakeBedAlexei, 0, 0, 0, 0);
-			break;
-		case 6:
-			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 7;
-			Cond1Call(&LogicManager::CONS_Cond1_DoPending, 0, 0, 0, 0);
-			break;
-		case 7:
-			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 8;
-			Cond1Call(&LogicManager::CONS_Cond1_MakeBedTyler, 0, 0, 0, 0);
-			break;
-		case 8:
-			if (_gameProgress[kProgressField14] == 3)
-				_gameProgress[kProgressField14] = 0;
-
-			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 9;
-			Cond1Call(&LogicManager::CONS_Cond1_DoWalk, 3, 2000, 0, 0);
-			break;
-		case 9:
-			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 10;
 			Cond1Call(&LogicManager::CONS_Cond1_SitDown, 0, 0, 0, 0);
 			break;
-		case 10:
+		case 5:
 			getCharacter(kCharacterCond1).currentCall--;
 			_engine->getMessageManager()->setMessageHandle(kCharacterCond1, _functionsCond1[getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall]]);
 			fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
 			break;
 		default:
-			return;
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
-void LogicManager::CONS_Cond1_VisitKahina(CONS_PARAMS) {
+void LogicManager::CONS_Cond1_DoPending(CONS_PARAMS) {
 	CharacterCallParams *params = &getCharacter(kCharacterCond1).callParams[getCharacter(kCharacterCond1).currentCall];
-	_engine->getMessageManager()->setMessageHandle(kCharacterCond1, &LogicManager::HAND_Cond1_VisitKahina);
-	getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall] = 40;
+	_engine->getMessageManager()->setMessageHandle(kCharacterCond1, &LogicManager::HAND_Cond1_DoPending);
+	getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall] = 33;
 
 	params->clear();
 
 	fedEx(kCharacterCond1, kCharacterCond1, 12, 0);
 }
 
-void LogicManager::HAND_Cond1_VisitKahina(HAND_PARAMS) {
-	if (msg->action == 12) {
-		getCharacterParams(kCharacterCond1, 8)[10] = 0;
-		getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 1;
-		Cond1Call(&LogicManager::CONS_Cond1_GetUp, 0, 0, 0, 0);
-	} else if (msg->action == 18) {
+void LogicManager::HAND_Cond1_DoPending(HAND_PARAMS) {
+	switch (msg->action) {
+	case 12:
+		if (getCharacterParams(kCharacterCond1, 8)[7]  ||
+			getCharacterParams(kCharacterCond1, 8)[13] ||
+			getCharacterParams(kCharacterCond1, 8)[14] ||
+			getCharacterParams(kCharacterCond1, 8)[12] ||
+			getCharacterParams(kCharacterCond1, 8)[11] ||
+			getCharacterParams(kCharacterCond1, 8)[9]  ||
+			getCharacterParams(kCharacterCond1, 8)[5]  ||
+			getCharacterParams(kCharacterCond1, 8)[10] ||
+			getCharacterParams(kCharacterCond1, 8)[8]  ||
+			getCharacterParams(kCharacterCond1, 8)[17]) {
+
+			getCharacterParams(kCharacterCond1, 8)[15] = 1;
+
+			if (getCharacterParams(kCharacterCond1, 8)[7]) {
+				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 1;
+				Cond1Call(&LogicManager::CONS_Cond1_DoWalk, 3, 1500, 0, 0);
+			} else {
+				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 3;
+				Cond1Call(&LogicManager::CONS_Cond1_DoWalk, 3, 540, 0, 0);
+			}
+		} else {
+			getCharacter(kCharacterCond1).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterCond1, _functionsCond1[getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall]]);
+			fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
+		}
+
+		break;
+	case 18:
 		switch (getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8]) {
 		case 1:
+			getCharacterParams(kCharacterCond1, 8)[16] = 1;
 			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 2;
-			Cond1Call(&LogicManager::CONS_Cond1_DoWalk, 2, 9460, 0, 0);
+			Cond1Call(&LogicManager::CONS_Cond1_Listen, 9, 0, 0, 0);
 			break;
 		case 2:
-			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 3;
-			Cond1Call(&LogicManager::CONS_Cond1_DoWait, 1800, 0, 0, 0);
+			getCharacterParams(kCharacterCond1, 8)[15] = 0;
+			getCharacter(kCharacterCond1).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterCond1, _functionsCond1[getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall]]);
+			fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
 			break;
 		case 3:
+			endGraphics(kCharacterCond1);
 			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 4;
-			Cond1Call(&LogicManager::CONS_Cond1_DoWalk, 3, 1500, 0, 0);
+			Cond1Call(&LogicManager::CONS_Cond1_DoWait, 75, 0, 0, 0);
 			break;
 		case 4:
-			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 5;
-			Cond1Call(&LogicManager::CONS_Cond1_SitDown, 0, 0, 0, 0);
-			break;
+			if (getCharacterParams(kCharacterCond1, 8)[13]) {
+				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 5;
+				Cond1Call(&LogicManager::CONS_Cond1_AugustLockUnlockMyComp, 1, 0, 0, 0);
+				break;
+			}
+
+			// fall through
 		case 5:
-			getCharacterParams(kCharacterCond1, 8)[5] = 1;
+			if (getCharacterParams(kCharacterCond1, 8)[14]) {
+				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 6;
+				Cond1Call(&LogicManager::CONS_Cond1_AugustLockUnlockMyComp, 0, 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 6:
+			if (getCharacterParams(kCharacterCond1, 8)[12]) {
+				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 7;
+				Cond1Call(&LogicManager::CONS_Cond1_AlexeiLockUnlockMyComp, 1, 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 7:
+			if (getCharacterParams(kCharacterCond1, 8)[11]) {
+				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 8;
+				Cond1Call(&LogicManager::CONS_Cond1_AlexeiLockUnlockMyComp, 0, 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 8:
+			if (getCharacterParams(kCharacterCond1, 8)[9]) {
+				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 9;
+				Cond1Call(&LogicManager::CONS_Cond1_DeliverAugustMessage, 0, 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 9:
+			if (getCharacterParams(kCharacterCond1, 8)[5]) {
+				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 10;
+				Cond1Call(&LogicManager::CONS_Cond1_DeliverKronosMessage, 0, 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 10:
+			if (getCharacterParams(kCharacterCond1, 8)[10]) {
+				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 11;
+				Cond1Call(&LogicManager::CONS_Cond1_VisitKahina, 0, 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 11:
+			if (getCharacterParams(kCharacterCond1, 8)[8]) {
+				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 12;
+				Cond1Call(&LogicManager::CONS_Cond1_VisitCond2, "CON1200", 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 12:
+			if (getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] == 12) {
+				send(kCharacterCond1, kCharacterCond2, 168254872, 0);
+				getCharacterParams(kCharacterCond1, 8)[8] = 0;
+			}
+
+			if (getCharacterParams(kCharacterCond1, 8)[17]) {
+				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 13;
+				Cond1Call(&LogicManager::CONS_Cond1_VisitCond2Special, 0, 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 13:
+			if (getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] == 13) {
+				getCharacterParams(kCharacterCond1, 8)[17] = 0;
+			}
+
+			getCharacterParams(kCharacterCond1, 8)[15] = 0;
 			getCharacter(kCharacterCond1).currentCall--;
 			_engine->getMessageManager()->setMessageHandle(kCharacterCond1, _functionsCond1[getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall]]);
 			fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
@@ -3080,352 +3142,1070 @@ void LogicManager::HAND_Cond1_VisitKahina(HAND_PARAMS) {
 		default:
 			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
-void LogicManager::CONS_Cond1_StartPart1(CONS_PARAMS) {
+void LogicManager::CONS_Cond1_Birth(CONS_PARAMS) {
 	CharacterCallParams *params = &getCharacter(kCharacterCond1).callParams[getCharacter(kCharacterCond1).currentCall];
-	_engine->getMessageManager()->setMessageHandle(kCharacterCond1, &LogicManager::HAND_Cond1_StartPart1);
-	getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall] = 41;
+	_engine->getMessageManager()->setMessageHandle(kCharacterCond1, &LogicManager::HAND_Cond1_Birth);
+	getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall] = 34;
 
 	params->clear();
 
 	fedEx(kCharacterCond1, kCharacterCond1, 12, 0);
 }
 
-void LogicManager::HAND_Cond1_StartPart1(HAND_PARAMS) {
-	if (msg->action == 12) {
-		getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 1;
-		Cond1Call(&LogicManager::CONS_Cond1_DoWalk, 3, 2000, 0, 0);
-	} else if (msg->action == 18) {
-		if (getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] == 1) {
-			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 2;
-			Cond1Call(&LogicManager::CONS_Cond1_SitDown, 0, 0, 0, 0);
-		} else if (getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] == 2) {
-			CONS_Cond1_Sitting(0, 0, 0, 0);
+void LogicManager::HAND_Cond1_Birth(HAND_PARAMS) {
+	switch (msg->action) {
+	case 0:
+		if (_gameTime > 1062000 && !getCharacterCurrentParams(kCharacterCond1)[0]) {
+			getCharacterCurrentParams(kCharacterCond1)[0] = 1;
+			CONS_Cond1_StartPart1(0, 0, 0, 0);
 		}
+
+		break;
+	case 12:
+		autoMessage(kCharacterCond1, 171394341, 7);
+		autoMessage(kCharacterCond1, 169633856, 9);
+		autoMessage(kCharacterCond1, 238732837, 10);
+		autoMessage(kCharacterCond1, 269624833, 12);
+		autoMessage(kCharacterCond1, 302614416, 11);
+		autoMessage(kCharacterCond1, 190082817, 8);
+		autoMessage(kCharacterCond1, 269436673, 13);
+		autoMessage(kCharacterCond1, 303343617, 14);
+		autoMessage(kCharacterCond1, 224122407, 17);
+		autoMessage(kCharacterCond1, 201431954, 18);
+		autoMessage(kCharacterCond1, 188635520, 19);
+		autoMessage(kCharacterCond1, 204379649, 4);
+		getCharacterParams(kCharacterCond1, 8)[0] = 0;
+		getCharacter(kCharacterCond1).characterPosition.position = 9460;
+		getCharacter(kCharacterCond1).characterPosition.location = 0;
+		getCharacter(kCharacterCond1).characterPosition.car = kCarGreenSleeping;
+		break;
+	default:
+		break;
 	}
 }
 
-void LogicManager::CONS_Cond1_Sitting(CONS_PARAMS) {
+void LogicManager::CONS_Cond1_DeliverAugustMessage(CONS_PARAMS) {
 	CharacterCallParams *params = &getCharacter(kCharacterCond1).callParams[getCharacter(kCharacterCond1).currentCall];
-	_engine->getMessageManager()->setMessageHandle(kCharacterCond1, &LogicManager::HAND_Cond1_Sitting);
-	getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall] = 42;
+	_engine->getMessageManager()->setMessageHandle(kCharacterCond1, &LogicManager::HAND_Cond1_DeliverAugustMessage);
+	getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall] = 35;
 
 	params->clear();
 
 	fedEx(kCharacterCond1, kCharacterCond1, 12, 0);
 }
 
-void LogicManager::HAND_Cond1_Sitting(HAND_PARAMS) {
-	if (msg->action > 11) {
-		if (msg->action > 17) {
-			if (msg->action > 225358684) {
-				if (msg->action == 225932896) {
-					if (!getCharacterParams(kCharacterCond1, 8)[16] && !getCharacterParams(kCharacterCond1, 8)[0]) {
-						send(kCharacterCond1, kCharacterFrancois, 205346192, 0);
-					}
-				} else if (msg->action == 305159806 && !getCharacterParams(kCharacterCond1, 8)[16] && !getCharacterParams(kCharacterCond1, 8)[0]) {
-					getCharacter(kCharacterCond1).inventoryItem = kItemNone;
-					getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 24;
-					Cond1Call(&LogicManager::CONS_Cond1_CathRattling, msg->param, 0, 0, 0);
-				}
-			} else if (msg->action == 225358684) {
-				if (!getCharacterParams(kCharacterCond1, 8)[0]) {
-					getCharacter(kCharacterCond1).inventoryItem = kItemNone;
-					getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 23;
-					Cond1Call(&LogicManager::CONS_Cond1_CathBuzzing, msg->param, 0, 0, 0);
-				}
-			} else if (msg->action == 18) {
-				switch (getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8]) {
-				case 1:
-					playNIS(kEventMertensKronosInvitation);
-					_gameProgress[kProgressEventMertensChronosInvitation] = 1;
-					getCharacterParams(kCharacterCond1, 8)[5] = 0;
-					getCharacterParams(kCharacterCond1, 8)[6] = 0;
-					startSeqOtis(kCharacterCond1, "601A");
-					takeItem(kItem7);
-					getCharacterParams(kCharacterCond1, 8)[0] = 0;
-					getCharacter(kCharacterCond1).inventoryItem = kItemNone;
-					getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 2;
-					Cond1Call(&LogicManager::CONS_Cond1_FinishSeqOtis, 0, 0, 0, 0);
-					break;
-				case 2:
-				case 4:
-					startCycOtis(kCharacterCond1, "601B");
-					goto LABEL_61;
-				case 3:
-					playNIS((kEventMertensLastCarOriginalJacket - (_gameProgress[kProgressJacket] == 2)));
-					startSeqOtis(kCharacterCond1, "601A");
-					bumpCath(kCarGreenSleeping, 6, 255);
-					takeItem(kItem7);
-					getCharacterParams(kCharacterCond1, 8)[0] = 0;
-					getCharacter(kCharacterCond1).inventoryItem = kItemNone;
-					getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 4;
-					Cond1Call(&LogicManager::CONS_Cond1_FinishSeqOtis, 0, 0, 0, 0);
-					break;
-				case 5:
-				case 6:
-					goto LABEL_75;
-				case 8:
-					goto LABEL_80;
-				case 9:
-					goto LABEL_90;
-				case 10:
-					goto LABEL_93;
-				case 11:
-					goto LABEL_95;
-				case 12:
-					goto LABEL_97;
-				case 13:
-					goto LABEL_99;
-				case 14:
-					goto LABEL_101;
-				case 15:
-					goto LABEL_103;
-				case 16:
-					goto LABEL_105;
-				case 17:
-					goto LABEL_107;
-				case 18:
-					goto LABEL_109;
-				case 19:
-					getCharacterCurrentParams(kCharacterCond1)[0] = 1;
-					goto LABEL_69;
-				case 21:
-					playNIS(kEventMertensAskTylerCompartmentD);
-					startSeqOtis(kCharacterCond1, "601A");
-					_gameInventory[kItem7].location = 0;
-					bumpCath(kCarGreenSleeping, 25, 255);
-					getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 22;
-					Cond1Call(&LogicManager::CONS_Cond1_FinishSeqOtis, 0, 0, 0, 0);
-					break;
-				case 22:
-					startCycOtis(kCharacterCond1, "601B");
-					break;
-				default:
-					return;
-				}
-			}
-		} else if (msg->action == 17) {
-			if (!getCharacterParams(kCharacterCond1, 8)[16]) {
-				if (checkCathDir(kCarGreenSleeping, 23) && getCharacterParams(kCharacterCond1, 8)[6] && !_gameEvents[kEventKronosConversation]) {
-					getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 1;
-					Cond1Call(&LogicManager::CONS_Cond1_SaveGame, 2, 120, 0, 0);
-				} else if (!checkCathDir(kCarGreenSleeping, 23) || _gameProgress[kProgressEventMertensChronosInvitation] || _gameEvents[kEventMertensLastCar] || _gameEvents[kEventMertensLastCarOriginalJacket]) {
-				LABEL_61:
-					if (!checkCathDir(kCarGreenSleeping, 1) && !checkCathDir(kCarGreenSleeping, 23) || getCharacterParams(kCharacterCond1, 8)[0] || getCharacterParams(kCharacterCond1, 8)[16]) {
-					LABEL_75:
-						if (cathInCorridor(kCarGreenSleeping) && getCharacter(kCharacterCond1).characterPosition.position < getCharacter(kCharacterCath).characterPosition.position && (_gameProgress[1] == 1 || getCharacterParams(kCharacterCond1, 8)[6])) {
-							getCharacter(kCharacterCond1).inventoryItem = kItemNone;
-							getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 7;
-							Cond1Call(&LogicManager::CONS_Cond1_BathroomTrip, 0, 0, 0, 0);
-						}
-					} else {
-						getCharacter(kCharacterCond1).inventoryItem = kItemNone;
-						if (checkCathDir(kCarGreenSleeping, 1)) {
-							getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 5;
-							Cond1Call(&LogicManager::CONS_Cond1_Passing, 1, 0, 0, 0);
-						} else {
-							getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 6;
-							Cond1Call(&LogicManager::CONS_Cond1_Passing, 0, 0, 0, 0);
-						}
-					}
-				} else {
-					getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 3;
-					Cond1Call(&LogicManager::CONS_Cond1_SaveGame, 2, 118, 0, 0);
-				}
-			}
-		} else if (msg->action == 12) {
-			getCharacter(kCharacterCond1).characterPosition.car = kCarGreenSleeping;
-			getCharacter(kCharacterCond1).characterPosition.position = 1500;
-			getCharacter(kCharacterCond1).characterPosition.location = 0;
-			takeItem(kItem7);
-		}
-		return;
-	}
-	if (msg->action == 11) {
-		if (!getCharacterParams(kCharacterCond1, 8)[0] && !getCharacterParams(kCharacterCond1, 8)[16]) {
-			getCharacter(kCharacterCond1).inventoryItem = kItemNone;
-			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 20;
-			Cond1Call(&LogicManager::CONS_Cond1_Passing, msg->param, msg->sender, 0, 0);
-		}
-		return;
-	}
-	if (msg->action) {
-		if (msg->action == 1) {
-			getCharacter(kCharacterCond1).inventoryItem = kItemNone;
-			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 21;
-			Cond1Call(&LogicManager::CONS_Cond1_SaveGame, 2, 139, 0, 0);
+void LogicManager::HAND_Cond1_DeliverAugustMessage(HAND_PARAMS) {
+	switch (msg->action) {
+	case 12:
+		if (_gameProgress[kProgressField14] == 29) {
+			getCharacter(kCharacterCond1).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterCond1, _functionsCond1[getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall]]);
+			fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
+		} else {
+			_gameProgress[kProgressField14] = 3;
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 1;
+			Cond1Call(&LogicManager::CONS_Cond1_GetUp, 0, 0, 0, 0);
 		}
-		return;
-	}
-	if (getCharacterParams(kCharacterCond1, 8)[18]) {
-		getCharacterParams(kCharacterCond1, 8)[7] = 0;
-		getCharacterParams(kCharacterCond1, 8)[13] = 0;
-		getCharacterParams(kCharacterCond1, 8)[14] = 0;
-		getCharacterParams(kCharacterCond1, 8)[11] = 0;
-		getCharacterParams(kCharacterCond1, 8)[12] = 0;
-		getCharacterParams(kCharacterCond1, 8)[9] = 0;
-		getCharacterParams(kCharacterCond1, 8)[5] = 0;
-		getCharacterParams(kCharacterCond1, 8)[6] = 0;
-		getCharacterParams(kCharacterCond1, 8)[10] = 0;
-		getCharacterParams(kCharacterCond1, 8)[8] = 0;
-		getCharacterParams(kCharacterCond1, 8)[17] = 0;
-		getCharacterParams(kCharacterCond1, 8)[16] = 0;
-		getCharacterParams(kCharacterCond1, 8)[0] = 1;
-		getCharacterParams(kCharacterCond1, 8)[16] = 0;
-		getCharacterCurrentParams(kCharacterCond1)[0] = 1;
+
+		break;
+	case 18:
+		switch (getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8]) {
+		case 1:
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 2;
+			Cond1Call(&LogicManager::CONS_Cond1_DoWalk, 3, 8200, 0, 0);
+			break;
+		case 2:
+			if (!getCharacterParams(kCharacterCond1, 8)[9] ||
+				_gameProgress[kProgressEventMetAugust]) {
+				getCharacterParams(kCharacterCond1, 8)[9] = 0;
+
+				if (_gameProgress[kProgressField14] == 3)
+					_gameProgress[kProgressField14] = 0;
+
+				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 3;
+				Cond1Call(&LogicManager::CONS_Cond1_DoWalk, 3, 2000, 0, 0);
+			} else {
+				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 5;
+				Cond1Call(&LogicManager::CONS_Cond1_EnterTyler, 1, 0, 0, 0);
+			}
+
+			break;
+		case 3:
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 4;
+			Cond1Call(&LogicManager::CONS_Cond1_SitDown, 0, 0, 0, 0);
+			break;
+		case 4:
+		case 7:
+			getCharacter(kCharacterCond1).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterCond1, _functionsCond1[getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall]]);
+			fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
+			break;
+		case 5:
+			if (_gameProgress[kProgressField14] == 3)
+				_gameProgress[kProgressField14] = 0;
+
+			if (_gameProgress[kProgressEventMertensAugustWaiting])
+				getCharacterParams(kCharacterCond1, 8)[9] = 0;
+
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 6;
+			Cond1Call(&LogicManager::CONS_Cond1_DoWalk, 3, 2000, 0, 0);
+			break;
+		case 6:
+			getCharacterParams(kCharacterCond1, 8)[9] = 0;
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 7;
+			Cond1Call(&LogicManager::CONS_Cond1_SitDown, 0, 0, 0, 0);
+			break;
+		default:
+			break;
+		}
+
+		break;
+	default:
+		break;
+	}
+}
+
+void LogicManager::CONS_Cond1_DeliverKronosMessage(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterCond1).callParams[getCharacter(kCharacterCond1).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterCond1, &LogicManager::HAND_Cond1_DeliverKronosMessage);
+	getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall] = 36;
+
+	params->clear();
+
+	fedEx(kCharacterCond1, kCharacterCond1, 12, 0);
+}
+
+void LogicManager::HAND_Cond1_DeliverKronosMessage(HAND_PARAMS) {
+	switch (msg->action) {
+	case 12:
+		if (_gameProgress[kProgressField14] == 29) {
+			getCharacter(kCharacterCond1).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterCond1, _functionsCond1[getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall]]);
+			fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
+		} else {
+			_gameProgress[kProgressField14] = 3;
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 1;
+			Cond1Call(&LogicManager::CONS_Cond1_GetUp, 0, 0, 0, 0);
+		}
+
+		break;
+	case 18:
+		switch (getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8]) {
+		case 1:
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 2;
+			Cond1Call(&LogicManager::CONS_Cond1_DoWalk, 3, 8200, 0, 0);
+			return;
+		case 2:
+			if (!getCharacterParams(kCharacterCond1, 8)[5]) {
+				getCharacterParams(kCharacterCond1, 8)[5] = 0;
+				getCharacterParams(kCharacterCond1, 8)[6] = 0;
+
+				if (_gameProgress[kProgressField14] == 3)
+					_gameProgress[kProgressField14] = 0;
+
+				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 5;
+				Cond1Call(&LogicManager::CONS_Cond1_DoWalk, 3, 2000, 0, 0);
+				break;
+			}
+
+			if (cathInCorridor(kCarGreenSleeping) &&
+				getCharacter(kCharacterCond1).characterPosition.position < getCharacter(kCharacterCath).characterPosition.position) {
+				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 3;
+				Cond1Call(&LogicManager::CONS_Cond1_DoWalk, 3, 9460, 0, 0);
+			} else {
+				if (getCharacterParams(kCharacterCond1, 8)[5]) {
+					getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 7;
+					Cond1Call(&LogicManager::CONS_Cond1_EnterTyler, 2, 0, 0, 0);
+				} else {
+					getCharacterParams(kCharacterCond1, 8)[5] = 0;
+					getCharacterParams(kCharacterCond1, 8)[6] = 0;
+
+					if (_gameProgress[kProgressField14] == 3)
+						_gameProgress[kProgressField14] = 0;
+
+					getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 5;
+					Cond1Call(&LogicManager::CONS_Cond1_DoWalk, 3, 2000, 0, 0);
+				}
+			}
+
+			break;
+		case 3:
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 4;
+			Cond1Call(&LogicManager::CONS_Cond1_DoWalk, 3, 8200, 0, 0);
+			break;
+		case 4:
+			if (getCharacterParams(kCharacterCond1, 8)[5]) {
+				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 7;
+				Cond1Call(&LogicManager::CONS_Cond1_EnterTyler, 2, 0, 0, 0);
+			} else {
+				getCharacterParams(kCharacterCond1, 8)[5] = 0;
+				getCharacterParams(kCharacterCond1, 8)[6] = 0;
+				if (_gameProgress[kProgressField14] == 3)
+					_gameProgress[kProgressField14] = 0;
+				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 5;
+				Cond1Call(&LogicManager::CONS_Cond1_DoWalk, 3, 2000, 0, 0);
+			}
+
+			break;
+		case 5:
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 6;
+			Cond1Call(&LogicManager::CONS_Cond1_SitDown, 0, 0, 0, 0);
+			break;
+		case 6:
+		case 9:
+			getCharacter(kCharacterCond1).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterCond1, _functionsCond1[getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall]]);
+			fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
+			break;
+		case 7:
+			if (_gameProgress[kProgressField14] == 3)
+				_gameProgress[kProgressField14] = 0;
+
+			if (!_gameProgress[kProgressEventMertensChronosInvitation])
+				getCharacterParams(kCharacterCond1, 8)[6] = 1;
+
+			getCharacterParams(kCharacterCond1, 8)[5] = 0;
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 8;
+			Cond1Call(&LogicManager::CONS_Cond1_DoWalk, 3, 2000, 0, 0);
+			break;
+		case 8:
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 9;
+			Cond1Call(&LogicManager::CONS_Cond1_SitDown, 0, 0, 0, 0);
+			break;
+		default:
+			break;
+		}
+
+		break;
+	default:
+		break;
+	}
+}
+
+void LogicManager::CONS_Cond1_VisitCond2Special(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterCond1).callParams[getCharacter(kCharacterCond1).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterCond1, &LogicManager::HAND_Cond1_VisitCond2Special);
+	getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall] = 37;
+
+	params->clear();
+
+	fedEx(kCharacterCond1, kCharacterCond1, 12, 0);
+}
+
+void LogicManager::HAND_Cond1_VisitCond2Special(HAND_PARAMS) {
+	switch (msg->action) {
+	case 0:
+		if (getCharacterCurrentParams(kCharacterCond1)[0] >= 2 && getCharacterCurrentParams(kCharacterCond1)[1]) {
+			send(kCharacterCond1, kCharacterCond2, 125499160, 0);
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 3;
+			Cond1Call(&LogicManager::CONS_Cond1_DoWalk, 3, 2000, 0, 0);
+		}
+
+		break;
+	case 2:
+		getCharacterCurrentParams(kCharacterCond1)[0]++;
+		if (getCharacterCurrentParams(kCharacterCond1)[0] == 1) {
+			if (nearChar(kCharacterCond1, kCharacterCath, 2000))
+				playDialog(kCharacterCond1, "CON1152", -1, 0);
+			else
+				playDialog(kCharacterCond1, "CON1151", -1, 0);
+		}
+
+		break;
+	case 12:
+		getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 1;
+		Cond1Call(&LogicManager::CONS_Cond1_GetUp, 0, 0, 0, 0);
+		break;
+	case 18:
+		switch (getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8]) {
+		case 1:
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 2;
+			Cond1Call(&LogicManager::CONS_Cond1_DoWalk, 4, 1500, 0, 0);
+			break;
+		case 2:
+			startCycOtis(kCharacterCond1, "601O");
+			send(kCharacterCond1, kCharacterCond2, 154005632, 0);
+			break;
+		case 3:
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 4;
+			Cond1Call(&LogicManager::CONS_Cond1_SitDown, 0, 0, 0, 0);
+			break;
+		case 4:
+			getCharacter(kCharacterCond1).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterCond1, _functionsCond1[getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall]]);
+			fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
+			break;
+		default:
+			break;
+		}
+
+		break;
+	case 155853632:
 		getCharacterCurrentParams(kCharacterCond1)[1] = 1;
-		startCycOtis(kCharacterCond1, "601E");
-		getCharacterParams(kCharacterCond1, 8)[18] = 0;
+		break;
+	case 202558662:
+		startCycOtis(kCharacterCond1, "601L");
+		playDialog(kCharacterCond1, "CON1150", -1, 0);
+		break;
+	default:
+		break;
+	}
+}
+
+void LogicManager::CONS_Cond1_MakeBedTyler(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterCond1).callParams[getCharacter(kCharacterCond1).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterCond1, &LogicManager::HAND_Cond1_MakeBedTyler);
+	getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall] = 38;
+
+	params->clear();
+
+	fedEx(kCharacterCond1, kCharacterCond1, 12, 0);
+}
+
+void LogicManager::HAND_Cond1_MakeBedTyler(HAND_PARAMS) {
+	switch (msg->action) {
+	case 12:
+		if (getCharacterParams(kCharacterCond1, 8)[3] && _gameProgress[kProgressField14] != 29) {
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 1;
+			Cond1Call(&LogicManager::CONS_Cond1_DoWalk, 3, 8200, 0, 0);
+		} else {
+			getCharacter(kCharacterCond1).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterCond1, _functionsCond1[getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall]]);
+			fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
+		}
+
+		break;
+	case 18:
+		if (getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] == 1) {
+			if (getCharacterParams(kCharacterCond1, 8)[3]) {
+				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 2;
+				Cond1Call(&LogicManager::CONS_Cond1_EnterTyler, 0, 0, 0, 0);
+			} else {
+				getCharacter(kCharacterCond1).currentCall--;
+				_engine->getMessageManager()->setMessageHandle(kCharacterCond1, _functionsCond1[getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall]]);
+				fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
+			}
+
+			break;
+		}
+
+		if (getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] == 2) {
+			getCharacterParams(kCharacterCond1, 8)[3] = 0;
+			getCharacter(kCharacterCond1).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterCond1, _functionsCond1[getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall]]);
+			fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
+		}
+
+		break;
+	default:
+		break;
 	}
-	if (getCharacterParams(kCharacterCond1, 8)[16] ||
-		_gameProgress[kProgressEventFoundCorpse] ||
-		_gameEvents[kEventMertensAskTylerCompartment] ||
-		_gameEvents[kEventMertensAskTylerCompartmentD]) {
+}
+
+void LogicManager::CONS_Cond1_MakeAllBeds(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterCond1).callParams[getCharacter(kCharacterCond1).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterCond1, &LogicManager::HAND_Cond1_MakeAllBeds);
+	getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall] = 39;
+
+	params->clear();
+
+	fedEx(kCharacterCond1, kCharacterCond1, 12, 0);
+}
+
+void LogicManager::HAND_Cond1_MakeAllBeds(HAND_PARAMS) {
+	switch (msg->action) {
+	case 12:
+		getCharacterParams(kCharacterCond1, 8)[3] = 1;
+		getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 1;
+		Cond1Call(&LogicManager::CONS_Cond1_GetUp, 0, 0, 0, 0);
+		break;
+	case 18:
+		switch (getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8]) {
+		case 1:
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 2;
+			Cond1Call(&LogicManager::CONS_Cond1_MakeBedMahmud, 0, 0, 0, 0);
+			break;
+		case 2:
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 3;
+			Cond1Call(&LogicManager::CONS_Cond1_DoPending, 0, 0, 0, 0);
+			break;
+		case 3:
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 4;
+			Cond1Call(&LogicManager::CONS_Cond1_MakeBedAugust, 0, 0, 0, 0);
+			break;
+		case 4:
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 5;
+			Cond1Call(&LogicManager::CONS_Cond1_DoPending, 0, 0, 0, 0);
+			break;
+		case 5:
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 6;
+			Cond1Call(&LogicManager::CONS_Cond1_MakeBedAlexei, 0, 0, 0, 0);
+			break;
+		case 6:
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 7;
+			Cond1Call(&LogicManager::CONS_Cond1_DoPending, 0, 0, 0, 0);
+			break;
+		case 7:
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 8;
+			Cond1Call(&LogicManager::CONS_Cond1_MakeBedTyler, 0, 0, 0, 0);
+			break;
+		case 8:
+			if (_gameProgress[kProgressField14] == 3)
+				_gameProgress[kProgressField14] = 0;
+
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 9;
+			Cond1Call(&LogicManager::CONS_Cond1_DoWalk, 3, 2000, 0, 0);
+			break;
+		case 9:
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 10;
+			Cond1Call(&LogicManager::CONS_Cond1_SitDown, 0, 0, 0, 0);
+			break;
+		case 10:
+			getCharacter(kCharacterCond1).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterCond1, _functionsCond1[getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall]]);
+			fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
+			break;
+		default:
+			break;
+		}
+
+		break;
+	default:
+		break;
+	}
+}
+
+void LogicManager::CONS_Cond1_VisitKahina(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterCond1).callParams[getCharacter(kCharacterCond1).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterCond1, &LogicManager::HAND_Cond1_VisitKahina);
+	getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall] = 40;
+
+	params->clear();
+
+	fedEx(kCharacterCond1, kCharacterCond1, 12, 0);
+}
+
+void LogicManager::HAND_Cond1_VisitKahina(HAND_PARAMS) {
+	switch (msg->action) {
+	case 12:
+		getCharacterParams(kCharacterCond1, 8)[10] = 0;
+		getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 1;
+		Cond1Call(&LogicManager::CONS_Cond1_GetUp, 0, 0, 0, 0);
+		break;
+	case 18:
+		switch (getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8]) {
+		case 1:
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 2;
+			Cond1Call(&LogicManager::CONS_Cond1_DoWalk, 2, 9460, 0, 0);
+			break;
+		case 2:
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 3;
+			Cond1Call(&LogicManager::CONS_Cond1_DoWait, 1800, 0, 0, 0);
+			break;
+		case 3:
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 4;
+			Cond1Call(&LogicManager::CONS_Cond1_DoWalk, 3, 1500, 0, 0);
+			break;
+		case 4:
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 5;
+			Cond1Call(&LogicManager::CONS_Cond1_SitDown, 0, 0, 0, 0);
+			break;
+		case 5:
+			getCharacterParams(kCharacterCond1, 8)[5] = 1;
+			getCharacter(kCharacterCond1).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterCond1, _functionsCond1[getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall]]);
+			fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
+			break;
+		default:
+			break;
+		}
+
+		break;
+	default:
+		break;
+	}
+}
+
+void LogicManager::CONS_Cond1_StartPart1(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterCond1).callParams[getCharacter(kCharacterCond1).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterCond1, &LogicManager::HAND_Cond1_StartPart1);
+	getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall] = 41;
+
+	params->clear();
+
+	fedEx(kCharacterCond1, kCharacterCond1, 12, 0);
+}
+
+void LogicManager::HAND_Cond1_StartPart1(HAND_PARAMS) {
+	switch (msg->action) {
+	case 12:
+		getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 1;
+		Cond1Call(&LogicManager::CONS_Cond1_DoWalk, 3, 2000, 0, 0);
+		break;
+	case 18:
+		if (getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] == 1) {
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 2;
+			Cond1Call(&LogicManager::CONS_Cond1_SitDown, 0, 0, 0, 0);
+		} else if (getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] == 2) {
+			CONS_Cond1_Sitting(0, 0, 0, 0);
+		}
+
+		break;
+	default:
+		break;
+	}
+}
+
+void LogicManager::CONS_Cond1_Sitting(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterCond1).callParams[getCharacter(kCharacterCond1).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterCond1, &LogicManager::HAND_Cond1_Sitting);
+	getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall] = 42;
+
+	params->clear();
+
+	fedEx(kCharacterCond1, kCharacterCond1, 12, 0);
+}
+
+void LogicManager::HAND_Cond1_Sitting(HAND_PARAMS) {
+	switch (msg->action) {
+	case 0:
+	{
+		if (getCharacterParams(kCharacterCond1, 8)[18]) {
+			getCharacterParams(kCharacterCond1, 8)[7] = 0;
+			getCharacterParams(kCharacterCond1, 8)[13] = 0;
+			getCharacterParams(kCharacterCond1, 8)[14] = 0;
+			getCharacterParams(kCharacterCond1, 8)[11] = 0;
+			getCharacterParams(kCharacterCond1, 8)[12] = 0;
+			getCharacterParams(kCharacterCond1, 8)[9] = 0;
+			getCharacterParams(kCharacterCond1, 8)[5] = 0;
+			getCharacterParams(kCharacterCond1, 8)[6] = 0;
+			getCharacterParams(kCharacterCond1, 8)[10] = 0;
+			getCharacterParams(kCharacterCond1, 8)[8] = 0;
+			getCharacterParams(kCharacterCond1, 8)[17] = 0;
+			getCharacterParams(kCharacterCond1, 8)[16] = 0;
+			getCharacterParams(kCharacterCond1, 8)[0] = 1;
+			getCharacterParams(kCharacterCond1, 8)[16] = 0;
+			getCharacterCurrentParams(kCharacterCond1)[0] = 1;
+			getCharacterCurrentParams(kCharacterCond1)[1] = 1;
+			startCycOtis(kCharacterCond1, "601E");
+			getCharacterParams(kCharacterCond1, 8)[18] = 0;
+		}
+
+		if (getCharacterParams(kCharacterCond1, 8)[16] ||
+			_gameProgress[kProgressEventFoundCorpse] ||
+			_gameEvents[kEventMertensAskTylerCompartment] ||
+			_gameEvents[kEventMertensAskTylerCompartmentD]) {
+			getCharacter(kCharacterCond1).inventoryItem = kItemNone;
+		} else {
+			getCharacter(kCharacterCond1).inventoryItem = 0x80;
+		}
+
+		if (!getCharacterCurrentParams(kCharacterCond1)[1]) {
+			if (_gameTime > 1125000 && !getCharacterCurrentParams(kCharacterCond1)[2]) {
+				getCharacterCurrentParams(kCharacterCond1)[2] = 1;
+				send(kCharacterCond1, kCharacterMahmud, 170483072, 0);
+			}
+
+			if (getCharacterCurrentParams(kCharacterCond1)[3] != 0x7FFFFFFF && _gameTime > 1170900) {
+				if (_gameTime > 1188000) {
+					getCharacterCurrentParams(kCharacterCond1)[3] = 0x7FFFFFFF;
+					getCharacter(kCharacterCond1).inventoryItem = kItemNone;
+					getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 8;
+					Cond1Call(&LogicManager::CONS_Cond1_VisitCond2Double, "CON1210", "CON1210A", 0, 0);
+					break;
+				}
+
+				if (!cathInCorridor(kCarGreenSleeping) &&
+						!cathInCorridor(kCarRedSleeping) ||
+					dialogRunning("REB1205") ||
+					!inComp(kCharacterMadame, kCarRedSleeping, 5790) ||
+					!getCharacterCurrentParams(kCharacterCond1)[3]) {
+
+					getCharacterCurrentParams(kCharacterCond1)[3] = _gameTime;
+					if (!_gameTime) {
+						getCharacter(kCharacterCond1).inventoryItem = kItemNone;
+						getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 8;
+						Cond1Call(&LogicManager::CONS_Cond1_VisitCond2Double, "CON1210", "CON1210A", 0, 0);
+						break;
+					}
+				}
+
+				if (getCharacterCurrentParams(kCharacterCond1)[3] < _gameTime) {
+					getCharacterCurrentParams(kCharacterCond1)[3] = 0x7FFFFFFF;
+					getCharacter(kCharacterCond1).inventoryItem = kItemNone;
+					getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 8;
+					Cond1Call(&LogicManager::CONS_Cond1_VisitCond2Double, "CON1210", "CON1210A", 0, 0);
+					break;
+				}
+			}
+		}
+
+		bool skip = false;
+		if (_gameTime > 1215000 && !getCharacterParams(kCharacterCond1, 8)[0] && !getCharacterParams(kCharacterCond1, 8)[16]) {
+			if (!getCharacterCurrentParams(kCharacterCond1)[4]) {
+				getCharacterCurrentParams(kCharacterCond1)[4] = _gameTime + 2700;
+				if (_gameTime == -2700) {
+					skip = true;
+					startCycOtis(kCharacterCond1, "601E");
+					getCharacterParams(kCharacterCond1, 8)[0] = 1;
+					getCharacterCurrentParams(kCharacterCond1)[4] = 0;
+				}
+			}
+
+			if (!skip && getCharacterCurrentParams(kCharacterCond1)[4] < _gameTime) {
+				getCharacterCurrentParams(kCharacterCond1)[4] = 0x7FFFFFFF;
+				startCycOtis(kCharacterCond1, "601E");
+				getCharacterParams(kCharacterCond1, 8)[0] = 1;
+				getCharacterCurrentParams(kCharacterCond1)[4] = 0;
+			}
+		}
+
+		if (getCharacterParams(kCharacterCond1, 8)[7]) {
+			getCharacter(kCharacterCond1).inventoryItem = kItemNone;
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 9;
+			Cond1Call(&LogicManager::CONS_Cond1_Listen, 9, 0, 0, 0);
+			break;
+		}
+
+		if (_gameProgress[kProgressField14] != 29) {
+			if (getCharacterParams(kCharacterCond1, 8)[13]) {
+				getCharacter(kCharacterCond1).inventoryItem = kItemNone;
+				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 10;
+				Cond1Call(&LogicManager::CONS_Cond1_AugustLockUnlockMyComp, 1, 0, 0, 0);
+				break;
+			}
+
+			if (getCharacterParams(kCharacterCond1, 8)[14]) {
+				getCharacter(kCharacterCond1).inventoryItem = kItemNone;
+				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 11;
+				Cond1Call(&LogicManager::CONS_Cond1_AugustLockUnlockMyComp, 0, 0, 0, 0);
+				break;
+			}
+
+			if (getCharacterParams(kCharacterCond1, 8)[12]) {
+				getCharacter(kCharacterCond1).inventoryItem = kItemNone;
+				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 12;
+				Cond1Call(&LogicManager::CONS_Cond1_AlexeiLockUnlockMyComp, 1, 0, 0, 0);
+				break;
+			}
+
+			if (getCharacterParams(kCharacterCond1, 8)[11]) {
+				getCharacter(kCharacterCond1).inventoryItem = kItemNone;
+				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 13;
+				Cond1Call(&LogicManager::CONS_Cond1_AlexeiLockUnlockMyComp, 0, 0, 0, 0);
+				break;
+			}
+		}
+
+		if (getCharacterParams(kCharacterCond1, 8)[9]) {
+			getCharacter(kCharacterCond1).inventoryItem = kItemNone;
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 14;
+			Cond1Call(&LogicManager::CONS_Cond1_DeliverAugustMessage, 0, 0, 0, 0);
+			break;
+		}
+
+		if (getCharacterParams(kCharacterCond1, 8)[5]) {
+			getCharacter(kCharacterCond1).inventoryItem = kItemNone;
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 15;
+			Cond1Call(&LogicManager::CONS_Cond1_DeliverKronosMessage, 0, 0, 0, 0);
+			break;
+		}
+
+		if (getCharacterParams(kCharacterCond1, 8)[10]) {
+			getCharacter(kCharacterCond1).inventoryItem = kItemNone;
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 16;
+			Cond1Call(&LogicManager::CONS_Cond1_VisitKahina, 0, 0, 0, 0);
+			break;
+		}
+
+		if (getCharacterParams(kCharacterCond1, 8)[8]) {
+			getCharacter(kCharacterCond1).inventoryItem = kItemNone;
+			getCharacterParams(kCharacterCond1, 8)[8] = 0;
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 17;
+			Cond1Call(&LogicManager::CONS_Cond1_VisitCond2, "CON1200", 0, 0, 0);
+			break;
+		}
+
+		if (getCharacterParams(kCharacterCond1, 8)[17]) {
+			getCharacter(kCharacterCond1).inventoryItem = kItemNone;
+			getCharacterParams(kCharacterCond1, 8)[17] = 0;
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 18;
+			Cond1Call(&LogicManager::CONS_Cond1_VisitCond2Special, 0, 0, 0, 0);
+			break;
+		}
+
+		if (getCharacterCurrentParams(kCharacterCond1)[0] || !getCharacterParams(kCharacterCond1, 8)[4]) {
+			if (getCharacterParams(kCharacterCond1, 8)[0] &&
+				!whoRunningDialog(kCharacterCond1) && _gameProgress[kProgressField18] != 4) {
+				playDialog(kCharacterCond1, "CON1505", -1, 0);
+			}
+
+			break;
+		}
+
 		getCharacter(kCharacterCond1).inventoryItem = kItemNone;
-	} else {
-		getCharacter(kCharacterCond1).inventoryItem = 0x80;
+		getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 19;
+		Cond1Call(&LogicManager::CONS_Cond1_MakeAllBeds, 0, 0, 0, 0);
+
+		break;
 	}
+	case 1:
+		getCharacter(kCharacterCond1).inventoryItem = kItemNone;
+		getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 21;
+		Cond1Call(&LogicManager::CONS_Cond1_SaveGame, 2, kEventMertensAskTylerCompartmentD, 0, 0);
+		break;
+	case 11:
+		if (!getCharacterParams(kCharacterCond1, 8)[0] && !getCharacterParams(kCharacterCond1, 8)[16]) {
+			getCharacter(kCharacterCond1).inventoryItem = kItemNone;
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 20;
+			Cond1Call(&LogicManager::CONS_Cond1_Passing, msg->param, msg->sender, 0, 0);
+		}
 
-	if (!getCharacterCurrentParams(kCharacterCond1)[1]) {
-		if (_gameTime > 1125000 && !getCharacterCurrentParams(kCharacterCond1)[2]) {
-			getCharacterCurrentParams(kCharacterCond1)[2] = 1;
-			send(kCharacterCond1, kCharacterMahmud, 170483072, 0);
+		break;
+	case 12:
+		getCharacter(kCharacterCond1).characterPosition.car = kCarGreenSleeping;
+		getCharacter(kCharacterCond1).characterPosition.position = 1500;
+		getCharacter(kCharacterCond1).characterPosition.location = 0;
+		takeItem(kItem7);
+		break;
+	case 17:
+		if (!getCharacterParams(kCharacterCond1, 8)[16]) {
+			if (checkCathDir(kCarGreenSleeping, 23) && getCharacterParams(kCharacterCond1, 8)[6] && !_gameEvents[kEventKronosConversation]) {
+				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 1;
+				Cond1Call(&LogicManager::CONS_Cond1_SaveGame, 2, kEventMertensKronosInvitation, 0, 0);
+			} else if (!checkCathDir(kCarGreenSleeping, 23) || _gameProgress[kProgressEventMertensChronosInvitation] || _gameEvents[kEventMertensLastCar] || _gameEvents[kEventMertensLastCarOriginalJacket]) {
+				if (!checkCathDir(kCarGreenSleeping, 1) && !checkCathDir(kCarGreenSleeping, 23) || getCharacterParams(kCharacterCond1, 8)[0] || getCharacterParams(kCharacterCond1, 8)[16]) {
+					if (cathInCorridor(kCarGreenSleeping) && getCharacter(kCharacterCond1).characterPosition.position < getCharacter(kCharacterCath).characterPosition.position && (_gameProgress[1] == 1 || getCharacterParams(kCharacterCond1, 8)[6])) {
+						getCharacter(kCharacterCond1).inventoryItem = kItemNone;
+						getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 7;
+						Cond1Call(&LogicManager::CONS_Cond1_BathroomTrip, 0, 0, 0, 0);
+					}
+				} else {
+					getCharacter(kCharacterCond1).inventoryItem = kItemNone;
+					if (checkCathDir(kCarGreenSleeping, 1)) {
+						getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 5;
+						Cond1Call(&LogicManager::CONS_Cond1_Passing, 1, 0, 0, 0);
+					} else {
+						getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 6;
+						Cond1Call(&LogicManager::CONS_Cond1_Passing, 0, 0, 0, 0);
+					}
+				}
+			} else {
+				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 3;
+				Cond1Call(&LogicManager::CONS_Cond1_SaveGame, 2, kEventMertensLastCar, 0, 0);
+			}
+		}
+
+		break;
+	case 18:
+		switch (getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8]) {
+		case 1:
+			playNIS(kEventMertensKronosInvitation);
+			_gameProgress[kProgressEventMertensChronosInvitation] = 1;
+			getCharacterParams(kCharacterCond1, 8)[5] = 0;
+			getCharacterParams(kCharacterCond1, 8)[6] = 0;
+			startSeqOtis(kCharacterCond1, "601A");
+			takeItem(kItem7);
+			getCharacterParams(kCharacterCond1, 8)[0] = 0;
+			getCharacter(kCharacterCond1).inventoryItem = kItemNone;
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 2;
+			Cond1Call(&LogicManager::CONS_Cond1_FinishSeqOtis, 0, 0, 0, 0);
+			break;
+		case 2:
+		case 4:
+			startCycOtis(kCharacterCond1, "601B");
+			if (!checkCathDir(kCarGreenSleeping, 1) && !checkCathDir(kCarGreenSleeping, 23) || getCharacterParams(kCharacterCond1, 8)[0] || getCharacterParams(kCharacterCond1, 8)[16]) {
+				if (cathInCorridor(kCarGreenSleeping) && getCharacter(kCharacterCond1).characterPosition.position < getCharacter(kCharacterCath).characterPosition.position && (_gameProgress[1] == 1 || getCharacterParams(kCharacterCond1, 8)[6])) {
+					getCharacter(kCharacterCond1).inventoryItem = kItemNone;
+					getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 7;
+					Cond1Call(&LogicManager::CONS_Cond1_BathroomTrip, 0, 0, 0, 0);
+				}
+			} else {
+				getCharacter(kCharacterCond1).inventoryItem = kItemNone;
+				if (checkCathDir(kCarGreenSleeping, 1)) {
+					getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 5;
+					Cond1Call(&LogicManager::CONS_Cond1_Passing, 1, 0, 0, 0);
+				} else {
+					getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 6;
+					Cond1Call(&LogicManager::CONS_Cond1_Passing, 0, 0, 0, 0);
+				}
+			}
+
+			break;
+		case 3:
+			playNIS((kEventMertensLastCarOriginalJacket - (_gameProgress[kProgressJacket] == 2)));
+			startSeqOtis(kCharacterCond1, "601A");
+			bumpCath(kCarGreenSleeping, 6, 255);
+			takeItem(kItem7);
+			getCharacterParams(kCharacterCond1, 8)[0] = 0;
+			getCharacter(kCharacterCond1).inventoryItem = kItemNone;
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 4;
+			Cond1Call(&LogicManager::CONS_Cond1_FinishSeqOtis, 0, 0, 0, 0);
+			break;
+		case 5:
+		case 6:
+			if (cathInCorridor(kCarGreenSleeping) && getCharacter(kCharacterCond1).characterPosition.position < getCharacter(kCharacterCath).characterPosition.position && (_gameProgress[1] == 1 || getCharacterParams(kCharacterCond1, 8)[6])) {
+				getCharacter(kCharacterCond1).inventoryItem = kItemNone;
+				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 7;
+				Cond1Call(&LogicManager::CONS_Cond1_BathroomTrip, 0, 0, 0, 0);
+			}
+
+			break;
+		case 8:
+		{
+			bool skip = false;
+			if (_gameTime > 1215000 && !getCharacterParams(kCharacterCond1, 8)[0] && !getCharacterParams(kCharacterCond1, 8)[16]) {
+				if (!getCharacterCurrentParams(kCharacterCond1)[4]) {
+					getCharacterCurrentParams(kCharacterCond1)[4] = _gameTime + 2700;
+					if (_gameTime == -2700) {
+						skip = true;
+						startCycOtis(kCharacterCond1, "601E");
+						getCharacterParams(kCharacterCond1, 8)[0] = 1;
+						getCharacterCurrentParams(kCharacterCond1)[4] = 0;
+					}
+				}
+
+				if (!skip && getCharacterCurrentParams(kCharacterCond1)[4] < _gameTime) {
+					getCharacterCurrentParams(kCharacterCond1)[4] = 0x7FFFFFFF;
+					startCycOtis(kCharacterCond1, "601E");
+					getCharacterParams(kCharacterCond1, 8)[0] = 1;
+					getCharacterCurrentParams(kCharacterCond1)[4] = 0;
+				}
+			}
+
+			if (getCharacterParams(kCharacterCond1, 8)[7]) {
+				getCharacter(kCharacterCond1).inventoryItem = kItemNone;
+				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 9;
+				Cond1Call(&LogicManager::CONS_Cond1_Listen, 9, 0, 0, 0);
+				break;
+			}
+
+			// fall through
 		}
-		if (getCharacterCurrentParams(kCharacterCond1)[3] != 0x7FFFFFFF && _gameTime > 1170900) {
-			if (_gameTime > 1188000)
-				goto LABEL_39;
+		case 9:
+			if (_gameProgress[kProgressField14] != 29) {
+				if (getCharacterParams(kCharacterCond1, 8)[13]) {
+					getCharacter(kCharacterCond1).inventoryItem = kItemNone;
+					getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 10;
+					Cond1Call(&LogicManager::CONS_Cond1_AugustLockUnlockMyComp, 1, 0, 0, 0);
+					break;
+				}
+
+				if (getCharacterParams(kCharacterCond1, 8)[14]) {
+					getCharacter(kCharacterCond1).inventoryItem = kItemNone;
+					getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 11;
+					Cond1Call(&LogicManager::CONS_Cond1_AugustLockUnlockMyComp, 0, 0, 0, 0);
+					break;
+				}
+
+				if (getCharacterParams(kCharacterCond1, 8)[12]) {
+					getCharacter(kCharacterCond1).inventoryItem = kItemNone;
+					getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 12;
+					Cond1Call(&LogicManager::CONS_Cond1_AlexeiLockUnlockMyComp, 1, 0, 0, 0);
+					break;
+				}
+
+				if (getCharacterParams(kCharacterCond1, 8)[11]) {
+					getCharacter(kCharacterCond1).inventoryItem = kItemNone;
+					getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 13;
+					Cond1Call(&LogicManager::CONS_Cond1_AlexeiLockUnlockMyComp, 0, 0, 0, 0);
+					break;
+				}
+			}
+
+			if (getCharacterParams(kCharacterCond1, 8)[9]) {
+				getCharacter(kCharacterCond1).inventoryItem = kItemNone;
+				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 14;
+				Cond1Call(&LogicManager::CONS_Cond1_DeliverAugustMessage, 0, 0, 0, 0);
+				break;
+			}
+
+			if (getCharacterParams(kCharacterCond1, 8)[5]) {
+				getCharacter(kCharacterCond1).inventoryItem = kItemNone;
+				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 15;
+				Cond1Call(&LogicManager::CONS_Cond1_DeliverKronosMessage, 0, 0, 0, 0);
+				break;
+			}
+
+			if (getCharacterParams(kCharacterCond1, 8)[10]) {
+				getCharacter(kCharacterCond1).inventoryItem = kItemNone;
+				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 16;
+				Cond1Call(&LogicManager::CONS_Cond1_VisitKahina, 0, 0, 0, 0);
+				break;
+			}
+
+			if (getCharacterParams(kCharacterCond1, 8)[8]) {
+				getCharacter(kCharacterCond1).inventoryItem = kItemNone;
+				getCharacterParams(kCharacterCond1, 8)[8] = 0;
+				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 17;
+				Cond1Call(&LogicManager::CONS_Cond1_VisitCond2, "CON1200", 0, 0, 0);
+				break;
+			}
+
+			if (getCharacterParams(kCharacterCond1, 8)[17]) {
+				getCharacter(kCharacterCond1).inventoryItem = kItemNone;
+				getCharacterParams(kCharacterCond1, 8)[17] = 0;
+				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 18;
+				Cond1Call(&LogicManager::CONS_Cond1_VisitCond2Special, 0, 0, 0, 0);
+				break;
+			}
+
+			if (getCharacterCurrentParams(kCharacterCond1)[0] || !getCharacterParams(kCharacterCond1, 8)[4]) {
+				if (getCharacterParams(kCharacterCond1, 8)[0] &&
+					!whoRunningDialog(kCharacterCond1) && _gameProgress[kProgressField18] != 4) {
+					playDialog(kCharacterCond1, "CON1505", -1, 0);
+				}
+
+				break;
+			}
+
+			getCharacter(kCharacterCond1).inventoryItem = kItemNone;
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 19;
+			Cond1Call(&LogicManager::CONS_Cond1_MakeAllBeds, 0, 0, 0, 0);
+
+			break;
+		case 10:
+			if (getCharacterParams(kCharacterCond1, 8)[14]) {
+				getCharacter(kCharacterCond1).inventoryItem = kItemNone;
+				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 11;
+				Cond1Call(&LogicManager::CONS_Cond1_AugustLockUnlockMyComp, 0, 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 11:
+			if (getCharacterParams(kCharacterCond1, 8)[12]) {
+				getCharacter(kCharacterCond1).inventoryItem = kItemNone;
+				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 12;
+				Cond1Call(&LogicManager::CONS_Cond1_AlexeiLockUnlockMyComp, 1, 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 12:
+			if (getCharacterParams(kCharacterCond1, 8)[11]) {
+				getCharacter(kCharacterCond1).inventoryItem = kItemNone;
+				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 13;
+				Cond1Call(&LogicManager::CONS_Cond1_AlexeiLockUnlockMyComp, 0, 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 13:
+			if (getCharacterParams(kCharacterCond1, 8)[9]) {
+				getCharacter(kCharacterCond1).inventoryItem = kItemNone;
+				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 14;
+				Cond1Call(&LogicManager::CONS_Cond1_DeliverAugustMessage, 0, 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 14:
+			if (getCharacterParams(kCharacterCond1, 8)[5]) {
+				getCharacter(kCharacterCond1).inventoryItem = kItemNone;
+				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 15;
+				Cond1Call(&LogicManager::CONS_Cond1_DeliverKronosMessage, 0, 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 15:
+			if (getCharacterParams(kCharacterCond1, 8)[10]) {
+				getCharacter(kCharacterCond1).inventoryItem = kItemNone;
+				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 16;
+				Cond1Call(&LogicManager::CONS_Cond1_VisitKahina, 0, 0, 0, 0);
+				break;
+			}
 
-			if (!cathInCorridor(kCarGreenSleeping) &&
-				!cathInCorridor(kCarRedSleeping) ||
-				dialogRunning("REB1205") ||
-				!inComp(kCharacterMadame, kCarRedSleeping, 5790) ||
-				!getCharacterCurrentParams(kCharacterCond1)[3]) {
+			// fall through
+		case 16:
+			if (getCharacterParams(kCharacterCond1, 8)[8]) {
+				getCharacter(kCharacterCond1).inventoryItem = kItemNone;
+				getCharacterParams(kCharacterCond1, 8)[8] = 0;
+				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 17;
+				Cond1Call(&LogicManager::CONS_Cond1_VisitCond2, "CON1200", 0, 0, 0);
+				break;
+			}
 
-				getCharacterCurrentParams(kCharacterCond1)[3] = _gameTime;
-				if (!_gameTime)
-					goto LABEL_40;
+			// fall through
+		case 17:
+			if (getCharacterParams(kCharacterCond1, 8)[17]) {
+				getCharacter(kCharacterCond1).inventoryItem = kItemNone;
+				getCharacterParams(kCharacterCond1, 8)[17] = 0;
+				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 18;
+				Cond1Call(&LogicManager::CONS_Cond1_VisitCond2Special, 0, 0, 0, 0);
+				break;
 			}
 
-			if (getCharacterCurrentParams(kCharacterCond1)[3] < _gameTime) {
-			LABEL_39:
-				getCharacterCurrentParams(kCharacterCond1)[3] = 0x7FFFFFFF;
-			LABEL_40:
+			// fall through
+		case 18:
+			if (getCharacterCurrentParams(kCharacterCond1)[0] || !getCharacterParams(kCharacterCond1, 8)[4]) {
+				if (getCharacterParams(kCharacterCond1, 8)[0] &&
+					!whoRunningDialog(kCharacterCond1) && _gameProgress[kProgressField18] != 4) {
+					playDialog(kCharacterCond1, "CON1505", -1, 0);
+				}
+			} else {
 				getCharacter(kCharacterCond1).inventoryItem = kItemNone;
-				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 8;
-				Cond1Call(&LogicManager::CONS_Cond1_VisitCond2Double, "CON1210", "CON1210A", 0, 0);
-				return;
+				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 19;
+				Cond1Call(&LogicManager::CONS_Cond1_MakeAllBeds, 0, 0, 0, 0);
 			}
-		}
-	}
 
-LABEL_80:
-	if (_gameTime > 1215000 && !getCharacterParams(kCharacterCond1, 8)[0] && !getCharacterParams(kCharacterCond1, 8)[16]) {
-		if (!getCharacterCurrentParams(kCharacterCond1)[4]) {
-			getCharacterCurrentParams(kCharacterCond1)[4] = _gameTime + 2700;
-			if (_gameTime == -2700)
-				goto LABEL_87;
-		}
+			break;
+		case 19:
+			getCharacterCurrentParams(kCharacterCond1)[0] = 1;
+			if (getCharacterParams(kCharacterCond1, 8)[0] &&
+				!whoRunningDialog(kCharacterCond1) && _gameProgress[kProgressField18] != 4) {
+				playDialog(kCharacterCond1, "CON1505", -1, 0);
+			}
 
-		if (getCharacterCurrentParams(kCharacterCond1)[4] < _gameTime) {
-			getCharacterCurrentParams(kCharacterCond1)[4] = 0x7FFFFFFF;
-		LABEL_87:
-			startCycOtis(kCharacterCond1, "601E");
-			getCharacterParams(kCharacterCond1, 8)[0] = 1;
-			getCharacterCurrentParams(kCharacterCond1)[4] = 0;
+			break;
+		case 21:
+			playNIS(kEventMertensAskTylerCompartmentD);
+			startSeqOtis(kCharacterCond1, "601A");
+			_gameInventory[kItem7].location = 0;
+			bumpCath(kCarGreenSleeping, 25, 255);
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 22;
+			Cond1Call(&LogicManager::CONS_Cond1_FinishSeqOtis, 0, 0, 0, 0);
+			break;
+		case 22:
+			startCycOtis(kCharacterCond1, "601B");
+			break;
+		default:
+			break;
 		}
-	}
-
-	if (getCharacterParams(kCharacterCond1, 8)[7]) {
-		getCharacter(kCharacterCond1).inventoryItem = kItemNone;
-		getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 9;
-		Cond1Call(&LogicManager::CONS_Cond1_Listen, 9, 0, 0, 0);
-		return;
-	}
-
-LABEL_90:
-	if (_gameProgress[5] == 29)
-		goto LABEL_99;
-	if (getCharacterParams(kCharacterCond1, 8)[13]) {
-		getCharacter(kCharacterCond1).inventoryItem = kItemNone;
-		getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 10;
-		Cond1Call(&LogicManager::CONS_Cond1_AugustLockUnlockMyComp, 1, 0, 0, 0);
-		return;
-	}
 
-LABEL_93:
-	if (getCharacterParams(kCharacterCond1, 8)[14]) {
-		getCharacter(kCharacterCond1).inventoryItem = kItemNone;
-		getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 11;
-		Cond1Call(&LogicManager::CONS_Cond1_AugustLockUnlockMyComp, 0, 0, 0, 0);
-		return;
-	}
+		break;
+	case 225932896:
+		if (!getCharacterParams(kCharacterCond1, 8)[16] && !getCharacterParams(kCharacterCond1, 8)[0]) {
+			send(kCharacterCond1, kCharacterFrancois, 205346192, 0);
+		}
 
-LABEL_95:
-	if (getCharacterParams(kCharacterCond1, 8)[12]) {
-		getCharacter(kCharacterCond1).inventoryItem = kItemNone;
-		getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 12;
-		Cond1Call(&LogicManager::CONS_Cond1_AlexeiLockUnlockMyComp, 1, 0, 0, 0);
-		return;
-	}
+		break;
+	case 225358684:
+		if (!getCharacterParams(kCharacterCond1, 8)[0]) {
+			getCharacter(kCharacterCond1).inventoryItem = kItemNone;
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 23;
+			Cond1Call(&LogicManager::CONS_Cond1_CathBuzzing, msg->param, 0, 0, 0);
+		}
 
-LABEL_97:
-	if (!getCharacterParams(kCharacterCond1, 8)[11]) {
-	LABEL_99:
-		if (getCharacterParams(kCharacterCond1, 8)[9]) {
+		break;
+	case 305159806:
+		if (!getCharacterParams(kCharacterCond1, 8)[16] && !getCharacterParams(kCharacterCond1, 8)[0]) {
 			getCharacter(kCharacterCond1).inventoryItem = kItemNone;
-			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 14;
-			Cond1Call(&LogicManager::CONS_Cond1_DeliverAugustMessage, 0, 0, 0, 0);
-		} else {
-		LABEL_101:
-			if (getCharacterParams(kCharacterCond1, 8)[5]) {
-				getCharacter(kCharacterCond1).inventoryItem = kItemNone;
-				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 15;
-				Cond1Call(&LogicManager::CONS_Cond1_DeliverKronosMessage, 0, 0, 0, 0);
-			} else {
-			LABEL_103:
-				if (getCharacterParams(kCharacterCond1, 8)[10]) {
-					getCharacter(kCharacterCond1).inventoryItem = kItemNone;
-					getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 16;
-					Cond1Call(&LogicManager::CONS_Cond1_VisitKahina, 0, 0, 0, 0);
-				} else {
-				LABEL_105:
-					if (getCharacterParams(kCharacterCond1, 8)[8]) {
-						getCharacter(kCharacterCond1).inventoryItem = kItemNone;
-						getCharacterParams(kCharacterCond1, 8)[8] = 0;
-						getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 17;
-						Cond1Call(&LogicManager::CONS_Cond1_VisitCond2, "CON1200", 0, 0, 0);
-					} else {
-					LABEL_107:
-						if (getCharacterParams(kCharacterCond1, 8)[17]) {
-							getCharacter(kCharacterCond1).inventoryItem = kItemNone;
-							getCharacterParams(kCharacterCond1, 8)[17] = 0;
-							getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 18;
-							Cond1Call(&LogicManager::CONS_Cond1_VisitCond2Special, 0, 0, 0, 0);
-						} else {
-						LABEL_109:
-							if (getCharacterCurrentParams(kCharacterCond1)[0] || !getCharacterParams(kCharacterCond1, 8)[4]) {
-							LABEL_69:
-								if (getCharacterParams(kCharacterCond1, 8)[0] &&
-									!whoRunningDialog(kCharacterCond1) && _gameProgress[kProgressField18] != 4) {
-									playDialog(kCharacterCond1, "CON1505", -1, 0);
-								}
-							} else {
-								getCharacter(kCharacterCond1).inventoryItem = kItemNone;
-								getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 19;
-								Cond1Call(&LogicManager::CONS_Cond1_MakeAllBeds, 0, 0, 0, 0);
-							}
-						}
-					}
-				}
-			}
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 24;
+			Cond1Call(&LogicManager::CONS_Cond1_CathRattling, msg->param, 0, 0, 0);
 		}
-	} else {
-		getCharacter(kCharacterCond1).inventoryItem = kItemNone;
-		getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 13;
-		Cond1Call(&LogicManager::CONS_Cond1_AlexeiLockUnlockMyComp, 0, 0, 0, 0);
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -3440,28 +4220,35 @@ void LogicManager::CONS_Cond1_StartPart2(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Cond1_StartPart2(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			endGraphics(kCharacterCond1);
-			getCharacter(kCharacterCond1).characterPosition.car = kCarGreenSleeping;
-			getCharacter(kCharacterCond1).characterPosition.position = 1500;
-			getCharacter(kCharacterCond1).characterPosition.location = 0;
-			getCharacter(kCharacterCond1).inventoryItem = kItemNone;
-			getCharacterParams(kCharacterCond1, 8)[13] = 0;
-			getCharacterParams(kCharacterCond1, 8)[14] = 0;
-			getCharacterParams(kCharacterCond1, 8)[12] = 0;
-			getCharacterParams(kCharacterCond1, 8)[11] = 0;
-			getCharacterParams(kCharacterCond1, 8)[5] = 0;
-			getCharacterParams(kCharacterCond1, 8)[9] = 0;
-			getCharacterParams(kCharacterCond1, 8)[7] = 0;
-			getCharacterParams(kCharacterCond1, 8)[8] = 0;
-			getCharacterParams(kCharacterCond1, 8)[10] = 0;
-		} else if (msg->action == 18 && getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] == 1) {
-			CONS_Cond1_SittingDay(0, 0, 0, 0);
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 1;
 		Cond1Call(&LogicManager::CONS_Cond1_SitDown, 0, 0, 0, 0);
+		break;
+	case 12:
+		endGraphics(kCharacterCond1);
+		getCharacter(kCharacterCond1).characterPosition.car = kCarGreenSleeping;
+		getCharacter(kCharacterCond1).characterPosition.position = 1500;
+		getCharacter(kCharacterCond1).characterPosition.location = 0;
+		getCharacter(kCharacterCond1).inventoryItem = kItemNone;
+		getCharacterParams(kCharacterCond1, 8)[13] = 0;
+		getCharacterParams(kCharacterCond1, 8)[14] = 0;
+		getCharacterParams(kCharacterCond1, 8)[12] = 0;
+		getCharacterParams(kCharacterCond1, 8)[11] = 0;
+		getCharacterParams(kCharacterCond1, 8)[5] = 0;
+		getCharacterParams(kCharacterCond1, 8)[9] = 0;
+		getCharacterParams(kCharacterCond1, 8)[7] = 0;
+		getCharacterParams(kCharacterCond1, 8)[8] = 0;
+		getCharacterParams(kCharacterCond1, 8)[10] = 0;
+		break;
+	case 18:
+		if (getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] == 1) {
+			CONS_Cond1_SittingDay(0, 0, 0, 0);
+		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -3476,81 +4263,110 @@ void LogicManager::CONS_Cond1_SittingDay(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Cond1_SittingDay(HAND_PARAMS) {
-	if (msg->action > 11) {
-		if (msg->action > 225358684) {
-			if (msg->action == 225932896) {
-				if (!getCharacterParams(kCharacterCond1, 8)[16] && !getCharacterParams(kCharacterCond1, 8)[0]) {
-					send(kCharacterCond1, kCharacterFrancois, 205346192, 0);
-				}
-			} else if (msg->action == 226078300) {
-				if (!getCharacterParams(kCharacterCond1, 8)[16] && !getCharacterParams(kCharacterCond1, 8)[0]) {
-					getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 8;
-					Cond1Call(&LogicManager::CONS_Cond1_DoDialog, "CON2020", 0, 0, 0);
-				}
-			} else if (msg->action == 305159806 && !getCharacterParams(kCharacterCond1, 8)[16] && !getCharacterParams(kCharacterCond1, 8)[0]) {
-				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 10;
-				Cond1Call(&LogicManager::CONS_Cond1_CathRattling, msg->param, 0, 0, 0);
-			}
-		} else {
-			switch (msg->action) {
-			case 225358684:
-				if (!getCharacterParams(kCharacterCond1, 8)[0]) {
-					getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 9;
-					Cond1Call(&LogicManager::CONS_Cond1_CathBuzzing, msg->param, 0, 0, 0);
-				}
-				break;
-			case 17:
-				if (!getCharacterParams(kCharacterCond1, 8)[16]) {
-					if (checkCathDir(kCarGreenSleeping, 1)) {
-						getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 6;
-						Cond1Call(&LogicManager::CONS_Cond1_Passing, 1, 0, 0, 0);
-					} else if (checkCathDir(kCarGreenSleeping, 23)) {
-						getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 7;
-						Cond1Call(&LogicManager::CONS_Cond1_Passing, 0, 0, 0, 0);
-					}
-				}
-				break;
-			case 18:
-				switch (getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8]) {
-				case 1:
-					goto LABEL_24;
-				case 2:
-					goto LABEL_26;
-				case 3:
-					goto LABEL_28;
-				default:
-					return;
-				}
-			}
+	switch (msg->action) {
+	case 0:
+		if (getCharacterParams(kCharacterCond1, 8)[13]) {
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 1;
+			Cond1Call(&LogicManager::CONS_Cond1_AugustLockUnlockMyComp, 1, 0, 0, 0);
+			break;
+		}
+
+		if (getCharacterParams(kCharacterCond1, 8)[14]) {
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 2;
+			Cond1Call(&LogicManager::CONS_Cond1_AugustLockUnlockMyComp, 0, 0, 0, 0);
+			break;
+		}
+
+		if (getCharacterParams(kCharacterCond1, 8)[12]) {
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 3;
+			Cond1Call(&LogicManager::CONS_Cond1_AlexeiLockUnlockMyComp, 1, 0, 0, 0);
+			break;
+		}
+
+		if (getCharacterParams(kCharacterCond1, 8)[11]) {
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 4;
+			Cond1Call(&LogicManager::CONS_Cond1_AlexeiLockUnlockMyComp, 0, 0, 0, 0);
 		}
-	} else if (msg->action == 11) {
+
+		break;
+	case 11:
 		if (!getCharacterParams(kCharacterCond1, 8)[16]) {
 			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 5;
 			Cond1Call(&LogicManager::CONS_Cond1_Passing, msg->param, msg->sender, 0, 0);
 		}
-	} else if (msg->action == 0) {
-		if (getCharacterParams(kCharacterCond1, 8)[13]) {
-			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 1;
-			Cond1Call(&LogicManager::CONS_Cond1_AugustLockUnlockMyComp, 1, 0, 0, 0);
-		} else {
-		LABEL_24:
+
+		break;
+	case 17:
+		if (!getCharacterParams(kCharacterCond1, 8)[16]) {
+			if (checkCathDir(kCarGreenSleeping, 1)) {
+				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 6;
+				Cond1Call(&LogicManager::CONS_Cond1_Passing, 1, 0, 0, 0);
+			} else if (checkCathDir(kCarGreenSleeping, 23)) {
+				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 7;
+				Cond1Call(&LogicManager::CONS_Cond1_Passing, 0, 0, 0, 0);
+			}
+		}
+
+		break;
+	case 18:
+		switch (getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8]) {
+		case 1:
 			if (getCharacterParams(kCharacterCond1, 8)[14]) {
 				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 2;
 				Cond1Call(&LogicManager::CONS_Cond1_AugustLockUnlockMyComp, 0, 0, 0, 0);
-			} else {
-			LABEL_26:
-				if (getCharacterParams(kCharacterCond1, 8)[12]) {
-					getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 3;
-					Cond1Call(&LogicManager::CONS_Cond1_AlexeiLockUnlockMyComp, 1, 0, 0, 0);
-				} else {
-				LABEL_28:
-					if (getCharacterParams(kCharacterCond1, 8)[11]) {
-						getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 4;
-						Cond1Call(&LogicManager::CONS_Cond1_AlexeiLockUnlockMyComp, 0, 0, 0, 0);
-					}
-				}
+				break;
+			}
+
+			// fall through
+		case 2:
+			if (getCharacterParams(kCharacterCond1, 8)[12]) {
+				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 3;
+				Cond1Call(&LogicManager::CONS_Cond1_AlexeiLockUnlockMyComp, 1, 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 3:
+			if (getCharacterParams(kCharacterCond1, 8)[11]) {
+				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 4;
+				Cond1Call(&LogicManager::CONS_Cond1_AlexeiLockUnlockMyComp, 0, 0, 0, 0);
 			}
+
+			break;
+		default:
+			break;
+		}
+
+		break;
+	case 225358684:
+		if (!getCharacterParams(kCharacterCond1, 8)[0]) {
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 9;
+			Cond1Call(&LogicManager::CONS_Cond1_CathBuzzing, msg->param, 0, 0, 0);
+		}
+
+		break;
+	case 225932896:
+		if (!getCharacterParams(kCharacterCond1, 8)[16] && !getCharacterParams(kCharacterCond1, 8)[0]) {
+			send(kCharacterCond1, kCharacterFrancois, 205346192, 0);
+		}
+
+		break;
+	case 226078300:
+		if (!getCharacterParams(kCharacterCond1, 8)[16] && !getCharacterParams(kCharacterCond1, 8)[0]) {
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 8;
+			Cond1Call(&LogicManager::CONS_Cond1_DoDialog, "CON2020", 0, 0, 0);
+		}
+
+		break;
+	case 305159806:
+		if (!getCharacterParams(kCharacterCond1, 8)[16] && !getCharacterParams(kCharacterCond1, 8)[0]) {
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 10;
+			Cond1Call(&LogicManager::CONS_Cond1_CathRattling, msg->param, 0, 0, 0);
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -3565,28 +4381,35 @@ void LogicManager::CONS_Cond1_StartPart3(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Cond1_StartPart3(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			getCharacter(kCharacterCond1).characterPosition.car = kCarGreenSleeping;
-			getCharacter(kCharacterCond1).characterPosition.position = 1500;
-			getCharacter(kCharacterCond1).characterPosition.location = 0;
-			getCharacter(kCharacterCond1).inventoryItem = kItemNone;
-			getCharacterParams(kCharacterCond1, 8)[13] = 0;
-			getCharacterParams(kCharacterCond1, 8)[14] = 0;
-			getCharacterParams(kCharacterCond1, 8)[12] = 0;
-			getCharacterParams(kCharacterCond1, 8)[11] = 0;
-			getCharacterParams(kCharacterCond1, 8)[5] = 0;
-			getCharacterParams(kCharacterCond1, 8)[9] = 0;
-			getCharacterParams(kCharacterCond1, 8)[7] = 0;
-			getCharacterParams(kCharacterCond1, 8)[8] = 0;
-			getCharacterParams(kCharacterCond1, 8)[10] = 0;
-			getCharacterParams(kCharacterCond1, 8)[19] = 0;
-		} else if (msg->action == 18 && getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] == 1) {
+	switch (msg->action) {
+	case 0:
+		getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 1;
+		Cond1Call(&LogicManager::CONS_Cond1_SitDown, 0, 0, 0, 0);
+		break;
+	case 12:
+		getCharacter(kCharacterCond1).characterPosition.car = kCarGreenSleeping;
+		getCharacter(kCharacterCond1).characterPosition.position = 1500;
+		getCharacter(kCharacterCond1).characterPosition.location = 0;
+		getCharacter(kCharacterCond1).inventoryItem = kItemNone;
+		getCharacterParams(kCharacterCond1, 8)[13] = 0;
+		getCharacterParams(kCharacterCond1, 8)[14] = 0;
+		getCharacterParams(kCharacterCond1, 8)[12] = 0;
+		getCharacterParams(kCharacterCond1, 8)[11] = 0;
+		getCharacterParams(kCharacterCond1, 8)[5] = 0;
+		getCharacterParams(kCharacterCond1, 8)[9] = 0;
+		getCharacterParams(kCharacterCond1, 8)[7] = 0;
+		getCharacterParams(kCharacterCond1, 8)[8] = 0;
+		getCharacterParams(kCharacterCond1, 8)[10] = 0;
+		getCharacterParams(kCharacterCond1, 8)[19] = 0;
+		break;
+	case 18:
+		if (getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] == 1) {
 			CONS_Cond1_OnDuty(0, 0, 0, 0);
 		}
-	} else {
-		getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 1;
-		Cond1Call(&LogicManager::CONS_Cond1_SitDown, 0, 0, 0, 0);
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -3601,142 +4424,219 @@ void LogicManager::CONS_Cond1_OnDuty(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Cond1_OnDuty(HAND_PARAMS) {
-	if (msg->action > 11) {
-		if (msg->action > 225358684) {
-			if (msg->action == 225932896) {
-				if (!getCharacterParams(kCharacterCond1, 8)[16] && !getCharacterParams(kCharacterCond1, 8)[0]) {
-					send(kCharacterCond1, kCharacterFrancois, 205346192, 0);
-				}
-			} else if (msg->action == 226078300) {
-				if (!getCharacterParams(kCharacterCond1, 8)[16] && !getCharacterParams(kCharacterCond1, 8)[0]) {
-					getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 15;
-					Cond1Call(&LogicManager::CONS_Cond1_DoDialog, "CON2020", 0, 0, 0);
-				}
-			} else if (msg->action == 305159806 && !getCharacterParams(kCharacterCond1, 8)[16] && !getCharacterParams(kCharacterCond1, 8)[0]) {
-				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 17;
-				Cond1Call(&LogicManager::CONS_Cond1_CathRattling, msg->param, 0, 0, 0);
-			}
-		} else {
-			switch (msg->action) {
-			case 225358684:
-				if (!getCharacterParams(kCharacterCond1, 8)[0]) {
-					getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 16;
-					Cond1Call(&LogicManager::CONS_Cond1_CathBuzzing, msg->param, 0, 0, 0);
-				}
-				break;
-			case 17:
-				if (!getCharacterParams(kCharacterCond1, 8)[16]) {
-					if (checkCathDir(kCarGreenSleeping, 1)) {
-						getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 13;
-						Cond1Call(&LogicManager::CONS_Cond1_Passing, 1, 0, 0, 0);
-					} else if (checkCathDir(kCarGreenSleeping, 23)) {
-						getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 14;
-						Cond1Call(&LogicManager::CONS_Cond1_Passing, 0, 0, 0, 0);
-					}
-				}
-				break;
-			case 18:
-				switch (getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8]) {
-				case 1:
-					goto LABEL_24;
-				case 2:
-					goto LABEL_26;
-				case 3:
-					goto LABEL_28;
-				case 4:
-					goto LABEL_30;
-				case 5:
-					goto LABEL_32;
-				case 6:
-					goto LABEL_38;
-				case 7:
-					goto LABEL_41;
-				case 8:
-					goto LABEL_44;
-				case 9:
-					goto LABEL_47;
-				case 0xA:
-					goto LABEL_50;
-				default:
-					return;
-				}
-			}
+	switch (msg->action) {
+	case 0:
+		if (getCharacterParams(kCharacterCond1, 8)[13]) {
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 1;
+			Cond1Call(&LogicManager::CONS_Cond1_AugustLockUnlockMyComp, 1, 0, 0, 0);
+			break;
+		}
+
+		if (getCharacterParams(kCharacterCond1, 8)[14]) {
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 2;
+			Cond1Call(&LogicManager::CONS_Cond1_AugustLockUnlockMyComp, 0, 0, 0, 0);
+			break;
+		}
+
+		if (getCharacterParams(kCharacterCond1, 8)[12]) {
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 3;
+			Cond1Call(&LogicManager::CONS_Cond1_AlexeiLockUnlockMyComp, 1, 0, 0, 0);
+			break;
+		}
+
+		if (getCharacterParams(kCharacterCond1, 8)[11]) {
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 4;
+			Cond1Call(&LogicManager::CONS_Cond1_AlexeiLockUnlockMyComp, 0, 0, 0, 0);
+			break;
+		}
+
+		if (getCharacterParams(kCharacterCond1, 8)[7]) {
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 5;
+			Cond1Call(&LogicManager::CONS_Cond1_Listen, 9, 0, 0, 0);
+			break;
+		}
+
+		if (getCharacterParams(kCharacterCond1, 8)[19] && (_gameEvents[kEventKronosVisit] || _gameTime > 2052000) && _gameTime < 2133000 && cathInCorridor(kCarGreenSleeping)) {
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 6;
+			Cond1Call(&LogicManager::CONS_Cond1_BathroomTrip, 0, 0, 0, 0);
+			break;
+		}
+
+		if (_gameTime > 1971000 && !getCharacterCurrentParams(kCharacterCond1)[0]) {
+			getCharacterCurrentParams(kCharacterCond1)[0] = 1;
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 7;
+			Cond1Call(&LogicManager::CONS_Cond1_VisitCond2, "CON3012", 0, 0, 0);
+			break;
+		}
+
+		if (_gameTime > 2117700 && !getCharacterCurrentParams(kCharacterCond1)[1]) {
+			getCharacterCurrentParams(kCharacterCond1)[1] = 1;
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 8;
+			Cond1Call(&LogicManager::CONS_Cond1_BathroomTrip, 0, 0, 0, 0);
+			break;
+		}
+
+		if (_gameTime > 2124000 && !getCharacterCurrentParams(kCharacterCond1)[2]) {
+			getCharacterCurrentParams(kCharacterCond1)[2] = 1;
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 9;
+			Cond1Call(&LogicManager::CONS_Cond1_VisitCond2, "CON2010", 0, 0, 0);
+			break;
+		}
+
+		if (_gameTime > 2146500 && !getCharacterCurrentParams(kCharacterCond1)[3]) {
+			getCharacterCurrentParams(kCharacterCond1)[3] = 1;
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 10;
+			Cond1Call(&LogicManager::CONS_Cond1_BathroomTrip, 0, 0, 0, 0);
+			break;
+		}
+
+		if (_gameTime > 2169000 && !getCharacterCurrentParams(kCharacterCond1)[4]) {
+			getCharacterCurrentParams(kCharacterCond1)[4] = 1;
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 11;
+			Cond1Call(&LogicManager::CONS_Cond1_BathroomTrip, 0, 0, 0, 0);
+			break;
 		}
-	} else if (msg->action == 11) {
+
+		break;
+	case 11:
 		if (!getCharacterParams(kCharacterCond1, 8)[16]) {
 			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 12;
 			Cond1Call(&LogicManager::CONS_Cond1_Passing, msg->param, msg->sender, 0, 0);
 		}
-	} else if (msg->action == 0) {
-		if (getCharacterParams(kCharacterCond1, 8)[13]) {
-			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 1;
-			Cond1Call(&LogicManager::CONS_Cond1_AugustLockUnlockMyComp, 1, 0, 0, 0);
-		} else {
-		LABEL_24:
+
+		break;
+	case 17:
+		if (!getCharacterParams(kCharacterCond1, 8)[16]) {
+			if (checkCathDir(kCarGreenSleeping, 1)) {
+				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 13;
+				Cond1Call(&LogicManager::CONS_Cond1_Passing, 1, 0, 0, 0);
+			} else if (checkCathDir(kCarGreenSleeping, 23)) {
+				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 14;
+				Cond1Call(&LogicManager::CONS_Cond1_Passing, 0, 0, 0, 0);
+			}
+		}
+
+		break;
+	case 18:
+		switch (getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8]) {
+		case 1:
 			if (getCharacterParams(kCharacterCond1, 8)[14]) {
 				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 2;
 				Cond1Call(&LogicManager::CONS_Cond1_AugustLockUnlockMyComp, 0, 0, 0, 0);
-			} else {
-			LABEL_26:
-				if (getCharacterParams(kCharacterCond1, 8)[12]) {
-					getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 3;
-					Cond1Call(&LogicManager::CONS_Cond1_AlexeiLockUnlockMyComp, 1, 0, 0, 0);
-				} else {
-				LABEL_28:
-					if (getCharacterParams(kCharacterCond1, 8)[11]) {
-						getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 4;
-						Cond1Call(&LogicManager::CONS_Cond1_AlexeiLockUnlockMyComp, 0, 0, 0, 0);
-					} else {
-					LABEL_30:
-						if (getCharacterParams(kCharacterCond1, 8)[7]) {
-							getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 5;
-							Cond1Call(&LogicManager::CONS_Cond1_Listen, 9, 0, 0, 0);
-						} else {
-						LABEL_32:
-							if (getCharacterParams(kCharacterCond1, 8)[19] && (_gameEvents[kEventKronosVisit] || _gameTime > 2052000) && _gameTime < 2133000 && cathInCorridor(kCarGreenSleeping)) {
-								getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 6;
-								Cond1Call(&LogicManager::CONS_Cond1_BathroomTrip, 0, 0, 0, 0);
-							} else {
-							LABEL_38:
-								if (_gameTime <= 1971000 || getCharacterCurrentParams(kCharacterCond1)[0]) {
-								LABEL_41:
-									if (_gameTime <= 2117700 || getCharacterCurrentParams(kCharacterCond1)[1]) {
-									LABEL_44:
-										if (_gameTime <= 2124000 || getCharacterCurrentParams(kCharacterCond1)[2]) {
-										LABEL_47:
-											if (_gameTime <= 2146500 || getCharacterCurrentParams(kCharacterCond1)[3]) {
-											LABEL_50:
-												if (_gameTime > 2169000 && !getCharacterCurrentParams(kCharacterCond1)[4]) {
-													getCharacterCurrentParams(kCharacterCond1)[4] = 1;
-													getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 11;
-													Cond1Call(&LogicManager::CONS_Cond1_BathroomTrip, 0, 0, 0, 0);
-												}
-											} else {
-												getCharacterCurrentParams(kCharacterCond1)[3] = 1;
-												getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 10;
-												Cond1Call(&LogicManager::CONS_Cond1_BathroomTrip, 0, 0, 0, 0);
-											}
-										} else {
-											getCharacterCurrentParams(kCharacterCond1)[2] = 1;
-											getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 9;
-											Cond1Call(&LogicManager::CONS_Cond1_VisitCond2, "CON2010", 0, 0, 0);
-										}
-									} else {
-										getCharacterCurrentParams(kCharacterCond1)[1] = 1;
-										getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 8;
-										Cond1Call(&LogicManager::CONS_Cond1_BathroomTrip, 0, 0, 0, 0);
-									}
-								} else {
-									getCharacterCurrentParams(kCharacterCond1)[0] = 1;
-									getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 7;
-									Cond1Call(&LogicManager::CONS_Cond1_VisitCond2, "CON3012", 0, 0, 0);
-								}
-							}
-						}
-					}
-				}
+				break;
+			}
+
+			// fall through
+		case 2:
+			if (getCharacterParams(kCharacterCond1, 8)[12]) {
+				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 3;
+				Cond1Call(&LogicManager::CONS_Cond1_AlexeiLockUnlockMyComp, 1, 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 3:
+			if (getCharacterParams(kCharacterCond1, 8)[11]) {
+				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 4;
+				Cond1Call(&LogicManager::CONS_Cond1_AlexeiLockUnlockMyComp, 0, 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 4:
+			if (getCharacterParams(kCharacterCond1, 8)[7]) {
+				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 5;
+				Cond1Call(&LogicManager::CONS_Cond1_Listen, 9, 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 5:
+			if (getCharacterParams(kCharacterCond1, 8)[19] && (_gameEvents[kEventKronosVisit] || _gameTime > 2052000) && _gameTime < 2133000 && cathInCorridor(kCarGreenSleeping)) {
+				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 6;
+				Cond1Call(&LogicManager::CONS_Cond1_BathroomTrip, 0, 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 6:
+			if (_gameTime > 1971000 && !getCharacterCurrentParams(kCharacterCond1)[0]) {
+				getCharacterCurrentParams(kCharacterCond1)[0] = 1;
+				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 7;
+				Cond1Call(&LogicManager::CONS_Cond1_VisitCond2, "CON3012", 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 7:
+			if (_gameTime > 2117700 && !getCharacterCurrentParams(kCharacterCond1)[1]) {
+				getCharacterCurrentParams(kCharacterCond1)[1] = 1;
+				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 8;
+				Cond1Call(&LogicManager::CONS_Cond1_BathroomTrip, 0, 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 8:
+			if (_gameTime > 2124000 && !getCharacterCurrentParams(kCharacterCond1)[2]) {
+				getCharacterCurrentParams(kCharacterCond1)[2] = 1;
+				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 9;
+				Cond1Call(&LogicManager::CONS_Cond1_VisitCond2, "CON2010", 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 9:
+			if (_gameTime > 2146500 && !getCharacterCurrentParams(kCharacterCond1)[3]) {
+				getCharacterCurrentParams(kCharacterCond1)[3] = 1;
+				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 10;
+				Cond1Call(&LogicManager::CONS_Cond1_BathroomTrip, 0, 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 10:
+			if (_gameTime > 2169000 && !getCharacterCurrentParams(kCharacterCond1)[4]) {
+				getCharacterCurrentParams(kCharacterCond1)[4] = 1;
+				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 11;
+				Cond1Call(&LogicManager::CONS_Cond1_BathroomTrip, 0, 0, 0, 0);
 			}
+
+			break;
+		default:
+			break;
+		}
+
+		break;
+	case 225358684:
+		if (!getCharacterParams(kCharacterCond1, 8)[0]) {
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 16;
+			Cond1Call(&LogicManager::CONS_Cond1_CathBuzzing, msg->param, 0, 0, 0);
+		}
+
+		break;
+	case 225932896:
+		if (!getCharacterParams(kCharacterCond1, 8)[16] && !getCharacterParams(kCharacterCond1, 8)[0]) {
+			send(kCharacterCond1, kCharacterFrancois, 205346192, 0);
+		}
+
+		break;
+	case 226078300:
+		if (!getCharacterParams(kCharacterCond1, 8)[16] && !getCharacterParams(kCharacterCond1, 8)[0]) {
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 15;
+			Cond1Call(&LogicManager::CONS_Cond1_DoDialog, "CON2020", 0, 0, 0);
+		}
+
+		break;
+	case 305159806:
+		if (!getCharacterParams(kCharacterCond1, 8)[16] && !getCharacterParams(kCharacterCond1, 8)[0]) {
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 17;
+			Cond1Call(&LogicManager::CONS_Cond1_CathRattling, msg->param, 0, 0, 0);
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -3751,29 +4651,36 @@ void LogicManager::CONS_Cond1_StartPart4(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Cond1_StartPart4(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			endGraphics(kCharacterCond1);
-			getCharacter(kCharacterCond1).characterPosition.car = kCarGreenSleeping;
-			getCharacter(kCharacterCond1).characterPosition.position = 1500;
-			getCharacter(kCharacterCond1).characterPosition.location = 0;
-			getCharacter(kCharacterCond1).inventoryItem = kItemNone;
-			getCharacterParams(kCharacterCond1, 8)[18] = 0;
-			getCharacterParams(kCharacterCond1, 8)[13] = 0;
-			getCharacterParams(kCharacterCond1, 8)[14] = 0;
-			getCharacterParams(kCharacterCond1, 8)[12] = 0;
-			getCharacterParams(kCharacterCond1, 8)[11] = 0;
-			getCharacterParams(kCharacterCond1, 8)[5] = 0;
-			getCharacterParams(kCharacterCond1, 8)[9] = 0;
-			getCharacterParams(kCharacterCond1, 8)[7] = 0;
-			getCharacterParams(kCharacterCond1, 8)[8] = 0;
-			getCharacterParams(kCharacterCond1, 8)[10] = 0;
-		} else if (msg->action == 18 && getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] == 1) {
-			CONS_Cond1_OnDuty4(0, 0, 0, 0);
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 1;
 		Cond1Call(&LogicManager::CONS_Cond1_SitDown, 0, 0, 0, 0);
+		break;
+	case 12:
+		endGraphics(kCharacterCond1);
+		getCharacter(kCharacterCond1).characterPosition.car = kCarGreenSleeping;
+		getCharacter(kCharacterCond1).characterPosition.position = 1500;
+		getCharacter(kCharacterCond1).characterPosition.location = 0;
+		getCharacter(kCharacterCond1).inventoryItem = kItemNone;
+		getCharacterParams(kCharacterCond1, 8)[18] = 0;
+		getCharacterParams(kCharacterCond1, 8)[13] = 0;
+		getCharacterParams(kCharacterCond1, 8)[14] = 0;
+		getCharacterParams(kCharacterCond1, 8)[12] = 0;
+		getCharacterParams(kCharacterCond1, 8)[11] = 0;
+		getCharacterParams(kCharacterCond1, 8)[5] = 0;
+		getCharacterParams(kCharacterCond1, 8)[9] = 0;
+		getCharacterParams(kCharacterCond1, 8)[7] = 0;
+		getCharacterParams(kCharacterCond1, 8)[8] = 0;
+		getCharacterParams(kCharacterCond1, 8)[10] = 0;
+		break;
+	case 18:
+		if (getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] == 1) {
+			CONS_Cond1_OnDuty4(0, 0, 0, 0);
+		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -3788,67 +4695,8 @@ void LogicManager::CONS_Cond1_OnDuty4(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Cond1_OnDuty4(HAND_PARAMS) {
-	if (msg->action > 11) {
-		if (msg->action > 17) {
-			if (msg->action > 225358684) {
-				if (msg->action == 226078300) {
-					if (!getCharacterParams(kCharacterCond1, 8)[16] && !getCharacterParams(kCharacterCond1, 8)[0]) {
-						getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 12;
-						Cond1Call(&LogicManager::CONS_Cond1_DoDialog, "CON2020", 0, 0, 0);
-					}
-				} else if (msg->action == 305159806 && !getCharacterParams(kCharacterCond1, 8)[16] && !getCharacterParams(kCharacterCond1, 8)[0]) {
-					getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 14;
-					Cond1Call(&LogicManager::CONS_Cond1_CathRattling, msg->param, 0, 0, 0);
-				}
-			} else if (msg->action == 225358684) {
-				if (!getCharacterParams(kCharacterCond1, 8)[0]) {
-					getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 13;
-					Cond1Call(&LogicManager::CONS_Cond1_CathBuzzing, msg->param, 0, 0, 0);
-				}
-			} else if (msg->action == 18) {
-				switch (getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8]) {
-				case 1:
-					goto LABEL_31;
-				case 2:
-					goto LABEL_33;
-				case 3:
-					goto LABEL_35;
-				case 4:
-					goto LABEL_37;
-				case 5:
-					goto LABEL_41;
-				case 6:
-					goto LABEL_44;
-				case 7:
-					goto LABEL_47;
-				case 8:
-					goto LABEL_50;
-				default:
-					return;
-				}
-			}
-		} else if (msg->action == 17) {
-			if (!getCharacterParams(kCharacterCond1, 8)[16] && !getCharacterParams(kCharacterCond1, 8)[0]) {
-				if (checkCathDir(kCarGreenSleeping, 1)) {
-					getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 10;
-					Cond1Call(&LogicManager::CONS_Cond1_Passing, 1, 0, 0, 0);
-				} else if (checkCathDir(kCarGreenSleeping, 23)) {
-					getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 11;
-					Cond1Call(&LogicManager::CONS_Cond1_Passing, 0, 0, 0, 0);
-				}
-			}
-		} else if (msg->action == 12) {
-			getCharacter(kCharacterCond1).characterPosition.car = kCarGreenSleeping;
-			getCharacter(kCharacterCond1).characterPosition.position = 1500;
-			getCharacter(kCharacterCond1).characterPosition.location = 0;
-			takeItem(kItem7);
-		}
-	} else if (msg->action == 11) {
-		if (!getCharacterParams(kCharacterCond1, 8)[16] && !getCharacterParams(kCharacterCond1, 8)[0]) {
-			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 9;
-			Cond1Call(&LogicManager::CONS_Cond1_Passing, msg->param, msg->sender, 0, 0);
-		}
-	} else if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		if (getCharacterParams(kCharacterCond1, 8)[18]) {
 			getCharacterCurrentParams(kCharacterCond1)[0] = 1;
 			setModel(2, 1);
@@ -3861,70 +4709,241 @@ void LogicManager::HAND_Cond1_OnDuty4(HAND_PARAMS) {
 			startCycOtis(kCharacterCond1, "601E");
 			getCharacterParams(kCharacterCond1, 8)[18] = 0;
 		}
+
 		if (getCharacterParams(kCharacterCond1, 8)[13]) {
 			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 1;
 			Cond1Call(&LogicManager::CONS_Cond1_AugustLockUnlockMyComp, 1, 0, 0, 0);
-			return;
+			break;
 		}
-	LABEL_31:
+
 		if (getCharacterParams(kCharacterCond1, 8)[14]) {
 			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 2;
 			Cond1Call(&LogicManager::CONS_Cond1_AugustLockUnlockMyComp, 0, 0, 0, 0);
-			return;
+			break;
 		}
-	LABEL_33:
+
 		if (getCharacterParams(kCharacterCond1, 8)[12]) {
 			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 3;
 			Cond1Call(&LogicManager::CONS_Cond1_AlexeiLockUnlockMyComp, 1, 0, 0, 0);
-			return;
+			break;
 		}
-	LABEL_35:
+
 		if (getCharacterParams(kCharacterCond1, 8)[11]) {
 			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 4;
 			Cond1Call(&LogicManager::CONS_Cond1_AlexeiLockUnlockMyComp, 0, 0, 0, 0);
-			return;
+			break;
 		}
-	LABEL_37:
+
 		if (!getCharacterCurrentParams(kCharacterCond1)[0]) {
 			if (_gameTime > 2403000 && !getCharacterCurrentParams(kCharacterCond1)[1]) {
 				getCharacterCurrentParams(kCharacterCond1)[1] = 1;
 				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 5;
 				Cond1Call(&LogicManager::CONS_Cond1_MakeBeds4, 0, 0, 0, 0);
-				return;
+				break;
 			}
-		LABEL_41:
+
 			if (_gameTime > 2430000 && !getCharacterCurrentParams(kCharacterCond1)[2]) {
 				getCharacterCurrentParams(kCharacterCond1)[2] = 1;
 				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 6;
 				Cond1Call(&LogicManager::CONS_Cond1_BathroomTrip, 0, 0, 0, 0);
-				return;
+				break;
 			}
-		LABEL_44:
+
 			if (_gameTime > 2439000 && !getCharacterCurrentParams(kCharacterCond1)[3]) {
 				getCharacterCurrentParams(kCharacterCond1)[3] = 1;
 				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 7;
 				Cond1Call(&LogicManager::CONS_Cond1_BathroomTrip, 0, 0, 0, 0);
-				return;
+				break;
 			}
-		LABEL_47:
+
 			if (_gameTime > 2448000 && !getCharacterCurrentParams(kCharacterCond1)[4]) {
 				getCharacterCurrentParams(kCharacterCond1)[4] = 1;
 				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 8;
 				Cond1Call(&LogicManager::CONS_Cond1_BathroomTrip, 0, 0, 0, 0);
-				return;
+				break;
 			}
 		}
-	LABEL_50:
+
 		if (_gameTime > 2538000 && !getCharacterParams(kCharacterCond1, 8)[0] && !getCharacterParams(kCharacterCond1, 8)[16]) {
 			if (getCharacterCurrentParams(kCharacterCond1)[5] || (getCharacterCurrentParams(kCharacterCond1)[5] = _gameTime + 2700, _gameTime != -2700)) {
 				if (getCharacterCurrentParams(kCharacterCond1)[5] >= _gameTime)
-					return;
+					break;
+
 				getCharacterCurrentParams(kCharacterCond1)[5] = 0x7FFFFFFF;
 			}
+
 			startCycOtis(kCharacterCond1, "601E");
 			getCharacterParams(kCharacterCond1, 8)[0] = 1;
 			getCharacterCurrentParams(kCharacterCond1)[5] = 0;
 		}
+
+		break;
+	case 11:
+		if (!getCharacterParams(kCharacterCond1, 8)[16] && !getCharacterParams(kCharacterCond1, 8)[0]) {
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 9;
+			Cond1Call(&LogicManager::CONS_Cond1_Passing, msg->param, msg->sender, 0, 0);
+		}
+
+		break;
+	case 12:
+		getCharacter(kCharacterCond1).characterPosition.car = kCarGreenSleeping;
+		getCharacter(kCharacterCond1).characterPosition.position = 1500;
+		getCharacter(kCharacterCond1).characterPosition.location = 0;
+		takeItem(kItem7);
+		break;
+	case 17:
+		if (!getCharacterParams(kCharacterCond1, 8)[16] && !getCharacterParams(kCharacterCond1, 8)[0]) {
+			if (checkCathDir(kCarGreenSleeping, 1)) {
+				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 10;
+				Cond1Call(&LogicManager::CONS_Cond1_Passing, 1, 0, 0, 0);
+			} else if (checkCathDir(kCarGreenSleeping, 23)) {
+				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 11;
+				Cond1Call(&LogicManager::CONS_Cond1_Passing, 0, 0, 0, 0);
+			}
+		}
+
+		break;
+	case 18:
+		switch (getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8]) {
+		case 1:
+			if (getCharacterParams(kCharacterCond1, 8)[14]) {
+				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 2;
+				Cond1Call(&LogicManager::CONS_Cond1_AugustLockUnlockMyComp, 0, 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 2:
+			if (getCharacterParams(kCharacterCond1, 8)[12]) {
+				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 3;
+				Cond1Call(&LogicManager::CONS_Cond1_AlexeiLockUnlockMyComp, 1, 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 3:
+			if (getCharacterParams(kCharacterCond1, 8)[11]) {
+				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 4;
+				Cond1Call(&LogicManager::CONS_Cond1_AlexeiLockUnlockMyComp, 0, 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 4:
+			if (!getCharacterCurrentParams(kCharacterCond1)[0]) {
+				if (_gameTime > 2403000 && !getCharacterCurrentParams(kCharacterCond1)[1]) {
+					getCharacterCurrentParams(kCharacterCond1)[1] = 1;
+					getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 5;
+					Cond1Call(&LogicManager::CONS_Cond1_MakeBeds4, 0, 0, 0, 0);
+					break;
+				}
+
+				if (_gameTime > 2430000 && !getCharacterCurrentParams(kCharacterCond1)[2]) {
+					getCharacterCurrentParams(kCharacterCond1)[2] = 1;
+					getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 6;
+					Cond1Call(&LogicManager::CONS_Cond1_BathroomTrip, 0, 0, 0, 0);
+					break;
+				}
+
+				if (_gameTime > 2439000 && !getCharacterCurrentParams(kCharacterCond1)[3]) {
+					getCharacterCurrentParams(kCharacterCond1)[3] = 1;
+					getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 7;
+					Cond1Call(&LogicManager::CONS_Cond1_BathroomTrip, 0, 0, 0, 0);
+					break;
+				}
+
+				if (_gameTime > 2448000 && !getCharacterCurrentParams(kCharacterCond1)[4]) {
+					getCharacterCurrentParams(kCharacterCond1)[4] = 1;
+					getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 8;
+					Cond1Call(&LogicManager::CONS_Cond1_BathroomTrip, 0, 0, 0, 0);
+					break;
+				}
+			}
+
+			if (_gameTime > 2538000 && !getCharacterParams(kCharacterCond1, 8)[0] && !getCharacterParams(kCharacterCond1, 8)[16]) {
+				if (getCharacterCurrentParams(kCharacterCond1)[5] || (getCharacterCurrentParams(kCharacterCond1)[5] = _gameTime + 2700, _gameTime != -2700)) {
+					if (getCharacterCurrentParams(kCharacterCond1)[5] >= _gameTime)
+						break;
+
+					getCharacterCurrentParams(kCharacterCond1)[5] = 0x7FFFFFFF;
+				}
+
+				startCycOtis(kCharacterCond1, "601E");
+				getCharacterParams(kCharacterCond1, 8)[0] = 1;
+				getCharacterCurrentParams(kCharacterCond1)[5] = 0;
+			}
+
+			break;
+		case 5:
+			if (_gameTime > 2430000 && !getCharacterCurrentParams(kCharacterCond1)[2]) {
+				getCharacterCurrentParams(kCharacterCond1)[2] = 1;
+				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 6;
+				Cond1Call(&LogicManager::CONS_Cond1_BathroomTrip, 0, 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 6:
+			if (_gameTime > 2439000 && !getCharacterCurrentParams(kCharacterCond1)[3]) {
+				getCharacterCurrentParams(kCharacterCond1)[3] = 1;
+				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 7;
+				Cond1Call(&LogicManager::CONS_Cond1_BathroomTrip, 0, 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 7:
+			if (_gameTime > 2448000 && !getCharacterCurrentParams(kCharacterCond1)[4]) {
+				getCharacterCurrentParams(kCharacterCond1)[4] = 1;
+				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 8;
+				Cond1Call(&LogicManager::CONS_Cond1_BathroomTrip, 0, 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 8:
+			if (_gameTime > 2538000 && !getCharacterParams(kCharacterCond1, 8)[0] && !getCharacterParams(kCharacterCond1, 8)[16]) {
+				if (getCharacterCurrentParams(kCharacterCond1)[5] || (getCharacterCurrentParams(kCharacterCond1)[5] = _gameTime + 2700, _gameTime != -2700)) {
+					if (getCharacterCurrentParams(kCharacterCond1)[5] >= _gameTime)
+						break;
+
+					getCharacterCurrentParams(kCharacterCond1)[5] = 0x7FFFFFFF;
+				}
+
+				startCycOtis(kCharacterCond1, "601E");
+				getCharacterParams(kCharacterCond1, 8)[0] = 1;
+				getCharacterCurrentParams(kCharacterCond1)[5] = 0;
+			}
+
+			break;
+		default:
+			break;
+		}
+
+		break;
+	case 225358684:
+		if (!getCharacterParams(kCharacterCond1, 8)[0]) {
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 13;
+			Cond1Call(&LogicManager::CONS_Cond1_CathBuzzing, msg->param, 0, 0, 0);
+		}
+
+		break;
+	case 226078300:
+		if (!getCharacterParams(kCharacterCond1, 8)[16] && !getCharacterParams(kCharacterCond1, 8)[0]) {
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 12;
+			Cond1Call(&LogicManager::CONS_Cond1_DoDialog, "CON2020", 0, 0, 0);
+		}
+
+		break;
+	case 305159806:
+		if (!getCharacterParams(kCharacterCond1, 8)[16] && !getCharacterParams(kCharacterCond1, 8)[0]) {
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 14;
+			Cond1Call(&LogicManager::CONS_Cond1_CathRattling, msg->param, 0, 0, 0);
+		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -3939,10 +4958,12 @@ void LogicManager::CONS_Cond1_MakeBeds4(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Cond1_MakeBeds4(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 1;
 		Cond1Call(&LogicManager::CONS_Cond1_GetUp, 0, 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8]) {
 		case 1:
 			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 2;
@@ -3990,8 +5011,12 @@ void LogicManager::HAND_Cond1_MakeBeds4(HAND_PARAMS) {
 			fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
 			break;
 		default:
-			return;
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -4006,14 +5031,19 @@ void LogicManager::CONS_Cond1_StartPart5(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Cond1_StartPart5(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		CONS_Cond1_Prisoner(0, 0, 0, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		endGraphics(kCharacterCond1);
 		getCharacter(kCharacterCond1).characterPosition.car = kCarRestaurant;
 		getCharacter(kCharacterCond1).characterPosition.position = 3969;
 		getCharacter(kCharacterCond1).characterPosition.location = 1;
 		getCharacter(kCharacterCond1).inventoryItem = kItemNone;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -4028,8 +5058,13 @@ void LogicManager::CONS_Cond1_Prisoner(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Cond1_Prisoner(HAND_PARAMS) {
-	if (msg->action == 70549068)
+	switch (msg->action) {
+	case 70549068:
 		CONS_Cond1_ComfortMadame(0, 0, 0, 0);
+		break;
+	default:
+		break;
+	}
 }
 
 void LogicManager::CONS_Cond1_ComfortMadame(CONS_PARAMS) {
@@ -4046,24 +5081,26 @@ void LogicManager::HAND_Cond1_ComfortMadame(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
 		if (getCharacterCurrentParams(kCharacterCond1)[1] == 0x7FFFFFFF || !_gameTime)
-			return;
+			break;
 
 		if (getCharacterCurrentParams(kCharacterCond1)[0] >= _gameTime) {
 			if (!cathInCorridor(kCarRedSleeping) || !getCharacterCurrentParams(kCharacterCond1)[1]) {
 				getCharacterCurrentParams(kCharacterCond1)[1] = _gameTime;
-				if (!_gameTime)
-					goto LABEL_13;
+				if (!_gameTime) {
+					getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 1;
+					Cond1Call(&LogicManager::CONS_Cond1_DoDialog, "Mme5010", 0, 0, 0);
+					break;
+				}
 			}
 
 			if (getCharacterCurrentParams(kCharacterCond1)[1] >= _gameTime)
-				return;
+				break;
 		}
 
 		getCharacterCurrentParams(kCharacterCond1)[1] = 0x7FFFFFFF;
-	LABEL_13:
 		getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 1;
 		Cond1Call(&LogicManager::CONS_Cond1_DoDialog, "Mme5010", 0, 0, 0);
-		return;
+		break;
 	case 12:
 		getCharacter(kCharacterCond1).characterPosition.car = kCarRedSleeping;
 		getCharacter(kCharacterCond1).characterPosition.position = 5790;
@@ -4081,6 +5118,8 @@ void LogicManager::HAND_Cond1_ComfortMadame(HAND_PARAMS) {
 			CONS_Cond1_HideOut(0, 0, 0, 0);
 		}
 
+		break;
+	default:
 		break;
 	}
 }
@@ -4096,61 +5135,27 @@ void LogicManager::CONS_Cond1_HideOut(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Cond1_HideOut(HAND_PARAMS) {
-	if (msg->action > 9) {
-		if (msg->action > 17) {
-			if (msg->action == 18) {
-				switch (getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8]) {
-				case 1:
-					getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 2;
-					Cond1Call(&LogicManager::CONS_Cond1_DoCorrOtis, "601ZD", 4, 0, 0);
-					break;
-				case 2:
-					endGraphics(kCharacterCond1);
-					getCharacter(kCharacterCond1).characterPosition.location = 1;
-					getCharacter(kCharacterCond1).characterPosition.position = 5790;
-					setDoor(4, kCharacterCond1, 1, 10, 9);
-					break;
-				case 3:
-					setDoor(4, kCharacterCond1, 1, 10, 9);
-					break;
-				case 4:
-				case 5:
-					getCharacterCurrentParams(kCharacterCond1)[2]++;
-					if (getCharacterCurrentParams(kCharacterCond1)[2] == 1) {
-						setDoor(4, 3, 1, 0, 0);
-						getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 6;
-						Cond1Call(&LogicManager::CONS_Cond1_DoDialog, "Con5002", 0, 0, 0);
-					} else if (getCharacterCurrentParams(kCharacterCond1)[2] == 2) {
-						setDoor(4, 3, 1, 0, 0);
-						getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 7;
-						Cond1Call(&LogicManager::CONS_Cond1_DoDialog, "Con5002A", 0, 0, 0);
-					}
-					break;
-				case 6:
-					getCharacterCurrentParams(kCharacterCond1)[0] = 1;
-					setDoor(4, 3, 1, 14, 0);
-					break;
-				case 7:
-					getCharacterCurrentParams(kCharacterCond1)[1] = 1;
+	switch (msg->action) {
+	case 0:
+		if (getCharacterCurrentParams(kCharacterCond1)[0]) {
+			if (getCharacterCurrentParams(kCharacterCond1)[3] || (getCharacterCurrentParams(kCharacterCond1)[3] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
+				if (getCharacterCurrentParams(kCharacterCond1)[3] >= _currentGameSessionTicks)
 					break;
-				default:
-					return;
-				}
-			} else if (msg->action == 135800432) {
-				CONS_Cond1_Disappear(0, 0, 0, 0);
-			}
-		} else if (msg->action == 17) {
-			if (getCharacterCurrentParams(kCharacterCond1)[1] || getCharacterCurrentParams(kCharacterCond1)[0]) {
-				getCharacterCurrentParams(kCharacterCond1)[1] = 0;
-				getCharacterCurrentParams(kCharacterCond1)[0] = 0;
-				setDoor(4, 3, 1, 10, 9);
-				getCharacterCurrentParams(kCharacterCond1)[2] = 0;
+
+				getCharacterCurrentParams(kCharacterCond1)[3] = 0x7FFFFFFF;
 			}
-		} else if (msg->action == 12) {
-			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 1;
-			Cond1Call(&LogicManager::CONS_Cond1_DoWalk, 3, 5790, 0, 0);
+
+			getCharacterCurrentParams(kCharacterCond1)[0] = 0;
+			getCharacterCurrentParams(kCharacterCond1)[1] = 1;
+			setDoor(4, kCharacterCond1, 1, 0, 0);
+			getCharacterCurrentParams(kCharacterCond1)[3] = 0;
+		} else {
+			getCharacterCurrentParams(kCharacterCond1)[3] = 0;
 		}
-	} else if (msg->action >= 8) {
+
+		break;
+	case 8:
+	case 9:
 		if (getCharacterCurrentParams(kCharacterCond1)[0]) {
 			setDoor(4, kCharacterCond1, 1, 0, 0);
 			getCharacterCurrentParams(kCharacterCond1)[0] = 0;
@@ -4163,22 +5168,67 @@ void LogicManager::HAND_Cond1_HideOut(HAND_PARAMS) {
 			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 5;
 			Cond1Call(&LogicManager::CONS_Cond1_DoDialog, "LIB013", 0, 0, 0);
 		}
-	} else if (msg->action == 0) {
-		if (getCharacterCurrentParams(kCharacterCond1)[0]) {
-			if (getCharacterCurrentParams(kCharacterCond1)[3] || (getCharacterCurrentParams(kCharacterCond1)[3] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
-				if (getCharacterCurrentParams(kCharacterCond1)[3] >= _currentGameSessionTicks)
-					return;
 
-				getCharacterCurrentParams(kCharacterCond1)[3] = 0x7FFFFFFF;
+		break;
+	case 12:
+		getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 1;
+		Cond1Call(&LogicManager::CONS_Cond1_DoWalk, 3, 5790, 0, 0);
+		break;
+	case 17:
+		if (getCharacterCurrentParams(kCharacterCond1)[1] || getCharacterCurrentParams(kCharacterCond1)[0]) {
+			getCharacterCurrentParams(kCharacterCond1)[1] = 0;
+			getCharacterCurrentParams(kCharacterCond1)[0] = 0;
+			setDoor(4, kCharacterCond1, 1, 10, 9);
+			getCharacterCurrentParams(kCharacterCond1)[2] = 0;
+		}
+
+		break;
+	case 18:
+		switch (getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8]) {
+		case 1:
+			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 2;
+			Cond1Call(&LogicManager::CONS_Cond1_DoCorrOtis, "601ZD", 4, 0, 0);
+			break;
+		case 2:
+			endGraphics(kCharacterCond1);
+			getCharacter(kCharacterCond1).characterPosition.location = 1;
+			getCharacter(kCharacterCond1).characterPosition.position = 5790;
+			setDoor(4, kCharacterCond1, 1, 10, 9);
+			break;
+		case 3:
+			setDoor(4, kCharacterCond1, 1, 10, 9);
+			break;
+		case 4:
+		case 5:
+			getCharacterCurrentParams(kCharacterCond1)[2]++;
+			if (getCharacterCurrentParams(kCharacterCond1)[2] == 1) {
+				setDoor(4, kCharacterCond1, 1, 0, 0);
+				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 6;
+				Cond1Call(&LogicManager::CONS_Cond1_DoDialog, "Con5002", 0, 0, 0);
+			} else if (getCharacterCurrentParams(kCharacterCond1)[2] == 2) {
+				setDoor(4, kCharacterCond1, 1, 0, 0);
+				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 7;
+				Cond1Call(&LogicManager::CONS_Cond1_DoDialog, "Con5002A", 0, 0, 0);
 			}
 
-			getCharacterCurrentParams(kCharacterCond1)[0] = 0;
+			break;
+		case 6:
+			getCharacterCurrentParams(kCharacterCond1)[0] = 1;
+			setDoor(4, kCharacterCond1, 1, 14, 0);
+			break;
+		case 7:
 			getCharacterCurrentParams(kCharacterCond1)[1] = 1;
-			setDoor(4, kCharacterCond1, 1, 0, 0);
-			getCharacterCurrentParams(kCharacterCond1)[3] = 0;
-		} else {
-			getCharacterCurrentParams(kCharacterCond1)[3] = 0;
+			break;
+		default:
+			break;
 		}
+
+		break;
+	case 135800432:
+		CONS_Cond1_Disappear(0, 0, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 


Commit: 8cc7437fc07283e6729f09ed68b78510da2e34dd
    https://github.com/scummvm/scummvm/commit/8cc7437fc07283e6729f09ed68b78510da2e34dd
Author: AndywinXp (andywinxp at gmail.com)
Date: 2025-06-16T23:12:18+02:00

Commit Message:
LASTEXPRESS: Clean up Cond2 logic

Changed paths:
    engines/lastexpress/characters/cond2.cpp


diff --git a/engines/lastexpress/characters/cond2.cpp b/engines/lastexpress/characters/cond2.cpp
index da1ee610f98..61629dcab8e 100644
--- a/engines/lastexpress/characters/cond2.cpp
+++ b/engines/lastexpress/characters/cond2.cpp
@@ -69,24 +69,32 @@ void LogicManager::CONS_Cond2_DebugWalks(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Cond2_DebugWalks(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 1) {
-			getCharacter(kCharacterCond2).clothes++;
-			if (getCharacter(kCharacterCond2).clothes > 1)
-				getCharacter(kCharacterCond2).clothes = 0;
-		} else if (msg->action == 12) {
-			getCharacter(kCharacterCond2).characterPosition.position = 0;
-			getCharacter(kCharacterCond2).characterPosition.location = 0;
-			getCharacter(kCharacterCond2).characterPosition.car = kCarGreenSleeping;
-			getCharacter(kCharacterCond2).inventoryItem = 0x80;
-			getCharacterCurrentParams(kCharacterCond2)[0] = 10000;
-		}
-	} else if (walk(kCharacterCond2, kCarGreenSleeping, getCharacterCurrentParams(kCharacterCond2)[0])) {
-		if (getCharacterCurrentParams(kCharacterCond2)[0] == 10000) {
-			getCharacterCurrentParams(kCharacterCond2)[0] = 0;
-		} else {
-			getCharacterCurrentParams(kCharacterCond2)[0] = 10000;
+	switch (msg->action) {
+	case 0:
+		if (walk(kCharacterCond2, kCarGreenSleeping, getCharacterCurrentParams(kCharacterCond2)[0])) {
+			if (getCharacterCurrentParams(kCharacterCond2)[0] == 10000) {
+				getCharacterCurrentParams(kCharacterCond2)[0] = 0;
+			} else {
+				getCharacterCurrentParams(kCharacterCond2)[0] = 10000;
+			}
 		}
+
+		break;
+	case 1:
+		getCharacter(kCharacterCond2).clothes++;
+		if (getCharacter(kCharacterCond2).clothes > 1)
+			getCharacter(kCharacterCond2).clothes = 0;
+
+		break;
+	case 12:
+		getCharacter(kCharacterCond2).characterPosition.position = 0;
+		getCharacter(kCharacterCond2).characterPosition.location = 0;
+		getCharacter(kCharacterCond2).characterPosition.car = kCarGreenSleeping;
+		getCharacter(kCharacterCond2).inventoryItem = 0x80;
+		getCharacterCurrentParams(kCharacterCond2)[0] = 10000;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -109,6 +117,7 @@ void LogicManager::HAND_Cond2_DoSeqOtis(HAND_PARAMS) {
 			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 1;
 			Cond2Call(&LogicManager::CONS_Cond2_SaveGame, 2, kEventMertensBloodJacket, 0, 0);
 		}
+
 		break;
 	case 3:
 		getCharacter(kCharacterCond2).currentCall--;
@@ -121,11 +130,12 @@ void LogicManager::HAND_Cond2_DoSeqOtis(HAND_PARAMS) {
 	case 18:
 		if (getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] == 1) {
 			playNIS(kEventCoudertBloodJacket);
-			endGame(0, 1, 55, 1);
+			endGame(0, 1, 55, true);
 		}
+
 		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -150,6 +160,7 @@ void LogicManager::HAND_Cond2_DoCorrOtis(HAND_PARAMS) {
 			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 1;
 			Cond2Call(&LogicManager::CONS_Cond2_SaveGame, 2, kEventMertensBloodJacket, 0, 0);
 		}
+
 		break;
 	case 3:
 		releaseAtDoor(kCharacterCond2, getCharacterCurrentParams(kCharacterCond2)[3]);
@@ -165,11 +176,12 @@ void LogicManager::HAND_Cond2_DoCorrOtis(HAND_PARAMS) {
 	case 18:
 		if (getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] == 1) {
 			playNIS(kEventCoudertBloodJacket);
-			endGame(0, 1, 55, 1);
+			endGame(0, 1, 55, true);
 		}
+
 		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -184,25 +196,32 @@ void LogicManager::CONS_Cond2_FinishSeqOtis(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Cond2_FinishSeqOtis(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action != 3) {
-			if (msg->action == 18 && getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] == 1) {
-				playNIS(kEventCoudertBloodJacket);
-				endGame(0, 1, 55, 1);
-			}
-			return;
+	switch (msg->action) {
+	case 0:
+		if (getCharacter(kCharacterCond2).direction != 4) {
+			getCharacter(kCharacterCond2).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterCond2, _functionsCond2[getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall]]);
+			fedEx(kCharacterCond2, kCharacterCond2, 18, 0);
+		} else if (_gameProgress[kProgressJacket] == 1 && nearChar(kCharacterCond2, kCharacterCath, 1000) && !inComp(kCharacterCath) && !whoOutside(kCharacterCath)) {
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 1;
+			Cond2Call(&LogicManager::CONS_Cond2_SaveGame, 2, kEventMertensBloodJacket, 0, 0);
 		}
-	LABEL_6:
+
+		break;
+	case 3:
 		getCharacter(kCharacterCond2).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterCond2, _functionsCond2[getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall]]);
 		fedEx(kCharacterCond2, kCharacterCond2, 18, 0);
-		return;
-	}
-	if (getCharacter(kCharacterCond2).direction != 4)
-		goto LABEL_6;
-	if (_gameProgress[kProgressJacket] == 1 && nearChar(kCharacterCond2, kCharacterCath, 1000) && !inComp(kCharacterCath) && !whoOutside(kCharacterCath)) {
-		getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 1;
-		Cond2Call(&LogicManager::CONS_Cond2_SaveGame, 2, kEventMertensBloodJacket, 0, 0);
+		break;
+	case 18:
+		if (getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] == 1) {
+			playNIS(kEventCoudertBloodJacket);
+			endGame(0, 1, 55, true);
+		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -225,10 +244,11 @@ void LogicManager::CONS_Cond2_DoEnterCorrOtis(CONS_PARAMS) {
 void LogicManager::HAND_Cond2_DoEnterCorrOtis(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
-		if (_gameProgress[1] == 1 && nearChar(kCharacterCond2, kCharacterCath, 1000) && !inComp(kCharacterCath) && !whoOutside(kCharacterCath)) {
+		if (_gameProgress[kProgressJacket] == 1 && nearChar(kCharacterCond2, kCharacterCath, 1000) && !inComp(kCharacterCath) && !whoOutside(kCharacterCath)) {
 			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 1;
 			Cond2Call(&LogicManager::CONS_Cond2_SaveGame, 2, kEventMertensBloodJacket, 0, 0);
 		}
+
 		break;
 	case 3:
 		releaseAtDoor(kCharacterCond2, getCharacterCurrentParams(kCharacterCond2)[3]);
@@ -257,11 +277,12 @@ void LogicManager::HAND_Cond2_DoEnterCorrOtis(HAND_PARAMS) {
 	case 18:
 		if (getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] == 1) {
 			playNIS(kEventCoudertBloodJacket);
-			endGame(0, 1, 55, 1);
+			endGame(0, 1, 55, true);
 		}
+
 		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -284,6 +305,7 @@ void LogicManager::HAND_Cond2_DoDialog(HAND_PARAMS) {
 			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 1;
 			Cond2Call(&LogicManager::CONS_Cond2_SaveGame, 2, kEventMertensBloodJacket, 0, 0);
 		}
+
 		break;
 	case 2:
 		getCharacter(kCharacterCond2).currentCall--;
@@ -296,11 +318,12 @@ void LogicManager::HAND_Cond2_DoDialog(HAND_PARAMS) {
 	case 18:
 		if (getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] == 1) {
 			playNIS(kEventCoudertBloodJacket);
-			endGame(0, 1, 55, 1);
+			endGame(0, 1, 55, true);
 		}
+
 		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -319,10 +342,11 @@ void LogicManager::CONS_Cond2_DoDialogFullVol(CONS_PARAMS) {
 void LogicManager::HAND_Cond2_DoDialogFullVol(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
-		if (_gameProgress[1] == 1 && nearChar(kCharacterCond2, kCharacterCath, 1000) && !inComp(kCharacterCath) && !whoOutside(kCharacterCath)) {
+		if (_gameProgress[kProgressJacket] == 1 && nearChar(kCharacterCond2, kCharacterCath, 1000) && !inComp(kCharacterCath) && !whoOutside(kCharacterCath)) {
 			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 1;
-			Cond2Call(&LogicManager::CONS_Cond2_SaveGame, 2, 123, 0, 0);
+			Cond2Call(&LogicManager::CONS_Cond2_SaveGame, 2, kEventMertensBloodJacket, 0, 0);
 		}
+
 		break;
 	case 2:
 		getCharacter(kCharacterCond2).currentCall--;
@@ -335,11 +359,12 @@ void LogicManager::HAND_Cond2_DoDialogFullVol(HAND_PARAMS) {
 	case 18:
 		if (getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] == 1) {
 			playNIS(kEventCoudertBloodJacket);
-			endGame(0, 1, 55, 1);
+			endGame(0, 1, 55, true);
 		}
+
 		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -357,22 +382,25 @@ void LogicManager::CONS_Cond2_SaveGame(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Cond2_SaveGame(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			save(
-				kCharacterCond2,
-				getCharacter(kCharacterCond2).callParams[getCharacter(kCharacterCond2).currentCall].parameters[0],
-				getCharacter(kCharacterCond2).callParams[getCharacter(kCharacterCond2).currentCall].parameters[1]
-			);
+	switch (msg->action) {
+	case 0:
+		getCharacter(kCharacterCond2).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterCond2, _functionsCond2[getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall]]);
+		fedEx(kCharacterCond2, kCharacterCond2, 18, 0);
+		break;
+	case 12:
+		save(
+			kCharacterCond2,
+			getCharacterCurrentParams(kCharacterCond2)[0],
+			getCharacterCurrentParams(kCharacterCond2)[1]
+		);
 
-			getCharacter(kCharacterCond2).currentCall--;
-			_engine->getMessageManager()->setMessageHandle(kCharacterCond2, _functionsCond2[getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall]]);
-			fedEx(kCharacterCond2, kCharacterCond2, 18, 0);
-		}
-	} else {
 		getCharacter(kCharacterCond2).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterCond2, _functionsCond2[getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall]]);
 		fedEx(kCharacterCond2, kCharacterCond2, 18, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -397,6 +425,7 @@ void LogicManager::HAND_Cond2_DoWalk(HAND_PARAMS) {
 		} else {
 			getCharacter(kCharacterCond2).inventoryItem = 0;
 		}
+
 		if (_gameProgress[kProgressJacket] != 1 || !nearChar(kCharacterCond2, kCharacterCath, 1000) || inComp(kCharacterCath) || whoOutside(kCharacterCath)) {
 			if (walk(kCharacterCond2, getCharacterCurrentParams(kCharacterCond2)[0], getCharacterCurrentParams(kCharacterCond2)[1])) {
 				getCharacter(kCharacterCond2).inventoryItem = 0;
@@ -409,6 +438,7 @@ void LogicManager::HAND_Cond2_DoWalk(HAND_PARAMS) {
 			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 1;
 			Cond2Call(&LogicManager::CONS_Cond2_SaveGame, 2, kEventMertensBloodJacket, 0, 0);
 		}
+
 		break;
 	case 1:
 		getCharacterCurrentParams(kCharacterCond2)[2] = 0;
@@ -417,43 +447,48 @@ void LogicManager::HAND_Cond2_DoWalk(HAND_PARAMS) {
 		Cond2Call(&LogicManager::CONS_Cond2_SaveGame, 2, kEventCoudertAskTylerCompartment, 0, 0);
 		break;
 	case 5:
-		if (getCharacter(kCharacterCond2).clothes == 1)
-			goto LABEL_16;
-		if (!whoRunningDialog(kCharacterCond2)) {
+		if (getCharacter(kCharacterCond2).clothes == 1) {
+			playDialog(0, "ZFX1003", getVolume(kCharacterCond2), 0);
+		} else if (!whoRunningDialog(kCharacterCond2)) {
 			playDialog(kCharacterCath, "JAC1112", getVolume(kCharacterCond2), 0);
 		}
+
 		break;
 	case 6:
 		if (getCharacter(kCharacterCond2).clothes == 1) {
-		LABEL_16:
 			playDialog(0, "ZFX1003", getVolume(kCharacterCond2), 0);
 		} else {
 			playChrExcuseMe(kCharacterCond2, kCharacterCath, 0);
 		}
+
 		break;
 	case 12:
 		if (!_gameProgress[kProgressEventFoundCorpse] && !_gameEvents[kEventCoudertAskTylerCompartment])
 			getCharacterCurrentParams(kCharacterCond2)[2] = 128;
+
 		if (walk(kCharacterCond2, getCharacterCurrentParams(kCharacterCond2)[0], getCharacterCurrentParams(kCharacterCond2)[1])) {
 			getCharacter(kCharacterCond2).currentCall--;
 			_engine->getMessageManager()->setMessageHandle(kCharacterCond2, _functionsCond2[getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall]]);
 			fedEx(kCharacterCond2, kCharacterCond2, 18, 0);
 		}
+
 		break;
 	case 18:
 		if (getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] == 1) {
 			playNIS(kEventCoudertBloodJacket);
-			endGame(0, 1, 55, 1);
+			endGame(0, 1, 55, true);
 		} else if (getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] == 2) {
 			playNIS(kEventCoudertAskTylerCompartment);
+
 			if (getCharacter(kCharacterCond2).direction == 1)
 				bumpCathFx(getCharacter(kCharacterCond2).characterPosition.car, getCharacter(kCharacterCond2).characterPosition.position - 750);
 			else
 				bumpCathRx(getCharacter(kCharacterCond2).characterPosition.car, getCharacter(kCharacterCond2).characterPosition.position + 750);
 		}
+
 		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -470,27 +505,35 @@ void LogicManager::CONS_Cond2_DoWait(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Cond2_DoWait(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 18 && getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] == 1) {
-			playNIS(kEventCoudertBloodJacket);
-			endGame(0, 1, 55, true);
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		if (_gameProgress[kProgressJacket] == 1 && nearChar(kCharacterCond2, kCharacterCath, 1000) && !inComp(kCharacterCath) && !whoOutside(kCharacterCath)) {
 			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 1;
 			Cond2Call(&LogicManager::CONS_Cond2_SaveGame, 2, kEventMertensBloodJacket, 0, 0);
-			return;
+			break;
 		}
+
 		if (getCharacterCurrentParams(kCharacterCond2)[1] ||
 			(getCharacterCurrentParams(kCharacterCond2)[1] = _gameTime + getCharacterCurrentParams(kCharacterCond2)[0], _gameTime + getCharacterCurrentParams(kCharacterCond2)[0] != 0)) {
 			if (getCharacterCurrentParams(kCharacterCond2)[1] >= _gameTime)
-				return;
+				break;
+
 			getCharacterCurrentParams(kCharacterCond2)[1] = 0x7FFFFFFF;
-		}
+		} 
 
 		getCharacter(kCharacterCond2).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterCond2, _functionsCond2[getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall]]);
 		fedEx(kCharacterCond2, kCharacterCond2, 18, 0);
+		break;
+	case 18:
+		if (getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] == 1) {
+			playNIS(kEventCoudertBloodJacket);
+			endGame(0, 1, 55, true);
+		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -507,27 +550,35 @@ void LogicManager::CONS_Cond2_DoWaitReal(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Cond2_DoWaitReal(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 18 && getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] == 1) {
-			playNIS(kEventCoudertBloodJacket);
-			endGame(0, 1, 55, 1);
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		if (_gameProgress[kProgressJacket] == 1 && nearChar(kCharacterCond2, kCharacterCath, 1000) && !inComp(kCharacterCath) && !whoOutside(kCharacterCath)) {
 			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 1;
 			Cond2Call(&LogicManager::CONS_Cond2_SaveGame, 2, kEventMertensBloodJacket, 0, 0);
-			return;
+			break;
 		}
+
 		if (getCharacterCurrentParams(kCharacterCond2)[1] ||
 			(getCharacterCurrentParams(kCharacterCond2)[1] = _currentGameSessionTicks + getCharacterCurrentParams(kCharacterCond2)[0], _currentGameSessionTicks + getCharacterCurrentParams(kCharacterCond2)[0] != 0)) {
 			if (getCharacterCurrentParams(kCharacterCond2)[1] >= _currentGameSessionTicks)
-				return;
+				break;
+
 			getCharacterCurrentParams(kCharacterCond2)[1] = 0x7FFFFFFF;
 		}
 
 		getCharacter(kCharacterCond2).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterCond2, _functionsCond2[getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall]]);
 		fedEx(kCharacterCond2, kCharacterCond2, 18, 0);
+		break;
+	case 18:
+		if (getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] == 1) {
+			playNIS(kEventCoudertBloodJacket);
+			endGame(0, 1, 55, true);
+		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -544,7 +595,8 @@ void LogicManager::CONS_Cond2_StandAsideDialog(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Cond2_StandAsideDialog(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		if (!whoRunningDialog(kCharacterCond2)) {
 			if (isNight()) {
 				if (isFemale(getCharacterCurrentParams(kCharacterCond2)[0])) {
@@ -585,6 +637,9 @@ void LogicManager::HAND_Cond2_StandAsideDialog(HAND_PARAMS) {
 		getCharacter(kCharacterCond2).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterCond2, _functionsCond2[getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall]]);
 		fedEx(kCharacterCond2, kCharacterCond2, 18, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -602,188 +657,242 @@ void LogicManager::CONS_Cond2_Passing(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Cond2_Passing(HAND_PARAMS) {
-	if (msg->action > 11) {
-		if (msg->action > 16) {
-			switch (msg->action) {
-			case 17:
-				if (!getCharacterCurrentParams(kCharacterCond2)[2]) {
-					getCharacter(kCharacterCond2).inventoryItem = 0;
-					getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 6;
-					Cond2Call(&LogicManager::CONS_Cond2_SitDownFast, 1, 0, 0, 0);
-				}
-				break;
-			case 18:
-				switch (getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8]) {
-				case 1:
-					getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 2;
-					Cond2Call(&LogicManager::CONS_Cond2_GetUpListen, 1, 0, 0, 0);
-					break;
-				case 2:
-					if (_gameProgress[kProgressChapter] == 1 && !_gameProgress[kProgressEventFoundCorpse] && !_gameEvents[kEventCoudertAskTylerCompartment]) {
-						getCharacter(kCharacterCond2).inventoryItem = 0x80;
-					}
-
-					if (!getCharacterCurrentParams(kCharacterCond2)[0]) {
-						startCycOtis(kCharacterCond2, "667H");
-					} else {
-						startCycOtis(kCharacterCond2, "667I");
-					}
-					break;
-				case 3:
-					playNIS(kEventCoudertBloodJacket);
-					endGame(0, 1, 55, true);
-					goto LABEL_39;
-				case 4:
-				case 5:
-				case 6:
-				case 7:
-					getCharacter(kCharacterCond2).currentCall--;
-					_engine->getMessageManager()->setMessageHandle(kCharacterCond2, _functionsCond2[getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall]]);
-					fedEx(kCharacterCond2, kCharacterCond2, 18, 0);
-					break;
-				case 9:
-					playNIS(kEventCoudertAskTylerCompartment);
-					bumpCath(kCarRedSleeping, 25, 255);
-					break;
-				default:
-					return;
-				}
-				break;
-			case 201439712:
-				startCycOtis(kCharacterCond2, "627K");
-				break;
-			}
-		} else if (msg->action == 16) {
-			getCharacterCurrentParams(kCharacterCond2)[2]--;
-			if (getCharacterCurrentParams(kCharacterCond2)[1] && getCharacterCurrentParams(kCharacterCond2)[2] == 0) {
-				getCharacter(kCharacterCond2).inventoryItem = 0;
-				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 7;
-				Cond2Call(&LogicManager::CONS_Cond2_SitDownFast, 1, 0, 0, 0);
-			}
-		} else if (msg->action == 12) {
-			if (getCharacterCurrentParams(kCharacterCond2)[1])
-				getCharacterCurrentParams(kCharacterCond2)[2] = 1;
-			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 1;
-			Cond2Call(&LogicManager::CONS_Cond2_StandAsideDialog, getCharacterCurrentParams(kCharacterCond2)[1], 0, 0, 0);
-		}
-	} else {
-		if (msg->action == 11) {
-			getCharacterCurrentParams(kCharacterCond2)[2]++;
-			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 8;
-			Cond2Call(&LogicManager::CONS_Cond2_StandAsideDialog, msg->sender, 0, 0, 0);
-			return;
-		}
-		if (msg->action) {
-			if (msg->action == 1) {
-				getCharacter(kCharacterCond2).inventoryItem = 0;
-				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 9;
-				Cond2Call(&LogicManager::CONS_Cond2_SaveGame, 2, kEventCoudertAskTylerCompartment, 0, 0);
-			}
-			return;
-		}
+	switch (msg->action) {
+	case 0:
 		if (_gameProgress[kProgressJacket] == 1 && nearChar(kCharacterCond2, kCharacterCath, 1000) && !inComp(kCharacterCath) && !whoOutside(kCharacterCath)) {
 			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 3;
 			Cond2Call(&LogicManager::CONS_Cond2_SaveGame, 2, kEventMertensBloodJacket, 0, 0);
-			return;
+			break;
 		}
-	LABEL_39:
+
 		if (!getCharacterCurrentParams(kCharacterCond2)[1] && !getCharacterCurrentParams(kCharacterCond2)[2]) {
 			if (!getCharacterCurrentParams(kCharacterCond2)[3]) {
 				getCharacterCurrentParams(kCharacterCond2)[3] = _currentGameSessionTicks + 75;
-				if (_currentGameSessionTicks == -75)
-					goto LABEL_45;
+				if (_currentGameSessionTicks == -75) {
+					getCharacter(kCharacterCond2).inventoryItem = 0;
+					getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 4;
+					Cond2Call(&LogicManager::CONS_Cond2_SitDownFast, 1, 0, 0, 0);
+					break;
+				}
 			}
+
 			if (getCharacterCurrentParams(kCharacterCond2)[3] < _currentGameSessionTicks) {
 				getCharacterCurrentParams(kCharacterCond2)[3] = 0x7FFFFFFF;
-			LABEL_45:
+
 				getCharacter(kCharacterCond2).inventoryItem = 0;
 				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 4;
 				Cond2Call(&LogicManager::CONS_Cond2_SitDownFast, 1, 0, 0, 0);
-				return;
+				break;
 			}
 		}
+
 		if (getCharacterCurrentParams(kCharacterCond2)[4] ||
 			(getCharacterCurrentParams(kCharacterCond2)[4] = _currentGameSessionTicks + 225, _currentGameSessionTicks != -225)) {
 			if (getCharacterCurrentParams(kCharacterCond2)[4] >= _currentGameSessionTicks) {
-				return;
+				break;
 			}
 
 			getCharacterCurrentParams(kCharacterCond2)[4] = 0x7FFFFFFF;
 		}
+
 		getCharacter(kCharacterCond2).inventoryItem = 0;
 		getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 5;
 		Cond2Call(&LogicManager::CONS_Cond2_SitDownFast, 1, 0, 0, 0);
-	}
-}
-
-void LogicManager::CONS_Cond2_Listen(CONS_PARAMS) {
-	CharacterCallParams *params = &getCharacter(kCharacterCond2).callParams[getCharacter(kCharacterCond2).currentCall];
-	_engine->getMessageManager()->setMessageHandle(kCharacterCond2, &LogicManager::HAND_Cond2_Listen);
-	getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall] = 14;
-
-	params->clear();
+		break;
+	case 1:
+		getCharacter(kCharacterCond2).inventoryItem = 0;
+		getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 9;
+		Cond2Call(&LogicManager::CONS_Cond2_SaveGame, 2, kEventCoudertAskTylerCompartment, 0, 0);
+		break;
+	case 11:
+		getCharacterCurrentParams(kCharacterCond2)[2]++;
+		getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 8;
+		Cond2Call(&LogicManager::CONS_Cond2_StandAsideDialog, msg->sender, 0, 0, 0);
+		break;
+	case 12:
+		if (getCharacterCurrentParams(kCharacterCond2)[1])
+			getCharacterCurrentParams(kCharacterCond2)[2] = 1;
 
-	params->parameters[0] = param1.intParam;
+		getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 1;
+		Cond2Call(&LogicManager::CONS_Cond2_StandAsideDialog, getCharacterCurrentParams(kCharacterCond2)[1], 0, 0, 0);
+		break;
+	case 16:
+		getCharacterCurrentParams(kCharacterCond2)[2]--;
+		if (getCharacterCurrentParams(kCharacterCond2)[1] && getCharacterCurrentParams(kCharacterCond2)[2] == 0) {
+			getCharacter(kCharacterCond2).inventoryItem = 0;
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 7;
+			Cond2Call(&LogicManager::CONS_Cond2_SitDownFast, 1, 0, 0, 0);
+		}
 
-	fedEx(kCharacterCond2, kCharacterCond2, 12, 0);
-}
+		break;
+	case 17:
+		if (!getCharacterCurrentParams(kCharacterCond2)[2]) {
+			getCharacter(kCharacterCond2).inventoryItem = 0;
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 6;
+			Cond2Call(&LogicManager::CONS_Cond2_SitDownFast, 1, 0, 0, 0);
+		}
 
-void LogicManager::HAND_Cond2_Listen(HAND_PARAMS) {
-	if (msg->action > 12) {
-		if (msg->action == 18) {
-			switch (getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8]) {
-			case 1:
-				send(kCharacterCond2, getCharacterCurrentParams(kCharacterCond2)[0], 202558662, 0);
-				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 2;
-				Cond2Call(&LogicManager::CONS_Cond2_GetUpListen, 0, 0, 0, 0);
-				break;
-			case 2:
-				send(kCharacterCond2, getCharacterCurrentParams(kCharacterCond2)[0], 155853632, 0);
-				startCycOtis(kCharacterCond2, "627K");
-				break;
-			case 3:
-				send(kCharacterCond2, getCharacterCurrentParams(kCharacterCond2)[0], 202558662, 0);
-				send(kCharacterCond2, getCharacterCurrentParams(kCharacterCond2)[0], 155853632, 0);
-				startCycOtis(kCharacterCond2, "627K");
-				takeItem(kItem5);
-				break;
-			case 4:
-				playNIS(kEventCoudertBloodJacket);
-				endGame(0, 1, 55, 1);
-				break;
-			case 5:
-				getCharacter(kCharacterCond2).currentCall--;
-				_engine->getMessageManager()->setMessageHandle(kCharacterCond2, _functionsCond2[getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall]]);
-				fedEx(kCharacterCond2, kCharacterCond2, 18, 0);
-				break;
-			default:
-				return;
-			}
-		} else if (msg->action == 125499160) {
-			if (getCharacterCurrentParams(kCharacterCond2)[0] == kCharacterTrainM) {
-				getCharacterParams(kCharacterCond2, 8)[2] = 0;
-			} else if (getCharacterCurrentParams(kCharacterCond2)[0] == kCharacterCond1) {
-				getCharacterParams(kCharacterCond2, 8)[4] = 0;
-			} else if (getCharacterCurrentParams(kCharacterCond2)[0] == kCharacterMadame) {
-				getCharacterParams(kCharacterCond2, 8)[3] = 0;
+		break;
+	case 18:
+		switch (getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8]) {
+		case 1:
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 2;
+			Cond2Call(&LogicManager::CONS_Cond2_GetUpListen, 1, 0, 0, 0);
+			break;
+		case 2:
+			if (_gameProgress[kProgressChapter] == 1 && !_gameProgress[kProgressEventFoundCorpse] && !_gameEvents[kEventCoudertAskTylerCompartment]) {
+				getCharacter(kCharacterCond2).inventoryItem = 0x80;
 			}
-			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 5;
-			Cond2Call(&LogicManager::CONS_Cond2_SitDownFast, 0, 0, 0, 0);
-		}
-	} else if (msg->action == 12) {
-		if (getCharacterParams(kCharacterCond2, 8)[16]) {
-			getCharacterParams(kCharacterCond2, 8)[16] = 0;
-			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 3;
-			Cond2Call(&LogicManager::CONS_Cond2_DoWalk, 4, 1500, 0, 0);
-		} else {
-			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 1;
-			Cond2Call(&LogicManager::CONS_Cond2_DoWait, 15, 0, 0, 0);
-		}
-	} else if (msg->action == 0 && _gameProgress[1] == 1 && nearChar(kCharacterCond2, kCharacterCath, 1000) && !inComp(kCharacterCath) && !whoOutside(kCharacterCath)) {
-		getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 4;
-		Cond2Call(&LogicManager::CONS_Cond2_SaveGame, 2, 123, 0, 0);
-	}
-}
+
+			if (!getCharacterCurrentParams(kCharacterCond2)[0]) {
+				startCycOtis(kCharacterCond2, "667H");
+			} else {
+				startCycOtis(kCharacterCond2, "667I");
+			}
+
+			break;
+		case 3:
+			playNIS(kEventCoudertBloodJacket);
+			endGame(0, 1, 55, true);
+
+			if (!getCharacterCurrentParams(kCharacterCond2)[1] && !getCharacterCurrentParams(kCharacterCond2)[2]) {
+				if (!getCharacterCurrentParams(kCharacterCond2)[3]) {
+					getCharacterCurrentParams(kCharacterCond2)[3] = _currentGameSessionTicks + 75;
+					if (_currentGameSessionTicks == -75) {
+						getCharacter(kCharacterCond2).inventoryItem = 0;
+						getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 4;
+						Cond2Call(&LogicManager::CONS_Cond2_SitDownFast, 1, 0, 0, 0);
+						break;
+					}
+				}
+
+				if (getCharacterCurrentParams(kCharacterCond2)[3] < _currentGameSessionTicks) {
+					getCharacterCurrentParams(kCharacterCond2)[3] = 0x7FFFFFFF;
+
+					getCharacter(kCharacterCond2).inventoryItem = 0;
+					getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 4;
+					Cond2Call(&LogicManager::CONS_Cond2_SitDownFast, 1, 0, 0, 0);
+					break;
+				}
+			}
+
+			if (getCharacterCurrentParams(kCharacterCond2)[4] ||
+				(getCharacterCurrentParams(kCharacterCond2)[4] = _currentGameSessionTicks + 225, _currentGameSessionTicks != -225)) {
+				if (getCharacterCurrentParams(kCharacterCond2)[4] >= _currentGameSessionTicks) {
+					break;
+				}
+
+				getCharacterCurrentParams(kCharacterCond2)[4] = 0x7FFFFFFF;
+			}
+
+			getCharacter(kCharacterCond2).inventoryItem = 0;
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 5;
+			Cond2Call(&LogicManager::CONS_Cond2_SitDownFast, 1, 0, 0, 0);
+			break;
+		case 4:
+		case 5:
+		case 6:
+		case 7:
+			getCharacter(kCharacterCond2).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterCond2, _functionsCond2[getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall]]);
+			fedEx(kCharacterCond2, kCharacterCond2, 18, 0);
+			break;
+		case 9:
+			playNIS(kEventCoudertAskTylerCompartment);
+			bumpCath(kCarRedSleeping, 25, 255);
+			break;
+		default:
+			break;
+		}
+
+		break;
+	case 201439712:
+		startCycOtis(kCharacterCond2, "627K");
+		break;
+	default:
+		break;
+	}
+}
+
+void LogicManager::CONS_Cond2_Listen(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterCond2).callParams[getCharacter(kCharacterCond2).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterCond2, &LogicManager::HAND_Cond2_Listen);
+	getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall] = 14;
+
+	params->clear();
+
+	params->parameters[0] = param1.intParam;
+
+	fedEx(kCharacterCond2, kCharacterCond2, 12, 0);
+}
+
+void LogicManager::HAND_Cond2_Listen(HAND_PARAMS) {
+	switch (msg->action) {
+	case 0:
+		if (_gameProgress[kProgressJacket] == 1 && nearChar(kCharacterCond2, kCharacterCath, 1000) && !inComp(kCharacterCath) && !whoOutside(kCharacterCath)) {
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 4;
+			Cond2Call(&LogicManager::CONS_Cond2_SaveGame, 2, 123, 0, 0);
+		}
+
+		break;
+	case 12:
+		if (getCharacterParams(kCharacterCond2, 8)[16]) {
+			getCharacterParams(kCharacterCond2, 8)[16] = 0;
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 3;
+			Cond2Call(&LogicManager::CONS_Cond2_DoWalk, 4, 1500, 0, 0);
+		} else {
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 1;
+			Cond2Call(&LogicManager::CONS_Cond2_DoWait, 15, 0, 0, 0);
+		}
+
+		break;
+	case 18:
+		switch (getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8]) {
+		case 1:
+			send(kCharacterCond2, getCharacterCurrentParams(kCharacterCond2)[0], 202558662, 0);
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 2;
+			Cond2Call(&LogicManager::CONS_Cond2_GetUpListen, 0, 0, 0, 0);
+			break;
+		case 2:
+			send(kCharacterCond2, getCharacterCurrentParams(kCharacterCond2)[0], 155853632, 0);
+			startCycOtis(kCharacterCond2, "627K");
+			break;
+		case 3:
+			send(kCharacterCond2, getCharacterCurrentParams(kCharacterCond2)[0], 202558662, 0);
+			send(kCharacterCond2, getCharacterCurrentParams(kCharacterCond2)[0], 155853632, 0);
+			startCycOtis(kCharacterCond2, "627K");
+			takeItem(kItem5);
+			break;
+		case 4:
+			playNIS(kEventCoudertBloodJacket);
+			endGame(0, 1, 55, true);
+			break;
+		case 5:
+			getCharacter(kCharacterCond2).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterCond2, _functionsCond2[getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall]]);
+			fedEx(kCharacterCond2, kCharacterCond2, 18, 0);
+			break;
+		default:
+			break;
+		}
+
+		break;
+	case 125499160:
+		if (getCharacterCurrentParams(kCharacterCond2)[0] == kCharacterTrainM) {
+			getCharacterParams(kCharacterCond2, 8)[2] = 0;
+		} else if (getCharacterCurrentParams(kCharacterCond2)[0] == kCharacterCond1) {
+			getCharacterParams(kCharacterCond2, 8)[4] = 0;
+		} else if (getCharacterCurrentParams(kCharacterCond2)[0] == kCharacterMadame) {
+			getCharacterParams(kCharacterCond2, 8)[3] = 0;
+		}
+
+		getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 5;
+		Cond2Call(&LogicManager::CONS_Cond2_SitDownFast, 0, 0, 0, 0);
+		break;
+	default:
+		break;
+	}
+}
 
 void LogicManager::CONS_Cond2_TatianaLockUnlockMyComp(CONS_PARAMS) {
 	CharacterCallParams *params = &getCharacter(kCharacterCond2).callParams[getCharacter(kCharacterCond2).currentCall];
@@ -798,12 +907,14 @@ void LogicManager::CONS_Cond2_TatianaLockUnlockMyComp(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Cond2_TatianaLockUnlockMyComp(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacterParams(kCharacterCond2, 8)[7] = 0;
 		getCharacterParams(kCharacterCond2, 8)[8] = 0;
 		getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 1;
 		Cond2Call(&LogicManager::CONS_Cond2_GetUp, 0, 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8]) {
 		case 1:
 			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 2;
@@ -837,8 +948,12 @@ void LogicManager::HAND_Cond2_TatianaLockUnlockMyComp(HAND_PARAMS) {
 			fedEx(kCharacterCond2, kCharacterCond2, 18, 0);
 			break;
 		default:
-			return;
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -853,7 +968,8 @@ void LogicManager::CONS_Cond2_GetUp(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Cond2_GetUp(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		if (getCharacterParams(kCharacterCond2, 8)[16]) {
 			getCharacterParams(kCharacterCond2, 8)[16] = 0;
 			dropItem(kItem5, 1);
@@ -868,7 +984,9 @@ void LogicManager::HAND_Cond2_GetUp(HAND_PARAMS) {
 			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 2;
 			Cond2Call(&LogicManager::CONS_Cond2_DoSeqOtis, "627F", 0, 0, 0);
 		}
-	} else if (msg->action == 18) {
+
+		break;
+	case 18:
 		if (getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8]) {
 			if (getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] <= 2) {
 				dropItem(kItem5, 1);
@@ -880,6 +998,10 @@ void LogicManager::HAND_Cond2_GetUp(HAND_PARAMS) {
 				fedEx(kCharacterCond2, kCharacterCond2, 18, 0);
 			}
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -896,7 +1018,8 @@ void LogicManager::CONS_Cond2_GetUpListen(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Cond2_GetUpListen(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		takeItem(kItem5);
 		if (getCharacterParams(kCharacterCond2, 8)[16]) {
 			getCharacterParams(kCharacterCond2, 8)[16] = 0;
@@ -914,10 +1037,18 @@ void LogicManager::HAND_Cond2_GetUpListen(HAND_PARAMS) {
 			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 3;
 			Cond2Call(&LogicManager::CONS_Cond2_DoSeqOtis, "627F", 0, 0, 0);
 		}
-	} else if (msg->action == 18 && getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] && getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] <= 3) {
-		getCharacter(kCharacterCond2).currentCall--;
-		_engine->getMessageManager()->setMessageHandle(kCharacterCond2, _functionsCond2[getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall]]);
-		fedEx(kCharacterCond2, kCharacterCond2, 18, 0);
+
+		break;
+	case 18:
+		if (getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] && getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] <= 3) {
+			getCharacter(kCharacterCond2).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterCond2, _functionsCond2[getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall]]);
+			fedEx(kCharacterCond2, kCharacterCond2, 18, 0);
+		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -932,7 +1063,8 @@ void LogicManager::CONS_Cond2_SitDown(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Cond2_SitDown(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		if (getCharacterParams(kCharacterCond2, 8)[5] || getCharacterParams(kCharacterCond2, 8)[7] || getCharacterParams(kCharacterCond2, 8)[8] || getCharacterParams(kCharacterCond2, 8)[10] || getCharacterParams(kCharacterCond2, 8)[12] || getCharacterParams(kCharacterCond2, 8)[13] || getCharacterParams(kCharacterCond2, 8)[15] || getCharacterParams(kCharacterCond2, 8)[19] || getCharacterParams(kCharacterCond2, 8)[14] || getCharacterParams(kCharacterCond2, 8)[9] || getCharacterParams(kCharacterCond2, 8)[21]) {
 			dropItem(kItem5, 1);
 			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 1;
@@ -950,16 +1082,22 @@ void LogicManager::HAND_Cond2_SitDown(HAND_PARAMS) {
 				startSeqOtis(kCharacterCond2, "627A");
 			else
 				startSeqOtis(kCharacterCond2, "627D");
+
 			takeItem(kItem5);
+
 			if (checkCathDir(kCarRedSleeping, 68)) {
 				if (!whoRunningDialog(kCharacterCond2))
 					playDialog(kCharacterCond2, "JAC1111", -1, 0);
+
 				bumpCath(kCarRedSleeping, 25, 255);
 			}
+
 			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 3;
 			Cond2Call(&LogicManager::CONS_Cond2_FinishSeqOtis, 0, 0, 0, 0);
 		}
-	} else if (msg->action == 18) {
+
+		break;
+	case 18:
 		switch (getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8]) {
 		case 1:
 			endGraphics(kCharacterCond2);
@@ -986,7 +1124,13 @@ void LogicManager::HAND_Cond2_SitDown(HAND_PARAMS) {
 			_engine->getMessageManager()->setMessageHandle(kCharacterCond2, _functionsCond2[getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall]]);
 			fedEx(kCharacterCond2, kCharacterCond2, 18, 0);
 			break;
+		default:
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1003,7 +1147,8 @@ void LogicManager::CONS_Cond2_SitDownFast(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Cond2_SitDownFast(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		if (getCharacterParams(kCharacterCond2, 8)[5] || getCharacterParams(kCharacterCond2, 8)[7] || getCharacterParams(kCharacterCond2, 8)[8] || getCharacterParams(kCharacterCond2, 8)[10] || getCharacterParams(kCharacterCond2, 8)[12] || getCharacterParams(kCharacterCond2, 8)[13] || getCharacterParams(kCharacterCond2, 8)[15] || getCharacterParams(kCharacterCond2, 8)[19] || getCharacterParams(kCharacterCond2, 8)[14] || getCharacterParams(kCharacterCond2, 8)[9] || getCharacterParams(kCharacterCond2, 8)[21]) {
 			dropItem(kItem5, 1);
 			getCharacterParams(kCharacterCond2, 8)[16] = 1;
@@ -1031,18 +1176,26 @@ void LogicManager::HAND_Cond2_SitDownFast(HAND_PARAMS) {
 			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 1;
 			Cond2Call(&LogicManager::CONS_Cond2_FinishSeqOtis, 0, 0, 0, 0);
 		}
-	} else if (msg->action == 18 && getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] == 1) {
-		if (getCharacterParams(kCharacterCond2, 8)[1]) {
-			startCycOtis(kCharacterCond2, "627B");
-		} else {
-			startCycOtis(kCharacterCond2, "627E");
-		}
 
-		getCharacterParams(kCharacterCond2, 8)[0] = 0;
+		break;
+	case 18:
+		if (getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] == 1) {
+			if (getCharacterParams(kCharacterCond2, 8)[1]) {
+				startCycOtis(kCharacterCond2, "627B");
+			} else {
+				startCycOtis(kCharacterCond2, "627E");
+			}
 
-		getCharacter(kCharacterCond2).currentCall--;
-		_engine->getMessageManager()->setMessageHandle(kCharacterCond2, _functionsCond2[getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall]]);
-		fedEx(kCharacterCond2, kCharacterCond2, 18, 0);
+			getCharacterParams(kCharacterCond2, 8)[0] = 0;
+
+			getCharacter(kCharacterCond2).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterCond2, _functionsCond2[getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall]]);
+			fedEx(kCharacterCond2, kCharacterCond2, 18, 0);
+		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1062,22 +1215,27 @@ void LogicManager::CONS_Cond2_MakeBed(CONS_PARAMS) {
 void LogicManager::HAND_Cond2_MakeBed(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
+	{
+		bool skip = false; // Horrible way to unroll a goto...
+
 		if (!getCharacterCurrentParams(kCharacterCond2)[10]) {
 			getCharacterCurrentParams(kCharacterCond2)[10] = _gameTime + 300;
-			if (_gameTime == -300)
-				goto LABEL_7;
+			if (_gameTime == -300) {
+				skip = true;
+				playDialog(0, "ZFX1004", getVolume(kCharacterCond2), 0);
+			}
 		}
 
-		if (getCharacterCurrentParams(kCharacterCond2)[10] < _gameTime) {
+		if (!skip && getCharacterCurrentParams(kCharacterCond2)[10] < _gameTime) {
 			getCharacterCurrentParams(kCharacterCond2)[10] = 0x7FFFFFFF;
-		LABEL_7:
 			playDialog(0, "ZFX1004", getVolume(kCharacterCond2), 0);
 		}
 
 		if (getCharacterCurrentParams(kCharacterCond2)[11] ||
 			(getCharacterCurrentParams(kCharacterCond2)[11] = _gameTime + 900, _gameTime != -900)) {
 			if (getCharacterCurrentParams(kCharacterCond2)[11] >= _gameTime)
-				return;
+				break;
+
 			getCharacterCurrentParams(kCharacterCond2)[11] = 0x7FFFFFFF;
 		}
 
@@ -1093,6 +1251,7 @@ void LogicManager::HAND_Cond2_MakeBed(HAND_PARAMS) {
 		_engine->getMessageManager()->setMessageHandle(kCharacterCond2, _functionsCond2[getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall]]);
 		fedEx(kCharacterCond2, kCharacterCond2, 18, 0);
 		break;
+	}
 	case 8:
 	case 9:
 		setDoor(getCharacterCurrentParams(kCharacterCond2)[0], 4, 1, 0, 0);
@@ -1108,7 +1267,7 @@ void LogicManager::HAND_Cond2_MakeBed(HAND_PARAMS) {
 			Cond2Call(&LogicManager::CONS_Cond2_DoDialog, "LIB013", 0, 0, 0);
 		}
 
-		return;
+		break;
 	case 12:
 		getCharacterCurrentParams(kCharacterCond2)[2] = _gameObjects[getCharacterCurrentParams(kCharacterCond2)[0]].character;
 		getCharacterCurrentParams(kCharacterCond2)[3] = _gameObjects[getCharacterCurrentParams(kCharacterCond2)[0]].door;
@@ -1125,7 +1284,8 @@ void LogicManager::HAND_Cond2_MakeBed(HAND_PARAMS) {
 
 		if (getCharacterCurrentParams(kCharacterCond2)[3] != 2)
 			setDoor(getCharacterCurrentParams(kCharacterCond2)[0], 4, 1, 10, 9);
-		return;
+
+		break;
 	case 18:
 		switch (getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8]) {
 		case 1:
@@ -1149,11 +1309,12 @@ void LogicManager::HAND_Cond2_MakeBed(HAND_PARAMS) {
 
 			break;
 		default:
-			return;
+			break;
 		}
-		return;
+
+		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -1168,88 +1329,96 @@ void LogicManager::CONS_Cond2_MakeBedIvo(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Cond2_MakeBedIvo(HAND_PARAMS) {
-	if (msg->action > 12) {
-		switch (msg->action) {
-		case 18:
-			switch (getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8]) {
-			case 1:
-				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 2;
-				Cond2Call(&LogicManager::CONS_Cond2_DoCorrOtis, "627Vh", 39, 0, 0);
-				break;
-			case 2:
-				send(kCharacterCond2, kCharacterIvo, 221683008, 0);
-				startCycOtis(kCharacterCond2, "627Wh");
-				softBlockAtDoor(kCharacterCond2, 39);
-				break;
-			case 3:
-				softReleaseAtDoor(kCharacterCond2, 39);
-				getCharacter(kCharacterCond2).characterPosition.location = 1;
-				endGraphics(kCharacterCond2);
-				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 4;
-				Cond2Call(&LogicManager::CONS_Cond2_MakeBed, 39, 0, 0, 0);
-				break;
-			case 4:
-				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 5;
-				Cond2Call(&LogicManager::CONS_Cond2_DoCorrOtis, "697Ah", 39, 0, 0);
-				break;
-			case 5:
-				getCharacter(kCharacterCond2).characterPosition.location = 0;
-
-				getCharacter(kCharacterCond2).currentCall--;
-				_engine->getMessageManager()->setMessageHandle(kCharacterCond2, _functionsCond2[getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall]]);
-				fedEx(kCharacterCond2, kCharacterCond2, 18, 0);
-				break;
-			case 6:
-				send(kCharacterCond2, kCharacterIvo, 122865568, 0);
-				break;
-			case 7:
-				softReleaseAtDoor(kCharacterCond2, 39);
-				setDoor(39, 0, 2, 255, 255);
-				getCharacter(kCharacterCond2).characterPosition.location = 1;
-				endGraphics(kCharacterCond2);
-				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 8;
-				Cond2Call(&LogicManager::CONS_Cond2_MakeBed, 39, 0, 0, 0);
-				break;
-			case 8:
-				playDialog(kCharacterCond2, "JAC1013A", -1, 0);
-				setDoor(39, 0, 1, 255, 255);
-				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 9;
-				Cond2Call(&LogicManager::CONS_Cond2_DoCorrOtis, "667Uh", 39, 0, 0);
-				break;
-			case 9:
-				getCharacter(kCharacterCond2).characterPosition.location = 0;
-				send(kCharacterCond2, kCharacterIvo, 123852928, 0);
+	switch (msg->action) {
+	case 0:
+		if (!getCharacterCurrentParams(kCharacterCond2)[0]) {
+			if (getCharacterCurrentParams(kCharacterCond2)[1] ||
+				(getCharacterCurrentParams(kCharacterCond2)[1] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
+				if (getCharacterCurrentParams(kCharacterCond2)[1] >= _currentGameSessionTicks)
+					break;
 
-				getCharacter(kCharacterCond2).currentCall--;
-				_engine->getMessageManager()->setMessageHandle(kCharacterCond2, _functionsCond2[getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall]]);
-				fedEx(kCharacterCond2, kCharacterCond2, 18, 0);
-				break;
-			default:
-				return;
+				getCharacterCurrentParams(kCharacterCond2)[1] = 0x7FFFFFFF;
 			}
-			break;
-		case 88652208:
-			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 7;
-			Cond2Call(&LogicManager::CONS_Cond2_DoCorrOtis, "667Th", 39, 0, 0);
-			break;
-		case 123199584:
-			getCharacterCurrentParams(kCharacterCond2)[0] = 1;
-			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 6;
-			Cond2Call(&LogicManager::CONS_Cond2_DoDialog, "JAC1012", 0, 0, 0);
-			break;
+
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 3;
+			Cond2Call(&LogicManager::CONS_Cond2_DoCorrOtis, "627Zh", 39, 0, 0);
 		}
-	} else if (msg->action == 12) {
+
+		break;
+	case 12:
 		getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 1;
 		Cond2Call(&LogicManager::CONS_Cond2_DoWalk, 4, 2740, 0, 0);
-	} else if (msg->action == 0 && !getCharacterCurrentParams(kCharacterCond2)[0]) {
-		if (getCharacterCurrentParams(kCharacterCond2)[1] ||
-			(getCharacterCurrentParams(kCharacterCond2)[1] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
-			if (getCharacterCurrentParams(kCharacterCond2)[1] >= _currentGameSessionTicks)
-				return;
-			getCharacterCurrentParams(kCharacterCond2)[1] = 0x7FFFFFFF;
+		break;
+	case 18:
+		switch (getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8]) {
+		case 1:
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 2;
+			Cond2Call(&LogicManager::CONS_Cond2_DoCorrOtis, "627Vh", 39, 0, 0);
+			break;
+		case 2:
+			send(kCharacterCond2, kCharacterIvo, 221683008, 0);
+			startCycOtis(kCharacterCond2, "627Wh");
+			softBlockAtDoor(kCharacterCond2, 39);
+			break;
+		case 3:
+			softReleaseAtDoor(kCharacterCond2, 39);
+			getCharacter(kCharacterCond2).characterPosition.location = 1;
+			endGraphics(kCharacterCond2);
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 4;
+			Cond2Call(&LogicManager::CONS_Cond2_MakeBed, 39, 0, 0, 0);
+			break;
+		case 4:
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 5;
+			Cond2Call(&LogicManager::CONS_Cond2_DoCorrOtis, "697Ah", 39, 0, 0);
+			break;
+		case 5:
+			getCharacter(kCharacterCond2).characterPosition.location = 0;
+
+			getCharacter(kCharacterCond2).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterCond2, _functionsCond2[getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall]]);
+			fedEx(kCharacterCond2, kCharacterCond2, 18, 0);
+			break;
+		case 6:
+			send(kCharacterCond2, kCharacterIvo, 122865568, 0);
+			break;
+		case 7:
+			softReleaseAtDoor(kCharacterCond2, 39);
+			setDoor(39, 0, 2, 255, 255);
+			getCharacter(kCharacterCond2).characterPosition.location = 1;
+			endGraphics(kCharacterCond2);
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 8;
+			Cond2Call(&LogicManager::CONS_Cond2_MakeBed, 39, 0, 0, 0);
+			break;
+		case 8:
+			playDialog(kCharacterCond2, "JAC1013A", -1, 0);
+			setDoor(39, 0, 1, 255, 255);
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 9;
+			Cond2Call(&LogicManager::CONS_Cond2_DoCorrOtis, "667Uh", 39, 0, 0);
+			break;
+		case 9:
+			getCharacter(kCharacterCond2).characterPosition.location = 0;
+			send(kCharacterCond2, kCharacterIvo, 123852928, 0);
+
+			getCharacter(kCharacterCond2).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterCond2, _functionsCond2[getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall]]);
+			fedEx(kCharacterCond2, kCharacterCond2, 18, 0);
+			break;
+		default:
+			break;
 		}
-		getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 3;
-		Cond2Call(&LogicManager::CONS_Cond2_DoCorrOtis, "627Zh", 39, 0, 0);
+
+		break;
+	case 88652208:
+		getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 7;
+		Cond2Call(&LogicManager::CONS_Cond2_DoCorrOtis, "667Th", 39, 0, 0);
+		break;
+	case 123199584:
+		getCharacterCurrentParams(kCharacterCond2)[0] = 1;
+		getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 6;
+		Cond2Call(&LogicManager::CONS_Cond2_DoDialog, "JAC1012", 0, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1264,90 +1433,96 @@ void LogicManager::CONS_Cond2_MakeBedMilos(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Cond2_MakeBedMilos(HAND_PARAMS) {
-	if (msg->action > 12) {
-		switch (msg->action) {
-		case 18:
-			switch (getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8]) {
-			case 1:
-				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 2;
-				Cond2Call(&LogicManager::CONS_Cond2_DoCorrOtis, "627Mg", 38, 0, 0);
-				break;
-			case 2:
-				send(kCharacterCond2, kCharacterMilos, 221683008, 0);
-				startCycOtis(kCharacterCond2, "627Ng");
-				softBlockAtDoor(kCharacterCond2, 38);
-				break;
-			case 3:
-				softReleaseAtDoor(kCharacterCond2, 38);
-				getCharacter(kCharacterCond2).characterPosition.location = 1;
-				endGraphics(kCharacterCond2);
-				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 4;
-				Cond2Call(&LogicManager::CONS_Cond2_MakeBed, 38, 0, 0, 0);
-				break;
-			case 4:
-				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 5;
-				Cond2Call(&LogicManager::CONS_Cond2_DoCorrOtis, "627Sg", 38, 0, 0);
-				break;
-			case 5:
-				getCharacter(kCharacterCond2).characterPosition.location = 0;
-
-				getCharacter(kCharacterCond2).currentCall--;
-				_engine->getMessageManager()->setMessageHandle(kCharacterCond2, _functionsCond2[getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall]]);
-				fedEx(kCharacterCond2, kCharacterCond2, 18, 0);
-				break;
-			case 6:
-				send(kCharacterCond2, kCharacterMilos, 122865568, 0);
-				break;
-			case 7:
-				softReleaseAtDoor(kCharacterCond2, 38);
-				setDoor(38, 0, 2, 255, 255);
-				getCharacter(kCharacterCond2).characterPosition.location = 1;
-				endGraphics(kCharacterCond2);
-				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 8;
-				Cond2Call(&LogicManager::CONS_Cond2_MakeBed, 38, 0, 0, 0);
-				break;
-			case 8:
-				playDialog(kCharacterCond2, "JAC1030A", -1, 0);
-				setDoor(38, 0, 1, 255, 255);
-				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 9;
-				Cond2Call(&LogicManager::CONS_Cond2_DoCorrOtis, "627Ug", 38, 0, 0);
-				break;
-			case 9:
-				getCharacter(kCharacterCond2).characterPosition.location = 0;
-				send(kCharacterCond2, kCharacterMilos, 123852928, 0);
+	switch (msg->action) {
+	case 0:
+		if (!getCharacterCurrentParams(kCharacterCond2)[0]) {
+			if (getCharacterCurrentParams(kCharacterCond2)[1] ||
+				(getCharacterCurrentParams(kCharacterCond2)[1] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
+				if (getCharacterCurrentParams(kCharacterCond2)[1] >= _currentGameSessionTicks)
+					break;
 
-				getCharacter(kCharacterCond2).currentCall--;
-				_engine->getMessageManager()->setMessageHandle(kCharacterCond2, _functionsCond2[getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall]]);
-				fedEx(kCharacterCond2, kCharacterCond2, 18, 0);
-				break;
-			default:
-				return;
+				getCharacterCurrentParams(kCharacterCond2)[1] = 0x7FFFFFFF;
 			}
-			break;
-		case 88652208:
-			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 7;
-			Cond2Call(&LogicManager::CONS_Cond2_DoCorrOtis, "627Tg", 38, 0, 0);
-			break;
-		case 123199584:
-			getCharacterCurrentParams(kCharacterCond2)[0] = 1;
-			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 6;
-			Cond2Call(&LogicManager::CONS_Cond2_DoDialog, "JAC1030", 0, 0, 0);
-			break;
+
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 3;
+			Cond2Call(&LogicManager::CONS_Cond2_DoCorrOtis, "627Rg", 38, 0, 0);
 		}
-	} else if (msg->action == 12) {
+
+		break;
+	case 12:
 		getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 1;
 		Cond2Call(&LogicManager::CONS_Cond2_DoWalk, 4, 3050, 0, 0);
-	} else if (msg->action == 0 && !getCharacterCurrentParams(kCharacterCond2)[0]) {
-		if (getCharacterCurrentParams(kCharacterCond2)[1] ||
-			(getCharacterCurrentParams(kCharacterCond2)[1] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
-			if (getCharacterCurrentParams(kCharacterCond2)[1] >= _currentGameSessionTicks)
-				return;
+		break;
+	case 18:
+		switch (getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8]) {
+		case 1:
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 2;
+			Cond2Call(&LogicManager::CONS_Cond2_DoCorrOtis, "627Mg", 38, 0, 0);
+			break;
+		case 2:
+			send(kCharacterCond2, kCharacterMilos, 221683008, 0);
+			startCycOtis(kCharacterCond2, "627Ng");
+			softBlockAtDoor(kCharacterCond2, 38);
+			break;
+		case 3:
+			softReleaseAtDoor(kCharacterCond2, 38);
+			getCharacter(kCharacterCond2).characterPosition.location = 1;
+			endGraphics(kCharacterCond2);
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 4;
+			Cond2Call(&LogicManager::CONS_Cond2_MakeBed, 38, 0, 0, 0);
+			break;
+		case 4:
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 5;
+			Cond2Call(&LogicManager::CONS_Cond2_DoCorrOtis, "627Sg", 38, 0, 0);
+			break;
+		case 5:
+			getCharacter(kCharacterCond2).characterPosition.location = 0;
 
-			getCharacterCurrentParams(kCharacterCond2)[1] = 0x7FFFFFFF;
+			getCharacter(kCharacterCond2).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterCond2, _functionsCond2[getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall]]);
+			fedEx(kCharacterCond2, kCharacterCond2, 18, 0);
+			break;
+		case 6:
+			send(kCharacterCond2, kCharacterMilos, 122865568, 0);
+			break;
+		case 7:
+			softReleaseAtDoor(kCharacterCond2, 38);
+			setDoor(38, 0, 2, 255, 255);
+			getCharacter(kCharacterCond2).characterPosition.location = 1;
+			endGraphics(kCharacterCond2);
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 8;
+			Cond2Call(&LogicManager::CONS_Cond2_MakeBed, 38, 0, 0, 0);
+			break;
+		case 8:
+			playDialog(kCharacterCond2, "JAC1030A", -1, 0);
+			setDoor(38, 0, 1, 255, 255);
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 9;
+			Cond2Call(&LogicManager::CONS_Cond2_DoCorrOtis, "627Ug", 38, 0, 0);
+			break;
+		case 9:
+			getCharacter(kCharacterCond2).characterPosition.location = 0;
+			send(kCharacterCond2, kCharacterMilos, 123852928, 0);
+
+			getCharacter(kCharacterCond2).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterCond2, _functionsCond2[getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall]]);
+			fedEx(kCharacterCond2, kCharacterCond2, 18, 0);
+			break;
+		default:
+			break;
 		}
 
-		getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 3;
-		Cond2Call(&LogicManager::CONS_Cond2_DoCorrOtis, "627Rg", 38, 0, 0);
+		break;
+	case 88652208:
+		getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 7;
+		Cond2Call(&LogicManager::CONS_Cond2_DoCorrOtis, "627Tg", 38, 0, 0);
+		break;
+	case 123199584:
+		getCharacterCurrentParams(kCharacterCond2)[0] = 1;
+		getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 6;
+		Cond2Call(&LogicManager::CONS_Cond2_DoDialog, "JAC1030", 0, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1362,10 +1537,12 @@ void LogicManager::CONS_Cond2_TryMakeAnna(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Cond2_TryMakeAnna(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 1;
 		Cond2Call(&LogicManager::CONS_Cond2_DoWalk, 4, 4070, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8]) {
 		case 1:
 			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 2;
@@ -1385,7 +1562,13 @@ void LogicManager::HAND_Cond2_TryMakeAnna(HAND_PARAMS) {
 			_engine->getMessageManager()->setMessageHandle(kCharacterCond2, _functionsCond2[getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall]]);
 			fedEx(kCharacterCond2, kCharacterCond2, 18, 0);
 			break;
+		default:
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1400,10 +1583,12 @@ void LogicManager::CONS_Cond2_MakeBedAnna(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Cond2_MakeBedAnna(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 1;
 		Cond2Call(&LogicManager::CONS_Cond2_DoWalk, 4, 4070, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8]) {
 		case 1:
 			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 2;
@@ -1438,8 +1623,12 @@ void LogicManager::HAND_Cond2_MakeBedAnna(HAND_PARAMS) {
 			fedEx(kCharacterCond2, kCharacterCond2, 18, 0);
 			break;
 		default:
-			return;
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1454,10 +1643,12 @@ void LogicManager::CONS_Cond2_MakeBedRebecca(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Cond2_MakeBedRebecca(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 1;
 		Cond2Call(&LogicManager::CONS_Cond2_DoWalk, 4, 4840, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8]) {
 		case 1:
 			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 2;
@@ -1498,8 +1689,12 @@ void LogicManager::HAND_Cond2_MakeBedRebecca(HAND_PARAMS) {
 			fedEx(kCharacterCond2, kCharacterCond2, 18, 0);
 			break;
 		default:
-			return;
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1514,181 +1709,195 @@ void LogicManager::CONS_Cond2_MakeBedMadame(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Cond2_MakeBedMadame(HAND_PARAMS) {
-	if (msg->action > 12) {
-		switch (msg->action) {
-		case 18:
-			switch (getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8]) {
-			case 1:
-				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 2;
-				Cond2Call(&LogicManager::CONS_Cond2_DoCorrOtis, "627Vd", 0x23, 0, 0);
-				break;
-			case 2:
-				send(kCharacterCond2, kCharacterMadame, 221683008, 0);
-				startCycOtis(kCharacterCond2, "627Wd");
-				softBlockAtDoor(kCharacterCond2, 35);
-				break;
-			case 3:
-				softReleaseAtDoor(kCharacterCond2, 35);
-				getCharacter(kCharacterCond2).characterPosition.location = 1;
-				endGraphics(kCharacterCond2);
-				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 4;
-				Cond2Call(&LogicManager::CONS_Cond2_MakeBed, 35, 51, 0, 0);
-				break;
-			case 4:
-				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 5;
-				Cond2Call(&LogicManager::CONS_Cond2_DoCorrOtis, "697Ad", 35, 0, 0);
-				break;
-			case 5:
-				getCharacter(kCharacterCond2).characterPosition.location = 0;
-
-				getCharacter(kCharacterCond2).currentCall--;
-				_engine->getMessageManager()->setMessageHandle(kCharacterCond2, _functionsCond2[getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall]]);
-				fedEx(kCharacterCond2, kCharacterCond2, 18, 0);
-				break;
-			case 6:
-				send(kCharacterCond2, kCharacterMadame, 122865568, 0);
-				break;
-			case 7:
-				softReleaseAtDoor(kCharacterCond2, 35);
-				getCharacter(kCharacterCond2).characterPosition.location = 1;
-				endGraphics(kCharacterCond2);
-				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 8;
-				Cond2Call(&LogicManager::CONS_Cond2_MakeBed, 35, 51, 0, 0);
-				break;
-			case 8:
-				playDialog(kCharacterCond2, "JAC1013", -1, 0);
-				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 9;
-				Cond2Call(&LogicManager::CONS_Cond2_DoCorrOtis, "697Ad", 35, 0, 0);
-				break;
-			case 9:
-				getCharacter(kCharacterCond2).characterPosition.location = 0;
-				send(kCharacterCond2, kCharacterMadame, 123852928, 0);
+	switch (msg->action) {
+	case 0:
+		if (!getCharacterCurrentParams(kCharacterCond2)[0]) {
+			if (getCharacterCurrentParams(kCharacterCond2)[1] ||
+				(getCharacterCurrentParams(kCharacterCond2)[1] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
+				if (getCharacterCurrentParams(kCharacterCond2)[1] >= _currentGameSessionTicks)
+					break;
 
-				getCharacter(kCharacterCond2).currentCall--;
-				_engine->getMessageManager()->setMessageHandle(kCharacterCond2, _functionsCond2[getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall]]);
-				fedEx(kCharacterCond2, kCharacterCond2, 18, 0);
-				break;
-			default:
-				return;
+				getCharacterCurrentParams(kCharacterCond2)[1] = 0x7FFFFFFF;
 			}
-			break;
-		case 88652208:
-			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 7;
+
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 3;
 			Cond2Call(&LogicManager::CONS_Cond2_DoEnterCorrOtis, "627Zd", 35, 5790, 6130);
-			break;
-		case 123199584:
-			getCharacterCurrentParams(kCharacterCond2)[0] = 1;
-			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 6;
-			Cond2Call(&LogicManager::CONS_Cond2_DoDialog, "JAC1012", 0, 0, 0);
-			break;
 		}
-	} else if (msg->action == 12) {
+
+		break;
+	case 12:
 		getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 1;
 		Cond2Call(&LogicManager::CONS_Cond2_DoWalk, 4, 5790, 0, 0);
-	} else if (msg->action == 0 && !getCharacterCurrentParams(kCharacterCond2)[0]) {
-		if (getCharacterCurrentParams(kCharacterCond2)[1] ||
-			(getCharacterCurrentParams(kCharacterCond2)[1] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
-			if (getCharacterCurrentParams(kCharacterCond2)[1] >= _currentGameSessionTicks)
-				return;
-			getCharacterCurrentParams(kCharacterCond2)[1] = 0x7FFFFFFF;
-		}
-		getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 3;
-		Cond2Call(&LogicManager::CONS_Cond2_DoEnterCorrOtis, "627Zd", 35, 5790, 6130);
-	}
-}
-
-void LogicManager::CONS_Cond2_MakeBedMonsieur(CONS_PARAMS) {
-	CharacterCallParams *params = &getCharacter(kCharacterCond2).callParams[getCharacter(kCharacterCond2).currentCall];
-	_engine->getMessageManager()->setMessageHandle(kCharacterCond2, &LogicManager::HAND_Cond2_MakeBedMonsieur);
-	getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall] = 27;
-
-	params->clear();
-
-	fedEx(kCharacterCond2, kCharacterCond2, 12, 0);
-}
-
-void LogicManager::HAND_Cond2_MakeBedMonsieur(HAND_PARAMS) {
-	if (msg->action > 12) {
-		switch (msg->action) {
-		case 18:
-			switch (getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8]) {
-			case 1:
-				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 2;
-				Cond2Call(&LogicManager::CONS_Cond2_DoCorrOtis, "627Mc", 34, 0, 0);
-				break;
-			case 2:
-				send(kCharacterCond2, kCharacterMonsieur, 221683008, 0);
-				startCycOtis(kCharacterCond2, "627Nc");
-				softBlockAtDoor(kCharacterCond2, 34);
-				break;
-			case 3:
-				softReleaseAtDoor(kCharacterCond2, 34);
-				getCharacter(kCharacterCond2).characterPosition.location = 1;
-				endGraphics(kCharacterCond2);
-				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 4;
-				Cond2Call(&LogicManager::CONS_Cond2_MakeBed, 34, 50, 0, 0);
-				break;
-			case 4:
-				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 5;
-				Cond2Call(&LogicManager::CONS_Cond2_DoCorrOtis, "627Sc", 34, 0, 0);
-				break;
-			case 5:
-				getCharacter(kCharacterCond2).characterPosition.location = 0;
-				getCharacter(kCharacterCond2).currentCall--;
-				_engine->getMessageManager()->setMessageHandle(kCharacterCond2, _functionsCond2[getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall]]);
-				fedEx(kCharacterCond2, kCharacterCond2, 18, 0);
-				break;
-			case 6:
-				send(kCharacterCond2, kCharacterMonsieur, 122865568, 0);
-				break;
-			case 7:
-				softReleaseAtDoor(kCharacterCond2, 34);
-				getCharacter(kCharacterCond2).characterPosition.location = 1;
-				endGraphics(kCharacterCond2);
-				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 8;
-				Cond2Call(&LogicManager::CONS_Cond2_MakeBed, 34, 50, 0, 0);
-				break;
-			case 8:
-				playDialog(kCharacterCond2, "JAC1013", -1, 0);
-				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 9;
-				Cond2Call(&LogicManager::CONS_Cond2_DoCorrOtis, "627Uc", 34, 0, 0);
-				break;
-			case 9:
-				getCharacter(kCharacterCond2).characterPosition.location = 0;
-				send(kCharacterCond2, kCharacterMonsieur, 123852928, 0);
-
-				getCharacter(kCharacterCond2).currentCall--;
-				_engine->getMessageManager()->setMessageHandle(kCharacterCond2, _functionsCond2[getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall]]);
-				fedEx(kCharacterCond2, kCharacterCond2, 18, 0);
-				break;
-			default:
-				return;
-			}
-			break;
-		case 88652208:
-			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 7;
-			Cond2Call(&LogicManager::CONS_Cond2_DoEnterCorrOtis, "627Rc", 34, 6470, 6130);
+		break;
+	case 18:
+		switch (getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8]) {
+		case 1:
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 2;
+			Cond2Call(&LogicManager::CONS_Cond2_DoCorrOtis, "627Vd", 0x23, 0, 0);
 			break;
-		case 123199584:
-			getCharacterCurrentParams(kCharacterCond2)[0] = 1;
-			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 6;
-			Cond2Call(&LogicManager::CONS_Cond2_DoDialog, "JAC1012", 0, 0, 0);
+		case 2:
+			send(kCharacterCond2, kCharacterMadame, 221683008, 0);
+			startCycOtis(kCharacterCond2, "627Wd");
+			softBlockAtDoor(kCharacterCond2, 35);
+			break;
+		case 3:
+			softReleaseAtDoor(kCharacterCond2, 35);
+			getCharacter(kCharacterCond2).characterPosition.location = 1;
+			endGraphics(kCharacterCond2);
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 4;
+			Cond2Call(&LogicManager::CONS_Cond2_MakeBed, 35, 51, 0, 0);
+			break;
+		case 4:
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 5;
+			Cond2Call(&LogicManager::CONS_Cond2_DoCorrOtis, "697Ad", 35, 0, 0);
+			break;
+		case 5:
+			getCharacter(kCharacterCond2).characterPosition.location = 0;
+
+			getCharacter(kCharacterCond2).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterCond2, _functionsCond2[getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall]]);
+			fedEx(kCharacterCond2, kCharacterCond2, 18, 0);
+			break;
+		case 6:
+			send(kCharacterCond2, kCharacterMadame, 122865568, 0);
+			break;
+		case 7:
+			softReleaseAtDoor(kCharacterCond2, 35);
+			getCharacter(kCharacterCond2).characterPosition.location = 1;
+			endGraphics(kCharacterCond2);
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 8;
+			Cond2Call(&LogicManager::CONS_Cond2_MakeBed, 35, 51, 0, 0);
+			break;
+		case 8:
+			playDialog(kCharacterCond2, "JAC1013", -1, 0);
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 9;
+			Cond2Call(&LogicManager::CONS_Cond2_DoCorrOtis, "697Ad", 35, 0, 0);
+			break;
+		case 9:
+			getCharacter(kCharacterCond2).characterPosition.location = 0;
+			send(kCharacterCond2, kCharacterMadame, 123852928, 0);
+
+			getCharacter(kCharacterCond2).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterCond2, _functionsCond2[getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall]]);
+			fedEx(kCharacterCond2, kCharacterCond2, 18, 0);
+			break;
+		default:
 			break;
 		}
-	} else if (msg->action == 12) {
+
+		break;
+	case 88652208:
+		getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 7;
+		Cond2Call(&LogicManager::CONS_Cond2_DoEnterCorrOtis, "627Zd", 35, 5790, 6130);
+		break;
+	case 123199584:
+		getCharacterCurrentParams(kCharacterCond2)[0] = 1;
+		getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 6;
+		Cond2Call(&LogicManager::CONS_Cond2_DoDialog, "JAC1012", 0, 0, 0);
+		break;
+	default:
+		break;
+	}
+}
+
+void LogicManager::CONS_Cond2_MakeBedMonsieur(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterCond2).callParams[getCharacter(kCharacterCond2).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterCond2, &LogicManager::HAND_Cond2_MakeBedMonsieur);
+	getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall] = 27;
+
+	params->clear();
+
+	fedEx(kCharacterCond2, kCharacterCond2, 12, 0);
+}
+
+void LogicManager::HAND_Cond2_MakeBedMonsieur(HAND_PARAMS) {
+	switch (msg->action) {
+	case 0:
+		if (!getCharacterCurrentParams(kCharacterCond2)[0]) {
+			if (getCharacterCurrentParams(kCharacterCond2)[1] ||
+				(getCharacterCurrentParams(kCharacterCond2)[1] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
+				if (getCharacterCurrentParams(kCharacterCond2)[1] >= _currentGameSessionTicks)
+					break;
+
+				getCharacterCurrentParams(kCharacterCond2)[1] = 0x7FFFFFFF;
+			}
+
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 3;
+			Cond2Call(&LogicManager::CONS_Cond2_DoEnterCorrOtis, "627Rc", 34, 6470, 6130);
+		}
+
+		break;
+	case 12:
 		getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 1;
 		Cond2Call(&LogicManager::CONS_Cond2_DoWalk, 4, 6470, 0, 0);
-	} else if (msg->action == 0 && !getCharacterCurrentParams(kCharacterCond2)[0]) {
-		if (getCharacterCurrentParams(kCharacterCond2)[1] ||
-			(getCharacterCurrentParams(kCharacterCond2)[1] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
-			if (getCharacterCurrentParams(kCharacterCond2)[1] >= _currentGameSessionTicks)
-				return;
+		break;
+	case 18:
+		switch (getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8]) {
+		case 1:
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 2;
+			Cond2Call(&LogicManager::CONS_Cond2_DoCorrOtis, "627Mc", 34, 0, 0);
+			break;
+		case 2:
+			send(kCharacterCond2, kCharacterMonsieur, 221683008, 0);
+			startCycOtis(kCharacterCond2, "627Nc");
+			softBlockAtDoor(kCharacterCond2, 34);
+			break;
+		case 3:
+			softReleaseAtDoor(kCharacterCond2, 34);
+			getCharacter(kCharacterCond2).characterPosition.location = 1;
+			endGraphics(kCharacterCond2);
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 4;
+			Cond2Call(&LogicManager::CONS_Cond2_MakeBed, 34, 50, 0, 0);
+			break;
+		case 4:
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 5;
+			Cond2Call(&LogicManager::CONS_Cond2_DoCorrOtis, "627Sc", 34, 0, 0);
+			break;
+		case 5:
+			getCharacter(kCharacterCond2).characterPosition.location = 0;
+			getCharacter(kCharacterCond2).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterCond2, _functionsCond2[getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall]]);
+			fedEx(kCharacterCond2, kCharacterCond2, 18, 0);
+			break;
+		case 6:
+			send(kCharacterCond2, kCharacterMonsieur, 122865568, 0);
+			break;
+		case 7:
+			softReleaseAtDoor(kCharacterCond2, 34);
+			getCharacter(kCharacterCond2).characterPosition.location = 1;
+			endGraphics(kCharacterCond2);
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 8;
+			Cond2Call(&LogicManager::CONS_Cond2_MakeBed, 34, 50, 0, 0);
+			break;
+		case 8:
+			playDialog(kCharacterCond2, "JAC1013", -1, 0);
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 9;
+			Cond2Call(&LogicManager::CONS_Cond2_DoCorrOtis, "627Uc", 34, 0, 0);
+			break;
+		case 9:
+			getCharacter(kCharacterCond2).characterPosition.location = 0;
+			send(kCharacterCond2, kCharacterMonsieur, 123852928, 0);
 
-			getCharacterCurrentParams(kCharacterCond2)[1] = 0x7FFFFFFF;
+			getCharacter(kCharacterCond2).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterCond2, _functionsCond2[getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall]]);
+			fedEx(kCharacterCond2, kCharacterCond2, 18, 0);
+			break;
+		default:
+			break;
 		}
 
-		getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 3;
+		break;
+	case 88652208:
+		getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 7;
 		Cond2Call(&LogicManager::CONS_Cond2_DoEnterCorrOtis, "627Rc", 34, 6470, 6130);
+		break;
+	case 123199584:
+		getCharacterCurrentParams(kCharacterCond2)[0] = 1;
+		getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 6;
+		Cond2Call(&LogicManager::CONS_Cond2_DoDialog, "JAC1012", 0, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1703,10 +1912,12 @@ void LogicManager::CONS_Cond2_MakeBedTatiana(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Cond2_MakeBedTatiana(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 1;
-		Cond2Call(&LogicManager::CONS_Cond2_DoWalk, 4, 0x1D4C, 0, 0);
-	} else if (msg->action == 18) {
+		Cond2Call(&LogicManager::CONS_Cond2_DoWalk, 4, 7500, 0, 0);
+		break;
+	case 18:
 		switch (getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8]) {
 		case 1:
 			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 2;
@@ -1716,7 +1927,7 @@ void LogicManager::HAND_Cond2_MakeBedTatiana(HAND_PARAMS) {
 			startCycOtis(kCharacterCond2, "627Wb");
 			softBlockAtDoor(kCharacterCond2, 33);
 			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 3;
-			Cond2Call(&LogicManager::CONS_Cond2_DoWait, 0x96, 0, 0, 0);
+			Cond2Call(&LogicManager::CONS_Cond2_DoWait, 150, 0, 0, 0);
 			break;
 		case 3:
 			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 4;
@@ -1741,8 +1952,12 @@ void LogicManager::HAND_Cond2_MakeBedTatiana(HAND_PARAMS) {
 			fedEx(kCharacterCond2, kCharacterCond2, 18, 0);
 			break;
 		default:
-			return;
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1757,10 +1972,12 @@ void LogicManager::CONS_Cond2_MakeBedVassili(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Cond2_MakeBedVassili(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 1;
 		Cond2Call(&LogicManager::CONS_Cond2_DoWalk, 4, 8200, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8]) {
 		case 1:
 			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 2;
@@ -1795,8 +2012,12 @@ void LogicManager::HAND_Cond2_MakeBedVassili(HAND_PARAMS) {
 			fedEx(kCharacterCond2, kCharacterCond2, 18, 0);
 			break;
 		default:
-			return;
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1813,7 +2034,8 @@ void LogicManager::CONS_Cond2_CathBuzzing(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Cond2_CathBuzzing(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		switch (getCharacterCurrentParams(kCharacterCond2)[0]) {
 		case 32:
 			getCharacterCurrentParams(kCharacterCond2)[1] = 8200;
@@ -1879,7 +2101,9 @@ void LogicManager::HAND_Cond2_CathBuzzing(HAND_PARAMS) {
 			fedEx(kCharacterCond2, kCharacterCond2, 18, 0);
 			break;
 		}
-	} else if (msg->action == 18) {
+
+		break;
+	case 18:
 		switch (getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8]) {
 		case 1:
 			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 2;
@@ -1892,6 +2116,7 @@ void LogicManager::HAND_Cond2_CathBuzzing(HAND_PARAMS) {
 				setDoor(getCharacterCurrentParams(kCharacterCond2)[0], 0, checkDoor(getCharacterCurrentParams(kCharacterCond2)[0]), 0, 0);
 				getCharacterCurrentParams(kCharacterCond2)[4] = 1;
 			}
+
 			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 3;
 			Cond2Call(&LogicManager::CONS_Cond2_DoCorrOtis, (char *)&getCharacterCurrentParams(kCharacterCond2)[5], getCharacterCurrentParams(kCharacterCond2)[0], 0, 0);
 			break;
@@ -1911,6 +2136,7 @@ void LogicManager::HAND_Cond2_CathBuzzing(HAND_PARAMS) {
 			if (getCharacterCurrentParams(kCharacterCond2)[4]) {
 				setDoor(getCharacterCurrentParams(kCharacterCond2)[0], 0, checkDoor(getCharacterCurrentParams(kCharacterCond2)[0]), 10, 9);
 			}
+
 			softReleaseAtDoor(kCharacterCond2, getCharacterCurrentParams(kCharacterCond2)[0]);
 			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 5;
 			Cond2Call(&LogicManager::CONS_Cond2_DoWalk, 4, 0x7D0, 0, 0);
@@ -1925,8 +2151,12 @@ void LogicManager::HAND_Cond2_CathBuzzing(HAND_PARAMS) {
 			fedEx(kCharacterCond2, kCharacterCond2, 18, 0);
 			break;
 		default:
-			return;
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1966,6 +2196,9 @@ void LogicManager::HAND_Cond2_CathRattling(HAND_PARAMS) {
 			_engine->getMessageManager()->setMessageHandle(kCharacterCond2, _functionsCond2[getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall]]);
 			fedEx(kCharacterCond2, kCharacterCond2, 18, 0);
 		}
+
+		break;
+	default:
 		break;
 	}
 }
@@ -1981,10 +2214,12 @@ void LogicManager::CONS_Cond2_BathroomTrip(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Cond2_BathroomTrip(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 1;
 		Cond2Call(&LogicManager::CONS_Cond2_GetUp, 0, 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8]) {
 		case 1:
 			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 2;
@@ -2009,8 +2244,12 @@ void LogicManager::HAND_Cond2_BathroomTrip(HAND_PARAMS) {
 			fedEx(kCharacterCond2, kCharacterCond2, 18, 0);
 			break;
 		default:
-			return;
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -2025,7 +2264,8 @@ void LogicManager::CONS_Cond2_DoPending(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Cond2_DoPending(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		if (getCharacterParams(kCharacterCond2, 8)[5] || getCharacterParams(kCharacterCond2, 8)[6] || getCharacterParams(kCharacterCond2, 8)[2] || getCharacterParams(kCharacterCond2, 8)[4] || getCharacterParams(kCharacterCond2, 8)[3] || getCharacterParams(kCharacterCond2, 8)[17] || getCharacterParams(kCharacterCond2, 8)[9] || getCharacterParams(kCharacterCond2, 8)[14]) {
 			getCharacterParams(kCharacterCond2, 8)[21] = 1;
 			if (getCharacterParams(kCharacterCond2, 8)[2] || getCharacterParams(kCharacterCond2, 8)[4] || getCharacterParams(kCharacterCond2, 8)[3]) {
@@ -2040,31 +2280,36 @@ void LogicManager::HAND_Cond2_DoPending(HAND_PARAMS) {
 			_engine->getMessageManager()->setMessageHandle(kCharacterCond2, _functionsCond2[getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall]]);
 			fedEx(kCharacterCond2, kCharacterCond2, 18, 0);
 		}
-	} else if (msg->action == 18) {
+
+		break;
+	case 18:
 		switch (getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8]) {
 		case 1:
 			getCharacterParams(kCharacterCond2, 8)[16] = 1;
-			if (!getCharacterParams(kCharacterCond2, 8)[2])
-				goto LABEL_25;
-			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 2;
-			Cond2Call(&LogicManager::CONS_Cond2_Listen, 9, 0, 0, 0);
-			break;
+			if (getCharacterParams(kCharacterCond2, 8)[2]) {
+				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 2;
+				Cond2Call(&LogicManager::CONS_Cond2_Listen, 9, 0, 0, 0);
+				break;
+			}
+
+			// fall through
 		case 2:
-		LABEL_25:
-			if (!getCharacterParams(kCharacterCond2, 8)[4])
-				goto LABEL_27;
-			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 3;
-			Cond2Call(&LogicManager::CONS_Cond2_Listen, 3, 0, 0, 0);
-			break;
+			if (getCharacterParams(kCharacterCond2, 8)[4]) {
+				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 3;
+				Cond2Call(&LogicManager::CONS_Cond2_Listen, 3, 0, 0, 0);
+				break;
+			}
+
+			// fall through
 		case 3:
-		LABEL_27:
-			if (!getCharacterParams(kCharacterCond2, 8)[3])
-				goto LABEL_29;
-			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 4;
-			Cond2Call(&LogicManager::CONS_Cond2_Listen, 21, 0, 0, 0);
-			break;
+			if (getCharacterParams(kCharacterCond2, 8)[3]) {
+				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 4;
+				Cond2Call(&LogicManager::CONS_Cond2_Listen, 21, 0, 0, 0);
+				break;
+			}
+
+			// fall through
 		case 4:
-		LABEL_29:
 			getCharacterParams(kCharacterCond2, 8)[21] = 0;
 
 			getCharacter(kCharacterCond2).currentCall--;
@@ -2077,35 +2322,38 @@ void LogicManager::HAND_Cond2_DoPending(HAND_PARAMS) {
 			Cond2Call(&LogicManager::CONS_Cond2_DoWait, 75, 0, 0, 0);
 			break;
 		case 6:
-			if (!getCharacterParams(kCharacterCond2, 8)[5] && !getCharacterParams(kCharacterCond2, 8)[6]) {
-				goto LABEL_30;
+			if (getCharacterParams(kCharacterCond2, 8)[5] || getCharacterParams(kCharacterCond2, 8)[6]) {
+				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 7;
+				Cond2Call(&LogicManager::CONS_Cond2_RespondVassili, 0, 0, 0, 0);
+				break;
 			}
-			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 7;
-			Cond2Call(&LogicManager::CONS_Cond2_RespondVassili, 0, 0, 0, 0);
-			break;
+
+			// fall through
 		case 7:
-		LABEL_30:
-			if (!getCharacterParams(kCharacterCond2, 8)[17])
-				goto LABEL_32;
-			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 8;
-			Cond2Call(&LogicManager::CONS_Cond2_AfterPolice, 0, 0, 0, 0);
-			break;
+			if (getCharacterParams(kCharacterCond2, 8)[17]) {
+				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 8;
+				Cond2Call(&LogicManager::CONS_Cond2_AfterPolice, 0, 0, 0, 0);
+				break;
+			}
+
+			// fall through
 		case 8:
-		LABEL_32:
-			if (!getCharacterParams(kCharacterCond2, 8)[9])
-				goto LABEL_34;
-			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 9;
-			Cond2Call(&LogicManager::CONS_Cond2_ServiceAnna, 0, 0, 0, 0);
-			break;
+			if (getCharacterParams(kCharacterCond2, 8)[9]) {
+				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 9;
+				Cond2Call(&LogicManager::CONS_Cond2_ServiceAnna, 0, 0, 0, 0);
+				break;
+			}
+
+			// fall through
 		case 9:
-		LABEL_34:
-			if (!getCharacterParams(kCharacterCond2, 8)[14])
-				goto LABEL_36;
-			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 10;
-			Cond2Call(&LogicManager::CONS_Cond2_TakeMaxBack, 0, 0, 0, 0);
-			break;
+			if (getCharacterParams(kCharacterCond2, 8)[14]) {
+				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 10;
+				Cond2Call(&LogicManager::CONS_Cond2_TakeMaxBack, 0, 0, 0, 0);
+				break;
+			}
+
+			// fall through
 		case 10:
-		LABEL_36:
 			getCharacterParams(kCharacterCond2, 8)[21] = 0;
 
 			getCharacter(kCharacterCond2).currentCall--;
@@ -2113,8 +2361,12 @@ void LogicManager::HAND_Cond2_DoPending(HAND_PARAMS) {
 			fedEx(kCharacterCond2, kCharacterCond2, 18, 0);
 			break;
 		default:
-			return;
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -2131,10 +2383,12 @@ void LogicManager::CONS_Cond2_TakeMaxBack(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Cond2_TakeMaxBack(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 1;
 		Cond2Call(&LogicManager::CONS_Cond2_GetUp, 0, 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8]) {
 		case 1:
 			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 2;
@@ -2143,12 +2397,17 @@ void LogicManager::HAND_Cond2_TakeMaxBack(HAND_PARAMS) {
 		case 2:
 			if (!getCharacterCurrentParams(kCharacterCond2)[0]) {
 				playDialog(kCharacterCond2, "Ann3124", -1, 0);
-				goto LABEL_14;
+				getCharacterParams(kCharacterCond2, 8)[14] = 0;
+				getCharacterParams(kCharacterCond2, 8)[11] = 0;
+				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 7;
+				Cond2Call(&LogicManager::CONS_Cond2_ReturnMax, getCharacterCurrentParams(kCharacterCond2)[0], 0, 0, 0);
+			} else {
+				startCycOtis(kCharacterCond2, "627Vf");
+				softBlockAtDoor(kCharacterCond2, 37);
+				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 3;
+				Cond2Call(&LogicManager::CONS_Cond2_DoDialog, "LIB012", 0, 0, 0);
 			}
-			startCycOtis(kCharacterCond2, "627Vf");
-			softBlockAtDoor(kCharacterCond2, 37);
-			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 3;
-			Cond2Call(&LogicManager::CONS_Cond2_DoDialog, "LIB012", 0, 0, 0);
+
 			break;
 		case 3:
 			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 4;
@@ -2165,7 +2424,6 @@ void LogicManager::HAND_Cond2_TakeMaxBack(HAND_PARAMS) {
 			break;
 		case 6:
 			softReleaseAtDoor(kCharacterCond2, 37);
-		LABEL_14:
 			getCharacterParams(kCharacterCond2, 8)[14] = 0;
 			getCharacterParams(kCharacterCond2, 8)[11] = 0;
 			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 7;
@@ -2177,12 +2435,16 @@ void LogicManager::HAND_Cond2_TakeMaxBack(HAND_PARAMS) {
 			fedEx(kCharacterCond2, kCharacterCond2, 18, 0);
 			break;
 		default:
-			return;
+			break;
 		}
-	}
-}
 
-void LogicManager::CONS_Cond2_ReturnMax(CONS_PARAMS) {
+		break;
+	default:
+		break;
+	}
+}
+
+void LogicManager::CONS_Cond2_ReturnMax(CONS_PARAMS) {
 	CharacterCallParams *params = &getCharacter(kCharacterCond2).callParams[getCharacter(kCharacterCond2).currentCall];
 	_engine->getMessageManager()->setMessageHandle(kCharacterCond2, &LogicManager::HAND_Cond2_ReturnMax);
 	getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall] = 35;
@@ -2195,57 +2457,68 @@ void LogicManager::CONS_Cond2_ReturnMax(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Cond2_ReturnMax(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			if (getCharacterCurrentParams(kCharacterCond2)[0])
-				send(kCharacterCond2, kCharacterAnna, 156049968, 0);
-			send(kCharacterCond2, kCharacterMax, 122358304, 0);
-			getCharacter(kCharacterCond2).clothes = 1;
-			getCharacter(kCharacterCond2).characterPosition.position = 4370;
-			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 1;
-			Cond2Call(&LogicManager::CONS_Cond2_DoWalk, 4, 8200, 0, 0);
-		} else if (msg->action == 18) {
-			switch (getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8]) {
-			case 1:
-				if (!whoRunningDialog(kCharacterCond2))
-					playDialog(kCharacterCond2, "Ann3124", -1, 0);
-				if (getCharacterCurrentParams(kCharacterCond2)[0])
-					send(kCharacterCond2, kCharacterAnna, 123733488, 0);
-				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 2;
-				Cond2Call(&LogicManager::CONS_Cond2_DoWalk, 4, 9460, 0, 0);
-				break;
-			case 2:
-				endGraphics(kCharacterCond2);
-				break;
-			case 3:
-				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 4;
-				Cond2Call(&LogicManager::CONS_Cond2_SitDown, 0, 0, 0, 0);
-				break;
-			case 4:
-				getCharacter(kCharacterCond2).currentCall--;
-				_engine->getMessageManager()->setMessageHandle(kCharacterCond2, _functionsCond2[getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall]]);
-				fedEx(kCharacterCond2, kCharacterCond2, 18, 0);
-				break;
-			default:
-				return;
-			}
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		if (checkLoc(kCharacterCath, kCarBaggage)) {
 			playNIS(kEventCoudertBaggageCar);
 			playDialog(0, "BUMP", -1, 0);
 			bumpCath(kCarRestaurant, 65, 255);
 		}
+
 		if (getCharacterCurrentParams(kCharacterCond2)[1] ||
 			(getCharacterCurrentParams(kCharacterCond2)[1] = _gameTime + 2700, _gameTime != -2700)) {
 			if (getCharacterCurrentParams(kCharacterCond2)[1] >= _gameTime)
-				return;
+				break;
+
 			getCharacterCurrentParams(kCharacterCond2)[1] = 0x7FFFFFFF;
 		}
+
 		send(kCharacterCond2, kCharacterMax, 135204609, 0);
 		getCharacter(kCharacterCond2).clothes = 0;
 		getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 3;
 		Cond2Call(&LogicManager::CONS_Cond2_DoWalk, 4, 2000, 0, 0);
+		break;
+	case 12:
+		if (getCharacterCurrentParams(kCharacterCond2)[0])
+			send(kCharacterCond2, kCharacterAnna, 156049968, 0);
+
+		send(kCharacterCond2, kCharacterMax, 122358304, 0);
+		getCharacter(kCharacterCond2).clothes = 1;
+		getCharacter(kCharacterCond2).characterPosition.position = 4370;
+		getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 1;
+		Cond2Call(&LogicManager::CONS_Cond2_DoWalk, 4, 8200, 0, 0);
+		break;
+	case 18:
+		switch (getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8]) {
+		case 1:
+			if (!whoRunningDialog(kCharacterCond2))
+				playDialog(kCharacterCond2, "Ann3124", -1, 0);
+
+			if (getCharacterCurrentParams(kCharacterCond2)[0])
+				send(kCharacterCond2, kCharacterAnna, 123733488, 0);
+
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 2;
+			Cond2Call(&LogicManager::CONS_Cond2_DoWalk, 4, 9460, 0, 0);
+			break;
+		case 2:
+			endGraphics(kCharacterCond2);
+			break;
+		case 3:
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 4;
+			Cond2Call(&LogicManager::CONS_Cond2_SitDown, 0, 0, 0, 0);
+			break;
+		case 4:
+			getCharacter(kCharacterCond2).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterCond2, _functionsCond2[getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall]]);
+			fedEx(kCharacterCond2, kCharacterCond2, 18, 0);
+			break;
+		default:
+			break;
+		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -2260,37 +2533,47 @@ void LogicManager::CONS_Cond2_Birth(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Cond2_Birth(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			autoMessage(kCharacterCond2, 292048641, 7);
-			autoMessage(kCharacterCond2, 326348944, 8);
-			autoMessage(kCharacterCond2, 171394341, 2);
-			autoMessage(kCharacterCond2, 154005632, 4);
-			autoMessage(kCharacterCond2, 169557824, 3);
-			autoMessage(kCharacterCond2, 226031488, 5);
-			autoMessage(kCharacterCond2, 339669520, 6);
-			autoMessage(kCharacterCond2, 189750912, 10);
-			autoMessage(kCharacterCond2, 185737168, 12);
-			autoMessage(kCharacterCond2, 185671840, 13);
-			autoMessage(kCharacterCond2, 205033696, 15);
-			autoMessage(kCharacterCond2, 157026693, 14);
-			autoMessage(kCharacterCond2, 189026624, 11);
-			autoMessage(kCharacterCond2, 168254872, 17);
-			autoMessage(kCharacterCond2, 201431954, 18);
-			autoMessage(kCharacterCond2, 188570113, 19);
-			getCharacter(kCharacterCond2).characterPosition.position = 1500;
-			getCharacter(kCharacterCond2).characterPosition.location = 0;
-			getCharacter(kCharacterCond2).characterPosition.car = kCarRedSleeping;
-			getCharacterParams(kCharacterCond2, 8)[1] = 1;
-			getCharacterParams(kCharacterCond2, 8)[0] = 0;
-			setModel(111, 1);
-		} else if (msg->action == 18 && getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] == 1) {
+	switch (msg->action) {
+	case 0:
+		if (_gameTime > 1062000 && !getCharacterCurrentParams(kCharacterCond2)[0]) {
+			getCharacterCurrentParams(kCharacterCond2)[0] = 1;
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 1;
+			Cond2Call(&LogicManager::CONS_Cond2_SitDown, 0, 0, 0, 0);
+		}
+
+		break;
+	case 12:
+		autoMessage(kCharacterCond2, 292048641, 7);
+		autoMessage(kCharacterCond2, 326348944, 8);
+		autoMessage(kCharacterCond2, 171394341, 2);
+		autoMessage(kCharacterCond2, 154005632, 4);
+		autoMessage(kCharacterCond2, 169557824, 3);
+		autoMessage(kCharacterCond2, 226031488, 5);
+		autoMessage(kCharacterCond2, 339669520, 6);
+		autoMessage(kCharacterCond2, 189750912, 10);
+		autoMessage(kCharacterCond2, 185737168, 12);
+		autoMessage(kCharacterCond2, 185671840, 13);
+		autoMessage(kCharacterCond2, 205033696, 15);
+		autoMessage(kCharacterCond2, 157026693, 14);
+		autoMessage(kCharacterCond2, 189026624, 11);
+		autoMessage(kCharacterCond2, 168254872, 17);
+		autoMessage(kCharacterCond2, 201431954, 18);
+		autoMessage(kCharacterCond2, 188570113, 19);
+		getCharacter(kCharacterCond2).characterPosition.position = 1500;
+		getCharacter(kCharacterCond2).characterPosition.location = 0;
+		getCharacter(kCharacterCond2).characterPosition.car = kCarRedSleeping;
+		getCharacterParams(kCharacterCond2, 8)[1] = 1;
+		getCharacterParams(kCharacterCond2, 8)[0] = 0;
+		setModel(111, 1);
+		break;
+	case 18:
+		if (getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] == 1) {
 			CONS_Cond2_Sitting(0, 0, 0, 0);
 		}
-	} else if (_gameTime > 1062000 && !getCharacterCurrentParams(kCharacterCond2)[0]) {
-		getCharacterCurrentParams(kCharacterCond2)[0] = 1;
-		getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 1;
-		Cond2Call(&LogicManager::CONS_Cond2_SitDown, 0, 0, 0, 0);
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -2305,19 +2588,22 @@ void LogicManager::CONS_Cond2_RespondVassili(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Cond2_RespondVassili(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		if (whoRunningDialog(kCharacterCond2))
 			fadeDialog(kCharacterCond2);
+
 		if (getCharacterParams(kCharacterCond2, 8)[6]) {
 			getCharacter(kCharacterCond2).characterPosition.position = 8200;
-		LABEL_8:
 			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 4;
 			Cond2Call(&LogicManager::CONS_Cond2_DoEnterCorrOtis, "698Ha", 32, 8200, 7850);
 		} else {
 			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 1;
 			Cond2Call(&LogicManager::CONS_Cond2_GetUp, 0, 0, 0, 0);
 		}
-	} else if (msg->action == 18) {
+
+		break;
+	case 18:
 		switch (getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8]) {
 		case 1:
 			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 2;
@@ -2329,16 +2615,22 @@ void LogicManager::HAND_Cond2_RespondVassili(HAND_PARAMS) {
 			Cond2Call(&LogicManager::CONS_Cond2_DoWalk, 4, 8200, 0, 0);
 			break;
 		case 3:
-			goto LABEL_8;
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 4;
+			Cond2Call(&LogicManager::CONS_Cond2_DoEnterCorrOtis, "698Ha", 32, 8200, 7850);
+			break;
 		case 4:
-			setDoor(32, 0, 2, 255, 255);
+			setDoor(32, kCharacterCath, 2, 255, 255);
 			getCharacter(kCharacterCond2).characterPosition.location = 1;
 			endGraphics(kCharacterCond2);
 			CONS_Cond2_AtSeizure(0, 0, 0, 0);
 			break;
 		default:
-			return;
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -2368,14 +2660,17 @@ void LogicManager::HAND_Cond2_AtSeizure(HAND_PARAMS) {
 		} else if (getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] == 2) {
 			CONS_Cond2_Sitting(0, 0, 0, 0);
 		}
+
 		break;
 	case 191477936:
 		getCharacter(kCharacterCond2).characterPosition.location = 0;
 		getCharacter(kCharacterCond2).characterPosition.position = 4070;
-		setDoor(32, 0, 0, 10, 9);
+		setDoor(32, kCharacterCath, 0, 10, 9);
 		getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 1;
 		Cond2Call(&LogicManager::CONS_Cond2_DoWalk, 4, 2000, 0, 0);
 		break;
+	default:
+		break;
 	}
 }
 
@@ -2390,10 +2685,12 @@ void LogicManager::CONS_Cond2_AfterPolice(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Cond2_AfterPolice(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 1;
 		Cond2Call(&LogicManager::CONS_Cond2_DoDialog, "LIB070", 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8]) {
 		case 1:
 			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 2;
@@ -2447,8 +2744,12 @@ void LogicManager::HAND_Cond2_AfterPolice(HAND_PARAMS) {
 			fedEx(kCharacterCond2, kCharacterCond2, 18, 0);
 			break;
 		default:
-			return;
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -2463,182 +2764,230 @@ void LogicManager::CONS_Cond2_Sitting(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Cond2_Sitting(HAND_PARAMS) {
-	if (msg->action > 11) {
-		if (msg->action > 17) {
-			if (msg->action > 168253822) {
-				if (msg->action == 225358684) {
-					if (!getCharacterParams(kCharacterCond2, 8)[0]) {
-						getCharacter(kCharacterCond2).inventoryItem = 0;
-						getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 16;
-						Cond2Call(&LogicManager::CONS_Cond2_CathBuzzing, msg->param, 0, 0, 0);
-					}
-				} else if (msg->action == 225932896) {
-					if (!getCharacterParams(kCharacterCond2, 8)[16] && !getCharacterParams(kCharacterCond2, 8)[0]) {
-						send(kCharacterCond2, kCharacterFrancois, 205346192, 0);
-					}
-				} else if (msg->action == 305159806 && !getCharacterParams(kCharacterCond2, 8)[16] && !getCharacterParams(kCharacterCond2, 8)[0]) {
-					getCharacter(kCharacterCond2).inventoryItem = 0;
-					getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 17;
-					Cond2Call(&LogicManager::CONS_Cond2_CathRattling, msg->param, 0, 0, 0);
-				}
-			} else if (msg->action == 168253822) {
-				if (!getCharacterParams(kCharacterCond2, 8)[16] && !getCharacterParams(kCharacterCond2, 8)[0]) {
-					getCharacter(kCharacterCond2).inventoryItem = 0;
-					playDialog(kCharacterCond2, "JAC1120", -1, 0);
-					getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 14;
-					Cond2Call(&LogicManager::CONS_Cond2_DoSeqOtis, "697D", 0, 0, 0);
-				}
-			} else if (msg->action == 18) {
-				switch (getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8]) {
-				case 1:
-					playNIS(kEventCoudertBloodJacket);
-					endGame(0, 1, 55, 1);
-					break;
-				case 4:
-					goto LABEL_70;
-				case 5:
-					goto LABEL_72;
-				case 6:
-					goto LABEL_77;
-				case 7:
-					goto LABEL_79;
-				case 8:
-					goto LABEL_81;
-				case 9:
-					goto LABEL_83;
-				case 10:
-					getCharacterCurrentParams(kCharacterCond2)[0] = 1;
-					goto LABEL_44;
-				case 11:
-					playNIS(kEventCoudertAskTylerCompartment);
-					if (getCharacterParams(kCharacterCond2, 8)[1])
-						startSeqOtis(kCharacterCond2, "627A");
-					else
-						startSeqOtis(kCharacterCond2, "627D");
-					takeItem(kItem5);
-					getCharacterParams(kCharacterCond2, 8)[0] = 0;
-					bumpCath(kCarRedSleeping, 25, 255);
-					getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 12;
-					Cond2Call(&LogicManager::CONS_Cond2_FinishSeqOtis, 0, 0, 0, 0);
-					break;
-				case 12:
-					if (getCharacterParams(kCharacterCond2, 8)[1])
-						startCycOtis(kCharacterCond2, "627B");
-					else
-						startCycOtis(kCharacterCond2, "627E");
-					break;
-				case 14:
-					getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 15;
-					Cond2Call(&LogicManager::CONS_Cond2_SitDown, 0, 0, 0, 0);
-					break;
-				default:
-					return;
-				}
-			}
-		} else if (msg->action == 17) {
-			if (!getCharacterParams(kCharacterCond2, 8)[16] &&
-				!getCharacterParams(kCharacterCond2, 8)[0] &&
-				(checkCathDir(kCarRedSleeping, 1) || checkCathDir(kCarRedSleeping, 23))) {
-				if (_gameProgress[kProgressJacket] == 1) {
-					getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 1;
-					Cond2Call(&LogicManager::CONS_Cond2_SaveGame, 2, kEventCoudertBloodJacket, 0, 0);
-				} else {
-					if (checkCathDir(kCarRedSleeping, 1))
-						getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 2;
-					else
-						getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 3;
-					Cond2Call(&LogicManager::CONS_Cond2_Passing, 1, 0, 0, 0);
-				}
+	switch (msg->action) {
+	case 0:
+	{
+		if (getCharacterParams(kCharacterCond2, 8)[18]) {
+			getCharacterParams(kCharacterCond2, 8)[17] = 0;
+			getCharacterParams(kCharacterCond2, 8)[2] = 0;
+			getCharacterParams(kCharacterCond2, 8)[4] = 0;
+			getCharacterParams(kCharacterCond2, 8)[3] = 0;
+			getCharacterParams(kCharacterCond2, 8)[16] = 0;
+			getCharacterParams(kCharacterCond2, 8)[0] = 1;
+			getCharacterParams(kCharacterCond2, 8)[7] = 0;
+			getCharacterParams(kCharacterCond2, 8)[8] = 0;
+			startCycOtis(kCharacterCond2, "697F");
+			getCharacterCurrentParams(kCharacterCond2)[0] = 1;
+			getCharacterCurrentParams(kCharacterCond2)[1] = 1;
+			getCharacterParams(kCharacterCond2, 8)[18] = 0;
+		}
+
+		if (_gameProgress[kProgressEventFoundCorpse] || _gameEvents[kEventCoudertAskTylerCompartment]) {
+			getCharacter(kCharacterCond2).inventoryItem = 0;
+		} else {
+			getCharacter(kCharacterCond2).inventoryItem = 0x80;
+		}
+
+		if (getCharacterParams(kCharacterCond2, 8)[7]) {
+			getCharacter(kCharacterCond2).inventoryItem = 0;
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 4;
+			Cond2Call(&LogicManager::CONS_Cond2_TatianaLockUnlockMyComp, 1, 0, 0, 0);
+			break;
+		}
+
+		if (getCharacterParams(kCharacterCond2, 8)[8]) {
+			getCharacter(kCharacterCond2).inventoryItem = 0;
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 5;
+			Cond2Call(&LogicManager::CONS_Cond2_TatianaLockUnlockMyComp, 0, 0, 0, 0);
+			break;
+		}
+
+		if (getCharacterParams(kCharacterCond2, 8)[5] || getCharacterParams(kCharacterCond2, 8)[6]) {
+			getCharacter(kCharacterCond2).inventoryItem = 0;
+			CONS_Cond2_RespondVassili(0, 0, 0, 0);
+			break;
+		}
+
+		if (getCharacterParams(kCharacterCond2, 8)[2]) {
+			getCharacter(kCharacterCond2).inventoryItem = 0;
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 6;
+			Cond2Call(&LogicManager::CONS_Cond2_Listen, 9, 0, 0, 0);
+			break;
+		}
+
+		if (getCharacterParams(kCharacterCond2, 8)[4]) {
+			getCharacter(kCharacterCond2).inventoryItem = 0;
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 7;
+			Cond2Call(&LogicManager::CONS_Cond2_Listen, 3, 0, 0, 0);
+			break;
+		}
+
+		if (getCharacterParams(kCharacterCond2, 8)[3]) {
+			getCharacter(kCharacterCond2).inventoryItem = 0;
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 8;
+			Cond2Call(&LogicManager::CONS_Cond2_Listen, 21, 0, 0, 0);
+			break;
+		}
+
+		if (getCharacterParams(kCharacterCond2, 8)[17]) {
+			getCharacter(kCharacterCond2).inventoryItem = 0;
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 9;
+			Cond2Call(&LogicManager::CONS_Cond2_AfterPolice, 0, 0, 0, 0);
+			break;
+		}
+
+		if (getCharacterParams(kCharacterCond2, 8)[0] && !whoRunningDialog(kCharacterCond2)) {
+			if (rnd(2) == 0) {
+				playDialog(kCharacterCond2, "JAC1065A", -1, 0);
+			} else {
+				playDialog(kCharacterCond2, "JAC1065", -1, 0);
 			}
-		} else if (msg->action == 12) {
-			getCharacter(kCharacterCond2).characterPosition.car = kCarRedSleeping;
-			getCharacter(kCharacterCond2).characterPosition.position = 1500;
-			getCharacter(kCharacterCond2).characterPosition.location = 0;
-			takeItem(kItem5);
 		}
-	} else {
-		if (msg->action != 11) {
-			if (msg->action) {
-				if (msg->action == 1) {
-					getCharacter(kCharacterCond2).inventoryItem = 0;
-					getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 11;
-					Cond2Call(&LogicManager::CONS_Cond2_SaveGame, 2, kEventCoudertAskTylerCompartment, 0, 0);
+
+		if (_gameTime > 1107000 && !getCharacterCurrentParams(kCharacterCond2)[0] && !_gameEvents[84]) {
+			getCharacter(kCharacterCond2).inventoryItem = 0;
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 10;
+			Cond2Call(&LogicManager::CONS_Cond2_MakeAllBeds, 0, 0, 0, 0);
+			break;
+		}
+
+		bool skip = false; // Horrible way to unroll a goto...
+
+		if (_gameTime > 1189800 && !getCharacterParams(kCharacterCond2, 8)[0] && !getCharacterParams(kCharacterCond2, 8)[16]) {
+			if (getCharacterCurrentParams(kCharacterCond2)[2] ||
+				(getCharacterCurrentParams(kCharacterCond2)[2] = _gameTime + 2700, _gameTime != -2700)) {
+				if (getCharacterCurrentParams(kCharacterCond2)[2] >= _gameTime) {
+					skip = true;
 				}
-				return;
+
+				if (!skip)
+					getCharacterCurrentParams(kCharacterCond2)[2] = 0x7FFFFFFF;
 			}
 
-			if (getCharacterParams(kCharacterCond2, 8)[18]) {
-				getCharacterParams(kCharacterCond2, 8)[17] = 0;
-				getCharacterParams(kCharacterCond2, 8)[2] = 0;
-				getCharacterParams(kCharacterCond2, 8)[4] = 0;
-				getCharacterParams(kCharacterCond2, 8)[3] = 0;
-				getCharacterParams(kCharacterCond2, 8)[16] = 0;
+			if (!skip) {
+				getCharacterParams(kCharacterCond2, 8)[1] = 0;
 				getCharacterParams(kCharacterCond2, 8)[0] = 1;
-				getCharacterParams(kCharacterCond2, 8)[7] = 0;
-				getCharacterParams(kCharacterCond2, 8)[8] = 0;
 				startCycOtis(kCharacterCond2, "697F");
-				getCharacterCurrentParams(kCharacterCond2)[0] = 1;
-				getCharacterCurrentParams(kCharacterCond2)[1] = 1;
-				getCharacterParams(kCharacterCond2, 8)[18] = 0;
-			}
-
-			if (_gameProgress[kProgressEventFoundCorpse] || _gameEvents[kEventCoudertAskTylerCompartment]) {
-				getCharacter(kCharacterCond2).inventoryItem = 0;
-			} else {
-				getCharacter(kCharacterCond2).inventoryItem = 0x80;
+				getCharacterCurrentParams(kCharacterCond2)[2] = 0;
 			}
+		}
 
-			if (getCharacterParams(kCharacterCond2, 8)[7]) {
-				getCharacter(kCharacterCond2).inventoryItem = 0;
-				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 4;
-				Cond2Call(&LogicManager::CONS_Cond2_TatianaLockUnlockMyComp, 1, 0, 0, 0);
-				return;
-			}
-		LABEL_70:
-			if (getCharacterParams(kCharacterCond2, 8)[8]) {
-				getCharacter(kCharacterCond2).inventoryItem = 0;
-				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 5;
-				Cond2Call(&LogicManager::CONS_Cond2_TatianaLockUnlockMyComp, 0, 0, 0, 0);
-				return;
-			}
-		LABEL_72:
-			if (getCharacterParams(kCharacterCond2, 8)[5] || getCharacterParams(kCharacterCond2, 8)[6]) {
-				getCharacter(kCharacterCond2).inventoryItem = 0;
-				CONS_Cond2_RespondVassili(0, 0, 0, 0);
-				return;
-			}
-			if (getCharacterParams(kCharacterCond2, 8)[2]) {
-				getCharacter(kCharacterCond2).inventoryItem = 0;
-				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 6;
-				Cond2Call(&LogicManager::CONS_Cond2_Listen, 9, 0, 0, 0);
-				return;
-			}
-		LABEL_77:
-			if (getCharacterParams(kCharacterCond2, 8)[4]) {
-				getCharacter(kCharacterCond2).inventoryItem = 0;
-				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 7;
-				Cond2Call(&LogicManager::CONS_Cond2_Listen, 3, 0, 0, 0);
-				return;
+		if (getCharacterParams(kCharacterCond2, 8)[1]) {
+			if (_gameTime > 1107000 && !getCharacterCurrentParams(kCharacterCond2)[3]) {
+				getCharacterCurrentParams(kCharacterCond2)[3] = 1;
+				setModel(111, 2);
 			}
-		LABEL_79:
-			if (getCharacterParams(kCharacterCond2, 8)[3]) {
-				getCharacter(kCharacterCond2).inventoryItem = 0;
-				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 8;
-				Cond2Call(&LogicManager::CONS_Cond2_Listen, 21, 0, 0, 0);
-				return;
+			if (_gameTime > 1161000 && !getCharacterCurrentParams(kCharacterCond2)[4]) {
+				getCharacterCurrentParams(kCharacterCond2)[4] = 1;
+				setModel(111, 3);
 			}
-		LABEL_81:
-			if (getCharacterParams(kCharacterCond2, 8)[17]) {
-				getCharacter(kCharacterCond2).inventoryItem = 0;
-				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 9;
-				Cond2Call(&LogicManager::CONS_Cond2_AfterPolice, 0, 0, 0, 0);
-				return;
+			if (_gameTime > 1206000 && !getCharacterCurrentParams(kCharacterCond2)[5]) {
+				getCharacterCurrentParams(kCharacterCond2)[5] = 1;
+				setModel(111, 4);
 			}
-		LABEL_83:
-			if (getCharacterParams(kCharacterCond2, 8)[0] && !whoRunningDialog(kCharacterCond2)) {
-				if (rnd(2) == 0) {
-					playDialog(kCharacterCond2, "JAC1065A", -1, 0);
-				} else {
+		}
+
+		break;
+	}
+	case 1:
+		getCharacter(kCharacterCond2).inventoryItem = 0;
+		getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 11;
+		Cond2Call(&LogicManager::CONS_Cond2_SaveGame, 2, kEventCoudertAskTylerCompartment, 0, 0);
+		break;
+	case 11:
+		if (!getCharacterParams(kCharacterCond2, 8)[0] && !getCharacterParams(kCharacterCond2, 8)[16]) {
+			getCharacter(kCharacterCond2).inventoryItem = 0;
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 13;
+			Cond2Call(&LogicManager::CONS_Cond2_Passing, msg->param, msg->sender, 0, 0);
+		}
+
+		break;
+	case 12:
+		getCharacter(kCharacterCond2).characterPosition.car = kCarRedSleeping;
+		getCharacter(kCharacterCond2).characterPosition.position = 1500;
+		getCharacter(kCharacterCond2).characterPosition.location = 0;
+		takeItem(kItem5);
+		break;
+	case 17:
+		if (!getCharacterParams(kCharacterCond2, 8)[16] &&
+			!getCharacterParams(kCharacterCond2, 8)[0] &&
+			(checkCathDir(kCarRedSleeping, 1) || checkCathDir(kCarRedSleeping, 23))) {
+			if (_gameProgress[kProgressJacket] == 1) {
+				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 1;
+				Cond2Call(&LogicManager::CONS_Cond2_SaveGame, 2, kEventCoudertBloodJacket, 0, 0);
+			} else {
+				if (checkCathDir(kCarRedSleeping, 1))
+					getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 2;
+				else
+					getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 3;
+
+				Cond2Call(&LogicManager::CONS_Cond2_Passing, 1, 0, 0, 0);
+			}
+		}
+
+		break;
+	case 18:
+		switch (getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8]) {
+		case 1:
+			playNIS(kEventCoudertBloodJacket);
+			endGame(0, 1, 55, true);
+			break;
+		case 4:
+			if (getCharacterParams(kCharacterCond2, 8)[8]) {
+				getCharacter(kCharacterCond2).inventoryItem = 0;
+				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 5;
+				Cond2Call(&LogicManager::CONS_Cond2_TatianaLockUnlockMyComp, 0, 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 5:
+			if (getCharacterParams(kCharacterCond2, 8)[5] || getCharacterParams(kCharacterCond2, 8)[6]) {
+				getCharacter(kCharacterCond2).inventoryItem = 0;
+				CONS_Cond2_RespondVassili(0, 0, 0, 0);
+				break;
+			}
+
+			if (getCharacterParams(kCharacterCond2, 8)[2]) {
+				getCharacter(kCharacterCond2).inventoryItem = 0;
+				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 6;
+				Cond2Call(&LogicManager::CONS_Cond2_Listen, 9, 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 6:
+			if (getCharacterParams(kCharacterCond2, 8)[4]) {
+				getCharacter(kCharacterCond2).inventoryItem = 0;
+				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 7;
+				Cond2Call(&LogicManager::CONS_Cond2_Listen, 3, 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 7:
+			if (getCharacterParams(kCharacterCond2, 8)[3]) {
+				getCharacter(kCharacterCond2).inventoryItem = 0;
+				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 8;
+				Cond2Call(&LogicManager::CONS_Cond2_Listen, 21, 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 8:
+			if (getCharacterParams(kCharacterCond2, 8)[17]) {
+				getCharacter(kCharacterCond2).inventoryItem = 0;
+				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 9;
+				Cond2Call(&LogicManager::CONS_Cond2_AfterPolice, 0, 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 9:
+			if (getCharacterParams(kCharacterCond2, 8)[0] && !whoRunningDialog(kCharacterCond2)) {
+				if (rnd(2) == 0) {
+					playDialog(kCharacterCond2, "JAC1065A", -1, 0);
+				} else {
 					playDialog(kCharacterCond2, "JAC1065", -1, 0);
 				}
 			}
@@ -2647,22 +2996,37 @@ void LogicManager::HAND_Cond2_Sitting(HAND_PARAMS) {
 				getCharacter(kCharacterCond2).inventoryItem = 0;
 				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 10;
 				Cond2Call(&LogicManager::CONS_Cond2_MakeAllBeds, 0, 0, 0, 0);
-				return;
+				break;
 			}
-		LABEL_44:
-			if (_gameTime <= 1189800 || getCharacterParams(kCharacterCond2, 8)[0] || getCharacterParams(kCharacterCond2, 8)[16])
-				goto LABEL_52;
-			if (getCharacterCurrentParams(kCharacterCond2)[2] ||
-				(getCharacterCurrentParams(kCharacterCond2)[2] = _gameTime + 2700, _gameTime != -2700)) {
-				if (getCharacterCurrentParams(kCharacterCond2)[2] >= _gameTime)
-					goto LABEL_52;
-				getCharacterCurrentParams(kCharacterCond2)[2] = 0x7FFFFFFF;
+
+			// fall through
+		case 10:
+		{
+			if (getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] == 10) {
+				getCharacterCurrentParams(kCharacterCond2)[0] = 1;
 			}
-			getCharacterParams(kCharacterCond2, 8)[1] = 0;
-			getCharacterParams(kCharacterCond2, 8)[0] = 1;
-			startCycOtis(kCharacterCond2, "697F");
-			getCharacterCurrentParams(kCharacterCond2)[2] = 0;
-		LABEL_52:
+
+			bool skip = false; // Horrible way to unroll a goto...
+
+			if (_gameTime > 1189800 && !getCharacterParams(kCharacterCond2, 8)[0] && !getCharacterParams(kCharacterCond2, 8)[16]) {
+				if (getCharacterCurrentParams(kCharacterCond2)[2] ||
+					(getCharacterCurrentParams(kCharacterCond2)[2] = _gameTime + 2700, _gameTime != -2700)) {
+					if (getCharacterCurrentParams(kCharacterCond2)[2] >= _gameTime) {
+						skip = true;
+					}
+
+					if (!skip)
+						getCharacterCurrentParams(kCharacterCond2)[2] = 0x7FFFFFFF;
+				}
+
+				if (!skip) {
+					getCharacterParams(kCharacterCond2, 8)[1] = 0;
+					getCharacterParams(kCharacterCond2, 8)[0] = 1;
+					startCycOtis(kCharacterCond2, "697F");
+					getCharacterCurrentParams(kCharacterCond2)[2] = 0;
+				}
+			}
+
 			if (getCharacterParams(kCharacterCond2, 8)[1]) {
 				if (_gameTime > 1107000 && !getCharacterCurrentParams(kCharacterCond2)[3]) {
 					getCharacterCurrentParams(kCharacterCond2)[3] = 1;
@@ -2677,13 +3041,72 @@ void LogicManager::HAND_Cond2_Sitting(HAND_PARAMS) {
 					setModel(111, 4);
 				}
 			}
-			return;
+
+			break;
 		}
-		if (!getCharacterParams(kCharacterCond2, 8)[0] && !getCharacterParams(kCharacterCond2, 8)[16]) {
+		case 11:
+			playNIS(kEventCoudertAskTylerCompartment);
+
+			if (getCharacterParams(kCharacterCond2, 8)[1])
+				startSeqOtis(kCharacterCond2, "627A");
+			else
+				startSeqOtis(kCharacterCond2, "627D");
+
+			takeItem(kItem5);
+			getCharacterParams(kCharacterCond2, 8)[0] = 0;
+			bumpCath(kCarRedSleeping, 25, 255);
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 12;
+			Cond2Call(&LogicManager::CONS_Cond2_FinishSeqOtis, 0, 0, 0, 0);
+			break;
+		case 12:
+			if (getCharacterParams(kCharacterCond2, 8)[1])
+				startCycOtis(kCharacterCond2, "627B");
+			else
+				startCycOtis(kCharacterCond2, "627E");
+
+			break;
+		case 14:
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 15;
+			Cond2Call(&LogicManager::CONS_Cond2_SitDown, 0, 0, 0, 0);
+			break;
+		default:
+			break;
+		}
+
+		break;
+	case 168253822:
+		if (!getCharacterParams(kCharacterCond2, 8)[16] && !getCharacterParams(kCharacterCond2, 8)[0]) {
 			getCharacter(kCharacterCond2).inventoryItem = 0;
-			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 13;
-			Cond2Call(&LogicManager::CONS_Cond2_Passing, msg->param, msg->sender, 0, 0);
+			playDialog(kCharacterCond2, "JAC1120", -1, 0);
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 14;
+			Cond2Call(&LogicManager::CONS_Cond2_DoSeqOtis, "697D", 0, 0, 0);
+		}
+
+		break;
+	case 225932896:
+		if (!getCharacterParams(kCharacterCond2, 8)[16] && !getCharacterParams(kCharacterCond2, 8)[0]) {
+			send(kCharacterCond2, kCharacterFrancois, 205346192, 0);
+		}
+
+		break;
+	case 225358684:
+		if (!getCharacterParams(kCharacterCond2, 8)[0]) {
+			getCharacter(kCharacterCond2).inventoryItem = 0;
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 16;
+			Cond2Call(&LogicManager::CONS_Cond2_CathBuzzing, msg->param, 0, 0, 0);
+		}
+
+		break;
+	case 305159806:
+		if (!getCharacterParams(kCharacterCond2, 8)[16] && !getCharacterParams(kCharacterCond2, 8)[0]) {
+			getCharacter(kCharacterCond2).inventoryItem = 0;
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 17;
+			Cond2Call(&LogicManager::CONS_Cond2_CathRattling, msg->param, 0, 0, 0);
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -2698,10 +3121,12 @@ void LogicManager::CONS_Cond2_MakeAllBeds(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Cond2_MakeAllBeds(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 1;
 		Cond2Call(&LogicManager::CONS_Cond2_GetUp, 0, 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8]) {
 		case 1:
 			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 2;
@@ -2780,8 +3205,12 @@ void LogicManager::HAND_Cond2_MakeAllBeds(HAND_PARAMS) {
 			fedEx(kCharacterCond2, kCharacterCond2, 18, 0);
 			break;
 		default:
-			return;
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -2796,34 +3225,41 @@ void LogicManager::CONS_Cond2_StartPart2(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Cond2_StartPart2(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			endGraphics(kCharacterCond2);
-			getCharacter(kCharacterCond2).characterPosition.car = kCarRedSleeping;
-			getCharacter(kCharacterCond2).characterPosition.position = 1500;
-			getCharacter(kCharacterCond2).characterPosition.location = 0;
-			getCharacter(kCharacterCond2).inventoryItem = 0;
-			getCharacterParams(kCharacterCond2, 8)[7] = 0;
-			getCharacterParams(kCharacterCond2, 8)[8] = 0;
-			getCharacterParams(kCharacterCond2, 8)[2] = 0;
-			getCharacterParams(kCharacterCond2, 8)[4] = 0;
-			getCharacterParams(kCharacterCond2, 8)[3] = 0;
-			getCharacterParams(kCharacterCond2, 8)[5] = 0;
-			getCharacterParams(kCharacterCond2, 8)[10] = 0;
-			getCharacterParams(kCharacterCond2, 8)[12] = 0;
-			getCharacterParams(kCharacterCond2, 8)[13] = 0;
-			getCharacterParams(kCharacterCond2, 8)[15] = 0;
-			getCharacterParams(kCharacterCond2, 8)[19] = 0;
-			getCharacterParams(kCharacterCond2, 8)[14] = 0;
-			getCharacterParams(kCharacterCond2, 8)[9] = 0;
-			getCharacterParams(kCharacterCond2, 8)[1] = 0;
-			setModel(111, 5);
-		} else if (msg->action == 18 && getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] == 1) {
-			CONS_Cond2_SittingDay(0, 0, 0, 0);
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 1;
 		Cond2Call(&LogicManager::CONS_Cond2_SitDown, 0, 0, 0, 0);
+		break;
+	case 12:
+		endGraphics(kCharacterCond2);
+		getCharacter(kCharacterCond2).characterPosition.car = kCarRedSleeping;
+		getCharacter(kCharacterCond2).characterPosition.position = 1500;
+		getCharacter(kCharacterCond2).characterPosition.location = 0;
+		getCharacter(kCharacterCond2).inventoryItem = 0;
+		getCharacterParams(kCharacterCond2, 8)[7] = 0;
+		getCharacterParams(kCharacterCond2, 8)[8] = 0;
+		getCharacterParams(kCharacterCond2, 8)[2] = 0;
+		getCharacterParams(kCharacterCond2, 8)[4] = 0;
+		getCharacterParams(kCharacterCond2, 8)[3] = 0;
+		getCharacterParams(kCharacterCond2, 8)[5] = 0;
+		getCharacterParams(kCharacterCond2, 8)[10] = 0;
+		getCharacterParams(kCharacterCond2, 8)[12] = 0;
+		getCharacterParams(kCharacterCond2, 8)[13] = 0;
+		getCharacterParams(kCharacterCond2, 8)[15] = 0;
+		getCharacterParams(kCharacterCond2, 8)[19] = 0;
+		getCharacterParams(kCharacterCond2, 8)[14] = 0;
+		getCharacterParams(kCharacterCond2, 8)[9] = 0;
+		getCharacterParams(kCharacterCond2, 8)[1] = 0;
+		setModel(111, 5);
+		break;
+	case 18:
+		if (getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] == 1) {
+			CONS_Cond2_SittingDay(0, 0, 0, 0);
+		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -2838,75 +3274,95 @@ void LogicManager::CONS_Cond2_SittingDay(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Cond2_SittingDay(HAND_PARAMS) {
-	if (msg->action > 11) {
-		if (msg->action > 225358684) {
-			if (msg->action == 226078300) {
-				if (!getCharacterParams(kCharacterCond2, 8)[16] && !getCharacterParams(kCharacterCond2, 8)[0]) {
-					playDialog(kCharacterCond2, "JAC2020", -1, 0);
-					getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 7;
-					Cond2Call(&LogicManager::CONS_Cond2_DoSeqOtis, "697D", 0, 0, 0);
-				}
-			} else if (msg->action == 305159806 && !getCharacterParams(kCharacterCond2, 8)[16] && !getCharacterParams(kCharacterCond2, 8)[0]) {
-				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 10;
-				Cond2Call(&LogicManager::CONS_Cond2_CathRattling, msg->param, 0, 0, 0);
-			}
-		} else {
-			switch (msg->action) {
-			case 225358684:
-				if (!getCharacterParams(kCharacterCond2, 8)[0]) {
-					getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 9;
-					Cond2Call(&LogicManager::CONS_Cond2_CathBuzzing, msg->param, 0, 0, 0);
-				}
-				break;
-			case 17:
-				if (!getCharacterParams(kCharacterCond2, 8)[16]) {
-					if (checkCathDir(kCarRedSleeping, 1)) {
-						getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 5;
-						Cond2Call(&LogicManager::CONS_Cond2_Passing, 1, 0, 0, 0);
-					} else if (checkCathDir(kCarRedSleeping, 23)) {
-						getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 6;
-						Cond2Call(&LogicManager::CONS_Cond2_Passing, 0, 0, 0, 0);
-					}
-				}
-				break;
-			case 18:
-				switch (getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8]) {
-				case 1:
-					goto LABEL_24;
-				case 2:
-					goto LABEL_26;
-				case 7:
-					getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 8;
-					Cond2Call(&LogicManager::CONS_Cond2_SitDown, 0, 0, 0, 0);
-					break;
-				default:
-					return;
-				}
-				break;
-			}
+	switch (msg->action) {
+	case 0:
+		if (getCharacterParams(kCharacterCond2, 8)[7]) {
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 1;
+			Cond2Call(&LogicManager::CONS_Cond2_TatianaLockUnlockMyComp, 1, 0, 0, 0);
+			break;
+		}
+
+		if (getCharacterParams(kCharacterCond2, 8)[8]) {
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 2;
+			Cond2Call(&LogicManager::CONS_Cond2_TatianaLockUnlockMyComp, 0, 0, 0, 0);
+			break;
+		}
+
+		if (getCharacterParams(kCharacterCond2, 8)[2]) {
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 3;
+			Cond2Call(&LogicManager::CONS_Cond2_Listen, 9, 0, 0, 0);
 		}
-	} else if (msg->action == 11) {
+
+		break;
+	case 11:
 		if (!getCharacterParams(kCharacterCond2, 8)[16]) {
 			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 4;
 			Cond2Call(&LogicManager::CONS_Cond2_Passing, msg->param, msg->sender, 0, 0);
 		}
-	} else if (msg->action == 0) {
-		if (getCharacterParams(kCharacterCond2, 8)[7]) {
-			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 1;
-			Cond2Call(&LogicManager::CONS_Cond2_TatianaLockUnlockMyComp, 1, 0, 0, 0);
-		} else {
-		LABEL_24:
+
+		break;
+	case 17:
+		if (!getCharacterParams(kCharacterCond2, 8)[16]) {
+			if (checkCathDir(kCarRedSleeping, 1)) {
+				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 5;
+				Cond2Call(&LogicManager::CONS_Cond2_Passing, 1, 0, 0, 0);
+			} else if (checkCathDir(kCarRedSleeping, 23)) {
+				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 6;
+				Cond2Call(&LogicManager::CONS_Cond2_Passing, 0, 0, 0, 0);
+			}
+		}
+
+		break;
+	case 18:
+		switch (getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8]) {
+		case 1:
 			if (getCharacterParams(kCharacterCond2, 8)[8]) {
 				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 2;
 				Cond2Call(&LogicManager::CONS_Cond2_TatianaLockUnlockMyComp, 0, 0, 0, 0);
-			} else {
-			LABEL_26:
-				if (getCharacterParams(kCharacterCond2, 8)[2]) {
-					getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 3;
-					Cond2Call(&LogicManager::CONS_Cond2_Listen, 9, 0, 0, 0);
-				}
+				break;
 			}
+
+			// INTENTIONAL FALLTHROUGH
+		case 2:
+			if (getCharacterParams(kCharacterCond2, 8)[2]) {
+				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 3;
+				Cond2Call(&LogicManager::CONS_Cond2_Listen, 9, 0, 0, 0);
+			}
+
+			break;
+		case 7:
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 8;
+			Cond2Call(&LogicManager::CONS_Cond2_SitDown, 0, 0, 0, 0);
+			break;
+		default:
+			break;
+		}
+
+		break;
+	case 225358684:
+		if (!getCharacterParams(kCharacterCond2, 8)[0]) {
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 9;
+			Cond2Call(&LogicManager::CONS_Cond2_CathBuzzing, msg->param, 0, 0, 0);
 		}
+
+		break;
+	case 226078300:
+		if (!getCharacterParams(kCharacterCond2, 8)[16] && !getCharacterParams(kCharacterCond2, 8)[0]) {
+			playDialog(kCharacterCond2, "JAC2020", -1, 0);
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 7;
+			Cond2Call(&LogicManager::CONS_Cond2_DoSeqOtis, "697D", 0, 0, 0);
+		}
+
+		break;
+	case 305159806:
+		if (!getCharacterParams(kCharacterCond2, 8)[16] && !getCharacterParams(kCharacterCond2, 8)[0]) {
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 10;
+			Cond2Call(&LogicManager::CONS_Cond2_CathRattling, msg->param, 0, 0, 0);
+		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -2921,36 +3377,43 @@ void LogicManager::CONS_Cond2_StartPart3(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Cond2_StartPart3(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			endGraphics(kCharacterCond2);
-			getCharacter(kCharacterCond2).characterPosition.car = kCarRedSleeping;
-			getCharacter(kCharacterCond2).characterPosition.position = 1500;
-			getCharacter(kCharacterCond2).characterPosition.location = 0;
-			getCharacter(kCharacterCond2).clothes = 0;
-			getCharacter(kCharacterCond2).inventoryItem = 0;
-			getCharacterParams(kCharacterCond2, 8)[7] = 0;
-			getCharacterParams(kCharacterCond2, 8)[8] = 0;
-			getCharacterParams(kCharacterCond2, 8)[2] = 0;
-			getCharacterParams(kCharacterCond2, 8)[4] = 0;
-			getCharacterParams(kCharacterCond2, 8)[3] = 0;
-			getCharacterParams(kCharacterCond2, 8)[10] = 0;
-			getCharacterParams(kCharacterCond2, 8)[12] = 0;
-			getCharacterParams(kCharacterCond2, 8)[13] = 0;
-			getCharacterParams(kCharacterCond2, 8)[15] = 0;
-			getCharacterParams(kCharacterCond2, 8)[19] = 0;
-			getCharacterParams(kCharacterCond2, 8)[20] = 0;
-			getCharacterParams(kCharacterCond2, 8)[11] = 0;
-			getCharacterParams(kCharacterCond2, 8)[14] = 0;
-			getCharacterParams(kCharacterCond2, 8)[9] = 0;
-			getCharacterParams(kCharacterCond2, 8)[1] = 1;
-			setModel(111, 6);
-		} else if (msg->action == 18 && getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] == 1) {
-			CONS_Cond2_SittingDay3(0, 0, 0, 0);
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 1;
 		Cond2Call(&LogicManager::CONS_Cond2_SitDown, 0, 0, 0, 0);
+		break;
+	case 12:
+		endGraphics(kCharacterCond2);
+		getCharacter(kCharacterCond2).characterPosition.car = kCarRedSleeping;
+		getCharacter(kCharacterCond2).characterPosition.position = 1500;
+		getCharacter(kCharacterCond2).characterPosition.location = 0;
+		getCharacter(kCharacterCond2).clothes = 0;
+		getCharacter(kCharacterCond2).inventoryItem = 0;
+		getCharacterParams(kCharacterCond2, 8)[7] = 0;
+		getCharacterParams(kCharacterCond2, 8)[8] = 0;
+		getCharacterParams(kCharacterCond2, 8)[2] = 0;
+		getCharacterParams(kCharacterCond2, 8)[4] = 0;
+		getCharacterParams(kCharacterCond2, 8)[3] = 0;
+		getCharacterParams(kCharacterCond2, 8)[10] = 0;
+		getCharacterParams(kCharacterCond2, 8)[12] = 0;
+		getCharacterParams(kCharacterCond2, 8)[13] = 0;
+		getCharacterParams(kCharacterCond2, 8)[15] = 0;
+		getCharacterParams(kCharacterCond2, 8)[19] = 0;
+		getCharacterParams(kCharacterCond2, 8)[20] = 0;
+		getCharacterParams(kCharacterCond2, 8)[11] = 0;
+		getCharacterParams(kCharacterCond2, 8)[14] = 0;
+		getCharacterParams(kCharacterCond2, 8)[9] = 0;
+		getCharacterParams(kCharacterCond2, 8)[1] = 1;
+		setModel(111, 6);
+		break;
+	case 18:
+		if (getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] == 1) {
+			CONS_Cond2_SittingDay3(0, 0, 0, 0);
+		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -2961,232 +3424,373 @@ void LogicManager::CONS_Cond2_SittingDay3(CONS_PARAMS) {
 
 	params->clear();
 
-	fedEx(kCharacterCond2, kCharacterCond2, 12, 0);
-}
+	fedEx(kCharacterCond2, kCharacterCond2, 12, 0);
+}
+
+void LogicManager::HAND_Cond2_SittingDay3(HAND_PARAMS) {
+	switch (msg->action) {
+	case 0:
+		if (getCharacterParams(kCharacterCond2, 8)[7]) {
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 1;
+			Cond2Call(&LogicManager::CONS_Cond2_TatianaLockUnlockMyComp, 1, 0, 0, 0);
+			break;
+		}
+
+		if (getCharacterParams(kCharacterCond2, 8)[8]) {
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 2;
+			Cond2Call(&LogicManager::CONS_Cond2_TatianaLockUnlockMyComp, 0, 0, 0, 0);
+			break;
+		}
+
+		if (getCharacterParams(kCharacterCond2, 8)[2]) {
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 3;
+			Cond2Call(&LogicManager::CONS_Cond2_Listen, 9, 0, 0, 0);
+			break;
+		}
+
+		if (getCharacterParams(kCharacterCond2, 8)[4]) {
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 4;
+			Cond2Call(&LogicManager::CONS_Cond2_Listen, 3, 0, 0, 0);
+			break;
+		}
+
+		if (getCharacterParams(kCharacterCond2, 8)[10]) {
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 5;
+			Cond2Call(&LogicManager::CONS_Cond2_AnnaTakeMax, 0, 0, 0, 0);
+			break;
+		}
+
+		if (getCharacterParams(kCharacterCond2, 8)[12]) {
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 6;
+			Cond2Call(&LogicManager::CONS_Cond2_AnnaLockMe, 1, 0, 0, 0);
+			break;
+		}
+
+		if (getCharacterParams(kCharacterCond2, 8)[13]) {
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 7;
+			Cond2Call(&LogicManager::CONS_Cond2_AnnaLockMe, 0, 0, 0, 0);
+			break;
+		}
+
+		if (getCharacterParams(kCharacterCond2, 8)[15]) {
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 8;
+			Cond2Call(&LogicManager::CONS_Cond2_AnnaUnlockMe, 0, 0, 0, 0);
+			break;
+		}
+
+		if (getCharacterParams(kCharacterCond2, 8)[19]) {
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 9;
+			Cond2Call(&LogicManager::CONS_Cond2_InviteTatiana, 0, 0, 0, 0);
+			break;
+		}
+
+		if (getCharacterParams(kCharacterCond2, 8)[11]) {
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 10;
+			Cond2Call(&LogicManager::CONS_Cond2_TakeMaxBack, 1, 0, 0, 0);
+			break;
+		}
+
+		if (getCharacterParams(kCharacterCond2, 8)[14]) {
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 11;
+			Cond2Call(&LogicManager::CONS_Cond2_TakeMaxBack, 0, 0, 0, 0);
+			break;
+		}
+
+		if (getCharacterParams(kCharacterCond2, 8)[3]) {
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 12;
+			Cond2Call(&LogicManager::CONS_Cond2_Listen, 21, 0, 0, 0);
+			break;
+		}
+
+		if (getCharacterParams(kCharacterCond2, 8)[20] && _gameTime > 2056500 && _gameTime < 1417500) {
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 13;
+			Cond2Call(&LogicManager::CONS_Cond2_InviteRebecca, 0, 0, 0, 0);
+			break;
+		}
+
+		if (_gameTime > 2088900 && !getCharacterCurrentParams(kCharacterCond2)[0]) {
+			getCharacterCurrentParams(kCharacterCond2)[0] = 1;
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 14;
+			Cond2Call(&LogicManager::CONS_Cond2_BathroomTrip, 0, 0, 0, 0);
+			break;
+		}
+
+		if (_gameTime > 2119500 && !getCharacterCurrentParams(kCharacterCond2)[1]) {
+			getCharacterCurrentParams(kCharacterCond2)[1] = 1;
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 15;
+			Cond2Call(&LogicManager::CONS_Cond2_BathroomTrip, 0, 0, 0, 0);
+			break;
+		}
+
+		if (_gameTime > 2138400 && !getCharacterCurrentParams(kCharacterCond2)[2]) {
+			getCharacterCurrentParams(kCharacterCond2)[2] = 1;
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 16;
+			Cond2Call(&LogicManager::CONS_Cond2_BathroomTrip, 0, 0, 0, 0);
+			break;
+		}
+
+		if (_gameTime > 2147400 && !getCharacterCurrentParams(kCharacterCond2)[3]) {
+			getCharacterCurrentParams(kCharacterCond2)[3] = 1;
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 17;
+			Cond2Call(&LogicManager::CONS_Cond2_BathroomTrip, 0, 0, 0, 0);
+			break;
+		}
+
+		if (_gameTime > 2160000 && !getCharacterCurrentParams(kCharacterCond2)[4]) {
+			getCharacterCurrentParams(kCharacterCond2)[4] = 1;
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 18;
+			Cond2Call(&LogicManager::CONS_Cond2_BathroomTrip, 0, 0, 0, 0);
+			break;
+		}
+
+		if (_gameTime > 2205000 && !getCharacterCurrentParams(kCharacterCond2)[5]) {
+			getCharacterCurrentParams(kCharacterCond2)[5] = 1;
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 19;
+			Cond2Call(&LogicManager::CONS_Cond2_BathroomTrip, 0, 0, 0, 0);
+			break;
+		}
+
+		if (getCharacterParams(kCharacterCond2, 8)[1]) {
+			if (_gameTime > 2025000 && !getCharacterCurrentParams(kCharacterCond2)[6]) {
+				getCharacterCurrentParams(kCharacterCond2)[6] = 1;
+				setModel(111, 7);
+			}
+			if (_gameTime > 2133000 && !getCharacterCurrentParams(kCharacterCond2)[7]) {
+				getCharacterCurrentParams(kCharacterCond2)[7] = 1;
+				setModel(111, 8);
+			}
+			if (_gameTime > 2173500 && !getCharacterCurrentParams(kCharacterCond2)[8]) {
+				getCharacterCurrentParams(kCharacterCond2)[8] = 1;
+				setModel(111, 9);
+			}
+		}
+
+		break;
+	case 11:
+		if (!getCharacterParams(kCharacterCond2, 8)[16]) {
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 20;
+			Cond2Call(&LogicManager::CONS_Cond2_Passing, msg->param, msg->sender, 0, 0);
+		}
+
+		break;
+	case 17:
+		if (!getCharacterParams(kCharacterCond2, 8)[16]) {
+			if (checkCathDir(kCarRedSleeping, 1)) {
+				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 21;
+				Cond2Call(&LogicManager::CONS_Cond2_Passing, 1, 0, 0, 0);
+			} else if (checkCathDir(kCarRedSleeping, 23)) {
+				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 22;
+				Cond2Call(&LogicManager::CONS_Cond2_Passing, 0, 0, 0, 0);
+			}
+		}
+
+		break;
+	case 18:
+		switch (getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8]) {
+		case 1:
+			if (getCharacterParams(kCharacterCond2, 8)[8]) {
+				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 2;
+				Cond2Call(&LogicManager::CONS_Cond2_TatianaLockUnlockMyComp, 0, 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 2:
+			if (getCharacterParams(kCharacterCond2, 8)[2]) {
+				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 3;
+				Cond2Call(&LogicManager::CONS_Cond2_Listen, 9, 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 3:
+			if (getCharacterParams(kCharacterCond2, 8)[4]) {
+				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 4;
+				Cond2Call(&LogicManager::CONS_Cond2_Listen, 3, 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 4:
+			if (getCharacterParams(kCharacterCond2, 8)[10]) {
+				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 5;
+				Cond2Call(&LogicManager::CONS_Cond2_AnnaTakeMax, 0, 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 5:
+			if (getCharacterParams(kCharacterCond2, 8)[12]) {
+				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 6;
+				Cond2Call(&LogicManager::CONS_Cond2_AnnaLockMe, 1, 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 6:
+			if (getCharacterParams(kCharacterCond2, 8)[13]) {
+				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 7;
+				Cond2Call(&LogicManager::CONS_Cond2_AnnaLockMe, 0, 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 7:
+			if (getCharacterParams(kCharacterCond2, 8)[15]) {
+				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 8;
+				Cond2Call(&LogicManager::CONS_Cond2_AnnaUnlockMe, 0, 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 8:
+			if (getCharacterParams(kCharacterCond2, 8)[19]) {
+				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 9;
+				Cond2Call(&LogicManager::CONS_Cond2_InviteTatiana, 0, 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 9:
+			if (getCharacterParams(kCharacterCond2, 8)[11]) {
+				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 10;
+				Cond2Call(&LogicManager::CONS_Cond2_TakeMaxBack, 1, 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 10:
+			if (getCharacterParams(kCharacterCond2, 8)[14]) {
+				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 11;
+				Cond2Call(&LogicManager::CONS_Cond2_TakeMaxBack, 0, 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 11:
+			if (getCharacterParams(kCharacterCond2, 8)[3]) {
+				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 12;
+				Cond2Call(&LogicManager::CONS_Cond2_Listen, 21, 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 12:
+			if (getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] == 12) {
+				send(kCharacterCond2, kCharacterTrainM, 168255788, 0);
+			}
+
+			if (getCharacterParams(kCharacterCond2, 8)[20] && _gameTime > 2056500 && _gameTime < 1417500) {
+				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 13;
+				Cond2Call(&LogicManager::CONS_Cond2_InviteRebecca, 0, 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 13:
+			if (_gameTime > 2088900 && !getCharacterCurrentParams(kCharacterCond2)[0]) {
+				getCharacterCurrentParams(kCharacterCond2)[0] = 1;
+				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 14;
+				Cond2Call(&LogicManager::CONS_Cond2_BathroomTrip, 0, 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 14:
+			if (_gameTime > 2119500 && !getCharacterCurrentParams(kCharacterCond2)[1]) {
+				getCharacterCurrentParams(kCharacterCond2)[1] = 1;
+				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 15;
+				Cond2Call(&LogicManager::CONS_Cond2_BathroomTrip, 0, 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 15:
+			if (_gameTime > 2138400 && !getCharacterCurrentParams(kCharacterCond2)[2]) {
+				getCharacterCurrentParams(kCharacterCond2)[2] = 1;
+				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 16;
+				Cond2Call(&LogicManager::CONS_Cond2_BathroomTrip, 0, 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 16:
+			if (_gameTime > 2147400 && !getCharacterCurrentParams(kCharacterCond2)[3]) {
+				getCharacterCurrentParams(kCharacterCond2)[3] = 1;
+				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 17;
+				Cond2Call(&LogicManager::CONS_Cond2_BathroomTrip, 0, 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 17:
+			if (_gameTime > 2160000 && !getCharacterCurrentParams(kCharacterCond2)[4]) {
+				getCharacterCurrentParams(kCharacterCond2)[4] = 1;
+				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 18;
+				Cond2Call(&LogicManager::CONS_Cond2_BathroomTrip, 0, 0, 0, 0);
+				break;
+			}
 
-void LogicManager::HAND_Cond2_SittingDay3(HAND_PARAMS) {
-	if (msg->action > 11) {
-		if (msg->action > 225358684) {
-			if (msg->action == 226078300) {
-				if (!getCharacterParams(kCharacterCond2, 8)[16] && !getCharacterParams(kCharacterCond2, 8)[0]) {
-					playDialog(kCharacterCond2, "JAC2020", -1, 0);
-					getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 23;
-					Cond2Call(&LogicManager::CONS_Cond2_DoSeqOtis, "697D", 0, 0, 0);
-				}
-			} else if (msg->action == 305159806 && !getCharacterParams(kCharacterCond2, 8)[16] && !getCharacterParams(kCharacterCond2, 8)[0]) {
-				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 26;
-				Cond2Call(&LogicManager::CONS_Cond2_CathRattling, msg->param, 0, 0, 0);
+			// fall through
+		case 18:
+			if (_gameTime > 2205000 && !getCharacterCurrentParams(kCharacterCond2)[5]) {
+				getCharacterCurrentParams(kCharacterCond2)[5] = 1;
+				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 19;
+				Cond2Call(&LogicManager::CONS_Cond2_BathroomTrip, 0, 0, 0, 0);
+				break;
 			}
-		} else {
-			switch (msg->action) {
-			case 225358684:
-				if (!getCharacterParams(kCharacterCond2, 8)[0]) {
-					getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 25;
-					Cond2Call(&LogicManager::CONS_Cond2_CathBuzzing, msg->param, 0, 0, 0);
+
+			// fall through
+		case 19:
+			if (getCharacterParams(kCharacterCond2, 8)[1]) {
+				if (_gameTime > 2025000 && !getCharacterCurrentParams(kCharacterCond2)[6]) {
+					getCharacterCurrentParams(kCharacterCond2)[6] = 1;
+					setModel(111, 7);
 				}
-				break;
-			case 17:
-				if (!getCharacterParams(kCharacterCond2, 8)[16]) {
-					if (checkCathDir(kCarRedSleeping, 1)) {
-						getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 21;
-						Cond2Call(&LogicManager::CONS_Cond2_Passing, 1, 0, 0, 0);
-					} else if (checkCathDir(kCarRedSleeping, 23)) {
-						getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 22;
-						Cond2Call(&LogicManager::CONS_Cond2_Passing, 0, 0, 0, 0);
-					}
+				if (_gameTime > 2133000 && !getCharacterCurrentParams(kCharacterCond2)[7]) {
+					getCharacterCurrentParams(kCharacterCond2)[7] = 1;
+					setModel(111, 8);
 				}
-				break;
-			case 18:
-				switch (getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8]) {
-				case 1:
-					goto LABEL_29;
-				case 2:
-					goto LABEL_31;
-				case 3:
-					goto LABEL_33;
-				case 4:
-					goto LABEL_35;
-				case 5:
-					goto LABEL_37;
-				case 6:
-					goto LABEL_39;
-				case 7:
-					goto LABEL_41;
-				case 8:
-					goto LABEL_43;
-				case 9:
-					goto LABEL_45;
-				case 10:
-					goto LABEL_47;
-				case 11:
-					goto LABEL_49;
-				case 12:
-					send(kCharacterCond2, kCharacterTrainM, 168255788, 0);
-					goto LABEL_24;
-				case 13:
-					goto LABEL_51;
-				case 14:
-					goto LABEL_54;
-				case 15:
-					goto LABEL_57;
-				case 16:
-					goto LABEL_60;
-				case 17:
-					goto LABEL_63;
-				case 18:
-					goto LABEL_66;
-				case 19:
-					goto LABEL_69;
-				case 23:
-					getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 24;
-					Cond2Call(&LogicManager::CONS_Cond2_SitDown, 0, 0, 0, 0);
-					break;
-				default:
-					return;
+				if (_gameTime > 2173500 && !getCharacterCurrentParams(kCharacterCond2)[8]) {
+					getCharacterCurrentParams(kCharacterCond2)[8] = 1;
+					setModel(111, 9);
 				}
-				break;
 			}
+
+			break;
+		case 23:
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 24;
+			Cond2Call(&LogicManager::CONS_Cond2_SitDown, 0, 0, 0, 0);
+			break;
+		default:
+			break;
 		}
-	} else if (msg->action == 11) {
-		if (!getCharacterParams(kCharacterCond2, 8)[16]) {
-			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 20;
-			Cond2Call(&LogicManager::CONS_Cond2_Passing, msg->param, msg->sender, 0, 0);
+
+		break;
+	case 225358684:
+		if (!getCharacterParams(kCharacterCond2, 8)[0]) {
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 25;
+			Cond2Call(&LogicManager::CONS_Cond2_CathBuzzing, msg->param, 0, 0, 0);
 		}
-	} else if (msg->action == 0) {
-		if (getCharacterParams(kCharacterCond2, 8)[7]) {
-			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 1;
-			Cond2Call(&LogicManager::CONS_Cond2_TatianaLockUnlockMyComp, 1, 0, 0, 0);
-		} else {
-		LABEL_29:
-			if (getCharacterParams(kCharacterCond2, 8)[8]) {
-				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 2;
-				Cond2Call(&LogicManager::CONS_Cond2_TatianaLockUnlockMyComp, 0, 0, 0, 0);
-			} else {
-			LABEL_31:
-				if (getCharacterParams(kCharacterCond2, 8)[2]) {
-					getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 3;
-					Cond2Call(&LogicManager::CONS_Cond2_Listen, 9, 0, 0, 0);
-				} else {
-				LABEL_33:
-					if (getCharacterParams(kCharacterCond2, 8)[4]) {
-						getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 4;
-						Cond2Call(&LogicManager::CONS_Cond2_Listen, 3, 0, 0, 0);
-					} else {
-					LABEL_35:
-						if (getCharacterParams(kCharacterCond2, 8)[10]) {
-							getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 5;
-							Cond2Call(&LogicManager::CONS_Cond2_AnnaTakeMax, 0, 0, 0, 0);
-						} else {
-						LABEL_37:
-							if (getCharacterParams(kCharacterCond2, 8)[12]) {
-								getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 6;
-								Cond2Call(&LogicManager::CONS_Cond2_AnnaLockMe, 1, 0, 0, 0);
-							} else {
-							LABEL_39:
-								if (getCharacterParams(kCharacterCond2, 8)[13]) {
-									getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 7;
-									Cond2Call(&LogicManager::CONS_Cond2_AnnaLockMe, 0, 0, 0, 0);
-								} else {
-								LABEL_41:
-									if (getCharacterParams(kCharacterCond2, 8)[15]) {
-										getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 8;
-										Cond2Call(&LogicManager::CONS_Cond2_AnnaUnlockMe, 0, 0, 0, 0);
-									} else {
-									LABEL_43:
-										if (getCharacterParams(kCharacterCond2, 8)[19]) {
-											getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 9;
-											Cond2Call(&LogicManager::CONS_Cond2_InviteTatiana, 0, 0, 0, 0);
-										} else {
-										LABEL_45:
-											if (getCharacterParams(kCharacterCond2, 8)[11]) {
-												getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 10;
-												Cond2Call(&LogicManager::CONS_Cond2_TakeMaxBack, 1, 0, 0, 0);
-											} else {
-											LABEL_47:
-												if (getCharacterParams(kCharacterCond2, 8)[14]) {
-													getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 11;
-													Cond2Call(&LogicManager::CONS_Cond2_TakeMaxBack, 0, 0, 0, 0);
-												} else {
-												LABEL_49:
-													if (getCharacterParams(kCharacterCond2, 8)[3]) {
-														getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 12;
-														Cond2Call(&LogicManager::CONS_Cond2_Listen, 21, 0, 0, 0);
-													} else {
-													LABEL_24:
-														if (getCharacterParams(kCharacterCond2, 8)[20] && _gameTime > 2056500 && _gameTime < 1417500) {
-															getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 13;
-															Cond2Call(&LogicManager::CONS_Cond2_InviteRebecca, 0, 0, 0, 0);
-														} else {
-														LABEL_51:
-															if (_gameTime <= 2088900 || getCharacterCurrentParams(kCharacterCond2)[0]) {
-															LABEL_54:
-																if (_gameTime <= 2119500 || getCharacterCurrentParams(kCharacterCond2)[1]) {
-																LABEL_57:
-																	if (_gameTime <= 2138400 || getCharacterCurrentParams(kCharacterCond2)[2]) {
-																	LABEL_60:
-																		if (_gameTime <= 2147400 || getCharacterCurrentParams(kCharacterCond2)[3]) {
-																		LABEL_63:
-																			if (_gameTime <= 2160000 || getCharacterCurrentParams(kCharacterCond2)[4]) {
-																			LABEL_66:
-																				if (_gameTime <= 2205000 || getCharacterCurrentParams(kCharacterCond2)[5]) {
-																				LABEL_69:
-																					if (getCharacterParams(kCharacterCond2, 8)[1]) {
-																						if (_gameTime > 2025000 && !getCharacterCurrentParams(kCharacterCond2)[6]) {
-																							getCharacterCurrentParams(kCharacterCond2)[6] = 1;
-																							setModel(111, 7);
-																						}
-																						if (_gameTime > 2133000 && !getCharacterCurrentParams(kCharacterCond2)[7]) {
-																							getCharacterCurrentParams(kCharacterCond2)[7] = 1;
-																							setModel(111, 8);
-																						}
-																						if (_gameTime > 2173500 && !getCharacterCurrentParams(kCharacterCond2)[8]) {
-																							getCharacterCurrentParams(kCharacterCond2)[8] = 1;
-																							setModel(111, 9);
-																						}
-																					}
-																				} else {
-																					getCharacterCurrentParams(kCharacterCond2)[5] = 1;
-																					getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 19;
-																					Cond2Call(&LogicManager::CONS_Cond2_BathroomTrip, 0, 0, 0, 0);
-																				}
-																			} else {
-																				getCharacterCurrentParams(kCharacterCond2)[4] = 1;
-																				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 18;
-																				Cond2Call(&LogicManager::CONS_Cond2_BathroomTrip, 0, 0, 0, 0);
-																			}
-																		} else {
-																			getCharacterCurrentParams(kCharacterCond2)[3] = 1;
-																			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 17;
-																			Cond2Call(&LogicManager::CONS_Cond2_BathroomTrip, 0, 0, 0, 0);
-																		}
-																	} else {
-																		getCharacterCurrentParams(kCharacterCond2)[2] = 1;
-																		getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 16;
-																		Cond2Call(&LogicManager::CONS_Cond2_BathroomTrip, 0, 0, 0, 0);
-																	}
-																} else {
-																	getCharacterCurrentParams(kCharacterCond2)[1] = 1;
-																	getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 15;
-																	Cond2Call(&LogicManager::CONS_Cond2_BathroomTrip, 0, 0, 0, 0);
-																}
-															} else {
-																getCharacterCurrentParams(kCharacterCond2)[0] = 1;
-																getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 14;
-																Cond2Call(&LogicManager::CONS_Cond2_BathroomTrip, 0, 0, 0, 0);
-															}
-														}
-													}
-												}
-											}
-										}
-									}
-								}
-							}
-						}
-					}
-				}
-			}
+
+		break;
+	case 226078300:
+		if (!getCharacterParams(kCharacterCond2, 8)[16] && !getCharacterParams(kCharacterCond2, 8)[0]) {
+			playDialog(kCharacterCond2, "JAC2020", -1, 0);
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 23;
+			Cond2Call(&LogicManager::CONS_Cond2_DoSeqOtis, "697D", 0, 0, 0);
+		}
+
+		break;
+	case 305159806:
+		if (!getCharacterParams(kCharacterCond2, 8)[16] && !getCharacterParams(kCharacterCond2, 8)[0]) {
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 26;
+			Cond2Call(&LogicManager::CONS_Cond2_CathRattling, msg->param, 0, 0, 0);
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -3201,10 +3805,12 @@ void LogicManager::CONS_Cond2_AnnaTakeMax(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Cond2_AnnaTakeMax(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 1;
 		Cond2Call(&LogicManager::CONS_Cond2_GetUp, 0, 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8]) {
 		case 1:
 			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 2;
@@ -3234,9 +3840,9 @@ void LogicManager::HAND_Cond2_AnnaTakeMax(HAND_PARAMS) {
 		case 6:
 			startCycOtis(kCharacterCond2, "629Cf");
 			softBlockAtDoor(kCharacterCond2, 37);
-			goto LABEL_12;
+
+			// fall through
 		case 7:
-		LABEL_12:
 			if (whoRunningDialog(kCharacterCond2)) {
 				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 7;
 				Cond2Call(&LogicManager::CONS_Cond2_DoWait, 75, 0, 0, 0);
@@ -3244,6 +3850,7 @@ void LogicManager::HAND_Cond2_AnnaTakeMax(HAND_PARAMS) {
 				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 8;
 				Cond2Call(&LogicManager::CONS_Cond2_DoDialog, "Ann3122", 0, 0, 0);
 			}
+
 			break;
 		case 8:
 			playDialog(kCharacterCond2, "Ann3123", -1, 0);
@@ -3266,8 +3873,12 @@ void LogicManager::HAND_Cond2_AnnaTakeMax(HAND_PARAMS) {
 			fedEx(kCharacterCond2, kCharacterCond2, 18, 0);
 			break;
 		default:
-			return;
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -3284,10 +3895,12 @@ void LogicManager::CONS_Cond2_AnnaLockMe(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Cond2_AnnaLockMe(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 1;
 		Cond2Call(&LogicManager::CONS_Cond2_GetUp, 0, 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8]) {
 		case 1:
 			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 2;
@@ -3300,9 +3913,9 @@ void LogicManager::HAND_Cond2_AnnaLockMe(HAND_PARAMS) {
 		case 3:
 			startCycOtis(kCharacterCond2, "627Wf");
 			softBlockAtDoor(kCharacterCond2, 37);
-			goto LABEL_9;
+
+			// fall through
 		case 4:
-		LABEL_9:
 			if (whoRunningDialog(kCharacterCond2)) {
 				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 4;
 				Cond2Call(&LogicManager::CONS_Cond2_DoWait, 225, 0, 0, 0);
@@ -3315,6 +3928,7 @@ void LogicManager::HAND_Cond2_AnnaLockMe(HAND_PARAMS) {
 					Cond2Call(&LogicManager::CONS_Cond2_DoDialog, "Ann3149", 0, 0, 0);
 				}
 			}
+
 			break;
 		case 5:
 			softReleaseAtDoor(kCharacterCond2, 37);
@@ -3334,8 +3948,12 @@ void LogicManager::HAND_Cond2_AnnaLockMe(HAND_PARAMS) {
 			fedEx(kCharacterCond2, kCharacterCond2, 18, 0);
 			break;
 		default:
-			return;
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -3350,10 +3968,12 @@ void LogicManager::CONS_Cond2_AnnaUnlockMe(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Cond2_AnnaUnlockMe(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 1;
 		Cond2Call(&LogicManager::CONS_Cond2_GetUp, 0, 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8]) {
 		case 1:
 			playDialog(kCharacterCond2, "Ann3148A", -1, 0);
@@ -3386,8 +4006,12 @@ void LogicManager::HAND_Cond2_AnnaUnlockMe(HAND_PARAMS) {
 			fedEx(kCharacterCond2, kCharacterCond2, 18, 0);
 			break;
 		default:
-			return;
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -3402,10 +4026,12 @@ void LogicManager::CONS_Cond2_InviteTatiana(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Cond2_InviteTatiana(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 1;
 		Cond2Call(&LogicManager::CONS_Cond2_GetUp, 0, 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8]) {
 		case 1:
 			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 2;
@@ -3426,6 +4052,7 @@ void LogicManager::HAND_Cond2_InviteTatiana(HAND_PARAMS) {
 				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 8;
 				Cond2Call(&LogicManager::CONS_Cond2_DoDialog, "LIB012", 0, 0, 0);
 			}
+
 			break;
 		case 4:
 			softReleaseAtDoor(kCharacterCond2, 33);
@@ -3444,14 +4071,15 @@ void LogicManager::HAND_Cond2_InviteTatiana(HAND_PARAMS) {
 			break;
 		case 7:
 			getCharacter(kCharacterCond2).characterPosition.location = 0;
-			goto LABEL_17;
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 10;
+			Cond2Call(&LogicManager::CONS_Cond2_DoWalk, 4, 2000, 0, 0);
+			break;
 		case 8:
 			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 9;
 			Cond2Call(&LogicManager::CONS_Cond2_DoWait, 0x96, 0, 0, 0);
 			break;
 		case 9:
 			softReleaseAtDoor(kCharacterCond2, 33);
-		LABEL_17:
 			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 10;
 			Cond2Call(&LogicManager::CONS_Cond2_DoWalk, 4, 2000, 0, 0);
 			break;
@@ -3468,8 +4096,12 @@ void LogicManager::HAND_Cond2_InviteTatiana(HAND_PARAMS) {
 			fedEx(kCharacterCond2, kCharacterCond2, 18, 0);
 			break;
 		default:
-			return;
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -3484,10 +4116,12 @@ void LogicManager::CONS_Cond2_InviteRebecca(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Cond2_InviteRebecca(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 1;
 		Cond2Call(&LogicManager::CONS_Cond2_GetUp, 0, 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8]) {
 		case 1:
 			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 2;
@@ -3502,11 +4136,14 @@ void LogicManager::HAND_Cond2_InviteRebecca(HAND_PARAMS) {
 		case 3:
 			if (!inComp(kCharacterRebecca, kCarRedSleeping, 4840)) {
 				softReleaseAtDoor(kCharacterCond2, 36);
-				goto LABEL_15;
+				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 8;
+				Cond2Call(&LogicManager::CONS_Cond2_DoWalk, 4, 2000, 0, 0);
+			} else {
+				startCycOtis(kCharacterCond2, "627Ne");
+				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 4;
+				Cond2Call(&LogicManager::CONS_Cond2_DoDialog, "Jac3005", 0, 0, 0);
 			}
-			startCycOtis(kCharacterCond2, "627Ne");
-			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 4;
-			Cond2Call(&LogicManager::CONS_Cond2_DoDialog, "Jac3005", 0, 0, 0);
+
 			break;
 		case 4:
 			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 5;
@@ -3525,7 +4162,6 @@ void LogicManager::HAND_Cond2_InviteRebecca(HAND_PARAMS) {
 			break;
 		case 7:
 			getCharacter(kCharacterCond2).characterPosition.location = 0;
-		LABEL_15:
 			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 8;
 			Cond2Call(&LogicManager::CONS_Cond2_DoWalk, 4, 2000, 0, 0);
 			break;
@@ -3540,8 +4176,12 @@ void LogicManager::HAND_Cond2_InviteRebecca(HAND_PARAMS) {
 			fedEx(kCharacterCond2, kCharacterCond2, 18, 0);
 			break;
 		default:
-			return;
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -3556,80 +4196,95 @@ void LogicManager::CONS_Cond2_TatianaComeHere(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Cond2_TatianaComeHere(HAND_PARAMS) {
-	if (msg->action > 9) {
-		if (msg->action > 18) {
-			if (msg->action == 168316032) {
-				setDoor(32, 4, 0, 0, 9);
-				setDoor(33, 4, 1, 0, 9);
-			} else if (msg->action == 235061888) {
-				softReleaseAtDoor(kCharacterCond2, 33);
-				setDoor(32, 0, 0, 10, 9);
-				setDoor(33, 0, 1, 10, 9);
-				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 5;
-				Cond2Call(&LogicManager::CONS_Cond2_DoWalk, 4, 2000, 0, 0);
-			}
-		} else if (msg->action == 18) {
-			switch (getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8]) {
-			case 1:
-				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 2;
-				Cond2Call(&LogicManager::CONS_Cond2_SitDown, 0, 0, 0, 0);
-				break;
-			case 2:
-			case 4:
-			case 6:
-				CONS_Cond2_SittingDay3(0, 0, 0, 0);
-				break;
-			case 3:
-				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 4;
-				Cond2Call(&LogicManager::CONS_Cond2_SitDown, 0, 0, 0, 0);
-				break;
-			case 5:
-				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 6;
-				Cond2Call(&LogicManager::CONS_Cond2_SitDown, 0, 0, 0, 0);
-				break;
-			default:
-				return;
-			}
-		} else if (msg->action == 12) {
-			getCharacter(kCharacterCond2).characterPosition.car = 4;
-			getCharacter(kCharacterCond2).characterPosition.position = 7500;
-			getCharacter(kCharacterCond2).characterPosition.location = 0;
-			send(kCharacterCond2, kCharacterMax, 135204609, 0);
-			if (getCharacterParams(kCharacterCond2, 8)[4]) {
-				send(kCharacterCond2, kCharacterCond1, 155853632, 0);
-				send(kCharacterCond2, kCharacterCond1, 2, 0);
-				getCharacterParams(kCharacterCond2, 8)[4] = 0;
-			}
-			if (getCharacterParams(kCharacterCond2, 8)[2]) {
-				send(kCharacterCond2, kCharacterTrainM, 155853632, 0);
-				send(kCharacterCond2, kCharacterTrainM, 2, 0);
-				getCharacterParams(kCharacterCond2, 8)[2] = 0;
-			}
-			startCycOtis(kCharacterCond2, "627Wb");
-			softBlockAtDoor(kCharacterCond2, 33);
-			send(kCharacterCond2, kCharacterTatiana, 154071333, 0);
+	switch (msg->action) {
+	case 0:
+		if (_gameTime > 2133000 && !_gameProgress[kProgressField40]) {
+			softReleaseAtDoor(kCharacterCond2, 33);
+			setDoor(32, kCharacterCath, 0, 10, 9);
+			setDoor(33, kCharacterCath, 1, 10, 9);
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 1;
+			Cond2Call(&LogicManager::CONS_Cond2_DoWalk, 4, 2000, 0, 0);
 		}
-	} else if (msg->action == 9) {
+
+		break;
+	case 9:
 		if (msg->param.intParam == 33)
 			getCharacter(kCharacterCond2).characterPosition.position = 7500;
+
 		playDialog(0, "LIB014", -1, 0);
 		playNIS(kEventCoudertGoingOutOfVassiliCompartment);
 		walk(kCharacterCond2, kCarRedSleeping, 2000);
+
 		if (msg->param.intParam == 33)
 			bumpCathRDoor(33);
 		else
 			bumpCathRDoor(32);
+
 		softReleaseAtDoor(kCharacterCond2, 33);
-		setDoor(32, 0, 0, 10, 9);
-		setDoor(33, 0, 1, 10, 9);
+		setDoor(32, kCharacterCath, 0, 10, 9);
+		setDoor(33, kCharacterCath, 1, 10, 9);
 		getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 3;
 		Cond2Call(&LogicManager::CONS_Cond2_DoWalk, 4, 2000, 0, 0);
-	} else if (msg->action == 0 && _gameTime > 2133000 && !_gameProgress[kProgressField40]) {
+		break;
+	case 12:
+		getCharacter(kCharacterCond2).characterPosition.car = kCarRedSleeping;
+		getCharacter(kCharacterCond2).characterPosition.position = 7500;
+		getCharacter(kCharacterCond2).characterPosition.location = 0;
+		send(kCharacterCond2, kCharacterMax, 135204609, 0);
+
+		if (getCharacterParams(kCharacterCond2, 8)[4]) {
+			send(kCharacterCond2, kCharacterCond1, 155853632, 0);
+			send(kCharacterCond2, kCharacterCond1, 2, 0);
+			getCharacterParams(kCharacterCond2, 8)[4] = 0;
+		}
+
+		if (getCharacterParams(kCharacterCond2, 8)[2]) {
+			send(kCharacterCond2, kCharacterTrainM, 155853632, 0);
+			send(kCharacterCond2, kCharacterTrainM, 2, 0);
+			getCharacterParams(kCharacterCond2, 8)[2] = 0;
+		}
+
+		startCycOtis(kCharacterCond2, "627Wb");
+		softBlockAtDoor(kCharacterCond2, 33);
+		send(kCharacterCond2, kCharacterTatiana, 154071333, 0);
+		break;
+	case 18:
+		switch (getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8]) {
+		case 1:
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 2;
+			Cond2Call(&LogicManager::CONS_Cond2_SitDown, 0, 0, 0, 0);
+			break;
+		case 2:
+		case 4:
+		case 6:
+			CONS_Cond2_SittingDay3(0, 0, 0, 0);
+			break;
+		case 3:
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 4;
+			Cond2Call(&LogicManager::CONS_Cond2_SitDown, 0, 0, 0, 0);
+			break;
+		case 5:
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 6;
+			Cond2Call(&LogicManager::CONS_Cond2_SitDown, 0, 0, 0, 0);
+			break;
+		default:
+			break;
+		}
+
+		break;
+	case 168316032:
+		setDoor(32, kCharacterCond2, 0, 0, 9);
+		setDoor(33, kCharacterCond2, 1, 0, 9);
+		break;
+	case 235061888:
 		softReleaseAtDoor(kCharacterCond2, 33);
-		setDoor(32, 0, 0, 10, 9);
-		setDoor(33, 0, 1, 10, 9);
-		getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 1;
+		setDoor(32, kCharacterCath, 0, 10, 9);
+		setDoor(33, kCharacterCath, 1, 10, 9);
+		getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 5;
 		Cond2Call(&LogicManager::CONS_Cond2_DoWalk, 4, 2000, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -3644,35 +4299,42 @@ void LogicManager::CONS_Cond2_StartPart4(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Cond2_StartPart4(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			endGraphics(kCharacterCond2);
-			getCharacter(kCharacterCond2).characterPosition.car = kCarRedSleeping;
-			getCharacter(kCharacterCond2).characterPosition.position = 1500;
-			getCharacter(kCharacterCond2).characterPosition.location = 0;
-			getCharacter(kCharacterCond2).clothes = 0;
-			getCharacterParams(kCharacterCond2, 8)[18] = 0;
-			getCharacterParams(kCharacterCond2, 8)[7] = 0;
-			getCharacterParams(kCharacterCond2, 8)[8] = 0;
-			getCharacterParams(kCharacterCond2, 8)[2] = 0;
-			getCharacterParams(kCharacterCond2, 8)[4] = 0;
-			getCharacterParams(kCharacterCond2, 8)[3] = 0;
-			getCharacterParams(kCharacterCond2, 8)[5] = 0;
-			getCharacterParams(kCharacterCond2, 8)[10] = 0;
-			getCharacterParams(kCharacterCond2, 8)[12] = 0;
-			getCharacterParams(kCharacterCond2, 8)[13] = 0;
-			getCharacterParams(kCharacterCond2, 8)[15] = 0;
-			getCharacterParams(kCharacterCond2, 8)[19] = 0;
-			getCharacterParams(kCharacterCond2, 8)[14] = 0;
-			getCharacterParams(kCharacterCond2, 8)[1] = 1;
-			setModel(111, 10);
-		} else if (msg->action == 18 && getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] == 1) {
+	switch (msg->action) {
+	case 0:
+		getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 1;
+		Cond2Call(&LogicManager::CONS_Cond2_SitDown, 0, 0, 0, 0);
+		break;
+	case 12:
+		endGraphics(kCharacterCond2);
+		getCharacter(kCharacterCond2).characterPosition.car = kCarRedSleeping;
+		getCharacter(kCharacterCond2).characterPosition.position = 1500;
+		getCharacter(kCharacterCond2).characterPosition.location = 0;
+		getCharacter(kCharacterCond2).clothes = 0;
+		getCharacterParams(kCharacterCond2, 8)[18] = 0;
+		getCharacterParams(kCharacterCond2, 8)[7] = 0;
+		getCharacterParams(kCharacterCond2, 8)[8] = 0;
+		getCharacterParams(kCharacterCond2, 8)[2] = 0;
+		getCharacterParams(kCharacterCond2, 8)[4] = 0;
+		getCharacterParams(kCharacterCond2, 8)[3] = 0;
+		getCharacterParams(kCharacterCond2, 8)[5] = 0;
+		getCharacterParams(kCharacterCond2, 8)[10] = 0;
+		getCharacterParams(kCharacterCond2, 8)[12] = 0;
+		getCharacterParams(kCharacterCond2, 8)[13] = 0;
+		getCharacterParams(kCharacterCond2, 8)[15] = 0;
+		getCharacterParams(kCharacterCond2, 8)[19] = 0;
+		getCharacterParams(kCharacterCond2, 8)[14] = 0;
+		getCharacterParams(kCharacterCond2, 8)[1] = 1;
+		setModel(111, 10);
+		break;
+	case 18:
+		if (getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] == 1) {
 			getCharacterParams(kCharacterCond2, 8)[9] = 1;
 			CONS_Cond2_OnDuty4(0, 0, 0, 0);
 		}
-	} else {
-		getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 1;
-		Cond2Call(&LogicManager::CONS_Cond2_SitDown, 0, 0, 0, 0);
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -3687,70 +4349,8 @@ void LogicManager::CONS_Cond2_OnDuty4(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Cond2_OnDuty4(HAND_PARAMS) {
-	if (msg->action > 11) {
-		if (msg->action > 17) {
-			if (msg->action > 225358684) {
-				if (msg->action == 226078300) {
-					if (!getCharacterParams(kCharacterCond2, 8)[16] && !getCharacterParams(kCharacterCond2, 8)[0]) {
-						playDialog(kCharacterCond2, "JAC2020", -1, 0);
-						getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 10;
-						Cond2Call(&LogicManager::CONS_Cond2_DoSeqOtis, "697D", 0, 0, 0);
-					}
-				} else if (msg->action == 305159806 && !getCharacterParams(kCharacterCond2, 8)[16] && !getCharacterParams(kCharacterCond2, 8)[0]) {
-					getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 13;
-					Cond2Call(&LogicManager::CONS_Cond2_CathRattling, msg->param, 0, 0, 0);
-				}
-			} else if (msg->action == 225358684) {
-				if (!getCharacterParams(kCharacterCond2, 8)[0]) {
-					getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 12;
-					Cond2Call(&LogicManager::CONS_Cond2_CathBuzzing, msg->param, 0, 0, 0);
-				}
-			} else if (msg->action == 18) {
-				switch (getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8]) {
-				case 1:
-					goto LABEL_30;
-				case 2:
-					goto LABEL_42;
-				case 3:
-					goto LABEL_44;
-				case 4:
-					goto LABEL_48;
-				case 5:
-					goto LABEL_51;
-				case 6:
-					goto LABEL_54;
-				case 10:
-					getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 11;
-					Cond2Call(&LogicManager::CONS_Cond2_SitDown, 0, 0, 0, 0);
-					break;
-				default:
-					return;
-				}
-			}
-		} else if (msg->action == 17) {
-			if (!getCharacterParams(kCharacterCond2, 8)[16] && !getCharacterParams(kCharacterCond2, 8)[0]) {
-				if (checkCathDir(kCarRedSleeping, 1)) {
-					getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 8;
-					Cond2Call(&LogicManager::CONS_Cond2_Passing, 1, 0, 0, 0);
-				} else if (checkCathDir(kCarRedSleeping, 23)) {
-					getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 9;
-					Cond2Call(&LogicManager::CONS_Cond2_Passing, 0, 0, 0, 0);
-				}
-			}
-		} else if (msg->action == 12) {
-			getCharacter(kCharacterCond2).characterPosition.car = kCarRedSleeping;
-			getCharacter(kCharacterCond2).characterPosition.position = 1500;
-			getCharacter(kCharacterCond2).characterPosition.location = 0;
-			takeItem(kItem5);
-		}
-	} else if (msg->action == 11) {
-		if (!getCharacterParams(kCharacterCond2, 8)[16] && !getCharacterParams(kCharacterCond2, 8)[0]) {
-			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 7;
-			Cond2Call(&LogicManager::CONS_Cond2_Passing, msg->param, msg->sender, 0, 0);
-		}
-	} else {
-		if (msg->action)
-			return;
+	switch (msg->action) {
+	case 0:
 		if (getCharacterParams(kCharacterCond2, 8)[18]) {
 			getCharacterParams(kCharacterCond2, 8)[9] = 0;
 			getCharacterParams(kCharacterCond2, 8)[14] = 0;
@@ -3766,64 +4366,73 @@ void LogicManager::HAND_Cond2_OnDuty4(HAND_PARAMS) {
 			getCharacterParams(kCharacterCond2, 8)[18] = 0;
 			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 1;
 			Cond2Call(&LogicManager::CONS_Cond2_WaitBombDefused, 0, 0, 0, 0);
-			return;
+			break;
 		}
-	LABEL_30:
+
 		if (getCharacterParams(kCharacterCond2, 8)[9]) {
 			if (!getCharacterCurrentParams(kCharacterCond2)[1])
 				getCharacterCurrentParams(kCharacterCond2)[1] = _gameTime + 4500;
+
 			if (getCharacterCurrentParams(kCharacterCond2)[2] != 0x7FFFFFFF && _gameTime) {
-				if (getCharacterCurrentParams(kCharacterCond2)[1] < _gameTime)
-					goto LABEL_40;
+				if (getCharacterCurrentParams(kCharacterCond2)[1] < _gameTime) {
+					getCharacterCurrentParams(kCharacterCond2)[2] = 0x7FFFFFFF;
+					getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 2;
+					Cond2Call(&LogicManager::CONS_Cond2_ServiceAnna, 0, 0, 0, 0);
+					break;
+				}
+
 				if (!cathInCorridor(kCarRedSleeping) || !getCharacterCurrentParams(kCharacterCond2)[2]) {
 					getCharacterCurrentParams(kCharacterCond2)[2] = _gameTime;
-					if (!_gameTime)
-						goto LABEL_41;
+					if (!_gameTime) {
+						getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 2;
+						Cond2Call(&LogicManager::CONS_Cond2_ServiceAnna, 0, 0, 0, 0);
+						break;
+					}
 				}
+
 				if (getCharacterCurrentParams(kCharacterCond2)[2] < _gameTime) {
-				LABEL_40:
 					getCharacterCurrentParams(kCharacterCond2)[2] = 0x7FFFFFFF;
-				LABEL_41:
+
 					getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 2;
 					Cond2Call(&LogicManager::CONS_Cond2_ServiceAnna, 0, 0, 0, 0);
-					return;
+					break;
 				}
 			}
 		}
-	LABEL_42:
+
 		if (getCharacterParams(kCharacterCond2, 8)[14]) {
 			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 3;
 			Cond2Call(&LogicManager::CONS_Cond2_TakeMaxBack, 0, 0, 0, 0);
-			return;
+			break;
 		}
-	LABEL_44:
+
 		if (!getCharacterCurrentParams(kCharacterCond2)[0]) {
 			if (_gameTime > 2394000 && !getCharacterCurrentParams(kCharacterCond2)[3]) {
 				getCharacterCurrentParams(kCharacterCond2)[3] = 1;
 				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 4;
 				Cond2Call(&LogicManager::CONS_Cond2_MakeAllBeds4, 0, 0, 0, 0);
-				return;
+				break;
 			}
-		LABEL_48:
+
 			if (_gameTime > 2434500 && !getCharacterCurrentParams(kCharacterCond2)[4]) {
 				getCharacterCurrentParams(kCharacterCond2)[4] = 1;
 				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 5;
 				Cond2Call(&LogicManager::CONS_Cond2_BathroomTrip, 0, 0, 0, 0);
-				return;
+				break;
 			}
-		LABEL_51:
+
 			if (_gameTime > 2448000 && !getCharacterCurrentParams(kCharacterCond2)[5]) {
 				getCharacterCurrentParams(kCharacterCond2)[5] = 1;
 				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 6;
 				Cond2Call(&LogicManager::CONS_Cond2_BathroomTrip, 0, 0, 0, 0);
-				return;
+				break;
 			}
 		}
-	LABEL_54:
+
 		if (_gameTime > 2538000 && !getCharacterParams(kCharacterCond2, 8)[0] && !getCharacterParams(kCharacterCond2, 8)[16]) {
 			if (getCharacterCurrentParams(kCharacterCond2)[6] || (getCharacterCurrentParams(kCharacterCond2)[6] = _gameTime + 2700, _gameTime != -2700)) {
 				if (getCharacterCurrentParams(kCharacterCond2)[6] >= _gameTime)
-					return;
+					break;
 
 				getCharacterCurrentParams(kCharacterCond2)[6] = 0x7FFFFFFF;
 			}
@@ -3833,6 +4442,167 @@ void LogicManager::HAND_Cond2_OnDuty4(HAND_PARAMS) {
 			startCycOtis(kCharacterCond2, "697F");
 			getCharacterCurrentParams(kCharacterCond2)[6] = 0;
 		}
+
+		break;
+	case 11:
+		if (!getCharacterParams(kCharacterCond2, 8)[16] && !getCharacterParams(kCharacterCond2, 8)[0]) {
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 7;
+			Cond2Call(&LogicManager::CONS_Cond2_Passing, msg->param, msg->sender, 0, 0);
+		}
+
+		break;
+	case 17:
+		if (!getCharacterParams(kCharacterCond2, 8)[16] && !getCharacterParams(kCharacterCond2, 8)[0]) {
+			if (checkCathDir(kCarRedSleeping, 1)) {
+				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 8;
+				Cond2Call(&LogicManager::CONS_Cond2_Passing, 1, 0, 0, 0);
+			} else if (checkCathDir(kCarRedSleeping, 23)) {
+				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 9;
+				Cond2Call(&LogicManager::CONS_Cond2_Passing, 0, 0, 0, 0);
+			}
+		}
+
+		break;
+	case 12:
+		getCharacter(kCharacterCond2).characterPosition.car = kCarRedSleeping;
+		getCharacter(kCharacterCond2).characterPosition.position = 1500;
+		getCharacter(kCharacterCond2).characterPosition.location = 0;
+		takeItem(kItem5);
+		break;
+	case 18:
+		switch (getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8]) {
+		case 1:
+			if (getCharacterParams(kCharacterCond2, 8)[9]) {
+				if (!getCharacterCurrentParams(kCharacterCond2)[1])
+					getCharacterCurrentParams(kCharacterCond2)[1] = _gameTime + 4500;
+				if (getCharacterCurrentParams(kCharacterCond2)[2] != 0x7FFFFFFF && _gameTime) {
+					if (getCharacterCurrentParams(kCharacterCond2)[1] < _gameTime) {
+						getCharacterCurrentParams(kCharacterCond2)[2] = 0x7FFFFFFF;
+						getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 2;
+						Cond2Call(&LogicManager::CONS_Cond2_ServiceAnna, 0, 0, 0, 0);
+						break;
+					}
+
+					if (!cathInCorridor(kCarRedSleeping) || !getCharacterCurrentParams(kCharacterCond2)[2]) {
+						getCharacterCurrentParams(kCharacterCond2)[2] = _gameTime;
+						if (!_gameTime) {
+							getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 2;
+							Cond2Call(&LogicManager::CONS_Cond2_ServiceAnna, 0, 0, 0, 0);
+							break;
+						}
+					}
+
+					if (getCharacterCurrentParams(kCharacterCond2)[2] < _gameTime) {
+						getCharacterCurrentParams(kCharacterCond2)[2] = 0x7FFFFFFF;
+
+						getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 2;
+						Cond2Call(&LogicManager::CONS_Cond2_ServiceAnna, 0, 0, 0, 0);
+						break;
+					}
+				}
+			}
+
+			// fall through
+		case 2:
+			if (getCharacterParams(kCharacterCond2, 8)[14]) {
+				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 3;
+				Cond2Call(&LogicManager::CONS_Cond2_TakeMaxBack, 0, 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 3:
+			if (!getCharacterCurrentParams(kCharacterCond2)[0]) {
+				if (_gameTime > 2394000 && !getCharacterCurrentParams(kCharacterCond2)[3]) {
+					getCharacterCurrentParams(kCharacterCond2)[3] = 1;
+					getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 4;
+					Cond2Call(&LogicManager::CONS_Cond2_MakeAllBeds4, 0, 0, 0, 0);
+					break;
+				}
+
+				if (_gameTime > 2434500 && !getCharacterCurrentParams(kCharacterCond2)[4]) {
+					getCharacterCurrentParams(kCharacterCond2)[4] = 1;
+					getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 5;
+					Cond2Call(&LogicManager::CONS_Cond2_BathroomTrip, 0, 0, 0, 0);
+					break;
+				}
+
+				if (_gameTime > 2448000 && !getCharacterCurrentParams(kCharacterCond2)[5]) {
+					getCharacterCurrentParams(kCharacterCond2)[5] = 1;
+					getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 6;
+					Cond2Call(&LogicManager::CONS_Cond2_BathroomTrip, 0, 0, 0, 0);
+					break;
+				}
+			}
+
+			// fall through
+		case 4:
+			if (_gameTime > 2434500 && !getCharacterCurrentParams(kCharacterCond2)[4]) {
+				getCharacterCurrentParams(kCharacterCond2)[4] = 1;
+				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 5;
+				Cond2Call(&LogicManager::CONS_Cond2_BathroomTrip, 0, 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 5:
+			if (_gameTime > 2448000 && !getCharacterCurrentParams(kCharacterCond2)[5]) {
+				getCharacterCurrentParams(kCharacterCond2)[5] = 1;
+				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 6;
+				Cond2Call(&LogicManager::CONS_Cond2_BathroomTrip, 0, 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 6:
+			if (_gameTime > 2538000 && !getCharacterParams(kCharacterCond2, 8)[0] && !getCharacterParams(kCharacterCond2, 8)[16]) {
+				if (getCharacterCurrentParams(kCharacterCond2)[6] || (getCharacterCurrentParams(kCharacterCond2)[6] = _gameTime + 2700, _gameTime != -2700)) {
+					if (getCharacterCurrentParams(kCharacterCond2)[6] >= _gameTime)
+						break;
+
+					getCharacterCurrentParams(kCharacterCond2)[6] = 0x7FFFFFFF;
+				}
+
+				getCharacterParams(kCharacterCond2, 8)[1] = 0;
+				getCharacterParams(kCharacterCond2, 8)[0] = 1;
+				startCycOtis(kCharacterCond2, "697F");
+				getCharacterCurrentParams(kCharacterCond2)[6] = 0;
+			}
+
+			break;
+		case 10:
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 11;
+			Cond2Call(&LogicManager::CONS_Cond2_SitDown, 0, 0, 0, 0);
+			break;
+		default:
+			break;
+		}
+
+		break;
+	case 226078300:
+		if (!getCharacterParams(kCharacterCond2, 8)[16] && !getCharacterParams(kCharacterCond2, 8)[0]) {
+			playDialog(kCharacterCond2, "JAC2020", -1, 0);
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 10;
+			Cond2Call(&LogicManager::CONS_Cond2_DoSeqOtis, "697D", 0, 0, 0);
+		}
+
+		break;
+	case 305159806:
+		if (!getCharacterParams(kCharacterCond2, 8)[16] && !getCharacterParams(kCharacterCond2, 8)[0]) {
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 13;
+			Cond2Call(&LogicManager::CONS_Cond2_CathRattling, msg->param, 0, 0, 0);
+		}
+
+		break;
+	case 225358684:
+		if (!getCharacterParams(kCharacterCond2, 8)[0]) {
+			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 12;
+			Cond2Call(&LogicManager::CONS_Cond2_CathBuzzing, msg->param, 0, 0, 0);
+		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -3854,7 +4624,7 @@ void LogicManager::HAND_Cond2_WaitBombDefused(HAND_PARAMS) {
 			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 1;
 			Cond2Call(&LogicManager::CONS_Cond2_DoWalk, 4, 540, 0, 0);
 		} else {
-			getCharacter(kCharacterCond2).characterPosition.car = 8;
+			getCharacter(kCharacterCond2).characterPosition.car = kCarLocomotive;
 			getCharacter(kCharacterCond2).characterPosition.position = 540;
 		}
 
@@ -3863,7 +4633,7 @@ void LogicManager::HAND_Cond2_WaitBombDefused(HAND_PARAMS) {
 		switch (getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8]) {
 		case 1:
 			endGraphics(kCharacterCond2);
-			getCharacter(kCharacterCond2).characterPosition.car = 8;
+			getCharacter(kCharacterCond2).characterPosition.car = kCarLocomotive;
 			break;
 		case 2:
 			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 3;
@@ -3874,6 +4644,8 @@ void LogicManager::HAND_Cond2_WaitBombDefused(HAND_PARAMS) {
 			_engine->getMessageManager()->setMessageHandle(kCharacterCond2, _functionsCond2[getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall]]);
 			fedEx(kCharacterCond2, kCharacterCond2, 18, 0);
 			break;
+		default:
+			break;
 		}
 
 		break;
@@ -3882,6 +4654,8 @@ void LogicManager::HAND_Cond2_WaitBombDefused(HAND_PARAMS) {
 		getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 2;
 		Cond2Call(&LogicManager::CONS_Cond2_DoWalk, 4, 1500, 0, 0);
 		break;
+	default:
+		break;
 	}
 }
 
@@ -3939,13 +4713,16 @@ void LogicManager::HAND_Cond2_ServiceAnna(HAND_PARAMS) {
 			fedEx(kCharacterCond2, kCharacterCond2, 18, 0);
 			break;
 		default:
-			return;
+			break;
 		}
+
 		break;
 	case 123712592:
 		getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 6;
 		Cond2Call(&LogicManager::CONS_Cond2_DoWalk, 4, 2000, 0, 0);
 		break;
+	default:
+		break;
 	}
 }
 
@@ -3960,10 +4737,12 @@ void LogicManager::CONS_Cond2_MakeAllBeds4(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Cond2_MakeAllBeds4(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 1;
 		Cond2Call(&LogicManager::CONS_Cond2_GetUp, 0, 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8]) {
 		case 1:
 			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 2;
@@ -4031,8 +4810,12 @@ void LogicManager::HAND_Cond2_MakeAllBeds4(HAND_PARAMS) {
 			fedEx(kCharacterCond2, kCharacterCond2, 18, 0);
 			break;
 		default:
-			return;
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -4047,16 +4830,19 @@ void LogicManager::CONS_Cond2_StartPart5(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Cond2_StartPart5(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			endGraphics(kCharacterCond2);
-			getCharacter(kCharacterCond2).characterPosition.car = kCarRestaurant;
-			getCharacter(kCharacterCond2).characterPosition.position = 3969;
-			getCharacter(kCharacterCond2).characterPosition.location = 1;
-			getCharacter(kCharacterCond2).inventoryItem = kItemNone;
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		CONS_Cond2_Prisoner(0, 0, 0, 0);
+		break;
+	case 12:
+		endGraphics(kCharacterCond2);
+		getCharacter(kCharacterCond2).characterPosition.car = kCarRestaurant;
+		getCharacter(kCharacterCond2).characterPosition.position = 3969;
+		getCharacter(kCharacterCond2).characterPosition.location = 1;
+		getCharacter(kCharacterCond2).inventoryItem = kItemNone;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -4071,8 +4857,13 @@ void LogicManager::CONS_Cond2_Prisoner(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Cond2_Prisoner(HAND_PARAMS) {
-	if (msg->action == 70549068)
+	switch (msg->action) {
+	case 70549068:
 		CONS_Cond2_ReturnSeat(0, 0, 0, 0);
+		break;
+	default:
+		break;
+	}
 }
 
 void LogicManager::CONS_Cond2_ReturnSeat(CONS_PARAMS) {
@@ -4086,16 +4877,24 @@ void LogicManager::CONS_Cond2_ReturnSeat(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Cond2_ReturnSeat(HAND_PARAMS) {
-	if (msg->action == 12) {
-		getCharacter(kCharacterCond2).characterPosition.car = 4;
+	switch (msg->action) {
+	case 12:
+		getCharacter(kCharacterCond2).characterPosition.car = kCarRedSleeping;
 		getCharacter(kCharacterCond2).characterPosition.position = 7500;
 		getCharacter(kCharacterCond2).characterPosition.location = 0;
 		playDialog(kCharacterCond2, "Jac5010", -1, 0);
 		getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 1;
 		Cond2Call(&LogicManager::CONS_Cond2_DoWalk, 4, 2000, 0, 0);
-	} else if (msg->action == 18 && getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] == 1) {
-		startCycOtis(kCharacterCond2, "627K");
-		CONS_Cond2_Waiting5(0, 0, 0, 0);
+		break;
+	case 18:
+		if (getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] == 1) {
+			startCycOtis(kCharacterCond2, "627K");
+			CONS_Cond2_Waiting5(0, 0, 0, 0);
+		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -4110,12 +4909,18 @@ void LogicManager::CONS_Cond2_Waiting5(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Cond2_Waiting5(HAND_PARAMS) {
-	if (msg->action == 18) {
+	switch (msg->action) {
+	case 18:
 		if (getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] == 1)
 			CONS_Cond2_MakeRounds(0, 0, 0, 0);
-	} else if (msg->action == 155991520) {
+
+		break;
+	case 155991520:
 		getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 1;
 		Cond2Call(&LogicManager::CONS_Cond2_DoWait, 225, 0, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -4130,11 +4935,13 @@ void LogicManager::CONS_Cond2_MakeRounds(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Cond2_MakeRounds(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterCond2).characterPosition.position = 2088;
 		getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 1;
 		Cond2Call(&LogicManager::CONS_Cond2_DoWalk, 4, 4840, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8]) {
 		case 1:
 			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 2;
@@ -4154,7 +4961,7 @@ void LogicManager::HAND_Cond2_MakeRounds(HAND_PARAMS) {
 		case 4:
 			getCharacter(kCharacterCond2).characterPosition.location = 1;
 			endGraphics(kCharacterCond2);
-			setDoor(36, 0, 3, 10, 9);
+			setDoor(36, kCharacterCath, 3, 10, 9);
 			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 5;
 			Cond2Call(&LogicManager::CONS_Cond2_DoDialog, "Reb5010", 0, 0, 0);
 			break;
@@ -4179,8 +4986,12 @@ void LogicManager::HAND_Cond2_MakeRounds(HAND_PARAMS) {
 			CONS_Cond2_InCompH(0, 0, 0, 0);
 			break;
 		default:
-			return;
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -4195,52 +5006,30 @@ void LogicManager::CONS_Cond2_InCompH(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Cond2_InCompH(HAND_PARAMS) {
-	if (msg->action > 9) {
-		if (msg->action > 17) {
-			if (msg->action == 18) {
-				switch (getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8]) {
-				case 1:
-					goto LABEL_29;
-				case 2:
-				case 3:
-					getCharacterCurrentParams(kCharacterCond2)[2]++;
-					if (getCharacterCurrentParams(kCharacterCond2)[2] == 1) {
-						setDoor(39, 4, 1, 0, 0);
-						getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 4;
-						Cond2Call(&LogicManager::CONS_Cond2_DoDialog, "Jac5002", 0, 0, 0);
-					} else if (getCharacterCurrentParams(kCharacterCond2)[2] == 2) {
-						setDoor(39, 4, 1, 0, 0);
-						getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 5;
-						Cond2Call(&LogicManager::CONS_Cond2_DoDialog, "Jac5002A", 0, 0, 0);
-					}
-					break;
-				case 4:
-					getCharacterCurrentParams(kCharacterCond2)[0] = 1;
-					setDoor(39, 4, 1, 14, 0);
-					break;
-				case 5:
-					getCharacterCurrentParams(kCharacterCond2)[1] = 1;
+	switch (msg->action) {
+	case 0:
+		if (getCharacterCurrentParams(kCharacterCond2)[0]) {
+			if (getCharacterCurrentParams(kCharacterCond2)[3] ||
+				(getCharacterCurrentParams(kCharacterCond2)[3] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
+				if (getCharacterCurrentParams(kCharacterCond2)[3] >= _currentGameSessionTicks)
 					break;
-				default:
-					return;
-				}
-			} else if (msg->action == 135800432) {
-				CONS_Cond2_Disappear(0, 0, 0, 0);
-			}
-		} else if (msg->action == 17) {
-			if (getCharacterCurrentParams(kCharacterCond2)[1] || getCharacterCurrentParams(kCharacterCond2)[0]) {
-				getCharacterCurrentParams(kCharacterCond2)[1] = 0;
-				getCharacterCurrentParams(kCharacterCond2)[0] = 0;
-				setDoor(39, 4, 1, 10, 9);
-				getCharacterCurrentParams(kCharacterCond2)[2] = 0;
+
+				getCharacterCurrentParams(kCharacterCond2)[3] = 0x7FFFFFFF;
 			}
-		} else if (msg->action == 12) {
-		LABEL_29:
-			setDoor(39, 4, 1, 10, 9);
+
+			getCharacterCurrentParams(kCharacterCond2)[0] = 0;
+			getCharacterCurrentParams(kCharacterCond2)[1] = 1;
+			setDoor(39, kCharacterCond2, 1, 0, 0);
+			getCharacterCurrentParams(kCharacterCond2)[3] = 0;
+		} else {
+			getCharacterCurrentParams(kCharacterCond2)[3] = 0;
 		}
-	} else if (msg->action >= 8) {
+
+		break;
+	case 8:
+	case 9:
 		if (getCharacterCurrentParams(kCharacterCond2)[0]) {
-			setDoor(39, 4, 1, 0, 0);
+			setDoor(39, kCharacterCond2, 1, 0, 0);
 			getCharacterCurrentParams(kCharacterCond2)[0] = 0;
 			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 1;
 			Cond2Call(&LogicManager::CONS_Cond2_DoDialog, getCathJustChecking(), 0, 0, 0);
@@ -4251,21 +5040,56 @@ void LogicManager::HAND_Cond2_InCompH(HAND_PARAMS) {
 			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 3;
 			Cond2Call(&LogicManager::CONS_Cond2_DoDialog, "LIB013", 0, 0, 0);
 		}
-	} else if (msg->action == 0) {
-		if (getCharacterCurrentParams(kCharacterCond2)[0]) {
-			if (getCharacterCurrentParams(kCharacterCond2)[3] ||
-				(getCharacterCurrentParams(kCharacterCond2)[3] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
-				if (getCharacterCurrentParams(kCharacterCond2)[3] >= _currentGameSessionTicks)
-					return;
-				getCharacterCurrentParams(kCharacterCond2)[3] = 0x7FFFFFFF;
-			}
+
+		break;
+	case 12:
+		setDoor(39, kCharacterCond2, 1, 10, 9);
+		break;
+	case 17:
+		if (getCharacterCurrentParams(kCharacterCond2)[1] || getCharacterCurrentParams(kCharacterCond2)[0]) {
+			getCharacterCurrentParams(kCharacterCond2)[1] = 0;
 			getCharacterCurrentParams(kCharacterCond2)[0] = 0;
+			setDoor(39, kCharacterCond2, 1, 10, 9);
+			getCharacterCurrentParams(kCharacterCond2)[2] = 0;
+		}
+
+		break;
+	case 18:
+		switch (getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8]) {
+		case 1:
+			setDoor(39, kCharacterCond2, 1, 10, 9);
+			break;
+		case 2:
+		case 3:
+			getCharacterCurrentParams(kCharacterCond2)[2]++;
+			if (getCharacterCurrentParams(kCharacterCond2)[2] == 1) {
+				setDoor(39, kCharacterCond2, 1, 0, 0);
+				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 4;
+				Cond2Call(&LogicManager::CONS_Cond2_DoDialog, "Jac5002", 0, 0, 0);
+			} else if (getCharacterCurrentParams(kCharacterCond2)[2] == 2) {
+				setDoor(39, kCharacterCond2, 1, 0, 0);
+				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 5;
+				Cond2Call(&LogicManager::CONS_Cond2_DoDialog, "Jac5002A", 0, 0, 0);
+			}
+
+			break;
+		case 4:
+			getCharacterCurrentParams(kCharacterCond2)[0] = 1;
+			setDoor(39, kCharacterCond2, 1, 14, 0);
+			break;
+		case 5:
 			getCharacterCurrentParams(kCharacterCond2)[1] = 1;
-			setDoor(39, 4, 1, 0, 0);
-			getCharacterCurrentParams(kCharacterCond2)[3] = 0;
-		} else {
-			getCharacterCurrentParams(kCharacterCond2)[3] = 0;
+			break;
+		default:
+			break;
 		}
+
+		break;
+	case 135800432:
+		CONS_Cond2_Disappear(0, 0, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 


Commit: 5e5578449ce2057f45ff3d3aa193c8e4007bb1da
    https://github.com/scummvm/scummvm/commit/5e5578449ce2057f45ff3d3aa193c8e4007bb1da
Author: AndywinXp (andywinxp at gmail.com)
Date: 2025-06-16T23:12:18+02:00

Commit Message:
LASTEXPRESS: Clean up François logic

Changed paths:
    engines/lastexpress/characters/francois.cpp


diff --git a/engines/lastexpress/characters/francois.cpp b/engines/lastexpress/characters/francois.cpp
index 0d5db2382c7..11dab04b1ba 100644
--- a/engines/lastexpress/characters/francois.cpp
+++ b/engines/lastexpress/characters/francois.cpp
@@ -48,7 +48,7 @@ void LogicManager::CONS_Francois(int chapter) {
 		CONS_Francois_StartPart5(0, 0, 0, 0);
 		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -69,24 +69,32 @@ void LogicManager::CONS_Francois_DebugWalks(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Francois_DebugWalks(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 1) {
-			getCharacter(kCharacterFrancois).clothes++;
-			if (getCharacter(kCharacterFrancois).clothes > 1)
-				getCharacter(kCharacterFrancois).clothes = 0;
-		} else if (msg->action == 12) {
-			getCharacter(kCharacterFrancois).characterPosition.position = 0;
-			getCharacter(kCharacterFrancois).characterPosition.location = 0;
-			getCharacter(kCharacterFrancois).characterPosition.car = kCarGreenSleeping;
-			getCharacter(kCharacterFrancois).inventoryItem = 0x80;
-			getCharacterCurrentParams(kCharacterFrancois)[0] = 10000;
-		}
-	} else if (walk(kCharacterFrancois, kCarGreenSleeping, getCharacterCurrentParams(kCharacterFrancois)[0])) {
-		if (getCharacterCurrentParams(kCharacterFrancois)[0] == 10000) {
-			getCharacterCurrentParams(kCharacterFrancois)[0] = 0;
-		} else {
-			getCharacterCurrentParams(kCharacterFrancois)[0] = 10000;
+	switch (msg->action) {
+	case 0:
+		if (walk(kCharacterFrancois, kCarGreenSleeping, getCharacterCurrentParams(kCharacterFrancois)[0])) {
+			if (getCharacterCurrentParams(kCharacterFrancois)[0] == 10000) {
+				getCharacterCurrentParams(kCharacterFrancois)[0] = 0;
+			} else {
+				getCharacterCurrentParams(kCharacterFrancois)[0] = 10000;
+			}
 		}
+
+		break;
+	case 1:
+		getCharacter(kCharacterFrancois).clothes++;
+		if (getCharacter(kCharacterFrancois).clothes > 1)
+			getCharacter(kCharacterFrancois).clothes = 0;
+
+		break;
+	case 12:
+		getCharacter(kCharacterFrancois).characterPosition.position = 0;
+		getCharacter(kCharacterFrancois).characterPosition.location = 0;
+		getCharacter(kCharacterFrancois).characterPosition.car = kCarGreenSleeping;
+		getCharacter(kCharacterFrancois).inventoryItem = 0x80;
+		getCharacterCurrentParams(kCharacterFrancois)[0] = 10000;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -103,11 +111,12 @@ void LogicManager::CONS_Francois_DoWait(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Francois_DoWait(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		if (getCharacterCurrentParams(kCharacterFrancois)[1] ||
 			(getCharacterCurrentParams(kCharacterFrancois)[1] = _gameTime + getCharacterCurrentParams(kCharacterFrancois)[0], _gameTime + getCharacterCurrentParams(kCharacterFrancois)[0] != 0)) {
 			if (getCharacterCurrentParams(kCharacterFrancois)[1] >= _gameTime)
-				return;
+				break;
 
 			getCharacterCurrentParams(kCharacterFrancois)[1] = 0x7FFFFFFF;
 		}
@@ -115,6 +124,9 @@ void LogicManager::HAND_Francois_DoWait(HAND_PARAMS) {
 		getCharacter(kCharacterFrancois).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterFrancois, _functionsFrancois[getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall]]);
 		fedEx(kCharacterFrancois, kCharacterFrancois, 18, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -131,12 +143,17 @@ void LogicManager::CONS_Francois_DoSeqOtis(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Francois_DoSeqOtis(HAND_PARAMS) {
-	if (msg->action == 3) {
+	switch (msg->action) {
+	case 3:
 		getCharacter(kCharacterFrancois).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterFrancois, _functionsFrancois[getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall]]);
 		fedEx(kCharacterFrancois, kCharacterFrancois, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		startSeqOtis(kCharacterFrancois, (char *)&getCharacterCurrentParams(kCharacterFrancois)[0]);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -155,15 +172,20 @@ void LogicManager::CONS_Francois_DoCorrOtis(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Francois_DoCorrOtis(HAND_PARAMS) {
-	if (msg->action == 3) {
+	switch (msg->action) {
+	case 3:
 		releaseAtDoor(kCharacterFrancois, getCharacterCurrentParams(kCharacterFrancois)[3]);
 
 		getCharacter(kCharacterFrancois).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterFrancois, _functionsFrancois[getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall]]);
 		fedEx(kCharacterFrancois, kCharacterFrancois, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		startSeqOtis(kCharacterFrancois, (char *)&getCharacterCurrentParams(kCharacterFrancois)[0]);
 		blockAtDoor(kCharacterFrancois, getCharacterCurrentParams(kCharacterFrancois)[3]);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -182,14 +204,16 @@ void LogicManager::CONS_Francois_DoEnterCorrOtis(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Francois_DoEnterCorrOtis(HAND_PARAMS) {
-	if (msg->action == 3) {
+	switch (msg->action) {
+	case 3:
 		releaseAtDoor(kCharacterFrancois, getCharacterCurrentParams(kCharacterFrancois)[3]);
 		getCharacter(kCharacterFrancois).characterPosition.position = 5790;
 
 		getCharacter(kCharacterFrancois).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterFrancois, _functionsFrancois[getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall]]);
 		fedEx(kCharacterFrancois, kCharacterFrancois, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		startSeqOtis(kCharacterFrancois, (char *)&getCharacterCurrentParams(kCharacterFrancois)[0]);
 		blockAtDoor(kCharacterFrancois, getCharacterCurrentParams(kCharacterFrancois)[3]);
 		getCharacter(kCharacterFrancois).characterPosition.location = 1;
@@ -203,6 +227,10 @@ void LogicManager::HAND_Francois_DoEnterCorrOtis(HAND_PARAMS) {
 			playDialog(0, "BUMP", -1, 0);
 			bumpCathFDoor(35);
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -219,12 +247,17 @@ void LogicManager::CONS_Francois_DoDialog(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Francois_DoDialog(HAND_PARAMS) {
-	if (msg->action == 2) {
+	switch (msg->action) {
+	case 2:
 		getCharacter(kCharacterFrancois).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterFrancois, _functionsFrancois[getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall]]);
 		fedEx(kCharacterFrancois, kCharacterFrancois, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		playDialog(kCharacterFrancois, (char *)&getCharacterCurrentParams(kCharacterFrancois)[0], -1, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -242,22 +275,25 @@ void LogicManager::CONS_Francois_SaveGame(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Francois_SaveGame(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			save(
-				kCharacterFrancois,
-				getCharacterCurrentParams(kCharacterFrancois)[0],
-				getCharacterCurrentParams(kCharacterFrancois)[1]
-			);
+	switch (msg->action) {
+	case 0:
+		getCharacter(kCharacterFrancois).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterFrancois, _functionsFrancois[getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall]]);
+		fedEx(kCharacterFrancois, kCharacterFrancois, 18, 0);
+		break;
+	case 12:
+		save(
+			kCharacterFrancois,
+			getCharacterCurrentParams(kCharacterFrancois)[0],
+			getCharacterCurrentParams(kCharacterFrancois)[1]
+		);
 
-			getCharacter(kCharacterFrancois).currentCall--;
-			_engine->getMessageManager()->setMessageHandle(kCharacterFrancois, _functionsFrancois[getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall]]);
-			fedEx(kCharacterFrancois, kCharacterFrancois, 18, 0);
-		}
-	} else {
 		getCharacter(kCharacterFrancois).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterFrancois, _functionsFrancois[getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall]]);
 		fedEx(kCharacterFrancois, kCharacterFrancois, 18, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -301,6 +337,7 @@ void LogicManager::HAND_Francois_DoWalk(HAND_PARAMS) {
 				FrancoisCall(&LogicManager::CONS_Francois_SaveGame, 2, kEventFrancoisTradeWhistle, 0, 0);
 			}
 		}
+
 		break;
 	case 1:
 		if (msg->param.intParam == 18) {
@@ -328,6 +365,7 @@ void LogicManager::HAND_Francois_DoWalk(HAND_PARAMS) {
 			getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 2;
 			FrancoisCall(&LogicManager::CONS_Francois_SaveGame, 2, kEventFrancoisShowBeetle, 0, 0);
 		}
+
 		break;
 	case 5:
 	case 6:
@@ -339,6 +377,7 @@ void LogicManager::HAND_Francois_DoWalk(HAND_PARAMS) {
 			_engine->getMessageManager()->setMessageHandle(kCharacterFrancois, _functionsFrancois[getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall]]);
 			fedEx(kCharacterFrancois, kCharacterFrancois, 18, 0);
 		}
+
 		break;
 	case 18:
 		if (getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] == 1) {
@@ -350,6 +389,7 @@ void LogicManager::HAND_Francois_DoWalk(HAND_PARAMS) {
 
 			giveCathItem(kItemWhistle);
 			takeCathItem(kItemMatchBox);
+
 			_gameInventory[kItemBeetle].location = 2;
 
 			if (getCharacter(kCharacterFrancois).direction == 1) {
@@ -374,9 +414,10 @@ void LogicManager::HAND_Francois_DoWalk(HAND_PARAMS) {
 
 			getCharacter(kCharacterFrancois).inventoryItem = 0;
 		}
+
 		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -391,31 +432,38 @@ void LogicManager::CONS_Francois_ExitComp(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Francois_ExitComp(HAND_PARAMS) {
-	if (msg->action != 12) {
-		if (msg->action != 18)
-			return;
+	switch (msg->action) {
+	case 12:
+		if (checkDoor(35) == 2) {
+			setDoor(35, kCharacterCath, 0, 255, 255);
+			send(kCharacterFrancois, kCharacterMadame, 134289824, 0);
+			getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 1;
+			FrancoisCall(&LogicManager::CONS_Francois_DoCorrOtis, "605Cd", 35, 0, 0);
+		} else {
+			getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 2;
+			FrancoisCall(&LogicManager::CONS_Francois_DoCorrOtis, "605Ed", 35, 0, 0);
+		}
 
+		break;
+	case 18:
 		if (getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] == 1) {
 			setDoor(35, kCharacterCath, 2, 255, 255);
-		} else if (getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] != 2) {
-			return;
-		}
+			getCharacter(kCharacterFrancois).characterPosition.location = 0;
 
-		getCharacter(kCharacterFrancois).characterPosition.location = 0;
+			getCharacter(kCharacterFrancois).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterFrancois, _functionsFrancois[getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall]]);
+			fedEx(kCharacterFrancois, kCharacterFrancois, 18, 0);
+		} else if (getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] == 2) {
+			getCharacter(kCharacterFrancois).characterPosition.location = 0;
 
-		getCharacter(kCharacterFrancois).currentCall--;
-		_engine->getMessageManager()->setMessageHandle(kCharacterFrancois, _functionsFrancois[getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall]]);
-		fedEx(kCharacterFrancois, kCharacterFrancois, 18, 0);
-		return;
-	}
-	if (checkDoor(35) == 2) {
-		setDoor(35, kCharacterCath, 0, 255, 255);
-		send(kCharacterFrancois, kCharacterMadame, 134289824, 0);
-		getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 1;
-		FrancoisCall(&LogicManager::CONS_Francois_DoCorrOtis, "605Cd", 35, 0, 0);
-	} else {
-		getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 2;
-		FrancoisCall(&LogicManager::CONS_Francois_DoCorrOtis, "605Ed", 35, 0, 0);
+			getCharacter(kCharacterFrancois).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterFrancois, _functionsFrancois[getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall]]);
+			fedEx(kCharacterFrancois, kCharacterFrancois, 18, 0);
+		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -430,32 +478,34 @@ void LogicManager::CONS_Francois_EnterComp(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Francois_EnterComp(HAND_PARAMS) {
-	if (msg->action != 12) {
-		if (msg->action != 18)
-			return;
+	switch (msg->action) {
+	case 12:
+		if (checkDoor(35) == 2) {
+			setDoor(35, kCharacterCath, 0, 255, 255);
+			getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 1;
+			FrancoisCall(&LogicManager::CONS_Francois_DoEnterCorrOtis, "605Bd", 35, 0, 0);
+		} else {
+			getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 2;
+			FrancoisCall(&LogicManager::CONS_Francois_DoEnterCorrOtis, "605Dd", 35, 0, 0);
+		}
 
+		break;
+	case 18:
 		if (getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] == 1) {
 			setDoor(35, kCharacterCath, 2, 255, 255);
 			send(kCharacterFrancois, kCharacterMadame, 102484312, 0);
-		} else if (getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] != 2) {
-			return;
-		}
+		} else if (getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] == 2) {
+			getCharacter(kCharacterFrancois).characterPosition.location = 1;
+			endGraphics(kCharacterFrancois);
 
-		getCharacter(kCharacterFrancois).characterPosition.location = 1;
-		endGraphics(kCharacterFrancois);
+			getCharacter(kCharacterFrancois).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterFrancois, _functionsFrancois[getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall]]);
+			fedEx(kCharacterFrancois, kCharacterFrancois, 18, 0);
+		}
 
-		getCharacter(kCharacterFrancois).currentCall--;
-		_engine->getMessageManager()->setMessageHandle(kCharacterFrancois, _functionsFrancois[getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall]]);
-		fedEx(kCharacterFrancois, kCharacterFrancois, 18, 0);
-		return;
-	}
-	if (checkDoor(35) == 2) {
-		setDoor(35, kCharacterCath, 0, 255, 255);
-		getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 1;
-		FrancoisCall(&LogicManager::CONS_Francois_DoEnterCorrOtis, "605Bd", 35, 0, 0);
-	} else {
-		getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 2;
-		FrancoisCall(&LogicManager::CONS_Francois_DoEnterCorrOtis, "605Dd", 35, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -472,224 +522,300 @@ void LogicManager::CONS_Francois_Rampage(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Francois_Rampage(HAND_PARAMS) {
-	if (msg->action > 5) {
-		if (msg->action > 18) {
-			if (msg->action == 102752636) {
-				endGraphics(kCharacterFrancois);
-				getCharacter(kCharacterFrancois).characterPosition.location = 1;
-				getCharacter(kCharacterFrancois).characterPosition.position = 5790;
-				getCharacter(kCharacterFrancois).clothes = 0;
-				getCharacter(kCharacterFrancois).walkStepSize = 30;
-				getCharacter(kCharacterFrancois).inventoryItem = 0;
+	switch (msg->action) {
+	case 0:
+		if (!whoRunningDialog(kCharacterFrancois)) {
+			bool skip = false; // Horrible way to unroll a goto...
 
-				getCharacter(kCharacterFrancois).currentCall--;
-				_engine->getMessageManager()->setMessageHandle(kCharacterFrancois, _functionsFrancois[getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall]]);
-				fedEx(kCharacterFrancois, kCharacterFrancois, 18, 0);
-			} else if (msg->action == 205346192) {
-				if (msg->sender == 4) {
-					getCharacterCurrentParams(kCharacterFrancois)[7] = 1;
-				} else if (msg->sender == 3) {
-					getCharacterCurrentParams(kCharacterFrancois)[6] = 1;
+			if (!getCharacterCurrentParams(kCharacterFrancois)[8]) {
+				getCharacterCurrentParams(kCharacterFrancois)[8] = _currentGameSessionTicks + getCharacterCurrentParams(kCharacterFrancois)[5];
+				if (_currentGameSessionTicks + getCharacterCurrentParams(kCharacterFrancois)[5] == 0) {
+					skip = true;
 				}
 			}
-		} else {
-			if (msg->action == 18) {
-				switch (getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8]) {
+
+			if (skip || getCharacterCurrentParams(kCharacterFrancois)[8] < _currentGameSessionTicks) {
+				if (!skip) {
+					getCharacterCurrentParams(kCharacterFrancois)[8] = 0x7FFFFFFF;
+				}
+
+				switch (rnd(7)) {
+				case 0:
+					playDialog(kCharacterFrancois, "Fra1002A", -1, 0);
+					break;
 				case 1:
-					getCharacter(kCharacterFrancois).clothes = 1;
-					getCharacter(kCharacterFrancois).walkStepSize = 100;
-					getCharacter(kCharacterFrancois).inventoryItem = 0;
-					getCharacterCurrentParams(kCharacterFrancois)[1] = 3;
-					getCharacterCurrentParams(kCharacterFrancois)[2] = 540;
-					walk(kCharacterFrancois, getCharacterCurrentParams(kCharacterFrancois)[1], 540);
-					getCharacterCurrentParams(kCharacterFrancois)[5] = 15 * rnd(7);
-					return;
+					playDialog(kCharacterFrancois, "Fra1002B", -1, 0);
+					break;
 				case 2:
-					send(kCharacterFrancois, kCharacterCond2, 168253822, 0);
-					goto LABEL_56;
+					playDialog(kCharacterFrancois, "Fra1002C", -1, 0);
+					break;
 				case 3:
-				LABEL_56:
-					getCharacterCurrentParams(kCharacterFrancois)[4] = 0;
-					getCharacterCurrentParams(kCharacterFrancois)[1] = 4;
-					getCharacterCurrentParams(kCharacterFrancois)[2] = 9460;
-					getCharacter(kCharacterFrancois).characterPosition.position = 2088;
-					walk(kCharacterFrancois, getCharacterCurrentParams(kCharacterFrancois)[1], getCharacterCurrentParams(kCharacterFrancois)[2]);
-					goto LABEL_57;
+					playDialog(kCharacterFrancois, "Fra1002D", -1, 0);
+					break;
 				case 4:
-					getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 5;
-					FrancoisCall(&LogicManager::CONS_Francois_EnterComp, 0, 0, 0, 0);
-					return;
+					playDialog(kCharacterFrancois, "Fra1002E", -1, 0);
+					break;
 				case 5:
-					getCharacter(kCharacterFrancois).currentCall--;
-					_engine->getMessageManager()->setMessageHandle(kCharacterFrancois, _functionsFrancois[getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall]]);
-					fedEx(kCharacterFrancois, kCharacterFrancois, 18, 0);
-					return;
 				case 6:
-					if (_gameProgress[kProgressJacket] == 2) {
-						if (!isNight()) {
-							if (getCharacter(kCharacterFrancois).characterPosition.position <= getCharacter(kCharacterCath).characterPosition.position) {
-								playNIS(kEventFrancoisWhistleD);
-							} else {
-								playNIS(kEventFrancoisWhistle);
-							}
-						} else if (getCharacter(kCharacterFrancois).characterPosition.position <= getCharacter(kCharacterCath).characterPosition.position) {
-							playNIS(kEventFrancoisWhistleNightD);
-						} else {
-							playNIS(kEventFrancoisWhistleNight);
-						}
-					}
-					if (getCharacter(kCharacterFrancois).direction == 1) {
-						bumpCathFx(getCharacter(kCharacterFrancois).characterPosition.car, getCharacter(kCharacterFrancois).characterPosition.position - 750);
-					} else {
-						bumpCathRx(getCharacter(kCharacterFrancois).characterPosition.car, getCharacter(kCharacterFrancois).characterPosition.position + 750);
-					}
-					return;
+					playDialog(kCharacterFrancois, "Fra1002F", -1, 0);
+					break;
 				default:
-					return;
+					break;
 				}
+
+				getCharacterCurrentParams(kCharacterFrancois)[5] = 15 * rnd(7);
+				getCharacterCurrentParams(kCharacterFrancois)[8] = 0;
 			}
-			if (msg->action == 12) {
-				getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 1;
-				FrancoisCall(&LogicManager::CONS_Francois_ExitComp, 0, 0, 0, 0);
-			}
-		}
-		return;
-	}
-	if (msg->action == 5) {
-		if (_gameProgress[kProgressJacket] == 2 && !_gameEvents[kEventFrancoisWhistle] && !_gameEvents[kEventFrancoisWhistleD] && !_gameEvents[kEventFrancoisWhistleNight] && !_gameEvents[kEventFrancoisWhistleNightD]) {
-			getCharacter(kCharacterFrancois).inventoryItem = 0x80;
 		}
-		return;
-	}
-	if (msg->action) {
-		if (msg->action == 1) {
+
+		if (!whoOnScreen(kCharacterFrancois) || !whoFacingCath(kCharacterFrancois))
 			getCharacter(kCharacterFrancois).inventoryItem = 0;
-			if (whoRunningDialog(kCharacterFrancois))
-				fadeDialog(kCharacterFrancois);
-			getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 6;
-			FrancoisCall(&LogicManager::CONS_Francois_SaveGame, 2, kEventFrancoisWhistle, 0, 0);
-		}
-		return;
-	}
-	if (!whoRunningDialog(kCharacterFrancois)) {
-		if (!getCharacterCurrentParams(kCharacterFrancois)[8]) {
-			getCharacterCurrentParams(kCharacterFrancois)[8] = _currentGameSessionTicks + getCharacterCurrentParams(kCharacterFrancois)[5];
-			if (_currentGameSessionTicks + getCharacterCurrentParams(kCharacterFrancois)[5] == 0)
-				goto LABEL_18;
+
+		if (walk(kCharacterFrancois, getCharacterCurrentParams(kCharacterFrancois)[1], getCharacterCurrentParams(kCharacterFrancois)[2])) {
+			getCharacterCurrentParams(kCharacterFrancois)[4] = 0;
+
+			if (getCharacterCurrentParams(kCharacterFrancois)[2] == 540) {
+				getCharacterCurrentParams(kCharacterFrancois)[1] = 4;
+
+				if (_gameProgress[kProgressChapter] != 1)
+					getCharacterCurrentParams(kCharacterFrancois)[1] = 3;
+
+				getCharacterCurrentParams(kCharacterFrancois)[2] = 9460;
+			} else {
+				getCharacterCurrentParams(kCharacterFrancois)[1] = 3;
+				getCharacterCurrentParams(kCharacterFrancois)[2] = 540;
+				getCharacterCurrentParams(kCharacterFrancois)[7] = 0;
+				getCharacterCurrentParams(kCharacterFrancois)[6] = 0;
+				send(kCharacterFrancois, kCharacterCond2, 225932896, 0);
+				send(kCharacterFrancois, kCharacterCond1, 225932896, 0);
+			}
 		}
-		if (getCharacterCurrentParams(kCharacterFrancois)[8] < _currentGameSessionTicks) {
-			getCharacterCurrentParams(kCharacterFrancois)[8] = 0x7FFFFFFF;
-		LABEL_18:
-			switch (rnd(7)) {
-			case 0:
-				playDialog(kCharacterFrancois, "Fra1002A", -1, 0);
-				break;
-			case 1:
-				playDialog(kCharacterFrancois, "Fra1002B", -1, 0);
-				break;
-			case 2:
-				playDialog(kCharacterFrancois, "Fra1002C", -1, 0);
-				break;
-			case 3:
-				playDialog(kCharacterFrancois, "Fra1002D", -1, 0);
-				break;
-			case 4:
-				playDialog(kCharacterFrancois, "Fra1002E", -1, 0);
-				break;
-			case 5:
-			case 6:
-				playDialog(kCharacterFrancois, "Fra1002F", -1, 0);
-				break;
-			default:
-				break;
+
+		if (!nearX(kCharacterFrancois, 2000, 500) || getCharacter(kCharacterFrancois).direction != 2) {
+			if (_gameProgress[kProgressChapter] == 1) {
+				if (checkLoc(kCharacterFrancois, kCarRedSleeping) &&
+					(whoOnScreen(kCharacterFrancois) || getCharacterCurrentParams(kCharacterFrancois)[0] < _gameTime || getCharacterCurrentParams(kCharacterFrancois)[3]) &&
+					!getCharacterCurrentParams(kCharacterFrancois)[4] && getCharacter(kCharacterFrancois).characterPosition.position < getCharacter(kCharacterMadame).characterPosition.position) {
+
+					if (getCharacter(kCharacterFrancois).direction == 2) {
+						send(kCharacterFrancois, kCharacterMadame, 202221040, 0);
+						getCharacterCurrentParams(kCharacterFrancois)[4] = 1;
+						getCharacterCurrentParams(kCharacterFrancois)[3] = 1;
+					} else if (getCharacterCurrentParams(kCharacterFrancois)[3] && nearChar(kCharacterFrancois, kCharacterMadame, 1000)) {
+						send(kCharacterFrancois, kCharacterMadame, 168986720, 0);
+						getCharacterCurrentParams(kCharacterFrancois)[4] = 1;
+					}
+				}
+			} else if (getCharacterCurrentParams(kCharacterFrancois)[0] < _gameTime) {
+				getCharacter(kCharacterFrancois).clothes = 0;
+				getCharacter(kCharacterFrancois).walkStepSize = 30;
+				getCharacter(kCharacterFrancois).inventoryItem = 0;
+
+				if (whoRunningDialog(kCharacterFrancois))
+					fadeDialog(kCharacterFrancois);
+
+				getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 4;
+				FrancoisCall(&LogicManager::CONS_Francois_DoWalk, 4, 5790, 0, 0);
 			}
-			getCharacterCurrentParams(kCharacterFrancois)[5] = 15 * rnd(7);
-			getCharacterCurrentParams(kCharacterFrancois)[8] = 0;
+
+			break;
 		}
-	}
-	if (!whoOnScreen(kCharacterFrancois) || !whoFacingCath(20))
-		getCharacter(kCharacterFrancois).inventoryItem = 0;
-	if (walk(kCharacterFrancois, getCharacterCurrentParams(kCharacterFrancois)[1], getCharacterCurrentParams(kCharacterFrancois)[2])) {
-		getCharacterCurrentParams(kCharacterFrancois)[4] = 0;
-		if (getCharacterCurrentParams(kCharacterFrancois)[2] == 540) {
-			getCharacterCurrentParams(kCharacterFrancois)[1] = 4;
-			if (_gameProgress[kProgressChapter] != 1)
-				getCharacterCurrentParams(kCharacterFrancois)[1] = 3;
-			getCharacterCurrentParams(kCharacterFrancois)[2] = 9460;
-		} else {
-			getCharacterCurrentParams(kCharacterFrancois)[1] = 3;
-			getCharacterCurrentParams(kCharacterFrancois)[2] = 540;
-			getCharacterCurrentParams(kCharacterFrancois)[7] = 0;
-			getCharacterCurrentParams(kCharacterFrancois)[6] = 0;
-			send(kCharacterFrancois, kCharacterCond2, 225932896, 0);
-			send(kCharacterFrancois, kCharacterCond1, 225932896, 0);
+
+		if (checkLoc(kCharacterFrancois, kCarRedSleeping) && getCharacterCurrentParams(kCharacterFrancois)[7]) {
+			getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 2;
+			FrancoisCall(&LogicManager::CONS_Francois_DoSeqOtis, "605A", 0, 0, 0);
+			break;
 		}
-	}
-	if (!nearX(kCharacterFrancois, 2000, 500) || getCharacter(kCharacterFrancois).direction != 2)
-		goto LABEL_57;
-	if (checkLoc(kCharacterFrancois, kCarRedSleeping) && getCharacterCurrentParams(kCharacterFrancois)[7]) {
-		getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 2;
-		FrancoisCall(&LogicManager::CONS_Francois_DoSeqOtis, "605A", 0, 0, 0);
-		return;
-	}
-	if (checkLoc(kCharacterFrancois, kCarGreenSleeping) && getCharacterCurrentParams(kCharacterFrancois)[6]) {
-		getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 3;
-		FrancoisCall(&LogicManager::CONS_Francois_DoSeqOtis, "605A", 0, 0, 0);
-	} else {
-	LABEL_57:
-		if (_gameProgress[kProgressChapter] == 1) {
-			if (checkLoc(kCharacterFrancois, kCarRedSleeping) &&
-				(whoOnScreen(kCharacterFrancois) || getCharacterCurrentParams(kCharacterFrancois)[0] < _gameTime || getCharacterCurrentParams(kCharacterFrancois)[3]) &&
-				!getCharacterCurrentParams(kCharacterFrancois)[4] && getCharacter(kCharacterFrancois).characterPosition.position < getCharacter(kCharacterMadame).characterPosition.position) {
-				if (getCharacter(kCharacterFrancois).direction == 2) {
-					send(kCharacterFrancois, kCharacterMadame, 202221040, 0);
-					getCharacterCurrentParams(kCharacterFrancois)[4] = 1;
-					getCharacterCurrentParams(kCharacterFrancois)[3] = 1;
-				} else if (getCharacterCurrentParams(kCharacterFrancois)[3] && nearChar(kCharacterFrancois, kCharacterMadame, 0x3E8)) {
-					send(kCharacterFrancois, kCharacterMadame, 168986720, 0);
-					getCharacterCurrentParams(kCharacterFrancois)[4] = 1;
+
+		if (checkLoc(kCharacterFrancois, kCarGreenSleeping) && getCharacterCurrentParams(kCharacterFrancois)[6]) {
+			getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 3;
+			FrancoisCall(&LogicManager::CONS_Francois_DoSeqOtis, "605A", 0, 0, 0);
+		} else {
+			if (_gameProgress[kProgressChapter] == 1) {
+				if (checkLoc(kCharacterFrancois, kCarRedSleeping) &&
+					(whoOnScreen(kCharacterFrancois) || getCharacterCurrentParams(kCharacterFrancois)[0] < _gameTime || getCharacterCurrentParams(kCharacterFrancois)[3]) &&
+					!getCharacterCurrentParams(kCharacterFrancois)[4] && getCharacter(kCharacterFrancois).characterPosition.position < getCharacter(kCharacterMadame).characterPosition.position) {
+
+					if (getCharacter(kCharacterFrancois).direction == 2) {
+						send(kCharacterFrancois, kCharacterMadame, 202221040, 0);
+						getCharacterCurrentParams(kCharacterFrancois)[4] = 1;
+						getCharacterCurrentParams(kCharacterFrancois)[3] = 1;
+					} else if (getCharacterCurrentParams(kCharacterFrancois)[3] && nearChar(kCharacterFrancois, kCharacterMadame, 1000)) {
+						send(kCharacterFrancois, kCharacterMadame, 168986720, 0);
+						getCharacterCurrentParams(kCharacterFrancois)[4] = 1;
+					}
 				}
+			} else if (getCharacterCurrentParams(kCharacterFrancois)[0] < _gameTime) {
+				getCharacter(kCharacterFrancois).clothes = 0;
+				getCharacter(kCharacterFrancois).walkStepSize = 30;
+				getCharacter(kCharacterFrancois).inventoryItem = 0;
+
+				if (whoRunningDialog(kCharacterFrancois))
+					fadeDialog(kCharacterFrancois);
+
+				getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 4;
+				FrancoisCall(&LogicManager::CONS_Francois_DoWalk, 4, 5790, 0, 0);
 			}
-		} else if (getCharacterCurrentParams(kCharacterFrancois)[0] < _gameTime) {
-			getCharacter(kCharacterFrancois).clothes = 0;
-			getCharacter(kCharacterFrancois).walkStepSize = 30;
-			getCharacter(kCharacterFrancois).inventoryItem = 0;
-			if (whoRunningDialog(kCharacterFrancois))
-				fadeDialog(kCharacterFrancois);
-			getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 4;
-			FrancoisCall(&LogicManager::CONS_Francois_DoWalk, 4, 5790, 0, 0);
 		}
-	}
-}
 
-void LogicManager::CONS_Francois_TakeWalk(CONS_PARAMS) {
-	CharacterCallParams *params = &getCharacter(kCharacterFrancois).callParams[getCharacter(kCharacterFrancois).currentCall];
-	_engine->getMessageManager()->setMessageHandle(kCharacterFrancois, &LogicManager::HAND_Francois_TakeWalk);
-	getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall] = 12;
+		break;
+	case 1:
+		getCharacter(kCharacterFrancois).inventoryItem = 0;
 
-	params->clear();
+		if (whoRunningDialog(kCharacterFrancois))
+			fadeDialog(kCharacterFrancois);
 
-	fedEx(kCharacterFrancois, kCharacterFrancois, 12, 0);
-}
+		getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 6;
+		FrancoisCall(&LogicManager::CONS_Francois_SaveGame, 2, kEventFrancoisWhistle, 0, 0);
+		break;
+	case 5:
+		if (_gameProgress[kProgressJacket] == 2 && !_gameEvents[kEventFrancoisWhistle] && !_gameEvents[kEventFrancoisWhistleD] && !_gameEvents[kEventFrancoisWhistleNight] && !_gameEvents[kEventFrancoisWhistleNightD]) {
+			getCharacter(kCharacterFrancois).inventoryItem = 0x80;
+		}
 
-void LogicManager::HAND_Francois_TakeWalk(HAND_PARAMS) {
-	if (msg->action == 12) {
+		break;
+	case 12:
 		getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 1;
 		FrancoisCall(&LogicManager::CONS_Francois_ExitComp, 0, 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8]) {
 		case 1:
-			getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 2;
-			FrancoisCall(&LogicManager::CONS_Francois_DoWalk, 4, 9460, 0, 0);
+			getCharacter(kCharacterFrancois).clothes = 1;
+			getCharacter(kCharacterFrancois).walkStepSize = 100;
+			getCharacter(kCharacterFrancois).inventoryItem = 0;
+			getCharacterCurrentParams(kCharacterFrancois)[1] = 3;
+			getCharacterCurrentParams(kCharacterFrancois)[2] = 540;
+			walk(kCharacterFrancois, getCharacterCurrentParams(kCharacterFrancois)[1], 540);
+			getCharacterCurrentParams(kCharacterFrancois)[5] = 15 * rnd(7);
 			break;
 		case 2:
-			getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 3;
-			FrancoisCall(&LogicManager::CONS_Francois_DoWait, 675, 0, 0, 0);
-			break;
+			send(kCharacterFrancois, kCharacterCond2, 168253822, 0);
+
+			// fall through
 		case 3:
-			getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 4;
-			FrancoisCall(&LogicManager::CONS_Francois_DoWalk, 4, 540, 0, 0);
-			break;
+			getCharacterCurrentParams(kCharacterFrancois)[4] = 0;
+			getCharacterCurrentParams(kCharacterFrancois)[1] = 4;
+			getCharacterCurrentParams(kCharacterFrancois)[2] = 9460;
+			getCharacter(kCharacterFrancois).characterPosition.position = 2088;
+			walk(kCharacterFrancois, getCharacterCurrentParams(kCharacterFrancois)[1], getCharacterCurrentParams(kCharacterFrancois)[2]);
+
+			if (_gameProgress[kProgressChapter] == 1) {
+				if (checkLoc(kCharacterFrancois, kCarRedSleeping) &&
+					(whoOnScreen(kCharacterFrancois) || getCharacterCurrentParams(kCharacterFrancois)[0] < _gameTime || getCharacterCurrentParams(kCharacterFrancois)[3]) &&
+					!getCharacterCurrentParams(kCharacterFrancois)[4] && getCharacter(kCharacterFrancois).characterPosition.position < getCharacter(kCharacterMadame).characterPosition.position) {
+
+					if (getCharacter(kCharacterFrancois).direction == 2) {
+						send(kCharacterFrancois, kCharacterMadame, 202221040, 0);
+						getCharacterCurrentParams(kCharacterFrancois)[4] = 1;
+						getCharacterCurrentParams(kCharacterFrancois)[3] = 1;
+					} else if (getCharacterCurrentParams(kCharacterFrancois)[3] && nearChar(kCharacterFrancois, kCharacterMadame, 1000)) {
+						send(kCharacterFrancois, kCharacterMadame, 168986720, 0);
+						getCharacterCurrentParams(kCharacterFrancois)[4] = 1;
+					}
+				}
+			} else if (getCharacterCurrentParams(kCharacterFrancois)[0] < _gameTime) {
+				getCharacter(kCharacterFrancois).clothes = 0;
+				getCharacter(kCharacterFrancois).walkStepSize = 30;
+				getCharacter(kCharacterFrancois).inventoryItem = 0;
+				if (whoRunningDialog(kCharacterFrancois))
+					fadeDialog(kCharacterFrancois);
+				getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 4;
+				FrancoisCall(&LogicManager::CONS_Francois_DoWalk, 4, 5790, 0, 0);
+			}
+
+			break;
+		case 4:
+			getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 5;
+			FrancoisCall(&LogicManager::CONS_Francois_EnterComp, 0, 0, 0, 0);
+			break;
+		case 5:
+			getCharacter(kCharacterFrancois).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterFrancois, _functionsFrancois[getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall]]);
+			fedEx(kCharacterFrancois, kCharacterFrancois, 18, 0);
+			break;
+		case 6:
+			if (_gameProgress[kProgressJacket] == 2) {
+				if (!isNight()) {
+					if (getCharacter(kCharacterFrancois).characterPosition.position <= getCharacter(kCharacterCath).characterPosition.position) {
+						playNIS(kEventFrancoisWhistleD);
+					} else {
+						playNIS(kEventFrancoisWhistle);
+					}
+				} else if (getCharacter(kCharacterFrancois).characterPosition.position <= getCharacter(kCharacterCath).characterPosition.position) {
+					playNIS(kEventFrancoisWhistleNightD);
+				} else {
+					playNIS(kEventFrancoisWhistleNight);
+				}
+			}
+
+			if (getCharacter(kCharacterFrancois).direction == 1) {
+				bumpCathFx(getCharacter(kCharacterFrancois).characterPosition.car, getCharacter(kCharacterFrancois).characterPosition.position - 750);
+			} else {
+				bumpCathRx(getCharacter(kCharacterFrancois).characterPosition.car, getCharacter(kCharacterFrancois).characterPosition.position + 750);
+			}
+
+			break;
+		default:
+			break;
+		}
+
+		break;
+	case 102752636:
+		endGraphics(kCharacterFrancois);
+		getCharacter(kCharacterFrancois).characterPosition.location = 1;
+		getCharacter(kCharacterFrancois).characterPosition.position = 5790;
+		getCharacter(kCharacterFrancois).clothes = 0;
+		getCharacter(kCharacterFrancois).walkStepSize = 30;
+		getCharacter(kCharacterFrancois).inventoryItem = 0;
+
+		getCharacter(kCharacterFrancois).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterFrancois, _functionsFrancois[getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall]]);
+		fedEx(kCharacterFrancois, kCharacterFrancois, 18, 0);
+		break;
+	case 205346192:
+		if (msg->sender == 4) {
+			getCharacterCurrentParams(kCharacterFrancois)[7] = 1;
+		} else if (msg->sender == 3) {
+			getCharacterCurrentParams(kCharacterFrancois)[6] = 1;
+		}
+
+		break;
+	default:
+		break;
+	}
+}
+
+void LogicManager::CONS_Francois_TakeWalk(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterFrancois).callParams[getCharacter(kCharacterFrancois).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterFrancois, &LogicManager::HAND_Francois_TakeWalk);
+	getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall] = 12;
+
+	params->clear();
+
+	fedEx(kCharacterFrancois, kCharacterFrancois, 12, 0);
+}
+
+void LogicManager::HAND_Francois_TakeWalk(HAND_PARAMS) {
+	switch (msg->action) {
+	case 12:
+		getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 1;
+		FrancoisCall(&LogicManager::CONS_Francois_ExitComp, 0, 0, 0, 0);
+		break;
+	case 18:
+		switch (getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8]) {
+		case 1:
+			getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 2;
+			FrancoisCall(&LogicManager::CONS_Francois_DoWalk, 4, 9460, 0, 0);
+			break;
+		case 2:
+			getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 3;
+			FrancoisCall(&LogicManager::CONS_Francois_DoWait, 675, 0, 0, 0);
+			break;
+		case 3:
+			getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 4;
+			FrancoisCall(&LogicManager::CONS_Francois_DoWalk, 4, 540, 0, 0);
+			break;
 		case 4:
 			getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 5;
 			FrancoisCall(&LogicManager::CONS_Francois_DoWait, 675, 0, 0, 0);
@@ -708,8 +834,12 @@ void LogicManager::HAND_Francois_TakeWalk(HAND_PARAMS) {
 			fedEx(kCharacterFrancois, kCharacterFrancois, 18, 0);
 			break;
 		default:
-			return;
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -755,11 +885,15 @@ void LogicManager::HAND_Francois_HaremVisit(HAND_PARAMS) {
 		case 6:
 			getCharacter(kCharacterFrancois).characterPosition.location = 0;
 			getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 7;
-			FrancoisCall(&LogicManager::CONS_Francois_DoWalk, 4, 0x12E8, 0, 0);
+			FrancoisCall(&LogicManager::CONS_Francois_DoWalk, 4, 4840, 0, 0);
 			break;
 		case 7:
-			if (cathHasItem(kItemWhistle) || _gameInventory[kItemWhistle].location == 3)
-				goto LABEL_20;
+			if (cathHasItem(kItemWhistle) || _gameInventory[kItemWhistle].location == 3) {
+				getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 10;
+				FrancoisCall(&LogicManager::CONS_Francois_DoWalk, 4, 5790, 0, 0);
+				break;
+			}
+
 			startCycOtis(kCharacterFrancois, "605He");
 			softBlockAtDoor(kCharacterFrancois, 36);
 			getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 8;
@@ -777,7 +911,6 @@ void LogicManager::HAND_Francois_HaremVisit(HAND_PARAMS) {
 			break;
 		case 9:
 			softReleaseAtDoor(kCharacterFrancois, 36);
-		LABEL_20:
 			getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 10;
 			FrancoisCall(&LogicManager::CONS_Francois_DoWalk, 4, 5790, 0, 0);
 			break;
@@ -791,13 +924,16 @@ void LogicManager::HAND_Francois_HaremVisit(HAND_PARAMS) {
 			fedEx(kCharacterFrancois, kCharacterFrancois, 18, 0);
 			break;
 		default:
-			return;
+			break;
 		}
+
 		break;
 	case 190219584:
 		getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 6;
 		FrancoisCall(&LogicManager::CONS_Francois_DoCorrOtis, "605Ef", 6, 0, 0);
 		break;
+	default:
+		break;
 	}
 }
 
@@ -817,12 +953,14 @@ void LogicManager::CONS_Francois_ChaseBeetle(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Francois_ChaseBeetle(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		Common::strcpy_s((char *)&getCharacterCurrentParams(kCharacterFrancois)[5], 12, "605H");
 		Common::strcat_s((char *)&getCharacterCurrentParams(kCharacterFrancois)[5], 12, (char *)&getCharacterCurrentParams(kCharacterFrancois)[2]);
 		getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 1;
 		FrancoisCall(&LogicManager::CONS_Francois_ExitComp, 0, 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8]) {
 		case 1:
 			getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 2;
@@ -904,8 +1042,12 @@ void LogicManager::HAND_Francois_ChaseBeetle(HAND_PARAMS) {
 			fedEx(kCharacterFrancois, kCharacterFrancois, 18, 0);
 			break;
 		default:
-			return;
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -920,10 +1062,12 @@ void LogicManager::CONS_Francois_FindCath(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Francois_FindCath(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 1;
 		FrancoisCall(&LogicManager::CONS_Francois_ExitComp, 0, 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8]) {
 		case 1:
 			if (getCharacter(kCharacterCath).characterPosition.position <= getCharacter(kCharacterFrancois).characterPosition.position) {
@@ -933,6 +1077,7 @@ void LogicManager::HAND_Francois_FindCath(HAND_PARAMS) {
 				getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 2;
 				FrancoisCall(&LogicManager::CONS_Francois_DoWalk, 4, 9460, 0, 0);
 			}
+
 			break;
 		case 2:
 		case 3:
@@ -952,20 +1097,28 @@ void LogicManager::HAND_Francois_FindCath(HAND_PARAMS) {
 			FrancoisCall(&LogicManager::CONS_Francois_DoWait, 900, 0, 0, 0);
 			break;
 		case 7:
-			if (!inComp(kCharacterMadame, kCarRedSleeping, 5790))
-				goto LABEL_15;
-			getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 8;
-			FrancoisCall(&LogicManager::CONS_Francois_DoDialog, "Fra2012", 0, 0, 0);
+			if (!inComp(kCharacterMadame, kCarRedSleeping, 5790)) {
+				getCharacter(kCharacterFrancois).currentCall--;
+				_engine->getMessageManager()->setMessageHandle(kCharacterFrancois, _functionsFrancois[getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall]]);
+				fedEx(kCharacterFrancois, kCharacterFrancois, 18, 0);
+			} else {
+				getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 8;
+				FrancoisCall(&LogicManager::CONS_Francois_DoDialog, "Fra2012", 0, 0, 0);
+			}
+
 			break;
 		case 8:
-		LABEL_15:
 			getCharacter(kCharacterFrancois).currentCall--;
 			_engine->getMessageManager()->setMessageHandle(kCharacterFrancois, _functionsFrancois[getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall]]);
 			fedEx(kCharacterFrancois, kCharacterFrancois, 18, 0);
 			break;
 		default:
-			return;
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -980,48 +1133,54 @@ void LogicManager::CONS_Francois_LetsGo(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Francois_LetsGo(HAND_PARAMS) {
-	if (msg->action > 12) {
-		if (msg->action == 18) {
-			switch (getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8]) {
-			case 1:
-				getCharacter(kCharacterFrancois).characterPosition.location = 0;
-				getCharacter(kCharacterFrancois).characterPosition.position = 5890;
-				send(kCharacterFrancois, kCharacterMadame, 101107728, 0);
-				getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 2;
-				FrancoisCall(&LogicManager::CONS_Francois_DoWalk, 5, 850, 0, 0);
-				break;
-			case 2:
-				endGraphics(kCharacterFrancois);
-				send(kCharacterFrancois, kCharacterMonsieur, 237889408, 0);
-				break;
-			case 3:
-				getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 4;
-				FrancoisCall(&LogicManager::CONS_Francois_DoCorrOtis, "605Id", 35, 0, 0);
-				break;
-			case 4:
-				setDoor(35, kCharacterCath, 2, 255, 255);
-				send(kCharacterFrancois, kCharacterMadame, 100957716, 0);
-				getCharacter(kCharacterFrancois).characterPosition.position = 5790;
-				getCharacter(kCharacterFrancois).characterPosition.location = 1;
-				endGraphics(kCharacterFrancois);
-
-				getCharacter(kCharacterFrancois).currentCall--;
-				_engine->getMessageManager()->setMessageHandle(kCharacterFrancois, _functionsFrancois[getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall]]);
-				fedEx(kCharacterFrancois, kCharacterFrancois, 18, 0);
-				break;
-			default:
-				return;
-			}
-		} else if (msg->action == 100901266) {
-			getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 3;
-			FrancoisCall(&LogicManager::CONS_Francois_DoWalk, 4, 5790, 0, 0);
-		}
-	} else if (msg->action == 12) {
+	switch (msg->action) {
+	case 0:
+		getCharacter(kCharacterFrancois).characterPosition = getCharacter(kCharacterMonsieur).characterPosition;
+		break;
+	case 12:
 		setDoor(35, kCharacterCath, 0, 0, 0);
 		getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 1;
 		FrancoisCall(&LogicManager::CONS_Francois_DoCorrOtis, "605Cd", 35, 0, 0);
-	} else if (msg->action == 0) {
-		getCharacter(kCharacterFrancois).characterPosition = getCharacter(kCharacterMonsieur).characterPosition;
+		break;
+	case 18:
+		switch (getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8]) {
+		case 1:
+			getCharacter(kCharacterFrancois).characterPosition.location = 0;
+			getCharacter(kCharacterFrancois).characterPosition.position = 5890;
+			send(kCharacterFrancois, kCharacterMadame, 101107728, 0);
+			getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 2;
+			FrancoisCall(&LogicManager::CONS_Francois_DoWalk, 5, 850, 0, 0);
+			break;
+		case 2:
+			endGraphics(kCharacterFrancois);
+			send(kCharacterFrancois, kCharacterMonsieur, 237889408, 0);
+			break;
+		case 3:
+			getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 4;
+			FrancoisCall(&LogicManager::CONS_Francois_DoCorrOtis, "605Id", 35, 0, 0);
+			break;
+		case 4:
+			setDoor(35, kCharacterCath, 2, 255, 255);
+			send(kCharacterFrancois, kCharacterMadame, 100957716, 0);
+			getCharacter(kCharacterFrancois).characterPosition.position = 5790;
+			getCharacter(kCharacterFrancois).characterPosition.location = 1;
+			endGraphics(kCharacterFrancois);
+
+			getCharacter(kCharacterFrancois).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterFrancois, _functionsFrancois[getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall]]);
+			fedEx(kCharacterFrancois, kCharacterFrancois, 18, 0);
+			break;
+		default:
+			break;
+		}
+
+		break;
+	case 100901266:
+		getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 3;
+		FrancoisCall(&LogicManager::CONS_Francois_DoWalk, 4, 5790, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1036,15 +1195,21 @@ void LogicManager::CONS_Francois_Birth(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Francois_Birth(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			getCharacter(kCharacterFrancois).characterPosition.car = kCarRedSleeping;
-			getCharacter(kCharacterFrancois).characterPosition.position = 5790;
-			getCharacter(kCharacterFrancois).characterPosition.location = 1;
+	switch (msg->action) {
+	case 0:
+		if (_gameTime > 1062000 && !getCharacterCurrentParams(kCharacterFrancois)[0]) {
+			getCharacterCurrentParams(kCharacterFrancois)[0] = 1;
+			CONS_Francois_StartPart1(0, 0, 0, 0);
 		}
-	} else if (_gameTime > 1062000 && !getCharacterCurrentParams(kCharacterFrancois)[0]) {
-		getCharacterCurrentParams(kCharacterFrancois)[0] = 1;
-		CONS_Francois_StartPart1(0, 0, 0, 0);
+
+		break;
+	case 12:
+		getCharacter(kCharacterFrancois).characterPosition.car = kCarRedSleeping;
+		getCharacter(kCharacterFrancois).characterPosition.position = 5790;
+		getCharacter(kCharacterFrancois).characterPosition.location = 1;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1059,13 +1224,22 @@ void LogicManager::CONS_Francois_StartPart1(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Francois_StartPart1(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 18 && getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] == 1)
+	switch (msg->action) {
+	case 0:
+		if (_gameTime > 1075500 && !getCharacterCurrentParams(kCharacterFrancois)[0]) {
+			getCharacterCurrentParams(kCharacterFrancois)[0] = 1;
+			getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 1;
+			FrancoisCall(&LogicManager::CONS_Francois_Rampage, 1093500, 0, 0, 0);
+		}
+
+		break;
+	case 18:
+		if (getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] == 1)
 			CONS_Francois_InComp(0, 0, 0, 0);
-	} else if (_gameTime > 1075500 && !getCharacterCurrentParams(kCharacterFrancois)[0]) {
-		getCharacterCurrentParams(kCharacterFrancois)[0] = 1;
-		getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 1;
-		FrancoisCall(&LogicManager::CONS_Francois_Rampage, 1093500, 0, 0, 0);
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1080,15 +1254,21 @@ void LogicManager::CONS_Francois_InComp(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Francois_InComp(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 101107728) {
-			getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 1;
-			FrancoisCall(&LogicManager::CONS_Francois_LetsGo, 0, 0, 0, 0);
+	switch (msg->action) {
+	case 0:
+		if (_gameTime > 1161000 && !getCharacterCurrentParams(kCharacterFrancois)[0]) {
+			getCharacterCurrentParams(kCharacterFrancois)[0] = 1;
+			getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 2;
+			FrancoisCall(&LogicManager::CONS_Francois_TakeWalk, 0, 0, 0, 0);
 		}
-	} else if (_gameTime > 1161000 && !getCharacterCurrentParams(kCharacterFrancois)[0]) {
-		getCharacterCurrentParams(kCharacterFrancois)[0] = 1;
-		getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 2;
-		FrancoisCall(&LogicManager::CONS_Francois_TakeWalk, 0, 0, 0, 0);
+
+		break;
+	case 101107728:
+		getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 1;
+		FrancoisCall(&LogicManager::CONS_Francois_LetsGo, 0, 0, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1103,11 +1283,15 @@ void LogicManager::CONS_Francois_Asleep(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Francois_Asleep(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterFrancois).characterPosition.car = kCarRedSleeping;
 		getCharacter(kCharacterFrancois).characterPosition.position = 5790;
 		getCharacter(kCharacterFrancois).characterPosition.location = 1;
 		endGraphics(kCharacterFrancois);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1122,17 +1306,20 @@ void LogicManager::CONS_Francois_StartPart2(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Francois_StartPart2(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			endGraphics(kCharacterFrancois);
-			getCharacter(kCharacterFrancois).characterPosition.car = kCarRestaurant;
-			getCharacter(kCharacterFrancois).characterPosition.position = 4689;
-			getCharacter(kCharacterFrancois).characterPosition.location = 1;
-			getCharacter(kCharacterFrancois).clothes = 0;
-			getCharacter(kCharacterFrancois).inventoryItem = 0;
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		CONS_Francois_AtBreakfast(0, 0, 0, 0);
+		break;
+	case 12:
+		endGraphics(kCharacterFrancois);
+		getCharacter(kCharacterFrancois).characterPosition.car = kCarRestaurant;
+		getCharacter(kCharacterFrancois).characterPosition.position = 4689;
+		getCharacter(kCharacterFrancois).characterPosition.location = 1;
+		getCharacter(kCharacterFrancois).clothes = 0;
+		getCharacter(kCharacterFrancois).inventoryItem = 0;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1147,7 +1334,8 @@ void LogicManager::CONS_Francois_AtBreakfast(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Francois_AtBreakfast(HAND_PARAMS) {
-	if (msg->action == 18) {
+	switch (msg->action) {
+	case 18:
 		if (getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] == 1) {
 			getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 2;
 			FrancoisCall(&LogicManager::CONS_Francois_DoCorrOtis, "605Id", 35, 0, 0);
@@ -1159,9 +1347,14 @@ void LogicManager::HAND_Francois_AtBreakfast(HAND_PARAMS) {
 			endGraphics(kCharacterFrancois);
 			CONS_Francois_WithMama(0, 0, 0, 0);
 		}
-	} else if (msg->action == 100901266) {
+
+		break;
+	case 100901266:
 		getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 1;
 		FrancoisCall(&LogicManager::CONS_Francois_DoWalk, 4, 5790, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1176,103 +1369,243 @@ void LogicManager::CONS_Francois_WithMama(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Francois_WithMama(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		if ((_gameEvents[kEventFrancoisShowBeetle] || _gameEvents[kEventFrancoisShowBeetleD]) &&
 			!_gameEvents[kEventFrancoisTradeWhistle] && !_gameEvents[kEventFrancoisTradeWhistleD]) {
 			getCharacterParams(kCharacterFrancois, 8)[0] = 1;
 		}
+
 		if (getCharacterParams(kCharacterFrancois, 8)[0] && cathInCorridor(kCarRedSleeping)) {
 			getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 1;
 			FrancoisCall(&LogicManager::CONS_Francois_FindCath, 0, 0, 0, 0);
-			return;
+			break;
 		}
-	LABEL_17:
+
 		if (_gameTime > 1764000 && !getCharacterCurrentParams(kCharacterFrancois)[0]) {
 			getCharacterCurrentParams(kCharacterFrancois)[0] = 1;
 			getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 2;
 			FrancoisCall(&LogicManager::CONS_Francois_DoDialog, "Fra2011", 0, 0, 0);
-			return;
+			break;
 		}
-	LABEL_20:
+
 		if (_gameTime > 1800000 && !getCharacterCurrentParams(kCharacterFrancois)[1]) {
 			getCharacterCurrentParams(kCharacterFrancois)[1] = 1;
 			getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 3;
 			FrancoisCall(&LogicManager::CONS_Francois_HaremVisit, 0, 0, 0, 0);
-			return;
+			break;
 		}
-	LABEL_23:
+
 		if (!cathHasItem(kItemWhistle) && _gameInventory[kItemWhistle].location != 3) {
 			if (_gameTime > 1768500 && !getCharacterCurrentParams(kCharacterFrancois)[2]) {
 				getCharacterCurrentParams(kCharacterFrancois)[2] = 1;
 				getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 4;
 				FrancoisCall(&LogicManager::CONS_Francois_Rampage, 1773000, 0, 0, 0);
-				return;
+				break;
 			}
-		LABEL_28:
+
 			if (_gameTime > 1827000 && !getCharacterCurrentParams(kCharacterFrancois)[3]) {
 				getCharacterCurrentParams(kCharacterFrancois)[3] = 1;
 				getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 5;
 				FrancoisCall(&LogicManager::CONS_Francois_Rampage, 1831500, 0, 0, 0);
-				return;
+				break;
 			}
 		}
-	LABEL_31:
+
 		if (_gameInventory[kItemBeetle].location != 3) {
 			cathHasItem(kItemWhistle);
-			return;
+			break;
 		}
+
 		if (getCharacterCurrentParams(kCharacterFrancois)[4] != 2147483647 && _gameTime) {
-			if (_gameTime > 15803100)
-				goto LABEL_39;
+			if (_gameTime > 15803100) {
+				getCharacterCurrentParams(kCharacterFrancois)[4] = 0x7FFFFFFF;
+				getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 6;
+				FrancoisCall(&LogicManager::CONS_Francois_DoDialog, "Fra2010", 0, 0, 0);
+				break;
+			}
+
 			if (!nearChar(kCharacterFrancois, kCharacterCath, 2000) || !getCharacterCurrentParams(kCharacterFrancois)[4]) {
 				getCharacterCurrentParams(kCharacterFrancois)[4] = _gameTime + 75;
-				if (_gameTime == -75)
-					goto LABEL_40;
+				if (_gameTime == -75) {
+					getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 6;
+					FrancoisCall(&LogicManager::CONS_Francois_DoDialog, "Fra2010", 0, 0, 0);
+					break;
+				}
 			}
+
 			if (getCharacterCurrentParams(kCharacterFrancois)[4] < _gameTime) {
-			LABEL_39:
 				getCharacterCurrentParams(kCharacterFrancois)[4] = 0x7FFFFFFF;
-			LABEL_40:
 				getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 6;
 				FrancoisCall(&LogicManager::CONS_Francois_DoDialog, "Fra2010", 0, 0, 0);
-				return;
+				break;
 			}
 		}
-	LABEL_14:
-		if (_gameTime <= 1782000 || getCharacterCurrentParams(kCharacterFrancois)[5]) {
-		LABEL_41:
-			if (_gameTime > 1813500 && !getCharacterCurrentParams(kCharacterFrancois)[6]) {
-				getCharacterCurrentParams(kCharacterFrancois)[6] = 1;
-				getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 8;
-				FrancoisCall(&LogicManager::CONS_Francois_ChaseBeetle, 34, 6470, "c", 0);
-			}
-		} else {
+
+		if (_gameTime > 1782000 && !getCharacterCurrentParams(kCharacterFrancois)[5]) {
 			getCharacterCurrentParams(kCharacterFrancois)[5] = 1;
 			getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 7;
 			FrancoisCall(&LogicManager::CONS_Francois_ChaseBeetle, 37, 4070, "f", 0);
+			break;
 		}
-		return;
-	}
-	if (msg->action == 18) {
+
+		if (_gameTime > 1813500 && !getCharacterCurrentParams(kCharacterFrancois)[6]) {
+			getCharacterCurrentParams(kCharacterFrancois)[6] = 1;
+			getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 8;
+			FrancoisCall(&LogicManager::CONS_Francois_ChaseBeetle, 34, 6470, "c", 0);
+		}
+
+		break;
+	case 18:
 		switch (getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8]) {
 		case 1:
-			goto LABEL_17;
+			if (_gameTime > 1764000 && !getCharacterCurrentParams(kCharacterFrancois)[0]) {
+				getCharacterCurrentParams(kCharacterFrancois)[0] = 1;
+				getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 2;
+				FrancoisCall(&LogicManager::CONS_Francois_DoDialog, "Fra2011", 0, 0, 0);
+				break;
+			}
+
+			// fall through
 		case 2:
-			goto LABEL_20;
+			if (_gameTime > 1800000 && !getCharacterCurrentParams(kCharacterFrancois)[1]) {
+				getCharacterCurrentParams(kCharacterFrancois)[1] = 1;
+				getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 3;
+				FrancoisCall(&LogicManager::CONS_Francois_HaremVisit, 0, 0, 0, 0);
+				break;
+			}
+
+			// fall through
 		case 3:
-			goto LABEL_23;
+			if (!cathHasItem(kItemWhistle) && _gameInventory[kItemWhistle].location != 3) {
+				if (_gameTime > 1768500 && !getCharacterCurrentParams(kCharacterFrancois)[2]) {
+					getCharacterCurrentParams(kCharacterFrancois)[2] = 1;
+					getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 4;
+					FrancoisCall(&LogicManager::CONS_Francois_Rampage, 1773000, 0, 0, 0);
+					break;
+				}
+
+				if (_gameTime > 1827000 && !getCharacterCurrentParams(kCharacterFrancois)[3]) {
+					getCharacterCurrentParams(kCharacterFrancois)[3] = 1;
+					getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 5;
+					FrancoisCall(&LogicManager::CONS_Francois_Rampage, 1831500, 0, 0, 0);
+					break;
+				}
+			}
+
+			if (_gameInventory[kItemBeetle].location != 3) {
+				cathHasItem(kItemWhistle);
+				break;
+			}
+
+			if (getCharacterCurrentParams(kCharacterFrancois)[4] != 2147483647 && _gameTime) {
+				if (_gameTime > 15803100) {
+					getCharacterCurrentParams(kCharacterFrancois)[4] = 0x7FFFFFFF;
+					getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 6;
+					FrancoisCall(&LogicManager::CONS_Francois_DoDialog, "Fra2010", 0, 0, 0);
+					break;
+				}
+
+				if (!nearChar(kCharacterFrancois, kCharacterCath, 2000) || !getCharacterCurrentParams(kCharacterFrancois)[4]) {
+					getCharacterCurrentParams(kCharacterFrancois)[4] = _gameTime + 75;
+					if (_gameTime == -75) {
+						getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 6;
+						FrancoisCall(&LogicManager::CONS_Francois_DoDialog, "Fra2010", 0, 0, 0);
+						break;
+					}
+				}
+
+				if (getCharacterCurrentParams(kCharacterFrancois)[4] < _gameTime) {
+					getCharacterCurrentParams(kCharacterFrancois)[4] = 0x7FFFFFFF;
+					getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 6;
+					FrancoisCall(&LogicManager::CONS_Francois_DoDialog, "Fra2010", 0, 0, 0);
+					break;
+				}
+			}
+
+			if (_gameTime > 1782000 && !getCharacterCurrentParams(kCharacterFrancois)[5]) {
+				getCharacterCurrentParams(kCharacterFrancois)[5] = 1;
+				getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 7;
+				FrancoisCall(&LogicManager::CONS_Francois_ChaseBeetle, 37, 4070, "f", 0);
+				break;
+			}
+
+			if (_gameTime > 1813500 && !getCharacterCurrentParams(kCharacterFrancois)[6]) {
+				getCharacterCurrentParams(kCharacterFrancois)[6] = 1;
+				getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 8;
+				FrancoisCall(&LogicManager::CONS_Francois_ChaseBeetle, 34, 6470, "c", 0);
+			}
+
+			break;
 		case 4:
-			goto LABEL_28;
+			if (_gameTime > 1827000 && !getCharacterCurrentParams(kCharacterFrancois)[3]) {
+				getCharacterCurrentParams(kCharacterFrancois)[3] = 1;
+				getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 5;
+				FrancoisCall(&LogicManager::CONS_Francois_Rampage, 1831500, 0, 0, 0);
+				break;
+			}
+
+			// fall through
 		case 5:
-			goto LABEL_31;
+			if (_gameInventory[kItemBeetle].location != 3) {
+				cathHasItem(kItemWhistle);
+				break;
+			}
+
+			if (getCharacterCurrentParams(kCharacterFrancois)[4] != 2147483647 && _gameTime) {
+				if (_gameTime > 15803100) {
+					getCharacterCurrentParams(kCharacterFrancois)[4] = 0x7FFFFFFF;
+					getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 6;
+					FrancoisCall(&LogicManager::CONS_Francois_DoDialog, "Fra2010", 0, 0, 0);
+					break;
+				}
+
+				if (!nearChar(kCharacterFrancois, kCharacterCath, 2000) || !getCharacterCurrentParams(kCharacterFrancois)[4]) {
+					getCharacterCurrentParams(kCharacterFrancois)[4] = _gameTime + 75;
+					if (_gameTime == -75) {
+						getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 6;
+						FrancoisCall(&LogicManager::CONS_Francois_DoDialog, "Fra2010", 0, 0, 0);
+						break;
+					}
+				}
+
+				if (getCharacterCurrentParams(kCharacterFrancois)[4] < _gameTime) {
+					getCharacterCurrentParams(kCharacterFrancois)[4] = 0x7FFFFFFF;
+					getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 6;
+					FrancoisCall(&LogicManager::CONS_Francois_DoDialog, "Fra2010", 0, 0, 0);
+					break;
+				}
+			}
+
+			// fall through
 		case 6:
-			_gameProgress[kProgressField9C] = 1;
-			goto LABEL_14;
+			if (getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] == 6) {
+				_gameProgress[kProgressField9C] = 1;
+			}
+
+			if (_gameTime > 1782000 && !getCharacterCurrentParams(kCharacterFrancois)[5]) {
+				getCharacterCurrentParams(kCharacterFrancois)[5] = 1;
+				getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 7;
+				FrancoisCall(&LogicManager::CONS_Francois_ChaseBeetle, 37, 4070, "f", 0);
+				break;
+			}
+
+			// fall through
 		case 7:
-			goto LABEL_41;
+			if (_gameTime > 1813500 && !getCharacterCurrentParams(kCharacterFrancois)[6]) {
+				getCharacterCurrentParams(kCharacterFrancois)[6] = 1;
+				getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 8;
+				FrancoisCall(&LogicManager::CONS_Francois_ChaseBeetle, 34, 6470, "c", 0);
+			}
+
+			break;
 		default:
-			return;
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1287,17 +1620,20 @@ void LogicManager::CONS_Francois_StartPart3(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Francois_StartPart3(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			endGraphics(kCharacterFrancois);
-			getCharacter(kCharacterFrancois).characterPosition.car = kCarRedSleeping;
-			getCharacter(kCharacterFrancois).characterPosition.position = 5790;
-			getCharacter(kCharacterFrancois).characterPosition.location = 1;
-			getCharacter(kCharacterFrancois).clothes = 0;
-			getCharacter(kCharacterFrancois).inventoryItem = 0;
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		CONS_Francois_InPart3(0, 0, 0, 0);
+		break;
+	case 12:
+		endGraphics(kCharacterFrancois);
+		getCharacter(kCharacterFrancois).characterPosition.car = kCarRedSleeping;
+		getCharacter(kCharacterFrancois).characterPosition.position = 5790;
+		getCharacter(kCharacterFrancois).characterPosition.location = 1;
+		getCharacter(kCharacterFrancois).clothes = 0;
+		getCharacter(kCharacterFrancois).inventoryItem = 0;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1312,172 +1648,380 @@ void LogicManager::CONS_Francois_InPart3(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Francois_InPart3(HAND_PARAMS) {
-	if (msg->action > 18) {
-		switch (msg->action) {
-		case 101107728:
-			getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 1;
-			FrancoisCall(&LogicManager::CONS_Francois_LetsGo, 0, 0, 0, 0);
-			break;
-		case 189872836:
-			getCharacterCurrentParams(kCharacterFrancois)[0] = 1;
-			break;
-		case 190390860:
-			getCharacterCurrentParams(kCharacterFrancois)[0] = 0;
-			break;
-		}
-	} else if (msg->action == 18) {
-		switch (getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8]) {
-		case 1:
-			getCharacterCurrentParams(kCharacterFrancois)[1] = 1;
-			break;
-		case 2:
-			goto LABEL_26;
-		case 3:
-			goto LABEL_29;
-		case 4:
-			goto LABEL_32;
-		case 5:
-			goto LABEL_35;
-		case 6:
-			goto LABEL_38;
-		case 7:
-			goto LABEL_41;
-		case 8:
-			goto LABEL_44;
-		case 9:
-			goto LABEL_47;
-		case 10:
-			goto LABEL_52;
-		case 11:
-			goto LABEL_55;
-		case 12:
-			_gameProgress[kProgressField9C] = 1;
-			goto LABEL_23;
-		case 13:
-			goto LABEL_65;
-		case 14:
-			goto LABEL_68;
-		default:
-			return;
-		}
-	} else if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		if ((_gameEvents[kEventFrancoisShowBeetle] || _gameEvents[kEventFrancoisShowBeetleD]) && !_gameEvents[kEventFrancoisTradeWhistle] && !_gameEvents[kEventFrancoisTradeWhistleD]) {
 			getCharacterParams(kCharacterFrancois, 8)[0] = 1;
 		}
+
 		if (getCharacterCurrentParams(kCharacterFrancois)[1] && inComp(kCharacterMadame, kCarRedSleeping, 5790) && !getCharacterCurrentParams(kCharacterFrancois)[0]) {
 			if (getCharacterParams(kCharacterFrancois, 8)[0] && cathInCorridor(kCarRedSleeping)) {
 				getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 2;
 				FrancoisCall(&LogicManager::CONS_Francois_FindCath, 0, 0, 0, 0);
-				return;
+				break;
 			}
-		LABEL_26:
+
 			if (_gameTime > 2025000 && !getCharacterCurrentParams(kCharacterFrancois)[2]) {
 				getCharacterCurrentParams(kCharacterFrancois)[2] = 1;
 				getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 3;
 				FrancoisCall(&LogicManager::CONS_Francois_TakeWalk, 0, 0, 0, 0);
-				return;
+				break;
 			}
-		LABEL_29:
+
 			if (_gameTime > 2052000 && !getCharacterCurrentParams(kCharacterFrancois)[3]) {
 				getCharacterCurrentParams(kCharacterFrancois)[3] = 1;
 				getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 4;
 				FrancoisCall(&LogicManager::CONS_Francois_TakeWalk, 0, 0, 0, 0);
-				return;
+				break;
 			}
-		LABEL_32:
+
 			if (_gameTime > 2079000 && !getCharacterCurrentParams(kCharacterFrancois)[4]) {
 				getCharacterCurrentParams(kCharacterFrancois)[4] = 1;
 				getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 5;
 				FrancoisCall(&LogicManager::CONS_Francois_TakeWalk, 0, 0, 0, 0);
-				return;
+				break;
 			}
-		LABEL_35:
+
 			if (_gameTime > 2092500 && !getCharacterCurrentParams(kCharacterFrancois)[5]) {
 				getCharacterCurrentParams(kCharacterFrancois)[5] = 1;
 				getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 6;
 				FrancoisCall(&LogicManager::CONS_Francois_TakeWalk, 0, 0, 0, 0);
-				return;
+				break;
 			}
-		LABEL_38:
+
 			if (_gameTime > 2173500 && !getCharacterCurrentParams(kCharacterFrancois)[6]) {
 				getCharacterCurrentParams(kCharacterFrancois)[6] = 1;
 				getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 7;
 				FrancoisCall(&LogicManager::CONS_Francois_TakeWalk, 0, 0, 0, 0);
-				return;
+				break;
 			}
-		LABEL_41:
+
 			if (_gameTime > 2182500 && !getCharacterCurrentParams(kCharacterFrancois)[7]) {
 				getCharacterCurrentParams(kCharacterFrancois)[7] = 1;
 				getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 8;
 				FrancoisCall(&LogicManager::CONS_Francois_TakeWalk, 0, 0, 0, 0);
-				return;
+				break;
 			}
-		LABEL_44:
+
 			if (_gameTime > 2241000 && !getCharacterCurrentParams(kCharacterFrancois)[8]) {
 				getCharacterCurrentParams(kCharacterFrancois)[8] = 1;
 				getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 9;
 				FrancoisCall(&LogicManager::CONS_Francois_TakeWalk, 0, 0, 0, 0);
-				return;
+				break;
 			}
-		LABEL_47:
+
 			if (!cathHasItem(kItemWhistle) && _gameInventory[kItemWhistle].location != 3) {
 				if (_gameTime > 2011500 && !getCharacterCurrentParams(kCharacterFrancois)[9]) {
 					getCharacterCurrentParams(kCharacterFrancois)[9] = 1;
 					getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 10;
 					FrancoisCall(&LogicManager::CONS_Francois_Rampage, 2016000, 0, 0, 0);
-					return;
+					break;
 				}
-			LABEL_52:
+
 				if (_gameTime > 2115000 && !getCharacterCurrentParams(kCharacterFrancois)[10]) {
 					getCharacterCurrentParams(kCharacterFrancois)[10] = 1;
 					getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 11;
 					FrancoisCall(&LogicManager::CONS_Francois_Rampage, 2119500, 0, 0, 0);
-					return;
+					break;
 				}
 			}
-		LABEL_55:
+
 			if (_gameInventory[kItemBeetle].location == 3) {
 				if (getCharacterCurrentParams(kCharacterFrancois)[11] != 0x7FFFFFFF && _gameTime) {
-					if (_gameTime > 15803100)
-						goto LABEL_63;
+					if (_gameTime > 15803100) {
+						getCharacterCurrentParams(kCharacterFrancois)[11] = 0x7FFFFFFF;
+						getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 12;
+						FrancoisCall(&LogicManager::CONS_Francois_DoDialog, "Fra2010", 0, 0, 0);
+						break;
+					}
+
 					if (!nearChar(kCharacterFrancois, kCharacterCath, 2000) || !getCharacterCurrentParams(kCharacterFrancois)[11]) {
 						getCharacterCurrentParams(kCharacterFrancois)[11] = _gameTime + 75;
-						if (_gameTime == -75)
-							goto LABEL_64;
+						if (_gameTime == -75) {
+							getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 12;
+							FrancoisCall(&LogicManager::CONS_Francois_DoDialog, "Fra2010", 0, 0, 0);
+							break;
+						}
 					}
+
 					if (getCharacterCurrentParams(kCharacterFrancois)[11] < _gameTime) {
-					LABEL_63:
 						getCharacterCurrentParams(kCharacterFrancois)[11] = 0x7FFFFFFF;
-					LABEL_64:
 						getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 12;
 						FrancoisCall(&LogicManager::CONS_Francois_DoDialog, "Fra2010", 0, 0, 0);
-						return;
+						break;
 					}
 				}
-			LABEL_23:
-				if (_gameTime <= 2040300 || getCharacterCurrentParams(kCharacterFrancois)[12]) {
-				LABEL_65:
-					if (_gameTime <= 2146500 || getCharacterCurrentParams(kCharacterFrancois)[13]) {
-					LABEL_68:
-						if (_gameTime > 2218500 && !getCharacterCurrentParams(kCharacterFrancois)[14]) {
-							getCharacterCurrentParams(kCharacterFrancois)[14] = 1;
-							getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 15;
-							FrancoisCall(&LogicManager::CONS_Francois_ChaseBeetle, 33, 7500, "b", 0);
+
+				if (_gameTime > 2040300 && !getCharacterCurrentParams(kCharacterFrancois)[12]) {
+					getCharacterCurrentParams(kCharacterFrancois)[12] = 1;
+					getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 13;
+					FrancoisCall(&LogicManager::CONS_Francois_ChaseBeetle, 36, 4840, "e", 0);
+					break;
+				}
+
+				if (_gameTime > 2146500 && !getCharacterCurrentParams(kCharacterFrancois)[13]) {
+					getCharacterCurrentParams(kCharacterFrancois)[13] = 1;
+					getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 14;
+					FrancoisCall(&LogicManager::CONS_Francois_ChaseBeetle, 37, 4070, "f", 0);
+					break;
+				}
+
+				if (_gameTime > 2218500 && !getCharacterCurrentParams(kCharacterFrancois)[14]) {
+					getCharacterCurrentParams(kCharacterFrancois)[14] = 1;
+					getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 15;
+					FrancoisCall(&LogicManager::CONS_Francois_ChaseBeetle, 33, 7500, "b", 0);
+					break;
+				}
+			} else {
+				cathHasItem(kItemWhistle);
+			}
+		}
+
+		break;
+	case 18:
+		switch (getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8]) {
+		case 1:
+			getCharacterCurrentParams(kCharacterFrancois)[1] = 1;
+			break;
+		case 2:
+			if (_gameTime > 2025000 && !getCharacterCurrentParams(kCharacterFrancois)[2]) {
+				getCharacterCurrentParams(kCharacterFrancois)[2] = 1;
+				getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 3;
+				FrancoisCall(&LogicManager::CONS_Francois_TakeWalk, 0, 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 3:
+			if (_gameTime > 2052000 && !getCharacterCurrentParams(kCharacterFrancois)[3]) {
+				getCharacterCurrentParams(kCharacterFrancois)[3] = 1;
+				getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 4;
+				FrancoisCall(&LogicManager::CONS_Francois_TakeWalk, 0, 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 4:
+			if (_gameTime > 2079000 && !getCharacterCurrentParams(kCharacterFrancois)[4]) {
+				getCharacterCurrentParams(kCharacterFrancois)[4] = 1;
+				getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 5;
+				FrancoisCall(&LogicManager::CONS_Francois_TakeWalk, 0, 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 5:
+			if (_gameTime > 2092500 && !getCharacterCurrentParams(kCharacterFrancois)[5]) {
+				getCharacterCurrentParams(kCharacterFrancois)[5] = 1;
+				getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 6;
+				FrancoisCall(&LogicManager::CONS_Francois_TakeWalk, 0, 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 6:
+			if (_gameTime > 2173500 && !getCharacterCurrentParams(kCharacterFrancois)[6]) {
+				getCharacterCurrentParams(kCharacterFrancois)[6] = 1;
+				getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 7;
+				FrancoisCall(&LogicManager::CONS_Francois_TakeWalk, 0, 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 7:
+			if (_gameTime > 2182500 && !getCharacterCurrentParams(kCharacterFrancois)[7]) {
+				getCharacterCurrentParams(kCharacterFrancois)[7] = 1;
+				getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 8;
+				FrancoisCall(&LogicManager::CONS_Francois_TakeWalk, 0, 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 8:
+			if (_gameTime > 2241000 && !getCharacterCurrentParams(kCharacterFrancois)[8]) {
+				getCharacterCurrentParams(kCharacterFrancois)[8] = 1;
+				getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 9;
+				FrancoisCall(&LogicManager::CONS_Francois_TakeWalk, 0, 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 9:
+			if (!cathHasItem(kItemWhistle) && _gameInventory[kItemWhistle].location != 3) {
+				if (_gameTime > 2011500 && !getCharacterCurrentParams(kCharacterFrancois)[9]) {
+					getCharacterCurrentParams(kCharacterFrancois)[9] = 1;
+					getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 10;
+					FrancoisCall(&LogicManager::CONS_Francois_Rampage, 2016000, 0, 0, 0);
+					break;
+				}
+
+				if (_gameTime > 2115000 && !getCharacterCurrentParams(kCharacterFrancois)[10]) {
+					getCharacterCurrentParams(kCharacterFrancois)[10] = 1;
+					getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 11;
+					FrancoisCall(&LogicManager::CONS_Francois_Rampage, 2119500, 0, 0, 0);
+					break;
+				}
+			}
+
+			if (_gameInventory[kItemBeetle].location == 3) {
+				if (getCharacterCurrentParams(kCharacterFrancois)[11] != 0x7FFFFFFF && _gameTime) {
+					if (_gameTime > 15803100) {
+						getCharacterCurrentParams(kCharacterFrancois)[11] = 0x7FFFFFFF;
+						getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 12;
+						FrancoisCall(&LogicManager::CONS_Francois_DoDialog, "Fra2010", 0, 0, 0);
+						break;
+					}
+
+					if (!nearChar(kCharacterFrancois, kCharacterCath, 2000) || !getCharacterCurrentParams(kCharacterFrancois)[11]) {
+						getCharacterCurrentParams(kCharacterFrancois)[11] = _gameTime + 75;
+						if (_gameTime == -75) {
+							getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 12;
+							FrancoisCall(&LogicManager::CONS_Francois_DoDialog, "Fra2010", 0, 0, 0);
+							break;
 						}
-					} else {
-						getCharacterCurrentParams(kCharacterFrancois)[13] = 1;
-						getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 14;
-						FrancoisCall(&LogicManager::CONS_Francois_ChaseBeetle, 37, 4070, "f", 0);
 					}
-				} else {
+
+					if (getCharacterCurrentParams(kCharacterFrancois)[11] < _gameTime) {
+						getCharacterCurrentParams(kCharacterFrancois)[11] = 0x7FFFFFFF;
+						getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 12;
+						FrancoisCall(&LogicManager::CONS_Francois_DoDialog, "Fra2010", 0, 0, 0);
+						break;
+					}
+				}
+
+				if (_gameTime > 2040300 && !getCharacterCurrentParams(kCharacterFrancois)[12]) {
 					getCharacterCurrentParams(kCharacterFrancois)[12] = 1;
 					getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 13;
 					FrancoisCall(&LogicManager::CONS_Francois_ChaseBeetle, 36, 4840, "e", 0);
+					break;
+				}
+
+				if (_gameTime > 2146500 && !getCharacterCurrentParams(kCharacterFrancois)[13]) {
+					getCharacterCurrentParams(kCharacterFrancois)[13] = 1;
+					getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 14;
+					FrancoisCall(&LogicManager::CONS_Francois_ChaseBeetle, 37, 4070, "f", 0);
+					break;
+				}
+
+				if (_gameTime > 2218500 && !getCharacterCurrentParams(kCharacterFrancois)[14]) {
+					getCharacterCurrentParams(kCharacterFrancois)[14] = 1;
+					getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 15;
+					FrancoisCall(&LogicManager::CONS_Francois_ChaseBeetle, 33, 7500, "b", 0);
+					break;
 				}
 			} else {
 				cathHasItem(kItemWhistle);
 			}
+
+			break;
+		case 10:
+			if (_gameTime > 2115000 && !getCharacterCurrentParams(kCharacterFrancois)[10]) {
+				getCharacterCurrentParams(kCharacterFrancois)[10] = 1;
+				getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 11;
+				FrancoisCall(&LogicManager::CONS_Francois_Rampage, 2119500, 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 11:
+			if (_gameInventory[kItemBeetle].location == 3) {
+				if (getCharacterCurrentParams(kCharacterFrancois)[11] != 0x7FFFFFFF && _gameTime) {
+					if (_gameTime > 15803100) {
+						getCharacterCurrentParams(kCharacterFrancois)[11] = 0x7FFFFFFF;
+						getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 12;
+						FrancoisCall(&LogicManager::CONS_Francois_DoDialog, "Fra2010", 0, 0, 0);
+						break;
+					}
+
+					if (!nearChar(kCharacterFrancois, kCharacterCath, 2000) || !getCharacterCurrentParams(kCharacterFrancois)[11]) {
+						getCharacterCurrentParams(kCharacterFrancois)[11] = _gameTime + 75;
+						if (_gameTime == -75) {
+							getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 12;
+							FrancoisCall(&LogicManager::CONS_Francois_DoDialog, "Fra2010", 0, 0, 0);
+							break;
+						}
+					}
+
+					if (getCharacterCurrentParams(kCharacterFrancois)[11] < _gameTime) {
+						getCharacterCurrentParams(kCharacterFrancois)[11] = 0x7FFFFFFF;
+						getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 12;
+						FrancoisCall(&LogicManager::CONS_Francois_DoDialog, "Fra2010", 0, 0, 0);
+						break;
+					}
+				}
+
+				if (_gameTime > 2040300 && !getCharacterCurrentParams(kCharacterFrancois)[12]) {
+					getCharacterCurrentParams(kCharacterFrancois)[12] = 1;
+					getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 13;
+					FrancoisCall(&LogicManager::CONS_Francois_ChaseBeetle, 36, 4840, "e", 0);
+					break;
+				}
+
+				if (_gameTime > 2146500 && !getCharacterCurrentParams(kCharacterFrancois)[13]) {
+					getCharacterCurrentParams(kCharacterFrancois)[13] = 1;
+					getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 14;
+					FrancoisCall(&LogicManager::CONS_Francois_ChaseBeetle, 37, 4070, "f", 0);
+					break;
+				}
+
+				if (_gameTime > 2218500 && !getCharacterCurrentParams(kCharacterFrancois)[14]) {
+					getCharacterCurrentParams(kCharacterFrancois)[14] = 1;
+					getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 15;
+					FrancoisCall(&LogicManager::CONS_Francois_ChaseBeetle, 33, 7500, "b", 0);
+					break;
+				}
+			} else {
+				cathHasItem(kItemWhistle);
+			}
+
+			break;
+		case 12:
+			if (getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] == 12) {
+				_gameProgress[kProgressField9C] = 1;
+			}
+
+			if (_gameTime > 2040300 && !getCharacterCurrentParams(kCharacterFrancois)[12]) {
+				getCharacterCurrentParams(kCharacterFrancois)[12] = 1;
+				getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 13;
+				FrancoisCall(&LogicManager::CONS_Francois_ChaseBeetle, 36, 4840, "e", 0);
+				break;
+			}
+
+			// fall through
+		case 13:
+			if (_gameTime > 2146500 && !getCharacterCurrentParams(kCharacterFrancois)[13]) {
+				getCharacterCurrentParams(kCharacterFrancois)[13] = 1;
+				getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 14;
+				FrancoisCall(&LogicManager::CONS_Francois_ChaseBeetle, 37, 4070, "f", 0);
+				break;
+			}
+
+			// fall through
+		case 14:
+			if (_gameTime > 2218500 && !getCharacterCurrentParams(kCharacterFrancois)[14]) {
+				getCharacterCurrentParams(kCharacterFrancois)[14] = 1;
+				getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 15;
+				FrancoisCall(&LogicManager::CONS_Francois_ChaseBeetle, 33, 7500, "b", 0);
+			}
+
+			break;
+		default:
+			break;
 		}
+
+		break;
+	case 101107728:
+		getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 1;
+		FrancoisCall(&LogicManager::CONS_Francois_LetsGo, 0, 0, 0, 0);
+		break;
+	case 189872836:
+		getCharacterCurrentParams(kCharacterFrancois)[0] = 1;
+		break;
+	case 190390860:
+		getCharacterCurrentParams(kCharacterFrancois)[0] = 0;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1492,17 +2036,20 @@ void LogicManager::CONS_Francois_StartPart4(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Francois_StartPart4(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			endGraphics(kCharacterFrancois);
-			getCharacter(kCharacterFrancois).characterPosition.car = kCarRedSleeping;
-			getCharacter(kCharacterFrancois).characterPosition.position = 5790;
-			getCharacter(kCharacterFrancois).characterPosition.location = 1;
-			getCharacter(kCharacterFrancois).clothes = 0;
-			getCharacter(kCharacterFrancois).inventoryItem = 0;
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		CONS_Francois_InPart4(0, 0, 0, 0);
+		break;
+	case 12:
+		endGraphics(kCharacterFrancois);
+		getCharacter(kCharacterFrancois).characterPosition.car = kCarRedSleeping;
+		getCharacter(kCharacterFrancois).characterPosition.position = 5790;
+		getCharacter(kCharacterFrancois).characterPosition.location = 1;
+		getCharacter(kCharacterFrancois).clothes = 0;
+		getCharacter(kCharacterFrancois).inventoryItem = 0;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1517,9 +2064,13 @@ void LogicManager::CONS_Francois_InPart4(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Francois_InPart4(HAND_PARAMS) {
-	if (msg->action == 101107728) {
+	switch (msg->action) {
+	case 101107728:
 		getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 1;
 		FrancoisCall(&LogicManager::CONS_Francois_LetsGo, 0, 0, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1534,17 +2085,20 @@ void LogicManager::CONS_Francois_StartPart5(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Francois_StartPart5(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			endGraphics(kCharacterFrancois);
-			getCharacter(kCharacterFrancois).characterPosition.car = kCarRestaurant;
-			getCharacter(kCharacterFrancois).characterPosition.position = 3969;
-			getCharacter(kCharacterFrancois).characterPosition.location = 1;
-			getCharacter(kCharacterFrancois).clothes = 0;
-			getCharacter(kCharacterFrancois).inventoryItem = 0;
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		CONS_Francois_Prisoner(0, 0, 0, 0);
+		break;
+	case 12:
+		endGraphics(kCharacterFrancois);
+		getCharacter(kCharacterFrancois).characterPosition.car = kCarRestaurant;
+		getCharacter(kCharacterFrancois).characterPosition.position = 3969;
+		getCharacter(kCharacterFrancois).characterPosition.location = 1;
+		getCharacter(kCharacterFrancois).clothes = 0;
+		getCharacter(kCharacterFrancois).inventoryItem = 0;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1559,10 +2113,15 @@ void LogicManager::CONS_Francois_Prisoner(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Francois_Prisoner(HAND_PARAMS) {
-	if (msg->action == 70549068) {
+	switch (msg->action) {
+	case 70549068:
 		if (!cathHasItem(kItemWhistle) && _gameInventory[kItemWhistle].location != 3)
 			dropItem(kItemWhistle, 1);
+
 		CONS_Francois_Hiding(0, 0, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1577,14 +2136,19 @@ void LogicManager::CONS_Francois_Hiding(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Francois_Hiding(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterFrancois).characterPosition.car = kCarRedSleeping;
 		getCharacter(kCharacterFrancois).characterPosition.position = 5790;
 		getCharacter(kCharacterFrancois).characterPosition.location = 1;
 		getCharacter(kCharacterFrancois).clothes = 0;
 		getCharacter(kCharacterFrancois).inventoryItem = 0;
-	} else if (msg->action == 135800432) {
+		break;
+	case 135800432:
 		CONS_Francois_Disappear(0, 0, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 


Commit: 29d373e5fb762eb5f3783bad5765a6023019d3ae
    https://github.com/scummvm/scummvm/commit/29d373e5fb762eb5f3783bad5765a6023019d3ae
Author: AndywinXp (andywinxp at gmail.com)
Date: 2025-06-16T23:12:18+02:00

Commit Message:
LASTEXPRESS: Clean up HeadWait logic

Changed paths:
    engines/lastexpress/characters/headwait.cpp


diff --git a/engines/lastexpress/characters/headwait.cpp b/engines/lastexpress/characters/headwait.cpp
index b060feee4ae..ca0fae90f9b 100644
--- a/engines/lastexpress/characters/headwait.cpp
+++ b/engines/lastexpress/characters/headwait.cpp
@@ -48,7 +48,7 @@ void LogicManager::CONS_HeadWait(int chapter) {
 		CONS_HeadWait_StartPart5(0, 0, 0, 0);
 		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -82,10 +82,13 @@ void LogicManager::HAND_HeadWait_DoSeqOtis(HAND_PARAMS) {
 			playChrExcuseMe(kCharacterHeadWait, kCharacterCath, 0);
 			getCharacterCurrentParams(kCharacterHeadWait)[3] = 1;
 		}
+
 		break;
 	case 12:
 		startSeqOtis(kCharacterHeadWait, (char *)&getCharacterCurrentParams(kCharacterHeadWait)[0]);
 		break;
+	default:
+		break;
 	}
 }
 
@@ -100,18 +103,18 @@ void LogicManager::CONS_HeadWait_WaitRCClear(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_HeadWait_WaitRCClear(HAND_PARAMS) {
-	if (msg->action == 0) {
-		if (!rcClear())
-			return;
+	switch (msg->action) {
+	case 0:
+	case 12:
+		if (rcClear()) {
+			getCharacter(kCharacterHeadWait).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterHeadWait, _functionsHeadWait[getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall]]);
+			fedEx(kCharacterHeadWait, kCharacterHeadWait, 18, 0);
+		}
 
-		getCharacter(kCharacterHeadWait).currentCall--;
-		_engine->getMessageManager()->setMessageHandle(kCharacterHeadWait, _functionsHeadWait[getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall]]);
-		fedEx(kCharacterHeadWait, kCharacterHeadWait, 18, 0);
-	}
-	if (msg->action == 12 && rcClear()) {
-		getCharacter(kCharacterHeadWait).currentCall--;
-		_engine->getMessageManager()->setMessageHandle(kCharacterHeadWait, _functionsHeadWait[getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall]]);
-		fedEx(kCharacterHeadWait, kCharacterHeadWait, 18, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -126,23 +129,29 @@ void LogicManager::CONS_HeadWait_FinishSeqOtis(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_HeadWait_FinishSeqOtis(HAND_PARAMS) {
-	if (msg->action == 0) {
-		if (getCharacter(kCharacterHeadWait).direction == 4)
-			return;
-		getCharacter(kCharacterHeadWait).currentCall--;
-		_engine->getMessageManager()->setMessageHandle(kCharacterHeadWait, _functionsHeadWait[getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall]]);
-		fedEx(kCharacterHeadWait, kCharacterHeadWait, 18, 0);
-		return;
-	}
-	if (msg->action == 3) {
+	switch (msg->action) {
+	case 0:
+		if (getCharacter(kCharacterHeadWait).direction != 4) {
+			getCharacter(kCharacterHeadWait).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterHeadWait, _functionsHeadWait[getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall]]);
+			fedEx(kCharacterHeadWait, kCharacterHeadWait, 18, 0);
+		}
+
+		break;
+	case 3:
 		getCharacter(kCharacterHeadWait).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterHeadWait, _functionsHeadWait[getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall]]);
 		fedEx(kCharacterHeadWait, kCharacterHeadWait, 18, 0);
-		return;
-	}
-	if (msg->action == 5 && !getCharacterCurrentParams(kCharacterHeadWait)[0]) {
-		playChrExcuseMe(kCharacterHeadWait, kCharacterCath, 0);
-		getCharacterCurrentParams(kCharacterHeadWait)[0] = 1;
+		break;
+	case 5:
+		if (!getCharacterCurrentParams(kCharacterHeadWait)[0]) {
+			playChrExcuseMe(kCharacterHeadWait, kCharacterCath, 0);
+			getCharacterCurrentParams(kCharacterHeadWait)[0] = 1;
+		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -159,10 +168,11 @@ void LogicManager::CONS_HeadWait_DoWait(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_HeadWait_DoWait(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		if (getCharacterCurrentParams(kCharacterHeadWait)[1] || (getCharacterCurrentParams(kCharacterHeadWait)[1] = _gameTime + getCharacterCurrentParams(kCharacterHeadWait)[0], _gameTime + getCharacterCurrentParams(kCharacterHeadWait)[0] != 0)) {
 			if (getCharacterCurrentParams(kCharacterHeadWait)[1] >= _gameTime)
-				return;
+				break;
 
 			getCharacterCurrentParams(kCharacterHeadWait)[1] = 0x7FFFFFFF;
 		}
@@ -170,6 +180,9 @@ void LogicManager::HAND_HeadWait_DoWait(HAND_PARAMS) {
 		getCharacter(kCharacterHeadWait).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterHeadWait, _functionsHeadWait[getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall]]);
 		fedEx(kCharacterHeadWait, kCharacterHeadWait, 18, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -202,11 +215,14 @@ void LogicManager::HAND_HeadWait_DoBlockSeqOtis(HAND_PARAMS) {
 			playChrExcuseMe(kCharacterHeadWait, kCharacterCath, 0);
 			getCharacterCurrentParams(kCharacterHeadWait)[5] = 1;
 		}
+
 		break;
 	case 12:
 		startSeqOtis(kCharacterHeadWait, (char *)&getCharacterCurrentParams(kCharacterHeadWait)[0]);
 		blockView(kCharacterHeadWait, getCharacterCurrentParams(kCharacterHeadWait)[3], getCharacterCurrentParams(kCharacterHeadWait)[4]);
 		break;
+	default:
+		break;
 	}
 }
 
@@ -223,12 +239,17 @@ void LogicManager::CONS_HeadWait_DoDialog(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_HeadWait_DoDialog(HAND_PARAMS) {
-	if (msg->action == 2) {
+	switch (msg->action) {
+	case 2:
 		getCharacter(kCharacterHeadWait).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterHeadWait, _functionsHeadWait[getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall]]);
 		fedEx(kCharacterHeadWait, kCharacterHeadWait, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		playDialog(kCharacterHeadWait, (char *)&getCharacterCurrentParams(kCharacterHeadWait)[0], -1, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -243,13 +264,18 @@ void LogicManager::CONS_HeadWait_DoComplexSeqOtis(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_HeadWait_DoComplexSeqOtis(HAND_PARAMS) {
-	if (msg->action == 3) {
+	switch (msg->action) {
+	case 3:
 		getCharacter(kCharacterHeadWait).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterHeadWait, _functionsHeadWait[getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall]]);
 		fedEx(kCharacterHeadWait, kCharacterHeadWait, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		startSeqOtis(kCharacterHeadWait, (char *)&getCharacterCurrentParams(kCharacterHeadWait)[0]);
 		startSeqOtis(getCharacterCurrentParams(kCharacterHeadWait)[6], (char *)&getCharacterCurrentParams(kCharacterHeadWait)[3]);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -264,12 +290,14 @@ void LogicManager::CONS_HeadWait_RebeccaHereWeAre(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_HeadWait_RebeccaHereWeAre(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterHeadWait).characterPosition.position = 850;
 		getCharacter(kCharacterHeadWait).characterPosition.location = 0;
 		getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall + 8] = 1;
 		HeadWaitCall(&LogicManager::CONS_HeadWait_DoSeqOtis, "901", 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall + 8]) {
 		case 1:
 			switch (_gameProgress[kProgressChapter]) {
@@ -282,7 +310,10 @@ void LogicManager::HAND_HeadWait_RebeccaHereWeAre(HAND_PARAMS) {
 			case 4:
 				playDialog(kCharacterHeadWait, "REB4001", -1, 30);
 				break;
+			default:
+				break;
 			}
+
 			getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall + 8] = 2;
 			HeadWaitCall(&LogicManager::CONS_HeadWait_DoOtis5012C, 0, 0, 0, 0);
 			break;
@@ -300,7 +331,13 @@ void LogicManager::HAND_HeadWait_RebeccaHereWeAre(HAND_PARAMS) {
 			_engine->getMessageManager()->setMessageHandle(kCharacterHeadWait, _functionsHeadWait[getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall]]);
 			fedEx(kCharacterHeadWait, kCharacterHeadWait, 18, 0);
 			break;
+		default:
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -315,14 +352,19 @@ void LogicManager::CONS_HeadWait_DoOtis5012C(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_HeadWait_DoOtis5012C(HAND_PARAMS) {
-	if (msg->action == 3) {
+	switch (msg->action) {
+	case 3:
 		getCharacter(kCharacterHeadWait).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterHeadWait, _functionsHeadWait[getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall]]);
 		fedEx(kCharacterHeadWait, kCharacterHeadWait, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		startSeqOtis(kCharacterHeadWait, "012C1");
 		startSeqOtis(kCharacterRebecca, "012C2");
 		startSeqOtis(kCharacterTableD, "012C3");
+		break;
+	default:
+		break;
 	}
 }
 
@@ -343,6 +385,7 @@ void LogicManager::HAND_HeadWait_DoSeatOtis(HAND_PARAMS) {
 			if (!whoRunningDialog(kCharacterHeadWait))
 				releaseView(kCharacterHeadWait, kCarRestaurant, 64);
 		}
+
 		break;
 	case 3:
 		if (!getCharacterCurrentParams(kCharacterHeadWait)[1]) {
@@ -361,6 +404,7 @@ void LogicManager::HAND_HeadWait_DoSeatOtis(HAND_PARAMS) {
 			getCharacterCurrentParams(kCharacterHeadWait)[0] = 1;
 			playDialog(kCharacterHeadWait, "HED1001", -1, 0);
 		}
+
 		break;
 	case 12:
 		blockView(kCharacterHeadWait, kCarRestaurant, 64);
@@ -376,9 +420,10 @@ void LogicManager::HAND_HeadWait_DoSeatOtis(HAND_PARAMS) {
 			_engine->getMessageManager()->setMessageHandle(kCharacterHeadWait, _functionsHeadWait[getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall]]);
 			fedEx(kCharacterHeadWait, kCharacterHeadWait, 18, 0);
 		}
+
 		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -393,7 +438,8 @@ void LogicManager::CONS_HeadWait_SeatCath(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_HeadWait_SeatCath(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterHeadWait).characterPosition.position = 5800;
 		getCharacter(kCharacterHeadWait).characterPosition.location = 0;
 		send(kCharacterHeadWait, kCharacterAugust, 168046720, 0);
@@ -402,7 +448,8 @@ void LogicManager::HAND_HeadWait_SeatCath(HAND_PARAMS) {
 		blockView(kCharacterHeadWait, kCarRestaurant, 55);
 		getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall + 8] = 1;
 		HeadWaitCall(&LogicManager::CONS_HeadWait_DoSeatOtis, 0, 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		if (getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall + 8] == 1) {
 			send(kCharacterHeadWait, kCharacterAugust, 168627977, 0);
 			send(kCharacterHeadWait, kCharacterAnna, 168627977, 0);
@@ -418,6 +465,10 @@ void LogicManager::HAND_HeadWait_SeatCath(HAND_PARAMS) {
 			_engine->getMessageManager()->setMessageHandle(kCharacterHeadWait, _functionsHeadWait[getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall]]);
 			fedEx(kCharacterHeadWait, kCharacterHeadWait, 18, 0);
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -432,25 +483,28 @@ void LogicManager::CONS_HeadWait_Birth(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_HeadWait_Birth(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			autoMessage(kCharacterHeadWait, 239072064, 0);
-			autoMessage(kCharacterHeadWait, 257489762, 2);
-			autoMessage(kCharacterHeadWait, 207769280, 6);
-			autoMessage(kCharacterHeadWait, 101824388, 7);
-			autoMessage(kCharacterHeadWait, 136059947, 8);
-			autoMessage(kCharacterHeadWait, 223262556, 1);
-			autoMessage(kCharacterHeadWait, 269479296, 3);
-			autoMessage(kCharacterHeadWait, 352703104, 4);
-			autoMessage(kCharacterHeadWait, 352768896, 5);
-			autoMessage(kCharacterHeadWait, 191604416, 10);
-			autoMessage(kCharacterHeadWait, 190605184, 11);
-			getCharacter(kCharacterHeadWait).characterPosition.car = kCarRestaurant;
-			getCharacter(kCharacterHeadWait).characterPosition.location = 0;
-			getCharacter(kCharacterHeadWait).characterPosition.position = 5900;
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		CONS_HeadWait_ServingDinner(0, 0, 0, 0);
+		break;
+	case 12:
+		autoMessage(kCharacterHeadWait, 239072064, 0);
+		autoMessage(kCharacterHeadWait, 257489762, 2);
+		autoMessage(kCharacterHeadWait, 207769280, 6);
+		autoMessage(kCharacterHeadWait, 101824388, 7);
+		autoMessage(kCharacterHeadWait, 136059947, 8);
+		autoMessage(kCharacterHeadWait, 223262556, 1);
+		autoMessage(kCharacterHeadWait, 269479296, 3);
+		autoMessage(kCharacterHeadWait, 352703104, 4);
+		autoMessage(kCharacterHeadWait, 352768896, 5);
+		autoMessage(kCharacterHeadWait, 191604416, 10);
+		autoMessage(kCharacterHeadWait, 190605184, 11);
+		getCharacter(kCharacterHeadWait).characterPosition.car = kCarRestaurant;
+		getCharacter(kCharacterHeadWait).characterPosition.location = 0;
+		getCharacter(kCharacterHeadWait).characterPosition.position = 5900;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -465,19 +519,21 @@ void LogicManager::CONS_HeadWait_GreetAugust(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_HeadWait_GreetAugust(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterHeadWait).characterPosition.position = 5800;
 		getCharacter(kCharacterHeadWait).characterPosition.location = 0;
 		getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall + 8] = 1;
 		HeadWaitCall(&LogicManager::CONS_HeadWait_DoSeqOtis, "902", 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		if (getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall + 8] == 1) {
 			if (!getCharacterParams(kCharacterHeadWait, 8)[10]) {
 				startCycOtis(kCharacterHeadWait, "010E");
 				startCycOtis(kCharacterAugust, "BLANK");
 				getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall + 8] = 2;
 				HeadWaitCall(&LogicManager::CONS_HeadWait_DoDialog, "AUG1001", 0, 0, 0);
-				return;
+				break;
 			}
 		} else {
 			if (getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall + 8] != 2) {
@@ -492,7 +548,7 @@ void LogicManager::HAND_HeadWait_GreetAugust(HAND_PARAMS) {
 					fedEx(kCharacterHeadWait, kCharacterHeadWait, 18, 0);
 				}
 
-				return;
+				break;
 			}
 
 			startCycOtis(kCharacterAugust, "010B");
@@ -500,6 +556,9 @@ void LogicManager::HAND_HeadWait_GreetAugust(HAND_PARAMS) {
 
 		getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall + 8] = 3;
 		HeadWaitCall(&LogicManager::CONS_HeadWait_DoSeqOtis, "905", 0, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -514,16 +573,21 @@ void LogicManager::CONS_HeadWait_DoOtis5001C(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_HeadWait_DoOtis5001C(HAND_PARAMS) {
-	if (msg->action == 3) {
+	switch (msg->action) {
+	case 3:
 		releaseView(kCharacterHeadWait, kCarRestaurant, 62);
 		getCharacter(kCharacterHeadWait).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterHeadWait, _functionsHeadWait[getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall]]);
 		fedEx(kCharacterHeadWait, kCharacterHeadWait, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		startSeqOtis(kCharacterTableA, "001C3");
 		startSeqOtis(kCharacterAnna, "001C2");
 		startSeqOtis(kCharacterHeadWait, "001C1");
 		blockView(kCharacterHeadWait, kCarRestaurant, 62);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -538,12 +602,14 @@ void LogicManager::CONS_HeadWait_GreetAnna(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_HeadWait_GreetAnna(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterHeadWait).characterPosition.position = 5800;
 		getCharacter(kCharacterHeadWait).characterPosition.location = 0;
 		getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall + 8] = 1;
 		HeadWaitCall(&LogicManager::CONS_HeadWait_DoSeqOtis, "901", 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall + 8]) {
 		case 1:
 			playDialog(kCharacterHeadWait, "ANN1047", -1, 0);
@@ -564,7 +630,13 @@ void LogicManager::HAND_HeadWait_GreetAnna(HAND_PARAMS) {
 			_engine->getMessageManager()->setMessageHandle(kCharacterHeadWait, _functionsHeadWait[getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall]]);
 			fedEx(kCharacterHeadWait, kCharacterHeadWait, 18, 0);
 			break;
+		default:
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -579,22 +651,26 @@ void LogicManager::CONS_HeadWait_GreetTatiana(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_HeadWait_GreetTatiana(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterHeadWait).characterPosition.position = 5800;
 		getCharacter(kCharacterHeadWait).characterPosition.location = 0;
 		getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall + 8] = 1;
 		HeadWaitCall(&LogicManager::CONS_HeadWait_DoSeqOtis, "903", 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall + 8]) {
 		case 1:
 			send(kCharacterHeadWait, kCharacterTatiana, 122358304, 0);
 			startCycOtis(kCharacterHeadWait, "014B");
 			blockView(kCharacterHeadWait, kCarRestaurant, 67);
+
 			if (dialogRunning("TAT1069A")) {
 				fadeDialog("TAT1069A");
 			} else if (dialogRunning("TAT1069B")) {
 				fadeDialog("TAT1069B");
 			}
+
 			getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall + 8] = 2;
 			HeadWaitCall(&LogicManager::CONS_HeadWait_DoDialog, "TAT1066", 0, 0, 0);
 			break;
@@ -613,7 +689,13 @@ void LogicManager::HAND_HeadWait_GreetTatiana(HAND_PARAMS) {
 			_engine->getMessageManager()->setMessageHandle(kCharacterHeadWait, _functionsHeadWait[getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall]]);
 			fedEx(kCharacterHeadWait, kCharacterHeadWait, 18, 0);
 			break;
+		default:
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -628,67 +710,100 @@ void LogicManager::CONS_HeadWait_ServingDinner(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_HeadWait_ServingDinner(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 18) {
-			switch (getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall + 8]) {
-			case 1:
-				getCharacterCurrentParams(kCharacterHeadWait)[1] = 1;
-				getCharacterCurrentParams(kCharacterHeadWait)[0] = 0;
-				goto LABEL_23;
-			case 2:
-				goto LABEL_26;
-			case 3:
-				goto LABEL_28;
-			case 4:
-				goto LABEL_30;
-			default:
-				return;
-			}
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		if (!getCharacterCurrentParams(kCharacterHeadWait)[1]) {
 			if (checkCathDir(kCarRestaurant, 69) || checkCathDir(kCarRestaurant, 70) || checkCathDir(kCarRestaurant, 71)) {
 				getCharacterCurrentParams(kCharacterHeadWait)[1] = 1;
 			}
+
 			if (!getCharacterCurrentParams(kCharacterHeadWait)[1] && checkCathDir(kCarRestaurant, 61))
 				getCharacterCurrentParams(kCharacterHeadWait)[0] = 1;
 		}
+
 		if (inKitchen(kCharacterHeadWait)) {
 			if (getCharacterParams(kCharacterHeadWait, 8)[4] && getCharacterParams(kCharacterHeadWait, 8)[5]) {
 				CONS_HeadWait_AfterDinner(0, 0, 0, 0);
-				return;
+				break;
 			}
-			if (!rcClear())
-				goto LABEL_28;
-			if (getCharacterCurrentParams(kCharacterHeadWait)[0] && !getCharacterCurrentParams(kCharacterHeadWait)[1] && checkCathDir(kCarRestaurant, 61)) {
-				getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall + 8] = 1;
-				HeadWaitCall(&LogicManager::CONS_HeadWait_SeatCath, 0, 0, 0, 0);
-				return;
+
+			if (rcClear()) {
+				if (getCharacterCurrentParams(kCharacterHeadWait)[0] && !getCharacterCurrentParams(kCharacterHeadWait)[1] && checkCathDir(kCarRestaurant, 61)) {
+					getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall + 8] = 1;
+					HeadWaitCall(&LogicManager::CONS_HeadWait_SeatCath, 0, 0, 0, 0);
+					break;
+				}
+
+				if (getCharacterParams(kCharacterHeadWait, 8)[0] && !getCharacterParams(kCharacterHeadWait, 8)[10]) {
+					getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall + 8] = 2;
+					HeadWaitCall(&LogicManager::CONS_HeadWait_GreetAugust, 0, 0, 0, 0);
+					break;
+				}
+
+				if (getCharacterParams(kCharacterHeadWait, 8)[2]) {
+					getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall + 8] = 3;
+					HeadWaitCall(&LogicManager::CONS_HeadWait_GreetTatiana, 0, 0, 0, 0);
+					break;
+				}
+			}
+
+			if (getCharacterParams(kCharacterHeadWait, 8)[1]) {
+				getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall + 8] = 4;
+				HeadWaitCall(&LogicManager::CONS_HeadWait_GreetAnna, 0, 0, 0, 0);
+				break;
 			}
-		LABEL_23:
+
+			if (getCharacterParams(kCharacterHeadWait, 8)[3]) {
+				getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall + 8] = 5;
+				HeadWaitCall(&LogicManager::CONS_HeadWait_RebeccaHereWeAre, 0, 0, 0, 0);
+				break;
+			}
+		}
+
+		break;
+	case 18:
+		switch (getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall + 8]) {
+		case 1:
+			getCharacterCurrentParams(kCharacterHeadWait)[1] = 1;
+			getCharacterCurrentParams(kCharacterHeadWait)[0] = 0;
+
 			if (getCharacterParams(kCharacterHeadWait, 8)[0] && !getCharacterParams(kCharacterHeadWait, 8)[10]) {
 				getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall + 8] = 2;
 				HeadWaitCall(&LogicManager::CONS_HeadWait_GreetAugust, 0, 0, 0, 0);
-				return;
+				break;
 			}
-		LABEL_26:
+
+			// fall through
+		case 2:
 			if (getCharacterParams(kCharacterHeadWait, 8)[2]) {
 				getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall + 8] = 3;
 				HeadWaitCall(&LogicManager::CONS_HeadWait_GreetTatiana, 0, 0, 0, 0);
-			} else {
-			LABEL_28:
-				if (getCharacterParams(kCharacterHeadWait, 8)[1]) {
-					getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall + 8] = 4;
-					HeadWaitCall(&LogicManager::CONS_HeadWait_GreetAnna, 0, 0, 0, 0);
-				} else {
-				LABEL_30:
-					if (getCharacterParams(kCharacterHeadWait, 8)[3]) {
-						getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall + 8] = 5;
-						HeadWaitCall(&LogicManager::CONS_HeadWait_RebeccaHereWeAre, 0, 0, 0, 0);
-					}
-				}
+				break;
+			}
+
+			// fall through
+		case 3:
+			if (getCharacterParams(kCharacterHeadWait, 8)[1]) {
+				getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall + 8] = 4;
+				HeadWaitCall(&LogicManager::CONS_HeadWait_GreetAnna, 0, 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 4:
+			if (getCharacterParams(kCharacterHeadWait, 8)[3]) {
+				getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall + 8] = 5;
+				HeadWaitCall(&LogicManager::CONS_HeadWait_RebeccaHereWeAre, 0, 0, 0, 0);
 			}
+
+			break;
+		default:
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -703,13 +818,20 @@ void LogicManager::CONS_HeadWait_AfterDinner(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_HeadWait_AfterDinner(HAND_PARAMS) {
-	if (msg->action == 0 && _gameTime > 1242000 && !getCharacterCurrentParams(kCharacterHeadWait)[0]) {
-		getCharacterCurrentParams(kCharacterHeadWait)[0] = 1;
-		send(kCharacterHeadWait, kCharacterWaiter1, 101632192, 0);
-		send(kCharacterHeadWait, kCharacterWaiter2, 101632192, 0);
-		send(kCharacterHeadWait, kCharacterCook, 101632192, 0);
-		send(kCharacterHeadWait, kCharacterTrainM, 101632192, 0);
-		CONS_HeadWait_LockUp(0, 0, 0, 0);
+	switch (msg->action) {
+	case 0:
+		if (_gameTime > 1242000 && !getCharacterCurrentParams(kCharacterHeadWait)[0]) {
+			getCharacterCurrentParams(kCharacterHeadWait)[0] = 1;
+			send(kCharacterHeadWait, kCharacterWaiter1, 101632192, 0);
+			send(kCharacterHeadWait, kCharacterWaiter2, 101632192, 0);
+			send(kCharacterHeadWait, kCharacterCook, 101632192, 0);
+			send(kCharacterHeadWait, kCharacterTrainM, 101632192, 0);
+			CONS_HeadWait_LockUp(0, 0, 0, 0);
+		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -724,22 +846,28 @@ void LogicManager::CONS_HeadWait_LockUp(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_HeadWait_LockUp(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			getCharacter(kCharacterHeadWait).characterPosition.car = kCarRestaurant;
-			getCharacter(kCharacterHeadWait).characterPosition.position = 5900;
-			getCharacter(kCharacterHeadWait).characterPosition.location = 0;
-			endGraphics(kCharacterHeadWait);
+	switch (msg->action) {
+	case 0:
+		if (!getCharacterCurrentParams(kCharacterHeadWait)[0] && getCharacter(kCharacterCath).characterPosition.position < 3650) {
+			setDoor(65, kCharacterCath, 1, 10, 9);
+			send(kCharacterHeadWait, kCharacterTableA, 103798704, "001P");
+			send(kCharacterHeadWait, kCharacterTableB, 103798704, "005J");
+			send(kCharacterHeadWait, kCharacterTableC, 103798704, "009G");
+			send(kCharacterHeadWait, kCharacterTableD, 103798704, "010M");
+			send(kCharacterHeadWait, kCharacterTableE, 103798704, "014F");
+			send(kCharacterHeadWait, kCharacterTableF, 103798704, "024D");
+			getCharacterCurrentParams(kCharacterHeadWait)[0] = 1;
 		}
-	} else if (!getCharacterCurrentParams(kCharacterHeadWait)[0] && getCharacter(kCharacterCath).characterPosition.position < 3650) {
-		setDoor(65, kCharacterCath, 1, 10, 9);
-		send(kCharacterHeadWait, kCharacterTableA, 103798704, "001P");
-		send(kCharacterHeadWait, kCharacterTableB, 103798704, "005J");
-		send(kCharacterHeadWait, kCharacterTableC, 103798704, "009G");
-		send(kCharacterHeadWait, kCharacterTableD, 103798704, "010M");
-		send(kCharacterHeadWait, kCharacterTableE, 103798704, "014F");
-		send(kCharacterHeadWait, kCharacterTableF, 103798704, "024D");
-		getCharacterCurrentParams(kCharacterHeadWait)[0] = 1;
+
+		break;
+	case 12:
+		getCharacter(kCharacterHeadWait).characterPosition.car = kCarRestaurant;
+		getCharacter(kCharacterHeadWait).characterPosition.position = 5900;
+		getCharacter(kCharacterHeadWait).characterPosition.location = 0;
+		endGraphics(kCharacterHeadWait);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -754,7 +882,8 @@ void LogicManager::CONS_HeadWait_StartPart2(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_HeadWait_StartPart2(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		endGraphics(kCharacterHeadWait);
 		getCharacter(kCharacterHeadWait).characterPosition.position = 5900;
 		getCharacter(kCharacterHeadWait).characterPosition.location = 0;
@@ -762,6 +891,9 @@ void LogicManager::HAND_HeadWait_StartPart2(HAND_PARAMS) {
 		getCharacter(kCharacterHeadWait).inventoryItem = 0;
 		getCharacter(kCharacterHeadWait).clothes = 1;
 		setDoor(65, kCharacterCath, 0, 0, 1);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -776,18 +908,21 @@ void LogicManager::CONS_HeadWait_StartPart3(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_HeadWait_StartPart3(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			endGraphics(kCharacterHeadWait);
-			getCharacter(kCharacterHeadWait).characterPosition.car = kCarRestaurant;
-			getCharacter(kCharacterHeadWait).characterPosition.position = 5900;
-			getCharacter(kCharacterHeadWait).characterPosition.location = 0;
-			getCharacter(kCharacterHeadWait).inventoryItem = 0;
-			getCharacterParams(kCharacterHeadWait, 8)[6] = 0;
-			getCharacterParams(kCharacterHeadWait, 8)[3] = 0;
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		CONS_HeadWait_InPart3(0, 0, 0, 0);
+		break;
+	case 12:
+		endGraphics(kCharacterHeadWait);
+		getCharacter(kCharacterHeadWait).characterPosition.car = kCarRestaurant;
+		getCharacter(kCharacterHeadWait).characterPosition.position = 5900;
+		getCharacter(kCharacterHeadWait).characterPosition.location = 0;
+		getCharacter(kCharacterHeadWait).inventoryItem = 0;
+		getCharacterParams(kCharacterHeadWait, 8)[6] = 0;
+		getCharacterParams(kCharacterHeadWait, 8)[3] = 0;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -802,22 +937,30 @@ void LogicManager::CONS_HeadWait_InPart3(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_HeadWait_InPart3(HAND_PARAMS) {
-	if (msg->action == 0) {
-		if (!inKitchen(kCharacterHeadWait))
-			return;
-		if (getCharacterParams(kCharacterHeadWait, 8)[6]) {
-			getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall + 8] = 1;
-			HeadWaitCall(&LogicManager::CONS_HeadWait_AbbotSeatMe3, 0, 0, 0, 0);
-			return;
+	switch (msg->action) {
+	case 0:
+		if (inKitchen(kCharacterHeadWait)) {
+			if (getCharacterParams(kCharacterHeadWait, 8)[6]) {
+				getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall + 8] = 1;
+				HeadWaitCall(&LogicManager::CONS_HeadWait_AbbotSeatMe3, 0, 0, 0, 0);
+			} else if (getCharacterParams(kCharacterHeadWait, 8)[3]) {
+				getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall + 8] = 2;
+				HeadWaitCall(&LogicManager::CONS_HeadWait_RebeccaHereWeAre, 0, 0, 0, 0);
+			}
 		}
-		goto LABEL_8;
-	}
-	if (msg->action == 18 && getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall + 8] == 1) {
-	LABEL_8:
-		if (getCharacterParams(kCharacterHeadWait, 8)[3]) {
-			getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall + 8] = 2;
-			HeadWaitCall(&LogicManager::CONS_HeadWait_RebeccaHereWeAre, 0, 0, 0, 0);
+
+		break;
+	case 18:
+		if (getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall + 8] == 1) {
+			if (getCharacterParams(kCharacterHeadWait, 8)[3]) {
+				getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall + 8] = 2;
+				HeadWaitCall(&LogicManager::CONS_HeadWait_RebeccaHereWeAre, 0, 0, 0, 0);
+			}
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -832,13 +975,15 @@ void LogicManager::CONS_HeadWait_AbbotSeatMe3(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_HeadWait_AbbotSeatMe3(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterHeadWait).characterPosition.position = 5800;
 		getCharacter(kCharacterHeadWait).characterPosition.location = 0;
 		blockView(kCharacterHeadWait, kCarRestaurant, 67);
 		getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall + 8] = 1;
 		HeadWaitCall(&LogicManager::CONS_HeadWait_DoOtis5029A, 0, 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		if (getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall + 8] == 1) {
 			releaseView(kCharacterHeadWait, kCarRestaurant, 67);
 			send(kCharacterHeadWait, kCharacterAbbot, 122288808, 0);
@@ -853,6 +998,10 @@ void LogicManager::HAND_HeadWait_AbbotSeatMe3(HAND_PARAMS) {
 			_engine->getMessageManager()->setMessageHandle(kCharacterHeadWait, _functionsHeadWait[getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall]]);
 			fedEx(kCharacterHeadWait, kCharacterHeadWait, 18, 0);
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -873,6 +1022,7 @@ void LogicManager::HAND_HeadWait_DoOtis5029A(HAND_PARAMS) {
 			playDialog(kCharacterHeadWait, "ABB3015A", -1, 0);
 			getCharacterCurrentParams(kCharacterHeadWait)[0] = 1;
 		}
+
 		break;
 	case 3:
 		getCharacter(kCharacterHeadWait).currentCall--;
@@ -888,7 +1038,7 @@ void LogicManager::HAND_HeadWait_DoOtis5029A(HAND_PARAMS) {
 		startSeqOtis(kCharacterAbbot, "029A2");
 		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -903,20 +1053,23 @@ void LogicManager::CONS_HeadWait_StartPart4(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_HeadWait_StartPart4(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			endGraphics(kCharacterHeadWait);
-			getCharacter(kCharacterHeadWait).characterPosition.car = kCarRestaurant;
-			getCharacter(kCharacterHeadWait).characterPosition.position = 5900;
-			getCharacter(kCharacterHeadWait).characterPosition.location = 0;
-			getCharacter(kCharacterHeadWait).inventoryItem = 0;
-			getCharacterParams(kCharacterHeadWait, 8)[7] = 0;
-			getCharacterParams(kCharacterHeadWait, 8)[8] = 0;
-			getCharacterParams(kCharacterHeadWait, 8)[3] = 0;
-			getCharacterParams(kCharacterHeadWait, 8)[9] = 0;
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		CONS_HeadWait_InPart4(0, 0, 0, 0);
+		break;
+	case 12:
+		endGraphics(kCharacterHeadWait);
+		getCharacter(kCharacterHeadWait).characterPosition.car = kCarRestaurant;
+		getCharacter(kCharacterHeadWait).characterPosition.position = 5900;
+		getCharacter(kCharacterHeadWait).characterPosition.location = 0;
+		getCharacter(kCharacterHeadWait).inventoryItem = 0;
+		getCharacterParams(kCharacterHeadWait, 8)[7] = 0;
+		getCharacterParams(kCharacterHeadWait, 8)[8] = 0;
+		getCharacterParams(kCharacterHeadWait, 8)[3] = 0;
+		getCharacterParams(kCharacterHeadWait, 8)[9] = 0;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -931,94 +1084,157 @@ void LogicManager::CONS_HeadWait_InPart4(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_HeadWait_InPart4(HAND_PARAMS) {
-	if (msg->action > 12) {
-		switch (msg->action) {
-		case 17:
-			if (!getCharacterCurrentParams(kCharacterHeadWait)[1]) {
-				if (checkCathDir(kCarRestaurant, 69) || checkCathDir(kCarRestaurant, 70) || checkCathDir(kCarRestaurant, 71)) {
-					getCharacterCurrentParams(kCharacterHeadWait)[1] = 1;
+	switch (msg->action) {
+	case 0:
+		if (_gameTime > 2511000 && !getCharacterCurrentParams(kCharacterHeadWait)[3]) {
+			getCharacterCurrentParams(kCharacterHeadWait)[3] = 1;
+			getCharacterCurrentParams(kCharacterHeadWait)[1] = 1;
+		}
+
+		if (inKitchen(kCharacterHeadWait)) {
+			if (rcClear()) {
+				if (getCharacterParams(kCharacterHeadWait, 8)[7]) {
+					getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall + 8] = 1;
+					HeadWaitCall(&LogicManager::CONS_HeadWait_MeetCond2, 0, 0, 0, 0);
+					break;
 				}
-				if (!getCharacterCurrentParams(kCharacterHeadWait)[1] && checkCathDir(kCarRestaurant, 61))
-					getCharacterCurrentParams(kCharacterHeadWait)[0] = 1;
-			}
-			break;
-		case 18:
-			if (getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall + 8] == 1) {
-			LABEL_34:
+
 				if (getCharacterParams(kCharacterHeadWait, 8)[9] && getCharacterParams(kCharacterHeadWait, 8)[11]) {
 					if (!getCharacterCurrentParams(kCharacterHeadWait)[2])
 						getCharacterCurrentParams(kCharacterHeadWait)[2] = _gameTime + 9000;
+
 					if (getCharacterCurrentParams(kCharacterHeadWait)[4] != 0x7FFFFFFF && _gameTime) {
-						if (getCharacterCurrentParams(kCharacterHeadWait)[2] < _gameTime)
-							goto LABEL_45;
+						if (getCharacterCurrentParams(kCharacterHeadWait)[2] < _gameTime) {
+							getCharacterCurrentParams(kCharacterHeadWait)[4] = 0x7FFFFFFF;
+							getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall + 8] = 2;
+							HeadWaitCall(&LogicManager::CONS_HeadWait_TellAug, 0, 0, 0, 0);
+							break;
+						}
+
 						if (!inDiningRoom(kCharacterCath) || !getCharacterCurrentParams(kCharacterHeadWait)[4]) {
 							getCharacterCurrentParams(kCharacterHeadWait)[4] = _gameTime;
-							if (!_gameTime)
-								goto LABEL_46;
+							if (!_gameTime) {
+								getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall + 8] = 2;
+								HeadWaitCall(&LogicManager::CONS_HeadWait_TellAug, 0, 0, 0, 0);
+								break;
+							}
 						}
+
 						if (getCharacterCurrentParams(kCharacterHeadWait)[4] < _gameTime) {
-						LABEL_45:
 							getCharacterCurrentParams(kCharacterHeadWait)[4] = 0x7FFFFFFF;
-						LABEL_46:
 							getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall + 8] = 2;
 							HeadWaitCall(&LogicManager::CONS_HeadWait_TellAug, 0, 0, 0, 0);
-							return;
+							break;
 						}
 					}
 				}
-			LABEL_47:
+
 				if (getCharacterCurrentParams(kCharacterHeadWait)[0] && !getCharacterCurrentParams(kCharacterHeadWait)[1] && checkCathDir(kCarRestaurant, 61)) {
 					getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall + 8] = 3;
 					HeadWaitCall(&LogicManager::CONS_HeadWait_SeatCath, 0, 0, 0, 0);
-					return;
+					break;
 				}
-				goto LABEL_32;
 			}
-			if (getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall + 8] == 2)
-				goto LABEL_47;
-			if (getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall + 8] != 3)
-				return;
-			getCharacterCurrentParams(kCharacterHeadWait)[1] = 1;
-			getCharacterCurrentParams(kCharacterHeadWait)[0] = 0;
-		LABEL_32:
+
 			if (getCharacterParams(kCharacterHeadWait, 8)[3]) {
 				getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall + 8] = 4;
 				HeadWaitCall(&LogicManager::CONS_HeadWait_RebeccaHereWeAre, 0, 0, 0, 0);
 			}
-			return;
-		case 201431954:
-			getCharacterParams(kCharacterHeadWait, 8)[7] = 0;
-			getCharacterParams(kCharacterHeadWait, 8)[3] = 0;
-			send(kCharacterHeadWait, kCharacterTableA, 103798704, "001P");
-			send(kCharacterHeadWait, kCharacterTableB, 103798704, "005J");
-			send(kCharacterHeadWait, kCharacterTableC, 103798704, "009G");
-			send(kCharacterHeadWait, kCharacterTableD, 103798704, "010M");
-			send(kCharacterHeadWait, kCharacterTableE, 103798704, "014F");
-			send(kCharacterHeadWait, kCharacterTableF, 103798704, "024D");
-			getCharacter(kCharacterHeadWait).characterPosition.position = 5900;
-			getCharacter(kCharacterHeadWait).characterPosition.location = 0;
+
 			break;
 		}
-	} else if (msg->action == 12) {
+
+		break;
+	case 12:
 		if (checkCathDir(kCarRestaurant, 69) || checkCathDir(kCarRestaurant, 70) || checkCathDir(kCarRestaurant, 71)) {
 			getCharacterCurrentParams(kCharacterHeadWait)[1] = 1;
 		}
-	} else if (msg->action == 0) {
-		if (_gameTime > 2511000 && !getCharacterCurrentParams(kCharacterHeadWait)[3]) {
-			getCharacterCurrentParams(kCharacterHeadWait)[3] = 1;
-			getCharacterCurrentParams(kCharacterHeadWait)[1] = 1;
+
+		break;
+	case 17:
+		if (!getCharacterCurrentParams(kCharacterHeadWait)[1]) {
+			if (checkCathDir(kCarRestaurant, 69) || checkCathDir(kCarRestaurant, 70) || checkCathDir(kCarRestaurant, 71)) {
+				getCharacterCurrentParams(kCharacterHeadWait)[1] = 1;
+			}
+
+			if (!getCharacterCurrentParams(kCharacterHeadWait)[1] && checkCathDir(kCarRestaurant, 61))
+				getCharacterCurrentParams(kCharacterHeadWait)[0] = 1;
 		}
-		if (inKitchen(kCharacterHeadWait)) {
-			if (rcClear()) {
-				if (getCharacterParams(kCharacterHeadWait, 8)[7]) {
-					getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall + 8] = 1;
-					HeadWaitCall(&LogicManager::CONS_HeadWait_MeetCond2, 0, 0, 0, 0);
-					return;
+
+		break;
+	case 18:
+		switch (getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall + 8]) {
+		case 1:
+			if (getCharacterParams(kCharacterHeadWait, 8)[9] && getCharacterParams(kCharacterHeadWait, 8)[11]) {
+				if (!getCharacterCurrentParams(kCharacterHeadWait)[2])
+					getCharacterCurrentParams(kCharacterHeadWait)[2] = _gameTime + 9000;
+
+				if (getCharacterCurrentParams(kCharacterHeadWait)[4] != 0x7FFFFFFF && _gameTime) {
+					if (getCharacterCurrentParams(kCharacterHeadWait)[2] < _gameTime) {
+						getCharacterCurrentParams(kCharacterHeadWait)[4] = 0x7FFFFFFF;
+						getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall + 8] = 2;
+						HeadWaitCall(&LogicManager::CONS_HeadWait_TellAug, 0, 0, 0, 0);
+						break;
+					}
+
+					if (!inDiningRoom(kCharacterCath) || !getCharacterCurrentParams(kCharacterHeadWait)[4]) {
+						getCharacterCurrentParams(kCharacterHeadWait)[4] = _gameTime;
+						if (!_gameTime) {
+							getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall + 8] = 2;
+							HeadWaitCall(&LogicManager::CONS_HeadWait_TellAug, 0, 0, 0, 0);
+							break;
+						}
+					}
+
+					if (getCharacterCurrentParams(kCharacterHeadWait)[4] < _gameTime) {
+						getCharacterCurrentParams(kCharacterHeadWait)[4] = 0x7FFFFFFF;
+						getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall + 8] = 2;
+						HeadWaitCall(&LogicManager::CONS_HeadWait_TellAug, 0, 0, 0, 0);
+						break;
+					}
 				}
-				goto LABEL_34;
 			}
-			goto LABEL_32;
+
+			// fall through
+		case 2:
+			if (getCharacterCurrentParams(kCharacterHeadWait)[0] && !getCharacterCurrentParams(kCharacterHeadWait)[1] && checkCathDir(kCarRestaurant, 61)) {
+				getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall + 8] = 3;
+				HeadWaitCall(&LogicManager::CONS_HeadWait_SeatCath, 0, 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 3:
+			if (getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall + 8] == 3) {
+				getCharacterCurrentParams(kCharacterHeadWait)[1] = 1;
+				getCharacterCurrentParams(kCharacterHeadWait)[0] = 0;
+			}
+
+			if (getCharacterParams(kCharacterHeadWait, 8)[3]) {
+				getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall + 8] = 4;
+				HeadWaitCall(&LogicManager::CONS_HeadWait_RebeccaHereWeAre, 0, 0, 0, 0);
+			}
+
+			break;
+		default:
+			break;
 		}
+
+		break;
+	case 201431954:
+		getCharacterParams(kCharacterHeadWait, 8)[7] = 0;
+		getCharacterParams(kCharacterHeadWait, 8)[3] = 0;
+		send(kCharacterHeadWait, kCharacterTableA, 103798704, "001P");
+		send(kCharacterHeadWait, kCharacterTableB, 103798704, "005J");
+		send(kCharacterHeadWait, kCharacterTableC, 103798704, "009G");
+		send(kCharacterHeadWait, kCharacterTableD, 103798704, "010M");
+		send(kCharacterHeadWait, kCharacterTableE, 103798704, "014F");
+		send(kCharacterHeadWait, kCharacterTableF, 103798704, "024D");
+		getCharacter(kCharacterHeadWait).characterPosition.position = 5900;
+		getCharacter(kCharacterHeadWait).characterPosition.location = 0;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1033,42 +1249,50 @@ void LogicManager::CONS_HeadWait_MeetCond2(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_HeadWait_MeetCond2(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall + 8] = 1;
-			HeadWaitCall(&LogicManager::CONS_HeadWait_RSWalkDowntrain, 0, 0, 0, 0);
-		} else if (msg->action == 18) {
-			switch (getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall + 8]) {
-			case 1:
-				endGraphics(kCharacterHeadWait);
-				break;
-			case 2:
-				send(kCharacterHeadWait, kCharacterCond2, 123712592, 0);
-				getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall + 8] = 3;
-				HeadWaitCall(&LogicManager::CONS_HeadWait_WaitRCClear, 0, 0, 0, 0);
-				break;
-			case 3:
-				getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall + 8] = 4;
-				HeadWaitCall(&LogicManager::CONS_HeadWait_RSWalkUptrain, 0, 0, 0, 0);
-				break;
-			case 4:
-				endGraphics(kCharacterHeadWait);
-				getCharacter(kCharacterHeadWait).characterPosition.position = 5900;
-				getCharacterParams(kCharacterHeadWait, 8)[7] = 0;
-				getCharacterParams(kCharacterHeadWait, 8)[8] = 0;
-				getCharacterParams(kCharacterHeadWait, 8)[9] = 1;
-
-				getCharacter(kCharacterHeadWait).currentCall--;
-				_engine->getMessageManager()->setMessageHandle(kCharacterHeadWait, _functionsHeadWait[getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall]]);
-				fedEx(kCharacterHeadWait, kCharacterHeadWait, 18, 0);
-				break;
-			default:
-				return;
-			}
+	switch (msg->action) {
+	case 0:
+		if (getCharacterParams(kCharacterHeadWait, 8)[8]) {
+			getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall + 8] = 2;
+			HeadWaitCall(&LogicManager::CONS_HeadWait_DoWait, 450, 0, 0, 0);
+		}
+
+		break;
+	case 12:
+		getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall + 8] = 1;
+		HeadWaitCall(&LogicManager::CONS_HeadWait_RSWalkDowntrain, 0, 0, 0, 0);
+		break;
+	case 18:
+		switch (getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall + 8]) {
+		case 1:
+			endGraphics(kCharacterHeadWait);
+			break;
+		case 2:
+			send(kCharacterHeadWait, kCharacterCond2, 123712592, 0);
+			getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall + 8] = 3;
+			HeadWaitCall(&LogicManager::CONS_HeadWait_WaitRCClear, 0, 0, 0, 0);
+			break;
+		case 3:
+			getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall + 8] = 4;
+			HeadWaitCall(&LogicManager::CONS_HeadWait_RSWalkUptrain, 0, 0, 0, 0);
+			break;
+		case 4:
+			endGraphics(kCharacterHeadWait);
+			getCharacter(kCharacterHeadWait).characterPosition.position = 5900;
+			getCharacterParams(kCharacterHeadWait, 8)[7] = 0;
+			getCharacterParams(kCharacterHeadWait, 8)[8] = 0;
+			getCharacterParams(kCharacterHeadWait, 8)[9] = 1;
+
+			getCharacter(kCharacterHeadWait).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterHeadWait, _functionsHeadWait[getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall]]);
+			fedEx(kCharacterHeadWait, kCharacterHeadWait, 18, 0);
+			break;
+		default:
+			break;
 		}
-	} else if (getCharacterParams(kCharacterHeadWait, 8)[8]) {
-		getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall + 8] = 2;
-		HeadWaitCall(&LogicManager::CONS_HeadWait_DoWait, 0x1C2, 0, 0, 0);
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1083,12 +1307,14 @@ void LogicManager::CONS_HeadWait_TellAug(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_HeadWait_TellAug(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterHeadWait).characterPosition.position = 5800;
 		getCharacter(kCharacterHeadWait).characterPosition.location = 0;
 		getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall + 8] = 1;
 		HeadWaitCall(&LogicManager::CONS_HeadWait_DoSeqOtis, "902", 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall + 8]) {
 		case 1:
 			send(kCharacterHeadWait, kCharacterAugust, 122358304, 0);
@@ -1110,7 +1336,13 @@ void LogicManager::HAND_HeadWait_TellAug(HAND_PARAMS) {
 			_engine->getMessageManager()->setMessageHandle(kCharacterHeadWait, _functionsHeadWait[getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall]]);
 			fedEx(kCharacterHeadWait, kCharacterHeadWait, 18, 0);
 			break;
+		default:
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1125,16 +1357,20 @@ void LogicManager::CONS_HeadWait_RSWalkDowntrain(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_HeadWait_RSWalkDowntrain(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterHeadWait).characterPosition.position = 1540;
 		getCharacter(kCharacterHeadWait).characterPosition.location = 0;
 		getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall + 8] = 1;
 		HeadWaitCall(&LogicManager::CONS_HeadWait_DoSeqOtis, "817DD", 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		if (getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall + 8] == 1) {
 			startSeqOtis(kCharacterHeadWait, "817DS");
+
 			if (inDiningRoom(kCharacterCath))
 				advanceFrame(kCharacterHeadWait);
+
 			getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall + 8] = 2;
 			HeadWaitCall(&LogicManager::CONS_HeadWait_FinishSeqOtis, 0, 0, 0, 0);
 		} else if (getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall + 8] == 2) {
@@ -1144,6 +1380,10 @@ void LogicManager::HAND_HeadWait_RSWalkDowntrain(HAND_PARAMS) {
 			_engine->getMessageManager()->setMessageHandle(kCharacterHeadWait, _functionsHeadWait[getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall]]);
 			fedEx(kCharacterHeadWait, kCharacterHeadWait, 18, 0);
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1158,14 +1398,17 @@ void LogicManager::CONS_HeadWait_RSWalkUptrain(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_HeadWait_RSWalkUptrain(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterHeadWait).characterPosition.position = 9270;
 		getCharacter(kCharacterHeadWait).characterPosition.location = 0;
 		getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall + 8] = 1;
 		HeadWaitCall(&LogicManager::CONS_HeadWait_DoSeqOtis, "817US", 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		if (getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall + 8] == 1) {
 			startSeqOtis(kCharacterHeadWait, "817UD");
+
 			if (inSalon(kCharacterCath))
 				advanceFrame(kCharacterHeadWait);
 
@@ -1178,6 +1421,10 @@ void LogicManager::HAND_HeadWait_RSWalkUptrain(HAND_PARAMS) {
 			_engine->getMessageManager()->setMessageHandle(kCharacterHeadWait, _functionsHeadWait[getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall]]);
 			fedEx(kCharacterHeadWait, kCharacterHeadWait, 18, 0);
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1192,16 +1439,19 @@ void LogicManager::CONS_HeadWait_StartPart5(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_HeadWait_StartPart5(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			endGraphics(kCharacterHeadWait);
-			getCharacter(kCharacterHeadWait).characterPosition.car = kCarRestaurant;
-			getCharacter(kCharacterHeadWait).characterPosition.position = 3969;
-			getCharacter(kCharacterHeadWait).characterPosition.location = 1;
-			getCharacter(kCharacterHeadWait).inventoryItem = 0;
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		CONS_HeadWait_Prisoner(0, 0, 0, 0);
+		break;
+	case 12:
+		endGraphics(kCharacterHeadWait);
+		getCharacter(kCharacterHeadWait).characterPosition.car = kCarRestaurant;
+		getCharacter(kCharacterHeadWait).characterPosition.position = 3969;
+		getCharacter(kCharacterHeadWait).characterPosition.location = 1;
+		getCharacter(kCharacterHeadWait).inventoryItem = 0;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1216,8 +1466,13 @@ void LogicManager::CONS_HeadWait_Prisoner(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_HeadWait_Prisoner(HAND_PARAMS) {
-	if (msg->action == 70549068)
+	switch (msg->action) {
+	case 70549068:
 		CONS_HeadWait_Hiding(0, 0, 0, 0);
+		break;
+	default:
+		break;
+	}
 }
 
 void LogicManager::CONS_HeadWait_Hiding(CONS_PARAMS) {
@@ -1231,70 +1486,47 @@ void LogicManager::CONS_HeadWait_Hiding(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_HeadWait_Hiding(HAND_PARAMS) {
-	if (msg->action > 9) {
-		if (msg->action > 17) {
-			switch (msg->action) {
-			case 18:
-				switch (getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall + 8]) {
-				case 1:
-					setDoor(38, kCharacterHeadWait, 1, 10, 9);
-					goto LABEL_30;
-				case 2:
-					setDoor(38, kCharacterHeadWait, 1, 10, 9);
-					break;
-				case 3:
-				case 4:
-					getCharacterCurrentParams(kCharacterHeadWait)[2]++;
-					if (getCharacterCurrentParams(kCharacterHeadWait)[2] == 1) {
-						setDoor(38, kCharacterHeadWait, 1, 0, 0);
-						getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall + 8] = 5;
-						HeadWaitCall(&LogicManager::CONS_HeadWait_DoDialog, "Wat5001", 0, 0, 0);
-					} else if (getCharacterCurrentParams(kCharacterHeadWait)[2] == 2) {
-						setDoor(38, kCharacterHeadWait, 1, 0, 0);
-						getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall + 8] = 6;
-						HeadWaitCall(&LogicManager::CONS_HeadWait_DoDialog, "Wat5001A", 0, 0, 0);
-					}
-					break;
-				case 5:
-					getCharacterCurrentParams(kCharacterHeadWait)[0] = 1;
-					setDoor(38, kCharacterHeadWait, 1, 14, 0);
-					break;
-				case 6:
-					getCharacterCurrentParams(kCharacterHeadWait)[1] = 1;
+	switch (msg->action) {
+	case 0:
+		if (getCharacterCurrentParams(kCharacterHeadWait)[3]) {
+			if (!getCharacterCurrentParams(kCharacterHeadWait)[4]) {
+				getCharacterCurrentParams(kCharacterHeadWait)[4] = _gameTime + 4500;
+				if (_gameTime == -4500) {
+					setDoor(38, kCharacterHeadWait, 1, 0, 0);
+					getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall + 8] = 1;
+					HeadWaitCall(&LogicManager::CONS_HeadWait_DoDialog, "Wat5010", 0, 0, 0);
 					break;
-				case 7:
-					goto LABEL_48;
-				default:
-					return;
-				}
-				break;
-			case 135800432:
-				CONS_HeadWait_Disappear(0, 0, 0, 0);
-				break;
-			case 169750080:
-				if (whoRunningDialog(kCharacterHeadWait)) {
-				LABEL_48:
-					getCharacterCurrentParams(kCharacterHeadWait)[3] = 1;
-				} else {
-					getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall + 8] = 7;
-					HeadWaitCall(&LogicManager::CONS_HeadWait_DoDialog, "Wat5002", 0, 0, 0);
 				}
+			}
+
+			if (getCharacterCurrentParams(kCharacterHeadWait)[4] < _gameTime) {
+				getCharacterCurrentParams(kCharacterHeadWait)[4] = 0x7FFFFFFF;
+				setDoor(38, kCharacterHeadWait, 1, 0, 0);
+				getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall + 8] = 1;
+				HeadWaitCall(&LogicManager::CONS_HeadWait_DoDialog, "Wat5010", 0, 0, 0);
 				break;
 			}
-		} else if (msg->action == 17) {
-			if (getCharacterCurrentParams(kCharacterHeadWait)[1] || getCharacterCurrentParams(kCharacterHeadWait)[0]) {
-				getCharacterCurrentParams(kCharacterHeadWait)[1] = 0;
-				getCharacterCurrentParams(kCharacterHeadWait)[0] = 0;
-				setDoor(38, kCharacterHeadWait, 1, 10, 9);
-				getCharacterCurrentParams(kCharacterHeadWait)[2] = 0;
+		}
+
+		if (getCharacterCurrentParams(kCharacterHeadWait)[0]) {
+			if (getCharacterCurrentParams(kCharacterHeadWait)[5] || (getCharacterCurrentParams(kCharacterHeadWait)[5] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
+				if (getCharacterCurrentParams(kCharacterHeadWait)[5] >= _currentGameSessionTicks)
+					break;
+
+				getCharacterCurrentParams(kCharacterHeadWait)[5] = 0x7FFFFFFF;
 			}
-		} else if (msg->action == 12) {
-			getCharacter(kCharacterHeadWait).characterPosition.car = kCarRedSleeping;
-			getCharacter(kCharacterHeadWait).characterPosition.position = 3050;
-			getCharacter(kCharacterHeadWait).characterPosition.location = 1;
-			setDoor(38, kCharacterHeadWait, 1, 10, 9);
+
+			getCharacterCurrentParams(kCharacterHeadWait)[0] = 0;
+			getCharacterCurrentParams(kCharacterHeadWait)[1] = 1;
+			setDoor(38, kCharacterHeadWait, 1, 0, 0);
+			getCharacterCurrentParams(kCharacterHeadWait)[5] = 0;
+		} else {
+			getCharacterCurrentParams(kCharacterHeadWait)[5] = 0;
 		}
-	} else if (msg->action >= 8) {
+
+		break;
+	case 8:
+	case 9:
 		if (getCharacterCurrentParams(kCharacterHeadWait)[0]) {
 			setDoor(38, kCharacterHeadWait, 1, 0, 0);
 			getCharacterCurrentParams(kCharacterHeadWait)[0] = 0;
@@ -1307,40 +1539,91 @@ void LogicManager::HAND_HeadWait_Hiding(HAND_PARAMS) {
 			getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall + 8] = 4;
 			HeadWaitCall(&LogicManager::CONS_HeadWait_DoDialog, "LIB013", 0, 0, 0);
 		}
-	} else {
-		if (msg->action)
-			return;
-		if (getCharacterCurrentParams(kCharacterHeadWait)[3]) {
-			if (!getCharacterCurrentParams(kCharacterHeadWait)[4]) {
-				getCharacterCurrentParams(kCharacterHeadWait)[4] = _gameTime + 4500;
-				if (_gameTime == -4500)
-					goto LABEL_18;
-			}
-			if (getCharacterCurrentParams(kCharacterHeadWait)[4] < _gameTime) {
-				getCharacterCurrentParams(kCharacterHeadWait)[4] = 0x7FFFFFFF;
-			LABEL_18:
+
+		break;
+	case 12:
+		getCharacter(kCharacterHeadWait).characterPosition.car = kCarRedSleeping;
+		getCharacter(kCharacterHeadWait).characterPosition.position = 3050;
+		getCharacter(kCharacterHeadWait).characterPosition.location = 1;
+		setDoor(38, kCharacterHeadWait, 1, 10, 9);
+		break;
+	case 17:
+		if (getCharacterCurrentParams(kCharacterHeadWait)[1] || getCharacterCurrentParams(kCharacterHeadWait)[0]) {
+			getCharacterCurrentParams(kCharacterHeadWait)[1] = 0;
+			getCharacterCurrentParams(kCharacterHeadWait)[0] = 0;
+			setDoor(38, kCharacterHeadWait, 1, 10, 9);
+			getCharacterCurrentParams(kCharacterHeadWait)[2] = 0;
+		}
+
+		break;
+	case 18:
+		switch (getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall + 8]) {
+		case 1:
+			setDoor(38, kCharacterHeadWait, 1, 10, 9);
+
+			if (getCharacterCurrentParams(kCharacterHeadWait)[0]) {
+				if (getCharacterCurrentParams(kCharacterHeadWait)[5] || (getCharacterCurrentParams(kCharacterHeadWait)[5] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
+					if (getCharacterCurrentParams(kCharacterHeadWait)[5] >= _currentGameSessionTicks)
+						break;
+
+					getCharacterCurrentParams(kCharacterHeadWait)[5] = 0x7FFFFFFF;
+				}
+
+				getCharacterCurrentParams(kCharacterHeadWait)[0] = 0;
+				getCharacterCurrentParams(kCharacterHeadWait)[1] = 1;
 				setDoor(38, kCharacterHeadWait, 1, 0, 0);
-				getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall + 8] = 1;
-				HeadWaitCall(&LogicManager::CONS_HeadWait_DoDialog, "Wat5010", 0, 0, 0);
-				return;
+				getCharacterCurrentParams(kCharacterHeadWait)[5] = 0;
+			} else {
+				getCharacterCurrentParams(kCharacterHeadWait)[5] = 0;
 			}
-		}
-	LABEL_30:
-		if (getCharacterCurrentParams(kCharacterHeadWait)[0]) {
-			if (getCharacterCurrentParams(kCharacterHeadWait)[5] || (getCharacterCurrentParams(kCharacterHeadWait)[5] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
-				if (getCharacterCurrentParams(kCharacterHeadWait)[5] >= _currentGameSessionTicks)
-					return;
 
-				getCharacterCurrentParams(kCharacterHeadWait)[5] = 0x7FFFFFFF;
+			break;
+		case 2:
+			setDoor(38, kCharacterHeadWait, 1, 10, 9);
+			break;
+		case 3:
+		case 4:
+			getCharacterCurrentParams(kCharacterHeadWait)[2]++;
+			if (getCharacterCurrentParams(kCharacterHeadWait)[2] == 1) {
+				setDoor(38, kCharacterHeadWait, 1, 0, 0);
+				getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall + 8] = 5;
+				HeadWaitCall(&LogicManager::CONS_HeadWait_DoDialog, "Wat5001", 0, 0, 0);
+			} else if (getCharacterCurrentParams(kCharacterHeadWait)[2] == 2) {
+				setDoor(38, kCharacterHeadWait, 1, 0, 0);
+				getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall + 8] = 6;
+				HeadWaitCall(&LogicManager::CONS_HeadWait_DoDialog, "Wat5001A", 0, 0, 0);
 			}
 
-			getCharacterCurrentParams(kCharacterHeadWait)[0] = 0;
+			break;
+		case 5:
+			getCharacterCurrentParams(kCharacterHeadWait)[0] = 1;
+			setDoor(38, kCharacterHeadWait, 1, 14, 0);
+			break;
+		case 6:
 			getCharacterCurrentParams(kCharacterHeadWait)[1] = 1;
-			setDoor(38, kCharacterHeadWait, 1, 0, 0);
-			getCharacterCurrentParams(kCharacterHeadWait)[5] = 0;
+			break;
+		case 7:
+			getCharacterCurrentParams(kCharacterHeadWait)[3] = 1;
+			break;
+		default:
+			break;
+		}
+
+		break;
+	case 135800432:
+		CONS_HeadWait_Disappear(0, 0, 0, 0);
+		break;
+	case 169750080:
+		if (whoRunningDialog(kCharacterHeadWait)) {
+			getCharacterCurrentParams(kCharacterHeadWait)[3] = 1;
 		} else {
-			getCharacterCurrentParams(kCharacterHeadWait)[5] = 0;
+			getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall + 8] = 7;
+			HeadWaitCall(&LogicManager::CONS_HeadWait_DoDialog, "Wat5002", 0, 0, 0);
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 


Commit: 7f75090fff5ae20cdbedc893f256ffc670e446ff
    https://github.com/scummvm/scummvm/commit/7f75090fff5ae20cdbedc893f256ffc670e446ff
Author: AndywinXp (andywinxp at gmail.com)
Date: 2025-06-16T23:12:18+02:00

Commit Message:
LASTEXPRESS: Clean up Ivo logic

Changed paths:
    engines/lastexpress/characters/ivo.cpp


diff --git a/engines/lastexpress/characters/ivo.cpp b/engines/lastexpress/characters/ivo.cpp
index f498f0b7f20..62a3479caed 100644
--- a/engines/lastexpress/characters/ivo.cpp
+++ b/engines/lastexpress/characters/ivo.cpp
@@ -48,7 +48,7 @@ void LogicManager::CONS_Ivo(int chapter) {
 		CONS_Ivo_StartPart5(0, 0, 0, 0);
 		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -69,19 +69,25 @@ void LogicManager::CONS_Ivo_DebugWalks(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Ivo_DebugWalks(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			getCharacter(kCharacterIvo).characterPosition.position = 0;
-			getCharacter(kCharacterIvo).characterPosition.location = 0;
-			getCharacter(kCharacterIvo).characterPosition.car = kCarGreenSleeping;
-			getCharacterCurrentParams(kCharacterIvo)[0] = 10000;
-		}
-	} else if (walk(kCharacterIvo, kCarGreenSleeping, getCharacterCurrentParams(kCharacterIvo)[0])) {
-		if (getCharacterCurrentParams(kCharacterIvo)[0] == 10000) {
-			getCharacterCurrentParams(kCharacterIvo)[0] = 0;
-		} else {
-			getCharacterCurrentParams(kCharacterIvo)[0] = 10000;
+	switch (msg->action) {
+	case 0:
+		if (walk(kCharacterIvo, kCarGreenSleeping, getCharacterCurrentParams(kCharacterIvo)[0])) {
+			if (getCharacterCurrentParams(kCharacterIvo)[0] == 10000) {
+				getCharacterCurrentParams(kCharacterIvo)[0] = 0;
+			} else {
+				getCharacterCurrentParams(kCharacterIvo)[0] = 10000;
+			}
 		}
+
+		break;
+	case 12:
+		break;
+		getCharacter(kCharacterIvo).characterPosition.position = 0;
+		getCharacter(kCharacterIvo).characterPosition.location = 0;
+		getCharacter(kCharacterIvo).characterPosition.car = kCarGreenSleeping;
+		getCharacterCurrentParams(kCharacterIvo)[0] = 10000;
+	default:
+		break;
 	}
 }
 
@@ -98,12 +104,17 @@ void LogicManager::CONS_Ivo_DoSeqOtis(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Ivo_DoSeqOtis(HAND_PARAMS) {
-	if (msg->action == 3) {
+	switch (msg->action) {
+	case 3:
 		getCharacter(kCharacterIvo).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterIvo, _functionsIvo[getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall]]);
 		fedEx(kCharacterIvo, kCharacterIvo, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		startSeqOtis(kCharacterIvo, (char *)&getCharacterCurrentParams(kCharacterIvo)[0]);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -122,15 +133,20 @@ void LogicManager::CONS_Ivo_DoCorrOtis(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Ivo_DoCorrOtis(HAND_PARAMS) {
-	if (msg->action == 3) {
+	switch (msg->action) {
+	case 3:
 		releaseAtDoor(kCharacterIvo, getCharacterCurrentParams(kCharacterIvo)[3]);
 
 		getCharacter(kCharacterIvo).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterIvo, _functionsIvo[getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall]]);
 		fedEx(kCharacterIvo, kCharacterIvo, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		startSeqOtis(kCharacterIvo, (char *)&getCharacterCurrentParams(kCharacterIvo)[0]);
 		blockAtDoor(kCharacterIvo, getCharacterCurrentParams(kCharacterIvo)[3]);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -147,11 +163,12 @@ void LogicManager::CONS_Ivo_DoWait(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Ivo_DoWait(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		if (getCharacterCurrentParams(kCharacterIvo)[1] || (getCharacterCurrentParams(kCharacterIvo)[1] = _gameTime + getCharacterCurrentParams(kCharacterIvo)[0],
 															_gameTime + getCharacterCurrentParams(kCharacterIvo)[0] != 0)) {
 			if (getCharacterCurrentParams(kCharacterIvo)[1] >= _gameTime)
-				return;
+				break;
 
 			getCharacterCurrentParams(kCharacterIvo)[1] = 0x7FFFFFFF;
 		}
@@ -159,6 +176,9 @@ void LogicManager::HAND_Ivo_DoWait(HAND_PARAMS) {
 		getCharacter(kCharacterIvo).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterIvo, _functionsIvo[getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall]]);
 		fedEx(kCharacterIvo, kCharacterIvo, 18, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -175,11 +195,12 @@ void LogicManager::CONS_Ivo_DoWaitReal(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Ivo_DoWaitReal(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		if (getCharacterCurrentParams(kCharacterIvo)[1] || (getCharacterCurrentParams(kCharacterIvo)[1] = _currentGameSessionTicks + getCharacterCurrentParams(kCharacterIvo)[0],
 															_currentGameSessionTicks + getCharacterCurrentParams(kCharacterIvo)[0] != 0)) {
 			if (getCharacterCurrentParams(kCharacterIvo)[1] >= _currentGameSessionTicks)
-				return;
+				break;
 
 			getCharacterCurrentParams(kCharacterIvo)[1] = 0x7FFFFFFF;
 		}
@@ -187,6 +208,9 @@ void LogicManager::HAND_Ivo_DoWaitReal(HAND_PARAMS) {
 		getCharacter(kCharacterIvo).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterIvo, _functionsIvo[getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall]]);
 		fedEx(kCharacterIvo, kCharacterIvo, 18, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -206,23 +230,20 @@ void LogicManager::CONS_Ivo_DoWalk(CONS_PARAMS) {
 void LogicManager::HAND_Ivo_DoWalk(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
-		if (walk(kCharacterIvo, getCharacterCurrentParams(kCharacterIvo)[0], getCharacterCurrentParams(kCharacterIvo)[1]))
-			goto LABEL_7;
-		break;
-	case 5:
-	case 6:
-		playDialog(0, "CAT1127A", -1, 0);
-		break;
 	case 12:
 		if (walk(kCharacterIvo, getCharacterCurrentParams(kCharacterIvo)[0], getCharacterCurrentParams(kCharacterIvo)[1])) {
-		LABEL_7:
 			getCharacter(kCharacterIvo).currentCall--;
 			_engine->getMessageManager()->setMessageHandle(kCharacterIvo, _functionsIvo[getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall]]);
 			fedEx(kCharacterIvo, kCharacterIvo, 18, 0);
 		}
+
+		break;
+	case 5:
+	case 6:
+		playDialog(kCharacterCath, "CAT1127A", -1, 0);
 		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -237,16 +258,22 @@ void LogicManager::CONS_Ivo_FinishSeqOtis(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Ivo_FinishSeqOtis(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		if (getCharacter(kCharacterIvo).direction != 4) {
 			getCharacter(kCharacterIvo).currentCall--;
 			_engine->getMessageManager()->setMessageHandle(kCharacterIvo, _functionsIvo[getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall]]);
 			fedEx(kCharacterIvo, kCharacterIvo, 18, 0);
 		}
-	} else if (msg->action == 3) {
+
+		break;
+	case 3:
 		getCharacter(kCharacterIvo).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterIvo, _functionsIvo[getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall]]);
 		fedEx(kCharacterIvo, kCharacterIvo, 18, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -261,13 +288,18 @@ void LogicManager::CONS_Ivo_DoDialog(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Ivo_DoDialog(HAND_PARAMS) {
-	if (msg->action == 2) {
+	switch (msg->action) {
+	case 2:
 		getCharacter(kCharacterIvo).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterIvo, _functionsIvo[getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall]]);
 		fedEx(kCharacterIvo, kCharacterIvo, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		getCharacter(kCharacterIvo).inventoryItem = 0;
 		playDialog(kCharacterIvo, (char *)&getCharacterCurrentParams(kCharacterIvo)[0], -1, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -282,10 +314,18 @@ void LogicManager::CONS_Ivo_WaitRCClear(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Ivo_WaitRCClear(HAND_PARAMS) {
-	if ((msg->action == 0 && rcClear()) || (msg->action == 12 && rcClear())) {
-		getCharacter(kCharacterIvo).currentCall--;
-		_engine->getMessageManager()->setMessageHandle(kCharacterIvo, _functionsIvo[getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall]]);
-		fedEx(kCharacterIvo, kCharacterIvo, 18, 0);
+	switch (msg->action) {
+	case 0:
+	case 12:
+		if (rcClear()) {
+			getCharacter(kCharacterIvo).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterIvo, _functionsIvo[getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall]]);
+			fedEx(kCharacterIvo, kCharacterIvo, 18, 0);
+		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -303,22 +343,25 @@ void LogicManager::CONS_Ivo_SaveGame(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Ivo_SaveGame(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			save(
-				kCharacterIvo,
-				getCharacterCurrentParams(kCharacterIvo)[0],
-				getCharacterCurrentParams(kCharacterIvo)[1]
-			);
+	switch (msg->action) {
+	case 0:
+		getCharacter(kCharacterIvo).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterIvo, _functionsIvo[getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall]]);
+		fedEx(kCharacterIvo, kCharacterIvo, 18, 0);
+		break;
+	case 12:
+		save(
+			kCharacterIvo,
+			getCharacterCurrentParams(kCharacterIvo)[0],
+			getCharacterCurrentParams(kCharacterIvo)[1]
+		);
 
-			getCharacter(kCharacterIvo).currentCall--;
-			_engine->getMessageManager()->setMessageHandle(kCharacterIvo, _functionsIvo[getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall]]);
-			fedEx(kCharacterIvo, kCharacterIvo, 18, 0);
-		}
-	} else {
 		getCharacter(kCharacterIvo).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterIvo, _functionsIvo[getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall]]);
 		fedEx(kCharacterIvo, kCharacterIvo, 18, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -333,57 +376,67 @@ void LogicManager::CONS_Ivo_GoCompartment(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Ivo_GoCompartment(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			startSeqOtis(kCharacterIvo, "809DS");
-			if (inDiningRoom(kCharacterCath))
-				advanceFrame(kCharacterIvo);
-			getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall + 8] = 1;
-			IvoCall(&LogicManager::CONS_Ivo_FinishSeqOtis, 0, 0, 0, 0);
-		} else if (msg->action == 18) {
-			switch (getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall + 8]) {
-			case 1:
-				send(kCharacterIvo, kCharacterSalko, 125242096, 0);
-				getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall + 8] = 2;
-				IvoCall(&LogicManager::CONS_Ivo_DoWalk, 4, 2740, 0, 0);
-				break;
-			case 2:
-				if (nearChar(kCharacterIvo, kCharacterSalko, 750) || nearX(kCharacterSalko, 2740, 500)) {
-					send(kCharacterIvo, kCharacterSalko, 123668192, 0);
-					getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall + 8] = 3;
-					IvoCall(&LogicManager::CONS_Ivo_DoCorrOtis, "613Ah", 39, 0, 0);
-				} else {
-					startCycOtis(kCharacterIvo, "613Hh");
-					softBlockAtDoor(kCharacterIvo, 39);
-				}
-				break;
-			case 3:
-				getCharacter(kCharacterIvo).characterPosition.position = 2740;
-				getCharacter(kCharacterIvo).characterPosition.location = 1;
-				endGraphics(kCharacterIvo);
-
-				getCharacter(kCharacterIvo).currentCall--;
-				_engine->getMessageManager()->setMessageHandle(kCharacterIvo, _functionsIvo[getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall]]);
-				fedEx(kCharacterIvo, kCharacterIvo, 18, 0);
-				break;
-			case 4:
-				softReleaseAtDoor(kCharacterIvo, 39);
-				getCharacter(kCharacterIvo).characterPosition.position = 2740;
-				getCharacter(kCharacterIvo).characterPosition.location = 1;
-				endGraphics(kCharacterIvo);
-
-				getCharacter(kCharacterIvo).currentCall--;
-				_engine->getMessageManager()->setMessageHandle(kCharacterIvo, _functionsIvo[getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall]]);
-				fedEx(kCharacterIvo, kCharacterIvo, 18, 0);
-				break;
-			default:
-				return;
+	switch (msg->action) {
+	case 0:
+		if (nearChar(kCharacterIvo, kCharacterSalko, 750) || nearX(kCharacterSalko, 2740, 500)) {
+			send(kCharacterIvo, kCharacterSalko, 123668192, 0);
+			getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall + 8] = 4;
+			IvoCall(&LogicManager::CONS_Ivo_DoCorrOtis, "613Ah", 39, 0, 0);
+		}
+		break;
+	case 12:
+		startSeqOtis(kCharacterIvo, "809DS");
+
+		if (inDiningRoom(kCharacterCath))
+			advanceFrame(kCharacterIvo);
+
+		getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall + 8] = 1;
+		IvoCall(&LogicManager::CONS_Ivo_FinishSeqOtis, 0, 0, 0, 0);
+		break;
+	case 18:
+		switch (getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall + 8]) {
+		case 1:
+			send(kCharacterIvo, kCharacterSalko, 125242096, 0);
+			getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall + 8] = 2;
+			IvoCall(&LogicManager::CONS_Ivo_DoWalk, 4, 2740, 0, 0);
+			break;
+		case 2:
+			if (nearChar(kCharacterIvo, kCharacterSalko, 750) || nearX(kCharacterSalko, 2740, 500)) {
+				send(kCharacterIvo, kCharacterSalko, 123668192, 0);
+				getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall + 8] = 3;
+				IvoCall(&LogicManager::CONS_Ivo_DoCorrOtis, "613Ah", 39, 0, 0);
+			} else {
+				startCycOtis(kCharacterIvo, "613Hh");
+				softBlockAtDoor(kCharacterIvo, 39);
 			}
+
+			break;
+		case 3:
+			getCharacter(kCharacterIvo).characterPosition.position = 2740;
+			getCharacter(kCharacterIvo).characterPosition.location = 1;
+			endGraphics(kCharacterIvo);
+
+			getCharacter(kCharacterIvo).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterIvo, _functionsIvo[getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall]]);
+			fedEx(kCharacterIvo, kCharacterIvo, 18, 0);
+			break;
+		case 4:
+			softReleaseAtDoor(kCharacterIvo, 39);
+			getCharacter(kCharacterIvo).characterPosition.position = 2740;
+			getCharacter(kCharacterIvo).characterPosition.location = 1;
+			endGraphics(kCharacterIvo);
+
+			getCharacter(kCharacterIvo).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterIvo, _functionsIvo[getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall]]);
+			fedEx(kCharacterIvo, kCharacterIvo, 18, 0);
+			break;
+		default:
+			break;
 		}
-	} else if (nearChar(kCharacterIvo, kCharacterSalko, 750) || nearX(kCharacterSalko, 2740, 500)) {
-		send(kCharacterIvo, kCharacterSalko, 123668192, 0);
-		getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall + 8] = 4;
-		IvoCall(&LogicManager::CONS_Ivo_DoCorrOtis, "613Ah", 39, 0, 0);
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -398,17 +451,22 @@ void LogicManager::CONS_Ivo_DoSplitOtis023A(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Ivo_DoSplitOtis023A(HAND_PARAMS) {
-	if (msg->action == 3) {
+	switch (msg->action) {
+	case 3:
 		endGraphics(kCharacterSalko);
 		send(kCharacterIvo, kCharacterTableC, 136455232, 0);
 
 		getCharacter(kCharacterIvo).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterIvo, _functionsIvo[getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall]]);
 		fedEx(kCharacterIvo, kCharacterIvo, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		startSeqOtis(kCharacterIvo, "023A1");
 		startSeqOtis(kCharacterSalko, "023A2");
 		startSeqOtis(kCharacterTableC, "023A3");
+		break;
+	default:
+		break;
 	}
 }
 
@@ -423,17 +481,22 @@ void LogicManager::CONS_Ivo_DoSplitOtis023D(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Ivo_DoSplitOtis023D(HAND_PARAMS) {
-	if (msg->action == 3) {
+	switch (msg->action) {
+	case 3:
 		send(kCharacterIvo, kCharacterTableC, 103798704, "009E");
 		endGraphics(kCharacterSalko);
 
 		getCharacter(kCharacterIvo).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterIvo, _functionsIvo[getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall]]);
 		fedEx(kCharacterIvo, kCharacterIvo, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		startSeqOtis(kCharacterIvo, "023D1");
 		startSeqOtis(kCharacterSalko, "023D2");
 		startSeqOtis(kCharacterTableC, "023D3");
+		break;
+	default:
+		break;
 	}
 }
 
@@ -448,17 +511,23 @@ void LogicManager::CONS_Ivo_Birth(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Ivo_Birth(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			setDoor(39, kCharacterCath, 3, 10, 9);
-			setDoor(47, kCharacterCath, 0, 255, 255);
-			getCharacter(kCharacterIvo).characterPosition.position = 4691;
-			getCharacter(kCharacterIvo).characterPosition.location = 1;
-			getCharacter(kCharacterIvo).characterPosition.car = kCarRestaurant;
+	switch (msg->action) {
+	case 0:
+		if (_gameTime > 1062000 && !getCharacterCurrentParams(kCharacterIvo)[0]) {
+			getCharacterCurrentParams(kCharacterIvo)[0] = 1;
+			CONS_Ivo_ReturnComp(0, 0, 0, 0);
 		}
-	} else if (_gameTime > 1062000 && !getCharacterCurrentParams(kCharacterIvo)[0]) {
-		getCharacterCurrentParams(kCharacterIvo)[0] = 1;
-		CONS_Ivo_ReturnComp(0, 0, 0, 0);
+
+		break;
+	case 12:
+		setDoor(39, kCharacterCath, 3, 10, 9);
+		setDoor(47, kCharacterCath, 0, 255, 255);
+		getCharacter(kCharacterIvo).characterPosition.position = 4691;
+		getCharacter(kCharacterIvo).characterPosition.location = 1;
+		getCharacter(kCharacterIvo).characterPosition.car = kCarRestaurant;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -473,21 +542,26 @@ void LogicManager::CONS_Ivo_ReturnComp(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Ivo_ReturnComp(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 18) {
-			if (getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall + 8] == 1) {
-				getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall + 8] = 2;
-				IvoCall(&LogicManager::CONS_Ivo_GoCompartment, 0, 0, 0, 0);
-			} else if (getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall + 8] == 2) {
-				send(kCharacterIvo, kCharacterMilos, 135024800, 0);
-				CONS_Ivo_InComp(0, 0, 0, 0);
-			}
-		} else if (msg->action == 125242096) {
-			getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall + 8] = 1;
-			IvoCall(&LogicManager::CONS_Ivo_DoWaitReal, 75, 0, 0, 0);
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		getCharacter(kCharacterIvo).characterPosition = getCharacter(kCharacterMilos).characterPosition;
+		break;
+	case 18:
+		if (getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall + 8] == 1) {
+			getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall + 8] = 2;
+			IvoCall(&LogicManager::CONS_Ivo_GoCompartment, 0, 0, 0, 0);
+		} else if (getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall + 8] == 2) {
+			send(kCharacterIvo, kCharacterMilos, 135024800, 0);
+			CONS_Ivo_InComp(0, 0, 0, 0);
+		}
+
+		break;
+	case 125242096:
+		getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall + 8] = 1;
+		IvoCall(&LogicManager::CONS_Ivo_DoWaitReal, 75, 0, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -502,23 +576,15 @@ void LogicManager::CONS_Ivo_InComp(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Ivo_InComp(HAND_PARAMS) {
-	if (msg->action > 18) {
-		switch (msg->action) {
-		case 122865568:
-			getCharacter(kCharacterIvo).characterPosition.location = 0;
-			getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall + 8] = 1;
-			IvoCall(&LogicManager::CONS_Ivo_DoCorrOtis, "613Bh", 39, 0, 0);
-			break;
-		case 123852928:
-			softReleaseAtDoor(kCharacterIvo, 39);
-			getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall + 8] = 2;
-			IvoCall(&LogicManager::CONS_Ivo_DoCorrOtis, "613Dh", 39, 0, 0);
-			break;
-		case 221683008:
-			send(kCharacterIvo, kCharacterCond2, 123199584, 0);
-			break;
-		}
-	} else if (msg->action == 18) {
+	switch (msg->action) {
+	case 12:
+		getCharacter(kCharacterIvo).characterPosition.position = 2740;
+		getCharacter(kCharacterIvo).characterPosition.location = 1;
+		getCharacter(kCharacterIvo).characterPosition.car = kCarRedSleeping;
+		setDoor(39, kCharacterCath, 3, 10, 9);
+		endGraphics(kCharacterIvo);
+		break;
+	case 18:
 		if (getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall + 8] == 1) {
 			startCycOtis(kCharacterIvo, "613Ch");
 			softBlockAtDoor(kCharacterIvo, 39);
@@ -529,12 +595,23 @@ void LogicManager::HAND_Ivo_InComp(HAND_PARAMS) {
 			endGraphics(kCharacterIvo);
 			setDoor(39, kCharacterCath, 3, 10, 9);
 		}
-	} else if (msg->action == 12) {
-		getCharacter(kCharacterIvo).characterPosition.position = 2740;
-		getCharacter(kCharacterIvo).characterPosition.location = 1;
-		getCharacter(kCharacterIvo).characterPosition.car = kCarRedSleeping;
-		setDoor(39, kCharacterCath, 3, 10, 9);
-		endGraphics(kCharacterIvo);
+
+		break;
+	case 122865568:
+		getCharacter(kCharacterIvo).characterPosition.location = 0;
+		getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall + 8] = 1;
+		IvoCall(&LogicManager::CONS_Ivo_DoCorrOtis, "613Bh", 39, 0, 0);
+		break;
+	case 123852928:
+		softReleaseAtDoor(kCharacterIvo, 39);
+		getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall + 8] = 2;
+		IvoCall(&LogicManager::CONS_Ivo_DoCorrOtis, "613Dh", 39, 0, 0);
+		break;
+	case 221683008:
+		send(kCharacterIvo, kCharacterCond2, 123199584, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -549,12 +626,16 @@ void LogicManager::CONS_Ivo_Asleep(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Ivo_Asleep(HAND_PARAMS) {
-	if (msg->action == 12) {
-		getCharacter(kCharacterIvo).characterPosition.car = 4;
+	switch (msg->action) {
+	case 12:
+		getCharacter(kCharacterIvo).characterPosition.car = kCarRedSleeping;
 		getCharacter(kCharacterIvo).characterPosition.position = 2740;
 		getCharacter(kCharacterIvo).characterPosition.location = 1;
 		endGraphics(kCharacterIvo);
 		setDoor(39, kCharacterCath, 3, 10, 9);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -569,20 +650,26 @@ void LogicManager::CONS_Ivo_StartPart2(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Ivo_StartPart2(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			endGraphics(kCharacterIvo);
-			getCharacter(kCharacterIvo).characterPosition.car = kCarRedSleeping;
-			getCharacter(kCharacterIvo).characterPosition.position = 2740;
-			getCharacter(kCharacterIvo).characterPosition.location = 1;
-			getCharacter(kCharacterIvo).clothes = 0;
-			getCharacter(kCharacterIvo).inventoryItem = 0;
-			setDoor(39, kCharacterCath, 3, 10, 9);
-			setDoor(47, kCharacterCath, 1, 255, 255);
+	switch (msg->action) {
+	case 0:
+		if (_gameTime > 1777500 && !getCharacterCurrentParams(kCharacterIvo)[0]) {
+			getCharacterCurrentParams(kCharacterIvo)[0] = 1;
+			CONS_Ivo_GoBreakfast(0, 0, 0, 0);
 		}
-	} else if (_gameTime > 1777500 && !getCharacterCurrentParams(kCharacterIvo)[0]) {
-		getCharacterCurrentParams(kCharacterIvo)[0] = 1;
-		CONS_Ivo_GoBreakfast(0, 0, 0, 0);
+
+		break;
+	case 12:
+		endGraphics(kCharacterIvo);
+		getCharacter(kCharacterIvo).characterPosition.car = kCarRedSleeping;
+		getCharacter(kCharacterIvo).characterPosition.position = 2740;
+		getCharacter(kCharacterIvo).characterPosition.location = 1;
+		getCharacter(kCharacterIvo).clothes = 0;
+		getCharacter(kCharacterIvo).inventoryItem = 0;
+		setDoor(39, kCharacterCath, 3, 10, 9);
+		setDoor(47, kCharacterCath, 1, 255, 255);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -606,8 +693,10 @@ void LogicManager::HAND_Ivo_GoBreakfast(HAND_PARAMS) {
 		switch (getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall + 8]) {
 		case 1:
 			getCharacter(kCharacterIvo).characterPosition.location = 0;
+
 			if (getCharacter(kCharacterIvo).characterPosition.position < 2087)
 				getCharacter(kCharacterIvo).characterPosition.position = 2088;
+
 			getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall + 8] = 2;
 			IvoCall(&LogicManager::CONS_Ivo_DoWalk, 5, 850, 0, 0);
 			break;
@@ -629,13 +718,16 @@ void LogicManager::HAND_Ivo_GoBreakfast(HAND_PARAMS) {
 			CONS_Ivo_AtBreakfast(0, 0, 0, 0);
 			break;
 		default:
-			return;
+			break;
 		}
+
 		break;
 	case 102675536:
 		getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall + 8] = 3;
 		IvoCall(&LogicManager::CONS_Ivo_WaitRCClear, 0, 0, 0, 0);
 		break;
+	default:
+		break;
 	}
 }
 
@@ -650,37 +742,48 @@ void LogicManager::CONS_Ivo_AtBreakfast(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Ivo_AtBreakfast(HAND_PARAMS) {
-	if (msg->action > 12) {
-		if (msg->action == 18) {
-			switch (getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall + 8]) {
-			case 1:
-				send(kCharacterIvo, kCharacterWaiter2, 101106391, 0);
-				startCycOtis(kCharacterIvo, "023B");
-				getCharacterCurrentParams(kCharacterIvo)[0] = 1;
-				break;
-			case 2:
-				getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall + 8] = 3;
-				IvoCall(&LogicManager::CONS_Ivo_GoCompartment, 0, 0, 0, 0);
-				break;
-			case 3:
-				send(kCharacterIvo, kCharacterWaiter2, 236237423, 0);
-				CONS_Ivo_InComp2(0, 0, 0, 0);
-				break;
+	switch (msg->action) {
+	case 0:
+		if (_gameTime > 1809000 && getCharacterCurrentParams(kCharacterIvo)[0]) {
+			if (rcClear()) {
+				getCharacter(kCharacterIvo).characterPosition.location = 0;
+				getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall + 8] = 2;
+				IvoCall(&LogicManager::CONS_Ivo_DoSplitOtis023D, 0, 0, 0, 0);
 			}
-		} else if (msg->action == 123712592) {
-			startCycOtis(kCharacterIvo, "023C2");
-			getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall + 8] = 1;
-			IvoCall(&LogicManager::CONS_Ivo_DoWait, 450, 0, 0, 0);
 		}
-	} else if (msg->action == 12) {
+
+		break;
+	case 12:
 		send(kCharacterIvo, kCharacterWaiter2, 189688608, 0);
 		startCycOtis(kCharacterIvo, "023B");
-	} else if (msg->action == 0 && _gameTime > 1809000 && getCharacterCurrentParams(kCharacterIvo)[0]) {
-		if (rcClear()) {
-			getCharacter(kCharacterIvo).characterPosition.location = 0;
-			getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall + 8] = 2;
-			IvoCall(&LogicManager::CONS_Ivo_DoSplitOtis023D, 0, 0, 0, 0);
+		break;
+	case 18:
+		switch (getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall + 8]) {
+		case 1:
+			send(kCharacterIvo, kCharacterWaiter2, 101106391, 0);
+			startCycOtis(kCharacterIvo, "023B");
+			getCharacterCurrentParams(kCharacterIvo)[0] = 1;
+			break;
+		case 2:
+			getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall + 8] = 3;
+			IvoCall(&LogicManager::CONS_Ivo_GoCompartment, 0, 0, 0, 0);
+			break;
+		case 3:
+			send(kCharacterIvo, kCharacterWaiter2, 236237423, 0);
+			CONS_Ivo_InComp2(0, 0, 0, 0);
+			break;
+		default:
+			break;
 		}
+
+		break;
+	case 123712592:
+		startCycOtis(kCharacterIvo, "023C2");
+		getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall + 8] = 1;
+		IvoCall(&LogicManager::CONS_Ivo_DoWait, 450, 0, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -695,11 +798,15 @@ void LogicManager::CONS_Ivo_InComp2(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Ivo_InComp2(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterIvo).characterPosition.position = 2740;
 		getCharacter(kCharacterIvo).characterPosition.location = 1;
 		getCharacter(kCharacterIvo).characterPosition.car = kCarRedSleeping;
 		setDoor(39, kCharacterCath, 3, 10, 9);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -714,17 +821,20 @@ void LogicManager::CONS_Ivo_StartPart3(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Ivo_StartPart3(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			endGraphics(kCharacterIvo);
-			getCharacter(kCharacterIvo).characterPosition.car = kCarRedSleeping;
-			getCharacter(kCharacterIvo).characterPosition.position = 2740;
-			getCharacter(kCharacterIvo).characterPosition.location = 1;
-			getCharacter(kCharacterIvo).clothes = 0;
-			getCharacter(kCharacterIvo).inventoryItem = 0;
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		CONS_Ivo_InComp3(0, 0, 0, 0);
+		break;
+	case 12:
+		endGraphics(kCharacterIvo);
+		getCharacter(kCharacterIvo).characterPosition.car = kCarRedSleeping;
+		getCharacter(kCharacterIvo).characterPosition.position = 2740;
+		getCharacter(kCharacterIvo).characterPosition.location = 1;
+		getCharacter(kCharacterIvo).clothes = 0;
+		getCharacter(kCharacterIvo).inventoryItem = 0;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -739,8 +849,13 @@ void LogicManager::CONS_Ivo_InComp3(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Ivo_InComp3(HAND_PARAMS) {
-	if (msg->action == 12)
+	switch (msg->action) {
+	case 12:
 		setDoor(39, kCharacterCath, 3, 10, 9);
+		break;
+	default:
+		break;
+	}
 }
 
 void LogicManager::CONS_Ivo_StartPart4(CONS_PARAMS) {
@@ -754,14 +869,17 @@ void LogicManager::CONS_Ivo_StartPart4(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Ivo_StartPart4(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			getCharacter(kCharacterIvo).characterPosition.location = 1;
-			getCharacter(kCharacterIvo).characterPosition.car = kCarRestaurant;
-			getCharacter(kCharacterIvo).inventoryItem = 0;
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		CONS_Ivo_AtDinner4(0, 0, 0, 0);
+		break;
+	case 12:
+		getCharacter(kCharacterIvo).characterPosition.location = 1;
+		getCharacter(kCharacterIvo).characterPosition.car = kCarRestaurant;
+		getCharacter(kCharacterIvo).inventoryItem = 0;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -776,14 +894,20 @@ void LogicManager::CONS_Ivo_AtDinner4(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Ivo_AtDinner4(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			send(kCharacterIvo, kCharacterTableC, 136455232, 0);
-			startCycOtis(kCharacterIvo, "023B");
+	switch (msg->action) {
+	case 0:
+		if (_gameTime > 2361600 && rcClear()) {
+			getCharacter(kCharacterIvo).characterPosition.location = 0;
+			CONS_Ivo_ReturnComp4(0, 0, 0, 0);
 		}
-	} else if (_gameTime > 2361600 && rcClear()) {
-		getCharacter(kCharacterIvo).characterPosition.location = 0;
-		CONS_Ivo_ReturnComp4(0, 0, 0, 0);
+
+		break;
+	case 12:
+		send(kCharacterIvo, kCharacterTableC, 136455232, 0);
+		startCycOtis(kCharacterIvo, "023B");
+		break;
+	default:
+		break;
 	}
 }
 
@@ -798,16 +922,22 @@ void LogicManager::CONS_Ivo_ReturnComp4(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Ivo_ReturnComp4(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall + 8] = 1;
 		IvoCall(&LogicManager::CONS_Ivo_DoSplitOtis023D, 0, 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		if (getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall + 8] == 1) {
 			getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall + 8] = 2;
 			IvoCall(&LogicManager::CONS_Ivo_GoCompartment, 0, 0, 0, 0);
 		} else if (getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall + 8] == 2) {
 			CONS_Ivo_InComp4(0, 0, 0, 0);
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -822,28 +952,18 @@ void LogicManager::CONS_Ivo_InComp4(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Ivo_InComp4(HAND_PARAMS) {
-	if (msg->action > 18) {
-		if (msg->action > 122865568) {
-			if (msg->action == 123852928) {
-				getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall + 8] = 4;
-				IvoCall(&LogicManager::CONS_Ivo_DoCorrOtis, "613Dh", 39, 0, 0);
-			} else if (msg->action == 221683008) {
-				send(kCharacterIvo, kCharacterCond2, 123199584, 0);
-			}
-		} else if (msg->action == 122865568) {
-			getCharacter(kCharacterIvo).characterPosition.location = 0;
-			getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall + 8] = 3;
-			IvoCall(&LogicManager::CONS_Ivo_DoCorrOtis, "613Bh", 39, 0, 0);
-		} else if (msg->action == 55996766) {
-			getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall + 8] = 1;
-			IvoCall(&LogicManager::CONS_Ivo_DoCorrOtis, "613FH", 39, 0, 0);
-		}
-	} else if (msg->action == 18) {
+	switch (msg->action) {
+	case 12:
+		setDoor(39, kCharacterCath, 3, 10, 9);
+		break;
+	case 18:
 		switch (getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall + 8]) {
 		case 1:
 			getCharacter(kCharacterIvo).characterPosition.location = 0;
+
 			if (getCharacter(kCharacterIvo).characterPosition.position < 2087)
 				getCharacter(kCharacterIvo).characterPosition.position = 2088;
+
 			getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall + 8] = 2;
 			IvoCall(&LogicManager::CONS_Ivo_DoWalk, 5, 850, 0, 0);
 			break;
@@ -863,10 +983,28 @@ void LogicManager::HAND_Ivo_InComp4(HAND_PARAMS) {
 			endGraphics(kCharacterIvo);
 			break;
 		default:
-			return;
+			break;
 		}
-	} else if (msg->action == 12) {
-		setDoor(39, kCharacterCath, 3, 10, 9);
+
+		break;
+	case 123852928:
+		getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall + 8] = 4;
+		IvoCall(&LogicManager::CONS_Ivo_DoCorrOtis, "613Dh", 39, 0, 0);
+		break;
+	case 221683008:
+		send(kCharacterIvo, kCharacterCond2, 123199584, 0);
+		break;
+	case 122865568:
+		getCharacter(kCharacterIvo).characterPosition.location = 0;
+		getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall + 8] = 3;
+		IvoCall(&LogicManager::CONS_Ivo_DoCorrOtis, "613Bh", 39, 0, 0);
+		break;
+	case 55996766:
+		getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall + 8] = 1;
+		IvoCall(&LogicManager::CONS_Ivo_DoCorrOtis, "613FH", 39, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -881,19 +1019,26 @@ void LogicManager::CONS_Ivo_Hiding(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Ivo_Hiding(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 18) {
-			if (getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall + 8] == 1) {
-				getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall + 8] = 2;
-				IvoCall(&LogicManager::CONS_Ivo_DoCorrOtis, "613EH", 39, 0, 0);
-			} else if (getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall + 8] == 2) {
-				CONS_Ivo_EndPart4(0, 0, 0, 0);
-			}
+	switch (msg->action) {
+	case 0:
+		if (_gameTime > 2425500 && !getCharacterCurrentParams(kCharacterIvo)[0]) {
+			getCharacterCurrentParams(kCharacterIvo)[0] = 1;
+			getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall + 8] = 1;
+			IvoCall(&LogicManager::CONS_Ivo_DoWalk, 4, 2740, 0, 0);
 		}
-	} else if (_gameTime > 2425500 && !getCharacterCurrentParams(kCharacterIvo)[0]) {
-		getCharacterCurrentParams(kCharacterIvo)[0] = 1;
-		getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall + 8] = 1;
-		IvoCall(&LogicManager::CONS_Ivo_DoWalk, 4, 2740, 0, 0);
+
+		break;
+	case 18:
+		if (getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall + 8] == 1) {
+			getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall + 8] = 2;
+			IvoCall(&LogicManager::CONS_Ivo_DoCorrOtis, "613EH", 39, 0, 0);
+		} else if (getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall + 8] == 2) {
+			CONS_Ivo_EndPart4(0, 0, 0, 0);
+		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -908,13 +1053,17 @@ void LogicManager::CONS_Ivo_EndPart4(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Ivo_EndPart4(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		endGraphics(kCharacterIvo);
 		setDoor(39, kCharacterCath, 3, 10, 9);
 		getCharacter(kCharacterIvo).characterPosition.location = 1;
 		getCharacter(kCharacterIvo).characterPosition.position = 2740;
 		getCharacter(kCharacterIvo).characterPosition.car = kCarRedSleeping;
 		getCharacter(kCharacterIvo).inventoryItem = 0;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -929,16 +1078,19 @@ void LogicManager::CONS_Ivo_StartPart5(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Ivo_StartPart5(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			endGraphics(kCharacterIvo);
-			getCharacter(kCharacterIvo).characterPosition.location = kCarBaggageRear;
-			getCharacter(kCharacterIvo).characterPosition.position = 540;
-			getCharacter(kCharacterIvo).characterPosition.car = kCarBaggageRear;
-			getCharacter(kCharacterIvo).inventoryItem = 0;
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		CONS_Ivo_GoofingOff(0, 0, 0, 0);
+		break;
+	case 12:
+		endGraphics(kCharacterIvo);
+		getCharacter(kCharacterIvo).characterPosition.location = kCarBaggageRear;
+		getCharacter(kCharacterIvo).characterPosition.position = 540;
+		getCharacter(kCharacterIvo).characterPosition.car = kCarBaggageRear;
+		getCharacter(kCharacterIvo).inventoryItem = 0;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -953,8 +1105,13 @@ void LogicManager::CONS_Ivo_GoofingOff(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Ivo_GoofingOff(HAND_PARAMS) {
-	if (msg->action == 192637492)
+	switch (msg->action) {
+	case 192637492:
 		CONS_Ivo_FightCath(0, 0, 0, 0);
+		break;
+	default:
+		break;
+	}
 }
 
 void LogicManager::CONS_Ivo_FightCath(CONS_PARAMS) {
@@ -968,14 +1125,16 @@ void LogicManager::CONS_Ivo_FightCath(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Ivo_FightCath(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterIvo).characterPosition.location = 0;
 		getCharacter(kCharacterIvo).characterPosition.position = 540;
 		getCharacter(kCharacterIvo).characterPosition.car = 1;
 		getCharacter(kCharacterIvo).inventoryItem = 0;
 		getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall + 8] = 1;
 		IvoCall(&LogicManager::CONS_Ivo_SaveGame, 2, kEventCathIvoFight, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		if (getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall + 8] == 1) {
 			playDialog(0, "LIB090", -1, 0);
 			playNIS(kEventCathIvoFight);
@@ -991,6 +1150,10 @@ void LogicManager::HAND_Ivo_FightCath(HAND_PARAMS) {
 				CONS_Ivo_KnockedOut(0, 0, 0, 0);
 			}
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1014,10 +1177,13 @@ void LogicManager::HAND_Ivo_KnockedOut(HAND_PARAMS) {
 	case 18:
 		if (getCharacter(kCharacterIvo).callbacks[getCharacter(kCharacterIvo).currentCall + 8] == 1)
 			setDoor(94, kCharacterCath, 2, 255, 255);
+
 		break;
 	case 135800432:
 		CONS_Ivo_Disappear(0, 0, 0, 0);
 		break;
+	default:
+		break;
 	}
 }
 
@@ -1032,8 +1198,13 @@ void LogicManager::CONS_Ivo_Disappear(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Ivo_Disappear(HAND_PARAMS) {
-	if (msg->action == 12)
-		endGraphics(16);
+	switch (msg->action) {
+	case 12:
+		endGraphics(kCharacterIvo);
+		break;
+	default:
+		break;
+	}
 }
 
 void (LogicManager::*LogicManager::_functionsIvo[])(HAND_PARAMS) = {


Commit: 2e3622d3a1240eaa159b9b8ccc428c4c6c5e79f8
    https://github.com/scummvm/scummvm/commit/2e3622d3a1240eaa159b9b8ccc428c4c6c5e79f8
Author: AndywinXp (andywinxp at gmail.com)
Date: 2025-06-16T23:12:18+02:00

Commit Message:
LASTEXPRESS: Clean up Kronos logic

Changed paths:
    engines/lastexpress/characters/kronos.cpp


diff --git a/engines/lastexpress/characters/kronos.cpp b/engines/lastexpress/characters/kronos.cpp
index 33439e71d3a..befefe724ca 100644
--- a/engines/lastexpress/characters/kronos.cpp
+++ b/engines/lastexpress/characters/kronos.cpp
@@ -48,7 +48,7 @@ void LogicManager::CONS_Kronos(int chapter) {
 		CONS_Kronos_StartPart5(0, 0, 0, 0);
 		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -69,19 +69,25 @@ void LogicManager::CONS_Kronos_DebugWalks(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Kronos_DebugWalks(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			getCharacter(kCharacterKronos).characterPosition.position = 0;
-			getCharacter(kCharacterKronos).characterPosition.location = 0;
-			getCharacter(kCharacterKronos).characterPosition.car = kCarGreenSleeping;
-			getCharacterCurrentParams(kCharacterKronos)[0] = 10000;
-		}
-	} else if (walk(kCharacterKronos, kCarGreenSleeping, getCharacterCurrentParams(kCharacterKronos)[0])) {
-		if (getCharacterCurrentParams(kCharacterKronos)[0] == 10000) {
-			getCharacterCurrentParams(kCharacterKronos)[0] = 0;
-		} else {
-			getCharacterCurrentParams(kCharacterKronos)[0] = 10000;
+	switch (msg->action) {
+	case 0:
+		if (walk(kCharacterKronos, kCarGreenSleeping, getCharacterCurrentParams(kCharacterKronos)[0])) {
+			if (getCharacterCurrentParams(kCharacterKronos)[0] == 10000) {
+				getCharacterCurrentParams(kCharacterKronos)[0] = 0;
+			} else {
+				getCharacterCurrentParams(kCharacterKronos)[0] = 10000;
+			}
 		}
+
+		break;
+	case 12:
+		getCharacter(kCharacterKronos).characterPosition.position = 0;
+		getCharacter(kCharacterKronos).characterPosition.location = 0;
+		getCharacter(kCharacterKronos).characterPosition.car = kCarGreenSleeping;
+		getCharacterCurrentParams(kCharacterKronos)[0] = 10000;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -99,22 +105,25 @@ void LogicManager::CONS_Kronos_SaveGame(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Kronos_SaveGame(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			save(
-				kCharacterKronos,
-				getCharacterCurrentParams(kCharacterKronos)[0],
-				getCharacterCurrentParams(kCharacterKronos)[1]
-			);
+	switch (msg->action) {
+	case 0:
+		getCharacter(kCharacterKronos).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterKronos, _functionsKronos[getCharacter(kCharacterKronos).callbacks[getCharacter(kCharacterKronos).currentCall]]);
+		fedEx(kCharacterKronos, kCharacterKronos, 18, 0);
+		break;
+	case 12:
+		save(
+			kCharacterKronos,
+			getCharacterCurrentParams(kCharacterKronos)[0],
+			getCharacterCurrentParams(kCharacterKronos)[1]
+		);
 
-			getCharacter(kCharacterKronos).currentCall--;
-			_engine->getMessageManager()->setMessageHandle(kCharacterKronos, _functionsKronos[getCharacter(kCharacterKronos).callbacks[getCharacter(kCharacterKronos).currentCall]]);
-			fedEx(kCharacterKronos, kCharacterKronos, 18, 0);
-		}
-	} else {
 		getCharacter(kCharacterKronos).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterKronos, _functionsKronos[getCharacter(kCharacterKronos).callbacks[getCharacter(kCharacterKronos).currentCall]]);
 		fedEx(kCharacterKronos, kCharacterKronos, 18, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -132,16 +141,18 @@ void LogicManager::CONS_Kronos_DoWalk(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Kronos_DoWalk(HAND_PARAMS) {
-	if (msg->action == 0) {
-		if (!walk(kCharacterKronos, getCharacterCurrentParams(kCharacterKronos)[0], getCharacterCurrentParams(kCharacterKronos)[1]))
-			return;
-		goto LABEL_7;
-	}
-	if (msg->action == 12 && walk(kCharacterKronos, getCharacterCurrentParams(kCharacterKronos)[0], getCharacterCurrentParams(kCharacterKronos)[1])) {
-	LABEL_7:
-		getCharacter(kCharacterKronos).currentCall--;
-		_engine->getMessageManager()->setMessageHandle(kCharacterKronos, _functionsKronos[getCharacter(kCharacterKronos).callbacks[getCharacter(kCharacterKronos).currentCall]]);
-		fedEx(kCharacterKronos, kCharacterKronos, 18, 0);
+	switch (msg->action) {
+	case 0:
+	case 12:
+		if (walk(kCharacterKronos, getCharacterCurrentParams(kCharacterKronos)[0], getCharacterCurrentParams(kCharacterKronos)[1])) {
+			getCharacter(kCharacterKronos).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterKronos, _functionsKronos[getCharacter(kCharacterKronos).callbacks[getCharacter(kCharacterKronos).currentCall]]);
+			fedEx(kCharacterKronos, kCharacterKronos, 18, 0);
+		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -156,12 +167,17 @@ void LogicManager::CONS_Kronos_DoDialog(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Kronos_DoDialog(HAND_PARAMS) {
-	if (msg->action == 2) {
+	switch (msg->action) {
+	case 2:
 		getCharacter(kCharacterKronos).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterKronos, _functionsKronos[getCharacter(kCharacterKronos).callbacks[getCharacter(kCharacterKronos).currentCall]]);
 		fedEx(kCharacterKronos, kCharacterKronos, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		playDialog(kCharacterKronos, (char *)&getCharacterCurrentParams(kCharacterKronos)[0], -1, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -176,11 +192,12 @@ void LogicManager::CONS_Kronos_DoWait(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Kronos_DoWait(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		if (getCharacterCurrentParams(kCharacterKronos)[1] || (getCharacterCurrentParams(kCharacterKronos)[1] = _gameTime + getCharacterCurrentParams(kCharacterKronos)[0],
 															   _gameTime + getCharacterCurrentParams(kCharacterKronos)[0] != 0)) {
 			if (getCharacterCurrentParams(kCharacterKronos)[1] >= _gameTime)
-				return;
+				break;
 
 			getCharacterCurrentParams(kCharacterKronos)[1] = 0x7FFFFFFF;
 		}
@@ -188,6 +205,9 @@ void LogicManager::HAND_Kronos_DoWait(HAND_PARAMS) {
 		getCharacter(kCharacterKronos).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterKronos, _functionsKronos[getCharacter(kCharacterKronos).callbacks[getCharacter(kCharacterKronos).currentCall]]);
 		fedEx(kCharacterKronos, kCharacterKronos, 18, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -202,11 +222,12 @@ void LogicManager::CONS_Kronos_DoWaitReal(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Kronos_DoWaitReal(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		if (getCharacterCurrentParams(kCharacterKronos)[1] || (getCharacterCurrentParams(kCharacterKronos)[1] = _currentGameSessionTicks + getCharacterCurrentParams(kCharacterKronos)[0],
 															   _currentGameSessionTicks + getCharacterCurrentParams(kCharacterKronos)[0] != 0)) {
 			if (getCharacterCurrentParams(kCharacterKronos)[1] >= _currentGameSessionTicks)
-				return;
+				break;
 
 			getCharacterCurrentParams(kCharacterKronos)[1] = 0x7FFFFFFF;
 		}
@@ -214,6 +235,9 @@ void LogicManager::HAND_Kronos_DoWaitReal(HAND_PARAMS) {
 		getCharacter(kCharacterKronos).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterKronos, _functionsKronos[getCharacter(kCharacterKronos).callbacks[getCharacter(kCharacterKronos).currentCall]]);
 		fedEx(kCharacterKronos, kCharacterKronos, 18, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -228,16 +252,22 @@ void LogicManager::CONS_Kronos_Birth(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Kronos_Birth(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			getCharacter(kCharacterKronos).characterPosition.car = 2;
-			getCharacter(kCharacterKronos).characterPosition.position = 6000;
-			getCharacter(kCharacterKronos).characterPosition.location = 1;
-			setDoor(73, kCharacterCath, 1, 255, 255);
+	switch (msg->action) {
+	case 0:
+		if (_gameTime > 1062000 && !getCharacterCurrentParams(kCharacterKronos)[0]) {
+			getCharacterCurrentParams(kCharacterKronos)[0] = 1;
+			CONS_Kronos_AwaitingCath(0, 0, 0, 0);
 		}
-	} else if (_gameTime > 1062000 && !getCharacterCurrentParams(kCharacterKronos)[0]) {
-		getCharacterCurrentParams(kCharacterKronos)[0] = 1;
-		CONS_Kronos_AwaitingCath(0, 0, 0, 0);
+
+		break;
+	case 12:
+		getCharacter(kCharacterKronos).characterPosition.car = 2;
+		getCharacter(kCharacterKronos).characterPosition.position = 6000;
+		getCharacter(kCharacterKronos).characterPosition.location = 1;
+		setDoor(73, kCharacterCath, 1, 255, 255);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -257,24 +287,28 @@ void LogicManager::HAND_Kronos_AwaitingCath(HAND_PARAMS) {
 		if (_gameTime > 1489500 && !getCharacterCurrentParams(kCharacterKronos)[1]) {
 			getCharacterCurrentParams(kCharacterKronos)[1] = 1;
 			CONS_Kronos_PlayingAtNight(0, 0, 0, 0);
-			return;
+			break;
 		}
-		if (!getCharacterCurrentParams(kCharacterKronos)[0] || !checkLoc(kCharacterCath, kCarKronos))
-			return;
-		if (getCharacterCurrentParams(kCharacterKronos)[2] || (getCharacterCurrentParams(kCharacterKronos)[2] = _currentGameSessionTicks + 150,
-															   _currentGameSessionTicks != -150)) {
-			if (getCharacterCurrentParams(kCharacterKronos)[2] >= _currentGameSessionTicks)
-				return;
-			getCharacterCurrentParams(kCharacterKronos)[2] = 0x7FFFFFFF;
+
+		if (getCharacterCurrentParams(kCharacterKronos)[0] && checkLoc(kCharacterCath, kCarKronos)) {
+			if (getCharacterCurrentParams(kCharacterKronos)[2] || (getCharacterCurrentParams(kCharacterKronos)[2] = _currentGameSessionTicks + 150,
+																   _currentGameSessionTicks != -150)) {
+				if (getCharacterCurrentParams(kCharacterKronos)[2] >= _currentGameSessionTicks)
+					break;
+
+				getCharacterCurrentParams(kCharacterKronos)[2] = 0x7FFFFFFF;
+			}
+
+			CONS_Kronos_GreetCath(0, 0, 0, 0);
 		}
-	LABEL_16:
-		CONS_Kronos_GreetCath(0, 0, 0, 0);
-		return;
+
+		break;
 	case 171849314:
 		getCharacterCurrentParams(kCharacterKronos)[0] = 1;
 		return;
 	case 202621266:
-		goto LABEL_16;
+		CONS_Kronos_GreetCath(0, 0, 0, 0);
+		break;
 	}
 }
 
@@ -289,14 +323,22 @@ void LogicManager::CONS_Kronos_GreetCath(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Kronos_GreetCath(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterKronos).callbacks[getCharacter(kCharacterKronos).currentCall + 8] = 1;
 		KronosCall(&LogicManager::CONS_Kronos_SaveGame, 2, kEventKronosConversation, 0, 0);
-	} else if (msg->action == 18 && getCharacter(kCharacterKronos).callbacks[getCharacter(kCharacterKronos).currentCall + 8] == 1) {
-		playNIS(kEventKronosConversation);
-		bumpCath(kCarKronos, 87, 255);
-		send(kCharacterKronos, kCharacterKahina, 137685712, 0);
-		CONS_Kronos_CathDone(0, 0, 0, 0);
+		break;
+	case 18:
+		if (getCharacter(kCharacterKronos).callbacks[getCharacter(kCharacterKronos).currentCall + 8] == 1) {
+			playNIS(kEventKronosConversation);
+			bumpCath(kCarKronos, 87, 255);
+			send(kCharacterKronos, kCharacterKahina, 137685712, 0);
+			CONS_Kronos_CathDone(0, 0, 0, 0);
+		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -311,16 +353,22 @@ void LogicManager::CONS_Kronos_CathDone(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Kronos_CathDone(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			getCharacter(kCharacterKronos).characterPosition.car = kCarKronos;
-			getCharacter(kCharacterKronos).characterPosition.position = 6000;
-			getCharacter(kCharacterKronos).characterPosition.location = 0;
-			endGraphics(kCharacterKronos);
+	switch (msg->action) {
+	case 0:
+		if (_gameTime > 1489500 && !getCharacterCurrentParams(kCharacterKronos)[0]) {
+			getCharacterCurrentParams(kCharacterKronos)[0] = 1;
+			CONS_Kronos_PlayingAtNight(0, 0, 0, 0);
 		}
-	} else if (_gameTime > 1489500 && !getCharacterCurrentParams(kCharacterKronos)[0]) {
-		getCharacterCurrentParams(kCharacterKronos)[0] = 1;
-		CONS_Kronos_PlayingAtNight(0, 0, 0, 0);
+
+		break;
+	case 12:
+		getCharacter(kCharacterKronos).characterPosition.car = kCarKronos;
+		getCharacter(kCharacterKronos).characterPosition.position = 6000;
+		getCharacter(kCharacterKronos).characterPosition.location = 0;
+		endGraphics(kCharacterKronos);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -335,19 +383,24 @@ void LogicManager::CONS_Kronos_PlayingAtNight(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Kronos_PlayingAtNight(HAND_PARAMS) {
-	if (msg->action == 2) {
+	switch (msg->action) {
+	case 2:
 		getCharacterCurrentParams(kCharacterKronos)[0]++;
 		if ((getCharacterCurrentParams(kCharacterKronos)[0] & 1) == 0) {
 			playDialog(kCharacterKronos, "KRO1002", -1, 0);
-			return;
+		} else {
+			playDialog(kCharacterKronos, "KRO1001", -1, 0);
 		}
-		goto LABEL_7;
-	}
-	if (msg->action == 12) {
+
+		break;
+	case 12:
 		getCharacter(kCharacterKronos).characterPosition.position = 7000;
 		if (!whoRunningDialog(kCharacterKronos))
-		LABEL_7:
 			playDialog(kCharacterKronos, "KRO1001", -1, 0);
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -362,8 +415,13 @@ void LogicManager::CONS_Kronos_StartPart2(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Kronos_StartPart2(HAND_PARAMS) {
-	if (msg->action == 12)
+	switch (msg->action) {
+	case 12:
 		endGraphics(kCharacterKronos);
+		break;
+	default:
+		break;
+	}
 }
 
 void LogicManager::CONS_Kronos_StartPart3(CONS_PARAMS) {
@@ -377,18 +435,21 @@ void LogicManager::CONS_Kronos_StartPart3(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Kronos_StartPart3(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			endGraphics(kCharacterKronos);
-			getCharacter(kCharacterKronos).characterPosition.position = 6000;
-			getCharacter(kCharacterKronos).characterPosition.location = 0;
-			getCharacter(kCharacterKronos).characterPosition.car = 2;
-			getCharacter(kCharacterKronos).inventoryItem = 0;
-			getCharacter(kCharacterKronos).clothes = 0;
-			setDoor(73, 0, 0, 255, 255);
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		CONS_Kronos_InSeclusion(0, 0, 0, 0);
+		break;
+	case 12:
+		endGraphics(kCharacterKronos);
+		getCharacter(kCharacterKronos).characterPosition.position = 6000;
+		getCharacter(kCharacterKronos).characterPosition.location = 0;
+		getCharacter(kCharacterKronos).characterPosition.car = kCarKronos;
+		getCharacter(kCharacterKronos).inventoryItem = 0;
+		getCharacter(kCharacterKronos).clothes = 0;
+		setDoor(73, kCharacterCath, 0, 255, 255);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -403,22 +464,31 @@ void LogicManager::CONS_Kronos_InSeclusion(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Kronos_InSeclusion(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 157159392) {
-			switch (msg->sender) {
-			case kCharacterAnna:
-				getCharacterCurrentParams(kCharacterKronos)[0] = 1;
-				break;
-			case kCharacterTatiana:
-				getCharacterCurrentParams(kCharacterKronos)[1] = 1;
-				break;
-			case kCharacterAbbot:
-				getCharacterCurrentParams(kCharacterKronos)[2] = 1;
-				break;
-			}
+	switch (msg->action) {
+	case 0:
+		if (_gameTime > 1993500 && getCharacterCurrentParams(kCharacterKronos)[0] && getCharacterCurrentParams(kCharacterKronos)[1] && getCharacterCurrentParams(kCharacterKronos)[2]) {
+			CONS_Kronos_WBWait(0, 0, 0, 0);
 		}
-	} else if (_gameTime > 1993500 && getCharacterCurrentParams(kCharacterKronos)[0] && getCharacterCurrentParams(kCharacterKronos)[1] && getCharacterCurrentParams(kCharacterKronos)[2]) {
-		CONS_Kronos_WBWait(0, 0, 0, 0);
+
+		break;
+	case 157159392:
+		switch (msg->sender) {
+		case kCharacterAnna:
+			getCharacterCurrentParams(kCharacterKronos)[0] = 1;
+			break;
+		case kCharacterTatiana:
+			getCharacterCurrentParams(kCharacterKronos)[1] = 1;
+			break;
+		case kCharacterAbbot:
+			getCharacterCurrentParams(kCharacterKronos)[2] = 1;
+			break;
+		default:
+			break;
+		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -433,55 +503,77 @@ void LogicManager::CONS_Kronos_WBWait(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Kronos_WBWait(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		if (getCharacterCurrentParams(kCharacterKronos)[0] && !inSalon(kCharacterMonsieur)) {
 			if (!getCharacterCurrentParams(kCharacterKronos)[1]) {
 				getCharacterCurrentParams(kCharacterKronos)[1] = _currentGameSessionTicks + 75;
-				if (_currentGameSessionTicks == -75)
-					goto LABEL_22;
+				if (_currentGameSessionTicks == -75) {
+					CONS_Kronos_VisitSalon(0, 0, 0, 0);
+					break;
+				}
 			}
+
 			if (getCharacterCurrentParams(kCharacterKronos)[1] < _currentGameSessionTicks) {
 				getCharacterCurrentParams(kCharacterKronos)[1] = 0x7FFFFFFF;
-				goto LABEL_22;
+				CONS_Kronos_VisitSalon(0, 0, 0, 0);
+				break;
 			}
 		}
-		if (getCharacterCurrentParams(kCharacterKronos)[2] == 0x7FFFFFFF || _gameTime <= 2002500)
-			return;
-		if (_gameTime <= 2052000) {
-			if (!inSalon(kCharacterCath) || inSalon(kCharacterMonsieur) || !getCharacterCurrentParams(kCharacterKronos)[2]) {
-				getCharacterCurrentParams(kCharacterKronos)[2] = _gameTime + 900;
-				if (_gameTime == -900) {
-				LABEL_21:
-					if (!inSalon(kCharacterCath)) {
-						send(kCharacterKronos, kCharacterAnna, 101169422, 0);
-						send(kCharacterKronos, kCharacterTatiana, 101169422, 0);
-						send(kCharacterKronos, kCharacterAbbot, 101169422, 0);
-						CONS_Kronos_PreConcert(0, 0, 0, 0);
-						return;
+
+		if (getCharacterCurrentParams(kCharacterKronos)[2] != 0x7FFFFFFF && _gameTime > 2002500) {
+			if (_gameTime <= 2052000) {
+				if (!inSalon(kCharacterCath) || inSalon(kCharacterMonsieur) || !getCharacterCurrentParams(kCharacterKronos)[2]) {
+					getCharacterCurrentParams(kCharacterKronos)[2] = _gameTime + 900;
+					if (_gameTime == -900) {
+						if (!inSalon(kCharacterCath)) {
+							send(kCharacterKronos, kCharacterAnna, 101169422, 0);
+							send(kCharacterKronos, kCharacterTatiana, 101169422, 0);
+							send(kCharacterKronos, kCharacterAbbot, 101169422, 0);
+							CONS_Kronos_PreConcert(0, 0, 0, 0);
+							break;
+						}
+
+						CONS_Kronos_VisitSalon(0, 0, 0, 0);
+						break;
 					}
-					goto LABEL_22;
 				}
+
+				if (getCharacterCurrentParams(kCharacterKronos)[2] >= _gameTime)
+					break;
 			}
-			if (getCharacterCurrentParams(kCharacterKronos)[2] >= _gameTime)
-				return;
+
+			getCharacterCurrentParams(kCharacterKronos)[2] = 0x7FFFFFFF;
+			if (!inSalon(kCharacterCath)) {
+				send(kCharacterKronos, kCharacterAnna, 101169422, 0);
+				send(kCharacterKronos, kCharacterTatiana, 101169422, 0);
+				send(kCharacterKronos, kCharacterAbbot, 101169422, 0);
+				CONS_Kronos_PreConcert(0, 0, 0, 0);
+				break;
+			}
+
+			CONS_Kronos_VisitSalon(0, 0, 0, 0);
 		}
-		getCharacterCurrentParams(kCharacterKronos)[2] = 0x7FFFFFFF;
-		goto LABEL_21;
-	}
-	if (msg->action != 12) {
-		if (msg->action != 17)
-			return;
+
+		break;
+	case 12:
+		if (checkCathDir(kCarRestaurant, 60) || checkCathDir(kCarRestaurant, 59) || checkCathDir(kCarRestaurant, 83) || checkCathDir(kCarRestaurant, 81) || checkCathDir(kCarRestaurant, 87)) {
+			getCharacterCurrentParams(kCharacterKronos)[0] = 1;
+		}
+
+		break;
+	case 17:
 		if (!getCharacterCurrentParams(kCharacterKronos)[0] || !checkCathDir(kCarRestaurant, 51) || inSalon(kCharacterMonsieur)) {
 			getCharacterCurrentParams(kCharacterKronos)[0] = checkCathDir(kCarRestaurant, 60) || checkCathDir(kCarRestaurant, 59) || checkCathDir(kCarRestaurant, 83) || checkCathDir(kCarRestaurant, 81) || checkCathDir(kCarRestaurant, 87);
-			return;
+			break;
 		}
-	LABEL_22:
+
 		CONS_Kronos_VisitSalon(0, 0, 0, 0);
-		return;
-	}
-	if (checkCathDir(kCarRestaurant, 60) || checkCathDir(kCarRestaurant, 59) || checkCathDir(kCarRestaurant, 83) || checkCathDir(kCarRestaurant, 81) || checkCathDir(kCarRestaurant, 87)) {
-		getCharacterCurrentParams(kCharacterKronos)[0] = 1;
+		break;
+	default:
+		break;
 	}
+	
 }
 
 void LogicManager::CONS_Kronos_VisitSalon(CONS_PARAMS) {
@@ -495,16 +587,24 @@ void LogicManager::CONS_Kronos_VisitSalon(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Kronos_VisitSalon(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterKronos).callbacks[getCharacter(kCharacterKronos).currentCall + 8] = 1;
 		KronosCall(&LogicManager::CONS_Kronos_SaveGame, 2, kEventKronosVisit, 0, 0);
-	} else if (msg->action == 18 && getCharacter(kCharacterKronos).callbacks[getCharacter(kCharacterKronos).currentCall + 8] == 1) {
-		playNIS(kEventKronosVisit);
-		send(kCharacterKronos, kCharacterAnna, 101169422, 0);
-		send(kCharacterKronos, kCharacterTatiana, 101169422, 0);
-		send(kCharacterKronos, kCharacterAbbot, 101169422, 0);
-		bumpCath(kCarRestaurant, 60, 255);
-		CONS_Kronos_ReturnComp(0, 0, 0, 0);
+		break;
+	case 18:
+		if (getCharacter(kCharacterKronos).callbacks[getCharacter(kCharacterKronos).currentCall + 8] == 1) {
+			playNIS(kEventKronosVisit);
+			send(kCharacterKronos, kCharacterAnna, 101169422, 0);
+			send(kCharacterKronos, kCharacterTatiana, 101169422, 0);
+			send(kCharacterKronos, kCharacterAbbot, 101169422, 0);
+			bumpCath(kCarRestaurant, 60, 255);
+			CONS_Kronos_ReturnComp(0, 0, 0, 0);
+		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -519,14 +619,22 @@ void LogicManager::CONS_Kronos_ReturnComp(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Kronos_ReturnComp(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterKronos).characterPosition.position = 7500;
 		getCharacter(kCharacterKronos).characterPosition.location = 0;
 		getCharacter(kCharacterKronos).characterPosition.car = kCarRedSleeping;
 		getCharacter(kCharacterKronos).callbacks[getCharacter(kCharacterKronos).currentCall + 8] = 1;
 		KronosCall(&LogicManager::CONS_Kronos_DoWalk, 2, 9270, 0, 0);
-	} else if (msg->action == 18 && getCharacter(kCharacterKronos).callbacks[getCharacter(kCharacterKronos).currentCall + 8] == 1) {
-		CONS_Kronos_PreConcert(0, 0, 0, 0);
+		break;
+	case 18:
+		if (getCharacter(kCharacterKronos).callbacks[getCharacter(kCharacterKronos).currentCall + 8] == 1) {
+			CONS_Kronos_PreConcert(0, 0, 0, 0);
+		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -541,22 +649,15 @@ void LogicManager::CONS_Kronos_PreConcert(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Kronos_PreConcert(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			getCharacter(kCharacterKronos).characterPosition.position = 6000;
-			getCharacter(kCharacterKronos).characterPosition.location = 0;
-			getCharacter(kCharacterKronos).characterPosition.car = kCarKronos;
-		} else if (msg->action == 18 && getCharacter(kCharacterKronos).callbacks[getCharacter(kCharacterKronos).currentCall + 8] == 1) {
-			playNIS(kEventKahinaPunchSuite4);
-			endGame(3, 253, 0, 1);
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		if (_gameTime > 2079000 && !getCharacterCurrentParams(kCharacterKronos)[1]) {
 			getCharacterCurrentParams(kCharacterKronos)[1] = 1;
 			setModel(75, 3);
 			setDoor(75, kCharacterCath, 3, 10, 9);
 			getCharacterCurrentParams(kCharacterKronos)[0] = 1;
 		}
+
 		if (_gameTime <= 2106000 || getCharacterCurrentParams(kCharacterKronos)[2]) {
 			if (getCharacterCurrentParams(kCharacterKronos)[0] && inInnerSanctum(kCharacterCath)) {
 				getCharacter(kCharacterKronos).callbacks[getCharacter(kCharacterKronos).currentCall + 8] = 1;
@@ -566,6 +667,22 @@ void LogicManager::HAND_Kronos_PreConcert(HAND_PARAMS) {
 			getCharacterCurrentParams(kCharacterKronos)[2] = 1;
 			CONS_Kronos_StartConcert(0, 0, 0, 0);
 		}
+
+		break;
+	case 12:
+		getCharacter(kCharacterKronos).characterPosition.position = 6000;
+		getCharacter(kCharacterKronos).characterPosition.location = 0;
+		getCharacter(kCharacterKronos).characterPosition.car = kCarKronos;
+		break;
+	case 18:
+		if (getCharacter(kCharacterKronos).callbacks[getCharacter(kCharacterKronos).currentCall + 8] == 1) {
+			playNIS(kEventKahinaPunchSuite4);
+			endGame(3, 253, 0, true);
+		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -592,6 +709,7 @@ void LogicManager::HAND_Kronos_StartConcert(HAND_PARAMS) {
 			playDialog(kCharacterKronos, "1917.lnk", -1, 0);
 			CONS_Kronos_Concert(0, 0, 0, 0);
 		}
+
 		break;
 	case 12:
 		setDoor(75, kCharacterCath, 1, 0, 0);
@@ -602,11 +720,12 @@ void LogicManager::HAND_Kronos_StartConcert(HAND_PARAMS) {
 			getCharacter(kCharacterKronos).callbacks[getCharacter(kCharacterKronos).currentCall + 8] = 2;
 			KronosCall(&LogicManager::CONS_Kronos_SaveGame, 2, kEventConcertStart, 0, 0);
 		}
+
 		break;
 	case 18:
 		if (getCharacter(kCharacterKronos).callbacks[getCharacter(kCharacterKronos).currentCall + 8] == 1) {
 			playNIS(kEventKahinaPunchSuite4);
-			endGame(3, 253, 0, 1);
+			endGame(3, 253, 0, true);
 		} else if (getCharacter(kCharacterKronos).callbacks[getCharacter(kCharacterKronos).currentCall + 8] == 2) {
 			playNIS(kEventConcertStart);
 			claimNISLink(kCharacterKronos);
@@ -618,9 +737,10 @@ void LogicManager::HAND_Kronos_StartConcert(HAND_PARAMS) {
 			forceJump(kCharacterTatiana, &LogicManager::CONS_Tatiana_Concert);
 			CONS_Kronos_Concert(0, 0, 0, 0);
 		}
+
 		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -638,40 +758,36 @@ void LogicManager::HAND_Kronos_Concert(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
 		getCharacterCurrentParams(kCharacterKronos)[4] = getSoundTicks(kCharacterKronos);
-		if (getCharacterCurrentParams(kCharacterKronos)[5] >= 54)
-			goto LABEL_21;
-
-		if (_concertPhasesTicks[getCharacterCurrentParams(kCharacterKronos)[5]] >= getCharacterCurrentParams(kCharacterKronos)[4])
-			goto LABEL_21;
-
-		startCycOtis(kCharacterKronos, _concertPhases[getCharacterCurrentParams(kCharacterKronos)[5]]);
-		if (!scumm_stricmp(_concertPhases[getCharacterCurrentParams(kCharacterKronos)[5]], "201e")) {
-			if (checkCathDir(kCarKronos, 85) || checkCathDir(kCarKronos, 86))
-				bumpCath(kCarKronos, 83, 255);
-			blockView(kCharacterKronos, kCarKronos, 85);
-			blockView(kCharacterKronos, kCarKronos, 86);
-			goto LABEL_20;
-		}
-		if (!scumm_stricmp(_concertPhases[getCharacterCurrentParams(kCharacterKronos)[5]], "201c")) {
-			if (checkCathDir(kCarKronos, 85))
-				bumpCath(kCarKronos, 83, 255);
-			blockView(kCharacterKronos, kCarKronos, 85);
-			goto LABEL_19;
-		}
-		if (scumm_stricmp(_concertPhases[getCharacterCurrentParams(kCharacterKronos)[5]], "201d")) {
-			releaseView(kCharacterKronos, kCarKronos, 85);
-		LABEL_19:
-			releaseView(kCharacterKronos, kCarKronos, 86);
-			goto LABEL_20;
+
+		if ((getCharacterCurrentParams(kCharacterKronos)[5] < 54) && (_concertPhasesTicks[getCharacterCurrentParams(kCharacterKronos)[5]] < getCharacterCurrentParams(kCharacterKronos)[4])) {
+			startCycOtis(kCharacterKronos, _concertPhases[getCharacterCurrentParams(kCharacterKronos)[5]]);
+			if (!scumm_stricmp(_concertPhases[getCharacterCurrentParams(kCharacterKronos)[5]], "201e")) {
+				if (checkCathDir(kCarKronos, 85) || checkCathDir(kCarKronos, 86))
+					bumpCath(kCarKronos, 83, 255);
+
+				blockView(kCharacterKronos, kCarKronos, 85);
+				blockView(kCharacterKronos, kCarKronos, 86);
+			} else {
+				if (!scumm_stricmp(_concertPhases[getCharacterCurrentParams(kCharacterKronos)[5]], "201c")) {
+					if (checkCathDir(kCarKronos, 85))
+						bumpCath(kCarKronos, 83, 255);
+					blockView(kCharacterKronos, kCarKronos, 85);
+					releaseView(kCharacterKronos, kCarKronos, 86);
+				} else if (scumm_stricmp(_concertPhases[getCharacterCurrentParams(kCharacterKronos)[5]], "201d")) {
+					releaseView(kCharacterKronos, kCarKronos, 85);
+					releaseView(kCharacterKronos, kCarKronos, 86);
+				} else {
+					if (checkCathDir(kCarKronos, 86))
+						bumpCath(kCarKronos, 83, 255);
+
+					blockView(kCharacterKronos, kCarKronos, 86);
+					releaseView(kCharacterKronos, kCarKronos, 85);
+				}
+			}
+
+			getCharacterCurrentParams(kCharacterKronos)[5]++;
 		}
-		if (checkCathDir(kCarKronos, 86))
-			bumpCath(kCarKronos, 83, 255);
-		blockView(kCharacterKronos, kCarKronos, 86);
-		releaseView(kCharacterKronos, kCarKronos, 85);
-	LABEL_20:
-		getCharacterCurrentParams(kCharacterKronos)[5]++;
 
-	LABEL_21:
 		if (cathHasItem(kItemBriefcase))
 			setDoor(76, kCharacterKronos, 0, 0, 9);
 		else
@@ -682,22 +798,29 @@ void LogicManager::HAND_Kronos_Concert(HAND_PARAMS) {
 			getCharacterCurrentParams(kCharacterKronos)[7] = _gameTime + 13500;
 		}
 
-		if (getCharacterCurrentParams(kCharacterKronos)[9] == 0x7FFFFFFF || getCharacterCurrentParams(kCharacterKronos)[6] >= _gameTime)
-			goto LABEL_35;
-		if (getCharacterCurrentParams(kCharacterKronos)[7] < _gameTime)
-			goto LABEL_33;
-		if (!getCharacterCurrentParams(kCharacterKronos)[0] || !getCharacterCurrentParams(kCharacterKronos)[9]) {
-			getCharacterCurrentParams(kCharacterKronos)[9] = _gameTime + 450;
-			if (_gameTime == -450)
-				goto LABEL_34;
-		}
-		if (getCharacterCurrentParams(kCharacterKronos)[9] < _gameTime) {
-		LABEL_33:
-			getCharacterCurrentParams(kCharacterKronos)[9] = 0x7FFFFFFF;
-		LABEL_34:
-			send(kCharacterKronos, kCharacterKahina, 237555748, 0);
+		if (getCharacterCurrentParams(kCharacterKronos)[9] != 0x7FFFFFFF && getCharacterCurrentParams(kCharacterKronos)[6] < _gameTime) {
+			if (getCharacterCurrentParams(kCharacterKronos)[7] < _gameTime) {
+				getCharacterCurrentParams(kCharacterKronos)[9] = 0x7FFFFFFF;
+				send(kCharacterKronos, kCharacterKahina, 237555748, 0);
+			} else {
+				bool skip = false;
+
+				if (!getCharacterCurrentParams(kCharacterKronos)[0] || !getCharacterCurrentParams(kCharacterKronos)[9]) {
+					getCharacterCurrentParams(kCharacterKronos)[9] = _gameTime + 450;
+
+					if (_gameTime == -450) {
+						skip = true;
+						send(kCharacterKronos, kCharacterKahina, 237555748, 0);
+					}
+				}
+
+				if (!skip && getCharacterCurrentParams(kCharacterKronos)[9] < _gameTime) {
+					getCharacterCurrentParams(kCharacterKronos)[9] = 0x7FFFFFFF;
+					send(kCharacterKronos, kCharacterKahina, 237555748, 0);
+				}
+			}
 		}
-	LABEL_35:
+
 		if (!getCharacterCurrentParams(kCharacterKronos)[0])
 			getCharacterCurrentParams(kCharacterKronos)[1] = getCharacterCurrentParams(kCharacterKronos)[2];
 
@@ -721,20 +844,27 @@ void LogicManager::HAND_Kronos_Concert(HAND_PARAMS) {
 			case 3:
 				playNIS(kEventCathFallingAsleep);
 				fadeToBlack();
+
 				while (dialogRunning("1919.LNK"))
 					_engine->getSoundManager()->soundThread();
+
 				playNIS(kEventCathWakingUp);
 				cleanNIS();
 				getCharacterCurrentParams(kCharacterKronos)[2] = 162000;
 				break;
+			default:
+				break;
 			}
+
 			getCharacterCurrentParams(kCharacterKronos)[1] = getCharacterCurrentParams(kCharacterKronos)[2];
 		}
+
 		if ((getCharacterCurrentParams(kCharacterKronos)[4] > 23400 || getCharacterCurrentParams(kCharacterKronos)[8]) && inInnerSanctum(kCharacterCath)) {
 			getCharacter(kCharacterKronos).callbacks[getCharacter(kCharacterKronos).currentCall + 8] = 1;
 			KronosCall(&LogicManager::CONS_Kronos_SaveGame, 2, kEventKahinaWrongDoor, 0, 0);
 		}
-		return;
+
+		break;
 	case 2:
 		setDoor(75, kCharacterCath, 3, 10, 9);
 		if (getCharacterCurrentParams(kCharacterKronos)[8]) {
@@ -751,40 +881,47 @@ void LogicManager::HAND_Kronos_Concert(HAND_PARAMS) {
 		} else {
 			CONS_Kronos_AfterConcert(0, 0, 0, 0);
 		}
-		return;
+
+		break;
 	case 9:
 		getCharacter(kCharacterKronos).callbacks[getCharacter(kCharacterKronos).currentCall + 8] = 2;
 		KronosCall(&LogicManager::CONS_Kronos_SaveGame, 2, kEventConcertLeaveWithBriefcase, 0, 0);
-		return;
+		break;
 	case 12:
 		_gameTime = 2115000;
 		_gameTimeTicksDelta = 3;
+
 		if (checkCathDir(kCarKronos, 88) || checkCathDir(kCarKronos, 84) || checkCathDir(kCarKronos, 85) || checkCathDir(kCarKronos, 86) || checkCathDir(kCarKronos, 83)) {
 			getCharacterCurrentParams(kCharacterKronos)[0] = 1;
 		}
+
 		if (cathHasItem(kItemFirebird))
 			setDoor(75, kCharacterCath, 0, 0, 0);
 		else
 			setDoor(75, kCharacterCath, 0, 10, 9);
+
 		setDoor(76, kCharacterKronos, 0, 10, 9);
 		_gameProgress[kProgressField40] = 1;
 		startCycOtis(kCharacterKronos, "201a");
 		getCharacterCurrentParams(kCharacterKronos)[2] = 2700;
 		getCharacterCurrentParams(kCharacterKronos)[1] = 2700;
-		return;
+		break;
 	case 17:
 		getCharacterCurrentParams(kCharacterKronos)[0] = checkCathDir(kCarKronos, 88) || checkCathDir(kCarKronos, 84) || checkCathDir(kCarKronos, 85) || checkCathDir(kCarKronos, 86) || checkCathDir(kCarKronos, 83);
 		if (cathHasItem(kItemFirebird))
 			setDoor(75, kCharacterCath, 3, 0, 0);
 		else
 			setDoor(75, kCharacterCath, 0, 10, 9);
-		return;
+
+		break;
 	case 18:
 		switch (getCharacter(kCharacterKronos).callbacks[getCharacter(kCharacterKronos).currentCall + 8]) {
 		case 1:
 			playNIS(kEventKahinaWrongDoor);
+
 			if (cathHasItem(kItemBriefcase))
 				takeCathItem(kItemBriefcase);
+
 			playDialog(0, "BUMP", -1, 0);
 			bumpCath(kCarKronos, 81, 255);
 			setDoor(75, kCharacterCath, 3, 0, 0);
@@ -802,10 +939,13 @@ void LogicManager::HAND_Kronos_Concert(HAND_PARAMS) {
 			bumpCath(kCarGreenSleeping, 26, 255);
 			CONS_Kronos_AfterConcert(0, 0, 0, 0);
 			break;
+		default:
+			break;
 		}
-		return;
+
+		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -820,35 +960,42 @@ void LogicManager::CONS_Kronos_AfterConcert(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Kronos_AfterConcert(HAND_PARAMS) {
-	if (msg->action <= 12) {
-		if (msg->action != 12) {
-			if (msg->action == 0 && inInnerSanctum(kCharacterCath)) {
-				getCharacter(kCharacterKronos).callbacks[getCharacter(kCharacterKronos).currentCall + 8] = 1;
-				KronosCall(&LogicManager::CONS_Kronos_SaveGame, 2, kEventKahinaWrongDoor, 0, 0);
-			}
-			return;
+	switch (msg->action) {
+	case 0:
+		if (inInnerSanctum(kCharacterCath)) {
+			getCharacter(kCharacterKronos).callbacks[getCharacter(kCharacterKronos).currentCall + 8] = 1;
+			KronosCall(&LogicManager::CONS_Kronos_SaveGame, 2, kEventKahinaWrongDoor, 0, 0);
 		}
+
+		break;
+	case 12:
 		_gameProgress[kProgressField40] = 0;
 		setDoor(75, kCharacterCath, 3, 0, 0);
 		send(kCharacterKronos, kCharacterRebecca, 191668032, 0);
+
 		if (_gameEvents[kEventConcertLeaveWithBriefcase])
-			return;
-	LABEL_16:
+			break;
+
 		CONS_Kronos_AwaitingCath3(0, 0, 0, 0);
-		return;
-	}
-	if (msg->action != 18) {
-		if (msg->action != 235599361)
-			return;
-		goto LABEL_16;
-	}
-	if (getCharacter(kCharacterKronos).callbacks[getCharacter(kCharacterKronos).currentCall + 8] == 1) {
-		playNIS(kEventKahinaWrongDoor);
-		if (cathHasItem(kItemBriefcase))
-			takeCathItem(kItemBriefcase);
-		playDialog(0, "BUMP", -1, 0);
-		bumpCath(kCarKronos, 81, 255);
-		playDialog(0, "lib015", -1, 0);
+		break;
+	case 18:
+		if (getCharacter(kCharacterKronos).callbacks[getCharacter(kCharacterKronos).currentCall + 8] == 1) {
+			playNIS(kEventKahinaWrongDoor);
+
+			if (cathHasItem(kItemBriefcase))
+				takeCathItem(kItemBriefcase);
+
+			playDialog(0, "BUMP", -1, 0);
+			bumpCath(kCarKronos, 81, 255);
+			playDialog(0, "lib015", -1, 0);
+		}
+
+		break;
+	case 235599361:
+		CONS_Kronos_AwaitingCath3(0, 0, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -863,66 +1010,28 @@ void LogicManager::CONS_Kronos_AwaitingCath3(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Kronos_AwaitingCath3(HAND_PARAMS) {
-	if (msg->action > 9) {
-		switch (msg->action) {
-		case 12:
-			setDoor(75, kCharacterKronos, 3, 10, 9);
-			break;
-		case 18:
-			switch (getCharacter(kCharacterKronos).callbacks[getCharacter(kCharacterKronos).currentCall + 8]) {
-			case 1:
-				playNIS(kEventKronosReturnBriefcase);
-				bumpCath(kCarKronos, 87, 255);
-				takeCathItem(kItemBriefcase);
-				takeCathItem(kItemScarf);
-				CONS_Kronos_Finished(0, 0, 0, 0);
-				break;
-			case 2:
-				playNIS(kEventKronosBringEggCeiling);
-				bumpCath(kCarKronos, 87, 255);
-				takeCathItem(kItemFirebird);
-				_gameInventory[kItemFirebird].location = 5;
-				CONS_Kronos_Finished(0, 0, 0, 0);
-				break;
-			case 3:
-				takeCathItem(kItemFirebird);
-				_gameInventory[kItemFirebird].location = 5;
-				playNIS(kEventKronosBringEgg);
-				bumpCath(kCarKronos, 87, 255);
-				giveCathItem(kItemBriefcase);
-				CONS_Kronos_Finished(0, 0, 0, 0);
-				break;
-			case 4:
-				playNIS(kEventKronosBringNothing);
-				endGame(0, 1, 0, 1);
-				break;
-			case 5:
-				playNIS(kEventKahinaPunchSuite4);
-				endGame(0, 1, 0, 1);
-				break;
-			case 6:
-				playNIS(kEventKahinaWrongDoor);
-				if (cathHasItem(kItemBriefcase))
-					takeCathItem(kItemBriefcase);
-				playDialog(0, "BUMP", -1, 0);
-				bumpCath(kCarKronos, 81, 255);
-				playDialog(0, "lib015", -1, 0);
-				break;
-			default:
-				return;
+	switch (msg->action) {
+	case 0:
+		if (inInnerSanctum(kCharacterCath)) {
+			if (_gameProgress[kProgressField44]) {
+				getCharacter(kCharacterKronos).callbacks[getCharacter(kCharacterKronos).currentCall + 8] = 5;
+				KronosCall(&LogicManager::CONS_Kronos_SaveGame, 2, kEventKahinaPunchBaggageCarEntrance, 0, 0);
+			} else {
+				getCharacter(kCharacterKronos).callbacks[getCharacter(kCharacterKronos).currentCall + 8] = 6;
+				KronosCall(&LogicManager::CONS_Kronos_SaveGame, 2, kEventKahinaWrongDoor, 0, 0);
 			}
-			break;
-		case 138085344:
-			CONS_Kronos_Finished(0, 0, 0, 0);
-			break;
 		}
-	} else if (msg->action >= 8) {
+
+		break;
+	case 8:
+	case 9:
 		if (msg->action == 8) {
 			if (!cathRunningDialog("LIB012"))
 				playDialog(0, "LIB012", -1, 0);
 		} else if (!cathRunningDialog("LIB013")) {
 			playDialog(0, "LIB013", -1, 0);
 		}
+
 		if (_gameEvents[kEventConcertLeaveWithBriefcase])
 			fedEx(kCharacterKronos, kCharacterKahina, 137503360, 0);
 		if (cathHasItem(kItemBriefcase)) {
@@ -938,14 +1047,61 @@ void LogicManager::HAND_Kronos_AwaitingCath3(HAND_PARAMS) {
 			getCharacter(kCharacterKronos).callbacks[getCharacter(kCharacterKronos).currentCall + 8] = 4;
 			KronosCall(&LogicManager::CONS_Kronos_SaveGame, 2, kEventKronosBringNothing, 0, 0);
 		}
-	} else if (msg->action == 0 && inInnerSanctum(kCharacterCath)) {
-		if (_gameProgress[kProgressField44]) {
-			getCharacter(kCharacterKronos).callbacks[getCharacter(kCharacterKronos).currentCall + 8] = 5;
-			KronosCall(&LogicManager::CONS_Kronos_SaveGame, 2, kEventKahinaPunchBaggageCarEntrance, 0, 0);
-		} else {
-			getCharacter(kCharacterKronos).callbacks[getCharacter(kCharacterKronos).currentCall + 8] = 6;
-			KronosCall(&LogicManager::CONS_Kronos_SaveGame, 2, kEventKahinaWrongDoor, 0, 0);
+
+		break;
+	case 12:
+		setDoor(75, kCharacterKronos, 3, 10, 9);
+		break;
+	case 18:
+		switch (getCharacter(kCharacterKronos).callbacks[getCharacter(kCharacterKronos).currentCall + 8]) {
+		case 1:
+			playNIS(kEventKronosReturnBriefcase);
+			bumpCath(kCarKronos, 87, 255);
+			takeCathItem(kItemBriefcase);
+			takeCathItem(kItemScarf);
+			CONS_Kronos_Finished(0, 0, 0, 0);
+			break;
+		case 2:
+			playNIS(kEventKronosBringEggCeiling);
+			bumpCath(kCarKronos, 87, 255);
+			takeCathItem(kItemFirebird);
+			_gameInventory[kItemFirebird].location = 5;
+			CONS_Kronos_Finished(0, 0, 0, 0);
+			break;
+		case 3:
+			takeCathItem(kItemFirebird);
+			_gameInventory[kItemFirebird].location = 5;
+			playNIS(kEventKronosBringEgg);
+			bumpCath(kCarKronos, 87, 255);
+			giveCathItem(kItemBriefcase);
+			CONS_Kronos_Finished(0, 0, 0, 0);
+			break;
+		case 4:
+			playNIS(kEventKronosBringNothing);
+			endGame(0, 1, 0, true);
+			break;
+		case 5:
+			playNIS(kEventKahinaPunchSuite4);
+			endGame(0, 1, 0, true);
+			break;
+		case 6:
+			playNIS(kEventKahinaWrongDoor);
+			if (cathHasItem(kItemBriefcase))
+				takeCathItem(kItemBriefcase);
+			playDialog(0, "BUMP", -1, 0);
+			bumpCath(kCarKronos, 81, 255);
+			playDialog(0, "lib015", -1, 0);
+			break;
+		default:
+			break;
 		}
+
+		break;
+	case 138085344:
+		CONS_Kronos_Finished(0, 0, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -960,10 +1116,19 @@ void LogicManager::CONS_Kronos_Finished(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Kronos_Finished(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			setDoor(75, kCharacterCath, 3, 10, 9);
-		} else if (msg->action == 18 && getCharacter(kCharacterKronos).callbacks[getCharacter(kCharacterKronos).currentCall + 8] == 1) {
+	switch (msg->action) {
+	case 0:
+		if (inInnerSanctum(kCharacterCath)) {
+			getCharacter(kCharacterKronos).callbacks[getCharacter(kCharacterKronos).currentCall + 8] = 1;
+			KronosCall(&LogicManager::CONS_Kronos_SaveGame, 2, kEventKahinaWrongDoor, 0, 0);
+		}
+
+		break;
+	case 12:
+		setDoor(75, kCharacterCath, 3, 10, 9);
+		break;
+	case 18:
+		if (getCharacter(kCharacterKronos).callbacks[getCharacter(kCharacterKronos).currentCall + 8] == 1) {
 			playNIS(kEventKahinaWrongDoor);
 			if (cathHasItem(kItemBriefcase))
 				takeCathItem(kItemBriefcase);
@@ -971,10 +1136,11 @@ void LogicManager::HAND_Kronos_Finished(HAND_PARAMS) {
 			bumpCath(kCarKronos, 81, 255);
 			playDialog(0, "lib015", -1, 0);
 		}
-	} else if (inInnerSanctum(kCharacterCath)) {
-		getCharacter(kCharacterKronos).callbacks[getCharacter(kCharacterKronos).currentCall + 8] = 1;
-		KronosCall(&LogicManager::CONS_Kronos_SaveGame, 2, kEventKahinaWrongDoor, 0, 0);
-	}
+
+		break;
+	default:
+		break;
+	} 
 }
 
 void LogicManager::CONS_Kronos_StartPart4(CONS_PARAMS) {
@@ -988,8 +1154,13 @@ void LogicManager::CONS_Kronos_StartPart4(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Kronos_StartPart4(HAND_PARAMS) {
-	if (msg->action == 12)
-		endGraphics(18);
+	switch (msg->action) {
+	case 12:
+		endGraphics(kCharacterKronos);
+		break;
+	default:
+		break;
+	}
 }
 
 void LogicManager::CONS_Kronos_StartPart5(CONS_PARAMS) {
@@ -1003,8 +1174,13 @@ void LogicManager::CONS_Kronos_StartPart5(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Kronos_StartPart5(HAND_PARAMS) {
-	if (msg->action == 12)
-		endGraphics(18);
+	switch (msg->action) {
+	case 12:
+		endGraphics(kCharacterKronos);
+		break;
+	default:
+		break;
+	}
 }
 
 void (LogicManager::*LogicManager::_functionsKronos[])(HAND_PARAMS) = {


Commit: 9af209d4180275bd06cd26d67980ba2a751e80aa
    https://github.com/scummvm/scummvm/commit/9af209d4180275bd06cd26d67980ba2a751e80aa
Author: AndywinXp (andywinxp at gmail.com)
Date: 2025-06-16T23:12:18+02:00

Commit Message:
LASTEXPRESS: Clean up Mahmud logic

Changed paths:
    engines/lastexpress/characters/mahmud.cpp


diff --git a/engines/lastexpress/characters/mahmud.cpp b/engines/lastexpress/characters/mahmud.cpp
index a6e0c5171ec..501a6768b90 100644
--- a/engines/lastexpress/characters/mahmud.cpp
+++ b/engines/lastexpress/characters/mahmud.cpp
@@ -47,7 +47,7 @@ void LogicManager::CONS_Mahmud(int chapter) {
 		CONS_Mahmud_StartPart5(0, 0, 0, 0);
 		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -68,19 +68,26 @@ void LogicManager::CONS_Mahmud_DebugWalks(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Mahmud_DebugWalks(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			getCharacter(kCharacterMahmud).characterPosition.position = 0;
-			getCharacter(kCharacterMahmud).characterPosition.location = 0;
-			getCharacter(kCharacterMahmud).characterPosition.car = kCarGreenSleeping;
-			getCharacterCurrentParams(kCharacterMahmud)[0] = 10000;
-		}
-	} else if (walk(kCharacterMahmud, kCarGreenSleeping, getCharacterCurrentParams(kCharacterMahmud)[0])) {
-		if (getCharacterCurrentParams(kCharacterMahmud)[0] == 10000) {
-			getCharacterCurrentParams(kCharacterMahmud)[0] = 0;
-		} else {
-			getCharacterCurrentParams(kCharacterMahmud)[0] = 10000;
+	switch (msg->action) {
+	case 0:
+		if (walk(kCharacterMahmud, kCarGreenSleeping, getCharacterCurrentParams(kCharacterMahmud)[0])) {
+			if (getCharacterCurrentParams(kCharacterMahmud)[0] == 10000) {
+				getCharacterCurrentParams(kCharacterMahmud)[0] = 0;
+			} else {
+				getCharacterCurrentParams(kCharacterMahmud)[0] = 10000;
+			}
 		}
+
+		break;
+	case 12:
+		getCharacter(kCharacterMahmud).characterPosition.position = 0;
+		getCharacter(kCharacterMahmud).characterPosition.location = 0;
+		getCharacter(kCharacterMahmud).characterPosition.car = kCarGreenSleeping;
+		getCharacterCurrentParams(kCharacterMahmud)[0] = 10000;
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -97,12 +104,17 @@ void LogicManager::CONS_Mahmud_DoSeqOtis(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Mahmud_DoSeqOtis(HAND_PARAMS) {
-	if (msg->action == 3) {
+	switch (msg->action) {
+	case 3:
 		getCharacter(kCharacterMahmud).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterMahmud, _functionsMahmud[getCharacter(kCharacterMahmud).callbacks[getCharacter(kCharacterMahmud).currentCall]]);
 		fedEx(kCharacterMahmud, kCharacterMahmud, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		startSeqOtis(kCharacterMahmud, (char *)&getCharacterCurrentParams(kCharacterMahmud));
+		break;
+	default:
+		break;
 	}
 }
 
@@ -121,14 +133,19 @@ void LogicManager::CONS_Mahmud_DoCorrOtis(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Mahmud_DoCorrOtis(HAND_PARAMS) {
-	if (msg->action == 3) {
+	switch (msg->action) {
+	case 3:
 		releaseAtDoor(kCharacterMahmud, getCharacterCurrentParams(kCharacterMahmud)[3]);
 		getCharacter(kCharacterMahmud).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterMahmud, _functionsMahmud[getCharacter(kCharacterMahmud).callbacks[getCharacter(kCharacterMahmud).currentCall]]);
 		fedEx(kCharacterMahmud, kCharacterMahmud, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		startSeqOtis(kCharacterMahmud, (char *)&getCharacter(kCharacterMahmud).callParams[getCharacter(kCharacterMahmud).currentCall]);
 		blockAtDoor(kCharacterMahmud, getCharacterCurrentParams(kCharacterMahmud)[3]);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -149,27 +166,32 @@ void LogicManager::CONS_Mahmud_DoBumpCorrOtis(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Mahmud_DoBumpCorrOtis(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 3) {
-			releaseAtDoor(kCharacterMahmud, getCharacterCurrentParams(kCharacterMahmud)[3]);
-			getCharacter(kCharacterMahmud).currentCall--;
-			_engine->getMessageManager()->setMessageHandle(kCharacterMahmud, _functionsMahmud[getCharacter(kCharacterMahmud).callbacks[getCharacter(kCharacterMahmud).currentCall]]);
-			fedEx(kCharacterMahmud, kCharacterMahmud, 18, 0);
-		} else if (msg->action == 12) {
-			startSeqOtis(kCharacterMahmud, (char *)&getCharacter(kCharacterMahmud).callParams[getCharacter(kCharacterMahmud).currentCall]);
-			blockAtDoor(kCharacterMahmud, getCharacterCurrentParams(kCharacterMahmud)[3]);
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		if (getCharacterCurrentParams(kCharacterMahmud)[6] ||
 			(getCharacterCurrentParams(kCharacterMahmud)[6] = _currentGameSessionTicks + getCharacterCurrentParams(kCharacterMahmud)[4], _currentGameSessionTicks + getCharacterCurrentParams(kCharacterMahmud)[4] != 0)) {
 			if (getCharacterCurrentParams(kCharacterMahmud)[6] >= _currentGameSessionTicks)
-				return;
+				break;
 
 			getCharacterCurrentParams(kCharacterMahmud)[6] = 0x7FFFFFFF;
 		}
 
 		if (!cathFacingUp())
 			bumpCathFDoor(getCharacterCurrentParams(kCharacterMahmud)[5]);
+
+		break;
+	case 3:
+		releaseAtDoor(kCharacterMahmud, getCharacterCurrentParams(kCharacterMahmud)[3]);
+		getCharacter(kCharacterMahmud).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterMahmud, _functionsMahmud[getCharacter(kCharacterMahmud).callbacks[getCharacter(kCharacterMahmud).currentCall]]);
+		fedEx(kCharacterMahmud, kCharacterMahmud, 18, 0);
+		break;
+	case 12:
+		startSeqOtis(kCharacterMahmud, (char *)&getCharacter(kCharacterMahmud).callParams[getCharacter(kCharacterMahmud).currentCall]);
+		blockAtDoor(kCharacterMahmud, getCharacterCurrentParams(kCharacterMahmud)[3]);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -186,12 +208,17 @@ void LogicManager::CONS_Mahmud_DoDialog(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Mahmud_DoDialog(HAND_PARAMS) {
-	if (msg->action == 2) {
+	switch (msg->action) {
+	case 2:
 		getCharacter(kCharacterMahmud).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterMahmud, _functionsMahmud[getCharacter(kCharacterMahmud).callbacks[getCharacter(kCharacterMahmud).currentCall]]);
 		fedEx(kCharacterMahmud, kCharacterMahmud, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		playDialog(kCharacterMahmud, (char *)&getCharacter(kCharacterMahmud).callParams[getCharacter(kCharacterMahmud).currentCall], -1, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -208,12 +235,17 @@ void LogicManager::CONS_Mahmud_DoCondDialog(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Mahmud_DoCondDialog(HAND_PARAMS) {
-	if (msg->action == 2) {
+	switch (msg->action) {
+	case 2:
 		getCharacter(kCharacterMahmud).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterMahmud, _functionsMahmud[getCharacter(kCharacterMahmud).callbacks[getCharacter(kCharacterMahmud).currentCall]]);
 		fedEx(kCharacterMahmud, kCharacterMahmud, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		playDialog(kCharacterMahmud, (char *)&getCharacter(kCharacterMahmud).callParams[getCharacter(kCharacterMahmud).currentCall], getVolume(kCharacterCond1), 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -230,11 +262,12 @@ void LogicManager::CONS_Mahmud_DoWait(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Mahmud_DoWait(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		if (getCharacterCurrentParams(kCharacterMahmud)[1] ||
 			(getCharacterCurrentParams(kCharacterMahmud)[1] = _gameTime + getCharacterCurrentParams(kCharacterMahmud)[0], _gameTime + getCharacterCurrentParams(kCharacterMahmud)[0] != 0)) {
 			if (getCharacterCurrentParams(kCharacterMahmud)[1] >= _gameTime)
-				return;
+				break;
 
 			getCharacterCurrentParams(kCharacterMahmud)[1] = 0x7FFFFFFF;
 		}
@@ -242,6 +275,9 @@ void LogicManager::HAND_Mahmud_DoWait(HAND_PARAMS) {
 		getCharacter(kCharacterMahmud).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterMahmud, _functionsMahmud[getCharacter(kCharacterMahmud).callbacks[getCharacter(kCharacterMahmud).currentCall]]);
 		fedEx(kCharacterMahmud, kCharacterMahmud, 18, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -259,22 +295,25 @@ void LogicManager::CONS_Mahmud_SaveGame(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Mahmud_SaveGame(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			save(
-				kCharacterMahmud,
-				getCharacterCurrentParams(kCharacterMahmud)[0],
-				getCharacterCurrentParams(kCharacterMahmud)[1]
-			);
+	switch (msg->action) {
+	case 0:
+		getCharacter(kCharacterMahmud).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterMahmud, _functionsMahmud[getCharacter(kCharacterMahmud).callbacks[getCharacter(kCharacterMahmud).currentCall]]);
+		fedEx(kCharacterMahmud, kCharacterMahmud, 18, 0);
+		break;
+	case 12:
+		save(
+			kCharacterMahmud,
+			getCharacterCurrentParams(kCharacterMahmud)[0],
+			getCharacterCurrentParams(kCharacterMahmud)[1]
+		);
 
-			getCharacter(kCharacterMahmud).currentCall--;
-			_engine->getMessageManager()->setMessageHandle(kCharacterMahmud, _functionsMahmud[getCharacter(kCharacterMahmud).callbacks[getCharacter(kCharacterMahmud).currentCall]]);
-			fedEx(kCharacterMahmud, kCharacterMahmud, 18, 0);
-		}
-	} else {
 		getCharacter(kCharacterMahmud).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterMahmud, _functionsMahmud[getCharacter(kCharacterMahmud).callbacks[getCharacter(kCharacterMahmud).currentCall]]);
 		fedEx(kCharacterMahmud, kCharacterMahmud, 18, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -351,7 +390,7 @@ void LogicManager::HAND_Mahmud_CathKnockingHarem(HAND_PARAMS) {
 	case 0:
 		if (getCharacterCurrentParams(kCharacterMahmud)[5] || (getCharacterCurrentParams(kCharacterMahmud)[5] = _gameTime + 13500, _gameTime != -13500)) {
 			if (getCharacterCurrentParams(kCharacterMahmud)[5] >= _gameTime)
-				return;
+				break;
 
 			getCharacterCurrentParams(kCharacterMahmud)[5] = 0x7FFFFFFF;
 		}
@@ -411,6 +450,7 @@ void LogicManager::HAND_Mahmud_CathKnockingHarem(HAND_PARAMS) {
 				break;
 			}
 		}
+
 		if (getCharacterCurrentParams(kCharacterMahmud)[3]) {
 			if (_gameTime >= 2418300) {
 				getCharacterCurrentParams(kCharacterMahmud)[2] = 0;
@@ -437,9 +477,10 @@ void LogicManager::HAND_Mahmud_CathKnockingHarem(HAND_PARAMS) {
 				bumpCathFDoor(8);
 				break;
 			default:
-				return;
+				break;
 			}
 		}
+
 		break;
 	case 12:
 		if (!getCharacterCurrentParams(kCharacterMahmud)[1]) {
@@ -487,90 +528,14 @@ void LogicManager::CONS_Mahmud_CondKnocking(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Mahmud_CondKnocking(HAND_PARAMS) {
-	if (msg->action > 12) {
-		if (msg->action == 18) {
-			switch (getCharacter(kCharacterMahmud).callbacks[getCharacter(kCharacterMahmud).currentCall + 8]) {
-			case 1:
-				getCharacter(kCharacterMahmud).characterPosition.location = 0;
-				setDoor(4, kCharacterCath, 3, 10, 9);
-				startCycOtis(kCharacterMahmud, "614Kd");
-				softBlockAtDoor(kCharacterMahmud, 4);
-				getCharacter(kCharacterMahmud).callbacks[getCharacter(kCharacterMahmud).currentCall + 8] = 2;
-				MahmudCall(&LogicManager::CONS_Mahmud_DoDialog, "MAH1170A", 0, 0, 0);
-				break;
-			case 2:
-				getCharacter(kCharacterMahmud).callbacks[getCharacter(kCharacterMahmud).currentCall + 8] = 3;
-				MahmudCall(&LogicManager::CONS_Mahmud_DoCondDialog, "MAH1170B", 0, 0, 0);
-				break;
-			case 3:
-				getCharacter(kCharacterMahmud).callbacks[getCharacter(kCharacterMahmud).currentCall + 8] = 4;
-				MahmudCall(&LogicManager::CONS_Mahmud_DoDialog, "MAH1170C", 0, 0, 0);
-				break;
-			case 4:
-				getCharacter(kCharacterMahmud).callbacks[getCharacter(kCharacterMahmud).currentCall + 8] = 5;
-				MahmudCall(&LogicManager::CONS_Mahmud_DoCondDialog, "MAH1170D", 0, 0, 0);
-				break;
-			case 5:
-				getCharacter(kCharacterMahmud).callbacks[getCharacter(kCharacterMahmud).currentCall + 8] = 6;
-				MahmudCall(&LogicManager::CONS_Mahmud_DoDialog, "MAH1170E", 0, 0, 0);
-				break;
-			case 6:
-				getCharacter(kCharacterMahmud).callbacks[getCharacter(kCharacterMahmud).currentCall + 8] = 7;
-				MahmudCall(&LogicManager::CONS_Mahmud_DoCondDialog, "MAH1170F", 0, 0, 0);
-				break;
-			case 7:
-				getCharacter(kCharacterMahmud).callbacks[getCharacter(kCharacterMahmud).currentCall + 8] = 8;
-				MahmudCall(&LogicManager::CONS_Mahmud_DoCorrOtis, "614Ld", 4, 0, 0);
-				break;
-			case 8:
-				send(kCharacterMahmud, kCharacterCond1, 156567128, 0);
-				startCycOtis(kCharacterMahmud, "614Bd");
-				softBlockAtDoor(kCharacterMahmud, 4);
-				getCharacter(kCharacterMahmud).callbacks[getCharacter(kCharacterMahmud).currentCall + 8] = 9;
-				MahmudCall(&LogicManager::CONS_Mahmud_DoDialog, "MAH1170G", 0, 0, 0);
-				break;
-			case 9:
-				getCharacter(kCharacterMahmud).callbacks[getCharacter(kCharacterMahmud).currentCall + 8] = 10;
-				MahmudCall(&LogicManager::CONS_Mahmud_DoCondDialog, "MAH1170H", 0, 0, 0);
-				break;
-			case 10:
-				setDoor(5, kCharacterMahmud, 3, 10, 9);
-				setDoor(6, kCharacterMahmud, 3, 10, 9);
-				setDoor(7, kCharacterMahmud, 3, 10, 9);
-				setDoor(8, kCharacterMahmud, 3, 10, 9);
-				break;
-			case 11:
-				softReleaseAtDoor(kCharacterMahmud, 4);
-				getCharacter(kCharacterMahmud).characterPosition.location = 1;
-				endGraphics(kCharacterMahmud);
-				setDoor(4, kCharacterMahmud, 3, 10, 9);
-
-				getCharacter(kCharacterMahmud).currentCall--;
-				_engine->getMessageManager()->setMessageHandle(kCharacterMahmud, _functionsMahmud[getCharacter(kCharacterMahmud).callbacks[getCharacter(kCharacterMahmud).currentCall]]);
-				fedEx(kCharacterMahmud, kCharacterMahmud, 18, 0);
-				break;
-			default:
-				return;
-			}
-		} else if (msg->action == 123852928) {
-			if (whoRunningDialog(kCharacterMahmud))
-				fadeDialog(kCharacterMahmud);
-			setDoor(5, kCharacterClerk, 3, 10, 9);
-			setDoor(6, kCharacterClerk, 3, 10, 9);
-			setDoor(7, kCharacterClerk, 3, 10, 9);
-			setDoor(8, kCharacterClerk, 3, 10, 9);
-			getCharacter(kCharacterMahmud).callbacks[getCharacter(kCharacterMahmud).currentCall + 8] = 11;
-			MahmudCall(&LogicManager::CONS_Mahmud_DoCorrOtis, "614Cd", 4, 0, 0);
-		}
-	} else if (msg->action == 12) {
-		send(kCharacterMahmud, kCharacterCond1, 102227384, 0);
-		getCharacter(kCharacterMahmud).callbacks[getCharacter(kCharacterMahmud).currentCall + 8] = 1;
-		MahmudCall(&LogicManager::CONS_Mahmud_DoCorrOtis, "614Ad", 4, 0, 0);
-	} else if (msg->action >= 8 && msg->action <= 9) {
+	switch (msg->action) {
+	case 8:
+	case 9:
 		if (msg->action == 8)
 			playDialog(0, "LIB012", -1, 0);
 		else
 			playDialog(0, "LIB013", -1, 0);
+
 		if (!whoRunningDialog(kCharacterMahmud)) {
 			getCharacterCurrentParams(kCharacterMahmud)[0]++;
 			if (getCharacterCurrentParams(kCharacterMahmud)[0] == 1) {
@@ -581,6 +546,7 @@ void LogicManager::HAND_Mahmud_CondKnocking(HAND_PARAMS) {
 				playDialog(kCharacterMahmud, "MAH1174", -1, 0);
 			}
 		}
+
 		switch (checkCathDir()) {
 		case 55:
 			bumpCathFDoor(5);
@@ -595,8 +561,94 @@ void LogicManager::HAND_Mahmud_CondKnocking(HAND_PARAMS) {
 			bumpCathFDoor(8);
 			break;
 		default:
-			return;
+			break;
 		}
+
+		break;
+	case 12:
+		send(kCharacterMahmud, kCharacterCond1, 102227384, 0);
+		getCharacter(kCharacterMahmud).callbacks[getCharacter(kCharacterMahmud).currentCall + 8] = 1;
+		MahmudCall(&LogicManager::CONS_Mahmud_DoCorrOtis, "614Ad", 4, 0, 0);
+		break;
+	case 18:
+		switch (getCharacter(kCharacterMahmud).callbacks[getCharacter(kCharacterMahmud).currentCall + 8]) {
+		case 1:
+			getCharacter(kCharacterMahmud).characterPosition.location = 0;
+			setDoor(4, kCharacterCath, 3, 10, 9);
+			startCycOtis(kCharacterMahmud, "614Kd");
+			softBlockAtDoor(kCharacterMahmud, 4);
+			getCharacter(kCharacterMahmud).callbacks[getCharacter(kCharacterMahmud).currentCall + 8] = 2;
+			MahmudCall(&LogicManager::CONS_Mahmud_DoDialog, "MAH1170A", 0, 0, 0);
+			break;
+		case 2:
+			getCharacter(kCharacterMahmud).callbacks[getCharacter(kCharacterMahmud).currentCall + 8] = 3;
+			MahmudCall(&LogicManager::CONS_Mahmud_DoCondDialog, "MAH1170B", 0, 0, 0);
+			break;
+		case 3:
+			getCharacter(kCharacterMahmud).callbacks[getCharacter(kCharacterMahmud).currentCall + 8] = 4;
+			MahmudCall(&LogicManager::CONS_Mahmud_DoDialog, "MAH1170C", 0, 0, 0);
+			break;
+		case 4:
+			getCharacter(kCharacterMahmud).callbacks[getCharacter(kCharacterMahmud).currentCall + 8] = 5;
+			MahmudCall(&LogicManager::CONS_Mahmud_DoCondDialog, "MAH1170D", 0, 0, 0);
+			break;
+		case 5:
+			getCharacter(kCharacterMahmud).callbacks[getCharacter(kCharacterMahmud).currentCall + 8] = 6;
+			MahmudCall(&LogicManager::CONS_Mahmud_DoDialog, "MAH1170E", 0, 0, 0);
+			break;
+		case 6:
+			getCharacter(kCharacterMahmud).callbacks[getCharacter(kCharacterMahmud).currentCall + 8] = 7;
+			MahmudCall(&LogicManager::CONS_Mahmud_DoCondDialog, "MAH1170F", 0, 0, 0);
+			break;
+		case 7:
+			getCharacter(kCharacterMahmud).callbacks[getCharacter(kCharacterMahmud).currentCall + 8] = 8;
+			MahmudCall(&LogicManager::CONS_Mahmud_DoCorrOtis, "614Ld", 4, 0, 0);
+			break;
+		case 8:
+			send(kCharacterMahmud, kCharacterCond1, 156567128, 0);
+			startCycOtis(kCharacterMahmud, "614Bd");
+			softBlockAtDoor(kCharacterMahmud, 4);
+			getCharacter(kCharacterMahmud).callbacks[getCharacter(kCharacterMahmud).currentCall + 8] = 9;
+			MahmudCall(&LogicManager::CONS_Mahmud_DoDialog, "MAH1170G", 0, 0, 0);
+			break;
+		case 9:
+			getCharacter(kCharacterMahmud).callbacks[getCharacter(kCharacterMahmud).currentCall + 8] = 10;
+			MahmudCall(&LogicManager::CONS_Mahmud_DoCondDialog, "MAH1170H", 0, 0, 0);
+			break;
+		case 10:
+			setDoor(5, kCharacterMahmud, 3, 10, 9);
+			setDoor(6, kCharacterMahmud, 3, 10, 9);
+			setDoor(7, kCharacterMahmud, 3, 10, 9);
+			setDoor(8, kCharacterMahmud, 3, 10, 9);
+			break;
+		case 11:
+			softReleaseAtDoor(kCharacterMahmud, 4);
+			getCharacter(kCharacterMahmud).characterPosition.location = 1;
+			endGraphics(kCharacterMahmud);
+			setDoor(4, kCharacterMahmud, 3, 10, 9);
+
+			getCharacter(kCharacterMahmud).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterMahmud, _functionsMahmud[getCharacter(kCharacterMahmud).callbacks[getCharacter(kCharacterMahmud).currentCall]]);
+			fedEx(kCharacterMahmud, kCharacterMahmud, 18, 0);
+			break;
+		default:
+			break;
+		}
+
+		break;
+	case 123852928:
+		if (whoRunningDialog(kCharacterMahmud))
+			fadeDialog(kCharacterMahmud);
+
+		setDoor(5, kCharacterClerk, 3, 10, 9);
+		setDoor(6, kCharacterClerk, 3, 10, 9);
+		setDoor(7, kCharacterClerk, 3, 10, 9);
+		setDoor(8, kCharacterClerk, 3, 10, 9);
+		getCharacter(kCharacterMahmud).callbacks[getCharacter(kCharacterMahmud).currentCall + 8] = 11;
+		MahmudCall(&LogicManager::CONS_Mahmud_DoCorrOtis, "614Cd", 4, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -611,10 +663,12 @@ void LogicManager::CONS_Mahmud_CheckF(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Mahmud_CheckF(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterMahmud).callbacks[getCharacter(kCharacterMahmud).currentCall + 8] = 1;
 		MahmudCall(&LogicManager::CONS_Mahmud_DoCorrOtis, "614Gd", 4, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterMahmud).callbacks[getCharacter(kCharacterMahmud).currentCall + 8]) {
 		case 1:
 			getCharacter(kCharacterMahmud).characterPosition.location = 0;
@@ -656,6 +710,10 @@ void LogicManager::HAND_Mahmud_CheckF(HAND_PARAMS) {
 		default:
 			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -670,10 +728,12 @@ void LogicManager::CONS_Mahmud_CheckH(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Mahmud_CheckH(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterMahmud).callbacks[getCharacter(kCharacterMahmud).currentCall + 8] = 1;
 		MahmudCall(&LogicManager::CONS_Mahmud_DoCorrOtis, "614Gd", 4, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterMahmud).callbacks[getCharacter(kCharacterMahmud).currentCall + 8]) {
 		case 1:
 			getCharacter(kCharacterMahmud).characterPosition.location = 0;
@@ -714,6 +774,10 @@ void LogicManager::HAND_Mahmud_CheckH(HAND_PARAMS) {
 		default:
 			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -728,99 +792,49 @@ void LogicManager::CONS_Mahmud_Vigilant(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Mahmud_Vigilant(HAND_PARAMS) {
-	if (msg->action > 9) {
-		if (msg->action > 17) {
-			switch (msg->action) {
-			case 18:
-				switch (getCharacter(kCharacterMahmud).callbacks[getCharacter(kCharacterMahmud).currentCall + 8]) {
-				case 1:
-					setDoor(4, kCharacterMahmud, 3, 10, 9);
-					getCharacterCurrentParams(kCharacterMahmud)[3] = 0;
-					getCharacterCurrentParams(kCharacterMahmud)[4] = 0;
-					goto LABEL_42;
-				case 2:
-					setDoor(4, kCharacterMahmud, 3, 10, 9);
-					getCharacterCurrentParams(kCharacterMahmud)[3] = 0;
-					getCharacterCurrentParams(kCharacterMahmud)[4] = 0;
-					goto LABEL_47;
-				case 3:
-				case 4:
-					getCharacter(kCharacterMahmud).callbacks[getCharacter(kCharacterMahmud).currentCall + 8] = 5;
-					MahmudCall(&LogicManager::CONS_Mahmud_DoDialog, "MAH1175", 0, 0, 0);
-					return;
-				case 5:
-					if (_gameProgress[kProgressJacket] == 1 ||
-						_gameEvents[kEventMahmudWrongDoor] ||
-						_gameEvents[kEventMahmudWrongDoorOriginalJacket] ||
-						_gameEvents[kEventMahmudWrongDoorDay]) {
-						setDoor(4, kCharacterMahmud, 1, 14, 0);
-					} else {
-						setDoor(4, kCharacterMahmud, 1, 10, 9);
-					}
+	switch (msg->action) {
+	case 0:
+		if (getCharacterParams(kCharacterMahmud, 8)[0]) {
+			getCharacterCurrentParams(kCharacterMahmud)[1] = 1;
+			send(kCharacterMahmud, kCharacterCond1, 204379649, 0);
+			getCharacterParams(kCharacterMahmud, 8)[0] = 0;
+		}
 
-					getCharacterCurrentParams(kCharacterMahmud)[4] = 1;
-					return;
-				case 6:
-				case 7:
-					goto LABEL_67;
-				case 8:
-				case 9:
-					getCharacter(kCharacterMahmud).callbacks[getCharacter(kCharacterMahmud).currentCall + 8] = 10;
-					MahmudCall(&LogicManager::CONS_Mahmud_SaveGame, 2, kEventMahmudWrongDoor, 0, 0);
-					return;
-				case 10:
-					if (_gameProgress[kProgressJacket] == 2) {
-						if (isNight()) {
-							playNIS(kEventMahmudWrongDoor);
-						} else {
-							playNIS(kEventMahmudWrongDoorDay);
-						}
-					} else {
-						playNIS(kEventMahmudWrongDoorOriginalJacket);
-					}
-					playDialog(0, "LIB015", -1, 0);
-					cleanNIS();
-				LABEL_67:
-					getCharacterCurrentParams(kCharacterMahmud)[3] = 1;
-					break;
-				case 11:
-					goto LABEL_39;
-				case 12:
-					setDoor(4, kCharacterMahmud, 3, 10, 9);
-					getCharacterCurrentParams(kCharacterMahmud)[3] = 0;
-					getCharacterCurrentParams(kCharacterMahmud)[4] = 0;
-					getCharacterCurrentParams(kCharacterMahmud)[1] = 0;
-					break;
-				default:
-					return;
-				}
-				break;
-			case 225563840:
-				getCharacter(kCharacterMahmud).callbacks[getCharacter(kCharacterMahmud).currentCall + 8] = 12;
-				MahmudCall(&LogicManager::CONS_Mahmud_CondKnocking, 0, 0, 0, 0);
+		if (!getCharacterCurrentParams(kCharacterMahmud)[1] && _gameProgress[kProgressChapter] == 1) {
+			if (_gameTime > 1098000 && !getCharacterCurrentParams(kCharacterMahmud)[5]) {
+				getCharacterCurrentParams(kCharacterMahmud)[5] = 1;
+				getCharacter(kCharacterMahmud).callbacks[getCharacter(kCharacterMahmud).currentCall + 8] = 1;
+				MahmudCall(&LogicManager::CONS_Mahmud_CheckH, 0, 0, 0, 0);
 				break;
-			case 290410610:
-				getCharacterCurrentParams(kCharacterMahmud)[2] = getCharacterCurrentParams(kCharacterMahmud)[2] == 0;
-				getCharacter(kCharacterMahmud).callbacks[getCharacter(kCharacterMahmud).currentCall + 8] = 11;
-				MahmudCall(&LogicManager::CONS_Mahmud_CathKnockingHarem, msg->param, getCharacterCurrentParams(kCharacterMahmud)[2], 0, 0);
+			}
+
+			if (!dialogRunning("HAR1104") && _gameTime > 1167300 && !getCharacterCurrentParams(kCharacterMahmud)[6]) {
+				getCharacterCurrentParams(kCharacterMahmud)[6] = 1;
+				getCharacter(kCharacterMahmud).callbacks[getCharacter(kCharacterMahmud).currentCall + 8] = 2;
+				MahmudCall(&LogicManager::CONS_Mahmud_CheckF, 0, 0, 0, 0);
 				break;
 			}
-		} else if (msg->action == 17) {
-			if (getCharacterCurrentParams(kCharacterMahmud)[3] || getCharacterCurrentParams(kCharacterMahmud)[4]) {
-			LABEL_39:
-				setDoor(4, kCharacterMahmud, 3, 10, 9);
-				getCharacterCurrentParams(kCharacterMahmud)[3] = 0;
-				getCharacterCurrentParams(kCharacterMahmud)[4] = 0;
+		}
+
+		if (getCharacterCurrentParams(kCharacterMahmud)[4]) {
+			if (getCharacterCurrentParams(kCharacterMahmud)[7] || (getCharacterCurrentParams(kCharacterMahmud)[7] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
+				if (getCharacterCurrentParams(kCharacterMahmud)[7] >= _currentGameSessionTicks)
+					break;
+
+				getCharacterCurrentParams(kCharacterMahmud)[7] = 0x7FFFFFFF;
 			}
-		} else if (msg->action == 12) {
-			getCharacter(kCharacterMahmud).characterPosition.car = 3;
-			getCharacter(kCharacterMahmud).characterPosition.position = 5790;
-			getCharacter(kCharacterMahmud).characterPosition.location = 1;
-			endGraphics(kCharacterMahmud);
-			getCharacterCurrentParams(kCharacterMahmud)[2] = 1;
-			setDoor(4, kCharacterMahmud, 3, 10, 9);
+
+			getCharacterCurrentParams(kCharacterMahmud)[4] = 0;
+			getCharacterCurrentParams(kCharacterMahmud)[3] = 1;
+			setDoor(4, kCharacterMahmud, 3, 0, 0);
+			getCharacterCurrentParams(kCharacterMahmud)[7] = 0;
+		} else {
+			getCharacterCurrentParams(kCharacterMahmud)[7] = 0;
 		}
-	} else if (msg->action >= 8) {
+
+		break;
+	case 8:
+	case 9:
 		if (getCharacterCurrentParams(kCharacterMahmud)[4]) {
 			setDoor(4, kCharacterMahmud, 3, 0, 0);
 			if (_gameProgress[kProgressJacket] == 1 || _gameEvents[kEventMahmudWrongDoor] || _gameEvents[kEventMahmudWrongDoorOriginalJacket] || _gameEvents[kEventMahmudWrongDoorDay]) {
@@ -836,7 +850,7 @@ void LogicManager::HAND_Mahmud_Vigilant(HAND_PARAMS) {
 						MahmudCall(&LogicManager::CONS_Mahmud_DoDialog, getCathSorryDialog(), 0, 0, 0);
 						break;
 					}
-					
+
 				} else {
 					getCharacter(kCharacterMahmud).callbacks[getCharacter(kCharacterMahmud).currentCall + 8] = 7;
 					MahmudCall(&LogicManager::CONS_Mahmud_DoDialog, getCathSorryDialog(), 0, 0, 0);
@@ -858,43 +872,132 @@ void LogicManager::HAND_Mahmud_Vigilant(HAND_PARAMS) {
 				MahmudCall(&LogicManager::CONS_Mahmud_DoDialog, "LIB013", 0, 0, 0);
 			}
 		}
-	} else if (msg->action == 0) {
-		if (getCharacterParams(kCharacterMahmud, 8)[0]) {
-			getCharacterCurrentParams(kCharacterMahmud)[1] = 1;
-			send(kCharacterMahmud, kCharacterCond1, 204379649, 0);
-			getCharacterParams(kCharacterMahmud, 8)[0] = 0;
+
+		break;
+	case 12:
+		getCharacter(kCharacterMahmud).characterPosition.car = kCarGreenSleeping;
+		getCharacter(kCharacterMahmud).characterPosition.position = 5790;
+		getCharacter(kCharacterMahmud).characterPosition.location = 1;
+		endGraphics(kCharacterMahmud);
+		getCharacterCurrentParams(kCharacterMahmud)[2] = 1;
+		setDoor(4, kCharacterMahmud, 3, 10, 9);
+		break;
+	case 17:
+		if (getCharacterCurrentParams(kCharacterMahmud)[3] || getCharacterCurrentParams(kCharacterMahmud)[4]) {
+			setDoor(4, kCharacterMahmud, 3, 10, 9);
+			getCharacterCurrentParams(kCharacterMahmud)[3] = 0;
+			getCharacterCurrentParams(kCharacterMahmud)[4] = 0;
 		}
-		if (!getCharacterCurrentParams(kCharacterMahmud)[1] && _gameProgress[kProgressChapter] == 1) {
-			if (_gameTime > 1098000 && !getCharacterCurrentParams(kCharacterMahmud)[5]) {
-				getCharacterCurrentParams(kCharacterMahmud)[5] = 1;
-				getCharacter(kCharacterMahmud).callbacks[getCharacter(kCharacterMahmud).currentCall + 8] = 1;
-				MahmudCall(&LogicManager::CONS_Mahmud_CheckH, 0, 0, 0, 0);
-				return;
-			}
-		LABEL_42:
+
+		break;
+	case 18:
+		switch (getCharacter(kCharacterMahmud).callbacks[getCharacter(kCharacterMahmud).currentCall + 8]) {
+		case 1:
+			setDoor(4, kCharacterMahmud, 3, 10, 9);
+			getCharacterCurrentParams(kCharacterMahmud)[3] = 0;
+			getCharacterCurrentParams(kCharacterMahmud)[4] = 0;
+
 			if (!dialogRunning("HAR1104") && _gameTime > 1167300 && !getCharacterCurrentParams(kCharacterMahmud)[6]) {
 				getCharacterCurrentParams(kCharacterMahmud)[6] = 1;
 				getCharacter(kCharacterMahmud).callbacks[getCharacter(kCharacterMahmud).currentCall + 8] = 2;
 				MahmudCall(&LogicManager::CONS_Mahmud_CheckF, 0, 0, 0, 0);
-				return;
+				break;
 			}
-		}
-	LABEL_47:
-		if (getCharacterCurrentParams(kCharacterMahmud)[4]) {
-			if (getCharacterCurrentParams(kCharacterMahmud)[7] || (getCharacterCurrentParams(kCharacterMahmud)[7] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
-				if (getCharacterCurrentParams(kCharacterMahmud)[7] >= _currentGameSessionTicks)
-					return;
 
-				getCharacterCurrentParams(kCharacterMahmud)[7] = 0x7FFFFFFF;
+			// fall through
+		case 2:
+			if (getCharacter(kCharacterMahmud).callbacks[getCharacter(kCharacterMahmud).currentCall + 8] == 2) {
+				setDoor(4, kCharacterMahmud, 3, 10, 9);
+				getCharacterCurrentParams(kCharacterMahmud)[3] = 0;
+				getCharacterCurrentParams(kCharacterMahmud)[4] = 0;
 			}
 
-			getCharacterCurrentParams(kCharacterMahmud)[4] = 0;
+			if (getCharacterCurrentParams(kCharacterMahmud)[4]) {
+				if (getCharacterCurrentParams(kCharacterMahmud)[7] || (getCharacterCurrentParams(kCharacterMahmud)[7] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
+					if (getCharacterCurrentParams(kCharacterMahmud)[7] >= _currentGameSessionTicks)
+						break;
+
+					getCharacterCurrentParams(kCharacterMahmud)[7] = 0x7FFFFFFF;
+				}
+
+				getCharacterCurrentParams(kCharacterMahmud)[4] = 0;
+				getCharacterCurrentParams(kCharacterMahmud)[3] = 1;
+				setDoor(4, kCharacterMahmud, 3, 0, 0);
+				getCharacterCurrentParams(kCharacterMahmud)[7] = 0;
+			} else {
+				getCharacterCurrentParams(kCharacterMahmud)[7] = 0;
+			}
+
+			break;
+		case 3:
+		case 4:
+			getCharacter(kCharacterMahmud).callbacks[getCharacter(kCharacterMahmud).currentCall + 8] = 5;
+			MahmudCall(&LogicManager::CONS_Mahmud_DoDialog, "MAH1175", 0, 0, 0);
+			break;
+		case 5:
+			if (_gameProgress[kProgressJacket] == 1 ||
+				_gameEvents[kEventMahmudWrongDoor] ||
+				_gameEvents[kEventMahmudWrongDoorOriginalJacket] ||
+				_gameEvents[kEventMahmudWrongDoorDay]) {
+				setDoor(4, kCharacterMahmud, 1, 14, 0);
+			} else {
+				setDoor(4, kCharacterMahmud, 1, 10, 9);
+			}
+
+			getCharacterCurrentParams(kCharacterMahmud)[4] = 1;
+			break;
+		case 6:
+		case 7:
 			getCharacterCurrentParams(kCharacterMahmud)[3] = 1;
-			setDoor(4, kCharacterMahmud, 3, 0, 0);
-			getCharacterCurrentParams(kCharacterMahmud)[7] = 0;
-		} else {
-			getCharacterCurrentParams(kCharacterMahmud)[7] = 0;
+			break;
+		case 8:
+		case 9:
+			getCharacter(kCharacterMahmud).callbacks[getCharacter(kCharacterMahmud).currentCall + 8] = 10;
+			MahmudCall(&LogicManager::CONS_Mahmud_SaveGame, 2, kEventMahmudWrongDoor, 0, 0);
+			break;
+		case 10:
+			if (_gameProgress[kProgressJacket] == 2) {
+				if (isNight()) {
+					playNIS(kEventMahmudWrongDoor);
+				} else {
+					playNIS(kEventMahmudWrongDoorDay);
+				}
+			} else {
+				playNIS(kEventMahmudWrongDoorOriginalJacket);
+			}
+
+			playDialog(0, "LIB015", -1, 0);
+			cleanNIS();
+
+			getCharacterCurrentParams(kCharacterMahmud)[3] = 1;
+			break;
+		case 11:
+			setDoor(4, kCharacterMahmud, 3, 10, 9);
+			getCharacterCurrentParams(kCharacterMahmud)[3] = 0;
+			getCharacterCurrentParams(kCharacterMahmud)[4] = 0;
+			break;
+		case 12:
+			setDoor(4, kCharacterMahmud, 3, 10, 9);
+			getCharacterCurrentParams(kCharacterMahmud)[3] = 0;
+			getCharacterCurrentParams(kCharacterMahmud)[4] = 0;
+			getCharacterCurrentParams(kCharacterMahmud)[1] = 0;
+			break;
+		default:
+			break;
 		}
+
+		break;
+	case 225563840:
+		getCharacter(kCharacterMahmud).callbacks[getCharacter(kCharacterMahmud).currentCall + 8] = 12;
+		MahmudCall(&LogicManager::CONS_Mahmud_CondKnocking, 0, 0, 0, 0);
+		break;
+	case 290410610:
+		getCharacterCurrentParams(kCharacterMahmud)[2] = getCharacterCurrentParams(kCharacterMahmud)[2] == 0;
+		getCharacter(kCharacterMahmud).callbacks[getCharacter(kCharacterMahmud).currentCall + 8] = 11;
+		MahmudCall(&LogicManager::CONS_Mahmud_CathKnockingHarem, msg->param, getCharacterCurrentParams(kCharacterMahmud)[2], 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -909,18 +1012,24 @@ void LogicManager::CONS_Mahmud_Birth(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Mahmud_Birth(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			autoMessage(kCharacterMahmud, 170483072, 0);
-			getCharacter(kCharacterMahmud).characterPosition.position = 540;
-			getCharacter(kCharacterMahmud).characterPosition.location = 0;
-			getCharacter(kCharacterMahmud).characterPosition.car = kCarGreenSleeping;
-			setDoor(4, kCharacterCath, 3, 10, 9);
-			setDoor(20, kCharacterCath, 3, 10, 9);
+	switch (msg->action) {
+	case 0:
+		if (_gameTime > 1062000 && !getCharacterCurrentParams(kCharacterMahmud)[0]) {
+			getCharacterCurrentParams(kCharacterMahmud)[0] = 1;
+			CONS_Mahmud_Vigilant(0, 0, 0, 0);
 		}
-	} else if (_gameTime > 1062000 && !getCharacterCurrentParams(kCharacterMahmud)[0]) {
-		getCharacterCurrentParams(kCharacterMahmud)[0] = 1;
-		CONS_Mahmud_Vigilant(0, 0, 0, 0);
+
+		break;
+	case 12:
+		autoMessage(kCharacterMahmud, 170483072, 0);
+		getCharacter(kCharacterMahmud).characterPosition.position = 540;
+		getCharacter(kCharacterMahmud).characterPosition.location = 0;
+		getCharacter(kCharacterMahmud).characterPosition.car = kCarGreenSleeping;
+		setDoor(4, kCharacterCath, 3, 10, 9);
+		setDoor(20, kCharacterCath, 3, 10, 9);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -935,12 +1044,16 @@ void LogicManager::CONS_Mahmud_Asleep(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Mahmud_Asleep(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterMahmud).characterPosition.position = 5790;
 		getCharacter(kCharacterMahmud).characterPosition.location = 1;
 		getCharacter(kCharacterMahmud).characterPosition.car = kCarGreenSleeping;
 		setDoor(4, kCharacterCath, 3, 10, 9);
 		endGraphics(kCharacterMahmud);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -955,17 +1068,20 @@ void LogicManager::CONS_Mahmud_StartPart2(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Mahmud_StartPart2(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			endGraphics(kCharacterMahmud);
-			getCharacter(kCharacterMahmud).characterPosition.position = 5790;
-			getCharacter(kCharacterMahmud).characterPosition.location = 1;
-			getCharacter(kCharacterMahmud).characterPosition.car = kCarGreenSleeping;
-			getCharacter(kCharacterMahmud).clothes = 0;
-			getCharacter(kCharacterMahmud).inventoryItem = 0;
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		CONS_Mahmud_Vigilant(0, 0, 0, 0);
+		break;
+	case 12:
+		endGraphics(kCharacterMahmud);
+		getCharacter(kCharacterMahmud).characterPosition.position = 5790;
+		getCharacter(kCharacterMahmud).characterPosition.location = 1;
+		getCharacter(kCharacterMahmud).characterPosition.car = kCarGreenSleeping;
+		getCharacter(kCharacterMahmud).clothes = 0;
+		getCharacter(kCharacterMahmud).inventoryItem = 0;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -980,17 +1096,20 @@ void LogicManager::CONS_Mahmud_StartPart3(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Mahmud_StartPart3(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			endGraphics(kCharacterMahmud);
-			getCharacter(kCharacterMahmud).characterPosition.position = 5790;
-			getCharacter(kCharacterMahmud).characterPosition.location = 1;
-			getCharacter(kCharacterMahmud).characterPosition.car = kCarGreenSleeping;
-			getCharacter(kCharacterMahmud).clothes = 0;
-			getCharacter(kCharacterMahmud).inventoryItem = 0;
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		CONS_Mahmud_Vigilant(0, 0, 0, 0);
+		break;
+	case 12:
+		endGraphics(kCharacterMahmud);
+		getCharacter(kCharacterMahmud).characterPosition.position = 5790;
+		getCharacter(kCharacterMahmud).characterPosition.location = 1;
+		getCharacter(kCharacterMahmud).characterPosition.car = kCarGreenSleeping;
+		getCharacter(kCharacterMahmud).clothes = 0;
+		getCharacter(kCharacterMahmud).inventoryItem = 0;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1005,16 +1124,19 @@ void LogicManager::CONS_Mahmud_StartPart4(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Mahmud_StartPart4(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			endGraphics(kCharacterMahmud);
-			getCharacter(kCharacterMahmud).characterPosition.position = 2740;
-			getCharacter(kCharacterMahmud).characterPosition.location = 1;
-			getCharacter(kCharacterMahmud).characterPosition.car = kCarGreenSleeping;
-			getCharacter(kCharacterMahmud).clothes = 0;
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		CONS_Mahmud_Vigilant(0, 0, 0, 0);
+		break;
+	case 12:
+		endGraphics(kCharacterMahmud);
+		getCharacter(kCharacterMahmud).characterPosition.position = 2740;
+		getCharacter(kCharacterMahmud).characterPosition.location = 1;
+		getCharacter(kCharacterMahmud).characterPosition.car = kCarGreenSleeping;
+		getCharacter(kCharacterMahmud).clothes = 0;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1029,8 +1151,13 @@ void LogicManager::CONS_Mahmud_StartPart5(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Mahmud_StartPart5(HAND_PARAMS) {
-	if (msg->action == 12)
+	switch (msg->action) {
+	case 12:
 		endGraphics(kCharacterMahmud);
+		break;
+	default:
+		break;
+	}
 }
 
 void (LogicManager::*LogicManager::_functionsMahmud[])(HAND_PARAMS) = {


Commit: 2fa6388835508632718205df6d61dc64b53cf5d0
    https://github.com/scummvm/scummvm/commit/2fa6388835508632718205df6d61dc64b53cf5d0
Author: AndywinXp (andywinxp at gmail.com)
Date: 2025-06-16T23:12:18+02:00

Commit Message:
LASTEXPRESS: Clean up Master logic

Changed paths:
    engines/lastexpress/characters/master.cpp


diff --git a/engines/lastexpress/characters/master.cpp b/engines/lastexpress/characters/master.cpp
index 9d2162fbfd8..a8138eb4680 100644
--- a/engines/lastexpress/characters/master.cpp
+++ b/engines/lastexpress/characters/master.cpp
@@ -584,14 +584,19 @@ void LogicManager::HAND_Master_MovingNight(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
 		if (_gameProgress[kProgressIsTrainRunning] && _gameTime < 1458000) {
+			bool skip = false;
+
 			if (!getCharacterCurrentParams(kCharacterMaster)[5]) {
 				getCharacterCurrentParams(kCharacterMaster)[5] = _currentGameSessionTicks + getCharacterCurrentParams(kCharacterMaster)[1];
-				if (getCharacterCurrentParams(kCharacterMaster)[5] == 0)
-					goto LABEL_19;
+				if (getCharacterCurrentParams(kCharacterMaster)[5] == 0) {
+					skip = true;
+				}
 			}
-			if (getCharacterCurrentParams(kCharacterMaster)[5] < _currentGameSessionTicks) {
-				getCharacterCurrentParams(kCharacterMaster)[5] = 0x7FFFFFFF;
-			LABEL_19:
+			if (skip || getCharacterCurrentParams(kCharacterMaster)[5] < _currentGameSessionTicks) {
+				if (!skip) {
+					getCharacterCurrentParams(kCharacterMaster)[5] = 0x7FFFFFFF;
+				}
+
 				switch (rnd(5)) {
 				case 0:
 					playDialog(0, "ZFX1005", rnd(15) + 2, 0);
@@ -616,67 +621,69 @@ void LogicManager::HAND_Master_MovingNight(HAND_PARAMS) {
 				getCharacterCurrentParams(kCharacterMaster)[5] = 0;
 			}
 		}
+
 		if (_gameTime > 1039500 && !getCharacterCurrentParams(kCharacterMaster)[6]) {
 			getCharacterCurrentParams(kCharacterMaster)[6] = 1;
 			getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 1;
 			MasterCall(&LogicManager::CONS_Master_SaveGame, 1, 0, 0, 0);
-			return;
+			break;
 		}
-	LABEL_75:
+
 		if (_gameTime > 1147500 && !getCharacterCurrentParams(kCharacterMaster)[7]) {
 			getCharacterCurrentParams(kCharacterMaster)[7] = 1;
 			getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 2;
 			MasterCall(&LogicManager::CONS_Master_Arrive, "Epernay", 0, 0, 0);
-			return;
+			break;
 		}
-	LABEL_78:
+
 		if (_gameTime > 1150200 && !getCharacterCurrentParams(kCharacterMaster)[8]) {
 			getCharacterCurrentParams(kCharacterMaster)[8] = 1;
 			getCharacterCurrentParams(kCharacterMaster)[3] = 1;
 			getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 3;
 			MasterCall(&LogicManager::CONS_Master_Depart, "Epernay", 0, 0, 0);
-			return;
+			break;
 		}
-	LABEL_81:
+
 		if (getCharacterCurrentParams(kCharacterMaster)[4] && !getCharacterParams(kCharacterMaster, 8)[1]) {
 			getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 4;
 			MasterCall(&LogicManager::CONS_Master_Depart, "Unschedu", 0, 0, 0);
-			return;
+			break;
 		}
-	LABEL_57:
+
 		if (_gameTime > 1170000 && !getCharacterCurrentParams(kCharacterMaster)[9]) {
 			getCharacterCurrentParams(kCharacterMaster)[9] = 1;
 			_gameProgress[kProgressField18] = 2;
 		}
+
 		if (!getCharacterCurrentParams(kCharacterMaster)[0]) {
 			if (_gameTime > 1170000 && !getCharacterCurrentParams(kCharacterMaster)[10]) {
 				getCharacterCurrentParams(kCharacterMaster)[10] = 1;
 				getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 5;
 				MasterCall(&LogicManager::CONS_Master_Arrive, "Chalons", 1, 0, 0);
-				return;
+				break;
 			}
-		LABEL_84:
+
 			if (_gameTime > 1173600 && !getCharacterCurrentParams(kCharacterMaster)[11]) {
 				getCharacterCurrentParams(kCharacterMaster)[11] = 1;
 				getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 6;
 				MasterCall(&LogicManager::CONS_Master_Depart, "Chalons", 0, 0, 0);
-				return;
+				break;
 			}
-		LABEL_87:
+
 			if (_gameTime > 1228500 && !getCharacterCurrentParams(kCharacterMaster)[12]) {
 				getCharacterCurrentParams(kCharacterMaster)[12] = 1;
 				getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 7;
 				MasterCall(&LogicManager::CONS_Master_Arrive, "BarLeDuc", 2, 0, 0);
-				return;
+				break;
 			}
-		LABEL_90:
+
 			if (_gameTime > 1231200 && !getCharacterCurrentParams(kCharacterMaster)[13]) {
 				getCharacterCurrentParams(kCharacterMaster)[13] = 1;
 				getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 8;
 				MasterCall(&LogicManager::CONS_Master_Depart, "BarLeDuc", 0, 0, 0);
-				return;
+				break;
 			}
-		LABEL_93:
+
 			if (_gameTime > 1260000 && !getCharacterCurrentParams(kCharacterMaster)[14]) {
 				getCharacterCurrentParams(kCharacterMaster)[14] = 1;
 				_gameTimeTicksDelta = 1;
@@ -685,90 +692,90 @@ void LogicManager::HAND_Master_MovingNight(HAND_PARAMS) {
 				getCharacterCurrentParams(kCharacterMaster)[15] = 1;
 				getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 9;
 				MasterCall(&LogicManager::CONS_Master_Arrive, "Nancy", 3, 0, 0);
-				return;
+				break;
 			}
-		LABEL_99:
+
 			if (_gameTime > 1307700 && !getCharacterCurrentParams(kCharacterMaster)[16]) {
 				getCharacterCurrentParams(kCharacterMaster)[16] = 1;
 				getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 10;
 				MasterCall(&LogicManager::CONS_Master_Depart, "Nancy", 0, 0, 0);
-				return;
+				break;
 			}
-		LABEL_102:
+
 			if (_gameTime > 1335600 && !getCharacterCurrentParams(kCharacterMaster)[17]) {
 				getCharacterCurrentParams(kCharacterMaster)[17] = 1;
 				getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 11;
 				MasterCall(&LogicManager::CONS_Master_Arrive, "Luneville", 4, 0, 0);
-				return;
+				break;
 			}
-		LABEL_105:
+
 			if (_gameTime > 1338300 && !getCharacterCurrentParams(kCharacterMaster)[18]) {
 				getCharacterCurrentParams(kCharacterMaster)[18] = 1;
 				getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 12;
 				MasterCall(&LogicManager::CONS_Master_Depart, "Luneville", 0, 0, 0);
-				return;
+				break;
 			}
-		LABEL_108:
+
 			if (_gameTime > 1359900 && !getCharacterCurrentParams(kCharacterMaster)[19]) {
 				getCharacterCurrentParams(kCharacterMaster)[19] = 1;
 				getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 13;
 				MasterCall(&LogicManager::CONS_Master_Arrive, "Avricourt", 5, 0, 0);
-				return;
+				break;
 			}
-		LABEL_111:
+
 			if (_gameTime > 1363500 && !getCharacterCurrentParams(kCharacterMaster)[20]) {
 				getCharacterCurrentParams(kCharacterMaster)[20] = 1;
 				getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 14;
 				MasterCall(&LogicManager::CONS_Master_Depart, "Avricourt", 0, 0, 0);
-				return;
+				break;
 			}
-		LABEL_114:
+
 			if (_gameTime > 1367100 && !getCharacterCurrentParams(kCharacterMaster)[21]) {
 				getCharacterCurrentParams(kCharacterMaster)[21] = 1;
 				getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 15;
 				MasterCall(&LogicManager::CONS_Master_Arrive, "DeutschA", 6, 0, 0);
-				return;
+				break;
 			}
-		LABEL_117:
+
 			if (_gameTime > 1370700 && !getCharacterCurrentParams(kCharacterMaster)[22]) {
 				getCharacterCurrentParams(kCharacterMaster)[22] = 1;
 				getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 16;
 				MasterCall(&LogicManager::CONS_Master_Depart, "DeutschA", 0, 0, 0);
-				return;
+				break;
 			}
-		LABEL_65:
+
 			if (_gameTime > 1490400 && !getCharacterCurrentParams(kCharacterMaster)[23]) {
 				getCharacterCurrentParams(kCharacterMaster)[23] = 1;
 				getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 17;
 				MasterCall(&LogicManager::CONS_Master_SaveGame, 1, 0, 0, 0);
-				return;
-			}
-		}
-	LABEL_120:
-		if (_gameTime <= 1493100 || getCharacterCurrentParams(kCharacterMaster)[24]) {
-		LABEL_70:
-			if (_gameTime <= 1539000 || getCharacterCurrentParams(kCharacterMaster)[25]) {
-			LABEL_123:
-				if (_gameTime <= 1541700 || getCharacterCurrentParams(kCharacterMaster)[26]) {
-				LABEL_126:
-					if (_gameTime > 1674000 && !getCharacterCurrentParams(kCharacterMaster)[27]) {
-						getCharacterCurrentParams(kCharacterMaster)[27] = 1;
-						CONS_Master_SecondSleep(0, 0, 0, 0);
-					}
-				} else {
-					getCharacterCurrentParams(kCharacterMaster)[26] = 1;
-					getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 21;
-					MasterCall(&LogicManager::CONS_Master_Depart, "BadenOos", 0, 0, 0);
-				}
-			} else {
-				getCharacterCurrentParams(kCharacterMaster)[25] = 1;
-				getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 20;
-				MasterCall(&LogicManager::CONS_Master_Arrive, "BadenOos", 8, 0, 0);
+				break;
 			}
-		} else {
+		}
+
+		if (_gameTime > 1493100 && !getCharacterCurrentParams(kCharacterMaster)[24]) {
 			getCharacterCurrentParams(kCharacterMaster)[24] = 1;
 			getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 19;
 			MasterCall(&LogicManager::CONS_Master_Depart, "Strasbou", 0, 0, 0);
+			break;
+		}
+
+		if (_gameTime > 1539000 && !getCharacterCurrentParams(kCharacterMaster)[25]) {
+			getCharacterCurrentParams(kCharacterMaster)[25] = 1;
+			getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 20;
+			MasterCall(&LogicManager::CONS_Master_Arrive, "BadenOos", 8, 0, 0);
+			break;
+		}
+
+		if (_gameTime > 1541700 && !getCharacterCurrentParams(kCharacterMaster)[26]) {
+			getCharacterCurrentParams(kCharacterMaster)[26] = 1;
+			getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 21;
+			MasterCall(&LogicManager::CONS_Master_Depart, "BadenOos", 0, 0, 0);
+			break;
+		}
+
+		if (_gameTime > 1674000 && !getCharacterCurrentParams(kCharacterMaster)[27]) {
+			getCharacterCurrentParams(kCharacterMaster)[27] = 1;
+			CONS_Master_SecondSleep(0, 0, 0, 0);
 		}
 
 		break;
@@ -778,14 +785,23 @@ void LogicManager::HAND_Master_MovingNight(HAND_PARAMS) {
 			if (getCharacter(kCharacterCath).characterPosition.location == 2) {
 				if (cathOutHisWindow()) {
 					bumpCath(kCarGreenSleeping, 49, 255);
-					goto LABEL_44;
+					_engine->getSoundManager()->startAmbient();
+					_engine->getSoundManager()->startSteam(getCharacterParams(kCharacterMaster, 8)[3]);
+					getCharacterParams(kCharacterMaster, 8)[1] = 0;
+					break;
 				}
+
 				if (cathOutRebeccaWindow()) {
 					bumpCath(kCarRedSleeping, 49, 255);
 				} else {
 					if (getCharacter(kCharacterCath).characterPosition.car < kCarRedSleeping || getCharacter(kCharacterCath).characterPosition.car > kCarCoalTender) {
-						if (!getCharacter(kCharacterCath).characterPosition.car || getCharacter(kCharacterCath).characterPosition.car > kCarGreenSleeping)
-							goto LABEL_44;
+						if (!getCharacter(kCharacterCath).characterPosition.car || getCharacter(kCharacterCath).characterPosition.car > kCarGreenSleeping) {
+							_engine->getSoundManager()->startAmbient();
+							_engine->getSoundManager()->startSteam(getCharacterParams(kCharacterMaster, 8)[3]);
+							getCharacterParams(kCharacterMaster, 8)[1] = 0;
+							break;
+						}
+
 						if (checkCathDir(kCarGreenSleeping, 98)) {
 							playDialog(0, "LIB015", -1, 0);
 							bumpCath(kCarGreenSleeping, 71, 255);
@@ -793,17 +809,22 @@ void LogicManager::HAND_Master_MovingNight(HAND_PARAMS) {
 							bumpCath(kCarGreenSleeping, 82, 255);
 						}
 
-						goto LABEL_44;
+						_engine->getSoundManager()->startAmbient();
+						_engine->getSoundManager()->startSteam(getCharacterParams(kCharacterMaster, 8)[3]);
+						getCharacterParams(kCharacterMaster, 8)[1] = 0;
+						break;
 					}
+
 					bumpCath(kCarRestaurant, 82, 255);
 				}
 			}
-		LABEL_44:
+
 			_engine->getSoundManager()->startAmbient();
 			_engine->getSoundManager()->startSteam(getCharacterParams(kCharacterMaster, 8)[3]);
 			getCharacterParams(kCharacterMaster, 8)[1] = 0;
-			return;
+			break;
 		}
+
 		if (getCharacterParams(kCharacterMaster, 8)[2]) {
 			_engine->getSoundManager()->startAmbient();
 			getCharacterParams(kCharacterMaster, 8)[2] = 0;
@@ -812,6 +833,7 @@ void LogicManager::HAND_Master_MovingNight(HAND_PARAMS) {
 					send(kCharacterMaster, kCharacterTrainM, 168187490, 0);
 				else
 					send(kCharacterMaster, kCharacterCond1, 224122407, 0);
+
 				getCharacterCurrentParams(kCharacterMaster)[3] = 0;
 			}
 		}
@@ -844,167 +866,443 @@ void LogicManager::HAND_Master_MovingNight(HAND_PARAMS) {
 	case 18:
 		switch (getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8]) {
 		case 1:
-			goto LABEL_75;
+			if (_gameTime > 1147500 && !getCharacterCurrentParams(kCharacterMaster)[7]) {
+				getCharacterCurrentParams(kCharacterMaster)[7] = 1;
+				getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 2;
+				MasterCall(&LogicManager::CONS_Master_Arrive, "Epernay", 0, 0, 0);
+				break;
+			}
+
+			// fall through
 		case 2:
-			goto LABEL_78;
+			if (_gameTime > 1150200 && !getCharacterCurrentParams(kCharacterMaster)[8]) {
+				getCharacterCurrentParams(kCharacterMaster)[8] = 1;
+				getCharacterCurrentParams(kCharacterMaster)[3] = 1;
+				getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 3;
+				MasterCall(&LogicManager::CONS_Master_Depart, "Epernay", 0, 0, 0);
+				break;
+			}
+
+			// fall through
 		case 3:
-			goto LABEL_81;
-		case 4:
-			getCharacterCurrentParams(kCharacterMaster)[4] = 0;
-			goto LABEL_57;
-		case 5:
-			goto LABEL_84;
-		case 6:
-			goto LABEL_87;
-		case 7:
-			goto LABEL_90;
-		case 8:
-			goto LABEL_93;
-		case 9:
-			goto LABEL_99;
-		case 10:
-			goto LABEL_102;
-		case 11:
-			goto LABEL_105;
-		case 12:
-			goto LABEL_108;
-		case 13:
-			goto LABEL_111;
-		case 14:
-			goto LABEL_114;
-		case 15:
-			goto LABEL_117;
-		case 16:
-			_gameTime = 1424700;
-			goto LABEL_65;
-		case 17:
-			_gameProgress[kProgressField18] = 1;
-			getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 18;
-			MasterCall(&LogicManager::CONS_Master_Arrive, "Strasbou", 7, 0, 0);
-			break;
-		case 18:
-			goto LABEL_120;
-		case 19:
-			_gameTimeTicksDelta = 1;
-			goto LABEL_70;
-		case 20:
-			goto LABEL_123;
-		case 21:
-			goto LABEL_126;
-		case 22:
-			getCharacterCurrentParams(kCharacterMaster)[4] = 1;
-			break;
-		case 23:
-			getCharacterCurrentParams(kCharacterMaster)[0] = 1;
-			break;
-		default:
-			break;
-		}
+			if (getCharacterCurrentParams(kCharacterMaster)[4] && !getCharacterParams(kCharacterMaster, 8)[1]) {
+				getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 4;
+				MasterCall(&LogicManager::CONS_Master_Depart, "Unschedu", 0, 0, 0);
+				break;
+			}
 
-		break;
-	}
-}
+			// fall through
+		case 4:
+			if (getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] == 4) {
+				getCharacterCurrentParams(kCharacterMaster)[4] = 0;
+			}
 
-void LogicManager::CONS_Master_SecondSleep(CONS_PARAMS) {
-	CharacterCallParams *params = &getCharacter(kCharacterMaster).callParams[getCharacter(kCharacterMaster).currentCall];
-	_engine->getMessageManager()->setMessageHandle(kCharacterMaster, &LogicManager::HAND_Master_SecondSleep);
-	getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall] = 9;
+			if (_gameTime > 1170000 && !getCharacterCurrentParams(kCharacterMaster)[9]) {
+				getCharacterCurrentParams(kCharacterMaster)[9] = 1;
+				_gameProgress[kProgressField18] = 2;
+			}
 
-	params->clear();
+			if (!getCharacterCurrentParams(kCharacterMaster)[0]) {
+				if (_gameTime > 1170000 && !getCharacterCurrentParams(kCharacterMaster)[10]) {
+					getCharacterCurrentParams(kCharacterMaster)[10] = 1;
+					getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 5;
+					MasterCall(&LogicManager::CONS_Master_Arrive, "Chalons", 1, 0, 0);
+					break;
+				}
 
-	fedEx(kCharacterMaster, kCharacterMaster, 12, 0);
-}
+				if (_gameTime > 1173600 && !getCharacterCurrentParams(kCharacterMaster)[11]) {
+					getCharacterCurrentParams(kCharacterMaster)[11] = 1;
+					getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 6;
+					MasterCall(&LogicManager::CONS_Master_Depart, "Chalons", 0, 0, 0);
+					break;
+				}
 
-void LogicManager::HAND_Master_SecondSleep(HAND_PARAMS) {
-	switch (msg->action) {
-	case 12:
-		if (getCharacterParams(kCharacterMaster, 8)[1] || getCharacterParams(kCharacterMaster, 8)[2]) {
-			endDialog(kCharacterMaster);
-			getCharacterParams(kCharacterMaster, 8)[1] = 0;
-			getCharacterParams(kCharacterMaster, 8)[2] = 0;
-		}
+				if (_gameTime > 1228500 && !getCharacterCurrentParams(kCharacterMaster)[12]) {
+					getCharacterCurrentParams(kCharacterMaster)[12] = 1;
+					getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 7;
+					MasterCall(&LogicManager::CONS_Master_Arrive, "BarLeDuc", 2, 0, 0);
+					break;
+				}
 
-		playDialog(kCharacterCath, "MUS008", 16, 0);
+				if (_gameTime > 1231200 && !getCharacterCurrentParams(kCharacterMaster)[13]) {
+					getCharacterCurrentParams(kCharacterMaster)[13] = 1;
+					getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 8;
+					MasterCall(&LogicManager::CONS_Master_Depart, "BarLeDuc", 0, 0, 0);
+					break;
+				}
 
-		_inventorySelectedItemIdx = 0;
-		fadeToBlack();
+				if (_gameTime > 1260000 && !getCharacterCurrentParams(kCharacterMaster)[14]) {
+					getCharacterCurrentParams(kCharacterMaster)[14] = 1;
+					_gameTimeTicksDelta = 1;
+				}
+				if (_gameTime > 1303200 && !getCharacterCurrentParams(kCharacterMaster)[15]) {
+					getCharacterCurrentParams(kCharacterMaster)[15] = 1;
+					getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 9;
+					MasterCall(&LogicManager::CONS_Master_Arrive, "Nancy", 3, 0, 0);
+					break;
+				}
 
-		while (dialogRunning("MUS008")) {
-			_engine->getSoundManager()->soundThread();
-		}
+				if (_gameTime > 1307700 && !getCharacterCurrentParams(kCharacterMaster)[16]) {
+					getCharacterCurrentParams(kCharacterMaster)[16] = 1;
+					getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 10;
+					MasterCall(&LogicManager::CONS_Master_Depart, "Nancy", 0, 0, 0);
+					break;
+				}
 
-		CONS_Master_StartPart2(0, 0, 0, 0);
-		break;
-	default:
-		break;
-	}
-}
+				if (_gameTime > 1335600 && !getCharacterCurrentParams(kCharacterMaster)[17]) {
+					getCharacterCurrentParams(kCharacterMaster)[17] = 1;
+					getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 11;
+					MasterCall(&LogicManager::CONS_Master_Arrive, "Luneville", 4, 0, 0);
+					break;
+				}
 
-void LogicManager::CONS_Master_StartPart2(CONS_PARAMS) {
-	CharacterCallParams *params = &getCharacter(kCharacterMaster).callParams[getCharacter(kCharacterMaster).currentCall];
-	_engine->getMessageManager()->setMessageHandle(kCharacterMaster, &LogicManager::HAND_Master_StartPart2);
-	getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall] = 10;
+				if (_gameTime > 1338300 && !getCharacterCurrentParams(kCharacterMaster)[18]) {
+					getCharacterCurrentParams(kCharacterMaster)[18] = 1;
+					getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 12;
+					MasterCall(&LogicManager::CONS_Master_Depart, "Luneville", 0, 0, 0);
+					break;
+				}
 
-	params->clear();
+				if (_gameTime > 1359900 && !getCharacterCurrentParams(kCharacterMaster)[19]) {
+					getCharacterCurrentParams(kCharacterMaster)[19] = 1;
+					getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 13;
+					MasterCall(&LogicManager::CONS_Master_Arrive, "Avricourt", 5, 0, 0);
+					break;
+				}
 
-	fedEx(kCharacterMaster, kCharacterMaster, 12, 0);
-}
+				if (_gameTime > 1363500 && !getCharacterCurrentParams(kCharacterMaster)[20]) {
+					getCharacterCurrentParams(kCharacterMaster)[20] = 1;
+					getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 14;
+					MasterCall(&LogicManager::CONS_Master_Depart, "Avricourt", 0, 0, 0);
+					break;
+				}
 
-void LogicManager::HAND_Master_StartPart2(HAND_PARAMS) {
-	switch (msg->action) {
-	case 12:
-		if (_gameProgress[kProgressChapter] != 2) {
-			_gameProgress[kProgressChapter] = 2;
-			makeAllJump(2);
-		}
+				if (_gameTime > 1367100 && !getCharacterCurrentParams(kCharacterMaster)[21]) {
+					getCharacterCurrentParams(kCharacterMaster)[21] = 1;
+					getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 15;
+					MasterCall(&LogicManager::CONS_Master_Arrive, "DeutschA", 6, 0, 0);
+					break;
+				}
 
-		_gameTime = 1750500;
-		_gameTimeTicksDelta = 5;
+				if (_gameTime > 1370700 && !getCharacterCurrentParams(kCharacterMaster)[22]) {
+					getCharacterCurrentParams(kCharacterMaster)[22] = 1;
+					getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 16;
+					MasterCall(&LogicManager::CONS_Master_Depart, "DeutschA", 0, 0, 0);
+					break;
+				}
 
-		getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 1;
+				if (_gameTime > 1490400 && !getCharacterCurrentParams(kCharacterMaster)[23]) {
+					getCharacterCurrentParams(kCharacterMaster)[23] = 1;
+					getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 17;
+					MasterCall(&LogicManager::CONS_Master_SaveGame, 1, 0, 0, 0);
+					break;
+				}
+			}
 
-		MasterCall(&LogicManager::CONS_Master_SaveGame, 1, 0, 0, 0);
-		break;
-	case 18:
-		if (getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] == 1) {
-			if (_engine->getArchiveManager()->lockCD(2)) {
-				loadTrain(2);
-				CONS_Master_InitPart2(0, 0, 0, 0);
-			} else {
-				_engine->getMenu()->doEgg(false, 0, 0);
+			if (_gameTime > 1493100 && !getCharacterCurrentParams(kCharacterMaster)[24]) {
+				getCharacterCurrentParams(kCharacterMaster)[24] = 1;
+				getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 19;
+				MasterCall(&LogicManager::CONS_Master_Depart, "Strasbou", 0, 0, 0);
+				break;
 			}
-		}
 
-		break;
-	default:
-		break;
-	}
-}
+			if (_gameTime > 1539000 && !getCharacterCurrentParams(kCharacterMaster)[25]) {
+				getCharacterCurrentParams(kCharacterMaster)[25] = 1;
+				getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 20;
+				MasterCall(&LogicManager::CONS_Master_Arrive, "BadenOos", 8, 0, 0);
+				break;
+			}
 
-void LogicManager::CONS_Master_InitPart2(CONS_PARAMS) {
-	CharacterCallParams *params = &getCharacter(kCharacterMaster).callParams[getCharacter(kCharacterMaster).currentCall];
-	_engine->getMessageManager()->setMessageHandle(kCharacterMaster, &LogicManager::HAND_Master_InitPart2);
-	getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall] = 11;
+			if (_gameTime > 1541700 && !getCharacterCurrentParams(kCharacterMaster)[26]) {
+				getCharacterCurrentParams(kCharacterMaster)[26] = 1;
+				getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 21;
+				MasterCall(&LogicManager::CONS_Master_Depart, "BadenOos", 0, 0, 0);
+				break;
+			}
 
-	params->clear();
+			if (_gameTime > 1674000 && !getCharacterCurrentParams(kCharacterMaster)[27]) {
+				getCharacterCurrentParams(kCharacterMaster)[27] = 1;
+				CONS_Master_SecondSleep(0, 0, 0, 0);
+			}
 
-	fedEx(kCharacterMaster, kCharacterMaster, 12, 0);
-}
+			break;
+		case 5:
+			if (_gameTime > 1173600 && !getCharacterCurrentParams(kCharacterMaster)[11]) {
+				getCharacterCurrentParams(kCharacterMaster)[11] = 1;
+				getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 6;
+				MasterCall(&LogicManager::CONS_Master_Depart, "Chalons", 0, 0, 0);
+				break;
+			}
 
-void LogicManager::HAND_Master_InitPart2(HAND_PARAMS) {
-	switch (msg->action) {
-	case 12:
-		_gameProgress[kProgressIsTrainRunning] = 1;
-		setDoor(26, kCharacterCath, 1, 0, 9);
-		setDoor(27, kCharacterCath, 1, 0, 9);
-		_gameProgress[kProgressField18] = 1;
-		giveCathItem(kItemGreenJacket);
+			// fall through
+		case 6:
+			if (_gameTime > 1228500 && !getCharacterCurrentParams(kCharacterMaster)[12]) {
+				getCharacterCurrentParams(kCharacterMaster)[12] = 1;
+				getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 7;
+				MasterCall(&LogicManager::CONS_Master_Arrive, "BarLeDuc", 2, 0, 0);
+				break;
+			}
 
-		_gameInventory[kItemCorpse].location = 0;
-		_gameInventory[kItemCorpse].isPresent = 0;
-		_gameProgress[kProgressJacket] = 2;
-		_gameProgress[kProgressPortrait] = 34;
-		_gameProgress[kProgressEventCorpseMovedFromFloor] = 1;
+			// fall through
+		case 7:
+			if (_gameTime > 1231200 && !getCharacterCurrentParams(kCharacterMaster)[13]) {
+				getCharacterCurrentParams(kCharacterMaster)[13] = 1;
+				getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 8;
+				MasterCall(&LogicManager::CONS_Master_Depart, "BarLeDuc", 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 8:
+			if (_gameTime > 1260000 && !getCharacterCurrentParams(kCharacterMaster)[14]) {
+				getCharacterCurrentParams(kCharacterMaster)[14] = 1;
+				_gameTimeTicksDelta = 1;
+			}
+
+			if (_gameTime > 1303200 && !getCharacterCurrentParams(kCharacterMaster)[15]) {
+				getCharacterCurrentParams(kCharacterMaster)[15] = 1;
+				getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 9;
+				MasterCall(&LogicManager::CONS_Master_Arrive, "Nancy", 3, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 9:
+			if (_gameTime > 1307700 && !getCharacterCurrentParams(kCharacterMaster)[16]) {
+				getCharacterCurrentParams(kCharacterMaster)[16] = 1;
+				getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 10;
+				MasterCall(&LogicManager::CONS_Master_Depart, "Nancy", 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 10:
+			if (_gameTime > 1335600 && !getCharacterCurrentParams(kCharacterMaster)[17]) {
+				getCharacterCurrentParams(kCharacterMaster)[17] = 1;
+				getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 11;
+				MasterCall(&LogicManager::CONS_Master_Arrive, "Luneville", 4, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 11:
+			if (_gameTime > 1338300 && !getCharacterCurrentParams(kCharacterMaster)[18]) {
+				getCharacterCurrentParams(kCharacterMaster)[18] = 1;
+				getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 12;
+				MasterCall(&LogicManager::CONS_Master_Depart, "Luneville", 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 12:
+			if (_gameTime > 1359900 && !getCharacterCurrentParams(kCharacterMaster)[19]) {
+				getCharacterCurrentParams(kCharacterMaster)[19] = 1;
+				getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 13;
+				MasterCall(&LogicManager::CONS_Master_Arrive, "Avricourt", 5, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 13:
+			if (_gameTime > 1363500 && !getCharacterCurrentParams(kCharacterMaster)[20]) {
+				getCharacterCurrentParams(kCharacterMaster)[20] = 1;
+				getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 14;
+				MasterCall(&LogicManager::CONS_Master_Depart, "Avricourt", 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 14:
+			if (_gameTime > 1367100 && !getCharacterCurrentParams(kCharacterMaster)[21]) {
+				getCharacterCurrentParams(kCharacterMaster)[21] = 1;
+				getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 15;
+				MasterCall(&LogicManager::CONS_Master_Arrive, "DeutschA", 6, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 15:
+			if (_gameTime > 1370700 && !getCharacterCurrentParams(kCharacterMaster)[22]) {
+				getCharacterCurrentParams(kCharacterMaster)[22] = 1;
+				getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 16;
+				MasterCall(&LogicManager::CONS_Master_Depart, "DeutschA", 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 16:
+			if (getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] == 16) {
+				_gameTime = 1424700;
+			}
+
+			if (_gameTime > 1490400 && !getCharacterCurrentParams(kCharacterMaster)[23]) {
+				getCharacterCurrentParams(kCharacterMaster)[23] = 1;
+				getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 17;
+				MasterCall(&LogicManager::CONS_Master_SaveGame, 1, 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 17:
+			if (getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] == 17) {
+				_gameProgress[kProgressField18] = 1;
+				getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 18;
+				MasterCall(&LogicManager::CONS_Master_Arrive, "Strasbou", 7, 0, 0);
+			}
+
+			break;
+		case 18:
+			if (_gameTime > 1493100 && !getCharacterCurrentParams(kCharacterMaster)[24]) {
+				getCharacterCurrentParams(kCharacterMaster)[24] = 1;
+				getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 19;
+				MasterCall(&LogicManager::CONS_Master_Depart, "Strasbou", 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 19:
+			if (getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] == 19) {
+				_gameTimeTicksDelta = 1;
+			}
+
+			if (_gameTime > 1539000 && !getCharacterCurrentParams(kCharacterMaster)[25]) {
+				getCharacterCurrentParams(kCharacterMaster)[25] = 1;
+				getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 20;
+				MasterCall(&LogicManager::CONS_Master_Arrive, "BadenOos", 8, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 20:
+			if (_gameTime > 1541700 && !getCharacterCurrentParams(kCharacterMaster)[26]) {
+				getCharacterCurrentParams(kCharacterMaster)[26] = 1;
+				getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 21;
+				MasterCall(&LogicManager::CONS_Master_Depart, "BadenOos", 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 21:
+			if (_gameTime > 1674000 && !getCharacterCurrentParams(kCharacterMaster)[27]) {
+				getCharacterCurrentParams(kCharacterMaster)[27] = 1;
+				CONS_Master_SecondSleep(0, 0, 0, 0);
+			}
+
+			break;
+		case 22:
+			getCharacterCurrentParams(kCharacterMaster)[4] = 1;
+			break;
+		case 23:
+			getCharacterCurrentParams(kCharacterMaster)[0] = 1;
+			break;
+		default:
+			break;
+		}
+
+		break;
+	}
+}
+
+void LogicManager::CONS_Master_SecondSleep(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterMaster).callParams[getCharacter(kCharacterMaster).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterMaster, &LogicManager::HAND_Master_SecondSleep);
+	getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall] = 9;
+
+	params->clear();
+
+	fedEx(kCharacterMaster, kCharacterMaster, 12, 0);
+}
+
+void LogicManager::HAND_Master_SecondSleep(HAND_PARAMS) {
+	switch (msg->action) {
+	case 12:
+		if (getCharacterParams(kCharacterMaster, 8)[1] || getCharacterParams(kCharacterMaster, 8)[2]) {
+			endDialog(kCharacterMaster);
+			getCharacterParams(kCharacterMaster, 8)[1] = 0;
+			getCharacterParams(kCharacterMaster, 8)[2] = 0;
+		}
+
+		playDialog(kCharacterCath, "MUS008", 16, 0);
+
+		_inventorySelectedItemIdx = 0;
+		fadeToBlack();
+
+		while (dialogRunning("MUS008")) {
+			_engine->getSoundManager()->soundThread();
+		}
+
+		CONS_Master_StartPart2(0, 0, 0, 0);
+		break;
+	default:
+		break;
+	}
+}
+
+void LogicManager::CONS_Master_StartPart2(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterMaster).callParams[getCharacter(kCharacterMaster).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterMaster, &LogicManager::HAND_Master_StartPart2);
+	getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall] = 10;
+
+	params->clear();
+
+	fedEx(kCharacterMaster, kCharacterMaster, 12, 0);
+}
+
+void LogicManager::HAND_Master_StartPart2(HAND_PARAMS) {
+	switch (msg->action) {
+	case 12:
+		if (_gameProgress[kProgressChapter] != 2) {
+			_gameProgress[kProgressChapter] = 2;
+			makeAllJump(2);
+		}
+
+		_gameTime = 1750500;
+		_gameTimeTicksDelta = 5;
+
+		getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 1;
+
+		MasterCall(&LogicManager::CONS_Master_SaveGame, 1, 0, 0, 0);
+		break;
+	case 18:
+		if (getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] == 1) {
+			if (_engine->getArchiveManager()->lockCD(2)) {
+				loadTrain(2);
+				CONS_Master_InitPart2(0, 0, 0, 0);
+			} else {
+				_engine->getMenu()->doEgg(false, 0, 0);
+			}
+		}
+
+		break;
+	default:
+		break;
+	}
+}
+
+void LogicManager::CONS_Master_InitPart2(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterMaster).callParams[getCharacter(kCharacterMaster).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterMaster, &LogicManager::HAND_Master_InitPart2);
+	getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall] = 11;
+
+	params->clear();
+
+	fedEx(kCharacterMaster, kCharacterMaster, 12, 0);
+}
+
+void LogicManager::HAND_Master_InitPart2(HAND_PARAMS) {
+	switch (msg->action) {
+	case 12:
+		_gameProgress[kProgressIsTrainRunning] = 1;
+		setDoor(26, kCharacterCath, 1, 0, 9);
+		setDoor(27, kCharacterCath, 1, 0, 9);
+		_gameProgress[kProgressField18] = 1;
+		giveCathItem(kItemGreenJacket);
+
+		_gameInventory[kItemCorpse].location = 0;
+		_gameInventory[kItemCorpse].isPresent = 0;
+		_gameProgress[kProgressJacket] = 2;
+		_gameProgress[kProgressPortrait] = 34;
+		_gameProgress[kProgressEventCorpseMovedFromFloor] = 1;
 		_gameProgress[kProgressEventFoundCorpse] = 1;
 		dropItem(kItemBeetle, 3);
 		dropItem(kItem3, 1);
@@ -1069,7 +1367,7 @@ void LogicManager::HAND_Master_MovingDay(HAND_PARAMS) {
 				(getCharacterCurrentParams(kCharacterMaster)[1] = _currentGameSessionTicks + getCharacterCurrentParams(kCharacterMaster)[0],
 				 _currentGameSessionTicks + getCharacterCurrentParams(kCharacterMaster)[0] != 0)) {
 				if (getCharacterCurrentParams(kCharacterMaster)[1] >= _currentGameSessionTicks)
-					return;
+					break;
 
 				getCharacterCurrentParams(kCharacterMaster)[1] = 0x7FFFFFFF;
 			}
@@ -1205,16 +1503,22 @@ void LogicManager::CONS_Master_MovingAfternoon(CONS_PARAMS) {
 void LogicManager::HAND_Master_MovingAfternoon(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
+	{
 		if (_gameProgress[kProgressIsTrainRunning]) {
+			bool skip1 = false;
+
 			if (!getCharacterCurrentParams(kCharacterMaster)[3]) {
 				getCharacterCurrentParams(kCharacterMaster)[3] = _currentGameSessionTicks + getCharacterCurrentParams(kCharacterMaster)[0];
-				if (getCharacterCurrentParams(kCharacterMaster)[3] == 0)
-					goto LABEL_7;
+				if (getCharacterCurrentParams(kCharacterMaster)[3] == 0) {
+					skip1 = true;
+				}
 			}
 
-			if (getCharacterCurrentParams(kCharacterMaster)[3] < _currentGameSessionTicks) {
-				getCharacterCurrentParams(kCharacterMaster)[3] = 0x7FFFFFFF;
-			LABEL_7:
+			if (skip1 || getCharacterCurrentParams(kCharacterMaster)[3] < _currentGameSessionTicks) {
+				if (!skip1) {
+					getCharacterCurrentParams(kCharacterMaster)[3] = 0x7FFFFFFF;
+				}
+
 				switch (rnd(5)) {
 				case 0:
 					playDialog(0, "ZFX1005", rnd(15) + 2, 0);
@@ -1240,16 +1544,20 @@ void LogicManager::HAND_Master_MovingAfternoon(HAND_PARAMS) {
 			}
 		}
 
+		bool skip2 = false;
+
 		if (!getCharacterCurrentParams(kCharacterMaster)[4]) {
 			getCharacterCurrentParams(kCharacterMaster)[4] = _currentGameSessionTicks + getCharacterCurrentParams(kCharacterMaster)[1];
 			if (getCharacterCurrentParams(kCharacterMaster)[4] == 0) {
-				goto LABEL_18;
+				skip2 = true;
 			}
 		}
 
-		if (getCharacterCurrentParams(kCharacterMaster)[4] < _currentGameSessionTicks) {
-			getCharacterCurrentParams(kCharacterMaster)[4] = 0x7FFFFFFF;
-		LABEL_18:
+		if (skip2 || getCharacterCurrentParams(kCharacterMaster)[4] < _currentGameSessionTicks) {
+			if (!skip2) {
+				getCharacterCurrentParams(kCharacterMaster)[4] = 0x7FFFFFFF;
+			}
+
 			switch (rnd(2)) {
 			case 0:
 				playDialog(0, "ZFX1008", rnd(15) + 2, 0);
@@ -1264,75 +1572,77 @@ void LogicManager::HAND_Master_MovingAfternoon(HAND_PARAMS) {
 			getCharacterCurrentParams(kCharacterMaster)[4] = 0;
 		}
 
-		if (_gameTime <= 1982700 || getCharacterCurrentParams(kCharacterMaster)[5]) {
-		LABEL_49:
-			if (_gameTime <= 1989900 || getCharacterCurrentParams(kCharacterMaster)[6]) {
-			LABEL_52:
-				if (_gameTime <= 2047500 || getCharacterCurrentParams(kCharacterMaster)[7]) {
-				LABEL_55:
-					if (_gameTime <= 2052900 || getCharacterCurrentParams(kCharacterMaster)[8]) {
-					LABEL_58:
-						if (_gameTime <= 2073600 || getCharacterCurrentParams(kCharacterMaster)[9]) {
-						LABEL_61:
-							if (_gameTime <= 2079900 || getCharacterCurrentParams(kCharacterMaster)[10]) {
-							LABEL_64:
-								if (_gameTime <= 2099700 || getCharacterCurrentParams(kCharacterMaster)[11]) {
-								LABEL_67:
-									if (_gameTime <= 2105100 || getCharacterCurrentParams(kCharacterMaster)[12]) {
-									LABEL_70:
-										if (_gameTime > 2187000 && !getCharacterCurrentParams(kCharacterMaster)[13]) {
-											getCharacterCurrentParams(kCharacterMaster)[13] = 1;
-											_gameTimeTicksDelta = 5;
-										}
-										if (_gameTime > 2268000 && !getCharacterCurrentParams(kCharacterMaster)[14]) {
-											getCharacterCurrentParams(kCharacterMaster)[14] = 1;
-											getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 9;
-											MasterCall(&LogicManager::CONS_Master_Arrive, "Vienna", 13, 0, 0);
-										}
-									} else {
-										getCharacterCurrentParams(kCharacterMaster)[12] = 1;
-										getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 8;
-										MasterCall(&LogicManager::CONS_Master_Depart, "Linz", 0, 0, 0);
-									}
-								} else {
-									getCharacterCurrentParams(kCharacterMaster)[11] = 1;
-									getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 7;
-									MasterCall(&LogicManager::CONS_Master_Arrive, "Linz", 12, 0, 0);
-								}
-							} else {
-								getCharacterCurrentParams(kCharacterMaster)[10] = 1;
-								getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 6;
-								MasterCall(&LogicManager::CONS_Master_Depart, "Wels", 0, 0, 0);
-							}
-						} else {
-							getCharacterCurrentParams(kCharacterMaster)[9] = 1;
-							getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 5;
-							MasterCall(&LogicManager::CONS_Master_Arrive, "Wels", 11, 0, 0);
-						}
-					} else {
-						getCharacterCurrentParams(kCharacterMaster)[8] = 1;
-						getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 4;
-						MasterCall(&LogicManager::CONS_Master_Depart, "Attnang", 0, 0, 0);
-					}
-				} else {
-					getCharacterCurrentParams(kCharacterMaster)[7] = 1;
-					getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 3;
-					MasterCall(&LogicManager::CONS_Master_Arrive, "Attnang", 10, 0, 0);
-				}
-			} else {
-				getCharacterCurrentParams(kCharacterMaster)[6] = 1;
-				getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 2;
-				MasterCall(&LogicManager::CONS_Master_Depart, "Salzburg", 0, 0, 0);
-			}
-		} else {
+		if (_gameTime > 1982700 && !getCharacterCurrentParams(kCharacterMaster)[5]) {
 			getCharacterCurrentParams(kCharacterMaster)[5] = 1;
 			getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 1;
 			MasterCall(&LogicManager::CONS_Master_Arrive, "Salzburg", 9, 0, 0);
+			break;
 		}
 
-		break;
-	case 2:
-		if (getCharacterParams(kCharacterMaster, 8)[1]) {
+		if (_gameTime > 1989900 && !getCharacterCurrentParams(kCharacterMaster)[6]) {
+			getCharacterCurrentParams(kCharacterMaster)[6] = 1;
+			getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 2;
+			MasterCall(&LogicManager::CONS_Master_Depart, "Salzburg", 0, 0, 0);
+			break;
+		}
+
+		if (_gameTime > 2047500 && !getCharacterCurrentParams(kCharacterMaster)[7]) {
+			getCharacterCurrentParams(kCharacterMaster)[7] = 1;
+			getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 3;
+			MasterCall(&LogicManager::CONS_Master_Arrive, "Attnang", 10, 0, 0);
+			break;
+		}
+
+		if (_gameTime > 2052900 && !getCharacterCurrentParams(kCharacterMaster)[8]) {
+			getCharacterCurrentParams(kCharacterMaster)[8] = 1;
+			getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 4;
+			MasterCall(&LogicManager::CONS_Master_Depart, "Attnang", 0, 0, 0);
+			break;
+		}
+
+		if (_gameTime > 2073600 && !getCharacterCurrentParams(kCharacterMaster)[9]) {
+			getCharacterCurrentParams(kCharacterMaster)[9] = 1;
+			getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 5;
+			MasterCall(&LogicManager::CONS_Master_Arrive, "Wels", 11, 0, 0);
+			break;
+		}
+
+		if (_gameTime > 2079900 && !getCharacterCurrentParams(kCharacterMaster)[10]) {
+			getCharacterCurrentParams(kCharacterMaster)[10] = 1;
+			getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 6;
+			MasterCall(&LogicManager::CONS_Master_Depart, "Wels", 0, 0, 0);
+			break;
+		}
+
+		if (_gameTime > 2099700 && !getCharacterCurrentParams(kCharacterMaster)[11]) {
+			getCharacterCurrentParams(kCharacterMaster)[11] = 1;
+			getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 7;
+			MasterCall(&LogicManager::CONS_Master_Arrive, "Linz", 12, 0, 0);
+			break;
+		}
+
+		if (_gameTime > 2105100 && !getCharacterCurrentParams(kCharacterMaster)[12]) {
+			getCharacterCurrentParams(kCharacterMaster)[12] = 1;
+			getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 8;
+			MasterCall(&LogicManager::CONS_Master_Depart, "Linz", 0, 0, 0);
+			break;
+		}
+
+		if (_gameTime > 2187000 && !getCharacterCurrentParams(kCharacterMaster)[13]) {
+			getCharacterCurrentParams(kCharacterMaster)[13] = 1;
+			_gameTimeTicksDelta = 5;
+		}
+
+		if (_gameTime > 2268000 && !getCharacterCurrentParams(kCharacterMaster)[14]) {
+			getCharacterCurrentParams(kCharacterMaster)[14] = 1;
+			getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 9;
+			MasterCall(&LogicManager::CONS_Master_Arrive, "Vienna", 13, 0, 0);
+		}
+
+		break;
+	}
+	case 2:
+		if (getCharacterParams(kCharacterMaster, 8)[1]) {
 			send(kCharacterMaster, kCharacterClerk, 191350523, 0);
 			if (getCharacter(kCharacterCath).characterPosition.location == 2) {
 				if (cathOutHisWindow()) {
@@ -1391,21 +1701,81 @@ void LogicManager::HAND_Master_MovingAfternoon(HAND_PARAMS) {
 	case 18:
 		switch (getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8]) {
 		case 1:
-			goto LABEL_49;
+			if (_gameTime > 1989900 && !getCharacterCurrentParams(kCharacterMaster)[6]) {
+				getCharacterCurrentParams(kCharacterMaster)[6] = 1;
+				getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 2;
+				MasterCall(&LogicManager::CONS_Master_Depart, "Salzburg", 0, 0, 0);
+				break;
+			}
+
+			// fall through
 		case 2:
-			goto LABEL_52;
+			if (_gameTime > 2047500 && !getCharacterCurrentParams(kCharacterMaster)[7]) {
+				getCharacterCurrentParams(kCharacterMaster)[7] = 1;
+				getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 3;
+				MasterCall(&LogicManager::CONS_Master_Arrive, "Attnang", 10, 0, 0);
+				break;
+			}
+
+			// fall through
 		case 3:
-			goto LABEL_55;
+			if (_gameTime > 2052900 && !getCharacterCurrentParams(kCharacterMaster)[8]) {
+				getCharacterCurrentParams(kCharacterMaster)[8] = 1;
+				getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 4;
+				MasterCall(&LogicManager::CONS_Master_Depart, "Attnang", 0, 0, 0);
+				break;
+			}
+
+			// fall through
 		case 4:
-			goto LABEL_58;
+			if (_gameTime > 2073600 && !getCharacterCurrentParams(kCharacterMaster)[9]) {
+				getCharacterCurrentParams(kCharacterMaster)[9] = 1;
+				getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 5;
+				MasterCall(&LogicManager::CONS_Master_Arrive, "Wels", 11, 0, 0);
+				break;
+			}
+
+			// fall through
 		case 5:
-			goto LABEL_61;
+			if (_gameTime > 2079900 && !getCharacterCurrentParams(kCharacterMaster)[10]) {
+				getCharacterCurrentParams(kCharacterMaster)[10] = 1;
+				getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 6;
+				MasterCall(&LogicManager::CONS_Master_Depart, "Wels", 0, 0, 0);
+				break;
+			}
+
+			// fall through
 		case 6:
-			goto LABEL_64;
+			if (_gameTime > 2099700 && !getCharacterCurrentParams(kCharacterMaster)[11]) {
+				getCharacterCurrentParams(kCharacterMaster)[11] = 1;
+				getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 7;
+				MasterCall(&LogicManager::CONS_Master_Arrive, "Linz", 12, 0, 0);
+				break;
+			}
+
+			// fall through
 		case 7:
-			goto LABEL_67;
+			if (_gameTime > 2105100 && !getCharacterCurrentParams(kCharacterMaster)[12]) {
+				getCharacterCurrentParams(kCharacterMaster)[12] = 1;
+				getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 8;
+				MasterCall(&LogicManager::CONS_Master_Depart, "Linz", 0, 0, 0);
+				break;
+			}
+
+			// fall through
 		case 8:
-			goto LABEL_70;
+			if (_gameTime > 2187000 && !getCharacterCurrentParams(kCharacterMaster)[13]) {
+				getCharacterCurrentParams(kCharacterMaster)[13] = 1;
+				_gameTimeTicksDelta = 5;
+			}
+
+			if (_gameTime > 2268000 && !getCharacterCurrentParams(kCharacterMaster)[14]) {
+				getCharacterCurrentParams(kCharacterMaster)[14] = 1;
+				getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 9;
+				MasterCall(&LogicManager::CONS_Master_Arrive, "Vienna", 13, 0, 0);
+			}
+
+			break;
 		case 9:
 			getCharacterCurrentParams(kCharacterMaster)[2] = 1;
 			break;
@@ -1623,269 +1993,109 @@ void LogicManager::CONS_Master_MovingSecondNight(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Master_MovingSecondNight(HAND_PARAMS) {
-	if (msg->action > 12) {
-		if (msg->action > 139254416) {
-			if (msg->action > 158610240) {
-				if (msg->action > 190346110) {
-					switch (msg->action) {
-					case 191001984:
-						_gameTime = 2520000;
-						if (whoRunningDialog(kCharacterMaster))
-							endDialog(kCharacterMaster);
-						endGraphics(kCharacterMaster);
-						takeCathItem(kItemTelegram);
-						_gameTimeTicksDelta = 5;
-						getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 10;
-						MasterCall(&LogicManager::CONS_Master_SaveGame, 2, kEventDefuseBomb, 0, 0);
-						break;
-					case 201959744:
-						if (whoRunningDialog(kCharacterMaster))
-							endDialog(kCharacterMaster);
-						playDialog(kCharacterClerk, "ZFX4001", 16, 0);
-						endGame(0, 0, 0, 1);
-						break;
-					case 225367984:
-						getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 9;
-						MasterCall(&LogicManager::CONS_Master_SaveGame, 2, kEventCathDefusingBomb, 0, 0);
-						break;
-					}
-				} else if (msg->action == 190346110) {
-					_gameProgress[6] = 3;
-					getCharacterCurrentParams(kCharacterMaster)[0] = 1;
-					if (getCharacterParams(kCharacterMaster, 8)[1] || getCharacterParams(kCharacterMaster, 8)[2]) {
-						endDialog(kCharacterMaster);
-						getCharacterParams(kCharacterMaster, 8)[1] = 0;
-						getCharacterParams(kCharacterMaster, 8)[2] = 0;
-					}
-					fadeToBlack();
-					playDialog(0, "MUS008", 16, 0);
-					_inventorySelectedItemIdx = 0;
-					fadeToBlack();
-					while (dialogRunning("MUS008"))
-						_engine->getSoundManager()->soundThread();
-					if (cathHasItem(kItemBomb)) {
-						forceJump(kCharacterAlexei,   &LogicManager::CONS_Alexei_Dead);
-						forceJump(kCharacterAnna,     &LogicManager::CONS_Anna_Sulking);
-						forceJump(kCharacterAugust,   &LogicManager::CONS_August_Asleep4);
-						forceJump(kCharacterCond1,    &LogicManager::CONS_Cond1_OnDuty4);
-						forceJump(kCharacterCond2,    &LogicManager::CONS_Cond2_OnDuty4);
-						forceJump(kCharacterWaiter1,  &LogicManager::CONS_Waiter1_Serving4);
-						forceJump(kCharacterWaiter2,  &LogicManager::CONS_Waiter2_Serving4);
-						forceJump(kCharacterHeadWait, &LogicManager::CONS_HeadWait_InPart4);
-						forceJump(kCharacterTrainM,   &LogicManager::CONS_TrainM_InOffice4);
-						forceJump(kCharacterTatiana,  &LogicManager::CONS_Tatiana_Asleep4);
-						forceJump(kCharacterAbbot,    &LogicManager::CONS_Abbot_Asleep4);
-						forceJump(kCharacterMilos,    &LogicManager::CONS_Milos_EndPart4);
-						forceJump(kCharacterVesna,    &LogicManager::CONS_Vesna_EndPart4);
-						forceJump(kCharacterIvo,      &LogicManager::CONS_Ivo_EndPart4);
-						forceJump(kCharacterSalko,    &LogicManager::CONS_Salko_EndPart4);
-						forceJump(kCharacterMadame,   &LogicManager::CONS_Madame_Asleep4);
-						forceJump(kCharacterMonsieur, &LogicManager::CONS_Monsieur_Asleep4);
-						forceJump(kCharacterRebecca,  &LogicManager::CONS_Rebecca_Asleep4);
-						forceJump(kCharacterSophie,   &LogicManager::CONS_Sophie_Asleep4);
-						forceJump(kCharacterYasmin,   &LogicManager::CONS_Yasmin_Asleep4);
-						forceJump(kCharacterHadija,   &LogicManager::CONS_Hadija_Asleep4);
-						forceJump(kCharacterAlouan,   &LogicManager::CONS_Alouan_Asleep4);
-						forceJump(kCharacterMax,      &LogicManager::CONS_Max_InCageFriendly);
-
-						send(kCharacterMaster, kCharacterAnna,     201431954, 0);
-						send(kCharacterMaster, kCharacterCond1,    201431954, 0);
-						send(kCharacterMaster, kCharacterCond2,    201431954, 0);
-						send(kCharacterMaster, kCharacterWaiter1,  201431954, 0);
-						send(kCharacterMaster, kCharacterWaiter2,  201431954, 0);
-						send(kCharacterMaster, kCharacterHeadWait, 201431954, 0);
-						send(kCharacterMaster, kCharacterTrainM,   201431954, 0);
-
-						getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 6;
-						MasterCall(&LogicManager::CONS_Master_SaveGame, 2, kEventTylerCastleDream, 0, 0);
-					} else {
-						_gameTime = 2520000;
-						getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 7;
-						MasterCall(&LogicManager::CONS_Master_SaveGame, 2, kEventTrainExplosionBridge, 0, 0);
-					}
-				} else if (msg->action == 169300225) {
-					if (_gameTime < 2519100)
-						_gameTime = 2519100;
-					getCharacterCurrentParams(kCharacterMaster)[2] = 1;
-					startSeqOtis(kCharacterMaster, "BOMB");
-				}
-			} else if (msg->action == 158610240) {
-				getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 8;
-				MasterCall(&LogicManager::CONS_Master_SaveGame, 1, 0, 0, 0);
-			} else if (msg->action == 156435676) {
-				send(kCharacterMaster, kCharacterTatiana, 169360385, 0);
-				send(kCharacterMaster, kCharacterCond2, 201431954, 0);
-				send(kCharacterMaster, kCharacterTrainM, 201431954, 0);
-				_gameTimeTicksDelta = 1;
-				_gameTime = 2511900;
-				dropItem(kItem2, 1);
-				getCharacter(kCharacterMaster).characterPosition.car = 4;
-				getCharacter(kCharacterMaster).characterPosition.position = 1500;
-				getCharacter(kCharacterMaster).characterPosition.location = 1;
-				playDialog(kCharacterMaster, "ZFX1001", -1, 0);
-			}
-		} else if (msg->action == 139254416) {
-			CONS_Master_StartPart5(0, 0, 0, 0);
-		} else if (msg->action == 18) {
-			switch (getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8]) {
-			case 1:
-				goto LABEL_82;
-			case 2:
-				goto LABEL_85;
-			case 3:
-				goto LABEL_93;
-			case 4:
-				goto LABEL_96;
-			case 5:
-				if (whoRunningDialog(kCharacterMaster))
-					endDialog(kCharacterMaster);
-				playNIS(kEventTrainExplosionBridge);
-				endGame(0, 1, 0, 1);
-				break;
-			case 6:
-				_engine->getSoundManager()->endAmbient();
-				playNIS(kEventTylerCastleDream);
-				_engine->getSoundManager()->startAmbient();
-				_gameProgress[kProgressField18] = 1;
-				bumpCathTylerComp();
-				send(kCharacterMaster, kCharacterTatiana, 169360385, 0);
-				_gameTimeTicksDelta = 1;
-				_gameTime = 2511900;
-				dropItem(kItem2, 1);
-				takeItem(kItem22);
-				getCharacter(kCharacterMaster).characterPosition.car = 4;
-				getCharacter(kCharacterMaster).characterPosition.position = 1500;
-				getCharacter(kCharacterMaster).characterPosition.location = 1;
-				playDialog(kCharacterMaster, "ZFX1001", -1, 0);
-				break;
-			case 7:
-				playNIS(kEventTrainExplosionBridge);
-				endGame(1, 2430000, 0, 1);
-				break;
-			case 8:
-				playDialog(0, "MUS022", -1, 0);
-				if (_gameTime < 2517300)
-					_gameTime = 2517300;
-				break;
-			case 9:
-				playNIS(kEventCathDefusingBomb);
-				bumpCath(kCarRedSleeping, 73, 255);
-				break;
-			case 10:
-				playNIS(kEventDefuseBomb);
-				forceJump(kCharacterAbbot, &LogicManager::CONS_Abbot_AfterBomb);
-				send(kCharacterMaster, kCharacterAnna, 191001984, 0);
-				send(kCharacterMaster, kCharacterCond2, 191001984, 0);
-				takeItem(kItem2);
-				_gameInventory[kItem2].location = 0;
-				getCharacterCurrentParams(kCharacterMaster)[1] = 1;
-				bumpCath(kCarRedSleeping, 2, 255);
-				break;
-			case 11:
-				bumpCath(kCarRedSleeping, 74, 255);
-				playDialog(kCharacterClerk, "ZFX4001", 16, 0);
-				endGame(0, 1, 0, 1);
-				break;
-			default:
-				return;
-			}
-		}
-		return;
-	}
-	if (msg->action == 12) {
-		getCharacterCurrentParams(kCharacterMaster)[3] = 225 * (4 * rnd(5) + 20);
-		getCharacterCurrentParams(kCharacterMaster)[4] = 225 * (4 * rnd(6) + 8);
-		return;
-	}
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
+	{
+		bool skip = false;
 		if (_gameProgress[kProgressIsTrainRunning]) {
 			if (getCharacterCurrentParams(kCharacterMaster)[5] ||
 				(getCharacterCurrentParams(kCharacterMaster)[5] = _currentGameSessionTicks + getCharacterCurrentParams(kCharacterMaster)[3], _currentGameSessionTicks + getCharacterCurrentParams(kCharacterMaster)[3] != 0)) {
-				if (getCharacterCurrentParams(kCharacterMaster)[5] >= _currentGameSessionTicks)
-					goto LABEL_35;
-				getCharacterCurrentParams(kCharacterMaster)[5] = 0x7FFFFFFF;
-			}
-			switch (rnd(5)) {
-			case 0:
-				playDialog(0, "ZFX1005", rnd(15) + 2, 0);
-				break;
-			case 1:
-				playDialog(0, "ZFX1006", rnd(15) + 2, 0);
-				break;
-			case 2:
-				playDialog(0, "ZFX1007", rnd(15) + 2, 0);
-				break;
-			case 3:
-				playDialog(0, "ZFX1007A", rnd(15) + 2, 0);
-				break;
-			case 4:
-				playDialog(0, "ZFX1007B", rnd(15) + 2, 0);
-				break;
-			default:
-				break;
+				if (getCharacterCurrentParams(kCharacterMaster)[5] >= _currentGameSessionTicks) {
+					skip = true;
+				}
+
+				if (!skip) {
+					getCharacterCurrentParams(kCharacterMaster)[5] = 0x7FFFFFFF;
+				}
 			}
 
-			getCharacterCurrentParams(kCharacterMaster)[3] = 225 * (4 * rnd(5) + 20);
-			getCharacterCurrentParams(kCharacterMaster)[5] = 0;
+			if (!skip) {
+				switch (rnd(5)) {
+				case 0:
+					playDialog(0, "ZFX1005", rnd(15) + 2, 0);
+					break;
+				case 1:
+					playDialog(0, "ZFX1006", rnd(15) + 2, 0);
+					break;
+				case 2:
+					playDialog(0, "ZFX1007", rnd(15) + 2, 0);
+					break;
+				case 3:
+					playDialog(0, "ZFX1007A", rnd(15) + 2, 0);
+					break;
+				case 4:
+					playDialog(0, "ZFX1007B", rnd(15) + 2, 0);
+					break;
+				default:
+					break;
+				}
+
+				getCharacterCurrentParams(kCharacterMaster)[3] = 225 * (4 * rnd(5) + 20);
+				getCharacterCurrentParams(kCharacterMaster)[5] = 0;
+			}
 		}
-	LABEL_35:
+
 		if (getCharacterCurrentParams(kCharacterMaster)[6] ||
 			(getCharacterCurrentParams(kCharacterMaster)[6] = _currentGameSessionTicks + getCharacterCurrentParams(kCharacterMaster)[4], _currentGameSessionTicks + getCharacterCurrentParams(kCharacterMaster)[4] != 0)) {
 			if (getCharacterCurrentParams(kCharacterMaster)[6] >= _currentGameSessionTicks) {
-			LABEL_45:
 				if (_gameTime > 2381400 && !getCharacterCurrentParams(kCharacterMaster)[7]) {
 					getCharacterCurrentParams(kCharacterMaster)[7] = 1;
 					getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 1;
 					MasterCall(&LogicManager::CONS_Master_Arrive, "Pozsony", 14, 0, 0);
-					return;
+					break;
 				}
-			LABEL_82:
+
 				if (_gameTime > 2386800 && !getCharacterCurrentParams(kCharacterMaster)[8]) {
 					getCharacterCurrentParams(kCharacterMaster)[8] = 1;
 					getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 2;
 					MasterCall(&LogicManager::CONS_Master_Depart, "Pozsony", 0, 0, 0);
-					return;
+					break;
 				}
-			LABEL_85:
+	
 				if (getModel(1) == 1 && _gameTime > 2403000 && !getCharacterCurrentParams(kCharacterMaster)[9]) {
 					getCharacterCurrentParams(kCharacterMaster)[9] = 1;
-					_gameProgress[6] = 2;
+					_gameProgress[kProgressField18] = 2;
 				}
-				if (getCharacterCurrentParams(kCharacterMaster)[0])
-					goto LABEL_96;
-				if (_gameTime > 2416500 && !getCharacterCurrentParams(kCharacterMaster)[10]) {
-					getCharacterCurrentParams(kCharacterMaster)[10] = 1;
-					getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 3;
-					MasterCall(&LogicManager::CONS_Master_Arrive, "Galanta", 15, 0, 0);
-					return;
-				}
-			LABEL_93:
-				if (_gameTime <= 2421900 || getCharacterCurrentParams(kCharacterMaster)[11]) {
-				LABEL_96:
-					if (_gameTime > 2470500 && !getCharacterCurrentParams(kCharacterMaster)[12]) {
-						getCharacterCurrentParams(kCharacterMaster)[12] = 1;
-						if (_gameProgress[kProgressField18] == 2)
-							_gameTimeTicksDelta = 1;
+
+				if (!getCharacterCurrentParams(kCharacterMaster)[0]) {
+					if (_gameTime > 2416500 && !getCharacterCurrentParams(kCharacterMaster)[10]) {
+						getCharacterCurrentParams(kCharacterMaster)[10] = 1;
+						getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 3;
+						MasterCall(&LogicManager::CONS_Master_Arrive, "Galanta", 15, 0, 0);
+						break;
 					}
-					if (_gameTime > 2506500 && !getCharacterCurrentParams(kCharacterMaster)[13]) {
-						getCharacterCurrentParams(kCharacterMaster)[13] = 1;
-						if (_gameProgress[kProgressField18] == 2)
-							_gameProgress[kProgressField18] = 1;
+
+					if (_gameTime > 2421900 && !getCharacterCurrentParams(kCharacterMaster)[11]) {
+						getCharacterCurrentParams(kCharacterMaster)[11] = 1;
+						getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 4;
+						MasterCall(&LogicManager::CONS_Master_Depart, "Galanta", 0, 0, 0);
+						break;
 					}
-					if (_gameTime > 2520000 && !getCharacterCurrentParams(kCharacterMaster)[14]) {
-						getCharacterCurrentParams(kCharacterMaster)[14] = 1;
-						if (!getCharacterCurrentParams(kCharacterMaster)[1] && !getCharacterCurrentParams(kCharacterMaster)[2]) {
-							getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 5;
-							MasterCall(&LogicManager::CONS_Master_SaveGame, 2, kEventTrainExplosionBridge, 0, 0);
-						}
+				}
+
+				if (_gameTime > 2470500 && !getCharacterCurrentParams(kCharacterMaster)[12]) {
+					getCharacterCurrentParams(kCharacterMaster)[12] = 1;
+					if (_gameProgress[kProgressField18] == 2)
+						_gameTimeTicksDelta = 1;
+				}
+
+				if (_gameTime > 2506500 && !getCharacterCurrentParams(kCharacterMaster)[13]) {
+					getCharacterCurrentParams(kCharacterMaster)[13] = 1;
+					if (_gameProgress[kProgressField18] == 2)
+						_gameProgress[kProgressField18] = 1;
+				}
+
+				if (_gameTime > 2520000 && !getCharacterCurrentParams(kCharacterMaster)[14]) {
+					getCharacterCurrentParams(kCharacterMaster)[14] = 1;
+					if (!getCharacterCurrentParams(kCharacterMaster)[1] && !getCharacterCurrentParams(kCharacterMaster)[2]) {
+						getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 5;
+						MasterCall(&LogicManager::CONS_Master_SaveGame, 2, kEventTrainExplosionBridge, 0, 0);
 					}
-				} else {
-					getCharacterCurrentParams(kCharacterMaster)[11] = 1;
-					getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 4;
-					MasterCall(&LogicManager::CONS_Master_Depart, "Galanta", 0, 0, 0);
 				}
-				return;
+
+				break;
 			}
+
 			getCharacterCurrentParams(kCharacterMaster)[6] = 0x7FFFFFFF;
 		}
 
@@ -1901,64 +2111,374 @@ void LogicManager::HAND_Master_MovingSecondNight(HAND_PARAMS) {
 
 		getCharacterCurrentParams(kCharacterMaster)[4] = 225 * (4 * rnd(6) + 8);
 		getCharacterCurrentParams(kCharacterMaster)[6] = 0;
-		goto LABEL_45;
-	}
-	if (msg->action != 2) {
-		if (msg->action == 3) {
-			endGraphics(kCharacterMaster);
-			getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 11;
-			MasterCall(&LogicManager::CONS_Master_SaveGame, 1, 0, 0, 0);
+
+		if (_gameTime > 2381400 && !getCharacterCurrentParams(kCharacterMaster)[7]) {
+			getCharacterCurrentParams(kCharacterMaster)[7] = 1;
+			getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 1;
+			MasterCall(&LogicManager::CONS_Master_Arrive, "Pozsony", 14, 0, 0);
+			break;
 		}
-		return;
-	}
-	if (getCharacterParams(kCharacterMaster, 8)[1]) {
-		send(kCharacterMaster, kCharacterClerk, 191350523, 0);
-		if (getCharacter(kCharacterCath).characterPosition.location == 2) {
-			if (cathOutHisWindow()) {
-				bumpCath(kCarGreenSleeping, 49, 255);
-				_engine->getSoundManager()->startAmbient();
-				_engine->getSoundManager()->startSteam(getCharacterParams(kCharacterMaster, 8)[3]);
-				getCharacterParams(kCharacterMaster, 8)[1] = 0;
-				return;
+
+		if (_gameTime > 2386800 && !getCharacterCurrentParams(kCharacterMaster)[8]) {
+			getCharacterCurrentParams(kCharacterMaster)[8] = 1;
+			getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 2;
+			MasterCall(&LogicManager::CONS_Master_Depart, "Pozsony", 0, 0, 0);
+			break;
+		}
+
+		if (getModel(1) == 1 && _gameTime > 2403000 && !getCharacterCurrentParams(kCharacterMaster)[9]) {
+			getCharacterCurrentParams(kCharacterMaster)[9] = 1;
+			_gameProgress[kProgressField18] = 2;
+		}
+
+		if (!getCharacterCurrentParams(kCharacterMaster)[0]) {
+			if (_gameTime > 2416500 && !getCharacterCurrentParams(kCharacterMaster)[10]) {
+				getCharacterCurrentParams(kCharacterMaster)[10] = 1;
+				getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 3;
+				MasterCall(&LogicManager::CONS_Master_Arrive, "Galanta", 15, 0, 0);
+				break;
 			}
-			if (cathOutRebeccaWindow()) {
-				bumpCath(kCarRedSleeping, 49, 255);
-			} else {
-				if (getCharacter(kCharacterCath).characterPosition.car < 4 || getCharacter(kCharacterCath).characterPosition.car > 7) {
-					if (!getCharacter(kCharacterCath).characterPosition.car || getCharacter(kCharacterCath).characterPosition.car > 3) {
+
+			if (_gameTime > 2421900 && !getCharacterCurrentParams(kCharacterMaster)[11]) {
+				getCharacterCurrentParams(kCharacterMaster)[11] = 1;
+				getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 4;
+				MasterCall(&LogicManager::CONS_Master_Depart, "Galanta", 0, 0, 0);
+				break;
+			}
+		}
+
+		if (_gameTime > 2470500 && !getCharacterCurrentParams(kCharacterMaster)[12]) {
+			getCharacterCurrentParams(kCharacterMaster)[12] = 1;
+			if (_gameProgress[kProgressField18] == 2)
+				_gameTimeTicksDelta = 1;
+		}
+
+		if (_gameTime > 2506500 && !getCharacterCurrentParams(kCharacterMaster)[13]) {
+			getCharacterCurrentParams(kCharacterMaster)[13] = 1;
+			if (_gameProgress[kProgressField18] == 2)
+				_gameProgress[kProgressField18] = 1;
+		}
+
+		if (_gameTime > 2520000 && !getCharacterCurrentParams(kCharacterMaster)[14]) {
+			getCharacterCurrentParams(kCharacterMaster)[14] = 1;
+			if (!getCharacterCurrentParams(kCharacterMaster)[1] && !getCharacterCurrentParams(kCharacterMaster)[2]) {
+				getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 5;
+				MasterCall(&LogicManager::CONS_Master_SaveGame, 2, kEventTrainExplosionBridge, 0, 0);
+			}
+		}
+
+		break;
+	}
+	case 2:
+		if (getCharacterParams(kCharacterMaster, 8)[1]) {
+			send(kCharacterMaster, kCharacterClerk, 191350523, 0);
+			if (getCharacter(kCharacterCath).characterPosition.location == 2) {
+				if (cathOutHisWindow()) {
+					bumpCath(kCarGreenSleeping, 49, 255);
+					_engine->getSoundManager()->startAmbient();
+					_engine->getSoundManager()->startSteam(getCharacterParams(kCharacterMaster, 8)[3]);
+					getCharacterParams(kCharacterMaster, 8)[1] = 0;
+					break;
+				}
+
+				if (cathOutRebeccaWindow()) {
+					bumpCath(kCarRedSleeping, 49, 255);
+				} else {
+					if (getCharacter(kCharacterCath).characterPosition.car < 4 || getCharacter(kCharacterCath).characterPosition.car > 7) {
+						if (!getCharacter(kCharacterCath).characterPosition.car || getCharacter(kCharacterCath).characterPosition.car > 3) {
+							_engine->getSoundManager()->startAmbient();
+							_engine->getSoundManager()->startSteam(getCharacterParams(kCharacterMaster, 8)[3]);
+							getCharacterParams(kCharacterMaster, 8)[1] = 0;
+							break;
+						}
+
+						if (checkCathDir(kCarGreenSleeping, 98)) {
+							playDialog(0, "LIB015", -1, 0);
+							bumpCath(kCarGreenSleeping, 71, 255);
+						} else {
+							bumpCath(kCarGreenSleeping, 82, 255);
+						}
+
 						_engine->getSoundManager()->startAmbient();
 						_engine->getSoundManager()->startSteam(getCharacterParams(kCharacterMaster, 8)[3]);
 						getCharacterParams(kCharacterMaster, 8)[1] = 0;
-						return;
+						break;
 					}
 
-					if (checkCathDir(kCarGreenSleeping, 98)) {
-						playDialog(0, "LIB015", -1, 0);
-						bumpCath(kCarGreenSleeping, 71, 255);
-					} else {
-						bumpCath(kCarGreenSleeping, 82, 255);
+					bumpCath(kCarRestaurant, 82, 255);
+				}
+			}
+
+			_engine->getSoundManager()->startAmbient();
+			_engine->getSoundManager()->startSteam(getCharacterParams(kCharacterMaster, 8)[3]);
+			getCharacterParams(kCharacterMaster, 8)[1] = 0;
+			break;
+		}
+
+		if (getCharacterParams(kCharacterMaster, 8)[2]) {
+			_engine->getSoundManager()->startAmbient();
+			getCharacterParams(kCharacterMaster, 8)[2] = 0;
+		} else if (!getCharacterCurrentParams(kCharacterMaster)[1] && !getCharacterCurrentParams(kCharacterMaster)[2]) {
+			playDialog(kCharacterMaster, "ZFX1001", -1, 0);
+		}
+
+		break;
+	case 3:
+		endGraphics(kCharacterMaster);
+		getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 11;
+		MasterCall(&LogicManager::CONS_Master_SaveGame, 1, 0, 0, 0);
+		break;
+	case 12:
+		getCharacterCurrentParams(kCharacterMaster)[3] = 225 * (4 * rnd(5) + 20);
+		getCharacterCurrentParams(kCharacterMaster)[4] = 225 * (4 * rnd(6) + 8);
+		break;
+	case 18:
+		switch (getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8]) {
+		case 1:
+			if (_gameTime > 2386800 && !getCharacterCurrentParams(kCharacterMaster)[8]) {
+				getCharacterCurrentParams(kCharacterMaster)[8] = 1;
+				getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 2;
+				MasterCall(&LogicManager::CONS_Master_Depart, "Pozsony", 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 2:
+			if (getModel(1) == 1 && _gameTime > 2403000 && !getCharacterCurrentParams(kCharacterMaster)[9]) {
+				getCharacterCurrentParams(kCharacterMaster)[9] = 1;
+				_gameProgress[kProgressField18] = 2;
+			}
+
+			if (getCharacterCurrentParams(kCharacterMaster)[0]) {
+				if (_gameTime > 2470500 && !getCharacterCurrentParams(kCharacterMaster)[12]) {
+					getCharacterCurrentParams(kCharacterMaster)[12] = 1;
+					if (_gameProgress[kProgressField18] == 2)
+						_gameTimeTicksDelta = 1;
+				}
+
+				if (_gameTime > 2506500 && !getCharacterCurrentParams(kCharacterMaster)[13]) {
+					getCharacterCurrentParams(kCharacterMaster)[13] = 1;
+					if (_gameProgress[kProgressField18] == 2)
+						_gameProgress[kProgressField18] = 1;
+				}
+
+				if (_gameTime > 2520000 && !getCharacterCurrentParams(kCharacterMaster)[14]) {
+					getCharacterCurrentParams(kCharacterMaster)[14] = 1;
+					if (!getCharacterCurrentParams(kCharacterMaster)[1] && !getCharacterCurrentParams(kCharacterMaster)[2]) {
+						getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 5;
+						MasterCall(&LogicManager::CONS_Master_SaveGame, 2, kEventTrainExplosionBridge, 0, 0);
 					}
-					
-					_engine->getSoundManager()->startAmbient();
-					_engine->getSoundManager()->startSteam(getCharacterParams(kCharacterMaster, 8)[3]);
-					getCharacterParams(kCharacterMaster, 8)[1] = 0;
-					return;
 				}
 
-				bumpCath(kCarRestaurant, 82, 255);
+				break;
+			}
+
+			if (_gameTime > 2416500 && !getCharacterCurrentParams(kCharacterMaster)[10]) {
+				getCharacterCurrentParams(kCharacterMaster)[10] = 1;
+				getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 3;
+				MasterCall(&LogicManager::CONS_Master_Arrive, "Galanta", 15, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 3:
+			if (_gameTime > 2421900 && !getCharacterCurrentParams(kCharacterMaster)[11]) {
+				getCharacterCurrentParams(kCharacterMaster)[11] = 1;
+				getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 4;
+				MasterCall(&LogicManager::CONS_Master_Depart, "Galanta", 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 4:
+			if (_gameTime > 2470500 && !getCharacterCurrentParams(kCharacterMaster)[12]) {
+				getCharacterCurrentParams(kCharacterMaster)[12] = 1;
+				if (_gameProgress[kProgressField18] == 2)
+					_gameTimeTicksDelta = 1;
+			}
+
+			if (_gameTime > 2506500 && !getCharacterCurrentParams(kCharacterMaster)[13]) {
+				getCharacterCurrentParams(kCharacterMaster)[13] = 1;
+				if (_gameProgress[kProgressField18] == 2)
+					_gameProgress[kProgressField18] = 1;
+			}
+
+			if (_gameTime > 2520000 && !getCharacterCurrentParams(kCharacterMaster)[14]) {
+				getCharacterCurrentParams(kCharacterMaster)[14] = 1;
+				if (!getCharacterCurrentParams(kCharacterMaster)[1] && !getCharacterCurrentParams(kCharacterMaster)[2]) {
+					getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 5;
+					MasterCall(&LogicManager::CONS_Master_SaveGame, 2, kEventTrainExplosionBridge, 0, 0);
+				}
 			}
+
+			break;
+		case 5:
+			if (whoRunningDialog(kCharacterMaster))
+				endDialog(kCharacterMaster);
+
+			playNIS(kEventTrainExplosionBridge);
+			endGame(0, 1, 0, true);
+			break;
+		case 6:
+			_engine->getSoundManager()->endAmbient();
+			playNIS(kEventTylerCastleDream);
+			_engine->getSoundManager()->startAmbient();
+			_gameProgress[kProgressField18] = 1;
+			bumpCathTylerComp();
+			send(kCharacterMaster, kCharacterTatiana, 169360385, 0);
+			_gameTimeTicksDelta = 1;
+			_gameTime = 2511900;
+			dropItem(kItem2, 1);
+			takeItem(kItem22);
+			getCharacter(kCharacterMaster).characterPosition.car = 4;
+			getCharacter(kCharacterMaster).characterPosition.position = 1500;
+			getCharacter(kCharacterMaster).characterPosition.location = 1;
+			playDialog(kCharacterMaster, "ZFX1001", -1, 0);
+			break;
+		case 7:
+			playNIS(kEventTrainExplosionBridge);
+			endGame(1, 2430000, 0, true);
+			break;
+		case 8:
+			playDialog(0, "MUS022", -1, 0);
+			if (_gameTime < 2517300)
+				_gameTime = 2517300;
+
+			break;
+		case 9:
+			playNIS(kEventCathDefusingBomb);
+			bumpCath(kCarRedSleeping, 73, 255);
+			break;
+		case 10:
+			playNIS(kEventDefuseBomb);
+			forceJump(kCharacterAbbot, &LogicManager::CONS_Abbot_AfterBomb);
+			send(kCharacterMaster, kCharacterAnna, 191001984, 0);
+			send(kCharacterMaster, kCharacterCond2, 191001984, 0);
+			takeItem(kItem2);
+			_gameInventory[kItem2].location = 0;
+			getCharacterCurrentParams(kCharacterMaster)[1] = 1;
+			bumpCath(kCarRedSleeping, 2, 255);
+			break;
+		case 11:
+			bumpCath(kCarRedSleeping, 74, 255);
+			playDialog(kCharacterClerk, "ZFX4001", 16, 0);
+			endGame(0, 1, 0, true);
+			break;
+		default:
+			break;
 		}
 
-		_engine->getSoundManager()->startAmbient();
-		_engine->getSoundManager()->startSteam(getCharacterParams(kCharacterMaster, 8)[3]);
-		getCharacterParams(kCharacterMaster, 8)[1] = 0;
-		return;
-	}
-	if (getCharacterParams(kCharacterMaster, 8)[2]) {
-		_engine->getSoundManager()->startAmbient();
-		getCharacterParams(kCharacterMaster, 8)[2] = 0;
-	} else if (!getCharacterCurrentParams(kCharacterMaster)[1] && !getCharacterCurrentParams(kCharacterMaster)[2]) {
+		break;
+	case 139254416:
+		CONS_Master_StartPart5(0, 0, 0, 0);
+		break;
+	case 156435676:
+		send(kCharacterMaster, kCharacterTatiana, 169360385, 0);
+		send(kCharacterMaster, kCharacterCond2, 201431954, 0);
+		send(kCharacterMaster, kCharacterTrainM, 201431954, 0);
+		_gameTimeTicksDelta = 1;
+		_gameTime = 2511900;
+		dropItem(kItem2, 1);
+		getCharacter(kCharacterMaster).characterPosition.car = 4;
+		getCharacter(kCharacterMaster).characterPosition.position = 1500;
+		getCharacter(kCharacterMaster).characterPosition.location = 1;
 		playDialog(kCharacterMaster, "ZFX1001", -1, 0);
+		break;
+	case 158610240:
+		getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 8;
+		MasterCall(&LogicManager::CONS_Master_SaveGame, 1, 0, 0, 0);
+		break;
+	case 169300225:
+		if (_gameTime < 2519100)
+			_gameTime = 2519100;
+
+		getCharacterCurrentParams(kCharacterMaster)[2] = 1;
+		startSeqOtis(kCharacterMaster, "BOMB");
+		break;
+	case 190346110:
+		_gameProgress[kProgressField18] = 3;
+		getCharacterCurrentParams(kCharacterMaster)[0] = 1;
+		if (getCharacterParams(kCharacterMaster, 8)[1] || getCharacterParams(kCharacterMaster, 8)[2]) {
+			endDialog(kCharacterMaster);
+			getCharacterParams(kCharacterMaster, 8)[1] = 0;
+			getCharacterParams(kCharacterMaster, 8)[2] = 0;
+		}
+
+		fadeToBlack();
+		playDialog(0, "MUS008", 16, 0);
+		_inventorySelectedItemIdx = 0;
+		fadeToBlack();
+
+		while (dialogRunning("MUS008"))
+			_engine->getSoundManager()->soundThread();
+
+		if (cathHasItem(kItemBomb)) {
+			forceJump(kCharacterAlexei, &LogicManager::CONS_Alexei_Dead);
+			forceJump(kCharacterAnna, &LogicManager::CONS_Anna_Sulking);
+			forceJump(kCharacterAugust, &LogicManager::CONS_August_Asleep4);
+			forceJump(kCharacterCond1, &LogicManager::CONS_Cond1_OnDuty4);
+			forceJump(kCharacterCond2, &LogicManager::CONS_Cond2_OnDuty4);
+			forceJump(kCharacterWaiter1, &LogicManager::CONS_Waiter1_Serving4);
+			forceJump(kCharacterWaiter2, &LogicManager::CONS_Waiter2_Serving4);
+			forceJump(kCharacterHeadWait, &LogicManager::CONS_HeadWait_InPart4);
+			forceJump(kCharacterTrainM, &LogicManager::CONS_TrainM_InOffice4);
+			forceJump(kCharacterTatiana, &LogicManager::CONS_Tatiana_Asleep4);
+			forceJump(kCharacterAbbot, &LogicManager::CONS_Abbot_Asleep4);
+			forceJump(kCharacterMilos, &LogicManager::CONS_Milos_EndPart4);
+			forceJump(kCharacterVesna, &LogicManager::CONS_Vesna_EndPart4);
+			forceJump(kCharacterIvo, &LogicManager::CONS_Ivo_EndPart4);
+			forceJump(kCharacterSalko, &LogicManager::CONS_Salko_EndPart4);
+			forceJump(kCharacterMadame, &LogicManager::CONS_Madame_Asleep4);
+			forceJump(kCharacterMonsieur, &LogicManager::CONS_Monsieur_Asleep4);
+			forceJump(kCharacterRebecca, &LogicManager::CONS_Rebecca_Asleep4);
+			forceJump(kCharacterSophie, &LogicManager::CONS_Sophie_Asleep4);
+			forceJump(kCharacterYasmin, &LogicManager::CONS_Yasmin_Asleep4);
+			forceJump(kCharacterHadija, &LogicManager::CONS_Hadija_Asleep4);
+			forceJump(kCharacterAlouan, &LogicManager::CONS_Alouan_Asleep4);
+			forceJump(kCharacterMax, &LogicManager::CONS_Max_InCageFriendly);
+
+			send(kCharacterMaster, kCharacterAnna, 201431954, 0);
+			send(kCharacterMaster, kCharacterCond1, 201431954, 0);
+			send(kCharacterMaster, kCharacterCond2, 201431954, 0);
+			send(kCharacterMaster, kCharacterWaiter1, 201431954, 0);
+			send(kCharacterMaster, kCharacterWaiter2, 201431954, 0);
+			send(kCharacterMaster, kCharacterHeadWait, 201431954, 0);
+			send(kCharacterMaster, kCharacterTrainM, 201431954, 0);
+
+			getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 6;
+			MasterCall(&LogicManager::CONS_Master_SaveGame, 2, kEventTylerCastleDream, 0, 0);
+		} else {
+			_gameTime = 2520000;
+			getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 7;
+			MasterCall(&LogicManager::CONS_Master_SaveGame, 2, kEventTrainExplosionBridge, 0, 0);
+		}
+
+		break;
+	case 191001984:
+		_gameTime = 2520000;
+
+		if (whoRunningDialog(kCharacterMaster))
+			endDialog(kCharacterMaster);
+
+		endGraphics(kCharacterMaster);
+		takeCathItem(kItemTelegram);
+		_gameTimeTicksDelta = 5;
+		getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 10;
+		MasterCall(&LogicManager::CONS_Master_SaveGame, 2, kEventDefuseBomb, 0, 0);
+		break;
+	case 201959744:
+		if (whoRunningDialog(kCharacterMaster))
+			endDialog(kCharacterMaster);
+
+		playDialog(kCharacterClerk, "ZFX4001", 16, 0);
+		endGame(0, 0, 0, true);
+		break;
+	case 225367984:
+		getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 9;
+		MasterCall(&LogicManager::CONS_Master_SaveGame, 2, kEventCathDefusingBomb, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 


Commit: 714b0e4d76317b78aef8a59f78ae26d43cd42568
    https://github.com/scummvm/scummvm/commit/714b0e4d76317b78aef8a59f78ae26d43cd42568
Author: AndywinXp (andywinxp at gmail.com)
Date: 2025-06-16T23:12:18+02:00

Commit Message:
LASTEXPRESS: Clean up Kahina logic

Changed paths:
    engines/lastexpress/characters/kahina.cpp


diff --git a/engines/lastexpress/characters/kahina.cpp b/engines/lastexpress/characters/kahina.cpp
index cc86959d19e..55e984d6e9a 100644
--- a/engines/lastexpress/characters/kahina.cpp
+++ b/engines/lastexpress/characters/kahina.cpp
@@ -69,19 +69,25 @@ void LogicManager::CONS_Kahina_DebugWalks(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Kahina_DebugWalks(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			getCharacter(kCharacterKahina).characterPosition.position = 0;
-			getCharacter(kCharacterKahina).characterPosition.location = 0;
-			getCharacter(kCharacterKahina).characterPosition.car = kCarGreenSleeping;
-			getCharacterCurrentParams(kCharacterKahina)[0] = 10000;
-		}
-	} else if (walk(kCharacterKahina, kCarGreenSleeping, getCharacterCurrentParams(kCharacterKahina)[0])) {
-		if (getCharacterCurrentParams(kCharacterKahina)[0] == 10000) {
-			getCharacterCurrentParams(kCharacterKahina)[0] = 0;
-		} else {
-			getCharacterCurrentParams(kCharacterKahina)[0] = 10000;
+	switch (msg->action) {
+	case 0:
+		if (walk(kCharacterKahina, kCarGreenSleeping, getCharacterCurrentParams(kCharacterKahina)[0])) {
+			if (getCharacterCurrentParams(kCharacterKahina)[0] == 10000) {
+				getCharacterCurrentParams(kCharacterKahina)[0] = 0;
+			} else {
+				getCharacterCurrentParams(kCharacterKahina)[0] = 10000;
+			}
 		}
+
+		break;
+	case 12:
+		getCharacter(kCharacterKahina).characterPosition.position = 0;
+		getCharacter(kCharacterKahina).characterPosition.location = 0;
+		getCharacter(kCharacterKahina).characterPosition.car = kCarGreenSleeping;
+		getCharacterCurrentParams(kCharacterKahina)[0] = 10000;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -98,12 +104,17 @@ void LogicManager::CONS_Kahina_DoDialog(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Kahina_DoDialog(HAND_PARAMS) {
-	if (msg->action == 2) {
+	switch (msg->action) {
+	case 2:
 		getCharacter(kCharacterKahina).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterKahina, _functionsKahina[getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall]]);
 		fedEx(kCharacterKahina, kCharacterKahina, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		playDialog(kCharacterKahina, (char *)&getCharacterCurrentParams(kCharacterKahina)[0], -1, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -121,22 +132,25 @@ void LogicManager::CONS_Kahina_SaveGame(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Kahina_SaveGame(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			save(
-				kCharacterKahina,
-				getCharacterCurrentParams(kCharacterKahina)[0],
-				getCharacterCurrentParams(kCharacterKahina)[1]
-			);
+	switch (msg->action) {
+	case 0:
+		getCharacter(kCharacterKahina).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterKahina, _functionsKahina[getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall]]);
+		fedEx(kCharacterKahina, kCharacterKahina, 18, 0);
+		break;
+	case 12:
+		save(
+			kCharacterKahina,
+			getCharacterCurrentParams(kCharacterKahina)[0],
+			getCharacterCurrentParams(kCharacterKahina)[1]
+		);
 
-			getCharacter(kCharacterKahina).currentCall--;
-			_engine->getMessageManager()->setMessageHandle(kCharacterKahina, _functionsKahina[getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall]]);
-			fedEx(kCharacterKahina, kCharacterKahina, 18, 0);
-		}
-	} else {
 		getCharacter(kCharacterKahina).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterKahina, _functionsKahina[getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall]]);
 		fedEx(kCharacterKahina, kCharacterKahina, 18, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -153,19 +167,12 @@ void LogicManager::CONS_Kahina_DoWait(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Kahina_DoWait(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 137503360) {
-			getCharacterParams(kCharacterKahina, 8)[1] = 1;
-
-			getCharacter(kCharacterKahina).currentCall--;
-			_engine->getMessageManager()->setMessageHandle(kCharacterKahina, _functionsKahina[getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall]]);
-			fedEx(kCharacterKahina, kCharacterKahina, 18, 0);
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		if (getCharacterCurrentParams(kCharacterKahina)[1] || (getCharacterCurrentParams(kCharacterKahina)[1] = _gameTime + getCharacterCurrentParams(kCharacterKahina)[0],
 															   _gameTime + getCharacterCurrentParams(kCharacterKahina)[0] != 0)) {
 			if (getCharacterCurrentParams(kCharacterKahina)[1] >= _gameTime)
-				return;
+				break;
 
 			getCharacterCurrentParams(kCharacterKahina)[1] = 0x7FFFFFFF;
 		}
@@ -173,6 +180,16 @@ void LogicManager::HAND_Kahina_DoWait(HAND_PARAMS) {
 		getCharacter(kCharacterKahina).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterKahina, _functionsKahina[getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall]]);
 		fedEx(kCharacterKahina, kCharacterKahina, 18, 0);
+		break;
+	case 137503360:
+		getCharacterParams(kCharacterKahina, 8)[1] = 1;
+
+		getCharacter(kCharacterKahina).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterKahina, _functionsKahina[getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall]]);
+		fedEx(kCharacterKahina, kCharacterKahina, 18, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -189,11 +206,12 @@ void LogicManager::CONS_Kahina_DoWaitReal(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Kahina_DoWaitReal(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		if (getCharacterCurrentParams(kCharacterKahina)[1] || (getCharacterCurrentParams(kCharacterKahina)[1] = _currentGameSessionTicks + getCharacterCurrentParams(kCharacterKahina)[0],
 															   _currentGameSessionTicks + getCharacterCurrentParams(kCharacterKahina)[0] != 0)) {
 			if (getCharacterCurrentParams(kCharacterKahina)[1] >= _currentGameSessionTicks)
-				return;
+				break;
 
 			getCharacterCurrentParams(kCharacterKahina)[1] = 0x7FFFFFFF;
 		}
@@ -201,6 +219,9 @@ void LogicManager::HAND_Kahina_DoWaitReal(HAND_PARAMS) {
 		getCharacter(kCharacterKahina).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterKahina, _functionsKahina[getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall]]);
 		fedEx(kCharacterKahina, kCharacterKahina, 18, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -217,56 +238,8 @@ void LogicManager::CONS_Kahina_LookingForCath(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Kahina_LookingForCath(HAND_PARAMS) {
-	if (msg->action > 12) {
-		if (msg->action == 18) {
-			switch (getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8]) {
-			case 1:
-				if (getCharacterParams(kCharacterKahina, 8)[0] || getCharacterParams(kCharacterKahina, 8)[1]) {
-					goto LABEL_30;
-				}
-				goto LABEL_20;
-			case 2:
-			case 3:
-				if (getCharacterParams(kCharacterKahina, 8)[0] || getCharacterParams(kCharacterKahina, 8)[1]) {
-					goto LABEL_30;
-				}
-				endGraphics(kCharacterKahina);
-				getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 4;
-				KahinaCall(&LogicManager::CONS_Kahina_DoWait, 450, 0, 0, 0);
-				break;
-			case 4:
-				if (getCharacterParams(kCharacterKahina, 8)[1])
-					goto LABEL_30;
-				getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 5;
-				KahinaCall(&LogicManager::CONS_Kahina_DoWalkSearchingForCath, 4, 540, 0, 0);
-				break;
-			case 5:
-				if (getCharacterParams(kCharacterKahina, 8)[0] || getCharacterParams(kCharacterKahina, 8)[1]) {
-				LABEL_30:
-					getCharacter(kCharacterKahina).currentCall--;
-					_engine->getMessageManager()->setMessageHandle(kCharacterKahina, _functionsKahina[getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall]]);
-					fedEx(kCharacterKahina, kCharacterKahina, 18, 0);
-				} else {
-				LABEL_20:
-					endGraphics(kCharacterKahina);
-				}
-				break;
-			default:
-				return;
-			}
-		} else if (msg->action == 137503360) {
-			getCharacterParams(kCharacterKahina, 8)[1] = 1;
-
-			getCharacter(kCharacterKahina).currentCall--;
-			_engine->getMessageManager()->setMessageHandle(kCharacterKahina, _functionsKahina[getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall]]);
-			fedEx(kCharacterKahina, kCharacterKahina, 18, 0);
-		}
-	} else if (msg->action == 12) {
-		getCharacterParams(kCharacterKahina, 8)[0] = 0;
-		getCharacterParams(kCharacterKahina, 8)[1] = 0;
-		getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 1;
-		KahinaCall(&LogicManager::CONS_Kahina_DoWalkSearchingForCath, 4, 540, 0, 0);
-	} else if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		if (getCharacterCurrentParams(kCharacterKahina)[0] >= _gameTime || getCharacterCurrentParams(kCharacterKahina)[1]) {
 			if (cathInCorridor(kCarGreenSleeping) || cathInCorridor(kCarRedSleeping)) {
 				if (checkLoc(kCharacterCath, kCarGreenSleeping)) {
@@ -284,6 +257,73 @@ void LogicManager::HAND_Kahina_LookingForCath(HAND_PARAMS) {
 			_engine->getMessageManager()->setMessageHandle(kCharacterKahina, _functionsKahina[getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall]]);
 			fedEx(kCharacterKahina, kCharacterKahina, 18, 0);
 		}
+
+		break;
+	case 12:
+		getCharacterParams(kCharacterKahina, 8)[0] = 0;
+		getCharacterParams(kCharacterKahina, 8)[1] = 0;
+		getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 1;
+		KahinaCall(&LogicManager::CONS_Kahina_DoWalkSearchingForCath, 4, 540, 0, 0);
+		break;
+	case 18:
+		switch (getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8]) {
+		case 1:
+			if (getCharacterParams(kCharacterKahina, 8)[0] || getCharacterParams(kCharacterKahina, 8)[1]) {
+				getCharacter(kCharacterKahina).currentCall--;
+				_engine->getMessageManager()->setMessageHandle(kCharacterKahina, _functionsKahina[getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall]]);
+				fedEx(kCharacterKahina, kCharacterKahina, 18, 0);
+			} else {
+				endGraphics(kCharacterKahina);
+			}
+
+			break;
+		case 2:
+		case 3:
+			if (getCharacterParams(kCharacterKahina, 8)[0] || getCharacterParams(kCharacterKahina, 8)[1]) {
+				getCharacter(kCharacterKahina).currentCall--;
+				_engine->getMessageManager()->setMessageHandle(kCharacterKahina, _functionsKahina[getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall]]);
+				fedEx(kCharacterKahina, kCharacterKahina, 18, 0);
+			} else {
+				endGraphics(kCharacterKahina);
+				getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 4;
+				KahinaCall(&LogicManager::CONS_Kahina_DoWait, 450, 0, 0, 0);
+			}
+
+			break;
+		case 4:
+			if (getCharacterParams(kCharacterKahina, 8)[1]) {
+				getCharacter(kCharacterKahina).currentCall--;
+				_engine->getMessageManager()->setMessageHandle(kCharacterKahina, _functionsKahina[getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall]]);
+				fedEx(kCharacterKahina, kCharacterKahina, 18, 0);
+			} else {
+				getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 5;
+				KahinaCall(&LogicManager::CONS_Kahina_DoWalkSearchingForCath, 4, 540, 0, 0);
+			}
+
+			break;
+		case 5:
+			if (getCharacterParams(kCharacterKahina, 8)[0] || getCharacterParams(kCharacterKahina, 8)[1]) {
+				getCharacter(kCharacterKahina).currentCall--;
+				_engine->getMessageManager()->setMessageHandle(kCharacterKahina, _functionsKahina[getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall]]);
+				fedEx(kCharacterKahina, kCharacterKahina, 18, 0);
+			} else {
+				endGraphics(kCharacterKahina);
+			}
+			break;
+		default:
+			break;
+		}
+
+		break;
+	case 137503360:
+		getCharacterParams(kCharacterKahina, 8)[1] = 1;
+
+		getCharacter(kCharacterKahina).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterKahina, _functionsKahina[getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall]]);
+		fedEx(kCharacterKahina, kCharacterKahina, 18, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -301,37 +341,42 @@ void LogicManager::CONS_Kahina_DoWalkSearchingForCath(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Kahina_DoWalkSearchingForCath(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action != 12) {
-			if (msg->action == 137503360) {
-				getCharacterParams(kCharacterKahina, 8)[1] = 1;
+	switch (msg->action) {
+	case 0:
+		if (walk(kCharacterKahina, getCharacterCurrentParams(kCharacterKahina)[0], getCharacterCurrentParams(kCharacterKahina)[1])) {
+			getCharacter(kCharacterKahina).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterKahina, _functionsKahina[getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall]]);
+			fedEx(kCharacterKahina, kCharacterKahina, 18, 0);
+			break;
+		}
+
+		if (nearChar(kCharacterKahina, kCharacterCath, 1000) && !onLowPlatform(kCharacterCath) && !inComp(kCharacterCath) && !whoOutside(kCharacterCath)) {
+			if (getCharacter(kCharacterKahina).characterPosition.car == kCarGreenSleeping || getCharacter(kCharacterKahina).characterPosition.car == kCarRedSleeping) {
+				getCharacterParams(kCharacterKahina, 8)[0] = 1;
 
 				getCharacter(kCharacterKahina).currentCall--;
 				_engine->getMessageManager()->setMessageHandle(kCharacterKahina, _functionsKahina[getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall]]);
 				fedEx(kCharacterKahina, kCharacterKahina, 18, 0);
 			}
-			return;
+		}
+		break;
+	case 12:
+		if (walk(kCharacterKahina, getCharacterCurrentParams(kCharacterKahina)[0], getCharacterCurrentParams(kCharacterKahina)[1])) {
+			getCharacter(kCharacterKahina).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterKahina, _functionsKahina[getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall]]);
+			fedEx(kCharacterKahina, kCharacterKahina, 18, 0);
 		}
 
-		if (!walk(kCharacterKahina, getCharacterCurrentParams(kCharacterKahina)[0], getCharacterCurrentParams(kCharacterKahina)[1]))
-			return;
-	LABEL_6:
+		break;
+	case 137503360:
+		getCharacterParams(kCharacterKahina, 8)[1] = 1;
 
 		getCharacter(kCharacterKahina).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterKahina, _functionsKahina[getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall]]);
 		fedEx(kCharacterKahina, kCharacterKahina, 18, 0);
-		return;
-	}
-	if (walk(kCharacterKahina, getCharacterCurrentParams(kCharacterKahina)[0], getCharacterCurrentParams(kCharacterKahina)[1]))
-		goto LABEL_6;
-	if (nearChar(kCharacterKahina, kCharacterCath, 1000) && !onLowPlatform(kCharacterCath) && !inComp(kCharacterCath) && !whoOutside(kCharacterCath)) {
-		if (getCharacter(kCharacterKahina).characterPosition.car == kCarGreenSleeping || getCharacter(kCharacterKahina).characterPosition.car == kCarRedSleeping) {
-			getCharacterParams(kCharacterKahina, 8)[0] = 1;
-
-			getCharacter(kCharacterKahina).currentCall--;
-			_engine->getMessageManager()->setMessageHandle(kCharacterKahina, _functionsKahina[getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall]]);
-			fedEx(kCharacterKahina, kCharacterKahina, 18, 0);
-		}
+		break;
+	default:
+		break;
 	}
 }
 
@@ -351,8 +396,13 @@ void LogicManager::CONS_Kahina_DoWalk(CONS_PARAMS) {
 void LogicManager::HAND_Kahina_DoWalk(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
-		if (walk(kCharacterKahina, getCharacterCurrentParams(kCharacterKahina)[0], getCharacterCurrentParams(kCharacterKahina)[1]))
-			goto LABEL_13;
+	case 12:
+		if (walk(kCharacterKahina, getCharacterCurrentParams(kCharacterKahina)[0], getCharacterCurrentParams(kCharacterKahina)[1])) {
+			getCharacter(kCharacterKahina).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterKahina, _functionsKahina[getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall]]);
+			fedEx(kCharacterKahina, kCharacterKahina, 18, 0);
+		}
+
 		break;
 	case 5:
 		if (_gameEvents[kEventKronosConversation] || _gameEvents[kEventKronosConversationFirebird]) {
@@ -361,24 +411,16 @@ void LogicManager::HAND_Kahina_DoWalk(HAND_PARAMS) {
 			} else {
 				playDialog(kCharacterCath, "CAT1019", -1, 0);
 			}
-
 		} else {
 			playCathExcuseMe();
 		}
+
 		break;
 	case 6:
 		playChrExcuseMe(kCharacterKahina, kCharacterCath, 0);
 		break;
-	case 12:
-		if (walk(kCharacterKahina, getCharacterCurrentParams(kCharacterKahina)[0], getCharacterCurrentParams(kCharacterKahina)[1])) {
-		LABEL_13:
-			getCharacter(kCharacterKahina).currentCall--;
-			_engine->getMessageManager()->setMessageHandle(kCharacterKahina, _functionsKahina[getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall]]);
-			fedEx(kCharacterKahina, kCharacterKahina, 18, 0);
-		}
-		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -397,15 +439,20 @@ void LogicManager::CONS_Kahina_DoCorrOtis(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Kahina_DoCorrOtis(HAND_PARAMS) {
-	if (msg->action == 3) {
+	switch (msg->action) {
+	case 3:
 		releaseAtDoor(kCharacterKahina, getCharacterCurrentParams(kCharacterKahina)[3]);
 
 		getCharacter(kCharacterKahina).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterKahina, _functionsKahina[getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall]]);
 		fedEx(kCharacterKahina, kCharacterKahina, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		startSeqOtis(kCharacterKahina, (char *)&getCharacterCurrentParams(kCharacterKahina)[0]);
 		blockAtDoor(kCharacterKahina, getCharacterCurrentParams(kCharacterKahina)[3]);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -420,16 +467,22 @@ void LogicManager::CONS_Kahina_Birth(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Kahina_Birth(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			setDoor(75, kCharacterCath, 1, 10, 9);
-			getCharacter(kCharacterKahina).characterPosition.position = 5000;
-			getCharacter(kCharacterKahina).characterPosition.location = 0;
-			getCharacter(kCharacterKahina).characterPosition.car = kCarKronos;
+	switch (msg->action) {
+	case 0:
+		if (_gameTime > 1062000 && !getCharacterCurrentParams(kCharacterKahina)[0]) {
+			getCharacterCurrentParams(kCharacterKahina)[0] = 1;
+			CONS_Kahina_InSeclusion(0, 0, 0, 0);
 		}
-	} else if (_gameTime > 1062000 && !getCharacterCurrentParams(kCharacterKahina)[0]) {
-		getCharacterCurrentParams(kCharacterKahina)[0] = 1;
-		CONS_Kahina_InSeclusion(0, 0, 0, 0);
+
+		break;
+	case 12:
+		setDoor(75, kCharacterCath, 1, 10, 9);
+		getCharacter(kCharacterKahina).characterPosition.position = 5000;
+		getCharacter(kCharacterKahina).characterPosition.location = 0;
+		getCharacter(kCharacterKahina).characterPosition.car = kCarKronos;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -444,13 +497,19 @@ void LogicManager::CONS_Kahina_InSeclusion(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Kahina_InSeclusion(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		if (_gameTime > 1107000 && !getCharacterCurrentParams(kCharacterKahina)[0] && _gameProgress[kProgressJacket]) {
 			send(kCharacterKahina, kCharacterCond1, 238732837, 0);
 			getCharacterCurrentParams(kCharacterKahina)[0] = 1;
 		}
+
 		if (_gameProgress[kProgressEventMertensChronosInvitation])
 			CONS_Kahina_AwaitingCath(0, 0, 0, 0);
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -465,41 +524,49 @@ void LogicManager::CONS_Kahina_AwaitingCath(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Kahina_AwaitingCath(HAND_PARAMS) {
-	if (msg->action <= 9) {
-		if (msg->action < 8) {
-			if (msg->action == 0 && _gameTime > 1485000 && !getCharacterCurrentParams(kCharacterKahina)[1]) {
-				getCharacterCurrentParams(kCharacterKahina)[1] = 1;
-				CONS_Kahina_CathDone(0, 0, 0, 0);
-			}
-			return;
+	switch (msg->action) {
+	case 0:
+		if (_gameTime > 1485000 && !getCharacterCurrentParams(kCharacterKahina)[1]) {
+			getCharacterCurrentParams(kCharacterKahina)[1] = 1;
+			CONS_Kahina_CathDone(0, 0, 0, 0);
 		}
+
+		break;
+	case 8:
+	case 9:
 		if (msg->action == 8)
 			playDialog(0, "LIB012", -1, 0);
+
 		if (!_gameEvents[kEventKronosGoingToInvitation]) {
 			getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 1;
 			KahinaCall(&LogicManager::CONS_Kahina_SaveGame, 2, kEventKronosGoingToInvitation, 0, 0);
-			return;
+			break;
 		}
+
 		if (msg->action == 9)
 			playDialog(0, "LIB014", -1, 0);
-	LABEL_21:
+
 		bumpCath(kCarKronos, 80, 255);
 		send(kCharacterKahina, kCharacterKronos, 171849314, 0);
 		getCharacterCurrentParams(kCharacterKahina)[0] = 1;
-		return;
-	}
-	switch (msg->action) {
+		break;
 	case 12:
 		setDoor(75, kCharacterKahina, 0, 10, 9);
-		return;
+		break;
 	case 18:
-		if (getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] != 1)
-			return;
-		playNIS(kEventKronosGoingToInvitation);
-		goto LABEL_21;
+		if (getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] == 1) {
+			playNIS(kEventKronosGoingToInvitation);
+			bumpCath(kCarKronos, 80, 255);
+			send(kCharacterKahina, kCharacterKronos, 171849314, 0);
+			getCharacterCurrentParams(kCharacterKahina)[0] = 1;
+		}
+
+		break;
 	case 137685712:
 		CONS_Kahina_CathDone(0, 0, 0, 0);
 		break;
+	default:
+		break;
 	}
 }
 
@@ -514,31 +581,40 @@ void LogicManager::CONS_Kahina_CathDone(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Kahina_CathDone(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			getCharacter(kCharacterKahina).characterPosition.car = kCarKronos;
-			getCharacter(kCharacterKahina).characterPosition.position = 5000;
-			getCharacter(kCharacterKahina).characterPosition.location = 0;
-			setDoor(75, kCharacterCath, 1, 10, 9);
-			getCharacterCurrentParams(kCharacterKahina)[0] = _gameTime + 1800;
-		}
-		return;
-	}
-	if (!_gameProgress[kProgressField14] && _gameTime < 1201500 && getCharacterCurrentParams(kCharacterKahina)[1] != 0x7FFFFFFF && getCharacterCurrentParams(kCharacterKahina)[0] < _gameTime) {
-		if (_gameTime <= 1197000) {
-			if (!cathInCorridor(kCarGreenSleeping) || !getCharacterCurrentParams(kCharacterKahina)[1]) {
-				getCharacterCurrentParams(kCharacterKahina)[1] = _gameTime;
-				if (!_gameTime)
-					goto LABEL_14;
+	switch (msg->action) {
+	case 0:
+		if (!_gameProgress[kProgressField14] && _gameTime < 1201500 && getCharacterCurrentParams(kCharacterKahina)[1] != 0x7FFFFFFF && getCharacterCurrentParams(kCharacterKahina)[0] < _gameTime) {
+			if (_gameTime <= 1197000) {
+				if (!cathInCorridor(kCarGreenSleeping) || !getCharacterCurrentParams(kCharacterKahina)[1]) {
+					getCharacterCurrentParams(kCharacterKahina)[1] = _gameTime;
+					if (!_gameTime) {
+						getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 1;
+						KahinaCall(&LogicManager::CONS_Kahina_SearchTrain, 0, 0, 0, 0);
+						break;
+					}
+				}
+
+				if (getCharacterCurrentParams(kCharacterKahina)[1] >= _gameTime)
+					break;
 			}
-			if (getCharacterCurrentParams(kCharacterKahina)[1] >= _gameTime)
-				return;
+
+			getCharacterCurrentParams(kCharacterKahina)[1] = 0x7FFFFFFF;
+			getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 1;
+			KahinaCall(&LogicManager::CONS_Kahina_SearchTrain, 0, 0, 0, 0);
 		}
-		getCharacterCurrentParams(kCharacterKahina)[1] = 0x7FFFFFFF;
-	LABEL_14:
-		getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 1;
-		KahinaCall(&LogicManager::CONS_Kahina_SearchTrain, 0, 0, 0, 0);
+
+		break;
+	case 12:
+		getCharacter(kCharacterKahina).characterPosition.car = kCarKronos;
+		getCharacter(kCharacterKahina).characterPosition.position = 5000;
+		getCharacter(kCharacterKahina).characterPosition.location = 0;
+		setDoor(75, kCharacterCath, 1, 10, 9);
+		getCharacterCurrentParams(kCharacterKahina)[0] = _gameTime + 1800;
+		break;
+	default:
+		break;
 	}
+	
 }
 
 void LogicManager::CONS_Kahina_DoDogBarkOtis(CONS_PARAMS) {
@@ -552,16 +628,22 @@ void LogicManager::CONS_Kahina_DoDogBarkOtis(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Kahina_DoDogBarkOtis(HAND_PARAMS) {
-	if (msg->action == 3 || msg->action == 4) {
+	switch (msg->action) {
+	case 3:
+	case 4:
 		releaseAtDoor(kCharacterKahina, 37);
 
 		getCharacter(kCharacterKahina).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterKahina, _functionsKahina[getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall]]);
 		fedEx(kCharacterKahina, kCharacterKahina, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		startSeqOtis(kCharacterKahina, "616Cf");
 		blockAtDoor(kCharacterKahina, 37);
 		send(kCharacterKahina, kCharacterMax, 158007856, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -578,32 +660,50 @@ void LogicManager::CONS_Kahina_SearchTrain(CONS_PARAMS) {
 void LogicManager::HAND_Kahina_SearchTrain(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
-		if (getCharacterCurrentParams(kCharacterKahina)[1] == 0x7FFFFFFF || !_gameTime)
-			return;
-		if (getCharacterCurrentParams(kCharacterKahina)[0] >= _gameTime) {
-			if (!cathInCorridor(kCarRedSleeping) || !getCharacterCurrentParams(kCharacterKahina)[1]) {
-				getCharacterCurrentParams(kCharacterKahina)[1] = _gameTime;
-				if (!_gameTime)
-					goto LABEL_13;
+		if (getCharacterCurrentParams(kCharacterKahina)[1] != 0x7FFFFFFF && _gameTime) {
+			if (getCharacterCurrentParams(kCharacterKahina)[0] >= _gameTime) {
+				if (!cathInCorridor(kCarRedSleeping) || !getCharacterCurrentParams(kCharacterKahina)[1]) {
+					getCharacterCurrentParams(kCharacterKahina)[1] = _gameTime;
+					if (!_gameTime) {
+						getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 9;
+						KahinaCall(&LogicManager::CONS_Kahina_DoWalk, 4, 4070, 0, 0);
+						break;
+					}
+				}
+
+				if (getCharacterCurrentParams(kCharacterKahina)[1] >= _gameTime)
+					break;
 			}
-			if (getCharacterCurrentParams(kCharacterKahina)[1] >= _gameTime)
-				return;
+
+			getCharacterCurrentParams(kCharacterKahina)[1] = 0x7FFFFFFF;
+			getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 9;
+			KahinaCall(&LogicManager::CONS_Kahina_DoWalk, 4, 4070, 0, 0);
 		}
-		getCharacterCurrentParams(kCharacterKahina)[1] = 0x7FFFFFFF;
-	LABEL_13:
-		getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 9;
-		KahinaCall(&LogicManager::CONS_Kahina_DoWalk, 4, 4070, 0, 0);
-		return;
+
+		break;
 	case 12:
-		_gameProgress[5] = 19;
+		_gameProgress[kProgressField14] = 19;
 		getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 1;
 		KahinaCall(&LogicManager::CONS_Kahina_DoWalk, 3, 8200, 0, 0);
 		break;
 	case 18:
 		switch (getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8]) {
 		case 1:
-			if (!whoOnScreen(kCharacterKahina))
-				goto LABEL_39;
+			if (!whoOnScreen(kCharacterKahina)) {
+				if (inComp(kCharacterCath, kCarGreenSleeping, 8200) || cathOutHisWindow() || nearChar(kCharacterKahina, kCharacterCath, 2000)) {
+					if (_gameProgress[kProgressField14] == 19)
+						_gameProgress[kProgressField14] = 0;
+
+					getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 8;
+					KahinaCall(&LogicManager::CONS_Kahina_DoWalk, 3, 9460, 0, 0);
+				} else {
+					getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 5;
+					KahinaCall(&LogicManager::CONS_Kahina_DoCorrOtis, "616Aa", 1, 0, 0);
+				}
+
+				break;
+			}
+
 			getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 2;
 			KahinaCall(&LogicManager::CONS_Kahina_DoWalk, 4, 9460, 0, 0);
 			break;
@@ -616,12 +716,17 @@ void LogicManager::HAND_Kahina_SearchTrain(HAND_PARAMS) {
 			KahinaCall(&LogicManager::CONS_Kahina_DoWalk, 3, 8200, 0, 0);
 			break;
 		case 4:
-		LABEL_39:
 			if (inComp(kCharacterCath, kCarGreenSleeping, 8200) || cathOutHisWindow() || nearChar(kCharacterKahina, kCharacterCath, 2000)) {
-				goto LABEL_23;
+				if (_gameProgress[kProgressField14] == 19)
+					_gameProgress[kProgressField14] = 0;
+
+				getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 8;
+				KahinaCall(&LogicManager::CONS_Kahina_DoWalk, 3, 9460, 0, 0);
+			} else {
+				getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 5;
+				KahinaCall(&LogicManager::CONS_Kahina_DoCorrOtis, "616Aa", 1, 0, 0);
 			}
-			getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 5;
-			KahinaCall(&LogicManager::CONS_Kahina_DoCorrOtis, "616Aa", 1, 0, 0);
+
 			break;
 		case 5:
 			getCharacter(kCharacterKahina).characterPosition.location = 1;
@@ -639,9 +744,10 @@ void LogicManager::HAND_Kahina_SearchTrain(HAND_PARAMS) {
 			break;
 		case 7:
 			getCharacter(kCharacterKahina).characterPosition.location = 0;
-		LABEL_23:
-			if (_gameProgress[5] == 19)
-				_gameProgress[5] = 0;
+
+			if (_gameProgress[kProgressField14] == 19)
+				_gameProgress[kProgressField14] = 0;
+
 			getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 8;
 			KahinaCall(&LogicManager::CONS_Kahina_DoWalk, 3, 9460, 0, 0);
 			break;
@@ -658,10 +764,14 @@ void LogicManager::HAND_Kahina_SearchTrain(HAND_PARAMS) {
 			KahinaCall(&LogicManager::CONS_Kahina_DoWalk, 4, 6470, 0, 0);
 			break;
 		case 11:
-			if (inSuite(kCharacterCath, kCarRedSleeping, 6130))
-				goto LABEL_35;
-			getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 12;
-			KahinaCall(&LogicManager::CONS_Kahina_DoCorrOtis, "616Ac", 34, 0, 0);
+			if (inSuite(kCharacterCath, kCarRedSleeping, 6130)) {
+				getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 15;
+				KahinaCall(&LogicManager::CONS_Kahina_DoWalk, 4, 9460, 0, 0);
+			} else {
+				getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 12;
+				KahinaCall(&LogicManager::CONS_Kahina_DoCorrOtis, "616Ac", 34, 0, 0);
+			}
+
 			break;
 		case 12:
 			getCharacter(kCharacterKahina).characterPosition.location = 1;
@@ -679,7 +789,6 @@ void LogicManager::HAND_Kahina_SearchTrain(HAND_PARAMS) {
 			break;
 		case 14:
 			getCharacter(kCharacterKahina).characterPosition.location = 0;
-		LABEL_35:
 			getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 15;
 			KahinaCall(&LogicManager::CONS_Kahina_DoWalk, 4, 9460, 0, 0);
 			break;
@@ -700,8 +809,11 @@ void LogicManager::HAND_Kahina_SearchTrain(HAND_PARAMS) {
 			fedEx(kCharacterKahina, kCharacterKahina, 18, 0);
 			break;
 		default:
-			return;
+			break;
 		}
+
+		break;
+	default:
 		break;
 	}
 }
@@ -717,18 +829,21 @@ void LogicManager::CONS_Kahina_StartPart2(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Kahina_StartPart2(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			endGraphics(kCharacterKahina);
-			getCharacter(kCharacterKahina).characterPosition.car = kCarKronos;
-			getCharacter(kCharacterKahina).characterPosition.position = 6000;
-			getCharacter(kCharacterKahina).characterPosition.location = 0;
-			getCharacter(kCharacterKahina).inventoryItem = 0;
-			getCharacter(kCharacterKahina).clothes = 0;
-			setDoor(75, kCharacterKahina, 1, 10, 9);
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		CONS_Kahina_InSeclusionPart2(0, 0, 0, 0);
+		break;
+	case 12:
+		endGraphics(kCharacterKahina);
+		getCharacter(kCharacterKahina).characterPosition.car = kCarKronos;
+		getCharacter(kCharacterKahina).characterPosition.position = 6000;
+		getCharacter(kCharacterKahina).characterPosition.location = 0;
+		getCharacter(kCharacterKahina).inventoryItem = 0;
+		getCharacter(kCharacterKahina).clothes = 0;
+		setDoor(75, kCharacterKahina, 1, 10, 9);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -745,40 +860,55 @@ void LogicManager::CONS_Kahina_InSeclusionPart2(CONS_PARAMS) {
 void LogicManager::HAND_Kahina_InSeclusionPart2(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
-		if (getCharacterCurrentParams(kCharacterKahina)[0])
-			goto LABEL_9;
-		if (!getCharacterCurrentParams(kCharacterKahina)[1]) {
-			getCharacterCurrentParams(kCharacterKahina)[1] = _gameTime + 9000;
-			if (_gameTime == -9000)
-				goto LABEL_8;
-		}
-		if (getCharacterCurrentParams(kCharacterKahina)[1] < _gameTime) {
-			getCharacterCurrentParams(kCharacterKahina)[1] = 0x7FFFFFFF;
-		LABEL_8:
-			getCharacterCurrentParams(kCharacterKahina)[0] = 1;
-			getCharacterCurrentParams(kCharacterKahina)[1] = 0;
+		if (!getCharacterCurrentParams(kCharacterKahina)[0]) {
+			bool skip = false;
+
+			if (!getCharacterCurrentParams(kCharacterKahina)[1]) {
+				getCharacterCurrentParams(kCharacterKahina)[1] = _gameTime + 9000;
+				if (_gameTime == -9000) {
+					skip = true;
+					getCharacterCurrentParams(kCharacterKahina)[0] = 1;
+					getCharacterCurrentParams(kCharacterKahina)[1] = 0;
+				}
+			}
+
+			if (!skip && getCharacterCurrentParams(kCharacterKahina)[1] < _gameTime) {
+				getCharacterCurrentParams(kCharacterKahina)[1] = 0x7FFFFFFF;
+				getCharacterCurrentParams(kCharacterKahina)[0] = 1;
+				getCharacterCurrentParams(kCharacterKahina)[1] = 0;
+			}
 		}
-	LABEL_9:
+
 		if (!_gameEvents[kEventKahinaAskSpeakFirebird] || _gameEvents[kEventKronosConversationFirebird] || !checkLoc(kCharacterCath, kCarKronos)) {
-			goto LABEL_46;
+			if (_gameTime > 1845000 && _gameEvents[kEventKronosConversationFirebird] && inOuterSanctum(kCharacterCath)) {
+				setDoor(75, kCharacterCath, 1, 10, 9);
+				bumpCath(kCarKronos, 87, 255);
+			}
+
+			break;
 		}
+
 		if (!getCharacterCurrentParams(kCharacterKahina)[2]) {
 			getCharacterCurrentParams(kCharacterKahina)[2] = _gameTime + 900;
-			if (_gameTime == -900)
-				goto LABEL_16;
+			if (_gameTime == -900) {
+				getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 1;
+				KahinaCall(&LogicManager::CONS_Kahina_SaveGame, 2, kEventKronosConversationFirebird, 0, 0);
+				break;
+			}
 		}
+
 		if (getCharacterCurrentParams(kCharacterKahina)[2] < _gameTime) {
 			getCharacterCurrentParams(kCharacterKahina)[2] = 0x7FFFFFFF;
-		LABEL_16:
 			getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 1;
 			KahinaCall(&LogicManager::CONS_Kahina_SaveGame, 2, kEventKronosConversationFirebird, 0, 0);
-			return;
+			break;
 		}
-	LABEL_46:
+
 		if (_gameTime > 1845000 && _gameEvents[kEventKronosConversationFirebird] && inOuterSanctum(kCharacterCath)) {
 			setDoor(75, kCharacterCath, 1, 10, 9);
 			bumpCath(kCarKronos, 87, 255);
 		}
+
 		break;
 	case 8:
 	case 9:
@@ -786,18 +916,22 @@ void LogicManager::HAND_Kahina_InSeclusionPart2(HAND_PARAMS) {
 			if (_gameEvents[kEventKahinaAskSpeakFirebird]) {
 				if (whoRunningDialog(kCharacterKahina))
 					fadeDialog(kCharacterKahina);
+
 				if (msg->action == 8)
 					playDialog(0, "LIB012", -1, 0);
+
 				getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 4;
 				KahinaCall(&LogicManager::CONS_Kahina_SaveGame, 2, kEventKronosConversationFirebird, 0, 0);
 			} else if (_gameEvents[kEventMilosCompartmentVisitAugust] || _gameEvents[kEventTatianaGivePoem] || _gameEvents[kEventTatianaBreakfastGivePoem]) {
 				if (msg->action == 8)
 					playDialog(0, "LIB012", -1, 0);
+
 				getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 7;
 				KahinaCall(&LogicManager::CONS_Kahina_SaveGame, 2, kEventKahinaAskSpeakFirebird, 0, 0);
 			} else if (getCharacterCurrentParams(kCharacterKahina)[0]) {
 				if (msg->action == 8)
 					playDialog(0, "LIB012", -1, 0);
+
 				playNIS(kEventKahinaAskSpeak);
 				cleanNIS();
 				setDoor(75, kCharacterKahina, 1, 0, 0);
@@ -805,6 +939,7 @@ void LogicManager::HAND_Kahina_InSeclusionPart2(HAND_PARAMS) {
 				KahinaCall(&LogicManager::CONS_Kahina_DoDialog, "KRO3003", 0, 0, 0);
 			} else {
 				setDoor(75, kCharacterKahina, 1, 0, 0);
+
 				if (msg->action == 8) {
 					getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 9;
 					KahinaCall(&LogicManager::CONS_Kahina_DoDialog, "LIB012", 0, 0, 0);
@@ -814,11 +949,12 @@ void LogicManager::HAND_Kahina_InSeclusionPart2(HAND_PARAMS) {
 				}
 			}
 		}
-		return;
+
+		break;
 	case 12:
 		getCharacterCurrentParams(kCharacterKahina)[0] = 1;
 		setDoor(75, kCharacterKahina, 1, 10, 9);
-		return;
+		break;
 	case 18:
 		switch (getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8]) {
 		case 1:
@@ -833,7 +969,12 @@ void LogicManager::HAND_Kahina_InSeclusionPart2(HAND_PARAMS) {
 			KahinaCall(&LogicManager::CONS_Kahina_DoDialog, "KRO3005", 0, 0, 0);
 			break;
 		case 3:
-			goto LABEL_46;
+			if (_gameTime > 1845000 && _gameEvents[kEventKronosConversationFirebird] && inOuterSanctum(kCharacterCath)) {
+				setDoor(75, kCharacterCath, 1, 10, 9);
+				bumpCath(kCarKronos, 87, 255);
+			}
+
+			break;
 		case 4:
 			playNIS(kEventKronosConversationFirebird);
 			setDoor(75, kCharacterCath, 0, 10, 9);
@@ -859,11 +1000,12 @@ void LogicManager::HAND_Kahina_InSeclusionPart2(HAND_PARAMS) {
 			setDoor(75, kCharacterKahina, 1, 10, 9);
 			break;
 		default:
-			return;
+			break;
 		}
-		return;
+
+		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -878,17 +1020,19 @@ void LogicManager::CONS_Kahina_StartPart3(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Kahina_StartPart3(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			endGraphics(kCharacterKahina);
-			getCharacter(kCharacterKahina).characterPosition.car = kCarKronos;
-			getCharacter(kCharacterKahina).characterPosition.position = 5000;
-			getCharacter(kCharacterKahina).characterPosition.location = 0;
-			getCharacter(kCharacterKahina).inventoryItem = 0;
-			getCharacter(kCharacterKahina).clothes = 0;
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		CONS_Kahina_BeforeConcert(0, 0, 0, 0);
+	case 12:
+		endGraphics(kCharacterKahina);
+		getCharacter(kCharacterKahina).characterPosition.car = kCarKronos;
+		getCharacter(kCharacterKahina).characterPosition.position = 5000;
+		getCharacter(kCharacterKahina).characterPosition.location = 0;
+		getCharacter(kCharacterKahina).inventoryItem = 0;
+		getCharacter(kCharacterKahina).clothes = 0;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -910,8 +1054,13 @@ void LogicManager::HAND_Kahina_DoWalk1033(HAND_PARAMS) {
 	case 0:
 		if (_gameEvents[kEventAnnaBaggageArgument])
 			forceJump(kCharacterKahina, &LogicManager::CONS_Kahina_Finished);
-		if (walk(kCharacterKahina, getCharacterCurrentParams(kCharacterKahina)[0], getCharacterCurrentParams(kCharacterKahina)[1]))
-			goto LABEL_15;
+
+		if (walk(kCharacterKahina, getCharacterCurrentParams(kCharacterKahina)[0], getCharacterCurrentParams(kCharacterKahina)[1])) {
+			getCharacter(kCharacterKahina).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterKahina, _functionsKahina[getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall]]);
+			fedEx(kCharacterKahina, kCharacterKahina, 18, 0);
+		}
+
 		break;
 	case 5:
 		if (_gameEvents[kEventKronosConversation] || _gameEvents[kEventKronosConversationFirebird]) {
@@ -920,24 +1069,24 @@ void LogicManager::HAND_Kahina_DoWalk1033(HAND_PARAMS) {
 			} else {
 				playDialog(kCharacterCath, "CAT1019", -1, 0);
 			}
-
 		} else {
 			playCathExcuseMe();
 		}
+
 		break;
 	case 6:
 		playChrExcuseMe(kCharacterKahina, kCharacterCath, 0);
 		break;
 	case 12:
 		if (walk(kCharacterKahina, getCharacterCurrentParams(kCharacterKahina)[0], getCharacterCurrentParams(kCharacterKahina)[1])) {
-		LABEL_15:
 			getCharacter(kCharacterKahina).currentCall--;
 			_engine->getMessageManager()->setMessageHandle(kCharacterKahina, _functionsKahina[getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall]]);
 			fedEx(kCharacterKahina, kCharacterKahina, 18, 0);
 		}
+
 		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -956,49 +1105,60 @@ void LogicManager::HAND_Kahina_BeforeConcert(HAND_PARAMS) {
 	case 0:
 		if (_gameEvents[kEventKronosVisit])
 			setDoor(75, kCharacterCath, 3, 10, 9);
+
 		if (inInnerSanctum(kCharacterCath)) {
 			getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 1;
 			KahinaCall(&LogicManager::CONS_Kahina_SaveGame, 2, kEventKahinaPunchSuite4, 0, 0);
-			return;
+			break;
 		}
-	LABEL_30:
+
 		if (_gameTime > 2079000 && !getCharacterCurrentParams(kCharacterKahina)[1]) {
 			getCharacterCurrentParams(kCharacterKahina)[1] = 1;
 			if (_gameEvents[kEventKahinaAskSpeakFirebird] && !_gameEvents[kEventKronosConversationFirebird] && checkLoc(kCharacterCath, kCarKronos)) {
 				getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 2;
 				KahinaCall(&LogicManager::CONS_Kahina_SaveGame, 2, kEventKronosConversationFirebird, 0, 0);
 			} else {
-			LABEL_51:
 				if (inOuterSanctum(kCharacterCath))
 					bumpCath(kCarKronos, 87, 255);
+
 				CONS_Kahina_Concert(0, 0, 0, 0);
 			}
-			return;
-		}
-		if (getCharacterCurrentParams(kCharacterKahina)[0])
-			goto LABEL_42;
-		if (!getCharacterCurrentParams(kCharacterKahina)[2]) {
-			getCharacterCurrentParams(kCharacterKahina)[2] = _gameTime + 9000;
-			if (_gameTime == -9000)
-				goto LABEL_41;
+
+			break;
 		}
-		if (getCharacterCurrentParams(kCharacterKahina)[2] < _gameTime) {
-			getCharacterCurrentParams(kCharacterKahina)[2] = 0x7FFFFFFF;
-		LABEL_41:
-			getCharacterCurrentParams(kCharacterKahina)[0] = 1;
-			getCharacterCurrentParams(kCharacterKahina)[2] = 0;
+
+		if (!getCharacterCurrentParams(kCharacterKahina)[0]) {
+			bool skip = false;
+
+			if (!getCharacterCurrentParams(kCharacterKahina)[2]) {
+				getCharacterCurrentParams(kCharacterKahina)[2] = _gameTime + 9000;
+				if (_gameTime == -9000) {
+					skip = true;
+					getCharacterCurrentParams(kCharacterKahina)[0] = 1;
+					getCharacterCurrentParams(kCharacterKahina)[2] = 0;
+				}
+			}
+
+			if (!skip && getCharacterCurrentParams(kCharacterKahina)[2] < _gameTime) {
+				getCharacterCurrentParams(kCharacterKahina)[2] = 0x7FFFFFFF;
+				getCharacterCurrentParams(kCharacterKahina)[0] = 1;
+				getCharacterCurrentParams(kCharacterKahina)[2] = 0;
+			}
 		}
-	LABEL_42:
+
 		if (_gameEvents[kEventKahinaAskSpeakFirebird] && !_gameEvents[kEventKronosConversationFirebird] && checkLoc(kCharacterCath, kCarKronos)) {
 			if (getCharacterCurrentParams(kCharacterKahina)[3] || (getCharacterCurrentParams(kCharacterKahina)[3] = _gameTime + 900,
 																   _gameTime != -900)) {
 				if (getCharacterCurrentParams(kCharacterKahina)[3] >= _gameTime)
-					return;
+					break;
+
 				getCharacterCurrentParams(kCharacterKahina)[3] = 0x7FFFFFFF;
 			}
+
 			getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 3;
 			KahinaCall(&LogicManager::CONS_Kahina_SaveGame, 2, kEventKronosConversationFirebird, 0, 0);
 		}
+
 		break;
 	case 8:
 	case 9:
@@ -1006,16 +1166,19 @@ void LogicManager::HAND_Kahina_BeforeConcert(HAND_PARAMS) {
 			if (_gameEvents[kEventKahinaAskSpeakFirebird]) {
 				if (msg->action == 8)
 					playDialog(0, "LIB012", -1, 0);
+
 				getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 6;
 				KahinaCall(&LogicManager::CONS_Kahina_SaveGame, 2, kEventKronosConversationFirebird, 0, 0);
 			} else if (_gameEvents[kEventMilosCompartmentVisitAugust] || _gameEvents[kEventTatianaGivePoem] || _gameEvents[kEventTatianaBreakfastGivePoem]) {
 				if (msg->action == 8)
 					playDialog(0, "LIB012", -1, 0);
+
 				getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 9;
 				KahinaCall(&LogicManager::CONS_Kahina_SaveGame, 2, kEventKahinaAskSpeakFirebird, 0, 0);
 			} else if (getCharacterCurrentParams(kCharacterKahina)[0]) {
 				if (msg->action == 8)
 					playDialog(0, "LIB012", -1, 0);
+
 				playNIS(kEventKahinaAskSpeak);
 				cleanNIS();
 				setDoor(75, kCharacterKahina, 1, 0, 0);
@@ -1023,6 +1186,7 @@ void LogicManager::HAND_Kahina_BeforeConcert(HAND_PARAMS) {
 				KahinaCall(&LogicManager::CONS_Kahina_DoDialog, "KRO3003", 0, 0, 0);
 			} else {
 				setDoor(75, kCharacterKahina, 1, 0, 0);
+
 				if (msg->action == 8) {
 					getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 11;
 					KahinaCall(&LogicManager::CONS_Kahina_DoDialog, "LIB012", 0, 0, 0);
@@ -1032,7 +1196,8 @@ void LogicManager::HAND_Kahina_BeforeConcert(HAND_PARAMS) {
 				}
 			}
 		}
-		return;
+
+		break;
 	case 12:
 		if (_gameEvents[kEventKronosConversationFirebird]) {
 			setDoor(75, kCharacterCath, 3, 10, 9);
@@ -1045,12 +1210,65 @@ void LogicManager::HAND_Kahina_BeforeConcert(HAND_PARAMS) {
 		switch (getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8]) {
 		case 1:
 			playNIS(kEventKahinaPunchSuite4);
-			endGame(3, 253, 0, 1);
-			goto LABEL_30;
+			endGame(3, 253, 0, true);
+
+			if (_gameTime > 2079000 && !getCharacterCurrentParams(kCharacterKahina)[1]) {
+				getCharacterCurrentParams(kCharacterKahina)[1] = 1;
+				if (_gameEvents[kEventKahinaAskSpeakFirebird] && !_gameEvents[kEventKronosConversationFirebird] && checkLoc(kCharacterCath, kCarKronos)) {
+					getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 2;
+					KahinaCall(&LogicManager::CONS_Kahina_SaveGame, 2, kEventKronosConversationFirebird, 0, 0);
+				} else {
+					if (inOuterSanctum(kCharacterCath))
+						bumpCath(kCarKronos, 87, 255);
+
+					CONS_Kahina_Concert(0, 0, 0, 0);
+				}
+
+				break;
+			}
+
+			if (!getCharacterCurrentParams(kCharacterKahina)[0]) {
+				bool skip = false;
+
+				if (!getCharacterCurrentParams(kCharacterKahina)[2]) {
+					getCharacterCurrentParams(kCharacterKahina)[2] = _gameTime + 9000;
+					if (_gameTime == -9000) {
+						skip = true;
+						getCharacterCurrentParams(kCharacterKahina)[0] = 1;
+						getCharacterCurrentParams(kCharacterKahina)[2] = 0;
+					}
+				}
+
+				if (!skip && getCharacterCurrentParams(kCharacterKahina)[2] < _gameTime) {
+					getCharacterCurrentParams(kCharacterKahina)[2] = 0x7FFFFFFF;
+					getCharacterCurrentParams(kCharacterKahina)[0] = 1;
+					getCharacterCurrentParams(kCharacterKahina)[2] = 0;
+				}
+			}
+
+			if (_gameEvents[kEventKahinaAskSpeakFirebird] && !_gameEvents[kEventKronosConversationFirebird] && checkLoc(kCharacterCath, kCarKronos)) {
+				if (getCharacterCurrentParams(kCharacterKahina)[3] || (getCharacterCurrentParams(kCharacterKahina)[3] = _gameTime + 900,
+																	   _gameTime != -900)) {
+					if (getCharacterCurrentParams(kCharacterKahina)[3] >= _gameTime)
+						break;
+
+					getCharacterCurrentParams(kCharacterKahina)[3] = 0x7FFFFFFF;
+				}
+
+				getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 3;
+				KahinaCall(&LogicManager::CONS_Kahina_SaveGame, 2, kEventKronosConversationFirebird, 0, 0);
+			}
+
+			break;
 		case 2:
 			playNIS(kEventKronosConversationFirebird);
 			bumpCath(kCarKronos, 87, 255);
-			goto LABEL_51;
+
+			if (inOuterSanctum(kCharacterCath))
+				bumpCath(kCarKronos, 87, 255);
+
+			CONS_Kahina_Concert(0, 0, 0, 0);
+			break;
 		case 3:
 			playNIS(kEventKronosConversationFirebird);
 			setDoor(75, kCharacterCath, 0, 10, 9);
@@ -1087,11 +1305,12 @@ void LogicManager::HAND_Kahina_BeforeConcert(HAND_PARAMS) {
 			setDoor(75, kCharacterKahina, 1, 10, 9);
 			break;
 		default:
-			return;
+			break;
 		}
-		return;
+
+		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -1106,52 +1325,92 @@ void LogicManager::CONS_Kahina_Concert(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Kahina_Concert(HAND_PARAMS) {
-	if (msg->action <= 12) {
-		if (msg->action == 12) {
-			getCharacter(kCharacterKahina).characterPosition.car = kCarKronos;
-			getCharacter(kCharacterKahina).characterPosition.position = 5000;
-			getCharacter(kCharacterKahina).characterPosition.location = 0;
-			startCycOtis(kCharacterKahina, "202a");
-			return;
-		}
-		if (msg->action)
-			return;
+	switch (msg->action) {
+	case 0:
 		if (getCharacterCurrentParams(kCharacterKahina)[0]) {
 			if (!getCharacterCurrentParams(kCharacterKahina)[2])
 				getCharacterCurrentParams(kCharacterKahina)[2] = _gameTime + 4500;
+
 			if (getCharacterCurrentParams(kCharacterKahina)[4] != 0x7FFFFFFF && _gameTime) {
-				if (getCharacterCurrentParams(kCharacterKahina)[2] < _gameTime)
-					goto LABEL_24;
+				if (getCharacterCurrentParams(kCharacterKahina)[2] < _gameTime) {
+					getCharacterCurrentParams(kCharacterKahina)[4] = 0x7FFFFFFF;
+					getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 2;
+					KahinaCall(&LogicManager::CONS_Kahina_FindFirebird, 0, 0, 0, 0);
+					break;
+				}
+
 				if (checkCathDir(kCarKronos, 80) || checkCathDir(kCarKronos, 88) || !getCharacterCurrentParams(kCharacterKahina)[4]) {
 					getCharacterCurrentParams(kCharacterKahina)[4] = _gameTime;
-					if (!_gameTime)
-						goto LABEL_25;
+					if (!_gameTime) {
+						getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 2;
+						KahinaCall(&LogicManager::CONS_Kahina_FindFirebird, 0, 0, 0, 0);
+						break;
+					}
 				}
+
 				if (getCharacterCurrentParams(kCharacterKahina)[4] < _gameTime) {
-				LABEL_24:
 					getCharacterCurrentParams(kCharacterKahina)[4] = 0x7FFFFFFF;
-				LABEL_25:
 					getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 2;
 					KahinaCall(&LogicManager::CONS_Kahina_FindFirebird, 0, 0, 0, 0);
-					return;
+					break;
+				}
+			}
+		}
+
+		if (!getCharacterCurrentParams(kCharacterKahina)[1]) {
+			if (!_gameProgress[kProgressField44] && _gameTime > 2214000) {
+				if (_gameInventory[kProgressField48].location == 3 || _gameInventory[kProgressField48].location == 7) {
+					getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 3;
+					KahinaCall(&LogicManager::CONS_Kahina_SearchCath, 0, 0, 0, 0);
+				} else if (_gameInventory[kProgressField48].location == 2 || _gameInventory[kProgressField48].location == 1) {
+					getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 4;
+					KahinaCall(&LogicManager::CONS_Kahina_SearchTatiana, 0, 0, 0, 0);
 				}
 			}
+
+			break;
 		}
-	LABEL_32:
-		if (!getCharacterCurrentParams(kCharacterKahina)[1])
-			goto LABEL_45;
+
 		if (!getCharacterCurrentParams(kCharacterKahina)[3])
 			getCharacterCurrentParams(kCharacterKahina)[3] = _gameTime + 4500;
-		if (getCharacterCurrentParams(kCharacterKahina)[5] == 0x7FFFFFFF || !_gameTime)
-			goto LABEL_45;
+
+		if (getCharacterCurrentParams(kCharacterKahina)[5] == 0x7FFFFFFF || !_gameTime) {
+			if (!_gameProgress[kProgressField44] && _gameTime > 2214000) {
+				if (_gameInventory[kProgressField48].location == 3 || _gameInventory[kProgressField48].location == 7) {
+					getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 3;
+					KahinaCall(&LogicManager::CONS_Kahina_SearchCath, 0, 0, 0, 0);
+				} else if (_gameInventory[kProgressField48].location == 2 || _gameInventory[kProgressField48].location == 1) {
+					getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 4;
+					KahinaCall(&LogicManager::CONS_Kahina_SearchTatiana, 0, 0, 0, 0);
+				}
+			}
+
+			break;
+		}
+
 		if (getCharacterCurrentParams(kCharacterKahina)[2] >= _gameTime) {
 			if (checkCathDir(kCarKronos, 80) || checkCathDir(kCarKronos, 88) || !getCharacterCurrentParams(kCharacterKahina)[5]) {
 				getCharacterCurrentParams(kCharacterKahina)[5] = _gameTime;
-				if (!_gameTime)
-					goto LABEL_44;
+				if (!_gameTime) {
+					playDialog(0, "LIB014", getVolume(kCharacterKahina), 0);
+					playDialog(0, "LIB015", getVolume(kCharacterKahina), 15);
+					startCycOtis(kCharacterKahina, "202a");
+					getCharacterCurrentParams(kCharacterKahina)[1] = 0;
+					if (!_gameProgress[kProgressField44] && _gameTime > 2214000) {
+						if (_gameInventory[kProgressField48].location == 3 || _gameInventory[kProgressField48].location == 7) {
+							getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 3;
+							KahinaCall(&LogicManager::CONS_Kahina_SearchCath, 0, 0, 0, 0);
+						} else if (_gameInventory[kProgressField48].location == 2 || _gameInventory[kProgressField48].location == 1) {
+							getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 4;
+							KahinaCall(&LogicManager::CONS_Kahina_SearchTatiana, 0, 0, 0, 0);
+						}
+					}
+
+					break;
+				}
 			}
+
 			if (getCharacterCurrentParams(kCharacterKahina)[5] >= _gameTime) {
-			LABEL_45:
 				if (!_gameProgress[kProgressField44] && _gameTime > 2214000) {
 					if (_gameInventory[kProgressField48].location == 3 || _gameInventory[kProgressField48].location == 7) {
 						getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 3;
@@ -1161,50 +1420,153 @@ void LogicManager::HAND_Kahina_Concert(HAND_PARAMS) {
 						KahinaCall(&LogicManager::CONS_Kahina_SearchTatiana, 0, 0, 0, 0);
 					}
 				}
-				return;
+
+				break;
 			}
 		}
+
 		getCharacterCurrentParams(kCharacterKahina)[5] = 0x7FFFFFFF;
-	LABEL_44:
 		playDialog(0, "LIB014", getVolume(kCharacterKahina), 0);
 		playDialog(0, "LIB015", getVolume(kCharacterKahina), 15);
 		startCycOtis(kCharacterKahina, "202a");
 		getCharacterCurrentParams(kCharacterKahina)[1] = 0;
-		goto LABEL_45;
-	}
-	if (msg->action > 92186062) {
-		switch (msg->action) {
-		case 134611040:
-			if (_gameEvents[kEventConcertLeaveWithBriefcase])
-				CONS_Kahina_SeekCath(0, 0, 0, 0);
-			break;
-		case 137503360:
-			CONS_Kahina_Finished(0, 0, 0, 0);
-			break;
-		case 237555748:
-			getCharacterCurrentParams(kCharacterKahina)[0] = 1;
-			break;
+
+		if (!_gameProgress[kProgressField44] && _gameTime > 2214000) {
+			if (_gameInventory[kProgressField48].location == 3 || _gameInventory[kProgressField48].location == 7) {
+				getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 3;
+				KahinaCall(&LogicManager::CONS_Kahina_SearchCath, 0, 0, 0, 0);
+			} else if (_gameInventory[kProgressField48].location == 2 || _gameInventory[kProgressField48].location == 1) {
+				getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 4;
+				KahinaCall(&LogicManager::CONS_Kahina_SearchTatiana, 0, 0, 0, 0);
+			}
 		}
-		return;
-	}
-	if (msg->action == 92186062) {
-		if (getCharacterCurrentParams(kCharacterKahina)[0]) {
-			getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 1;
-			KahinaCall(&LogicManager::CONS_Kahina_FindFirebird, 0, 0, 0, 0);
-		}
-		return;
-	}
-	if (msg->action == 18) {
+
+		break;
+	case 12:
+		getCharacter(kCharacterKahina).characterPosition.car = kCarKronos;
+		getCharacter(kCharacterKahina).characterPosition.position = 5000;
+		getCharacter(kCharacterKahina).characterPosition.location = 0;
+		startCycOtis(kCharacterKahina, "202a");
+		break;
+	case 18:
 		if (getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] == 1) {
 			getCharacterCurrentParams(kCharacterKahina)[0] = 0;
 			getCharacterCurrentParams(kCharacterKahina)[1] = 1;
-			return;
+			break;
 		}
+
 		if (getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] == 2) {
 			getCharacterCurrentParams(kCharacterKahina)[0] = 0;
 			getCharacterCurrentParams(kCharacterKahina)[1] = 1;
-			goto LABEL_32;
+			if (!getCharacterCurrentParams(kCharacterKahina)[1]) {
+				if (!_gameProgress[kProgressField44] && _gameTime > 2214000) {
+					if (_gameInventory[kProgressField48].location == 3 || _gameInventory[kProgressField48].location == 7) {
+						getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 3;
+						KahinaCall(&LogicManager::CONS_Kahina_SearchCath, 0, 0, 0, 0);
+					} else if (_gameInventory[kProgressField48].location == 2 || _gameInventory[kProgressField48].location == 1) {
+						getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 4;
+						KahinaCall(&LogicManager::CONS_Kahina_SearchTatiana, 0, 0, 0, 0);
+					}
+				}
+
+				break;
+			}
+
+			if (!getCharacterCurrentParams(kCharacterKahina)[3])
+				getCharacterCurrentParams(kCharacterKahina)[3] = _gameTime + 4500;
+
+			if (getCharacterCurrentParams(kCharacterKahina)[5] == 0x7FFFFFFF || !_gameTime) {
+				if (!_gameProgress[kProgressField44] && _gameTime > 2214000) {
+					if (_gameInventory[kProgressField48].location == 3 || _gameInventory[kProgressField48].location == 7) {
+						getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 3;
+						KahinaCall(&LogicManager::CONS_Kahina_SearchCath, 0, 0, 0, 0);
+					} else if (_gameInventory[kProgressField48].location == 2 || _gameInventory[kProgressField48].location == 1) {
+						getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 4;
+						KahinaCall(&LogicManager::CONS_Kahina_SearchTatiana, 0, 0, 0, 0);
+					}
+				}
+
+				break;
+			}
+
+			if (getCharacterCurrentParams(kCharacterKahina)[2] >= _gameTime) {
+				if (checkCathDir(kCarKronos, 80) || checkCathDir(kCarKronos, 88) || !getCharacterCurrentParams(kCharacterKahina)[5]) {
+					getCharacterCurrentParams(kCharacterKahina)[5] = _gameTime;
+					if (!_gameTime) {
+						playDialog(0, "LIB014", getVolume(kCharacterKahina), 0);
+						playDialog(0, "LIB015", getVolume(kCharacterKahina), 15);
+						startCycOtis(kCharacterKahina, "202a");
+						getCharacterCurrentParams(kCharacterKahina)[1] = 0;
+						if (!_gameProgress[kProgressField44] && _gameTime > 2214000) {
+							if (_gameInventory[kProgressField48].location == 3 || _gameInventory[kProgressField48].location == 7) {
+								getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 3;
+								KahinaCall(&LogicManager::CONS_Kahina_SearchCath, 0, 0, 0, 0);
+							} else if (_gameInventory[kProgressField48].location == 2 || _gameInventory[kProgressField48].location == 1) {
+								getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 4;
+								KahinaCall(&LogicManager::CONS_Kahina_SearchTatiana, 0, 0, 0, 0);
+							}
+						}
+
+						break;
+					}
+				}
+
+				if (getCharacterCurrentParams(kCharacterKahina)[5] >= _gameTime) {
+					if (!_gameProgress[kProgressField44] && _gameTime > 2214000) {
+						if (_gameInventory[kProgressField48].location == 3 || _gameInventory[kProgressField48].location == 7) {
+							getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 3;
+							KahinaCall(&LogicManager::CONS_Kahina_SearchCath, 0, 0, 0, 0);
+						} else if (_gameInventory[kProgressField48].location == 2 || _gameInventory[kProgressField48].location == 1) {
+							getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 4;
+							KahinaCall(&LogicManager::CONS_Kahina_SearchTatiana, 0, 0, 0, 0);
+						}
+					}
+
+					break;
+				}
+			}
+
+			getCharacterCurrentParams(kCharacterKahina)[5] = 0x7FFFFFFF;
+			playDialog(0, "LIB014", getVolume(kCharacterKahina), 0);
+			playDialog(0, "LIB015", getVolume(kCharacterKahina), 15);
+			startCycOtis(kCharacterKahina, "202a");
+			getCharacterCurrentParams(kCharacterKahina)[1] = 0;
+
+			if (!_gameProgress[kProgressField44] && _gameTime > 2214000) {
+				if (_gameInventory[kProgressField48].location == 3 || _gameInventory[kProgressField48].location == 7) {
+					getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 3;
+					KahinaCall(&LogicManager::CONS_Kahina_SearchCath, 0, 0, 0, 0);
+				} else if (_gameInventory[kProgressField48].location == 2 || _gameInventory[kProgressField48].location == 1) {
+					getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 4;
+					KahinaCall(&LogicManager::CONS_Kahina_SearchTatiana, 0, 0, 0, 0);
+				}
+			}
+
+			break;
+		}
+
+		break;
+	case 92186062:
+		if (getCharacterCurrentParams(kCharacterKahina)[0]) {
+			getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 1;
+			KahinaCall(&LogicManager::CONS_Kahina_FindFirebird, 0, 0, 0, 0);
 		}
+
+		break;
+	case 134611040:
+		if (_gameEvents[kEventConcertLeaveWithBriefcase])
+			CONS_Kahina_SeekCath(0, 0, 0, 0);
+
+		break;
+	case 137503360:
+		CONS_Kahina_Finished(0, 0, 0, 0);
+		break;
+	case 237555748:
+		getCharacterCurrentParams(kCharacterKahina)[0] = 1;
+		break;
+
+	default:
+		break;
 	}
 }
 
@@ -1230,6 +1592,7 @@ void LogicManager::HAND_Kahina_Finished(HAND_PARAMS) {
 				KahinaCall(&LogicManager::CONS_Kahina_SearchTatiana, 0, 0, 0, 0);
 			}
 		}
+
 		break;
 	case 12:
 		getCharacter(kCharacterKahina).characterPosition.car = kCarKronos;
@@ -1240,9 +1603,10 @@ void LogicManager::HAND_Kahina_Finished(HAND_PARAMS) {
 		if (getCharacter(kCharacterCath).characterPosition.car > kCarGreenSleeping || getCharacter(kCharacterCath).characterPosition.car == kCarGreenSleeping && getCharacter(kCharacterCath).characterPosition.position > 2740) {
 			getCharacterCurrentParams(kCharacterKahina)[0] = 1;
 		}
+
 		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -1257,7 +1621,8 @@ void LogicManager::CONS_Kahina_FindFirebird(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Kahina_FindFirebird(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		playDialog(0, "LIB014", getVolume(kCharacterKahina), 0);
 		playDialog(0, "LIB015", getVolume(kCharacterKahina), 15);
 		endGraphics(kCharacterKahina);
@@ -1265,13 +1630,18 @@ void LogicManager::HAND_Kahina_FindFirebird(HAND_PARAMS) {
 		getCharacter(kCharacterKahina).characterPosition.position = 540;
 		getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 1;
 		KahinaCall(&LogicManager::CONS_Kahina_DoWalk, 4, 4070, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8]) {
 		case 1:
-			if (inSuite(kCharacterCath, kCarRedSleeping, 4455) || cathOutRebeccaWindow())
-				goto LABEL_12;
-			getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 2;
-			KahinaCall(&LogicManager::CONS_Kahina_DoCorrOtis, "616Cf", 37, 0, 0);
+			if (inSuite(kCharacterCath, kCarRedSleeping, 4455) || cathOutRebeccaWindow()) {
+				getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 5;
+				KahinaCall(&LogicManager::CONS_Kahina_DoWalk, 4, 9460, 0, 0);
+			} else {
+				getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 2;
+				KahinaCall(&LogicManager::CONS_Kahina_DoCorrOtis, "616Cf", 37, 0, 0);
+			}
+
 			break;
 		case 2:
 			getCharacter(kCharacterKahina).characterPosition.location = 1;
@@ -1290,7 +1660,6 @@ void LogicManager::HAND_Kahina_FindFirebird(HAND_PARAMS) {
 			break;
 		case 4:
 			getCharacter(kCharacterKahina).characterPosition.location = 0;
-		LABEL_12:
 			getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 5;
 			KahinaCall(&LogicManager::CONS_Kahina_DoWalk, 4, 9460, 0, 0);
 			break;
@@ -1311,8 +1680,12 @@ void LogicManager::HAND_Kahina_FindFirebird(HAND_PARAMS) {
 			fedEx(kCharacterKahina, kCharacterKahina, 18, 0);
 			break;
 		default:
-			return;
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1327,69 +1700,80 @@ void LogicManager::CONS_Kahina_SeekCath(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Kahina_SeekCath(HAND_PARAMS) {
-	if (msg->action > 12) {
-		if (msg->action == 18) {
-			if (getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] != 1) {
-				if (getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] == 2) {
-					if (getCharacter(kCharacterCath).characterPosition.position >= getCharacter(kCharacterKahina).characterPosition.position) {
-						playNIS((kEventKahinaGunBlue - (getCharacter(kCharacterKahina).characterPosition.car == kCarGreenSleeping)));
-					} else {
-						playNIS(kEventKahinaGun);
-					}
-					walk(kCharacterKahina, kCarKronos, 9270);
-					bumpCathRx(getCharacter(kCharacterKahina).characterPosition.car, getCharacter(kCharacterKahina).characterPosition.position + 750);
-					send(kCharacterKahina, kCharacterKronos, 235599361, 0);
-					playDialog(kCharacterKahina, "MUS016", 16, 0);
-					_gameProgress[kProgressField44] = 1;
-					getCharacterCurrentParams(kCharacterKahina)[0] = 1;
-					getCharacterCurrentParams(kCharacterKahina)[1] = 2;
-					getCharacterCurrentParams(kCharacterKahina)[2] = 9270;
-				}
-				return;
-			}
-			if (!getCharacterParams(kCharacterKahina, 8)[1]) {
-				if (getCharacterParams(kCharacterKahina, 8)[0]) {
-					getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 2;
-					KahinaCall(&LogicManager::CONS_Kahina_SaveGame, 2, kEventKahinaGunYellow, 0, 0);
-					return;
-				}
-				goto LABEL_24;
+	switch (msg->action) {
+	case 0:
+		if (getCharacterCurrentParams(kCharacterKahina)[0]) {
+			if (walk(kCharacterKahina, getCharacterCurrentParams(kCharacterKahina)[1], getCharacterCurrentParams(kCharacterKahina)[2])) {
+				endGraphics(kCharacterKahina);
+				getCharacterCurrentParams(kCharacterKahina)[0] = 0;
 			}
-			endGraphics(kCharacterKahina);
-			if (whoRunningDialog(kCharacterKahina))
-				fadeDialog(kCharacterKahina);
+		}
+
+		break;
+	case 2:
+		if (checkLoc(kCharacterCath, kCarKronos)) {
+			send(kCharacterKahina, kCharacterKronos, 9, 0);
 		} else {
-			if (msg->action != 137503360)
-				return;
-			endGraphics(kCharacterKahina);
-			if (whoRunningDialog(kCharacterKahina))
-				fadeDialog(kCharacterKahina);
+			CONS_Kahina_KillCathAnywhere(0, 0, 0, 0);
 		}
-		_gameProgress[kProgressField44] = 0;
-		CONS_Kahina_Finished(0, 0, 0, 0);
-		return;
-	}
-	if (msg->action == 12) {
+
+		break;
+	case 12:
 		getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 1;
 		KahinaCall(&LogicManager::CONS_Kahina_LookingForCath, 2241000, 0, 0, 0);
-		return;
-	}
-	if (msg->action) {
-		if (msg->action != 2)
-			return;
-		if (checkLoc(kCharacterCath, kCarKronos)) {
-			send(kCharacterKahina, kCharacterKronos, 9, 0);
-			return;
+		break;
+	case 18:
+		if (getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] != 1) {
+			if (getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] == 2) {
+				if (getCharacter(kCharacterCath).characterPosition.position >= getCharacter(kCharacterKahina).characterPosition.position) {
+					playNIS((kEventKahinaGunBlue - (getCharacter(kCharacterKahina).characterPosition.car == kCarGreenSleeping)));
+				} else {
+					playNIS(kEventKahinaGun);
+				}
+
+				walk(kCharacterKahina, kCarKronos, 9270);
+				bumpCathRx(getCharacter(kCharacterKahina).characterPosition.car, getCharacter(kCharacterKahina).characterPosition.position + 750);
+				send(kCharacterKahina, kCharacterKronos, 235599361, 0);
+				playDialog(kCharacterKahina, "MUS016", 16, 0);
+				_gameProgress[kProgressField44] = 1;
+				getCharacterCurrentParams(kCharacterKahina)[0] = 1;
+				getCharacterCurrentParams(kCharacterKahina)[1] = 2;
+				getCharacterCurrentParams(kCharacterKahina)[2] = 9270;
+			}
+
+			break;
 		}
-	LABEL_24:
-		CONS_Kahina_KillCathAnywhere(0, 0, 0, 0);
-		return;
-	}
-	if (getCharacterCurrentParams(kCharacterKahina)[0]) {
-		if (walk(kCharacterKahina, getCharacterCurrentParams(kCharacterKahina)[1], getCharacterCurrentParams(kCharacterKahina)[2])) {
-			endGraphics(kCharacterKahina);
-			getCharacterCurrentParams(kCharacterKahina)[0] = 0;
+
+		if (!getCharacterParams(kCharacterKahina, 8)[1]) {
+			if (getCharacterParams(kCharacterKahina, 8)[0]) {
+				getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 2;
+				KahinaCall(&LogicManager::CONS_Kahina_SaveGame, 2, kEventKahinaGunYellow, 0, 0);
+			} else {
+				CONS_Kahina_KillCathAnywhere(0, 0, 0, 0);
+			}
+
+			break;
 		}
+
+		endGraphics(kCharacterKahina);
+
+		if (whoRunningDialog(kCharacterKahina))
+			fadeDialog(kCharacterKahina);
+
+		_gameProgress[kProgressField44] = 0;
+		CONS_Kahina_Finished(0, 0, 0, 0);
+		break;
+	case 137503360:
+		endGraphics(kCharacterKahina);
+
+		if (whoRunningDialog(kCharacterKahina))
+			fadeDialog(kCharacterKahina);
+
+		_gameProgress[kProgressField44] = 0;
+		CONS_Kahina_Finished(0, 0, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1404,36 +1788,40 @@ void LogicManager::CONS_Kahina_SearchCath(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Kahina_SearchCath(HAND_PARAMS) {
-	if (msg->action == 0) {
-		if (getCharacterCurrentParams(kCharacterKahina)[0] == 0x7FFFFFFF || !_gameTime)
-			return;
-		if (_gameTime <= 2263500) {
-			if (!cathInCorridor(kCarGreenSleeping) || !getCharacterCurrentParams(kCharacterKahina)[0]) {
-				getCharacterCurrentParams(kCharacterKahina)[0] = _gameTime;
-				if (!_gameTime)
-					goto LABEL_13;
+	switch (msg->action) {
+	case 0:
+		if (getCharacterCurrentParams(kCharacterKahina)[0] != 0x7FFFFFFF && _gameTime) {
+			if (_gameTime <= 2263500) {
+				if (!cathInCorridor(kCarGreenSleeping) || !getCharacterCurrentParams(kCharacterKahina)[0]) {
+					getCharacterCurrentParams(kCharacterKahina)[0] = _gameTime;
+					if (!_gameTime) {
+						getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 12;
+						KahinaCall(&LogicManager::CONS_Kahina_DoCorrOtis, "616Ba", 1, 0, 0);
+						break;
+					}
+				}
+
+				if (getCharacterCurrentParams(kCharacterKahina)[0] >= _gameTime)
+					break;
 			}
-			if (getCharacterCurrentParams(kCharacterKahina)[0] >= _gameTime)
-				return;
+
+			getCharacterCurrentParams(kCharacterKahina)[0] = 0x7FFFFFFF;
+			getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 12;
+			KahinaCall(&LogicManager::CONS_Kahina_DoCorrOtis, "616Ba", 1, 0, 0);
 		}
-		getCharacterCurrentParams(kCharacterKahina)[0] = 0x7FFFFFFF;
-	LABEL_13:
-		getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 12;
-		KahinaCall(&LogicManager::CONS_Kahina_DoCorrOtis, "616Ba", 1, 0, 0);
-		return;
-	}
-	if (msg->action == 12) {
+
+		break;
+	case 12:
 		if (!_gameEvents[kEventAnnaBaggageArgument]) {
 			getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 1;
 			KahinaCall(&LogicManager::CONS_Kahina_DoWalk1033, 3, 8200, 0, 0);
-			return;
+			break;
 		}
 
 		if (_gameInventory[kItemFirebird].location == 3) {
 			_gameProgress[kProgressField7C] = 1;
 		} else {
 			if (_gameInventory[kItemFirebird].location != 7) {
-			LABEL_20:
 				dropItem(kItemBriefcase, 2);
 				_gameProgress[kProgressField78] = 1;
 				getCharacterParams(kCharacterKahina, 8)[2] = 0;
@@ -1441,113 +1829,153 @@ void LogicManager::HAND_Kahina_SearchCath(HAND_PARAMS) {
 				getCharacter(kCharacterKahina).currentCall--;
 				_engine->getMessageManager()->setMessageHandle(kCharacterKahina, _functionsKahina[getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall]]);
 				fedEx(kCharacterKahina, kCharacterKahina, 18, 0);
-				return;
+				break;
 			}
+
 			_gameProgress[kProgressField80] = 1;
 		}
+
 		takeItem(kItemFirebird);
 		_gameInventory[kItemFirebird].location = 5;
 		send(kCharacterKahina, kCharacterKronos, 138085344, 0);
-		goto LABEL_20;
-	}
-	if (msg->action != 18)
-		return;
-
-	switch (getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8]) {
-	case 1:
-		if (!cathInCorridor(kCarGreenSleeping))
-			goto LABEL_29;
-		getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 2;
-		KahinaCall(&LogicManager::CONS_Kahina_DoWalk1033, 3, 9460, 0, 0);
-		return;
-	case 2:
-		getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 3;
-		KahinaCall(&LogicManager::CONS_Kahina_DoWait, 1800, 0, 0, 0);
-		return;
-	case 3:
-		getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 4;
-		KahinaCall(&LogicManager::CONS_Kahina_DoWalk1033, 3, 8200, 0, 0);
-		return;
-	case 4:
-		if (cathInCorridor(kCarGreenSleeping)) {
-			getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 5;
-			KahinaCall(&LogicManager::CONS_Kahina_DoWalk1033, 2, 9270, 0, 0);
-		} else {
-		LABEL_29:
-			if (inSuite(kCharacterCath, kCarGreenSleeping, 7850) || cathOutHisWindow()) {
-				getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 6;
-				KahinaCall(&LogicManager::CONS_Kahina_DoDialog, "LIB013", 0, 0, 0);
-			} else {
-				getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 8;
-				KahinaCall(&LogicManager::CONS_Kahina_DoCorrOtis, "616Aa", 1, 0, 0);
-			}
-		}
-		return;
-	case 5:
-	case 7:
-	case 11:
-	case 13:
-		endGraphics(kCharacterKahina);
+		dropItem(kItemBriefcase, 2);
+		_gameProgress[kProgressField78] = 1;
+		getCharacterParams(kCharacterKahina, 8)[2] = 0;
 
 		getCharacter(kCharacterKahina).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterKahina, _functionsKahina[getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall]]);
 		fedEx(kCharacterKahina, kCharacterKahina, 18, 0);
-		return;
-	case 6:
-		getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 7;
-		KahinaCall(&LogicManager::CONS_Kahina_DoWalk1033, 2, 9270, 0, 0);
-		return;
-	case 8:
-		getCharacter(kCharacterKahina).characterPosition.location = 1;
-		endGraphics(kCharacterKahina);
-		setDoor(1, kCharacterCath, 0, 0, 0);
-		setDoor(17, kCharacterCath, 0, 0, 0);
-		getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 9;
-		KahinaCall(&LogicManager::CONS_Kahina_DoWait, 900, 0, 0, 0);
-		return;
-	case 9:
-		setDoor(1, kCharacterCath, 0, 10, 9);
-		setDoor(17, kCharacterCath, 0, 10, 9);
+		break;
+	case 18:
+		switch (getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8]) {
+		case 1:
+			if (!cathInCorridor(kCarGreenSleeping)) {
+				if (inSuite(kCharacterCath, kCarGreenSleeping, 7850) || cathOutHisWindow()) {
+					getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 6;
+					KahinaCall(&LogicManager::CONS_Kahina_DoDialog, "LIB013", 0, 0, 0);
+				} else {
+					getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 8;
+					KahinaCall(&LogicManager::CONS_Kahina_DoCorrOtis, "616Aa", 1, 0, 0);
+				}
+			} else {
+				getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 2;
+				KahinaCall(&LogicManager::CONS_Kahina_DoWalk1033, 3, 9460, 0, 0);
+			}
 
-		if (_gameInventory[kItemFirebird].location == 3) {
-			_gameProgress[kProgressField7C] = 1;
-			goto LABEL_41;
-		}
-		if (_gameInventory[kItemFirebird].location == 7) {
-			_gameProgress[kProgressField80] = 1;
-		LABEL_41:
-			takeItem(kItemFirebird);
-			_gameInventory[kItemFirebird].location = 5;
-			send(kCharacterKahina, kCharacterKronos, 138085344, 0);
-			dropItem(kItemBriefcase, 2);
-			_gameProgress[kProgressFieldC0] = _gameTime;
-			_gameProgress[kProgressField78] = 1;
-			goto LABEL_42;
-		}
-		if (!getCharacterParams(kCharacterKahina, 8)[2])
-			goto LABEL_43;
-		dropItem(kItemBriefcase, 2);
-		_gameProgress[kProgressField78] = 1;
-	LABEL_42:
-		getCharacterParams(kCharacterKahina, 8)[2] = 0;
-	LABEL_43:
-		if (_gameInventory[kItemFirebird].location != 18) {
-			getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 10;
-			KahinaCall(&LogicManager::CONS_Kahina_DoCorrOtis, "616Ba", 1, 0, 0);
+			break;
+		case 2:
+			getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 3;
+			KahinaCall(&LogicManager::CONS_Kahina_DoWait, 1800, 0, 0, 0);
+			break;
+		case 3:
+			getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 4;
+			KahinaCall(&LogicManager::CONS_Kahina_DoWalk1033, 3, 8200, 0, 0);
+			break;
+		case 4:
+			if (cathInCorridor(kCarGreenSleeping)) {
+				getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 5;
+				KahinaCall(&LogicManager::CONS_Kahina_DoWalk1033, 2, 9270, 0, 0);
+			} else {
+				if (inSuite(kCharacterCath, kCarGreenSleeping, 7850) || cathOutHisWindow()) {
+					getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 6;
+					KahinaCall(&LogicManager::CONS_Kahina_DoDialog, "LIB013", 0, 0, 0);
+				} else {
+					getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 8;
+					KahinaCall(&LogicManager::CONS_Kahina_DoCorrOtis, "616Aa", 1, 0, 0);
+				}
+			}
+
+			break;
+		case 5:
+		case 7:
+		case 11:
+		case 13:
+			endGraphics(kCharacterKahina);
+
+			getCharacter(kCharacterKahina).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterKahina, _functionsKahina[getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall]]);
+			fedEx(kCharacterKahina, kCharacterKahina, 18, 0);
+			break;
+		case 6:
+			getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 7;
+			KahinaCall(&LogicManager::CONS_Kahina_DoWalk1033, 2, 9270, 0, 0);
+			break;
+		case 8:
+			getCharacter(kCharacterKahina).characterPosition.location = 1;
+			endGraphics(kCharacterKahina);
+			setDoor(1, kCharacterCath, 0, 0, 0);
+			setDoor(17, kCharacterCath, 0, 0, 0);
+			getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 9;
+			KahinaCall(&LogicManager::CONS_Kahina_DoWait, 900, 0, 0, 0);
+			break;
+		case 9:
+			setDoor(1, kCharacterCath, 0, 10, 9);
+			setDoor(17, kCharacterCath, 0, 10, 9);
+
+			if (_gameInventory[kItemFirebird].location == 3) {
+				_gameProgress[kProgressField7C] = 1;
+				takeItem(kItemFirebird);
+				_gameInventory[kItemFirebird].location = 5;
+				send(kCharacterKahina, kCharacterKronos, 138085344, 0);
+				dropItem(kItemBriefcase, 2);
+				_gameProgress[kProgressFieldC0] = _gameTime;
+				_gameProgress[kProgressField78] = 1;
+				getCharacterParams(kCharacterKahina, 8)[2] = 0;
+
+				if (_gameInventory[kItemFirebird].location != 18) {
+					getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 10;
+					KahinaCall(&LogicManager::CONS_Kahina_DoCorrOtis, "616Ba", 1, 0, 0);
+				}
+
+				break;
+			}
+
+			if (_gameInventory[kItemFirebird].location == 7) {
+				_gameProgress[kProgressField80] = 1;
+				takeItem(kItemFirebird);
+				_gameInventory[kItemFirebird].location = 5;
+				send(kCharacterKahina, kCharacterKronos, 138085344, 0);
+				dropItem(kItemBriefcase, 2);
+				_gameProgress[kProgressFieldC0] = _gameTime;
+				_gameProgress[kProgressField78] = 1;
+				getCharacterParams(kCharacterKahina, 8)[2] = 0;
+	
+				if (_gameInventory[kItemFirebird].location != 18) {
+					getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 10;
+					KahinaCall(&LogicManager::CONS_Kahina_DoCorrOtis, "616Ba", 1, 0, 0);
+				}
+
+				break;
+			}
+
+			if (getCharacterParams(kCharacterKahina, 8)[2]) {
+				dropItem(kItemBriefcase, 2);
+				_gameProgress[kProgressField78] = 1;
+				getCharacterParams(kCharacterKahina, 8)[2] = 0;
+			}
+
+			if (_gameInventory[kItemFirebird].location != 18) {
+				getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 10;
+				KahinaCall(&LogicManager::CONS_Kahina_DoCorrOtis, "616Ba", 1, 0, 0);
+			}
+			break;
+		case 10:
+			getCharacter(kCharacterKahina).characterPosition.location = 0;
+			getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 11;
+			KahinaCall(&LogicManager::CONS_Kahina_DoWalk, 2, 9270, 0, 0);
+			break;
+		case 12:
+			getCharacter(kCharacterKahina).characterPosition.location = 0;
+			getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 13;
+			KahinaCall(&LogicManager::CONS_Kahina_DoWalk, 2, 9270, 0, 0);
+			break;
+		default:
+			break;
 		}
-		return;
-	case 10:
-		getCharacter(kCharacterKahina).characterPosition.location = 0;
-		getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 11;
-		KahinaCall(&LogicManager::CONS_Kahina_DoWalk, 2, 9270, 0, 0);
-		return;
-	case 12:
-		getCharacter(kCharacterKahina).characterPosition.location = 0;
-		getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 13;
-		KahinaCall(&LogicManager::CONS_Kahina_DoWalk, 2, 9270, 0, 0);
-		return;
+
+		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -1562,7 +1990,8 @@ void LogicManager::CONS_Kahina_SearchTatiana(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Kahina_SearchTatiana(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		if (_gameEvents[kEventAnnaBaggageArgument]) {
 			takeItem(kItemFirebird);
 			_gameInventory[kItemFirebird].location = 5;
@@ -1577,13 +2006,19 @@ void LogicManager::HAND_Kahina_SearchTatiana(HAND_PARAMS) {
 			getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 1;
 			KahinaCall(&LogicManager::CONS_Kahina_DoWalk1033, 4, 8200, 0, 0);
 		}
-	} else if (msg->action == 18) {
+
+		break;
+	case 18:
 		switch (getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8]) {
 		case 1:
-			if (!inSuite(kCharacterCath, kCarRedSleeping, 7850))
-				goto LABEL_14;
-			getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 2;
-			KahinaCall(&LogicManager::CONS_Kahina_DoWalk1033, 4, 9460, 0, 0);
+			if (!inSuite(kCharacterCath, kCarRedSleeping, 7850)) {
+				getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 6;
+				KahinaCall(&LogicManager::CONS_Kahina_DoCorrOtis, "616Aa", 32, 0, 0);
+			} else {
+				getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 2;
+				KahinaCall(&LogicManager::CONS_Kahina_DoWalk1033, 4, 9460, 0, 0);
+			}
+
 			break;
 		case 2:
 			getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 3;
@@ -1598,10 +2033,10 @@ void LogicManager::HAND_Kahina_SearchTatiana(HAND_PARAMS) {
 				getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 5;
 				KahinaCall(&LogicManager::CONS_Kahina_DoWalk1033, 2, 9270, 0, 0);
 			} else {
-			LABEL_14:
 				getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 6;
 				KahinaCall(&LogicManager::CONS_Kahina_DoCorrOtis, "616Aa", 32, 0, 0);
 			}
+
 			break;
 		case 5:
 		case 9:
@@ -1640,8 +2075,12 @@ void LogicManager::HAND_Kahina_SearchTatiana(HAND_PARAMS) {
 			KahinaCall(&LogicManager::CONS_Kahina_DoWalk, 2, 9270, 0, 0);
 			break;
 		default:
-			return;
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1656,14 +2095,8 @@ void LogicManager::CONS_Kahina_KillCathAnywhere(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Kahina_KillCathAnywhere(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			_gameTimeTicksDelta = 0;
-		} else if (msg->action == 18 && getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] == 1) {
-			playNIS(getCharacterCurrentParams(kCharacterKahina)[0]);
-			endGame(0, 1, 0, 1);
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		if (onLowPlatform(kCharacterCath)) {
 			getCharacterCurrentParams(kCharacterKahina)[0] = kEventKahinaPunchCar;
 		} else if (cathInCorridor(kCarGreenSleeping)) {
@@ -1681,10 +2114,25 @@ void LogicManager::HAND_Kahina_KillCathAnywhere(HAND_PARAMS) {
 		} else if (checkLoc(kCharacterCath, kCarBaggage)) {
 			getCharacterCurrentParams(kCharacterKahina)[0] = kEventKahinaPunchBaggageCar;
 		}
+
 		if (getCharacterCurrentParams(kCharacterKahina)[0]) {
 			getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 1;
 			KahinaCall(&LogicManager::CONS_Kahina_SaveGame, 2, kEventKahinaPunchBaggageCarEntrance, 0, 0);
 		}
+
+		break;
+	case 12:
+		_gameTimeTicksDelta = 0;
+		break;
+	case 18:
+		if (getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] == 1) {
+			playNIS(getCharacterCurrentParams(kCharacterKahina)[0]);
+			endGame(0, 1, 0, true);
+		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1699,8 +2147,13 @@ void LogicManager::CONS_Kahina_StartPart4(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Kahina_StartPart4(HAND_PARAMS) {
-	if (msg->action == 12)
+	switch (msg->action) {
+	case 12:
 		endGraphics(kCharacterKahina);
+		break;
+	default:
+		break;
+	}
 }
 
 void LogicManager::CONS_Kahina_StartPart5(CONS_PARAMS) {
@@ -1714,8 +2167,13 @@ void LogicManager::CONS_Kahina_StartPart5(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Kahina_StartPart5(HAND_PARAMS) {
-	if (msg->action == 12)
+	switch (msg->action) {
+	case 12:
 		endGraphics(kCharacterKahina);
+		break;
+	default:
+		break;
+	}
 }
 
 void (LogicManager::*LogicManager::_functionsKahina[])(HAND_PARAMS) = {


Commit: b80ecda5e3b9d5023022dd97b7d535ef83df18a4
    https://github.com/scummvm/scummvm/commit/b80ecda5e3b9d5023022dd97b7d535ef83df18a4
Author: AndywinXp (andywinxp at gmail.com)
Date: 2025-06-16T23:12:18+02:00

Commit Message:
LASTEXPRESS: Clean up Waiter1 logic

Changed paths:
    engines/lastexpress/characters/waiter1.cpp


diff --git a/engines/lastexpress/characters/waiter1.cpp b/engines/lastexpress/characters/waiter1.cpp
index d0e0af633b6..089a1eaf116 100644
--- a/engines/lastexpress/characters/waiter1.cpp
+++ b/engines/lastexpress/characters/waiter1.cpp
@@ -48,7 +48,7 @@ void LogicManager::CONS_Waiter1(int chapter) {
 		CONS_Waiter1_StartPart5(0, 0, 0, 0);
 		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -90,18 +90,20 @@ void LogicManager::HAND_Waiter1_DoJoinedSeqOtis(HAND_PARAMS) {
 			playChrExcuseMe(kCharacterWaiter1, kCharacterCath, 0);
 			getCharacterCurrentParams(kCharacterWaiter1)[9] = 1;
 		}
+
 		break;
 	case 10:
 		if (!getCharacterCurrentParams(kCharacterWaiter1)[8]) {
 			fedEx(kCharacterWaiter1, getCharacterCurrentParams(kCharacterWaiter1)[3], getCharacterCurrentParams(kCharacterWaiter1)[4], (char *)&getCharacterCurrentParams(kCharacterWaiter1)[5]);
 			getCharacterCurrentParams(kCharacterWaiter1)[8] = 1;
 		}
+
 		break;
 	case 12:
 		startSeqOtis(kCharacterWaiter1, (char *)&getCharacterCurrentParams(kCharacterWaiter1)[0]);
 		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -118,10 +120,11 @@ void LogicManager::CONS_Waiter1_DoWait(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Waiter1_DoWait(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		if (getCharacterCurrentParams(kCharacterWaiter1)[1] || (getCharacterCurrentParams(kCharacterWaiter1)[1] = _gameTime + getCharacterCurrentParams(kCharacterWaiter1)[0], _gameTime + getCharacterCurrentParams(kCharacterWaiter1)[0] != 0)) {
 			if (getCharacterCurrentParams(kCharacterWaiter1)[1] >= _gameTime)
-				return;
+				break;
 
 			getCharacterCurrentParams(kCharacterWaiter1)[1] = 0x7FFFFFFF;
 		}
@@ -129,6 +132,9 @@ void LogicManager::HAND_Waiter1_DoWait(HAND_PARAMS) {
 		getCharacter(kCharacterWaiter1).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterWaiter1, _functionsWaiter1[getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall]]);
 		fedEx(kCharacterWaiter1, kCharacterWaiter1, 18, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -156,10 +162,13 @@ void LogicManager::HAND_Waiter1_DoSeqOtis(HAND_PARAMS) {
 			playChrExcuseMe(kCharacterWaiter1, kCharacterCath, 0);
 			getCharacterCurrentParams(kCharacterWaiter1)[3] = 1;
 		}
+
 		break;
 	case 12:
 		startSeqOtis(kCharacterWaiter1, (char *)&getCharacterCurrentParams(kCharacterWaiter1)[0]);
 		break;
+	default:
+		break;
 	}
 }
 
@@ -192,11 +201,14 @@ void LogicManager::HAND_Waiter1_DoBlockSeqOtis(HAND_PARAMS) {
 			playChrExcuseMe(kCharacterWaiter1, kCharacterCath, 0);
 			getCharacterCurrentParams(kCharacterWaiter1)[5] = 1;
 		}
+
 		break;
 	case 12:
 		startSeqOtis(kCharacterWaiter1, (char *)&getCharacterCurrentParams(kCharacterWaiter1)[0]);
 		blockView(kCharacterWaiter1, getCharacterCurrentParams(kCharacterWaiter1)[3], getCharacterCurrentParams(kCharacterWaiter1)[4]);
 		break;
+	default:
+		break;
 	}
 }
 
@@ -211,21 +223,29 @@ void LogicManager::CONS_Waiter1_FinishSeqOtis(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Waiter1_FinishSeqOtis(HAND_PARAMS) {
-	if (msg->action == 0) {
-		if (getCharacter(kCharacterWaiter1).direction == 4)
-			return;
-		goto LABEL_6;
-	}
-	if (msg->action == 3) {
-	LABEL_6:
+	switch (msg->action) {
+	case 0:
+		if (getCharacter(kCharacterWaiter1).direction != 4) {
+			getCharacter(kCharacterWaiter1).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterWaiter1, _functionsWaiter1[getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall]]);
+			fedEx(kCharacterWaiter1, kCharacterWaiter1, 18, 0);
+		}
+
+		break;
+	case 3:
 		getCharacter(kCharacterWaiter1).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterWaiter1, _functionsWaiter1[getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall]]);
 		fedEx(kCharacterWaiter1, kCharacterWaiter1, 18, 0);
-		return;
-	}
-	if (msg->action == 5 && !getCharacterCurrentParams(kCharacterWaiter1)[0]) {
-		playChrExcuseMe(kCharacterWaiter1, kCharacterCath, 0);
-		getCharacterCurrentParams(kCharacterWaiter1)[0] = 1;
+		break;
+	case 5:
+		if (!getCharacterCurrentParams(kCharacterWaiter1)[0]) {
+			playChrExcuseMe(kCharacterWaiter1, kCharacterCath, 0);
+			getCharacterCurrentParams(kCharacterWaiter1)[0] = 1;
+		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -240,12 +260,17 @@ void LogicManager::CONS_Waiter1_DoDialog(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Waiter1_DoDialog(HAND_PARAMS) {
-	if (msg->action == 2) {
+	switch (msg->action) {
+	case 2:
 		getCharacter(kCharacterWaiter1).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterWaiter1, _functionsWaiter1[getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall]]);
 		fedEx(kCharacterWaiter1, kCharacterWaiter1, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		playDialog(kCharacterWaiter1, (char *)&getCharacterCurrentParams(kCharacterWaiter1)[0], -1, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -280,11 +305,14 @@ void LogicManager::HAND_Waiter1_RebeccaFeedUs(HAND_PARAMS) {
 			_engine->getMessageManager()->setMessageHandle(kCharacterWaiter1, _functionsWaiter1[getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall]]);
 			fedEx(kCharacterWaiter1, kCharacterWaiter1, 18, 0);
 		}
+
 		break;
 	case 136702400:
 		getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] = 2;
 		Waiter1Call(&LogicManager::CONS_Waiter1_DoSeqOtis, "913", 0, 0, 0);
 		break;
+	default:
+		break;
 	}
 }
 
@@ -299,12 +327,14 @@ void LogicManager::CONS_Waiter1_RebeccaClearOurTable(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Waiter1_RebeccaClearOurTable(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterWaiter1).characterPosition.position = 5800;
 		getCharacter(kCharacterWaiter1).characterPosition.location = 0;
 		getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] = 1;
 		Waiter1Call(&LogicManager::CONS_Waiter1_DoSeqOtis, "911", 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8]) {
 		case 1:
 			send(kCharacterWaiter1, kCharacterTableD, 136455232, 0);
@@ -324,7 +354,13 @@ void LogicManager::HAND_Waiter1_RebeccaClearOurTable(HAND_PARAMS) {
 			_engine->getMessageManager()->setMessageHandle(kCharacterWaiter1, _functionsWaiter1[getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall]]);
 			fedEx(kCharacterWaiter1, kCharacterWaiter1, 18, 0);
 			break;
+		default:
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -339,12 +375,14 @@ void LogicManager::CONS_Waiter1_AbbotCheckMe(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Waiter1_AbbotCheckMe(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterWaiter1).characterPosition.position = 5800;
 		getCharacter(kCharacterWaiter1).characterPosition.location = 0;
 		getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] = 1;
 		Waiter1Call(&LogicManager::CONS_Waiter1_DoSeqOtis, "915", 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8]) {
 		case 1:
 			send(kCharacterWaiter1, kCharacterAbbot, 122358304, 0);
@@ -373,7 +411,13 @@ void LogicManager::HAND_Waiter1_AbbotCheckMe(HAND_PARAMS) {
 			_engine->getMessageManager()->setMessageHandle(kCharacterWaiter1, _functionsWaiter1[getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall]]);
 			fedEx(kCharacterWaiter1, kCharacterWaiter1, 18, 0);
 			break;
+		default:
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -388,10 +432,12 @@ void LogicManager::CONS_Waiter1_AbbotClearTable(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Waiter1_AbbotClearTable(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] = 1;
 		Waiter1Call(&LogicManager::CONS_Waiter1_DoSeqOtis, "916", 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8]) {
 		case 1:
 			send(kCharacterWaiter1, kCharacterTableE, 136455232, 0);
@@ -411,7 +457,13 @@ void LogicManager::HAND_Waiter1_AbbotClearTable(HAND_PARAMS) {
 			_engine->getMessageManager()->setMessageHandle(kCharacterWaiter1, _functionsWaiter1[getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall]]);
 			fedEx(kCharacterWaiter1, kCharacterWaiter1, 18, 0);
 			break;
+		default:
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -426,30 +478,33 @@ void LogicManager::CONS_Waiter1_Birth(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Waiter1_Birth(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			autoMessage(kCharacterWaiter1, 270410280, 0);
-			autoMessage(kCharacterWaiter1, 304061224, 1);
-			autoMessage(kCharacterWaiter1, 252568704, 10);
-			autoMessage(kCharacterWaiter1, 286534136, 11);
-			autoMessage(kCharacterWaiter1, 218983616, 12);
-			autoMessage(kCharacterWaiter1, 218586752, 13);
-			autoMessage(kCharacterWaiter1, 207330561, 14);
-			autoMessage(kCharacterWaiter1, 286403504, 16);
-			autoMessage(kCharacterWaiter1, 218128129, 17);
-			autoMessage(kCharacterWaiter1, 270068760, 18);
-			autoMessage(kCharacterWaiter1, 223712416, 2);
-			autoMessage(kCharacterWaiter1, 237485916, 5);
-			autoMessage(kCharacterWaiter1, 188893625, 8);
-			autoMessage(kCharacterWaiter1, 204704037, 6);
-			autoMessage(kCharacterWaiter1, 292758554, 7);
-			autoMessage(kCharacterWaiter1, 337548856, 9);
-			getCharacter(kCharacterWaiter1).characterPosition.car = kCarRestaurant;
-			getCharacter(kCharacterWaiter1).characterPosition.location = 0;
-			getCharacter(kCharacterWaiter1).characterPosition.position = 5900;
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		CONS_Waiter1_ServingDinner(0, 0, 0, 0);
+		break;
+	case 12:
+		autoMessage(kCharacterWaiter1, 270410280, 0);
+		autoMessage(kCharacterWaiter1, 304061224, 1);
+		autoMessage(kCharacterWaiter1, 252568704, 10);
+		autoMessage(kCharacterWaiter1, 286534136, 11);
+		autoMessage(kCharacterWaiter1, 218983616, 12);
+		autoMessage(kCharacterWaiter1, 218586752, 13);
+		autoMessage(kCharacterWaiter1, 207330561, 14);
+		autoMessage(kCharacterWaiter1, 286403504, 16);
+		autoMessage(kCharacterWaiter1, 218128129, 17);
+		autoMessage(kCharacterWaiter1, 270068760, 18);
+		autoMessage(kCharacterWaiter1, 223712416, 2);
+		autoMessage(kCharacterWaiter1, 237485916, 5);
+		autoMessage(kCharacterWaiter1, 188893625, 8);
+		autoMessage(kCharacterWaiter1, 204704037, 6);
+		autoMessage(kCharacterWaiter1, 292758554, 7);
+		autoMessage(kCharacterWaiter1, 337548856, 9);
+		getCharacter(kCharacterWaiter1).characterPosition.car = kCarRestaurant;
+		getCharacter(kCharacterWaiter1).characterPosition.location = 0;
+		getCharacter(kCharacterWaiter1).characterPosition.position = 5900;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -464,19 +519,27 @@ void LogicManager::CONS_Waiter1_AnnaOrder(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Waiter1_AnnaOrder(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterWaiter1).characterPosition.position = 5800;
 		getCharacter(kCharacterWaiter1).characterPosition.location = 0;
 		getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] = 1;
 		Waiter1Call(&LogicManager::CONS_Waiter1_DoSeqOtis, "907", 0, 0, 0);
-	} else if (msg->action == 18 && getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] == 1) {
-		endGraphics(kCharacterWaiter1);
-		send(kCharacterWaiter1, kCharacterAnna, 268773672, 0);
-		getCharacterParams(kCharacterWaiter1, 8)[0] = 0;
+		break;
+	case 18:
+		if (getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] == 1) {
+			endGraphics(kCharacterWaiter1);
+			send(kCharacterWaiter1, kCharacterAnna, 268773672, 0);
+			getCharacterParams(kCharacterWaiter1, 8)[0] = 0;
 
-		getCharacter(kCharacterWaiter1).currentCall--;
-		_engine->getMessageManager()->setMessageHandle(kCharacterWaiter1, _functionsWaiter1[getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall]]);
-		fedEx(kCharacterWaiter1, kCharacterWaiter1, 18, 0);
+			getCharacter(kCharacterWaiter1).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterWaiter1, _functionsWaiter1[getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall]]);
+			fedEx(kCharacterWaiter1, kCharacterWaiter1, 18, 0);
+		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -491,19 +554,27 @@ void LogicManager::CONS_Waiter1_AugustOrder(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Waiter1_AugustOrder(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterWaiter1).characterPosition.position = 5800;
 		getCharacter(kCharacterWaiter1).characterPosition.location = 0;
 		getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] = 1;
 		Waiter1Call(&LogicManager::CONS_Waiter1_DoSeqOtis, "911", 0, 0, 0);
-	} else if (msg->action == 18 && getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] == 1) {
-		startCycOtis(kCharacterWaiter1, "010F");
-		send(kCharacterWaiter1, kCharacterAugust, 268773672, 0);
-		getCharacterParams(kCharacterWaiter1, 8)[1] = 0;
+		break;
+	case 18:
+		if (getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] == 1) {
+			startCycOtis(kCharacterWaiter1, "010F");
+			send(kCharacterWaiter1, kCharacterAugust, 268773672, 0);
+			getCharacterParams(kCharacterWaiter1, 8)[1] = 0;
 
-		getCharacter(kCharacterWaiter1).currentCall--;
-		_engine->getMessageManager()->setMessageHandle(kCharacterWaiter1, _functionsWaiter1[getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall]]);
-		fedEx(kCharacterWaiter1, kCharacterWaiter1, 18, 0);
+			getCharacter(kCharacterWaiter1).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterWaiter1, _functionsWaiter1[getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall]]);
+			fedEx(kCharacterWaiter1, kCharacterWaiter1, 18, 0);
+		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -518,19 +589,27 @@ void LogicManager::CONS_Waiter1_ServeAnna(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Waiter1_ServeAnna(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterWaiter1).characterPosition.position = 5800;
 		getCharacter(kCharacterWaiter1).characterPosition.location = 0;
 		getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] = 1;
 		Waiter1Call(&LogicManager::CONS_Waiter1_DoSeqOtis, "908", 0, 0, 0);
-	} else if (msg->action == 18 && getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] == 1) {
-		endGraphics(kCharacterWaiter1);
-		send(kCharacterWaiter1, kCharacterAnna, 170016384, 0);
-		getCharacterParams(kCharacterWaiter1, 8)[3] = 0;
+		break;
+	case 18:
+		if (getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] == 1) {
+			endGraphics(kCharacterWaiter1);
+			send(kCharacterWaiter1, kCharacterAnna, 170016384, 0);
+			getCharacterParams(kCharacterWaiter1, 8)[3] = 0;
 
-		getCharacter(kCharacterWaiter1).currentCall--;
-		_engine->getMessageManager()->setMessageHandle(kCharacterWaiter1, _functionsWaiter1[getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall]]);
-		fedEx(kCharacterWaiter1, kCharacterWaiter1, 18, 0);
+			getCharacter(kCharacterWaiter1).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterWaiter1, _functionsWaiter1[getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall]]);
+			fedEx(kCharacterWaiter1, kCharacterWaiter1, 18, 0);
+		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -545,19 +624,27 @@ void LogicManager::CONS_Waiter1_ServeAugust(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Waiter1_ServeAugust(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterWaiter1).characterPosition.position = 5800;
 		getCharacter(kCharacterWaiter1).characterPosition.location = 0;
 		getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] = 1;
 		Waiter1Call(&LogicManager::CONS_Waiter1_DoSeqOtis, "912", 0, 0, 0);
-	} else if (msg->action == 18 && getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] == 1) {
-		endGraphics(kCharacterWaiter1);
-		send(kCharacterWaiter1, kCharacterAugust, 170016384, 0);
-		getCharacterParams(kCharacterWaiter1, 8)[4] = 0;
+		break;
+	case 18:
+		if (getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] == 1) {
+			endGraphics(kCharacterWaiter1);
+			send(kCharacterWaiter1, kCharacterAugust, 170016384, 0);
+			getCharacterParams(kCharacterWaiter1, 8)[4] = 0;
 
-		getCharacter(kCharacterWaiter1).currentCall--;
-		_engine->getMessageManager()->setMessageHandle(kCharacterWaiter1, _functionsWaiter1[getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall]]);
-		fedEx(kCharacterWaiter1, kCharacterWaiter1, 18, 0);
+			getCharacter(kCharacterWaiter1).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterWaiter1, _functionsWaiter1[getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall]]);
+			fedEx(kCharacterWaiter1, kCharacterWaiter1, 18, 0);
+		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -572,12 +659,14 @@ void LogicManager::CONS_Waiter1_ClearAnna(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Waiter1_ClearAnna(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterWaiter1).characterPosition.position = 5800;
 		getCharacter(kCharacterWaiter1).characterPosition.location = 0;
 		getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] = 1;
 		Waiter1Call(&LogicManager::CONS_Waiter1_DoSeqOtis, "907", 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8]) {
 		case 1:
 			send(kCharacterWaiter1, kCharacterTableA, 136455232, 0);
@@ -597,7 +686,13 @@ void LogicManager::HAND_Waiter1_ClearAnna(HAND_PARAMS) {
 			_engine->getMessageManager()->setMessageHandle(kCharacterWaiter1, _functionsWaiter1[getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall]]);
 			fedEx(kCharacterWaiter1, kCharacterWaiter1, 18, 0);
 			break;
+		default:
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -612,12 +707,14 @@ void LogicManager::CONS_Waiter1_ClearTatiana(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Waiter1_ClearTatiana(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterWaiter1).characterPosition.position = 5800;
 		getCharacter(kCharacterWaiter1).characterPosition.location = 0;
 		getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] = 1;
 		Waiter1Call(&LogicManager::CONS_Waiter1_DoSeqOtis, "915", 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8]) {
 		case 1:
 			blockView(kCharacterWaiter1, kCarRestaurant, 67);
@@ -639,7 +736,13 @@ void LogicManager::HAND_Waiter1_ClearTatiana(HAND_PARAMS) {
 			_engine->getMessageManager()->setMessageHandle(kCharacterWaiter1, _functionsWaiter1[getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall]]);
 			fedEx(kCharacterWaiter1, kCharacterWaiter1, 18, 0);
 			break;
+		default:
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -654,12 +757,14 @@ void LogicManager::CONS_Waiter1_ClearAugust1(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Waiter1_ClearAugust1(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterWaiter1).characterPosition.position = 5800;
 		getCharacter(kCharacterWaiter1).characterPosition.location = 0;
 		getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] = 1;
 		Waiter1Call(&LogicManager::CONS_Waiter1_DoSeqOtis, "911", 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8]) {
 		case 1:
 			send(kCharacterWaiter1, kCharacterTableD, 136455232, 0);
@@ -679,7 +784,13 @@ void LogicManager::HAND_Waiter1_ClearAugust1(HAND_PARAMS) {
 			_engine->getMessageManager()->setMessageHandle(kCharacterWaiter1, _functionsWaiter1[getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall]]);
 			fedEx(kCharacterWaiter1, kCharacterWaiter1, 18, 0);
 			break;
+		default:
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -694,12 +805,14 @@ void LogicManager::CONS_Waiter1_ClearAugust2(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Waiter1_ClearAugust2(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterWaiter1).characterPosition.position = 5800;
 		getCharacter(kCharacterWaiter1).characterPosition.location = 0;
 		getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] = 1;
 		Waiter1Call(&LogicManager::CONS_Waiter1_DoSeqOtis, "911", 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8]) {
 		case 1:
 			send(kCharacterWaiter1, kCharacterTableD, 136455232, 0);
@@ -720,7 +833,13 @@ void LogicManager::HAND_Waiter1_ClearAugust2(HAND_PARAMS) {
 			_engine->getMessageManager()->setMessageHandle(kCharacterWaiter1, _functionsWaiter1[getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall]]);
 			fedEx(kCharacterWaiter1, kCharacterWaiter1, 18, 0);
 			break;
+		default:
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -735,87 +854,85 @@ void LogicManager::CONS_Waiter1_ServingDinner(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Waiter1_ServingDinner(HAND_PARAMS) {
-	if (msg->action > 18) {
-		if (msg->action == 136702400) {
-			if (msg->sender == 1) {
-				getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] = 13;
-				Waiter1Call(&LogicManager::CONS_Waiter1_DoSeqOtis, "909", 0, 0, 0);
-			} else {
-				getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] = 14;
-				Waiter1Call(&LogicManager::CONS_Waiter1_DoSeqOtis, "913", 0, 0, 0);
-			}
-		} else if (msg->action == 203859488) {
-			if (msg->sender == 1) {
-				getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] = 11;
-				Waiter1Call(&LogicManager::CONS_Waiter1_DoSeqOtis, "910", 0, 0, 0);
-			} else {
-				getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] = 12;
-				Waiter1Call(&LogicManager::CONS_Waiter1_DoSeqOtis, "913", 0, 0, 0);
-			}
-		}
-	} else {
-		if (msg->action != 18) {
-			if (msg->action)
-				return;
-			if (getCharacterCurrentParams(kCharacterWaiter1)[1]) {
-				if (getCharacterCurrentParams(kCharacterWaiter1)[2] || (getCharacterCurrentParams(kCharacterWaiter1)[2] = _gameTime + 2700, _gameTime != -2700)) {
-					if (getCharacterCurrentParams(kCharacterWaiter1)[2] >= _gameTime)
-						goto LABEL_14;
+	switch (msg->action) {
+	case 0:
+	{
+		bool skip1 = false;
+
+		if (getCharacterCurrentParams(kCharacterWaiter1)[1]) {
+			if (getCharacterCurrentParams(kCharacterWaiter1)[2] || (getCharacterCurrentParams(kCharacterWaiter1)[2] = _gameTime + 2700, _gameTime != -2700)) {
+				if (getCharacterCurrentParams(kCharacterWaiter1)[2] >= _gameTime) {
+					skip1 = true;
+				}
+
+				if (!skip1) {
 					getCharacterCurrentParams(kCharacterWaiter1)[2] = 0x7FFFFFFF;
 				}
+			}
+
+			if (!skip1) {
 				getCharacterParams(kCharacterWaiter1, 8)[3] = 1;
 				getCharacterCurrentParams(kCharacterWaiter1)[1] = 0;
 			}
-		LABEL_14:
-			if (getCharacterCurrentParams(kCharacterWaiter1)[0]) {
-				if (!getCharacterCurrentParams(kCharacterWaiter1)[3]) {
+		}
 
-					getCharacterCurrentParams(kCharacterWaiter1)[3] = _gameTime + 4500;
-					if (_gameTime == -4500)
-						goto LABEL_19;
-				}
-				if (getCharacterCurrentParams(kCharacterWaiter1)[3] < _gameTime) {
-					getCharacterCurrentParams(kCharacterWaiter1)[3] = 0x7FFFFFFF;
-				LABEL_19:
+		bool skip2 = false;
+
+		if (getCharacterCurrentParams(kCharacterWaiter1)[0]) {
+			if (!getCharacterCurrentParams(kCharacterWaiter1)[3]) {
+
+				getCharacterCurrentParams(kCharacterWaiter1)[3] = _gameTime + 4500;
+				if (_gameTime == -4500) {
+					skip2 = true;
 					getCharacterParams(kCharacterWaiter1, 8)[4] = 1;
 					getCharacterCurrentParams(kCharacterWaiter1)[0] = 0;
 				}
 			}
-			if (inKitchen(kCharacterWaiter1) && rcClear()) {
-				if (getCharacterParams(kCharacterWaiter1, 8)[0]) {
-					getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] = 1;
-					Waiter1Call(&LogicManager::CONS_Waiter1_AnnaOrder, 0, 0, 0, 0);
-				} else if (getCharacterParams(kCharacterWaiter1, 8)[1]) {
-					getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] = 2;
-					Waiter1Call(&LogicManager::CONS_Waiter1_AugustOrder, 0, 0, 0, 0);
-				} else if (getCharacterParams(kCharacterWaiter1, 8)[2]) {
-					getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] = 3;
-					Waiter1Call(&LogicManager::CONS_Waiter1_RebeccaFeedUs, 0, 0, 0, 0);
-				} else if (getCharacterParams(kCharacterWaiter1, 8)[3]) {
-					getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] = 4;
-					Waiter1Call(&LogicManager::CONS_Waiter1_ServeAnna, 0, 0, 0, 0);
-				} else if (getCharacterParams(kCharacterWaiter1, 8)[4]) {
-					getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] = 5;
-					Waiter1Call(&LogicManager::CONS_Waiter1_ServeAugust, 0, 0, 0, 0);
-				} else if (getCharacterParams(kCharacterWaiter1, 8)[5]) {
-					getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] = 6;
-					Waiter1Call(&LogicManager::CONS_Waiter1_ClearAnna, 0, 0, 0, 0);
-				} else if (getCharacterParams(kCharacterWaiter1, 8)[8]) {
-					getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] = 7;
-					Waiter1Call(&LogicManager::CONS_Waiter1_ClearTatiana, 0, 0, 0, 0);
-				} else if (getCharacterParams(kCharacterWaiter1, 8)[6]) {
-					getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] = 8;
-					Waiter1Call(&LogicManager::CONS_Waiter1_ClearAugust1, 0, 0, 0, 0);
-				} else if (getCharacterParams(kCharacterWaiter1, 8)[7]) {
-					getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] = 9;
-					Waiter1Call(&LogicManager::CONS_Waiter1_ClearAugust2, 0, 0, 0, 0);
-				} else if (getCharacterParams(kCharacterWaiter1, 8)[9]) {
-					getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] = 10;
-					Waiter1Call(&LogicManager::CONS_Waiter1_RebeccaClearOurTable, 0, 0, 0, 0);
-				}
+
+			if (!skip2 && getCharacterCurrentParams(kCharacterWaiter1)[3] < _gameTime) {
+				getCharacterCurrentParams(kCharacterWaiter1)[3] = 0x7FFFFFFF;
+				getCharacterParams(kCharacterWaiter1, 8)[4] = 1;
+				getCharacterCurrentParams(kCharacterWaiter1)[0] = 0;
+			}
+		}
+
+		if (inKitchen(kCharacterWaiter1) && rcClear()) {
+			if (getCharacterParams(kCharacterWaiter1, 8)[0]) {
+				getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] = 1;
+				Waiter1Call(&LogicManager::CONS_Waiter1_AnnaOrder, 0, 0, 0, 0);
+			} else if (getCharacterParams(kCharacterWaiter1, 8)[1]) {
+				getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] = 2;
+				Waiter1Call(&LogicManager::CONS_Waiter1_AugustOrder, 0, 0, 0, 0);
+			} else if (getCharacterParams(kCharacterWaiter1, 8)[2]) {
+				getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] = 3;
+				Waiter1Call(&LogicManager::CONS_Waiter1_RebeccaFeedUs, 0, 0, 0, 0);
+			} else if (getCharacterParams(kCharacterWaiter1, 8)[3]) {
+				getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] = 4;
+				Waiter1Call(&LogicManager::CONS_Waiter1_ServeAnna, 0, 0, 0, 0);
+			} else if (getCharacterParams(kCharacterWaiter1, 8)[4]) {
+				getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] = 5;
+				Waiter1Call(&LogicManager::CONS_Waiter1_ServeAugust, 0, 0, 0, 0);
+			} else if (getCharacterParams(kCharacterWaiter1, 8)[5]) {
+				getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] = 6;
+				Waiter1Call(&LogicManager::CONS_Waiter1_ClearAnna, 0, 0, 0, 0);
+			} else if (getCharacterParams(kCharacterWaiter1, 8)[8]) {
+				getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] = 7;
+				Waiter1Call(&LogicManager::CONS_Waiter1_ClearTatiana, 0, 0, 0, 0);
+			} else if (getCharacterParams(kCharacterWaiter1, 8)[6]) {
+				getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] = 8;
+				Waiter1Call(&LogicManager::CONS_Waiter1_ClearAugust1, 0, 0, 0, 0);
+			} else if (getCharacterParams(kCharacterWaiter1, 8)[7]) {
+				getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] = 9;
+				Waiter1Call(&LogicManager::CONS_Waiter1_ClearAugust2, 0, 0, 0, 0);
+			} else if (getCharacterParams(kCharacterWaiter1, 8)[9]) {
+				getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] = 10;
+				Waiter1Call(&LogicManager::CONS_Waiter1_RebeccaClearOurTable, 0, 0, 0, 0);
 			}
-			return;
 		}
+
+		break;
+	}
+	case 18:
 		switch (getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8]) {
 		case 10:
 			send(kCharacterWaiter1, kCharacterHeadWait, 352703104, 0);
@@ -837,8 +954,32 @@ void LogicManager::HAND_Waiter1_ServingDinner(HAND_PARAMS) {
 			getCharacter(kCharacterWaiter1).characterPosition.position = 5900;
 			break;
 		default:
-			return;
+			break;
+		}
+
+		break;
+	case 136702400:
+		if (msg->sender == kCharacterAnna) {
+			getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] = 13;
+			Waiter1Call(&LogicManager::CONS_Waiter1_DoSeqOtis, "909", 0, 0, 0);
+		} else {
+			getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] = 14;
+			Waiter1Call(&LogicManager::CONS_Waiter1_DoSeqOtis, "913", 0, 0, 0);
+		}
+
+		break;
+	case 203859488:
+		if (msg->sender == kCharacterAnna) {
+			getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] = 11;
+			Waiter1Call(&LogicManager::CONS_Waiter1_DoSeqOtis, "910", 0, 0, 0);
+		} else {
+			getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] = 12;
+			Waiter1Call(&LogicManager::CONS_Waiter1_DoSeqOtis, "913", 0, 0, 0);
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -853,10 +994,15 @@ void LogicManager::CONS_Waiter1_AfterDinner(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Waiter1_AfterDinner(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterWaiter1).characterPosition.position = 5900;
-	} else if (msg->action == 101632192) {
+		break;
+	case 101632192:
 		CONS_Waiter1_LockUp(0, 0, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -871,11 +1017,15 @@ void LogicManager::CONS_Waiter1_LockUp(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Waiter1_LockUp(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterWaiter1).characterPosition.car = kCarRestaurant;
 		getCharacter(kCharacterWaiter1).characterPosition.position = 5900;
 		getCharacter(kCharacterWaiter1).characterPosition.location = 0;
 		endGraphics(kCharacterWaiter1);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -890,19 +1040,22 @@ void LogicManager::CONS_Waiter1_StartPart2(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Waiter1_StartPart2(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			endGraphics(kCharacterWaiter1);
-			getCharacter(kCharacterWaiter1).characterPosition.position = 5900;
-			getCharacter(kCharacterWaiter1).characterPosition.location = 0;
-			getCharacter(kCharacterWaiter1).characterPosition.car = kCarRestaurant;
-			getCharacter(kCharacterWaiter1).inventoryItem = 0;
-			getCharacter(kCharacterWaiter1).clothes = 1;
-			getCharacterParams(kCharacterWaiter1, 8)[10] = 0;
-			getCharacterParams(kCharacterWaiter1, 8)[11] = 0;
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		CONS_Waiter1_InKitchen(0, 0, 0, 0);
+		break;
+	case 12:
+		endGraphics(kCharacterWaiter1);
+		getCharacter(kCharacterWaiter1).characterPosition.position = 5900;
+		getCharacter(kCharacterWaiter1).characterPosition.location = 0;
+		getCharacter(kCharacterWaiter1).characterPosition.car = kCarRestaurant;
+		getCharacter(kCharacterWaiter1).inventoryItem = 0;
+		getCharacter(kCharacterWaiter1).clothes = 1;
+		getCharacterParams(kCharacterWaiter1, 8)[10] = 0;
+		getCharacterParams(kCharacterWaiter1, 8)[11] = 0;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -917,21 +1070,30 @@ void LogicManager::CONS_Waiter1_InKitchen(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Waiter1_InKitchen(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 18 && getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] == 1) {
-		LABEL_9:
-			if (getCharacterParams(kCharacterWaiter1, 8)[11]) {
+	switch (msg->action) {
+	case 0:
+		if (inKitchen(kCharacterWaiter1) && rcClear()) {
+			if (getCharacterParams(kCharacterWaiter1, 8)[10]) {
+				getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] = 1;
+				Waiter1Call(&LogicManager::CONS_Waiter1_AugustComeHere2, 0, 0, 0, 0);
+			} else if (getCharacterParams(kCharacterWaiter1, 8)[11]) {
 				getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] = 2;
 				Waiter1Call(&LogicManager::CONS_Waiter1_AugustClearTable2, 0, 0, 0, 0);
 			}
 		}
-	} else if (inKitchen(kCharacterWaiter1) && rcClear()) {
-		if (getCharacterParams(kCharacterWaiter1, 8)[10]) {
-			getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] = 1;
-			Waiter1Call(&LogicManager::CONS_Waiter1_AugustComeHere2, 0, 0, 0, 0);
-			return;
+
+		break;
+	case 18:
+		if (getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] == 1) {
+			if (getCharacterParams(kCharacterWaiter1, 8)[11]) {
+				getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] = 2;
+				Waiter1Call(&LogicManager::CONS_Waiter1_AugustClearTable2, 0, 0, 0, 0);
+			}
 		}
-		goto LABEL_9;
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -966,11 +1128,14 @@ void LogicManager::HAND_Waiter1_AugustComeHere2(HAND_PARAMS) {
 			_engine->getMessageManager()->setMessageHandle(kCharacterWaiter1, _functionsWaiter1[getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall]]);
 			fedEx(kCharacterWaiter1, kCharacterWaiter1, 18, 0);
 		}
+
 		break;
 	case 219522616:
 		getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] = 2;
 		Waiter1Call(&LogicManager::CONS_Waiter1_DoSeqOtis, "959", 0, 0, 0);
 		break;
+	default:
+		break;
 	}
 }
 
@@ -985,12 +1150,14 @@ void LogicManager::CONS_Waiter1_AugustClearTable2(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Waiter1_AugustClearTable2(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterWaiter1).characterPosition.position = 5800;
 		getCharacter(kCharacterWaiter1).characterPosition.location = 0;
 		getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] = 1;
 		Waiter1Call(&LogicManager::CONS_Waiter1_DoSeqOtis, "957", 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8]) {
 		case 1:
 			send(kCharacterWaiter1, kCharacterTableA, 136455232, 0);
@@ -1010,7 +1177,13 @@ void LogicManager::HAND_Waiter1_AugustClearTable2(HAND_PARAMS) {
 			_engine->getMessageManager()->setMessageHandle(kCharacterWaiter1, _functionsWaiter1[getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall]]);
 			fedEx(kCharacterWaiter1, kCharacterWaiter1, 18, 0);
 			break;
+		default:
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1025,23 +1198,26 @@ void LogicManager::CONS_Waiter1_StartPart3(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Waiter1_StartPart3(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			endGraphics(kCharacterWaiter1);
-			getCharacter(kCharacterWaiter1).characterPosition.position = 5900;
-			getCharacter(kCharacterWaiter1).characterPosition.location = 0;
-			getCharacter(kCharacterWaiter1).characterPosition.car = kCarRestaurant;
-			getCharacter(kCharacterWaiter1).inventoryItem = 0;
-			getCharacter(kCharacterWaiter1).clothes = 1;
-			getCharacterParams(kCharacterWaiter1, 8)[12] = 0;
-			getCharacterParams(kCharacterWaiter1, 8)[13] = 0;
-			getCharacterParams(kCharacterWaiter1, 8)[18] = 0;
-			getCharacterParams(kCharacterWaiter1, 8)[19] = 0;
-			getCharacterParams(kCharacterWaiter1, 8)[2] = 0;
-			getCharacterParams(kCharacterWaiter1, 8)[9] = 0;
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		CONS_Waiter1_Serving3(0, 0, 0, 0);
+		break;
+	case 12:
+		endGraphics(kCharacterWaiter1);
+		getCharacter(kCharacterWaiter1).characterPosition.position = 5900;
+		getCharacter(kCharacterWaiter1).characterPosition.location = 0;
+		getCharacter(kCharacterWaiter1).characterPosition.car = kCarRestaurant;
+		getCharacter(kCharacterWaiter1).inventoryItem = 0;
+		getCharacter(kCharacterWaiter1).clothes = 1;
+		getCharacterParams(kCharacterWaiter1, 8)[12] = 0;
+		getCharacterParams(kCharacterWaiter1, 8)[13] = 0;
+		getCharacterParams(kCharacterWaiter1, 8)[18] = 0;
+		getCharacterParams(kCharacterWaiter1, 8)[19] = 0;
+		getCharacterParams(kCharacterWaiter1, 8)[2] = 0;
+		getCharacterParams(kCharacterWaiter1, 8)[9] = 0;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1056,58 +1232,94 @@ void LogicManager::CONS_Waiter1_Serving3(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Waiter1_Serving3(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 18) {
-			switch (getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8]) {
-			case 1:
-				goto LABEL_9;
-			case 2:
-				goto LABEL_11;
-			case 3:
-				goto LABEL_13;
-			case 4:
-				goto LABEL_15;
-			case 5:
-				goto LABEL_17;
-			default:
-				return;
+	switch (msg->action) {
+	case 0:
+		if (inKitchen(kCharacterWaiter1) && rcClear()) {
+			if (getCharacterParams(kCharacterWaiter1, 8)[12]) {
+				getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] = 1;
+				Waiter1Call(&LogicManager::CONS_Waiter1_AnnaComeHere3, 0, 0, 0, 0);
+				break;
+			}
+
+			if (getCharacterParams(kCharacterWaiter1, 8)[13]) {
+				getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] = 2;
+				Waiter1Call(&LogicManager::CONS_Waiter1_AbbotCheckMe, 0, 0, 0, 0);
+				break;
+			}
+
+			if (getCharacterParams(kCharacterWaiter1, 8)[19]) {
+				getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] = 3;
+				Waiter1Call(&LogicManager::CONS_Waiter1_AbbotServeLunch3, 0, 0, 0, 0);
+				break;
+			}
+
+			if (getCharacterParams(kCharacterWaiter1, 8)[18]) {
+				getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] = 4;
+				Waiter1Call(&LogicManager::CONS_Waiter1_AbbotClearTable, 0, 0, 0, 0);
+				break;
+			}
+
+			if (getCharacterParams(kCharacterWaiter1, 8)[2]) {
+				getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] = 5;
+				Waiter1Call(&LogicManager::CONS_Waiter1_RebeccaFeedUs, 0, 0, 0, 0);
+				break;
+			}
+
+			if (getCharacterParams(kCharacterWaiter1, 8)[9]) {
+				getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] = 6;
+				Waiter1Call(&LogicManager::CONS_Waiter1_RebeccaClearOurTable, 0, 0, 0, 0);
 			}
 		}
-	} else if (inKitchen(kCharacterWaiter1) && rcClear()) {
-		if (getCharacterParams(kCharacterWaiter1, 8)[12]) {
-			getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] = 1;
-			Waiter1Call(&LogicManager::CONS_Waiter1_AnnaComeHere3, 0, 0, 0, 0);
-		} else {
-		LABEL_9:
+
+		break;
+	case 18:
+		switch (getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8]) {
+		case 1:
 			if (getCharacterParams(kCharacterWaiter1, 8)[13]) {
 				getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] = 2;
 				Waiter1Call(&LogicManager::CONS_Waiter1_AbbotCheckMe, 0, 0, 0, 0);
-			} else {
-			LABEL_11:
-				if (getCharacterParams(kCharacterWaiter1, 8)[19]) {
-					getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] = 3;
-					Waiter1Call(&LogicManager::CONS_Waiter1_AbbotServeLunch3, 0, 0, 0, 0);
-				} else {
-				LABEL_13:
-					if (getCharacterParams(kCharacterWaiter1, 8)[18]) {
-						getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] = 4;
-						Waiter1Call(&LogicManager::CONS_Waiter1_AbbotClearTable, 0, 0, 0, 0);
-					} else {
-					LABEL_15:
-						if (getCharacterParams(kCharacterWaiter1, 8)[2]) {
-							getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] = 5;
-							Waiter1Call(&LogicManager::CONS_Waiter1_RebeccaFeedUs, 0, 0, 0, 0);
-						} else {
-						LABEL_17:
-							if (getCharacterParams(kCharacterWaiter1, 8)[9]) {
-								getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] = 6;
-								Waiter1Call(&LogicManager::CONS_Waiter1_RebeccaClearOurTable, 0, 0, 0, 0);
-							}
-						}
-					}
-				}
+				break;
+			}
+
+			// fall through
+		case 2:
+			if (getCharacterParams(kCharacterWaiter1, 8)[19]) {
+				getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] = 3;
+				Waiter1Call(&LogicManager::CONS_Waiter1_AbbotServeLunch3, 0, 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 3:
+			if (getCharacterParams(kCharacterWaiter1, 8)[18]) {
+				getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] = 4;
+				Waiter1Call(&LogicManager::CONS_Waiter1_AbbotClearTable, 0, 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 4:
+			if (getCharacterParams(kCharacterWaiter1, 8)[2]) {
+				getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] = 5;
+				Waiter1Call(&LogicManager::CONS_Waiter1_RebeccaFeedUs, 0, 0, 0, 0);
+				break;
 			}
+
+			// fall through
+		case 5:
+			if (getCharacterParams(kCharacterWaiter1, 8)[9]) {
+				getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] = 6;
+				Waiter1Call(&LogicManager::CONS_Waiter1_RebeccaClearOurTable, 0, 0, 0, 0);
+			}
+
+			break;
+		default:
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1122,12 +1334,14 @@ void LogicManager::CONS_Waiter1_AnnaComeHere3(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Waiter1_AnnaComeHere3(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterWaiter1).characterPosition.position = 5800;
 		getCharacter(kCharacterWaiter1).characterPosition.location = 0;
 		getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] = 1;
 		Waiter1Call(&LogicManager::CONS_Waiter1_DoSeqOtis, "911", 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8]) {
 		case 1:
 			send(kCharacterWaiter1, kCharacterAnna, 122358304, 0);
@@ -1149,7 +1363,13 @@ void LogicManager::HAND_Waiter1_AnnaComeHere3(HAND_PARAMS) {
 			_engine->getMessageManager()->setMessageHandle(kCharacterWaiter1, _functionsWaiter1[getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall]]);
 			fedEx(kCharacterWaiter1, kCharacterWaiter1, 18, 0);
 			break;
+		default:
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1164,12 +1384,14 @@ void LogicManager::CONS_Waiter1_AbbotServeLunch3(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Waiter1_AbbotServeLunch3(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterWaiter1).characterPosition.position = 5800;
 		getCharacter(kCharacterWaiter1).characterPosition.location = 0;
 		getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] = 1;
 		Waiter1Call(&LogicManager::CONS_Waiter1_DoSeqOtis, "916", 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8]) {
 		case 1:
 			send(kCharacterWaiter1, kCharacterAbbot, 122358304, 0);
@@ -1191,7 +1413,13 @@ void LogicManager::HAND_Waiter1_AbbotServeLunch3(HAND_PARAMS) {
 			_engine->getMessageManager()->setMessageHandle(kCharacterWaiter1, _functionsWaiter1[getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall]]);
 			fedEx(kCharacterWaiter1, kCharacterWaiter1, 18, 0);
 			break;
+		default:
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1206,23 +1434,26 @@ void LogicManager::CONS_Waiter1_StartPart4(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Waiter1_StartPart4(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			endGraphics(kCharacterWaiter1);
-			getCharacter(kCharacterWaiter1).characterPosition.car = kCarRestaurant;
-			getCharacter(kCharacterWaiter1).characterPosition.position = 5900;
-			getCharacter(kCharacterWaiter1).characterPosition.location = 0;
-			getCharacter(kCharacterWaiter1).inventoryItem = 0;
-			getCharacter(kCharacterWaiter1).clothes = 0;
-			getCharacterParams(kCharacterWaiter1, 8)[14] = 0;
-			getCharacterParams(kCharacterWaiter1, 8)[15] = 0;
-			getCharacterParams(kCharacterWaiter1, 8)[16] = 0;
-			getCharacterParams(kCharacterWaiter1, 8)[17] = 0;
-			getCharacterParams(kCharacterWaiter1, 8)[18] = 0;
-			getCharacterParams(kCharacterWaiter1, 8)[2] = 0;
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		CONS_Waiter1_Serving4(0, 0, 0, 0);
+		break;
+	case 12:
+		endGraphics(kCharacterWaiter1);
+		getCharacter(kCharacterWaiter1).characterPosition.car = kCarRestaurant;
+		getCharacter(kCharacterWaiter1).characterPosition.position = 5900;
+		getCharacter(kCharacterWaiter1).characterPosition.location = 0;
+		getCharacter(kCharacterWaiter1).inventoryItem = 0;
+		getCharacter(kCharacterWaiter1).clothes = 0;
+		getCharacterParams(kCharacterWaiter1, 8)[14] = 0;
+		getCharacterParams(kCharacterWaiter1, 8)[15] = 0;
+		getCharacterParams(kCharacterWaiter1, 8)[16] = 0;
+		getCharacterParams(kCharacterWaiter1, 8)[17] = 0;
+		getCharacterParams(kCharacterWaiter1, 8)[18] = 0;
+		getCharacterParams(kCharacterWaiter1, 8)[2] = 0;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1237,83 +1468,124 @@ void LogicManager::CONS_Waiter1_Serving4(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Waiter1_Serving4(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 18) {
-			switch (getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8]) {
-			case 1:
-				getCharacterCurrentParams(kCharacterWaiter1)[0] = 1;
-				goto LABEL_17;
-			case 2:
-				goto LABEL_19;
-			case 3:
-				goto LABEL_21;
-			case 4:
-				goto LABEL_23;
-			case 5:
-				goto LABEL_25;
-			default:
-				return;
+	switch (msg->action) {
+	case 0:
+		if (getCharacterCurrentParams(kCharacterWaiter1)[0]) {
+			bool skip = false;
+
+			if (!getCharacterCurrentParams(kCharacterWaiter1)[1]) {
+				getCharacterCurrentParams(kCharacterWaiter1)[1] = _gameTime + 3600;
+				if (_gameTime == -3600) {
+					skip = true;
+					getCharacterParams(kCharacterWaiter1, 8)[15] = 1;
+					getCharacterCurrentParams(kCharacterWaiter1)[0] = 0;
+				}
+			}
+
+			if (!skip && getCharacterCurrentParams(kCharacterWaiter1)[1] < _gameTime) {
+				getCharacterCurrentParams(kCharacterWaiter1)[1] = 0x7FFFFFFF;
+				getCharacterParams(kCharacterWaiter1, 8)[15] = 1;
+				getCharacterCurrentParams(kCharacterWaiter1)[0] = 0;
 			}
-		} else if (msg->action == 201431954) {
-			getCharacter(kCharacterWaiter1).callParams[8].parameters[14] = 0;
-			getCharacterParams(kCharacterWaiter1, 8)[15] = 0;
-			getCharacterParams(kCharacterWaiter1, 8)[16] = 0;
-			getCharacterParams(kCharacterWaiter1, 8)[18] = 0;
-			getCharacterParams(kCharacterWaiter1, 8)[2] = 0;
-			getCharacterCurrentParams(kCharacterWaiter1)[0] = 0;
-			getCharacter(kCharacterWaiter1).characterPosition.position = 5900;
-			getCharacter(kCharacterWaiter1).characterPosition.location = 0;
-		}
-		return;
-	}
-	if (getCharacterCurrentParams(kCharacterWaiter1)[0]) {
-		if (!getCharacterCurrentParams(kCharacterWaiter1)[1]) {
-			getCharacterCurrentParams(kCharacterWaiter1)[1] = _gameTime + 3600;
-			if (_gameTime == -3600)
-				goto LABEL_10;
 		}
-		if (getCharacterCurrentParams(kCharacterWaiter1)[1] < _gameTime) {
-			getCharacterCurrentParams(kCharacterWaiter1)[1] = 0x7FFFFFFF;
-		LABEL_10:
-			getCharacterParams(kCharacterWaiter1, 8)[15] = 1;
-			getCharacterCurrentParams(kCharacterWaiter1)[0] = 0;
+
+		if (inKitchen(kCharacterWaiter1) && rcClear()) {
+			if (getCharacterParams(kCharacterWaiter1, 8)[14]) {
+				getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] = 1;
+				Waiter1Call(&LogicManager::CONS_Waiter1_AugustOrder4, 0, 0, 0, 0);
+				break;
+			}
+
+			if (getCharacterParams(kCharacterWaiter1, 8)[15]) {
+				getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] = 2;
+				Waiter1Call(&LogicManager::CONS_Waiter1_ServeAugust4, 0, 0, 0, 0);
+				break;
+			}
+
+			if (getCharacterParams(kCharacterWaiter1, 8)[16]) {
+				getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] = 3;
+				Waiter1Call(&LogicManager::CONS_Waiter1_AugustClearTable, 0, 0, 0, 0);
+				break;
+			}
+
+			if (getCharacterParams(kCharacterWaiter1, 8)[17]) {
+				getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] = 4;
+				Waiter1Call(&LogicManager::CONS_Waiter1_AbbotCheckMe, 0, 0, 0, 0);
+				break;
+			}
+
+			if (getCharacterParams(kCharacterWaiter1, 8)[18]) {
+				getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] = 5;
+				Waiter1Call(&LogicManager::CONS_Waiter1_AbbotClearTable, 0, 0, 0, 0);
+				break;
+			}
+
+			if (getCharacterParams(kCharacterWaiter1, 8)[2]) {
+				getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] = 6;
+				Waiter1Call(&LogicManager::CONS_Waiter1_RebeccaFeedUs, 0, 0, 0, 0);
+			}
 		}
-	}
-	if (inKitchen(kCharacterWaiter1) && rcClear()) {
-		if (getCharacterParams(kCharacterWaiter1, 8)[14]) {
-			getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] = 1;
-			Waiter1Call(&LogicManager::CONS_Waiter1_AugustOrder4, 0, 0, 0, 0);
-		} else {
-		LABEL_17:
+
+		break;
+	case 18:
+		switch (getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8]) {
+		case 1:
+			getCharacterCurrentParams(kCharacterWaiter1)[0] = 1;
 			if (getCharacterParams(kCharacterWaiter1, 8)[15]) {
 				getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] = 2;
 				Waiter1Call(&LogicManager::CONS_Waiter1_ServeAugust4, 0, 0, 0, 0);
-			} else {
-			LABEL_19:
-				if (getCharacterParams(kCharacterWaiter1, 8)[16]) {
-					getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] = 3;
-					Waiter1Call(&LogicManager::CONS_Waiter1_AugustClearTable, 0, 0, 0, 0);
-				} else {
-				LABEL_21:
-					if (getCharacterParams(kCharacterWaiter1, 8)[17]) {
-						getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] = 4;
-						Waiter1Call(&LogicManager::CONS_Waiter1_AbbotCheckMe, 0, 0, 0, 0);
-					} else {
-					LABEL_23:
-						if (getCharacterParams(kCharacterWaiter1, 8)[18]) {
-							getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] = 5;
-							Waiter1Call(&LogicManager::CONS_Waiter1_AbbotClearTable, 0, 0, 0, 0);
-						} else {
-						LABEL_25:
-							if (getCharacterParams(kCharacterWaiter1, 8)[2]) {
-								getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] = 6;
-								Waiter1Call(&LogicManager::CONS_Waiter1_RebeccaFeedUs, 0, 0, 0, 0);
-							}
-						}
-					}
-				}
+				break;
+			}
+
+			// fall through
+		case 2:
+			if (getCharacterParams(kCharacterWaiter1, 8)[16]) {
+				getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] = 3;
+				Waiter1Call(&LogicManager::CONS_Waiter1_AugustClearTable, 0, 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 3:
+			if (getCharacterParams(kCharacterWaiter1, 8)[17]) {
+				getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] = 4;
+				Waiter1Call(&LogicManager::CONS_Waiter1_AbbotCheckMe, 0, 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 4:
+			if (getCharacterParams(kCharacterWaiter1, 8)[18]) {
+				getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] = 5;
+				Waiter1Call(&LogicManager::CONS_Waiter1_AbbotClearTable, 0, 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 5:
+			if (getCharacterParams(kCharacterWaiter1, 8)[2]) {
+				getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] = 6;
+				Waiter1Call(&LogicManager::CONS_Waiter1_RebeccaFeedUs, 0, 0, 0, 0);
 			}
+
+			break;
+		default:
+			break;
 		}
+
+		break;
+	case 201431954:
+		getCharacter(kCharacterWaiter1).callParams[8].parameters[14] = 0;
+		getCharacterParams(kCharacterWaiter1, 8)[15] = 0;
+		getCharacterParams(kCharacterWaiter1, 8)[16] = 0;
+		getCharacterParams(kCharacterWaiter1, 8)[18] = 0;
+		getCharacterParams(kCharacterWaiter1, 8)[2] = 0;
+		getCharacterCurrentParams(kCharacterWaiter1)[0] = 0;
+		getCharacter(kCharacterWaiter1).characterPosition.position = 5900;
+		getCharacter(kCharacterWaiter1).characterPosition.location = 0;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1328,10 +1600,12 @@ void LogicManager::CONS_Waiter1_AugustOrder4(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Waiter1_AugustOrder4(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] = 1;
 		Waiter1Call(&LogicManager::CONS_Waiter1_DoSeqOtis, "911", 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8]) {
 		case 1:
 			startCycOtis(kCharacterWaiter1, "010F3");
@@ -1353,7 +1627,13 @@ void LogicManager::HAND_Waiter1_AugustOrder4(HAND_PARAMS) {
 			_engine->getMessageManager()->setMessageHandle(kCharacterWaiter1, _functionsWaiter1[getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall]]);
 			fedEx(kCharacterWaiter1, kCharacterWaiter1, 18, 0);
 			break;
+		default:
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1368,10 +1648,12 @@ void LogicManager::CONS_Waiter1_ServeAugust4(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Waiter1_ServeAugust4(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] = 1;
 		Waiter1Call(&LogicManager::CONS_Waiter1_DoSeqOtis, "912", 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8]) {
 		case 1:
 			send(kCharacterWaiter1, kCharacterAugust, 122358304, 0);
@@ -1393,7 +1675,13 @@ void LogicManager::HAND_Waiter1_ServeAugust4(HAND_PARAMS) {
 			_engine->getMessageManager()->setMessageHandle(kCharacterWaiter1, _functionsWaiter1[getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall]]);
 			fedEx(kCharacterWaiter1, kCharacterWaiter1, 18, 0);
 			break;
+		default:
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1408,10 +1696,12 @@ void LogicManager::CONS_Waiter1_AugustClearTable(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Waiter1_AugustClearTable(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] = 1;
 		Waiter1Call(&LogicManager::CONS_Waiter1_DoSeqOtis, "911", 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8]) {
 		case 1:
 			send(kCharacterWaiter1, kCharacterTableD, 136455232, 0);
@@ -1432,7 +1722,13 @@ void LogicManager::HAND_Waiter1_AugustClearTable(HAND_PARAMS) {
 			_engine->getMessageManager()->setMessageHandle(kCharacterWaiter1, _functionsWaiter1[getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall]]);
 			fedEx(kCharacterWaiter1, kCharacterWaiter1, 18, 0);
 			break;
+		default:
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1447,16 +1743,19 @@ void LogicManager::CONS_Waiter1_StartPart5(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Waiter1_StartPart5(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			endGraphics(kCharacterWaiter1);
-			getCharacter(kCharacterWaiter1).characterPosition.car = kCarRestaurant;
-			getCharacter(kCharacterWaiter1).characterPosition.position = 3969;
-			getCharacter(kCharacterWaiter1).characterPosition.location = 1;
-			getCharacter(kCharacterWaiter1).inventoryItem = 0;
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		CONS_Waiter1_Prisoner(0, 0, 0, 0);
+		break;
+	case 12:
+		endGraphics(kCharacterWaiter1);
+		getCharacter(kCharacterWaiter1).characterPosition.car = kCarRestaurant;
+		getCharacter(kCharacterWaiter1).characterPosition.position = 3969;
+		getCharacter(kCharacterWaiter1).characterPosition.location = 1;
+		getCharacter(kCharacterWaiter1).inventoryItem = 0;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1471,8 +1770,13 @@ void LogicManager::CONS_Waiter1_Prisoner(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Waiter1_Prisoner(HAND_PARAMS) {
-	if (msg->action == 70549068)
+	switch (msg->action) {
+	case 70549068:
 		CONS_Waiter1_Disappear(0, 0, 0, 0);
+		break;
+	default:
+		break;
+	}
 }
 
 void LogicManager::CONS_Waiter1_Disappear(CONS_PARAMS) {


Commit: 023913f0edd2d8ede1b10fcef706f9c2da388374
    https://github.com/scummvm/scummvm/commit/023913f0edd2d8ede1b10fcef706f9c2da388374
Author: AndywinXp (andywinxp at gmail.com)
Date: 2025-06-16T23:12:18+02:00

Commit Message:
LASTEXPRESS: Clean up Waiter2 logic

Changed paths:
    engines/lastexpress/characters/waiter2.cpp


diff --git a/engines/lastexpress/characters/waiter2.cpp b/engines/lastexpress/characters/waiter2.cpp
index 674c26db971..c0d9275ee36 100644
--- a/engines/lastexpress/characters/waiter2.cpp
+++ b/engines/lastexpress/characters/waiter2.cpp
@@ -48,7 +48,7 @@ void LogicManager::CONS_Waiter2(int chapter) {
 		CONS_Waiter2_StartPart5(0, 0, 0, 0);
 		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -71,11 +71,12 @@ void LogicManager::CONS_Waiter2_DoWait(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Waiter2_DoWait(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		if (getCharacterCurrentParams(kCharacterWaiter2)[1] ||
 			(getCharacterCurrentParams(kCharacterWaiter2)[1] = _gameTime + getCharacterCurrentParams(kCharacterWaiter2)[0], _gameTime + getCharacterCurrentParams(kCharacterWaiter2)[0] != 0)) {
 			if (getCharacterCurrentParams(kCharacterWaiter2)[1] >= _gameTime)
-				return;
+				break;
 
 			getCharacterCurrentParams(kCharacterWaiter2)[1] = 0x7FFFFFFF;
 		}
@@ -83,6 +84,9 @@ void LogicManager::HAND_Waiter2_DoWait(HAND_PARAMS) {
 		getCharacter(kCharacterWaiter2).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterWaiter2, _functionsWaiter2[getCharacter(kCharacterWaiter2).callbacks[getCharacter(kCharacterWaiter2).currentCall]]);
 		fedEx(kCharacterWaiter2, kCharacterWaiter2, 18, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -110,10 +114,13 @@ void LogicManager::HAND_Waiter2_DoSeqOtis(HAND_PARAMS) {
 			playChrExcuseMe(kCharacterWaiter2, kCharacterCath, 0);
 			getCharacterCurrentParams(kCharacterWaiter2)[3] = 1;
 		}
+
 		break;
 	case 12:
 		startSeqOtis(kCharacterWaiter2, (char *)&getCharacterCurrentParams(kCharacterWaiter2)[0]);
 		break;
+	default:
+		break;
 	}
 }
 
@@ -152,6 +159,8 @@ void LogicManager::HAND_Waiter2_DoBlockSeqOtis(HAND_PARAMS) {
 		startSeqOtis(kCharacterWaiter2, (char *)&getCharacterCurrentParams(kCharacterWaiter2)[0]);
 		blockView(kCharacterWaiter2, getCharacterCurrentParams(kCharacterWaiter2)[3], getCharacterCurrentParams(kCharacterWaiter2)[4]);
 		break;
+	default:
+		break;
 	}
 }
 
@@ -166,21 +175,29 @@ void LogicManager::CONS_Waiter2_FinishSeqOtis(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Waiter2_FinishSeqOtis(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		if (getCharacter(kCharacterWaiter2).direction != 4) {
 			getCharacter(kCharacterWaiter2).currentCall--;
 			_engine->getMessageManager()->setMessageHandle(kCharacterWaiter2, _functionsWaiter2[getCharacter(kCharacterWaiter2).callbacks[getCharacter(kCharacterWaiter2).currentCall]]);
 			fedEx(kCharacterWaiter2, kCharacterWaiter2, 18, 0);
 		}
-	} else if (msg->action == 3) {
+
+		break;
+	case 3:
 		getCharacter(kCharacterWaiter2).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterWaiter2, _functionsWaiter2[getCharacter(kCharacterWaiter2).callbacks[getCharacter(kCharacterWaiter2).currentCall]]);
 		fedEx(kCharacterWaiter2, kCharacterWaiter2, 18, 0);
-	} else if (msg->action == 5) {
+		break;
+	case 5:
 		if (!getCharacterCurrentParams(kCharacterWaiter2)[0]) {
 			playChrExcuseMe(kCharacterWaiter2, kCharacterCath, 0);
 			getCharacterCurrentParams(kCharacterWaiter2)[0] = 1;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -229,7 +246,7 @@ void LogicManager::HAND_Waiter2_DoJoinedSeqOtis(HAND_PARAMS) {
 		startSeqOtis(kCharacterWaiter2, (char *)&getCharacterCurrentParams(kCharacterWaiter2)[0]);
 		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -246,12 +263,17 @@ void LogicManager::CONS_Waiter2_DoDialog(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Waiter2_DoDialog(HAND_PARAMS) {
-	if (msg->action == 2) {
+	switch (msg->action) {
+	case 2:
 		getCharacter(kCharacterWaiter2).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterWaiter2, _functionsWaiter2[getCharacter(kCharacterWaiter2).callbacks[getCharacter(kCharacterWaiter2).currentCall]]);
 		fedEx(kCharacterWaiter2, kCharacterWaiter2, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		playDialog(kCharacterWaiter2, (char *)&getCharacterCurrentParams(kCharacterWaiter2)[0], -1, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -266,12 +288,14 @@ void LogicManager::CONS_Waiter2_MonsieurServeUs(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Waiter2_MonsieurServeUs(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterWaiter2).characterPosition.position = 5800;
 		getCharacter(kCharacterWaiter2).characterPosition.location = 0;
 		getCharacter(kCharacterWaiter2).callbacks[getCharacter(kCharacterWaiter2).currentCall + 8] = 1;
 		Waiter2Call(&LogicManager::CONS_Waiter2_DoSeqOtis, "924", 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterWaiter2).callbacks[getCharacter(kCharacterWaiter2).currentCall + 8]) {
 		case 1:
 			send(kCharacterWaiter2, kCharacterMonsieur, 122358304, 0);
@@ -292,7 +316,13 @@ void LogicManager::HAND_Waiter2_MonsieurServeUs(HAND_PARAMS) {
 			_engine->getMessageManager()->setMessageHandle(kCharacterWaiter2, _functionsWaiter2[getCharacter(kCharacterWaiter2).callbacks[getCharacter(kCharacterWaiter2).currentCall]]);
 			fedEx(kCharacterWaiter2, kCharacterWaiter2, 18, 0);
 			break;
+		default:
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -307,25 +337,28 @@ void LogicManager::CONS_Waiter2_Birth(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Waiter2_Birth(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			autoMessage(kCharacterWaiter2, 302203328, 5);
-			autoMessage(kCharacterWaiter2, 189688608, 6);
-			autoMessage(kCharacterWaiter2, 236237423, 7);
-			autoMessage(kCharacterWaiter2, 219377792, 8);
-			autoMessage(kCharacterWaiter2, 291721418, 10);
-			autoMessage(kCharacterWaiter2, 258136010, 11);
-			autoMessage(kCharacterWaiter2, 302996448, 2);
-			autoMessage(kCharacterWaiter2, 223002560, 0);
-			autoMessage(kCharacterWaiter2, 256200848, 9);
-			autoMessage(kCharacterWaiter2, 269485588, 3);
-			autoMessage(kCharacterWaiter2, 326144276, 4);
-			getCharacter(kCharacterWaiter2).characterPosition.car = kCarRestaurant;
-			getCharacter(kCharacterWaiter2).characterPosition.location = 0;
-			getCharacter(kCharacterWaiter2).characterPosition.position = 5900;
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		CONS_Waiter2_ServingDinner(0, 0, 0, 0);
+		break;
+	case 12:
+		autoMessage(kCharacterWaiter2, 302203328, 5);
+		autoMessage(kCharacterWaiter2, 189688608, 6);
+		autoMessage(kCharacterWaiter2, 236237423, 7);
+		autoMessage(kCharacterWaiter2, 219377792, 8);
+		autoMessage(kCharacterWaiter2, 291721418, 10);
+		autoMessage(kCharacterWaiter2, 258136010, 11);
+		autoMessage(kCharacterWaiter2, 302996448, 2);
+		autoMessage(kCharacterWaiter2, 223002560, 0);
+		autoMessage(kCharacterWaiter2, 256200848, 9);
+		autoMessage(kCharacterWaiter2, 269485588, 3);
+		autoMessage(kCharacterWaiter2, 326144276, 4);
+		getCharacter(kCharacterWaiter2).characterPosition.car = kCarRestaurant;
+		getCharacter(kCharacterWaiter2).characterPosition.location = 0;
+		getCharacter(kCharacterWaiter2).characterPosition.position = 5900;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -340,12 +373,14 @@ void LogicManager::CONS_Waiter2_MilosOrder(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Waiter2_MilosOrder(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterWaiter2).characterPosition.position = 5800;
 		getCharacter(kCharacterWaiter2).characterPosition.location = 0;
 		getCharacter(kCharacterWaiter2).callbacks[getCharacter(kCharacterWaiter2).currentCall + 8] = 1;
 		Waiter2Call(&LogicManager::CONS_Waiter2_DoSeqOtis, "924", 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterWaiter2).callbacks[getCharacter(kCharacterWaiter2).currentCall + 8]) {
 		case 1:
 			startCycOtis(kCharacterMilos, "BLANK");
@@ -367,7 +402,13 @@ void LogicManager::HAND_Waiter2_MilosOrder(HAND_PARAMS) {
 			_engine->getMessageManager()->setMessageHandle(kCharacterWaiter2, _functionsWaiter2[getCharacter(kCharacterWaiter2).callbacks[getCharacter(kCharacterWaiter2).currentCall]]);
 			fedEx(kCharacterWaiter2, kCharacterWaiter2, 18, 0);
 			break;
+		default:
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -382,12 +423,14 @@ void LogicManager::CONS_Waiter2_MonsieurOrder(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Waiter2_MonsieurOrder(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterWaiter2).characterPosition.position = 5800;
 		getCharacter(kCharacterWaiter2).characterPosition.location = 0;
 		getCharacter(kCharacterWaiter2).callbacks[getCharacter(kCharacterWaiter2).currentCall + 8] = 1;
 		Waiter2Call(&LogicManager::CONS_Waiter2_DoSeqOtis, "924", 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterWaiter2).callbacks[getCharacter(kCharacterWaiter2).currentCall + 8]) {
 		case 1:
 			startCycOtis(kCharacterMonsieur, "BLANK");
@@ -409,7 +452,13 @@ void LogicManager::HAND_Waiter2_MonsieurOrder(HAND_PARAMS) {
 			_engine->getMessageManager()->setMessageHandle(kCharacterWaiter2, _functionsWaiter2[getCharacter(kCharacterWaiter2).callbacks[getCharacter(kCharacterWaiter2).currentCall]]);
 			fedEx(kCharacterWaiter2, kCharacterWaiter2, 18, 0);
 			break;
+		default:
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -424,12 +473,14 @@ void LogicManager::CONS_Waiter2_ClearAlexei(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Waiter2_ClearAlexei(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterWaiter2).characterPosition.position = 5800;
 		getCharacter(kCharacterWaiter2).characterPosition.location = 0;
 		getCharacter(kCharacterWaiter2).callbacks[getCharacter(kCharacterWaiter2).currentCall + 8] = 1;
 		Waiter2Call(&LogicManager::CONS_Waiter2_DoSeqOtis, "919", 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterWaiter2).callbacks[getCharacter(kCharacterWaiter2).currentCall + 8]) {
 		case 1:
 			blockView(kCharacterWaiter2, kCarRestaurant, 63);
@@ -451,7 +502,13 @@ void LogicManager::HAND_Waiter2_ClearAlexei(HAND_PARAMS) {
 			_engine->getMessageManager()->setMessageHandle(kCharacterWaiter2, _functionsWaiter2[getCharacter(kCharacterWaiter2).callbacks[getCharacter(kCharacterWaiter2).currentCall]]);
 			fedEx(kCharacterWaiter2, kCharacterWaiter2, 18, 0);
 			break;
+		default:
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -466,12 +523,14 @@ void LogicManager::CONS_Waiter2_ClearMilos(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Waiter2_ClearMilos(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterWaiter2).characterPosition.position = 5800;
 		getCharacter(kCharacterWaiter2).characterPosition.location = 0;
 		getCharacter(kCharacterWaiter2).callbacks[getCharacter(kCharacterWaiter2).currentCall + 8] = 1;
 		Waiter2Call(&LogicManager::CONS_Waiter2_DoSeqOtis, "923", 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterWaiter2).callbacks[getCharacter(kCharacterWaiter2).currentCall + 8]) {
 		case 1:
 			send(kCharacterWaiter2, kCharacterTableC, 136455232, 0);
@@ -491,7 +550,13 @@ void LogicManager::HAND_Waiter2_ClearMilos(HAND_PARAMS) {
 			_engine->getMessageManager()->setMessageHandle(kCharacterWaiter2, _functionsWaiter2[getCharacter(kCharacterWaiter2).callbacks[getCharacter(kCharacterWaiter2).currentCall]]);
 			fedEx(kCharacterWaiter2, kCharacterWaiter2, 18, 0);
 			break;
+		default:
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -506,12 +571,14 @@ void LogicManager::CONS_Waiter2_ClearMonsieur(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Waiter2_ClearMonsieur(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterWaiter2).characterPosition.position = 5800;
 		getCharacter(kCharacterWaiter2).characterPosition.location = 0;
 		getCharacter(kCharacterWaiter2).callbacks[getCharacter(kCharacterWaiter2).currentCall + 8] = 1;
 		Waiter2Call(&LogicManager::CONS_Waiter2_DoSeqOtis, "923", 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterWaiter2).callbacks[getCharacter(kCharacterWaiter2).currentCall + 8]) {
 		case 1:
 			send(kCharacterWaiter2, kCharacterTableC, 136455232, 0);
@@ -531,7 +598,13 @@ void LogicManager::HAND_Waiter2_ClearMonsieur(HAND_PARAMS) {
 			_engine->getMessageManager()->setMessageHandle(kCharacterWaiter2, _functionsWaiter2[getCharacter(kCharacterWaiter2).callbacks[getCharacter(kCharacterWaiter2).currentCall]]);
 			fedEx(kCharacterWaiter2, kCharacterWaiter2, 18, 0);
 			break;
+		default:
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -546,28 +619,37 @@ void LogicManager::CONS_Waiter2_ServingDinner(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Waiter2_ServingDinner(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 18 && getCharacter(kCharacterWaiter2).callbacks[getCharacter(kCharacterWaiter2).currentCall + 8] == 5) {
+	switch (msg->action) {
+	case 0:
+		if (inKitchen(kCharacterWaiter2) && rcClear()) {
+			if (getCharacterParams(kCharacterWaiter2, 8)[0]) {
+				getCharacter(kCharacterWaiter2).callbacks[getCharacter(kCharacterWaiter2).currentCall + 8] = 1;
+				Waiter2Call(&LogicManager::CONS_Waiter2_MilosOrder, 0, 0, 0, 0);
+			} else if (getCharacterParams(kCharacterWaiter2, 8)[9]) {
+				getCharacter(kCharacterWaiter2).callbacks[getCharacter(kCharacterWaiter2).currentCall + 8] = 2;
+				Waiter2Call(&LogicManager::CONS_Waiter2_MonsieurOrder, 0, 0, 0, 0);
+			} else if (getCharacterParams(kCharacterWaiter2, 8)[2]) {
+				getCharacter(kCharacterWaiter2).callbacks[getCharacter(kCharacterWaiter2).currentCall + 8] = 3;
+				Waiter2Call(&LogicManager::CONS_Waiter2_ClearAlexei, 0, 0, 0, 0);
+			} else if (getCharacterParams(kCharacterWaiter2, 8)[3]) {
+				getCharacter(kCharacterWaiter2).callbacks[getCharacter(kCharacterWaiter2).currentCall + 8] = 4;
+				Waiter2Call(&LogicManager::CONS_Waiter2_ClearMilos, 0, 0, 0, 0);
+			} else if (getCharacterParams(kCharacterWaiter2, 8)[4]) {
+				getCharacter(kCharacterWaiter2).callbacks[getCharacter(kCharacterWaiter2).currentCall + 8] = 5;
+				Waiter2Call(&LogicManager::CONS_Waiter2_ClearMonsieur, 0, 0, 0, 0);
+			}
+		}
+
+		break;
+	case 18:
+		if (getCharacter(kCharacterWaiter2).callbacks[getCharacter(kCharacterWaiter2).currentCall + 8] == 5) {
 			send(kCharacterWaiter2, kCharacterHeadWait, 352768896, 0);
 			CONS_Waiter2_AfterDinner(0, 0, 0, 0);
 		}
-	} else if (inKitchen(kCharacterWaiter2) && rcClear()) {
-		if (getCharacterParams(kCharacterWaiter2, 8)[0]) {
-			getCharacter(kCharacterWaiter2).callbacks[getCharacter(kCharacterWaiter2).currentCall + 8] = 1;
-			Waiter2Call(&LogicManager::CONS_Waiter2_MilosOrder, 0, 0, 0, 0);
-		} else if (getCharacterParams(kCharacterWaiter2, 8)[9]) {
-			getCharacter(kCharacterWaiter2).callbacks[getCharacter(kCharacterWaiter2).currentCall + 8] = 2;
-			Waiter2Call(&LogicManager::CONS_Waiter2_MonsieurOrder, 0, 0, 0, 0);
-		} else if (getCharacterParams(kCharacterWaiter2, 8)[2]) {
-			getCharacter(kCharacterWaiter2).callbacks[getCharacter(kCharacterWaiter2).currentCall + 8] = 3;
-			Waiter2Call(&LogicManager::CONS_Waiter2_ClearAlexei, 0, 0, 0, 0);
-		} else if (getCharacterParams(kCharacterWaiter2, 8)[3]) {
-			getCharacter(kCharacterWaiter2).callbacks[getCharacter(kCharacterWaiter2).currentCall + 8] = 4;
-			Waiter2Call(&LogicManager::CONS_Waiter2_ClearMilos, 0, 0, 0, 0);
-		} else if (getCharacterParams(kCharacterWaiter2, 8)[4]) {
-			getCharacter(kCharacterWaiter2).callbacks[getCharacter(kCharacterWaiter2).currentCall + 8] = 5;
-			Waiter2Call(&LogicManager::CONS_Waiter2_ClearMonsieur, 0, 0, 0, 0);
-		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -582,10 +664,15 @@ void LogicManager::CONS_Waiter2_AfterDinner(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Waiter2_AfterDinner(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterWaiter2).characterPosition.position = 5900;
-	} else if (msg->action == 101632192) {
+		break;
+	case 101632192:
 		CONS_Waiter2_LockUp(0, 0, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -600,11 +687,15 @@ void LogicManager::CONS_Waiter2_LockUp(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Waiter2_LockUp(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterWaiter2).characterPosition.car = kCarRestaurant;
 		getCharacter(kCharacterWaiter2).characterPosition.position = 5900;
 		getCharacter(kCharacterWaiter2).characterPosition.location = 0;
 		endGraphics(kCharacterWaiter2);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -619,20 +710,23 @@ void LogicManager::CONS_Waiter2_StartPart2(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Waiter2_StartPart2(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			endGraphics(kCharacterWaiter2);
-			getCharacter(kCharacterWaiter2).characterPosition.position = 5900;
-			getCharacter(kCharacterWaiter2).characterPosition.location = 0;
-			getCharacter(kCharacterWaiter2).characterPosition.car = kCarRestaurant;
-			getCharacter(kCharacterWaiter2).clothes = 1;
-			getCharacter(kCharacterWaiter2).inventoryItem = 0;
-			getCharacterParams(kCharacterWaiter2, 8)[5] = 0;
-			getCharacterParams(kCharacterWaiter2, 8)[6] = 0;
-			getCharacterParams(kCharacterWaiter2, 8)[7] = 0;
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		CONS_Waiter2_InKitchen(0, 0, 0, 0);
+		break;
+	case 12:
+		endGraphics(kCharacterWaiter2);
+		getCharacter(kCharacterWaiter2).characterPosition.position = 5900;
+		getCharacter(kCharacterWaiter2).characterPosition.location = 0;
+		getCharacter(kCharacterWaiter2).characterPosition.car = kCarRestaurant;
+		getCharacter(kCharacterWaiter2).clothes = 1;
+		getCharacter(kCharacterWaiter2).inventoryItem = 0;
+		getCharacterParams(kCharacterWaiter2, 8)[5] = 0;
+		getCharacterParams(kCharacterWaiter2, 8)[6] = 0;
+		getCharacterParams(kCharacterWaiter2, 8)[7] = 0;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -647,45 +741,58 @@ void LogicManager::CONS_Waiter2_InKitchen(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Waiter2_InKitchen(HAND_PARAMS) {
-	if (msg->action == 0) {
-		if (!inKitchen(kCharacterWaiter2) || !rcClear())
-			return;
-
-		if (getCharacterParams(kCharacterWaiter2, 8)[5]) {
-			getCharacter(kCharacterWaiter2).callbacks[getCharacter(kCharacterWaiter2).currentCall + 8] = 1;
-			Waiter2Call(&LogicManager::CONS_Waiter2_TatianaClearTableB, 0, 0, 0, 0);
-			return;
+	switch (msg->action) {
+	case 0:
+		if (inKitchen(kCharacterWaiter2) && rcClear()) {
+			if (getCharacterParams(kCharacterWaiter2, 8)[5]) {
+				getCharacter(kCharacterWaiter2).callbacks[getCharacter(kCharacterWaiter2).currentCall + 8] = 1;
+				Waiter2Call(&LogicManager::CONS_Waiter2_TatianaClearTableB, 0, 0, 0, 0);
+			} else if (getCharacterParams(kCharacterWaiter2, 8)[6]) {
+				getCharacter(kCharacterWaiter2).callbacks[getCharacter(kCharacterWaiter2).currentCall + 8] = 2;
+				Waiter2Call(&LogicManager::CONS_Waiter2_IvoComeHere, 0, 0, 0, 0);
+			} else if (getCharacterParams(kCharacterWaiter2, 8)[7] || getCharacterParams(kCharacterWaiter2, 8)[4]) {
+				getCharacter(kCharacterWaiter2).callbacks[getCharacter(kCharacterWaiter2).currentCall + 8] = 3;
+				Waiter2Call(&LogicManager::CONS_Waiter2_IvoClearTableC, 0, 0, 0, 0);
+			}
+
+			break;
 		}
-		goto LABEL_13;
-	}
-	if (msg->action != 18) {
-		if (msg->action == 101106391) {
-			getCharacter(kCharacterWaiter2).callbacks[getCharacter(kCharacterWaiter2).currentCall + 8] = 4;
-			Waiter2Call(&LogicManager::CONS_Waiter2_DoSeqOtis, "975", 0, 0, 0);
+
+		break;
+	case 18:
+		if (getCharacter(kCharacterWaiter2).callbacks[getCharacter(kCharacterWaiter2).currentCall + 8] == 1) {
+			if (getCharacterParams(kCharacterWaiter2, 8)[6]) {
+				getCharacter(kCharacterWaiter2).callbacks[getCharacter(kCharacterWaiter2).currentCall + 8] = 2;
+				Waiter2Call(&LogicManager::CONS_Waiter2_IvoComeHere, 0, 0, 0, 0);
+			} else if (getCharacterParams(kCharacterWaiter2, 8)[7] || getCharacterParams(kCharacterWaiter2, 8)[4]) {
+				getCharacter(kCharacterWaiter2).callbacks[getCharacter(kCharacterWaiter2).currentCall + 8] = 3;
+				Waiter2Call(&LogicManager::CONS_Waiter2_IvoClearTableC, 0, 0, 0, 0);
+			}
+
+			break;
 		}
-		return;
-	}
 
-	if (getCharacter(kCharacterWaiter2).callbacks[getCharacter(kCharacterWaiter2).currentCall + 8] == 1) {
-	LABEL_13:
-		if (getCharacterParams(kCharacterWaiter2, 8)[6]) {
-			getCharacter(kCharacterWaiter2).callbacks[getCharacter(kCharacterWaiter2).currentCall + 8] = 2;
-			Waiter2Call(&LogicManager::CONS_Waiter2_IvoComeHere, 0, 0, 0, 0);
-			return;
+		if (getCharacter(kCharacterWaiter2).callbacks[getCharacter(kCharacterWaiter2).currentCall + 8] != 2) {
+			if (getCharacter(kCharacterWaiter2).callbacks[getCharacter(kCharacterWaiter2).currentCall + 8] == 4) {
+				endGraphics(kCharacterWaiter2);
+				getCharacter(kCharacterWaiter2).characterPosition.position = 5900;
+			}
+
+			break;
 		}
-		goto LABEL_15;
-	}
-	if (getCharacter(kCharacterWaiter2).callbacks[getCharacter(kCharacterWaiter2).currentCall + 8] != 2) {
-		if (getCharacter(kCharacterWaiter2).callbacks[getCharacter(kCharacterWaiter2).currentCall + 8] == 4) {
-			endGraphics(kCharacterWaiter2);
-			getCharacter(kCharacterWaiter2).characterPosition.position = 5900;
+
+		if (getCharacterParams(kCharacterWaiter2, 8)[7] || getCharacterParams(kCharacterWaiter2, 8)[4]) {
+			getCharacter(kCharacterWaiter2).callbacks[getCharacter(kCharacterWaiter2).currentCall + 8] = 3;
+			Waiter2Call(&LogicManager::CONS_Waiter2_IvoClearTableC, 0, 0, 0, 0);
 		}
-		return;
-	}
-LABEL_15:
-	if (getCharacterParams(kCharacterWaiter2, 8)[7] || getCharacterParams(kCharacterWaiter2, 8)[4]) {
-		getCharacter(kCharacterWaiter2).callbacks[getCharacter(kCharacterWaiter2).currentCall + 8] = 3;
-		Waiter2Call(&LogicManager::CONS_Waiter2_IvoClearTableC, 0, 0, 0, 0);
+
+		break;
+	case 101106391:
+		getCharacter(kCharacterWaiter2).callbacks[getCharacter(kCharacterWaiter2).currentCall + 8] = 4;
+		Waiter2Call(&LogicManager::CONS_Waiter2_DoSeqOtis, "975", 0, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -700,12 +807,14 @@ void LogicManager::CONS_Waiter2_TatianaClearTableB(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Waiter2_TatianaClearTableB(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterWaiter2).characterPosition.position = 5800;
 		getCharacter(kCharacterWaiter2).characterPosition.location = 0;
 		getCharacter(kCharacterWaiter2).callbacks[getCharacter(kCharacterWaiter2).currentCall + 8] = 1;
 		Waiter2Call(&LogicManager::CONS_Waiter2_DoSeqOtis, "969", 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterWaiter2).callbacks[getCharacter(kCharacterWaiter2).currentCall + 8]) {
 		case 1:
 			blockView(kCharacterWaiter2, kCarRestaurant, 63);
@@ -727,7 +836,13 @@ void LogicManager::HAND_Waiter2_TatianaClearTableB(HAND_PARAMS) {
 			_engine->getMessageManager()->setMessageHandle(kCharacterWaiter2, _functionsWaiter2[getCharacter(kCharacterWaiter2).callbacks[getCharacter(kCharacterWaiter2).currentCall]]);
 			fedEx(kCharacterWaiter2, kCharacterWaiter2, 18, 0);
 			break;
+		default:
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -742,19 +857,27 @@ void LogicManager::CONS_Waiter2_IvoComeHere(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Waiter2_IvoComeHere(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterWaiter2).characterPosition.position = 5800;
 		getCharacter(kCharacterWaiter2).characterPosition.location = 0;
 		getCharacter(kCharacterWaiter2).callbacks[getCharacter(kCharacterWaiter2).currentCall + 8] = 1;
 		Waiter2Call(&LogicManager::CONS_Waiter2_DoSeqOtis, "973", 0, 0, 0);
-	} else if (msg->action == 18 && getCharacter(kCharacterWaiter2).callbacks[getCharacter(kCharacterWaiter2).currentCall + 8] == 1) {
-		send(kCharacterWaiter2, kCharacterIvo, 123712592, 0);
-		startCycOtis(kCharacterWaiter2, "BLANK");
-		getCharacterParams(kCharacterWaiter2, 8)[6] = 0;
+		break;
+	case 18:
+		if (getCharacter(kCharacterWaiter2).callbacks[getCharacter(kCharacterWaiter2).currentCall + 8] == 1) {
+			send(kCharacterWaiter2, kCharacterIvo, 123712592, 0);
+			startCycOtis(kCharacterWaiter2, "BLANK");
+			getCharacterParams(kCharacterWaiter2, 8)[6] = 0;
 
-		getCharacter(kCharacterWaiter2).currentCall--;
-		_engine->getMessageManager()->setMessageHandle(kCharacterWaiter2, _functionsWaiter2[getCharacter(kCharacterWaiter2).callbacks[getCharacter(kCharacterWaiter2).currentCall]]);
-		fedEx(kCharacterWaiter2, kCharacterWaiter2, 18, 0);
+			getCharacter(kCharacterWaiter2).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterWaiter2, _functionsWaiter2[getCharacter(kCharacterWaiter2).callbacks[getCharacter(kCharacterWaiter2).currentCall]]);
+			fedEx(kCharacterWaiter2, kCharacterWaiter2, 18, 0);
+		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -769,12 +892,14 @@ void LogicManager::CONS_Waiter2_IvoClearTableC(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Waiter2_IvoClearTableC(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterWaiter2).characterPosition.position = 5800;
 		getCharacter(kCharacterWaiter2).characterPosition.location = 0;
 		getCharacter(kCharacterWaiter2).callbacks[getCharacter(kCharacterWaiter2).currentCall + 8] = 1;
 		Waiter2Call(&LogicManager::CONS_Waiter2_DoSeqOtis, "974", 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterWaiter2).callbacks[getCharacter(kCharacterWaiter2).currentCall + 8]) {
 		case 1:
 			send(kCharacterWaiter2, kCharacterTableC, 136455232, 0);
@@ -795,7 +920,13 @@ void LogicManager::HAND_Waiter2_IvoClearTableC(HAND_PARAMS) {
 			_engine->getMessageManager()->setMessageHandle(kCharacterWaiter2, _functionsWaiter2[getCharacter(kCharacterWaiter2).callbacks[getCharacter(kCharacterWaiter2).currentCall]]);
 			fedEx(kCharacterWaiter2, kCharacterWaiter2, 18, 0);
 			break;
+		default:
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -810,19 +941,22 @@ void LogicManager::CONS_Waiter2_StartPart3(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Waiter2_StartPart3(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			endGraphics(kCharacterWaiter2);
-			getCharacter(kCharacterWaiter2).characterPosition.position = 5900;
-			getCharacter(kCharacterWaiter2).characterPosition.location = 0;
-			getCharacter(kCharacterWaiter2).characterPosition.car = kCarRestaurant;
-			getCharacter(kCharacterWaiter2).clothes = 1;
-			getCharacter(kCharacterWaiter2).inventoryItem = 0;
-			getCharacterParams(kCharacterWaiter2, 8)[8] = 0;
-			getCharacterParams(kCharacterWaiter2, 8)[9] = 0;
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		CONS_Waiter2_Serving3(0, 0, 0, 0);
+		break;
+	case 12:
+		endGraphics(kCharacterWaiter2);
+		getCharacter(kCharacterWaiter2).characterPosition.position = 5900;
+		getCharacter(kCharacterWaiter2).characterPosition.location = 0;
+		getCharacter(kCharacterWaiter2).characterPosition.car = kCarRestaurant;
+		getCharacter(kCharacterWaiter2).clothes = 1;
+		getCharacter(kCharacterWaiter2).inventoryItem = 0;
+		getCharacterParams(kCharacterWaiter2, 8)[8] = 0;
+		getCharacterParams(kCharacterWaiter2, 8)[9] = 0;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -837,14 +971,21 @@ void LogicManager::CONS_Waiter2_Serving3(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Waiter2_Serving3(HAND_PARAMS) {
-	if (msg->action == 0 && inKitchen(kCharacterWaiter2) && rcClear()) {
-		if (getCharacterParams(kCharacterWaiter2, 8)[8]) {
-			getCharacter(kCharacterWaiter2).callbacks[getCharacter(kCharacterWaiter2).currentCall + 8] = 1;
-			Waiter2Call(&LogicManager::CONS_Waiter2_AnnaBringTea3, 0, 0, 0, 0);
-		} else if (getCharacterParams(kCharacterWaiter2, 8)[9]) {
-			getCharacter(kCharacterWaiter2).callbacks[getCharacter(kCharacterWaiter2).currentCall + 8] = 2;
-			Waiter2Call(&LogicManager::CONS_Waiter2_MonsieurServeUs, 0, 0, 0, 0);
+	switch (msg->action) {
+	case 0:
+		if (inKitchen(kCharacterWaiter2) && rcClear()) {
+			if (getCharacterParams(kCharacterWaiter2, 8)[8]) {
+				getCharacter(kCharacterWaiter2).callbacks[getCharacter(kCharacterWaiter2).currentCall + 8] = 1;
+				Waiter2Call(&LogicManager::CONS_Waiter2_AnnaBringTea3, 0, 0, 0, 0);
+			} else if (getCharacterParams(kCharacterWaiter2, 8)[9]) {
+				getCharacter(kCharacterWaiter2).callbacks[getCharacter(kCharacterWaiter2).currentCall + 8] = 2;
+				Waiter2Call(&LogicManager::CONS_Waiter2_MonsieurServeUs, 0, 0, 0, 0);
+			}
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -859,12 +1000,14 @@ void LogicManager::CONS_Waiter2_AnnaBringTea3(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Waiter2_AnnaBringTea3(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterWaiter2).characterPosition.position = 5800;
 		getCharacter(kCharacterWaiter2).characterPosition.location = 0;
 		getCharacter(kCharacterWaiter2).callbacks[getCharacter(kCharacterWaiter2).currentCall + 8] = 1;
 		Waiter2Call(&LogicManager::CONS_Waiter2_DoSeqOtis, "816DD", 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterWaiter2).callbacks[getCharacter(kCharacterWaiter2).currentCall + 8]) {
 		case 1:
 			startSeqOtis(kCharacterWaiter2, "927");
@@ -889,8 +1032,10 @@ void LogicManager::HAND_Waiter2_AnnaBringTea3(HAND_PARAMS) {
 			break;
 		case 4:
 			startSeqOtis(kCharacterWaiter2, "816UD");
+
 			if (inSalon(kCharacterCath))
 				advanceFrame(kCharacterWaiter2);
+
 			getCharacter(kCharacterWaiter2).callbacks[getCharacter(kCharacterWaiter2).currentCall + 8] = 5;
 			Waiter2Call(&LogicManager::CONS_Waiter2_FinishSeqOtis, 0, 0, 0, 0);
 			break;
@@ -904,8 +1049,12 @@ void LogicManager::HAND_Waiter2_AnnaBringTea3(HAND_PARAMS) {
 			fedEx(kCharacterWaiter2, kCharacterWaiter2, 18, 0);
 			break;
 		default:
-			return;
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -920,21 +1069,24 @@ void LogicManager::CONS_Waiter2_StartPart4(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Waiter2_StartPart4(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			endGraphics(kCharacterWaiter2);
-			getCharacter(kCharacterWaiter2).characterPosition.car = kCarRestaurant;
-			getCharacter(kCharacterWaiter2).characterPosition.position = 5900;
-			getCharacter(kCharacterWaiter2).characterPosition.location = 0;
-			getCharacter(kCharacterWaiter2).inventoryItem = 0;
-			endGraphics(kCharacterWaiter2);
-			getCharacterParams(kCharacterWaiter2, 8)[10] = 0;
-			getCharacterParams(kCharacterWaiter2, 8)[12] = 0;
-			getCharacterParams(kCharacterWaiter2, 8)[11] = 0;
-			getCharacterParams(kCharacterWaiter2, 8)[9] = 0;
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		CONS_Waiter2_Serving4(0, 0, 0, 0);
+		break;
+	case 12:
+		endGraphics(kCharacterWaiter2);
+		getCharacter(kCharacterWaiter2).characterPosition.car = kCarRestaurant;
+		getCharacter(kCharacterWaiter2).characterPosition.position = 5900;
+		getCharacter(kCharacterWaiter2).characterPosition.location = 0;
+		getCharacter(kCharacterWaiter2).inventoryItem = 0;
+		endGraphics(kCharacterWaiter2);
+		getCharacterParams(kCharacterWaiter2, 8)[10] = 0;
+		getCharacterParams(kCharacterWaiter2, 8)[12] = 0;
+		getCharacterParams(kCharacterWaiter2, 8)[11] = 0;
+		getCharacterParams(kCharacterWaiter2, 8)[9] = 0;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -949,47 +1101,59 @@ void LogicManager::CONS_Waiter2_Serving4(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Waiter2_Serving4(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 18) {
-			if (getCharacter(kCharacterWaiter2).callbacks[getCharacter(kCharacterWaiter2).currentCall + 8] == 1)
-				getCharacterCurrentParams(kCharacterWaiter2)[0] = 1;
-		} else if (msg->action == 201431954) {
-			getCharacter(kCharacterWaiter2).callParams[8].parameters[10] = 0;
-			getCharacterParams(kCharacterWaiter2, 8)[12] = 0;
-			getCharacterParams(kCharacterWaiter2, 8)[11] = 0;
-			getCharacterParams(kCharacterWaiter2, 8)[9] = 0;
-			getCharacter(kCharacterWaiter2).characterPosition.position = 5900;
-			getCharacter(kCharacterWaiter2).characterPosition.location = 0;
-		}
-		return;
-	}
-	if (getCharacterCurrentParams(kCharacterWaiter2)[0]) {
-		if (!getCharacterCurrentParams(kCharacterWaiter2)[1]) {
-			getCharacterCurrentParams(kCharacterWaiter2)[1] = _gameTime + 900;
-			if (_gameTime == -900)
-				goto LABEL_10;
-		}
-		if (getCharacterCurrentParams(kCharacterWaiter2)[1] < _gameTime) {
-			getCharacterCurrentParams(kCharacterWaiter2)[1] = 0x7FFFFFFF;
-		LABEL_10:
-			getCharacterParams(kCharacterWaiter2, 8)[12] = 1;
-			getCharacterCurrentParams(kCharacterWaiter2)[0] = 0;
+	switch (msg->action) {
+	case 0:
+		if (getCharacterCurrentParams(kCharacterWaiter2)[0]) {
+			bool skip = false;
+
+			if (!getCharacterCurrentParams(kCharacterWaiter2)[1]) {
+				getCharacterCurrentParams(kCharacterWaiter2)[1] = _gameTime + 900;
+				if (_gameTime == -900) {
+					skip = true;
+					getCharacterParams(kCharacterWaiter2, 8)[12] = 1;
+					getCharacterCurrentParams(kCharacterWaiter2)[0] = 0;
+				}
+			}
+
+			if (!skip && getCharacterCurrentParams(kCharacterWaiter2)[1] < _gameTime) {
+				getCharacterCurrentParams(kCharacterWaiter2)[1] = 0x7FFFFFFF;
+				getCharacterParams(kCharacterWaiter2, 8)[12] = 1;
+				getCharacterCurrentParams(kCharacterWaiter2)[0] = 0;
+			}
 		}
-	}
-	if (inKitchen(kCharacterWaiter2) && rcClear()) {
-		if (getCharacterParams(kCharacterWaiter2, 8)[10]) {
-			getCharacter(kCharacterWaiter2).callbacks[getCharacter(kCharacterWaiter2).currentCall + 8] = 1;
-			Waiter2Call(&LogicManager::CONS_Waiter2_AugustNeedsADrink, 0, 0, 0, 0);
-		} else if (getCharacterParams(kCharacterWaiter2, 8)[12]) {
-			getCharacter(kCharacterWaiter2).callbacks[getCharacter(kCharacterWaiter2).currentCall + 8] = 2;
-			Waiter2Call(&LogicManager::CONS_Waiter2_ServeAugustADrink, 0, 0, 0, 0);
-		} else if (getCharacterParams(kCharacterWaiter2, 8)[11]) {
-			getCharacter(kCharacterWaiter2).callbacks[getCharacter(kCharacterWaiter2).currentCall + 8] = 3;
-			Waiter2Call(&LogicManager::CONS_Waiter2_AnnaNeedsADrink, 0, 0, 0, 0);
-		} else if (getCharacterParams(kCharacterWaiter2, 8)[9]) {
-			getCharacter(kCharacterWaiter2).callbacks[getCharacter(kCharacterWaiter2).currentCall + 8] = 4;
-			Waiter2Call(&LogicManager::CONS_Waiter2_MonsieurServeUs, 0, 0, 0, 0);
+
+		if (inKitchen(kCharacterWaiter2) && rcClear()) {
+			if (getCharacterParams(kCharacterWaiter2, 8)[10]) {
+				getCharacter(kCharacterWaiter2).callbacks[getCharacter(kCharacterWaiter2).currentCall + 8] = 1;
+				Waiter2Call(&LogicManager::CONS_Waiter2_AugustNeedsADrink, 0, 0, 0, 0);
+			} else if (getCharacterParams(kCharacterWaiter2, 8)[12]) {
+				getCharacter(kCharacterWaiter2).callbacks[getCharacter(kCharacterWaiter2).currentCall + 8] = 2;
+				Waiter2Call(&LogicManager::CONS_Waiter2_ServeAugustADrink, 0, 0, 0, 0);
+			} else if (getCharacterParams(kCharacterWaiter2, 8)[11]) {
+				getCharacter(kCharacterWaiter2).callbacks[getCharacter(kCharacterWaiter2).currentCall + 8] = 3;
+				Waiter2Call(&LogicManager::CONS_Waiter2_AnnaNeedsADrink, 0, 0, 0, 0);
+			} else if (getCharacterParams(kCharacterWaiter2, 8)[9]) {
+				getCharacter(kCharacterWaiter2).callbacks[getCharacter(kCharacterWaiter2).currentCall + 8] = 4;
+				Waiter2Call(&LogicManager::CONS_Waiter2_MonsieurServeUs, 0, 0, 0, 0);
+			}
 		}
+
+		break;
+	case 18:
+		if (getCharacter(kCharacterWaiter2).callbacks[getCharacter(kCharacterWaiter2).currentCall + 8] == 1)
+			getCharacterCurrentParams(kCharacterWaiter2)[0] = 1;
+
+		break;
+	case 201431954:
+		getCharacter(kCharacterWaiter2).callParams[8].parameters[10] = 0;
+		getCharacterParams(kCharacterWaiter2, 8)[12] = 0;
+		getCharacterParams(kCharacterWaiter2, 8)[11] = 0;
+		getCharacterParams(kCharacterWaiter2, 8)[9] = 0;
+		getCharacter(kCharacterWaiter2).characterPosition.position = 5900;
+		getCharacter(kCharacterWaiter2).characterPosition.location = 0;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1004,12 +1168,14 @@ void LogicManager::CONS_Waiter2_AugustNeedsADrink(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Waiter2_AugustNeedsADrink(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterWaiter2).characterPosition.position = 5800;
 		getCharacter(kCharacterWaiter2).characterPosition.location = 0;
 		getCharacter(kCharacterWaiter2).callbacks[getCharacter(kCharacterWaiter2).currentCall + 8] = 1;
 		Waiter2Call(&LogicManager::CONS_Waiter2_DoSeqOtis, "816DD", 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterWaiter2).callbacks[getCharacter(kCharacterWaiter2).currentCall + 8]) {
 		case 1:
 			startSeqOtis(kCharacterWaiter2, "929");
@@ -1048,8 +1214,12 @@ void LogicManager::HAND_Waiter2_AugustNeedsADrink(HAND_PARAMS) {
 			fedEx(kCharacterWaiter2, kCharacterWaiter2, 18, 0);
 			break;
 		default:
-			return;
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1064,12 +1234,14 @@ void LogicManager::CONS_Waiter2_ServeAugustADrink(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Waiter2_ServeAugustADrink(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterWaiter2).characterPosition.position = 5800;
 		getCharacter(kCharacterWaiter2).characterPosition.location = 0;
 		getCharacter(kCharacterWaiter2).callbacks[getCharacter(kCharacterWaiter2).currentCall + 8] = 1;
 		Waiter2Call(&LogicManager::CONS_Waiter2_DoSeqOtis, "816DD", 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterWaiter2).callbacks[getCharacter(kCharacterWaiter2).currentCall + 8]) {
 		case 1:
 			startSeqOtis(kCharacterWaiter2, "931");
@@ -1108,8 +1280,12 @@ void LogicManager::HAND_Waiter2_ServeAugustADrink(HAND_PARAMS) {
 			fedEx(kCharacterWaiter2, kCharacterWaiter2, 18, 0);
 			break;
 		default:
-			return;
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1124,12 +1300,14 @@ void LogicManager::CONS_Waiter2_AnnaNeedsADrink(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Waiter2_AnnaNeedsADrink(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterWaiter2).characterPosition.position = 5800;
 		getCharacter(kCharacterWaiter2).characterPosition.location = 0;
 		getCharacter(kCharacterWaiter2).callbacks[getCharacter(kCharacterWaiter2).currentCall + 8] = 1;
 		Waiter2Call(&LogicManager::CONS_Waiter2_DoSeqOtis, "816DD", 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterWaiter2).callbacks[getCharacter(kCharacterWaiter2).currentCall + 8]) {
 		case 1:
 			startSeqOtis(kCharacterWaiter2, "932");
@@ -1168,8 +1346,12 @@ void LogicManager::HAND_Waiter2_AnnaNeedsADrink(HAND_PARAMS) {
 			fedEx(kCharacterWaiter2, kCharacterWaiter2, 18, 0);
 			break;
 		default:
-			return;
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1184,16 +1366,19 @@ void LogicManager::CONS_Waiter2_StartPart5(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Waiter2_StartPart5(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			endGraphics(kCharacterWaiter2);
-			getCharacter(kCharacterWaiter2).characterPosition.car = kCarRestaurant;
-			getCharacter(kCharacterWaiter2).characterPosition.position = 3969;
-			getCharacter(kCharacterWaiter2).characterPosition.location = 1;
-			getCharacter(kCharacterWaiter2).inventoryItem = 0;
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		CONS_Waiter2_Prisoner(0, 0, 0, 0);
+		break;
+	case 12:
+		endGraphics(kCharacterWaiter2);
+		getCharacter(kCharacterWaiter2).characterPosition.car = kCarRestaurant;
+		getCharacter(kCharacterWaiter2).characterPosition.position = 3969;
+		getCharacter(kCharacterWaiter2).characterPosition.location = 1;
+		getCharacter(kCharacterWaiter2).inventoryItem = 0;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1208,8 +1393,13 @@ void LogicManager::CONS_Waiter2_Prisoner(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Waiter2_Prisoner(HAND_PARAMS) {
-	if (msg->action == 70549068)
+	switch (msg->action) {
+	case 70549068:
 		CONS_Waiter2_Disappear(0, 0, 0, 0);
+		break;
+	default:
+		break;
+	}
 }
 
 void LogicManager::CONS_Waiter2_Disappear(CONS_PARAMS) {


Commit: 1e5e44525125f776510544c86881189a86b43607
    https://github.com/scummvm/scummvm/commit/1e5e44525125f776510544c86881189a86b43607
Author: AndywinXp (andywinxp at gmail.com)
Date: 2025-06-16T23:12:18+02:00

Commit Message:
LASTEXPRESS: Clean up TrainM logic

Changed paths:
    engines/lastexpress/characters/trainm.cpp


diff --git a/engines/lastexpress/characters/trainm.cpp b/engines/lastexpress/characters/trainm.cpp
index 6db7f3c700f..e700e9060c9 100644
--- a/engines/lastexpress/characters/trainm.cpp
+++ b/engines/lastexpress/characters/trainm.cpp
@@ -48,7 +48,7 @@ void LogicManager::CONS_TrainM(int chapter) {
 		CONS_TrainM_StartPart5(0, 0, 0, 0);
 		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -69,19 +69,25 @@ void LogicManager::CONS_TrainM_DebugWalks(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_TrainM_DebugWalks(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			getCharacter(kCharacterTrainM).characterPosition.position = 0;
-			getCharacter(kCharacterTrainM).characterPosition.location = 0;
-			getCharacter(kCharacterTrainM).characterPosition.car = kCarGreenSleeping;
-			getCharacterCurrentParams(kCharacterTrainM)[0] = 10000;
-		}
-	} else if (walk(kCharacterTrainM, kCarGreenSleeping, getCharacterCurrentParams(kCharacterTrainM)[0])) {
-		if (getCharacterCurrentParams(kCharacterTrainM)[0] == 10000) {
-			getCharacterCurrentParams(kCharacterTrainM)[0] = 0;
-		} else {
-			getCharacterCurrentParams(kCharacterTrainM)[0] = 10000;
+	switch (msg->action) {
+	case 0:
+		if (walk(kCharacterTrainM, kCarGreenSleeping, getCharacterCurrentParams(kCharacterTrainM)[0])) {
+			if (getCharacterCurrentParams(kCharacterTrainM)[0] == 10000) {
+				getCharacterCurrentParams(kCharacterTrainM)[0] = 0;
+			} else {
+				getCharacterCurrentParams(kCharacterTrainM)[0] = 10000;
+			}
 		}
+
+		break;
+	case 12:
+		getCharacter(kCharacterTrainM).characterPosition.position = 0;
+		getCharacter(kCharacterTrainM).characterPosition.location = 0;
+		getCharacter(kCharacterTrainM).characterPosition.car = kCarGreenSleeping;
+		getCharacterCurrentParams(kCharacterTrainM)[0] = 10000;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -130,13 +136,29 @@ void LogicManager::CONS_TrainM_FinishSeqOtis(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_TrainM_FinishSeqOtis(HAND_PARAMS) {
-	if (msg->action == 3 || (msg->action == 0 && getCharacter(kCharacterTrainM).direction != 4)) {
+	switch (msg->action) {
+	case 0:
+		if (getCharacter(kCharacterTrainM).direction != 4) {
+			getCharacter(kCharacterTrainM).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterTrainM, _functionsTrainM[getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall]]);
+			fedEx(kCharacterTrainM, kCharacterTrainM, 18, 0);
+		}
+
+		break;
+	case 3:
 		getCharacter(kCharacterTrainM).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterTrainM, _functionsTrainM[getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall]]);
 		fedEx(kCharacterTrainM, kCharacterTrainM, 18, 0);
-	} else if (msg->action == 5 && !getCharacterCurrentParams(kCharacterTrainM)[0]) {
-		playChrExcuseMe(kCharacterTrainM, kCharacterCath, 0);
-		getCharacterCurrentParams(kCharacterTrainM)[0] = 1;
+		break;
+	case 5:
+		if (!getCharacterCurrentParams(kCharacterTrainM)[0]) {
+			playChrExcuseMe(kCharacterTrainM, kCharacterCath, 0);
+			getCharacterCurrentParams(kCharacterTrainM)[0] = 1;
+		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -153,12 +175,17 @@ void LogicManager::CONS_TrainM_DoDialog(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_TrainM_DoDialog(HAND_PARAMS) {
-	if (msg->action == 2) {
+	switch (msg->action) {
+	case 2:
 		getCharacter(kCharacterTrainM).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(9, _functionsTrainM[getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall]]);
 		fedEx(kCharacterTrainM, kCharacterTrainM, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		playDialog(kCharacterTrainM, (char *)&getCharacterCurrentParams(kCharacterTrainM), -1, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -175,12 +202,17 @@ void LogicManager::CONS_TrainM_DoDialogFullVol(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_TrainM_DoDialogFullVol(HAND_PARAMS) {
-	if (msg->action == 2) {
+	switch (msg->action) {
+	case 2:
 		getCharacter(kCharacterTrainM).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(9, _functionsTrainM[getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall]]);
 		fedEx(kCharacterTrainM, kCharacterTrainM, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		playDialog(kCharacterTrainM, (char *)&getCharacterCurrentParams(kCharacterTrainM), 16, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -195,10 +227,18 @@ void LogicManager::CONS_TrainM_WaitRCClear(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_TrainM_WaitRCClear(HAND_PARAMS) {
-	if ((msg->action == 12 && rcClear()) || (msg->action == 0 && rcClear())) {
-		getCharacter(kCharacterTrainM).currentCall--;
-		_engine->getMessageManager()->setMessageHandle(kCharacterTrainM, _functionsTrainM[getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall]]);
-		fedEx(kCharacterTrainM, kCharacterTrainM, 18, 0);
+	switch (msg->action) {
+	case 0:
+	case 12:
+		if (rcClear()) {
+			getCharacter(kCharacterTrainM).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterTrainM, _functionsTrainM[getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall]]);
+			fedEx(kCharacterTrainM, kCharacterTrainM, 18, 0);
+		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -216,19 +256,25 @@ void LogicManager::CONS_TrainM_SaveGame(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_TrainM_SaveGame(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		getCharacter(kCharacterTrainM).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterTrainM, _functionsTrainM[getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall]]);
 		fedEx(kCharacterTrainM, kCharacterTrainM, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		save(
 			kCharacterTrainM,
-			getCharacter(kCharacterTrainM).callParams[getCharacter(kCharacterTrainM).currentCall].parameters[0],
-			getCharacter(kCharacterTrainM).callParams[getCharacter(kCharacterTrainM).currentCall].parameters[1]);
+			getCharacterCurrentParams(kCharacterTrainM)[0],
+			getCharacterCurrentParams(kCharacterTrainM)[1]
+		);
 
 		getCharacter(kCharacterTrainM).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterTrainM, _functionsTrainM[getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall]]);
 		fedEx(kCharacterTrainM, kCharacterTrainM, 18, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -290,7 +336,8 @@ void LogicManager::CONS_TrainM_Announce(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_TrainM_Announce(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		setDoor(104, kCharacterCath, 0, 0, 9);
 		setDoor(105, kCharacterCath, 0, 0, 9);
 
@@ -318,7 +365,8 @@ void LogicManager::HAND_TrainM_Announce(HAND_PARAMS) {
 		getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 1;
 
 		TrainMCall(&LogicManager::CONS_TrainM_WaitRCClear, 0, 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8]) {
 		case 1:
 			getCharacter(kCharacterTrainM).characterPosition.position = 5800;
@@ -361,6 +409,10 @@ void LogicManager::HAND_TrainM_Announce(HAND_PARAMS) {
 		default:
 			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -380,7 +432,8 @@ void LogicManager::CONS_TrainM_DoAnnounceWalk(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_TrainM_DoAnnounceWalk(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		if (!getCharacterCurrentParams(kCharacterTrainM)[6] && !whoRunningDialog(kCharacterTrainM)) {
 			playDialog(kCharacterTrainM, (char *)&getCharacterCurrentParams(kCharacterTrainM)[2], -1, 0);
 			getCharacterCurrentParams(kCharacterTrainM)[6] = 1;
@@ -390,25 +443,27 @@ void LogicManager::HAND_TrainM_DoAnnounceWalk(HAND_PARAMS) {
 			getCharacter(kCharacterTrainM).currentCall--;
 			_engine->getMessageManager()->setMessageHandle(kCharacterTrainM, _functionsTrainM[getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall]]);
 			fedEx(kCharacterTrainM, kCharacterTrainM, 18, 0);
-			return;
+			break;
 		}
 
-		if (!getCharacterCurrentParams(kCharacterTrainM)[5])
-			return;
+		if (getCharacterCurrentParams(kCharacterTrainM)[5]) {
+			if (getCharacterCurrentParams(kCharacterTrainM)[7] || (getCharacterCurrentParams(kCharacterTrainM)[7] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
+				if (getCharacterCurrentParams(kCharacterTrainM)[7] >= _currentGameSessionTicks)
+					break;
 
-		if (getCharacterCurrentParams(kCharacterTrainM)[7] || (getCharacterCurrentParams(kCharacterTrainM)[7] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
-			if (getCharacterCurrentParams(kCharacterTrainM)[7] >= _currentGameSessionTicks)
-				return;
+				getCharacterCurrentParams(kCharacterTrainM)[7] = 0x7FFFFFFF;
+			}
 
-			getCharacterCurrentParams(kCharacterTrainM)[7] = 0x7FFFFFFF;
+			playDialog(kCharacterTrainM, (char *)&getCharacterCurrentParams(kCharacterTrainM)[2], -1, 0);
+			getCharacterCurrentParams(kCharacterTrainM)[5] = 0;
+			getCharacterCurrentParams(kCharacterTrainM)[7] = 0;
 		}
 
-		playDialog(kCharacterTrainM, (char *)&getCharacterCurrentParams(kCharacterTrainM)[2], -1, 0);
-		getCharacterCurrentParams(kCharacterTrainM)[5] = 0;
-		getCharacterCurrentParams(kCharacterTrainM)[7] = 0;
-	} else if (msg->action == 2) {
+		break;
+	case 2:
 		getCharacterCurrentParams(kCharacterTrainM)[5] = 1;
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		if (!whoRunningDialog(kCharacterTrainM)) {
 			playDialog(kCharacterTrainM, (char *)&getCharacterCurrentParams(kCharacterTrainM)[2], -1, 0);
 			getCharacterCurrentParams(kCharacterTrainM)[6] = 1;
@@ -419,6 +474,10 @@ void LogicManager::HAND_TrainM_DoAnnounceWalk(HAND_PARAMS) {
 			_engine->getMessageManager()->setMessageHandle(kCharacterTrainM, _functionsTrainM[getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall]]);
 			fedEx(kCharacterTrainM, kCharacterTrainM, 18, 0);
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -433,10 +492,12 @@ void LogicManager::CONS_TrainM_WalkBackToOffice(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_TrainM_WalkBackToOffice(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 1;
 		TrainMCall(&LogicManager::CONS_TrainM_DoWalk, 5, 540, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8]) {
 		case 1:
 			getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 2;
@@ -500,6 +561,10 @@ void LogicManager::HAND_TrainM_WalkBackToOffice(HAND_PARAMS) {
 		default:
 			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -514,7 +579,8 @@ void LogicManager::CONS_TrainM_LeaveOffice(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_TrainM_LeaveOffice(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		setDoor(104, kCharacterCath, 0, 0, 9);
 		setDoor(105, kCharacterCath, 0, 0, 9);
 		if (inLowBaggage(kCharacterCath)) {
@@ -526,7 +592,7 @@ void LogicManager::HAND_TrainM_LeaveOffice(HAND_PARAMS) {
 				getCharacter(kCharacterTrainM).characterPosition.position = 5900;
 				getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 1;
 				TrainMCall(&LogicManager::CONS_TrainM_WaitRCClear, 0, 0, 0, 0);
-				return;
+				break;
 			}
 
 			playNIS(kEventVergesCanIHelpYou);
@@ -539,7 +605,8 @@ void LogicManager::HAND_TrainM_LeaveOffice(HAND_PARAMS) {
 		getCharacter(kCharacterTrainM).characterPosition.position = 5900;
 		getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 1;
 		TrainMCall(&LogicManager::CONS_TrainM_WaitRCClear, 0, 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8]) {
 		case 1:
 			getCharacter(kCharacterTrainM).characterPosition.position = 5800;
@@ -561,7 +628,13 @@ void LogicManager::HAND_TrainM_LeaveOffice(HAND_PARAMS) {
 			_engine->getMessageManager()->setMessageHandle(kCharacterTrainM, _functionsTrainM[getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall]]);
 			fedEx(kCharacterTrainM, kCharacterTrainM, 18, 0);
 			break;
+		default:
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -578,10 +651,12 @@ void LogicManager::CONS_TrainM_KickCathOut(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_TrainM_KickCathOut(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 1;
-		TrainMCall(&LogicManager::CONS_TrainM_SaveGame, 2, 130, 0, 0);
-	} else if (msg->action == 18) {
+		TrainMCall(&LogicManager::CONS_TrainM_SaveGame, 2, kEventVergesSuitcase, 0, 0);
+		break;
+	case 18:
 		if (getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] == 1) {
 			if (_gameEvents[kEventVergesSuitcase] || _gameEvents[kEventVergesSuitcaseNight] || _gameEvents[kEventVergesSuitcaseOtherEntry] || _gameEvents[kEventVergesSuitcaseNightOtherEntry]) {
 				getCharacterCurrentParams(kCharacterTrainM)[1] = 1;
@@ -624,6 +699,10 @@ void LogicManager::HAND_TrainM_KickCathOut(HAND_PARAMS) {
 			_engine->getMessageManager()->setMessageHandle(kCharacterTrainM, _functionsTrainM[getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall]]);
 			fedEx(kCharacterTrainM, kCharacterTrainM, 18, 0);
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -640,11 +719,12 @@ void LogicManager::CONS_TrainM_DoWait(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_TrainM_DoWait(HAND_PARAMS) {
-	if (!msg->action) {
+	switch (msg->action) {
+	case 0:
 		if (getCharacterCurrentParams(kCharacterTrainM)[1] ||
 			(getCharacterCurrentParams(kCharacterTrainM)[1] = _gameTime + getCharacterCurrentParams(kCharacterTrainM)[0], (_gameTime + getCharacterCurrentParams(kCharacterTrainM)[0] != 0))) {
 			if (getCharacterCurrentParams(kCharacterTrainM)[1] >= _gameTime)
-				return;
+				break;
 
 			getCharacterCurrentParams(kCharacterTrainM)[1] = 0x7FFFFFFF;
 		}
@@ -652,6 +732,9 @@ void LogicManager::HAND_TrainM_DoWait(HAND_PARAMS) {
 		getCharacter(kCharacterTrainM).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterTrainM, _functionsTrainM[getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall]]);
 		fedEx(kCharacterTrainM, kCharacterTrainM, 18, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -670,7 +753,8 @@ void LogicManager::CONS_TrainM_DoCond(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_TrainM_DoCond(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		if (getCharacterCurrentParams(kCharacterTrainM)[4] && getCharacterCurrentParams(kCharacterTrainM)[5]) {
 			send(kCharacterTrainM, getCharacterCurrentParams(kCharacterTrainM)[0], 125499160, 0);
 			if (!checkCathDir(3, 2) && !checkCathDir(4, 2))
@@ -680,16 +764,24 @@ void LogicManager::HAND_TrainM_DoCond(HAND_PARAMS) {
 			_engine->getMessageManager()->setMessageHandle(kCharacterTrainM, _functionsTrainM[getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall]]);
 			fedEx(kCharacterTrainM, kCharacterTrainM, 18, 0);
 		}
-	} else if (msg->action == 2) {
+
+		break;
+	case 2:
 		getCharacterCurrentParams(kCharacterTrainM)[4] = 1;
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		startCycOtis(kCharacterTrainM, "620F");
 		send(kCharacterTrainM, getCharacterCurrentParams(kCharacterTrainM)[0], 171394341, 0);
-	} else if (msg->action == 155853632) {
+		break;
+	case 155853632:
 		getCharacterCurrentParams(kCharacterTrainM)[5] = 1;
-	} else if (msg->action == 202558662) {
+		break;
+	case 202558662:
 		startCycOtis(kCharacterTrainM, "620E");
 		playDialog(kCharacterTrainM, (char *)&getCharacterCurrentParams(kCharacterTrainM)[1], -1, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -709,7 +801,8 @@ void LogicManager::CONS_TrainM_DoCondDoubl(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_TrainM_DoCondDoubl(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		if (getCharacterCurrentParams(kCharacterTrainM)[8] >= 2 && getCharacterCurrentParams(kCharacterTrainM)[7]) {
 			send(kCharacterTrainM, getCharacterCurrentParams(kCharacterTrainM)[0], 125499160, 0);
 			if (!checkCathDir(kCarGreenSleeping, 2) && !checkCathDir(4, 2))
@@ -719,18 +812,27 @@ void LogicManager::HAND_TrainM_DoCondDoubl(HAND_PARAMS) {
 			_engine->getMessageManager()->setMessageHandle(kCharacterTrainM, _functionsTrainM[getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall]]);
 			fedEx(kCharacterTrainM, kCharacterTrainM, 18, 0);
 		}
-	} else if (msg->action == 2) {
+
+		break;
+	case 2:
 		getCharacterCurrentParams(kCharacterTrainM)[8]++;
 		if (getCharacterCurrentParams(kCharacterTrainM)[8] == 1)
 			playDialog(kCharacterTrainM, (char *)&getCharacterCurrentParams(kCharacterTrainM)[4], -1, 0);
-	} else if (msg->action == 12) {
+
+		break;
+	case 12:
 		startCycOtis(kCharacterTrainM, "620F");
 		send(kCharacterTrainM, getCharacterCurrentParams(kCharacterTrainM)[0], 171394341, 0);
-	} else if (msg->action == 155853632) {
+		break;
+	case 155853632:
 		getCharacterCurrentParams(kCharacterTrainM)[7] = 1;
-	} else if (msg->action == 202558662) {
+		break;
+	case 202558662:
 		startCycOtis(kCharacterTrainM, "620E");
 		playDialog(kCharacterTrainM, (char *)&getCharacterCurrentParams(kCharacterTrainM)[1], -1, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -745,14 +847,16 @@ void LogicManager::CONS_TrainM_DoCond1ListMessage(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_TrainM_DoCond1ListMessage(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 1;
 		TrainMCall(&LogicManager::CONS_TrainM_LeaveOffice, 0, 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8]) {
 		case 1:
 			getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 2;
-			TrainMCall(&LogicManager::CONS_TrainM_DoWalk, 3, 0x7D0, 0, 0);
+			TrainMCall(&LogicManager::CONS_TrainM_DoWalk, 3, 2000, 0, 0);
 			break;
 		case 2:
 			getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 3;
@@ -769,8 +873,12 @@ void LogicManager::HAND_TrainM_DoCond1ListMessage(HAND_PARAMS) {
 			fedEx(kCharacterTrainM, kCharacterTrainM, 18, 0);
 			break;
 		default:
-			return;
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -785,12 +893,15 @@ void LogicManager::CONS_TrainM_Birth(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_TrainM_Birth(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		if (_gameTime > 1062000 && !getCharacterCurrentParams(kCharacterTrainM)[0]) {
 			getCharacterCurrentParams(kCharacterTrainM)[0] = 1;
 			CONS_TrainM_InOffice(0, 0, 0, 0);
 		}
-	} else if (msg->action == 12) {
+
+		break;
+	case 12:
 		autoMessage(kCharacterTrainM, 191337656, 0);
 		autoMessage(kCharacterTrainM, 226031488, 1);
 		autoMessage(kCharacterTrainM, 339669520, 1);
@@ -806,6 +917,9 @@ void LogicManager::HAND_TrainM_Birth(HAND_PARAMS) {
 
 		setDoor(104, kCharacterTrainM, 0, 0, 9);
 		setDoor(105, kCharacterTrainM, 0, 0, 9);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -820,10 +934,12 @@ void LogicManager::CONS_TrainM_DoMadeBedsMessages(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_TrainM_DoMadeBedsMessages(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 1;
 		TrainMCall(&LogicManager::CONS_TrainM_LeaveOffice, 0, 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8]) {
 		case 1:
 			getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 2;
@@ -851,8 +967,12 @@ void LogicManager::HAND_TrainM_DoMadeBedsMessages(HAND_PARAMS) {
 			fedEx(kCharacterTrainM, kCharacterTrainM, 18, 0);
 			break;
 		default:
-			return;
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -867,10 +987,12 @@ void LogicManager::CONS_TrainM_DoMissingListMessages(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_TrainM_DoMissingListMessages(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 1;
 		TrainMCall(&LogicManager::CONS_TrainM_LeaveOffice, 0, 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8]) {
 		case 1:
 			getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 2;
@@ -900,6 +1022,10 @@ void LogicManager::HAND_TrainM_DoMissingListMessages(HAND_PARAMS) {
 		default:
 			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -914,10 +1040,12 @@ void LogicManager::CONS_TrainM_DoAfterPoliceMessages(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_TrainM_DoAfterPoliceMessages(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 1;
 		TrainMCall(&LogicManager::CONS_TrainM_LeaveOffice, 0, 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8]) {
 		case 1:
 			getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 2;
@@ -947,6 +1075,10 @@ void LogicManager::HAND_TrainM_DoAfterPoliceMessages(HAND_PARAMS) {
 		default:
 			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -961,10 +1093,12 @@ void LogicManager::CONS_TrainM_DoHWMessage(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_TrainM_DoHWMessage(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 1;
 		TrainMCall(&LogicManager::CONS_TrainM_LeaveOffice, 0, 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8]) {
 		case 1:
 			getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 2;
@@ -991,8 +1125,12 @@ void LogicManager::HAND_TrainM_DoHWMessage(HAND_PARAMS) {
 			fedEx(kCharacterTrainM, kCharacterTrainM, 18, 0);
 			break;
 		default:
-			return;
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1007,17 +1145,22 @@ void LogicManager::CONS_TrainM_DoSeizure(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_TrainM_DoSeizure(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		takeItem(kItem9);
 		getCharacter(kCharacterTrainM).characterPosition.car = kCarRedSleeping;
 		getCharacter(kCharacterTrainM).characterPosition.position = 8200;
 		getCharacter(kCharacterTrainM).characterPosition.location = 1;
-	} else if (msg->action == 191477936) {
+		break;
+	case 191477936:
 		getCharacter(kCharacterTrainM).characterPosition.car = kCarRedSleeping;
 		getCharacter(kCharacterTrainM).characterPosition.position = 8200;
 		getCharacter(kCharacterTrainM).characterPosition.location = 0;
 		getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 1;
 		TrainMCall(&LogicManager::CONS_TrainM_WalkBackToOffice, 0, 0, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1122,7 +1265,12 @@ void LogicManager::HAND_TrainM_BoardPolice(HAND_PARAMS) {
 				bumpCath(kCarRedSleeping, 49, 255);
 
 			if (inComp(kCharacterCath, kCarRedSleeping, 4840) || inComp(kCharacterCath, kCarRedSleeping, 4455)) {
-				playNIS(kEventCathTurningNight - !isNight());
+				if (isNight()) {
+					playNIS(kEventCathTurningNight);
+				} else {
+					playNIS(kEventCathTurningDay);
+				}
+
 				playDialog(kCharacterCath, "BUMP", -1, 0);
 				bumpCathFDoor(36);
 			}
@@ -1137,6 +1285,7 @@ void LogicManager::HAND_TrainM_BoardPolice(HAND_PARAMS) {
 				getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 7;
 				TrainMCall(&LogicManager::CONS_TrainM_DoAnnounceWalk, 4, 9460, "TRA1005", 0);
 			}
+
 			break;
 		case 2:
 			if (_gameEvents[kProgressFieldCC]) {
@@ -1192,7 +1341,7 @@ void LogicManager::HAND_TrainM_BoardPolice(HAND_PARAMS) {
 			TrainMCall(&LogicManager::CONS_TrainM_WalkBackToOffice, 0, 0, 0, 0);
 			break;
 		default:
-			return;
+			break;
 		}
 
 		break;
@@ -1209,7 +1358,6 @@ void LogicManager::HAND_TrainM_BoardPolice(HAND_PARAMS) {
 
 		getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 8;
 		TrainMCall(&LogicManager::CONS_TrainM_SaveGame, 1, 0, 0, 0);
-
 		break;
 	default:
 		break;
@@ -1238,111 +1386,190 @@ void LogicManager::HAND_TrainM_InOffice(HAND_PARAMS) {
 			getCharacterParams(kCharacterTrainM, 8)[5] = 0;
 			getCharacterCurrentParams(kCharacterTrainM)[5] = 1;
 		}
+
 		if (getCharacterParams(kCharacterTrainM, 8)[1]) {
 			getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 1;
 			TrainMCall(&LogicManager::CONS_TrainM_DoSeizure, 0, 0, 0, 0);
-			return;
+			break;
 		}
-	LABEL_33:
+
 		if (inOffice(kCharacterCath)) {
 			getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 2;
 			TrainMCall(&LogicManager::CONS_TrainM_KickCathOut, 0, 0, 0, 0);
-			return;
+			break;
 		}
-	LABEL_35:
+
 		if (getCharacterParams(kCharacterTrainM, 8)[6]) {
 			getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 3;
 			TrainMCall(&LogicManager::CONS_TrainM_BoardPolice, 0, 0, 0, 0);
-			return;
-		}
-	LABEL_37:
-		if (getCharacterCurrentParams(kCharacterTrainM)[5])
-			goto LABEL_57;
-		if (_gameTime <= 1062000 || getCharacterCurrentParams(kCharacterTrainM)[6]) {
-		LABEL_41:
-			if (_gameTime <= 1089000 || getCharacterCurrentParams(kCharacterTrainM)[7] || (getCharacterCurrentParams(kCharacterTrainM)[7] = 1, getCharacterCurrentParams(kCharacterTrainM)[4])) {
-			LABEL_45:
-				if (_gameTime <= 1107000 || getCharacterCurrentParams(kCharacterTrainM)[8]) {
-				LABEL_48:
-					if (_gameTime <= 1134000 || getCharacterCurrentParams(kCharacterTrainM)[9]) {
-					LABEL_51:
-						if (_gameTime <= 1165500 || getCharacterCurrentParams(kCharacterTrainM)[10]) {
-						LABEL_54:
-							if (_gameTime <= 1225800 || getCharacterCurrentParams(kCharacterTrainM)[11]) {
-							LABEL_57:
-								if (!getCharacterParams(kCharacterTrainM, 8)[4] || getCharacterCurrentParams(kCharacterTrainM)[1]) {
-								LABEL_14:
-									if (!cathHasItem(kItemPassengerList) || getCharacterCurrentParams(kCharacterTrainM)[2] || _gameTime >= 1134000 && _gameTime <= 1156500) {
-									LABEL_20:
-										if (!getCharacterParams(kCharacterTrainM, 8)[2] || getCharacterCurrentParams(kCharacterTrainM)[3] || _gameTime >= 1134000 && _gameTime <= 1156500) {
-										LABEL_26:
-											if (getCharacterParams(kCharacterTrainM, 8)[0] && !getCharacterCurrentParams(kCharacterTrainM)[4] && (_gameTime < 1134000 || _gameTime > 1156500)) {
-												getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 16;
-												TrainMCall(&LogicManager::CONS_TrainM_DoHWMessage, 0, 0, 0, 0);
-											}
-										} else {
-											getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 15;
-											TrainMCall(&LogicManager::CONS_TrainM_DoCond1ListMessage, 0, 0, 0, 0);
-										}
-									} else {
-										getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 14;
-										TrainMCall(&LogicManager::CONS_TrainM_DoMissingListMessages, 0, 0, 0, 0);
-									}
-								} else {
-									getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 13;
-									TrainMCall(&LogicManager::CONS_TrainM_DoAfterPoliceMessages, 0, 0, 0, 0);
-								}
-							} else {
-								getCharacterCurrentParams(kCharacterTrainM)[11] = 1;
-								getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 12;
-								TrainMCall(&LogicManager::CONS_TrainM_Announce, "TRA1004", 0, 0, 0);
-							}
-						} else {
-							getCharacterCurrentParams(kCharacterTrainM)[10] = 1;
-							getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 11;
-							TrainMCall(&LogicManager::CONS_TrainM_Announce, "TRA1003", 0, 0, 0);
-						}
-					} else {
-						getCharacterCurrentParams(kCharacterTrainM)[9] = 1;
-						getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 10;
-						TrainMCall(&LogicManager::CONS_TrainM_Announce, "TRA1002", 0, 0, 0);
-					}
-				} else {
-					getCharacterCurrentParams(kCharacterTrainM)[8] = 1;
-					getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 9;
-					TrainMCall(&LogicManager::CONS_TrainM_Announce, "TRA1001A", 0, 0, 0);
-				}
-			} else {
-				getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 5;
-				TrainMCall(&LogicManager::CONS_TrainM_LeaveOffice, 0, 0, 0, 0);
+			break;
+		}
+
+		if (getCharacterCurrentParams(kCharacterTrainM)[5]) {
+			if (getCharacterParams(kCharacterTrainM, 8)[4] && !getCharacterCurrentParams(kCharacterTrainM)[1]) {
+				getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 13;
+				TrainMCall(&LogicManager::CONS_TrainM_DoAfterPoliceMessages, 0, 0, 0, 0);
+				break;
 			}
-		} else {
+
+			if (cathHasItem(kItemPassengerList) && !getCharacterCurrentParams(kCharacterTrainM)[2] && !(_gameTime >= 1134000 && _gameTime <= 1156500)) {
+				getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 14;
+				TrainMCall(&LogicManager::CONS_TrainM_DoMissingListMessages, 0, 0, 0, 0);
+				break;
+			}
+
+			if (getCharacterParams(kCharacterTrainM, 8)[2] && !getCharacterCurrentParams(kCharacterTrainM)[3] && !(_gameTime >= 1134000 && _gameTime <= 1156500)) {
+				getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 15;
+				TrainMCall(&LogicManager::CONS_TrainM_DoCond1ListMessage, 0, 0, 0, 0);
+				break;
+			}
+
+			if (getCharacterParams(kCharacterTrainM, 8)[0] && !getCharacterCurrentParams(kCharacterTrainM)[4] && (_gameTime < 1134000 || _gameTime > 1156500)) {
+				getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 16;
+				TrainMCall(&LogicManager::CONS_TrainM_DoHWMessage, 0, 0, 0, 0);
+			}
+
+			break;
+		}
+
+		if (_gameTime > 1062000 && !getCharacterCurrentParams(kCharacterTrainM)[6]) {
 			getCharacterCurrentParams(kCharacterTrainM)[6] = 1;
 			getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 4;
 			TrainMCall(&LogicManager::CONS_TrainM_Announce, "TRA1001", 0, 0, 0);
+			break;
 		}
-		break;
-	case 9:
-		getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 17;
-		TrainMCall(&LogicManager::CONS_TrainM_KickCathOut, msg->param.intParam == 105, 0, 0, 0);
-		return;
-	case 12:
-		getCharacter(kCharacterTrainM).characterPosition.car = kCarBaggage;
-		getCharacter(kCharacterTrainM).characterPosition.position = 5000;
+
+		if (_gameTime > 1089000 && !getCharacterCurrentParams(kCharacterTrainM)[7] && !(getCharacterCurrentParams(kCharacterTrainM)[7] = 1, getCharacterCurrentParams(kCharacterTrainM)[4])) {
+			getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 5;
+			TrainMCall(&LogicManager::CONS_TrainM_LeaveOffice, 0, 0, 0, 0);
+			break;
+		}
+
+		if (_gameTime > 1107000 && !getCharacterCurrentParams(kCharacterTrainM)[8]) {
+			getCharacterCurrentParams(kCharacterTrainM)[8] = 1;
+			getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 9;
+			TrainMCall(&LogicManager::CONS_TrainM_Announce, "TRA1001A", 0, 0, 0);
+			break;
+		}
+
+		if (_gameTime > 1134000 && !getCharacterCurrentParams(kCharacterTrainM)[9]) {
+			getCharacterCurrentParams(kCharacterTrainM)[9] = 1;
+			getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 10;
+			TrainMCall(&LogicManager::CONS_TrainM_Announce, "TRA1002", 0, 0, 0);
+			break;
+		}
+
+		if (_gameTime > 1165500 && !getCharacterCurrentParams(kCharacterTrainM)[10]) {
+			getCharacterCurrentParams(kCharacterTrainM)[10] = 1;
+			getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 11;
+			TrainMCall(&LogicManager::CONS_TrainM_Announce, "TRA1003", 0, 0, 0);
+			break;
+		}
+
+		if (_gameTime > 1225800 && !getCharacterCurrentParams(kCharacterTrainM)[11]) {
+			getCharacterCurrentParams(kCharacterTrainM)[11] = 1;
+			getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 12;
+			TrainMCall(&LogicManager::CONS_TrainM_Announce, "TRA1004", 0, 0, 0);
+			break;
+		}
+
+		if (getCharacterParams(kCharacterTrainM, 8)[4] && !getCharacterCurrentParams(kCharacterTrainM)[1]) {
+			getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 13;
+			TrainMCall(&LogicManager::CONS_TrainM_DoAfterPoliceMessages, 0, 0, 0, 0);
+			break;
+		}
+
+		if (cathHasItem(kItemPassengerList) && !getCharacterCurrentParams(kCharacterTrainM)[2] && !(_gameTime >= 1134000 && _gameTime <= 1156500)) {
+			getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 14;
+			TrainMCall(&LogicManager::CONS_TrainM_DoMissingListMessages, 0, 0, 0, 0);
+			break;
+		}
+
+		if (getCharacterParams(kCharacterTrainM, 8)[2] && !getCharacterCurrentParams(kCharacterTrainM)[3] && !(_gameTime >= 1134000 && _gameTime <= 1156500)) {
+			getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 15;
+			TrainMCall(&LogicManager::CONS_TrainM_DoCond1ListMessage, 0, 0, 0, 0);
+			break;
+		}
+
+		if (getCharacterParams(kCharacterTrainM, 8)[0] && !getCharacterCurrentParams(kCharacterTrainM)[4] && (_gameTime < 1134000 || _gameTime > 1156500)) {
+			getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 16;
+			TrainMCall(&LogicManager::CONS_TrainM_DoHWMessage, 0, 0, 0, 0);
+		}
+
+		break;
+	case 9:
+		getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 17;
+		TrainMCall(&LogicManager::CONS_TrainM_KickCathOut, msg->param.intParam == 105, 0, 0, 0);
+		break;
+	case 12:
+		getCharacter(kCharacterTrainM).characterPosition.car = kCarBaggage;
+		getCharacter(kCharacterTrainM).characterPosition.position = 5000;
 		getCharacter(kCharacterTrainM).characterPosition.location = 0;
-		endGraphics(9);
+		endGraphics(kCharacterTrainM);
 		dropItem(kItem9, 1);
-		return;
+		break;
 	case 18:
 		switch (getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8]) {
 		case 1:
-			goto LABEL_33;
+			if (inOffice(kCharacterCath)) {
+				getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 2;
+				TrainMCall(&LogicManager::CONS_TrainM_KickCathOut, 0, 0, 0, 0);
+				break;
+			}
+
+			// fall through
 		case 2:
-			goto LABEL_35;
+			if (getCharacterParams(kCharacterTrainM, 8)[6]) {
+				getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 3;
+				TrainMCall(&LogicManager::CONS_TrainM_BoardPolice, 0, 0, 0, 0);
+				break;
+			}
+
+			// fall through
 		case 3:
-			goto LABEL_37;
+			if (getCharacterCurrentParams(kCharacterTrainM)[5]) {
+				if (getCharacterParams(kCharacterTrainM, 8)[4] && !getCharacterCurrentParams(kCharacterTrainM)[1]) {
+					getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 13;
+					TrainMCall(&LogicManager::CONS_TrainM_DoAfterPoliceMessages, 0, 0, 0, 0);
+					break;
+				}
+
+				if (cathHasItem(kItemPassengerList) && !getCharacterCurrentParams(kCharacterTrainM)[2] && !(_gameTime >= 1134000 && _gameTime <= 1156500)) {
+					getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 14;
+					TrainMCall(&LogicManager::CONS_TrainM_DoMissingListMessages, 0, 0, 0, 0);
+					break;
+				}
+
+				if (getCharacterParams(kCharacterTrainM, 8)[2] && !getCharacterCurrentParams(kCharacterTrainM)[3] && !(_gameTime >= 1134000 && _gameTime <= 1156500)) {
+					getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 15;
+					TrainMCall(&LogicManager::CONS_TrainM_DoCond1ListMessage, 0, 0, 0, 0);
+					break;
+				}
+
+				if (getCharacterParams(kCharacterTrainM, 8)[0] && !getCharacterCurrentParams(kCharacterTrainM)[4] && (_gameTime < 1134000 || _gameTime > 1156500)) {
+					getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 16;
+					TrainMCall(&LogicManager::CONS_TrainM_DoHWMessage, 0, 0, 0, 0);
+				}
+
+				break;
+			}
+
+			if (_gameTime > 1062000 && !getCharacterCurrentParams(kCharacterTrainM)[6]) {
+				getCharacterCurrentParams(kCharacterTrainM)[6] = 1;
+				getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 4;
+				TrainMCall(&LogicManager::CONS_TrainM_Announce, "TRA1001", 0, 0, 0);
+				break;
+			}
+
+			// fall through
 		case 4:
-			goto LABEL_41;
+			if (_gameTime > 1089000 && !getCharacterCurrentParams(kCharacterTrainM)[7] && !(getCharacterCurrentParams(kCharacterTrainM)[7] = 1, getCharacterCurrentParams(kCharacterTrainM)[4])) {
+				getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 5;
+				TrainMCall(&LogicManager::CONS_TrainM_LeaveOffice, 0, 0, 0, 0);
+				break;
+			}
+
+			// fall through
 		case 5:
 			getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 6;
 			TrainMCall(&LogicManager::CONS_TrainM_DoWalk, 3, 2000, 0, 0);
@@ -1356,33 +1583,94 @@ void LogicManager::HAND_TrainM_InOffice(HAND_PARAMS) {
 			TrainMCall(&LogicManager::CONS_TrainM_WalkBackToOffice, 0, 0, 0, 0);
 			break;
 		case 8:
-			goto LABEL_45;
+			if (_gameTime > 1107000 && !getCharacterCurrentParams(kCharacterTrainM)[8]) {
+				getCharacterCurrentParams(kCharacterTrainM)[8] = 1;
+				getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 9;
+				TrainMCall(&LogicManager::CONS_TrainM_Announce, "TRA1001A", 0, 0, 0);
+				break;
+			}
+
+			// fall through
 		case 9:
-			goto LABEL_48;
+			if (_gameTime > 1134000 && !getCharacterCurrentParams(kCharacterTrainM)[9]) {
+				getCharacterCurrentParams(kCharacterTrainM)[9] = 1;
+				getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 10;
+				TrainMCall(&LogicManager::CONS_TrainM_Announce, "TRA1002", 0, 0, 0);
+				break;
+			}
+
+			// fall through
 		case 10:
-			goto LABEL_51;
+			if (_gameTime > 1165500 && !getCharacterCurrentParams(kCharacterTrainM)[10]) {
+				getCharacterCurrentParams(kCharacterTrainM)[10] = 1;
+				getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 11;
+				TrainMCall(&LogicManager::CONS_TrainM_Announce, "TRA1003", 0, 0, 0);
+				break;
+			}
+
+			// fall through
 		case 11:
-			goto LABEL_54;
+			if (_gameTime > 1225800 && !getCharacterCurrentParams(kCharacterTrainM)[11]) {
+				getCharacterCurrentParams(kCharacterTrainM)[11] = 1;
+				getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 12;
+				TrainMCall(&LogicManager::CONS_TrainM_Announce, "TRA1004", 0, 0, 0);
+				break;
+			}
+
+			// fall through
 		case 12:
-			goto LABEL_57;
+			if (getCharacterParams(kCharacterTrainM, 8)[4] && !getCharacterCurrentParams(kCharacterTrainM)[1]) {
+				getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 13;
+				TrainMCall(&LogicManager::CONS_TrainM_DoAfterPoliceMessages, 0, 0, 0, 0);
+				break;
+			}
+
+			// fall through
 		case 13:
-			getCharacterCurrentParams(kCharacterTrainM)[1] = 1;
-			goto LABEL_14;
+			if (getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] == 13) {
+				getCharacterCurrentParams(kCharacterTrainM)[1] = 1;
+			}
+
+			if (cathHasItem(kItemPassengerList) && !getCharacterCurrentParams(kCharacterTrainM)[2] && !(_gameTime >= 1134000 && _gameTime <= 1156500)) {
+				getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 14;
+				TrainMCall(&LogicManager::CONS_TrainM_DoMissingListMessages, 0, 0, 0, 0);
+				break;
+			}
+
+			// fall through
 		case 14:
-			getCharacterCurrentParams(kCharacterTrainM)[2] = 1;
-			goto LABEL_20;
+			if (getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] == 14) {
+				getCharacterCurrentParams(kCharacterTrainM)[2] = 1;
+			}
+
+			if (getCharacterParams(kCharacterTrainM, 8)[2] && !getCharacterCurrentParams(kCharacterTrainM)[3] && !(_gameTime >= 1134000 && _gameTime <= 1156500)) {
+				getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 15;
+				TrainMCall(&LogicManager::CONS_TrainM_DoCond1ListMessage, 0, 0, 0, 0);
+				break;
+			}
+
+			// fall through
 		case 15:
-			getCharacterCurrentParams(kCharacterTrainM)[3] = 1;
-			goto LABEL_26;
+			if (getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] == 15) {
+				getCharacterCurrentParams(kCharacterTrainM)[3] = 1;
+			}
+
+			if (getCharacterParams(kCharacterTrainM, 8)[0] && !getCharacterCurrentParams(kCharacterTrainM)[4] && (_gameTime < 1134000 || _gameTime > 1156500)) {
+				getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 16;
+				TrainMCall(&LogicManager::CONS_TrainM_DoHWMessage, 0, 0, 0, 0);
+			}
+
+			break;
 		case 16:
 			getCharacterCurrentParams(kCharacterTrainM)[4] = 1;
 			break;
 		default:
-			return;
+			break;
 		}
-		return;
+
+		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -1397,9 +1685,11 @@ void LogicManager::CONS_TrainM_StartPart2(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_TrainM_StartPart2(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		CONS_TrainM_InPart2(0, 0, 0, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		endGraphics(kCharacterTrainM);
 		getCharacter(kCharacterTrainM).characterPosition.car = kCarBaggage;
 		getCharacter(kCharacterTrainM).characterPosition.position = 5000;
@@ -1410,6 +1700,9 @@ void LogicManager::HAND_TrainM_StartPart2(HAND_PARAMS) {
 		setDoor(105, kCharacterTrainM, 0, 0, 9);
 
 		getCharacterParams(kCharacterTrainM, 8)[2] = 0;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1424,79 +1717,136 @@ void LogicManager::CONS_TrainM_InPart2(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_TrainM_InPart2(HAND_PARAMS) {
-	if (msg->action <= 18) {
-		switch (msg->action) {
-		case 0:
-			if (inOffice(kCharacterCath)) {
-				getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 1;
-				TrainMCall(&LogicManager::CONS_TrainM_KickCathOut, 0, 0, 0, 0);
-				return;
+	switch (msg->action) {
+	case 0:
+		if (inOffice(kCharacterCath)) {
+			getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 1;
+			TrainMCall(&LogicManager::CONS_TrainM_KickCathOut, 0, 0, 0, 0);
+			break;
+		}
+
+		if (_gameTime > 1818900 && !getCharacterCurrentParams(kCharacterTrainM)[0]) {
+			getCharacterCurrentParams(kCharacterTrainM)[0] = 1;
+			getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 2;
+			TrainMCall(&LogicManager::CONS_TrainM_Announce, "Tra2177", 0, 0, 0);
+			break;
+		}
+
+		if (getCharacterCurrentParams(kCharacterTrainM)[1] == 0x7FFFFFFF || !_gameTime) {
+			if (getCharacterParams(kCharacterTrainM, 8)[2]) {
+				getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 7;
+				TrainMCall(&LogicManager::CONS_TrainM_DoCond1ListMessage, 0, 0, 0, 0);
 			}
-		LABEL_11:
+		}
+
+		if (_gameTime > 1836000) {
+			getCharacterCurrentParams(kCharacterTrainM)[1] = 0x7FFFFFFF;
+			getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 3;
+			TrainMCall(&LogicManager::CONS_TrainM_LeaveOffice, 0, 0, 0, 0);
+			break;
+		}
+
+		if (!cathInCorridor(kCarRedSleeping) || !getCharacterCurrentParams(kCharacterTrainM)[1]) {
+			getCharacterCurrentParams(kCharacterTrainM)[1] = _gameTime;
+			if (!_gameTime) {
+				getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 3;
+				TrainMCall(&LogicManager::CONS_TrainM_LeaveOffice, 0, 0, 0, 0);
+				break;
+			}
+		}
+
+		if (getCharacterCurrentParams(kCharacterTrainM)[1] >= _gameTime) {
+			if (getCharacterParams(kCharacterTrainM, 8)[2]) {
+				getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 7;
+				TrainMCall(&LogicManager::CONS_TrainM_DoCond1ListMessage, 0, 0, 0, 0);
+			}
+		} else {
+			getCharacterCurrentParams(kCharacterTrainM)[1] = 0x7FFFFFFF;
+			getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 3;
+			TrainMCall(&LogicManager::CONS_TrainM_LeaveOffice, 0, 0, 0, 0);
+		}
+
+		break;
+	case 9:
+		getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 8;
+		TrainMCall(&LogicManager::CONS_TrainM_KickCathOut, msg->param.intParam == 105, 0, 0, 0);
+		break;
+	case 12:
+		dropItem(kItem9, 1);
+		break;
+	case 18:
+		switch (getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8]) {
+		case 1:
 			if (_gameTime > 1818900 && !getCharacterCurrentParams(kCharacterTrainM)[0]) {
 				getCharacterCurrentParams(kCharacterTrainM)[0] = 1;
 				getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 2;
 				TrainMCall(&LogicManager::CONS_TrainM_Announce, "Tra2177", 0, 0, 0);
-				return;
+				break;
 			}
-		LABEL_14:
-			if (getCharacterCurrentParams(kCharacterTrainM)[1] == 0x7FFFFFFF || !_gameTime)
-				goto LABEL_23;
-			if (_gameTime > 1836000)
-				goto LABEL_21;
+
+			// fall through
+		case 2:
+			if (getCharacterCurrentParams(kCharacterTrainM)[1] == 0x7FFFFFFF || !_gameTime) {
+				if (getCharacterParams(kCharacterTrainM, 8)[2]) {
+					getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 7;
+					TrainMCall(&LogicManager::CONS_TrainM_DoCond1ListMessage, 0, 0, 0, 0);
+				}
+			}
+
+			if (_gameTime > 1836000) {
+				getCharacterCurrentParams(kCharacterTrainM)[1] = 0x7FFFFFFF;
+				getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 3;
+				TrainMCall(&LogicManager::CONS_TrainM_LeaveOffice, 0, 0, 0, 0);
+				break;
+			}
+
 			if (!cathInCorridor(kCarRedSleeping) || !getCharacterCurrentParams(kCharacterTrainM)[1]) {
 				getCharacterCurrentParams(kCharacterTrainM)[1] = _gameTime;
-				if (!_gameTime)
-					goto LABEL_22;
+				if (!_gameTime) {
+					getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 3;
+					TrainMCall(&LogicManager::CONS_TrainM_LeaveOffice, 0, 0, 0, 0);
+					break;
+				}
 			}
+
 			if (getCharacterCurrentParams(kCharacterTrainM)[1] >= _gameTime) {
-			LABEL_23:
 				if (getCharacterParams(kCharacterTrainM, 8)[2]) {
 					getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 7;
 					TrainMCall(&LogicManager::CONS_TrainM_DoCond1ListMessage, 0, 0, 0, 0);
 				}
 			} else {
-			LABEL_21:
 				getCharacterCurrentParams(kCharacterTrainM)[1] = 0x7FFFFFFF;
-			LABEL_22:
 				getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 3;
 				TrainMCall(&LogicManager::CONS_TrainM_LeaveOffice, 0, 0, 0, 0);
 			}
+
 			break;
-		case 9:
-			getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 8;
-			TrainMCall(&LogicManager::CONS_TrainM_KickCathOut, msg->param.intParam == 105, 0, 0, 0);
-			return;
-		case 12:
-			dropItem(kItem9, 1);
-			return;
-		case 18:
-			switch (getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8]) {
-			case 1:
-				goto LABEL_11;
-			case 2:
-				goto LABEL_14;
-			case 3:
-				getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 4;
-				TrainMCall(&LogicManager::CONS_TrainM_DoWalk, 4, 2000, 0, 0);
-				break;
-			case 4:
-				getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 5;
-				TrainMCall(&LogicManager::CONS_TrainM_DoCond, 4, "TRA2100", 0, 0);
-				break;
-			case 5:
-				getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 6;
-				TrainMCall(&LogicManager::CONS_TrainM_WalkBackToOffice, 0, 0, 0, 0);
-				break;
-			case 6:
-				goto LABEL_23;
-			default:
-				return;
+		case 3:
+			getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 4;
+			TrainMCall(&LogicManager::CONS_TrainM_DoWalk, 4, 2000, 0, 0);
+			break;
+		case 4:
+			getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 5;
+			TrainMCall(&LogicManager::CONS_TrainM_DoCond, 4, "TRA2100", 0, 0);
+			break;
+		case 5:
+			getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 6;
+			TrainMCall(&LogicManager::CONS_TrainM_WalkBackToOffice, 0, 0, 0, 0);
+			break;
+		case 6:
+			if (getCharacterParams(kCharacterTrainM, 8)[2]) {
+				getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 7;
+				TrainMCall(&LogicManager::CONS_TrainM_DoCond1ListMessage, 0, 0, 0, 0);
 			}
-			return;
+
+			break;
 		default:
-			return;
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1511,9 +1861,11 @@ void LogicManager::CONS_TrainM_StartPart3(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_TrainM_StartPart3(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		CONS_TrainM_OnRearPlatform(0, 0, 0, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		endGraphics(kCharacterTrainM);
 		getCharacter(kCharacterTrainM).characterPosition.car = kCarRestaurant;
 		getCharacter(kCharacterTrainM).characterPosition.position = 540;
@@ -1526,6 +1878,9 @@ void LogicManager::HAND_TrainM_StartPart3(HAND_PARAMS) {
 
 		getCharacterParams(kCharacterTrainM, 8)[3] = 0;
 		getCharacterParams(kCharacterTrainM, 8)[2] = 0;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1542,10 +1897,12 @@ void LogicManager::CONS_TrainM_VisitCond2(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_TrainM_VisitCond2(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 1;
 		TrainMCall(&LogicManager::CONS_TrainM_LeaveOffice, 0, 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8]) {
 		case 1:
 			getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 2;
@@ -1565,8 +1922,12 @@ void LogicManager::HAND_TrainM_VisitCond2(HAND_PARAMS) {
 			fedEx(kCharacterTrainM, kCharacterTrainM, 18, 0);
 			break;
 		default:
-			return;
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1581,10 +1942,12 @@ void LogicManager::CONS_TrainM_DoDogProblem(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_TrainM_DoDogProblem(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 1;
 		TrainMCall(&LogicManager::CONS_TrainM_LeaveOffice, 0, 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8]) {
 		case 1:
 			getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 2;
@@ -1608,8 +1971,12 @@ void LogicManager::HAND_TrainM_DoDogProblem(HAND_PARAMS) {
 			fedEx(kCharacterTrainM, kCharacterTrainM, 18, 0);
 			break;
 		default:
-			return;
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1624,13 +1991,16 @@ void LogicManager::CONS_TrainM_AnnounceVienna(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_TrainM_AnnounceVienna(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		if (_gameTime > 2263500 && !getCharacterCurrentParams(kCharacterTrainM)[0]) {
 			getCharacterCurrentParams(kCharacterTrainM)[0] = 1;
 			getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 5;
 			TrainMCall(&LogicManager::CONS_TrainM_DoAnnounceWalk, 4, 9460, "TRA3006", 0);
 		}
-	} else if (msg->action == 12) {
+
+		break;
+	case 12:
 		setDoor(104, kCharacterCath, 0, 0, 9);
 		setDoor(105, kCharacterCath, 0, 0, 9);
 
@@ -1643,7 +2013,7 @@ void LogicManager::HAND_TrainM_AnnounceVienna(HAND_PARAMS) {
 				getCharacter(kCharacterTrainM).characterPosition.position = 5900;
 				getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 1;
 				TrainMCall(&LogicManager::CONS_TrainM_WaitRCClear, 0, 0, 0, 0);
-				return;
+				break;
 			} else {
 				playNIS(kEventVergesCanIHelpYou);
 			}
@@ -1656,7 +2026,8 @@ void LogicManager::HAND_TrainM_AnnounceVienna(HAND_PARAMS) {
 		getCharacter(kCharacterTrainM).characterPosition.position = 5900;
 		getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 1;
 		TrainMCall(&LogicManager::CONS_TrainM_WaitRCClear, 0, 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8]) {
 		case 1:
 			getCharacter(kCharacterTrainM).characterPosition.position = 5800;
@@ -1668,9 +2039,12 @@ void LogicManager::HAND_TrainM_AnnounceVienna(HAND_PARAMS) {
 		case 2:
 			if (!whoRunningDialog(kCharacterTrainM))
 				playDialog(kCharacterTrainM, "TRA3004", -1, 0);
+
 			startSeqOtis(kCharacterTrainM, "813DS");
+
 			if (inDiningRoom(kCharacterCath))
 				advanceFrame(kCharacterTrainM);
+
 			getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 3;
 			TrainMCall(&LogicManager::CONS_TrainM_FinishSeqOtis, 0, 0, 0, 0);
 			break;
@@ -1693,6 +2067,10 @@ void LogicManager::HAND_TrainM_AnnounceVienna(HAND_PARAMS) {
 		default:
 			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1707,10 +2085,12 @@ void LogicManager::CONS_TrainM_OnRearPlatform(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_TrainM_OnRearPlatform(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 1;
 		TrainMCall(&LogicManager::CONS_TrainM_WaitRCClear, 0, 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8]) {
 		case 1:
 			getCharacter(kCharacterTrainM).characterPosition.position = 1540;
@@ -1751,115 +2131,187 @@ void LogicManager::HAND_TrainM_OnRearPlatform(HAND_PARAMS) {
 		case 6:
 			CONS_TrainM_InPart3(0, 0, 0, 0);
 			break;
-		default:
-			return;
+		default:
+			break;
+		}
+
+		break;
+	default:
+		break;
+	}
+}
+
+void LogicManager::CONS_TrainM_InPart3(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterTrainM).callParams[getCharacter(kCharacterTrainM).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterTrainM, &LogicManager::HAND_TrainM_InPart3);
+	getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall] = 34;
+
+	params->clear();
+
+	fedEx(kCharacterTrainM, kCharacterTrainM, 12, 0);
+}
+
+void LogicManager::HAND_TrainM_InPart3(HAND_PARAMS) {
+	switch (msg->action) {
+	case 0:
+		if (inOffice(kCharacterCath)) {
+			getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 1;
+			TrainMCall(&LogicManager::CONS_TrainM_KickCathOut, 0, 0, 0, 0);
+			break;
+		}
+
+		if (getCharacterParams(kCharacterTrainM, 8)[3]) {
+			getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 2;
+			TrainMCall(&LogicManager::CONS_TrainM_DoDogProblem, 0, 0, 0, 0);
+			break;
+		}
+
+		if (getCharacterParams(kCharacterTrainM, 8)[2]) {
+			getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 3;
+			TrainMCall(&LogicManager::CONS_TrainM_DoCond1ListMessage, 0, 0, 0, 0);
+			break;
+		}
+
+		if (_gameTime > 1971000 && !getCharacterCurrentParams(kCharacterTrainM)[0]) {
+			getCharacterCurrentParams(kCharacterTrainM)[0] = 1;
+			getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 4;
+			TrainMCall(&LogicManager::CONS_TrainM_Announce, "Tra3001", 0, 0, 0);
+			break;
+		}
+
+		if (_gameTime > 1998000 && !getCharacterCurrentParams(kCharacterTrainM)[1]) {
+			getCharacterCurrentParams(kCharacterTrainM)[1] = 1;
+			getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 5;
+			TrainMCall(&LogicManager::CONS_TrainM_Announce, "Tra3010a", 0, 0, 0);
+			break;
+		}
+
+		if (_gameTime > 2016000 && !getCharacterCurrentParams(kCharacterTrainM)[2]) {
+			getCharacterCurrentParams(kCharacterTrainM)[2] = 1;
+			getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 6;
+			TrainMCall(&LogicManager::CONS_TrainM_VisitKron, 0, 0, 0, 0);
+			break;
+		}
+
+		if (_gameTime > 2070000 && !getCharacterCurrentParams(kCharacterTrainM)[3]) {
+			getCharacterCurrentParams(kCharacterTrainM)[3] = 1;
+			getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 7;
+			TrainMCall(&LogicManager::CONS_TrainM_Announce, "Tra3002", 0, 0, 0);
+			break;
 		}
-	}
-}
 
-void LogicManager::CONS_TrainM_InPart3(CONS_PARAMS) {
-	CharacterCallParams *params = &getCharacter(kCharacterTrainM).callParams[getCharacter(kCharacterTrainM).currentCall];
-	_engine->getMessageManager()->setMessageHandle(kCharacterTrainM, &LogicManager::HAND_TrainM_InPart3);
-	getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall] = 34;
+		if (_gameTime > 2142000 && !getCharacterCurrentParams(kCharacterTrainM)[4]) {
+			getCharacterCurrentParams(kCharacterTrainM)[4] = 1;
+			getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 8;
+			TrainMCall(&LogicManager::CONS_TrainM_Announce, "Tra3003", 0, 0, 0);
+			break;
+		}
 
-	params->clear();
+		if (_gameTime > 2173500 && !getCharacterCurrentParams(kCharacterTrainM)[5]) {
+			getCharacterCurrentParams(kCharacterTrainM)[5] = 1;
+			getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 9;
+			TrainMCall(&LogicManager::CONS_TrainM_VisitCond2, "Tra3012", 0, 0, 0);
+			break;
+		}
 
-	fedEx(kCharacterTrainM, kCharacterTrainM, 12, 0);
-}
+		if (_gameTime > 2218500 && !getCharacterCurrentParams(kCharacterTrainM)[6]) {
+			getCharacterCurrentParams(kCharacterTrainM)[6] = 1;
+			getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 10;
+			TrainMCall(&LogicManager::CONS_TrainM_AnnounceVienna, 0, 0, 0, 0);
+		}
 
-void LogicManager::HAND_TrainM_InPart3(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 9) {
-			getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 11;
-			TrainMCall(&LogicManager::CONS_TrainM_KickCathOut, msg->param.intParam == 105, 0, 0, 0);
-		} else if (msg->action == 18) {
-			switch (getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8]) {
-			case 1:
-				goto LABEL_9;
-			case 2:
-				goto LABEL_11;
-			case 3:
-				goto LABEL_13;
-			case 4:
-				goto LABEL_16;
-			case 5:
-				goto LABEL_19;
-			case 6:
-				goto LABEL_22;
-			case 7:
-				goto LABEL_25;
-			case 8:
-				goto LABEL_28;
-			case 9:
-				goto LABEL_31;
-			default:
-				return;
+		break;
+	case 9:
+		getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 11;
+		TrainMCall(&LogicManager::CONS_TrainM_KickCathOut, (msg->param.intParam == 105) ? 1 : 0, 0, 0, 0);
+		break;
+	case 18:
+		switch (getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8]) {
+		case 1:
+			if (getCharacterParams(kCharacterTrainM, 8)[3]) {
+				getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 2;
+				TrainMCall(&LogicManager::CONS_TrainM_DoDogProblem, 0, 0, 0, 0);
+				break;
 			}
-		}
-	} else if (inOffice(kCharacterCath)) {
-		getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 1;
-		TrainMCall(&LogicManager::CONS_TrainM_KickCathOut, 0, 0, 0, 0);
-	} else {
-	LABEL_9:
-		if (getCharacterParams(kCharacterTrainM, 8)[3]) {
-			getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 2;
-			TrainMCall(&LogicManager::CONS_TrainM_DoDogProblem, 0, 0, 0, 0);
-		} else {
-		LABEL_11:
+
+			// fall through
+		case 2:
 			if (getCharacterParams(kCharacterTrainM, 8)[2]) {
 				getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 3;
 				TrainMCall(&LogicManager::CONS_TrainM_DoCond1ListMessage, 0, 0, 0, 0);
-			} else {
-			LABEL_13:
-				if (_gameTime <= 1971000 || getCharacterCurrentParams(kCharacterTrainM)[0]) {
-				LABEL_16:
-					if (_gameTime <= 1998000 || getCharacterCurrentParams(kCharacterTrainM)[1]) {
-					LABEL_19:
-						if (_gameTime <= 2016000 || getCharacterCurrentParams(kCharacterTrainM)[2]) {
-						LABEL_22:
-							if (_gameTime <= 2070000 || getCharacterCurrentParams(kCharacterTrainM)[3]) {
-							LABEL_25:
-								if (_gameTime <= 2142000 || getCharacterCurrentParams(kCharacterTrainM)[4]) {
-								LABEL_28:
-									if (_gameTime <= 2173500 || getCharacterCurrentParams(kCharacterTrainM)[5]) {
-									LABEL_31:
-										if (_gameTime > 2218500 && !getCharacterCurrentParams(kCharacterTrainM)[6]) {
-											getCharacterCurrentParams(kCharacterTrainM)[6] = 1;
-											getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 10;
-											TrainMCall(&LogicManager::CONS_TrainM_AnnounceVienna, 0, 0, 0, 0);
-										}
-									} else {
-										getCharacterCurrentParams(kCharacterTrainM)[5] = 1;
-										getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 9;
-										TrainMCall(&LogicManager::CONS_TrainM_VisitCond2, "Tra3012", 0, 0, 0);
-									}
-								} else {
-									getCharacterCurrentParams(kCharacterTrainM)[4] = 1;
-									getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 8;
-									TrainMCall(&LogicManager::CONS_TrainM_Announce, "Tra3003", 0, 0, 0);
-								}
-							} else {
-								getCharacterCurrentParams(kCharacterTrainM)[3] = 1;
-								getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 7;
-								TrainMCall(&LogicManager::CONS_TrainM_Announce, "Tra3002", 0, 0, 0);
-							}
-						} else {
-							getCharacterCurrentParams(kCharacterTrainM)[2] = 1;
-							getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 6;
-							TrainMCall(&LogicManager::CONS_TrainM_VisitKron, 0, 0, 0, 0);
-						}
-					} else {
-						getCharacterCurrentParams(kCharacterTrainM)[1] = 1;
-						getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 5;
-						TrainMCall(&LogicManager::CONS_TrainM_Announce, "Tra3010a", 0, 0, 0);
-					}
-				} else {
-					getCharacterCurrentParams(kCharacterTrainM)[0] = 1;
-					getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 4;
-					TrainMCall(&LogicManager::CONS_TrainM_Announce, "Tra3001", 0, 0, 0);
-				}
+				break;
+			}
+
+			// fall through
+		case 3:
+			if (_gameTime > 1971000 && !getCharacterCurrentParams(kCharacterTrainM)[0]) {
+				getCharacterCurrentParams(kCharacterTrainM)[0] = 1;
+				getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 4;
+				TrainMCall(&LogicManager::CONS_TrainM_Announce, "Tra3001", 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 4:
+			if (_gameTime > 1998000 && !getCharacterCurrentParams(kCharacterTrainM)[1]) {
+				getCharacterCurrentParams(kCharacterTrainM)[1] = 1;
+				getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 5;
+				TrainMCall(&LogicManager::CONS_TrainM_Announce, "Tra3010a", 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 5:
+			if (_gameTime > 2016000 && !getCharacterCurrentParams(kCharacterTrainM)[2]) {
+				getCharacterCurrentParams(kCharacterTrainM)[2] = 1;
+				getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 6;
+				TrainMCall(&LogicManager::CONS_TrainM_VisitKron, 0, 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 6:
+			if (_gameTime > 2070000 && !getCharacterCurrentParams(kCharacterTrainM)[3]) {
+				getCharacterCurrentParams(kCharacterTrainM)[3] = 1;
+				getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 7;
+				TrainMCall(&LogicManager::CONS_TrainM_Announce, "Tra3002", 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 7:
+			if (_gameTime > 2142000 && !getCharacterCurrentParams(kCharacterTrainM)[4]) {
+				getCharacterCurrentParams(kCharacterTrainM)[4] = 1;
+				getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 8;
+				TrainMCall(&LogicManager::CONS_TrainM_Announce, "Tra3003", 0, 0, 0);
+				break;
 			}
+
+			// fall through
+		case 8:
+			if (_gameTime > 2173500 && !getCharacterCurrentParams(kCharacterTrainM)[5]) {
+				getCharacterCurrentParams(kCharacterTrainM)[5] = 1;
+				getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 9;
+				TrainMCall(&LogicManager::CONS_TrainM_VisitCond2, "Tra3012", 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 9:
+			if (_gameTime > 2218500 && !getCharacterCurrentParams(kCharacterTrainM)[6]) {
+				getCharacterCurrentParams(kCharacterTrainM)[6] = 1;
+				getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 10;
+				TrainMCall(&LogicManager::CONS_TrainM_AnnounceVienna, 0, 0, 0, 0);
+			}
+
+			break;
+		default:
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1874,10 +2326,12 @@ void LogicManager::CONS_TrainM_VisitKron(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_TrainM_VisitKron(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 1;
 		TrainMCall(&LogicManager::CONS_TrainM_LeaveOffice, 0, 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8]) {
 		case 1:
 			getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 2;
@@ -1909,6 +2363,10 @@ void LogicManager::HAND_TrainM_VisitKron(HAND_PARAMS) {
 		default:
 			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1923,9 +2381,11 @@ void LogicManager::CONS_TrainM_StartPart4(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_TrainM_StartPart4(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		CONS_TrainM_InOffice4(0, 0, 0, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		endGraphics(kCharacterTrainM);
 
 		getCharacter(kCharacterTrainM).characterPosition.car = kCarBaggage;
@@ -1939,6 +2399,9 @@ void LogicManager::HAND_TrainM_StartPart4(HAND_PARAMS) {
 
 		getCharacterParams(kCharacterTrainM, 8)[2] = 0;
 		getCharacterParams(kCharacterTrainM, 8)[5] = 0;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1953,106 +2416,172 @@ void LogicManager::CONS_TrainM_InOffice4(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_TrainM_InOffice4(HAND_PARAMS) {
-	if (msg->action <= 18) {
-		switch (msg->action) {
-		case 0:
-			if (inOffice(kCharacterCath)) {
-				getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 1;
-				TrainMCall(&LogicManager::CONS_TrainM_KickCathOut, 0, 0, 0, 0);
-				return;
+	switch (msg->action) {
+	case 0:
+		if (inOffice(kCharacterCath)) {
+			getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 1;
+			TrainMCall(&LogicManager::CONS_TrainM_KickCathOut, 0, 0, 0, 0);
+			break;
+		}
+
+		if (getCharacterParams(kCharacterTrainM, 8)[5]) {
+			if (_gameTime > 2538000 && !getCharacterCurrentParams(kCharacterTrainM)[6]) {
+				getCharacterCurrentParams(kCharacterTrainM)[6] = 1;
+				getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 9;
+				TrainMCall(&LogicManager::CONS_TrainM_Announce, "Tra4005", 0, 0, 0);
 			}
-		LABEL_8:
-			if (getCharacterParams(kCharacterTrainM, 8)[5])
-				goto LABEL_29;
-			if (getCharacterParams(kCharacterTrainM, 8)[2]) {
-				getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 2;
-				TrainMCall(&LogicManager::CONS_TrainM_DoCond1ListMessage, 0, 0, 0, 0);
-			} else {
-			LABEL_11:
-				if (_gameTime <= 2349000 || getCharacterCurrentParams(kCharacterTrainM)[0]) {
-				LABEL_14:
-					if (_gameTime <= 2378700 || getCharacterCurrentParams(kCharacterTrainM)[1]) {
-					LABEL_17:
-						if (_gameTime <= 2403000 || getCharacterCurrentParams(kCharacterTrainM)[2]) {
-						LABEL_20:
-							if (_gameTime <= 2414700 || getCharacterCurrentParams(kCharacterTrainM)[3]) {
-							LABEL_23:
-								if (_gameTime <= 2484000 || getCharacterCurrentParams(kCharacterTrainM)[4]) {
-								LABEL_26:
-									if (_gameTime <= 2511000 || getCharacterCurrentParams(kCharacterTrainM)[5]) {
-									LABEL_29:
-										if (_gameTime > 2538000 && !getCharacterCurrentParams(kCharacterTrainM)[6]) {
-											getCharacterCurrentParams(kCharacterTrainM)[6] = 1;
-											getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 9;
-											TrainMCall(&LogicManager::CONS_TrainM_Announce, "Tra4005", 0, 0, 0);
-										}
-									} else {
-										getCharacterCurrentParams(kCharacterTrainM)[5] = 1;
-										getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 8;
-										TrainMCall(&LogicManager::CONS_TrainM_Announce, "Tra4004", 0, 0, 0);
-									}
-								} else {
-									getCharacterCurrentParams(kCharacterTrainM)[4] = 1;
-									getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 7;
-									TrainMCall(&LogicManager::CONS_TrainM_Announce, "Tra4003", 0, 0, 0);
-								}
-							} else {
-								getCharacterCurrentParams(kCharacterTrainM)[3] = 1;
-								getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 6;
-								TrainMCall(&LogicManager::CONS_TrainM_Announce, "Tra4002", 0, 0, 0);
-							}
-						} else {
-							getCharacterCurrentParams(kCharacterTrainM)[2] = 1;
-							getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 5;
-							TrainMCall(&LogicManager::CONS_TrainM_Announce, "Tra1001A", 0, 0, 0);
-						}
-					} else {
-						getCharacterCurrentParams(kCharacterTrainM)[1] = 1;
-						getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 4;
-						TrainMCall(&LogicManager::CONS_TrainM_Announce, "Tra4001", 0, 0, 0);
-					}
-				} else {
-					getCharacterCurrentParams(kCharacterTrainM)[0] = 1;
-					getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 3;
-					TrainMCall(&LogicManager::CONS_TrainM_Announce, "Tra1001", 0, 0, 0);
+
+			break;
+		}
+
+		if (getCharacterParams(kCharacterTrainM, 8)[2]) {
+			getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 2;
+			TrainMCall(&LogicManager::CONS_TrainM_DoCond1ListMessage, 0, 0, 0, 0);
+			break;
+		}
+
+		if (_gameTime > 2349000 && !getCharacterCurrentParams(kCharacterTrainM)[0]) {
+			getCharacterCurrentParams(kCharacterTrainM)[0] = 1;
+			getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 3;
+			TrainMCall(&LogicManager::CONS_TrainM_Announce, "Tra1001", 0, 0, 0);
+			break;
+		}
+
+		if (_gameTime > 2378700 && !getCharacterCurrentParams(kCharacterTrainM)[1]) {
+			getCharacterCurrentParams(kCharacterTrainM)[1] = 1;
+			getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 4;
+			TrainMCall(&LogicManager::CONS_TrainM_Announce, "Tra4001", 0, 0, 0);
+			break;
+		}
+
+		if (_gameTime > 2403000 && !getCharacterCurrentParams(kCharacterTrainM)[2]) {
+			getCharacterCurrentParams(kCharacterTrainM)[2] = 1;
+			getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 5;
+			TrainMCall(&LogicManager::CONS_TrainM_Announce, "Tra1001A", 0, 0, 0);
+			break;
+		}
+
+		if (_gameTime > 2414700 && !getCharacterCurrentParams(kCharacterTrainM)[3]) {
+			getCharacterCurrentParams(kCharacterTrainM)[3] = 1;
+			getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 6;
+			TrainMCall(&LogicManager::CONS_TrainM_Announce, "Tra4002", 0, 0, 0);
+			break;
+		}
+
+		if (_gameTime > 2484000 && !getCharacterCurrentParams(kCharacterTrainM)[4]) {
+			getCharacterCurrentParams(kCharacterTrainM)[4] = 1;
+			getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 7;
+			TrainMCall(&LogicManager::CONS_TrainM_Announce, "Tra4003", 0, 0, 0);
+			break;
+		}
+
+		if (_gameTime > 2511000 && !getCharacterCurrentParams(kCharacterTrainM)[5]) {
+			getCharacterCurrentParams(kCharacterTrainM)[5] = 1;
+			getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 8;
+			TrainMCall(&LogicManager::CONS_TrainM_Announce, "Tra4004", 0, 0, 0);
+			break;
+		}
+
+		if (_gameTime > 2538000 && !getCharacterCurrentParams(kCharacterTrainM)[6]) {
+			getCharacterCurrentParams(kCharacterTrainM)[6] = 1;
+			getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 9;
+			TrainMCall(&LogicManager::CONS_TrainM_Announce, "Tra4005", 0, 0, 0);
+		}
+
+		break;
+	case 9:
+		getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 10;
+		TrainMCall(&LogicManager::CONS_TrainM_KickCathOut, (msg->param.intParam == 105) ? 1 : 0, 0, 0, 0);
+		break;
+	case 12:
+		getCharacter(kCharacterTrainM).characterPosition.car = kCarBaggage;
+		getCharacter(kCharacterTrainM).characterPosition.position = 5000;
+		getCharacter(kCharacterTrainM).characterPosition.location = 0;
+		dropItem(kItem9, 1);
+		break;
+	case 18:
+		switch (getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8]) {
+		case 1:
+			if (getCharacterParams(kCharacterTrainM, 8)[5]) {
+				if (_gameTime > 2538000 && !getCharacterCurrentParams(kCharacterTrainM)[6]) {
+					getCharacterCurrentParams(kCharacterTrainM)[6] = 1;
+					getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 9;
+					TrainMCall(&LogicManager::CONS_TrainM_Announce, "Tra4005", 0, 0, 0);
 				}
+
+				break;
 			}
-			break;
-		case 9:
-			getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 10;
-			TrainMCall(&LogicManager::CONS_TrainM_KickCathOut, msg->param.intParam == 105, 0, 0, 0);
-			return;
-		case 12:
-			getCharacter(kCharacterTrainM).characterPosition.car = kCarBaggage;
-			getCharacter(kCharacterTrainM).characterPosition.position = 5000;
-			getCharacter(kCharacterTrainM).characterPosition.location = 0;
-			dropItem(kItem9, 1);
-			return;
-		case 18:
-			switch (getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8]) {
-			case 1:
-				goto LABEL_8;
-			case 2:
-				goto LABEL_11;
-			case 3:
-				goto LABEL_14;
-			case 4:
-				goto LABEL_17;
-			case 5:
-				goto LABEL_20;
-			case 6:
-				goto LABEL_23;
-			case 7:
-				goto LABEL_26;
-			case 8:
-				goto LABEL_29;
-			default:
-				return;
+
+			// fall through
+		case 2:
+			if (_gameTime > 2349000 && !getCharacterCurrentParams(kCharacterTrainM)[0]) {
+				getCharacterCurrentParams(kCharacterTrainM)[0] = 1;
+				getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 3;
+				TrainMCall(&LogicManager::CONS_TrainM_Announce, "Tra1001", 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 3:
+			if (_gameTime > 2378700 && !getCharacterCurrentParams(kCharacterTrainM)[1]) {
+				getCharacterCurrentParams(kCharacterTrainM)[1] = 1;
+				getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 4;
+				TrainMCall(&LogicManager::CONS_TrainM_Announce, "Tra4001", 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 4:
+			if (_gameTime > 2403000 && !getCharacterCurrentParams(kCharacterTrainM)[2]) {
+				getCharacterCurrentParams(kCharacterTrainM)[2] = 1;
+				getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 5;
+				TrainMCall(&LogicManager::CONS_TrainM_Announce, "Tra1001A", 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 5:
+			if (_gameTime > 2414700 && !getCharacterCurrentParams(kCharacterTrainM)[3]) {
+				getCharacterCurrentParams(kCharacterTrainM)[3] = 1;
+				getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 6;
+				TrainMCall(&LogicManager::CONS_TrainM_Announce, "Tra4002", 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 6:
+			if (_gameTime > 2484000 && !getCharacterCurrentParams(kCharacterTrainM)[4]) {
+				getCharacterCurrentParams(kCharacterTrainM)[4] = 1;
+				getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 7;
+				TrainMCall(&LogicManager::CONS_TrainM_Announce, "Tra4003", 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 7:
+			if (_gameTime > 2511000 && !getCharacterCurrentParams(kCharacterTrainM)[5]) {
+				getCharacterCurrentParams(kCharacterTrainM)[5] = 1;
+				getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 8;
+				TrainMCall(&LogicManager::CONS_TrainM_Announce, "Tra4004", 0, 0, 0);
+				break;
+			}
+
+			// fall through
+		case 8:
+			if (_gameTime > 2538000 && !getCharacterCurrentParams(kCharacterTrainM)[6]) {
+				getCharacterCurrentParams(kCharacterTrainM)[6] = 1;
+				getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 9;
+				TrainMCall(&LogicManager::CONS_TrainM_Announce, "Tra4005", 0, 0, 0);
 			}
-			return;
+
+			break;
 		default:
-			return;
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -2093,6 +2622,8 @@ void LogicManager::HAND_TrainM_Conferring(HAND_PARAMS) {
 		case 3:
 			CONS_TrainM_InOffice4(0, 0, 0, 0);
 			break;
+		default:
+			break;
 		}
 
 		break;
@@ -2101,6 +2632,8 @@ void LogicManager::HAND_TrainM_Conferring(HAND_PARAMS) {
 		getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 1;
 		TrainMCall(&LogicManager::CONS_TrainM_DoWalk, 4, 540, 0, 0);
 		break;
+	default:
+		break;
 	}
 }
 
@@ -2115,9 +2648,11 @@ void LogicManager::CONS_TrainM_StartPart5(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_TrainM_StartPart5(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		CONS_TrainM_Prisoner(0, 0, 0, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		endGraphics(kCharacterTrainM);
 		getCharacter(kCharacterTrainM).characterPosition.location = 1;
 		getCharacter(kCharacterTrainM).characterPosition.position = 3650;
@@ -2126,6 +2661,9 @@ void LogicManager::HAND_TrainM_StartPart5(HAND_PARAMS) {
 		getCharacter(kCharacterTrainM).clothes = 0;
 		setDoor(104, kCharacterCath, 0, 0, 9);
 		setDoor(105, kCharacterCath, 0, 0, 9);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -2155,8 +2693,7 @@ void LogicManager::HAND_TrainM_Prisoner(HAND_PARAMS) {
 
 		setDoor(65, kCharacterCath, 0, 0, 1);
 		getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 1;
-		TrainMCall(&LogicManager::CONS_TrainM_SaveGame, 2, 95, 0, 0);
-
+		TrainMCall(&LogicManager::CONS_TrainM_SaveGame, 2, kEventCathFreePassengers, 0, 0);
 		break;
 	case 12:
 		takeItem(kItem9);
@@ -2172,7 +2709,7 @@ void LogicManager::HAND_TrainM_Prisoner(HAND_PARAMS) {
 
 		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -2187,7 +2724,8 @@ void LogicManager::CONS_TrainM_InCharge(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_TrainM_InCharge(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		setModel(55, 3);
 
 		getCharacter(kCharacterTrainM).characterPosition.car = kCarRedSleeping;
@@ -2196,7 +2734,8 @@ void LogicManager::HAND_TrainM_InCharge(HAND_PARAMS) {
 		getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 1;
 
 		TrainMCall(&LogicManager::CONS_TrainM_DoAnnounceWalk, 4, 2000, "Tra5001", 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8]) {
 		case 1:
 		case 2:
@@ -2222,8 +2761,12 @@ void LogicManager::HAND_TrainM_InCharge(HAND_PARAMS) {
 			CONS_TrainM_Disappear(0, 0, 0, 0);
 			break;
 		default:
-			return;
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -2238,8 +2781,13 @@ void LogicManager::CONS_TrainM_Disappear(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_TrainM_Disappear(HAND_PARAMS) {
-	if (msg->action == 12)
+	switch (msg->action) {
+	case 12:
 		endGraphics(kCharacterTrainM);
+		break;
+	default:
+		break;
+	}
 }
 
 void (LogicManager::*LogicManager::_functionsTrainM[])(HAND_PARAMS) = {


Commit: f0db0084ded743f58c5d4be6c3dbd6c5a4ad4618
    https://github.com/scummvm/scummvm/commit/f0db0084ded743f58c5d4be6c3dbd6c5a4ad4618
Author: AndywinXp (andywinxp at gmail.com)
Date: 2025-06-16T23:12:18+02:00

Commit Message:
LASTEXPRESS: Clean up Madame logic

Changed paths:
    engines/lastexpress/characters/madame.cpp


diff --git a/engines/lastexpress/characters/madame.cpp b/engines/lastexpress/characters/madame.cpp
index e9e99b864a1..706d5ef6a3c 100644
--- a/engines/lastexpress/characters/madame.cpp
+++ b/engines/lastexpress/characters/madame.cpp
@@ -48,7 +48,7 @@ void LogicManager::CONS_Madame(int chapter) {
 		CONS_Madame_StartPart5(0, 0, 0, 0);
 		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -69,18 +69,24 @@ void LogicManager::CONS_Madame_DebugWalks(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Madame_DebugWalks(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			getCharacter(kCharacterMadame).characterPosition.position = 0;
-			getCharacter(kCharacterMadame).characterPosition.location = 0;
-			getCharacter(kCharacterMadame).characterPosition.car = kCarGreenSleeping;
-			getCharacterCurrentParams(kCharacterMadame)[0] = 10000;
+	switch (msg->action) {
+	case 0:
+		if (walk(kCharacterMadame, kCarGreenSleeping, getCharacterCurrentParams(kCharacterMadame)[0])) {
+			if (getCharacterCurrentParams(kCharacterMadame)[0] == 10000)
+				getCharacterCurrentParams(kCharacterMadame)[0] = 0;
+			else
+				getCharacterCurrentParams(kCharacterMadame)[0] = 10000;
 		}
-	} else if (walk(kCharacterMadame, kCarGreenSleeping, getCharacterCurrentParams(kCharacterMadame)[0])) {
-		if (getCharacterCurrentParams(kCharacterMadame)[0] == 10000)
-			getCharacterCurrentParams(kCharacterMadame)[0] = 0;
-		else
-			getCharacterCurrentParams(kCharacterMadame)[0] = 10000;
+
+		break;
+	case 12:
+		getCharacter(kCharacterMadame).characterPosition.position = 0;
+		getCharacter(kCharacterMadame).characterPosition.location = 0;
+		getCharacter(kCharacterMadame).characterPosition.car = kCarGreenSleeping;
+		getCharacterCurrentParams(kCharacterMadame)[0] = 10000;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -97,12 +103,17 @@ void LogicManager::CONS_Madame_DoDialog(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Madame_DoDialog(HAND_PARAMS) {
-	if (msg->action == 2) {
+	switch (msg->action) {
+	case 2:
 		getCharacter(kCharacterMadame).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterMadame, _functionsMadame[getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall]]);
 		fedEx(kCharacterMadame, kCharacterMadame, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		playDialog(kCharacterMadame, (char *)&getCharacterCurrentParams(kCharacterMadame)[0], -1, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -119,12 +130,17 @@ void LogicManager::CONS_Madame_DoSeqOtis(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Madame_DoSeqOtis(HAND_PARAMS) {
-	if (msg->action == 3) {
+	switch (msg->action) {
+	case 3:
 		getCharacter(kCharacterMadame).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterMadame, _functionsMadame[getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall]]);
 		fedEx(kCharacterMadame, kCharacterMadame, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		startSeqOtis(kCharacterMadame, (char *)&getCharacterCurrentParams(kCharacterMadame)[0]);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -141,11 +157,12 @@ void LogicManager::CONS_Madame_DoWait(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Madame_DoWait(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		if (getCharacterCurrentParams(kCharacterMadame)[1] || (getCharacterCurrentParams(kCharacterMadame)[1] = _gameTime + getCharacterCurrentParams(kCharacterMadame)[0],
 															   _gameTime + getCharacterCurrentParams(kCharacterMadame)[0] != 0)) {
 			if (getCharacterCurrentParams(kCharacterMadame)[1] >= _gameTime)
-				return;
+				break;
 
 			getCharacterCurrentParams(kCharacterMadame)[1] = 0x7FFFFFFF;
 		}
@@ -153,6 +170,9 @@ void LogicManager::HAND_Madame_DoWait(HAND_PARAMS) {
 		getCharacter(kCharacterMadame).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterMadame, _functionsMadame[getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall]]);
 		fedEx(kCharacterMadame, kCharacterMadame, 18, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -171,15 +191,20 @@ void LogicManager::CONS_Madame_DoCorrOtis(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Madame_DoCorrOtis(HAND_PARAMS) {
-	if (msg->action == 3) {
+	switch (msg->action) {
+	case 3:
 		releaseAtDoor(kCharacterMadame, getCharacterCurrentParams(kCharacterMadame)[3]);
 
 		getCharacter(kCharacterMadame).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterMadame, _functionsMadame[getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall]]);
 		fedEx(kCharacterMadame, kCharacterMadame, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		startSeqOtis(kCharacterMadame, (char *)&getCharacterCurrentParams(kCharacterMadame)[0]);
 		blockAtDoor(kCharacterMadame, getCharacterCurrentParams(kCharacterMadame)[3]);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -198,22 +223,34 @@ void LogicManager::CONS_Madame_DoEnterCorrOtis(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Madame_DoEnterCorrOtis(HAND_PARAMS) {
-	if (msg->action == 3) {
+	switch (msg->action) {
+	case 3:
 		releaseAtDoor(kCharacterMadame, getCharacterCurrentParams(kCharacterMadame)[3]);
 		getCharacter(kCharacterMadame).characterPosition.position = 5790;
 
 		getCharacter(kCharacterMadame).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterMadame, _functionsMadame[getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall]]);
 		fedEx(kCharacterMadame, kCharacterMadame, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		startSeqOtis(kCharacterMadame, (char *)&getCharacterCurrentParams(kCharacterMadame)[0]);
 		blockAtDoor(kCharacterMadame, getCharacterCurrentParams(kCharacterMadame)[3]);
 		getCharacter(kCharacterMadame).characterPosition.location = 1;
+
 		if (inComp(kCharacterCath, kCarRedSleeping, 5790) || inComp(kCharacterCath, kCarRedSleeping, 6130)) {
-			playNIS((kEventCathTurningNight - !isNight()));
+			if (isNight()) {
+				playNIS(kEventCathTurningNight);
+			} else {
+				playNIS(kEventCathTurningDay);
+			}
+			
 			playDialog(0, "BUMP", -1, 0);
 			bumpCathFDoor(35);
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -233,28 +270,27 @@ void LogicManager::CONS_Madame_DoWalk(CONS_PARAMS) {
 void LogicManager::HAND_Madame_DoWalk(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
-		if (walk(kCharacterMadame, getCharacterCurrentParams(kCharacterMadame)[0], getCharacterCurrentParams(kCharacterMadame)[1]))
-			goto LABEL_10;
+	case 12:
+		if (walk(kCharacterMadame, getCharacterCurrentParams(kCharacterMadame)[0], getCharacterCurrentParams(kCharacterMadame)[1])) {
+			getCharacter(kCharacterMadame).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterMadame, _functionsMadame[getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall]]);
+			fedEx(kCharacterMadame, kCharacterMadame, 18, 0);
+		}
+
 		break;
 	case 5:
-		if (cathHasItem(kItemPassengerList))
+		if (cathHasItem(kItemPassengerList)) {
 			playDialog(kCharacterCath, "CAT1021", -1, 0);
-		else
+		} else {
 			playCathExcuseMe();
+		}
+
 		break;
 	case 6:
 		playChrExcuseMe(kCharacterMadame, kCharacterCath, 0);
 		break;
-	case 12:
-		if (walk(kCharacterMadame, getCharacterCurrentParams(kCharacterMadame)[0], getCharacterCurrentParams(kCharacterMadame)[1])) {
-		LABEL_10:
-			getCharacter(kCharacterMadame).currentCall--;
-			_engine->getMessageManager()->setMessageHandle(kCharacterMadame, _functionsMadame[getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall]]);
-			fedEx(kCharacterMadame, kCharacterMadame, 18, 0);
-		}
-		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -271,34 +307,43 @@ void LogicManager::CONS_Madame_ComplainCond2(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Madame_ComplainCond2(HAND_PARAMS) {
-	if (msg->action > 12) {
-		if (msg->action == 155853632) {
-			getCharacterCurrentParams(kCharacterMadame)[3] = 1;
-		} else if (msg->action == 202558662) {
-			startCycOtis(kCharacterMadame, "606L");
-			playDialog(kCharacterMadame, (char *)&getCharacterCurrentParams(kCharacterMadame)[0], -1, 0);
-			if (whoOnScreen(kCharacterMadame) || nearChar(kCharacterMadame, kCharacterCath, 2000)) {
-				if (_gameProgress[kProgressChapter] == 1) {
-					_gameProgress[kProgressFieldA8] = 1;
-				} else if (_gameProgress[kProgressChapter] == 3) {
-					_gameProgress[kProgressFieldA4] = 1;
-				}
-			}
+	switch (msg->action) {
+	case 0:
+		if (getCharacterCurrentParams(kCharacterMadame)[4] && getCharacterCurrentParams(kCharacterMadame)[3]) {
+			send(kCharacterMadame, kCharacterCond2, 125499160, 0);
+			if (!checkCathDir(kCarRedSleeping, 2))
+				getCharacter(kCharacterMadame).characterPosition.position = 2088;
+
+			getCharacter(kCharacterMadame).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterMadame, _functionsMadame[getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall]]);
+			fedEx(kCharacterMadame, kCharacterMadame, 18, 0);
 		}
-	} else if (msg->action == 12) {
+
+		break;
+	case 2:
+		getCharacterCurrentParams(kCharacterMadame)[4] = 1;
+		break;
+	case 12:
 		startCycOtis(kCharacterMadame, "606U");
 		send(kCharacterMadame, kCharacterCond2, 169557824, 0);
-	} else if (msg->action) {
-		if (msg->action == 2)
-			getCharacterCurrentParams(kCharacterMadame)[4] = 1;
-	} else if (getCharacterCurrentParams(kCharacterMadame)[4] && getCharacterCurrentParams(kCharacterMadame)[3]) {
-		send(kCharacterMadame, kCharacterCond2, 125499160, 0);
-		if (!checkCathDir(kCarRedSleeping, 2))
-			getCharacter(kCharacterMadame).characterPosition.position = 2088;
+		break;
+	case 155853632:
+		getCharacterCurrentParams(kCharacterMadame)[3] = 1;
+		break;
+	case 202558662:
+		startCycOtis(kCharacterMadame, "606L");
+		playDialog(kCharacterMadame, (char *)&getCharacterCurrentParams(kCharacterMadame)[0], -1, 0);
+		if (whoOnScreen(kCharacterMadame) || nearChar(kCharacterMadame, kCharacterCath, 2000)) {
+			if (_gameProgress[kProgressChapter] == 1) {
+				_gameProgress[kProgressFieldA8] = 1;
+			} else if (_gameProgress[kProgressChapter] == 3) {
+				_gameProgress[kProgressFieldA4] = 1;
+			}
+		}
 
-		getCharacter(kCharacterMadame).currentCall--;
-		_engine->getMessageManager()->setMessageHandle(kCharacterMadame, _functionsMadame[getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall]]);
-		fedEx(kCharacterMadame, kCharacterMadame, 18, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -313,70 +358,77 @@ void LogicManager::CONS_Madame_LetsGo(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Madame_LetsGo(HAND_PARAMS) {
-	if (msg->action > 12) {
-		switch (msg->action) {
-		case 18:
-			switch (getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8]) {
-			case 1:
-				getCharacter(kCharacterMadame).characterPosition.location = 0;
-				getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 2;
-				MadameCall(&LogicManager::CONS_Madame_DoWalk, 5, 850, 0, 0);
-				break;
-			case 2:
-				endGraphics(kCharacterMadame);
-				send(kCharacterMadame, kCharacterMonsieur, 203520448, 0);
-				break;
-			case 3:
-				if (inComp(kCharacterFrancois, kCarRedSleeping, 5790)) {
-					setDoor(35, kCharacterCath, 0, 0, 0);
-					getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 4;
-					MadameCall(&LogicManager::CONS_Madame_DoEnterCorrOtis, "606Ad", 35, 0, 0);
-				} else {
-					getCharacterCurrentParams(kCharacterMadame)[0] = 1;
-					startCycOtis(kCharacterMadame, "606Md");
-					softBlockAtDoor(kCharacterMadame, 35);
-				}
-				break;
-			case 4:
-				setDoor(35, kCharacterCath, 2, 0, 0);
-				getCharacter(kCharacterMadame).characterPosition.location = 1;
-				endGraphics(kCharacterMadame);
-
-				getCharacter(kCharacterMadame).currentCall--;
-				_engine->getMessageManager()->setMessageHandle(kCharacterMadame, _functionsMadame[getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall]]);
-				fedEx(kCharacterMadame, kCharacterMadame, 18, 0);
-				break;
-			case 5:
-				softReleaseAtDoor(kCharacterMadame, 35);
-				setDoor(35, kCharacterCath, 2, 0, 0);
-				getCharacter(kCharacterMadame).characterPosition.location = 1;
-				endGraphics(kCharacterMadame);
-
-				getCharacter(kCharacterMadame).currentCall--;
-				_engine->getMessageManager()->setMessageHandle(kCharacterMadame, _functionsMadame[getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall]]);
-				fedEx(kCharacterMadame, kCharacterMadame, 18, 0);
-				break;
-			default:
-				return;
-			}
-			break;
-		case 100901266:
-			getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 3;
-			MadameCall(&LogicManager::CONS_Madame_DoWalk, 4, 5790, 0, 0);
-			break;
-		case 100957716:
-			setDoor(35, kCharacterCath, 0, 0, 0);
-			getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 5;
-			MadameCall(&LogicManager::CONS_Madame_DoEnterCorrOtis, "606Ad", 35, 0, 0);
-			break;
+	switch (msg->action) {
+	case 0:
+		if (!getCharacterCurrentParams(kCharacterMadame)[0]) {
+			getCharacter(kCharacterMadame).characterPosition = getCharacter(kCharacterMonsieur).characterPosition;
 		}
-	} else if (msg->action == 12) {
+
+		break;
+	case 12:
 		setDoor(35, kCharacterCath, 0, 10, 9);
 		setDoor(51, kCharacterCath, 0, 10, 9);
 		getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 1;
 		MadameCall(&LogicManager::CONS_Madame_DoCorrOtis, "606Rd", 35, 0, 0);
-	} else if (msg->action == 0 && !getCharacterCurrentParams(kCharacterMadame)[0]) {
-		getCharacter(kCharacterMadame).characterPosition = getCharacter(kCharacterMonsieur).characterPosition;
+		break;
+	case 18:
+		switch (getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8]) {
+		case 1:
+			getCharacter(kCharacterMadame).characterPosition.location = 0;
+			getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 2;
+			MadameCall(&LogicManager::CONS_Madame_DoWalk, 5, 850, 0, 0);
+			break;
+		case 2:
+			endGraphics(kCharacterMadame);
+			send(kCharacterMadame, kCharacterMonsieur, 203520448, 0);
+			break;
+		case 3:
+			if (inComp(kCharacterFrancois, kCarRedSleeping, 5790)) {
+				setDoor(35, kCharacterCath, 0, 0, 0);
+				getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 4;
+				MadameCall(&LogicManager::CONS_Madame_DoEnterCorrOtis, "606Ad", 35, 0, 0);
+			} else {
+				getCharacterCurrentParams(kCharacterMadame)[0] = 1;
+				startCycOtis(kCharacterMadame, "606Md");
+				softBlockAtDoor(kCharacterMadame, 35);
+			}
+
+			break;
+		case 4:
+			setDoor(35, kCharacterCath, 2, 0, 0);
+			getCharacter(kCharacterMadame).characterPosition.location = 1;
+			endGraphics(kCharacterMadame);
+
+			getCharacter(kCharacterMadame).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterMadame, _functionsMadame[getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall]]);
+			fedEx(kCharacterMadame, kCharacterMadame, 18, 0);
+			break;
+		case 5:
+			softReleaseAtDoor(kCharacterMadame, 35);
+			setDoor(35, kCharacterCath, 2, 0, 0);
+			getCharacter(kCharacterMadame).characterPosition.location = 1;
+			endGraphics(kCharacterMadame);
+
+			getCharacter(kCharacterMadame).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterMadame, _functionsMadame[getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall]]);
+			fedEx(kCharacterMadame, kCharacterMadame, 18, 0);
+			break;
+		default:
+			break;
+		}
+
+		break;
+	case 100901266:
+		getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 3;
+		MadameCall(&LogicManager::CONS_Madame_DoWalk, 4, 5790, 0, 0);
+		break;
+	case 100957716:
+		setDoor(35, kCharacterCath, 0, 0, 0);
+		getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 5;
+		MadameCall(&LogicManager::CONS_Madame_DoEnterCorrOtis, "606Ad", 35, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -391,18 +443,24 @@ void LogicManager::CONS_Madame_Birth(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Madame_Birth(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			setDoor(35, kCharacterCath, 2, 0, 0);
-			setDoor(51, kCharacterCath, 0, 10, 9);
-			autoMessage(kCharacterMadame, 242526416, 0);
-			getCharacter(kCharacterMadame).characterPosition.position = 5790;
-			getCharacter(kCharacterMadame).characterPosition.location = 1;
-			getCharacter(kCharacterMadame).characterPosition.car = kCarRedSleeping;
+	switch (msg->action) {
+	case 0:
+		if (_gameTime > 1062000 && !getCharacterCurrentParams(kCharacterMadame)[0]) {
+			getCharacterCurrentParams(kCharacterMadame)[0] = 1;
+			CONS_Madame_OpenComp1(0, 0, 0, 0);
 		}
-	} else if (_gameTime > 1062000 && !getCharacterCurrentParams(kCharacterMadame)[0]) {
-		getCharacterCurrentParams(kCharacterMadame)[0] = 1;
-		CONS_Madame_OpenComp1(0, 0, 0, 0);
+
+		break;
+	case 12:
+		setDoor(35, kCharacterCath, 2, 0, 0);
+		setDoor(51, kCharacterCath, 0, 10, 9);
+		autoMessage(kCharacterMadame, 242526416, 0);
+		getCharacter(kCharacterMadame).characterPosition.position = 5790;
+		getCharacter(kCharacterMadame).characterPosition.location = 1;
+		getCharacter(kCharacterMadame).characterPosition.car = kCarRedSleeping;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -419,22 +477,27 @@ void LogicManager::CONS_Madame_FranStory(CONS_PARAMS) {
 void LogicManager::HAND_Madame_FranStory(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
-		if (getCharacterCurrentParams(kCharacterMadame)[1] == 0x7FFFFFFF || !_gameTime)
-			return;
-		if (getCharacterCurrentParams(kCharacterMadame)[0] >= _gameTime) {
-			if (!nearChar(kCharacterMadame, kCharacterCath, 1000) || !getCharacterCurrentParams(kCharacterMadame)[1]) {
-				getCharacterCurrentParams(kCharacterMadame)[1] = _gameTime + 150;
-				if (_gameTime == -150)
-					goto LABEL_13;
+		if (getCharacterCurrentParams(kCharacterMadame)[1] != 0x7FFFFFFF && _gameTime) {
+			if (getCharacterCurrentParams(kCharacterMadame)[0] >= _gameTime) {
+				if (!nearChar(kCharacterMadame, kCharacterCath, 1000) || !getCharacterCurrentParams(kCharacterMadame)[1]) {
+					getCharacterCurrentParams(kCharacterMadame)[1] = _gameTime + 150;
+					if (_gameTime == -150) {
+						getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 1;
+						MadameCall(&LogicManager::CONS_Madame_DoDialog, "MME1040", 0, 0, 0);
+						break;
+					}
+				}
+
+				if (getCharacterCurrentParams(kCharacterMadame)[1] >= _gameTime)
+					break;
 			}
-			if (getCharacterCurrentParams(kCharacterMadame)[1] >= _gameTime)
-				return;
+
+			getCharacterCurrentParams(kCharacterMadame)[1] = 0x7FFFFFFF;
+			getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 1;
+			MadameCall(&LogicManager::CONS_Madame_DoDialog, "MME1040", 0, 0, 0);
 		}
-		getCharacterCurrentParams(kCharacterMadame)[1] = 0x7FFFFFFF;
-	LABEL_13:
-		getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 1;
-		MadameCall(&LogicManager::CONS_Madame_DoDialog, "MME1040", 0, 0, 0);
-		return;
+
+		break;
 	case 12:
 		getCharacterCurrentParams(kCharacterMadame)[0] = _gameTime + 1800;
 		setDoor(35, kCharacterMadame, 1, 0, 0);
@@ -459,8 +522,11 @@ void LogicManager::HAND_Madame_FranStory(HAND_PARAMS) {
 			fedEx(kCharacterMadame, kCharacterMadame, 18, 0);
 			break;
 		default:
-			return;
+			break;
 		}
+
+		break;
+	default:
 		break;
 	}
 }
@@ -476,59 +542,66 @@ void LogicManager::CONS_Madame_OpenComp1(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Madame_OpenComp1(HAND_PARAMS) {
-	if (msg->action > 17) {
-		if (msg->action > 102484312) {
-			switch (msg->action) {
-			case 134289824:
-				startCycOtis(kCharacterMadame, "502A");
-				getCharacterCurrentParams(kCharacterMadame)[0] = 0;
-				break;
-			case 168986720:
-				send(kCharacterMadame, kCharacterFrancois, 102752636, 0);
-				playDialog(kCharacterMadame, "MME1036", -1, 0);
-				softReleaseAtDoor(kCharacterMadame, 35);
-				getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 3;
-				MadameCall(&LogicManager::CONS_Madame_DoCorrOtis, "606Fd", 35, 0, 0);
-				break;
-			case 202221040:
-				setDoor(35, kCharacterCath, 0, 255, 255);
-				getCharacter(kCharacterMadame).characterPosition.location = 0;
-				playDialog(kCharacterMadame, "MME1035A", -1, 0);
-				if (whoOnScreen(kCharacterMadame) || nearChar(kCharacterMadame, kCharacterCath, 2000))
-					_gameProgress[kProgressFieldAC] = 1;
-				getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 2;
-				MadameCall(&LogicManager::CONS_Madame_DoCorrOtis, "606Ed", 35, 0, 0);
-				break;
-			}
-		} else if (msg->action == 102484312) {
-			startCycOtis(kCharacterMadame, "501");
-			getCharacterCurrentParams(kCharacterMadame)[0] = 1;
-		} else if (msg->action == 18) {
-			switch (getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8]) {
-			case 1:
-				startCycOtis(kCharacterMadame, "502A");
-				break;
-			case 2:
-				startCycOtis(kCharacterMadame, "606Qd");
-				softBlockAtDoor(kCharacterMadame, 35);
-				break;
-			case 3:
-				getCharacter(kCharacterMadame).characterPosition.location = 1;
-				getCharacterCurrentParams(kCharacterMadame)[0] = 1;
-				endGraphics(kCharacterMadame);
-				CONS_Madame_ClosedComp1(0, 0, 0, 0);
-				break;
-			}
-		}
-	} else if (msg->action == 17) {
+	switch (msg->action) {
+	case 12:
+		getCharacterCurrentParams(kCharacterMadame)[0] = 1;
+		startCycOtis(kCharacterMadame, "501");
+		break;
+	case 17:
 		if (checkCathDir(kCarRedSleeping, 44)) {
 			getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 1;
 			MadameCall(&LogicManager::CONS_Madame_DoSeqOtis, "502B", 0, 0, 0);
 		}
-	} else if (msg->action == 12) {
-		getCharacterCurrentParams(kCharacterMadame)[0] = 1;
+
+		break;
+	case 18:
+		switch (getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8]) {
+		case 1:
+			startCycOtis(kCharacterMadame, "502A");
+			break;
+		case 2:
+			startCycOtis(kCharacterMadame, "606Qd");
+			softBlockAtDoor(kCharacterMadame, 35);
+			break;
+		case 3:
+			getCharacter(kCharacterMadame).characterPosition.location = 1;
+			getCharacterCurrentParams(kCharacterMadame)[0] = 1;
+			endGraphics(kCharacterMadame);
+			CONS_Madame_ClosedComp1(0, 0, 0, 0);
+			break;
+		default:
+			break;
+		}
+
+		break;
+	case 102484312:
 		startCycOtis(kCharacterMadame, "501");
+		getCharacterCurrentParams(kCharacterMadame)[0] = 1;
+		break;
+	case 134289824:
+		startCycOtis(kCharacterMadame, "502A");
+		getCharacterCurrentParams(kCharacterMadame)[0] = 0;
+		break;
+	case 168986720:
+		send(kCharacterMadame, kCharacterFrancois, 102752636, 0);
+		playDialog(kCharacterMadame, "MME1036", -1, 0);
+		softReleaseAtDoor(kCharacterMadame, 35);
+		getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 3;
+		MadameCall(&LogicManager::CONS_Madame_DoCorrOtis, "606Fd", 35, 0, 0);
+		break;
+	case 202221040:
+		setDoor(35, kCharacterCath, 0, 255, 255);
+		getCharacter(kCharacterMadame).characterPosition.location = 0;
+		playDialog(kCharacterMadame, "MME1035A", -1, 0);
+
+		if (whoOnScreen(kCharacterMadame) || nearChar(kCharacterMadame, kCharacterCath, 2000))
+			_gameProgress[kProgressFieldAC] = 1;
+
+		getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 2;
+		MadameCall(&LogicManager::CONS_Madame_DoCorrOtis, "606Ed", 35, 0, 0);
+		break;
 	}
+
 }
 
 void LogicManager::CONS_Madame_ClosedComp1(CONS_PARAMS) {
@@ -544,57 +617,88 @@ void LogicManager::CONS_Madame_ClosedComp1(CONS_PARAMS) {
 void LogicManager::HAND_Madame_ClosedComp1(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
-		if (whoRunningDialog(kCharacterMadame) || getCharacterCurrentParams(kCharacterMadame)[5] == 0x7FFFFFFF || !_gameTime)
-			goto LABEL_30;
-		if (getCharacterCurrentParams(kCharacterMadame)[0] < _gameTime)
-			goto LABEL_11;
-		if (!nearChar(kCharacterMadame, kCharacterCath, 2000) || !getCharacterCurrentParams(kCharacterMadame)[5]) {
-			getCharacterCurrentParams(kCharacterMadame)[5] = _gameTime;
-			if (!_gameTime)
-				goto LABEL_12;
-		}
-		if (getCharacterCurrentParams(kCharacterMadame)[5] < _gameTime) {
-		LABEL_11:
-			getCharacterCurrentParams(kCharacterMadame)[5] = 0x7FFFFFFF;
-		LABEL_12:
-			setDoor(35, kCharacterCath, 1, 0, 0);
-			setDoor(51, kCharacterCath, 1, 0, 0);
-			if (nearChar(kCharacterMadame, kCharacterCath, 2000))
-				_gameProgress[kProgressFieldA0] = 1;
-			getCharacterCurrentParams(kCharacterMadame)[4] = 1;
-			getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 1;
-			MadameCall(&LogicManager::CONS_Madame_DoDialog, "MME1037", 0, 0, 0);
-			return;
-		}
-	LABEL_30:
-		if (!_gameProgress[kProgressField24] || getCharacterCurrentParams(kCharacterMadame)[6] == 0x7FFFFFFF || !_gameTime)
-			goto LABEL_41;
-		if (_gameTime > 1093500)
-			goto LABEL_39;
-		if (!getCharacterCurrentParams(kCharacterMadame)[4] || !cathInCorridor(kCarRedSleeping) || !getCharacterCurrentParams(kCharacterMadame)[6]) {
-			getCharacterCurrentParams(kCharacterMadame)[6] = _gameTime;
-			if (!_gameTime)
-				goto LABEL_40;
+		if (!whoRunningDialog(kCharacterMadame) && getCharacterCurrentParams(kCharacterMadame)[5] != 0x7FFFFFFF && _gameTime) {
+			if (getCharacterCurrentParams(kCharacterMadame)[0] < _gameTime) {
+				getCharacterCurrentParams(kCharacterMadame)[5] = 0x7FFFFFFF;
+				setDoor(35, kCharacterCath, 1, 0, 0);
+				setDoor(51, kCharacterCath, 1, 0, 0);
+
+				if (nearChar(kCharacterMadame, kCharacterCath, 2000))
+					_gameProgress[kProgressFieldA0] = 1;
+
+				getCharacterCurrentParams(kCharacterMadame)[4] = 1;
+				getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 1;
+				MadameCall(&LogicManager::CONS_Madame_DoDialog, "MME1037", 0, 0, 0);
+				break;
+			}
+
+			if (!nearChar(kCharacterMadame, kCharacterCath, 2000) || !getCharacterCurrentParams(kCharacterMadame)[5]) {
+				getCharacterCurrentParams(kCharacterMadame)[5] = _gameTime;
+				if (!_gameTime) {
+					setDoor(35, kCharacterCath, 1, 0, 0);
+					setDoor(51, kCharacterCath, 1, 0, 0);
+
+					if (nearChar(kCharacterMadame, kCharacterCath, 2000))
+						_gameProgress[kProgressFieldA0] = 1;
+
+					getCharacterCurrentParams(kCharacterMadame)[4] = 1;
+					getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 1;
+					MadameCall(&LogicManager::CONS_Madame_DoDialog, "MME1037", 0, 0, 0);
+					break;
+				}
+			}
+
+			if (getCharacterCurrentParams(kCharacterMadame)[5] < _gameTime) {
+				getCharacterCurrentParams(kCharacterMadame)[5] = 0x7FFFFFFF;
+				setDoor(35, kCharacterCath, 1, 0, 0);
+				setDoor(51, kCharacterCath, 1, 0, 0);
+
+				if (nearChar(kCharacterMadame, kCharacterCath, 2000))
+					_gameProgress[kProgressFieldA0] = 1;
+
+				getCharacterCurrentParams(kCharacterMadame)[4] = 1;
+				getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 1;
+				MadameCall(&LogicManager::CONS_Madame_DoDialog, "MME1037", 0, 0, 0);
+				break;
+			}
 		}
-		if (getCharacterCurrentParams(kCharacterMadame)[6] < _gameTime) {
-		LABEL_39:
-			getCharacterCurrentParams(kCharacterMadame)[6] = 0x7FFFFFFF;
-		LABEL_40:
-			getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 2;
-			MadameCall(&LogicManager::CONS_Madame_FranStory, 0, 0, 0, 0);
-			return;
+
+		if (_gameProgress[kProgressField24] && getCharacterCurrentParams(kCharacterMadame)[6] != 0x7FFFFFFF && _gameTime) {
+			if (_gameTime > 1093500) {
+				getCharacterCurrentParams(kCharacterMadame)[6] = 0x7FFFFFFF;
+				getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 2;
+				MadameCall(&LogicManager::CONS_Madame_FranStory, 0, 0, 0, 0);
+				break;
+			}
+
+			if (!getCharacterCurrentParams(kCharacterMadame)[4] || !cathInCorridor(kCarRedSleeping) || !getCharacterCurrentParams(kCharacterMadame)[6]) {
+				getCharacterCurrentParams(kCharacterMadame)[6] = _gameTime;
+				if (!_gameTime) {
+					getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 2;
+					MadameCall(&LogicManager::CONS_Madame_FranStory, 0, 0, 0, 0);
+					break;
+				}
+			}
+
+			if (getCharacterCurrentParams(kCharacterMadame)[6] < _gameTime) {
+				getCharacterCurrentParams(kCharacterMadame)[6] = 0x7FFFFFFF;
+				getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 2;
+				MadameCall(&LogicManager::CONS_Madame_FranStory, 0, 0, 0, 0);
+				break;
+			}
 		}
-	LABEL_41:
+
 		if (_gameTime > 1094400 && !getCharacterCurrentParams(kCharacterMadame)[7]) {
 			getCharacterCurrentParams(kCharacterMadame)[7] = 1;
 			CONS_Madame_OpenComp(0, 0, 0, 0);
-			return;
+			break;
 		}
+
 		if (getCharacterCurrentParams(kCharacterMadame)[3]) {
 			if (getCharacterCurrentParams(kCharacterMadame)[8] || (getCharacterCurrentParams(kCharacterMadame)[8] = _currentGameSessionTicks + 75,
 																   _currentGameSessionTicks != -75)) {
 				if (getCharacterCurrentParams(kCharacterMadame)[8] >= _currentGameSessionTicks)
-					return;
+					break;
 
 				getCharacterCurrentParams(kCharacterMadame)[8] = 0x7FFFFFFF;
 			}
@@ -607,12 +711,14 @@ void LogicManager::HAND_Madame_ClosedComp1(HAND_PARAMS) {
 		} else {
 			getCharacterCurrentParams(kCharacterMadame)[8] = 0;
 		}
-		return;
+
+		break;
 	case 8:
 	case 9:
 		if (getCharacterCurrentParams(kCharacterMadame)[3]) {
 			setDoor(35, kCharacterMadame, 1, 0, 0);
 			setDoor(51, kCharacterMadame, 1, 0, 0);
+
 			if (cathHasItem(kItemPassengerList)) {
 				getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 7;
 
@@ -621,7 +727,6 @@ void LogicManager::HAND_Madame_ClosedComp1(HAND_PARAMS) {
 				} else {
 					MadameCall(&LogicManager::CONS_Madame_DoDialog, "CAT1510", 0, 0, 0);
 				}
-				
 			} else {
 				getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 8;
 				MadameCall(&LogicManager::CONS_Madame_DoDialog, getCathSorryDialog(), 0, 0, 0);
@@ -630,6 +735,7 @@ void LogicManager::HAND_Madame_ClosedComp1(HAND_PARAMS) {
 			getCharacterCurrentParams(kCharacterMadame)[1]++;
 			setDoor(35, kCharacterMadame, 1, 0, 0);
 			setDoor(51, kCharacterMadame, 1, 0, 0);
+
 			if (msg->action == 9) {
 				getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 3;
 				MadameCall(&LogicManager::CONS_Madame_DoDialog, "LIB013", 0, 0, 0);
@@ -638,13 +744,14 @@ void LogicManager::HAND_Madame_ClosedComp1(HAND_PARAMS) {
 				MadameCall(&LogicManager::CONS_Madame_DoDialog, "LIB012", 0, 0, 0);
 			}
 		}
-		return;
+
+		break;
 	case 12:
 		getCharacterCurrentParams(kCharacterMadame)[0] = _gameTime + 900;
 		getCharacter(kCharacterMadame).characterPosition.position = 5790;
 		setDoor(35, kCharacterMadame, 1, 10, 9);
 		setDoor(51, kCharacterMadame, 1, 10, 9);
-		return;
+		break;
 	case 17:
 		if (getCharacterCurrentParams(kCharacterMadame)[2] || getCharacterCurrentParams(kCharacterMadame)[3]) {
 			setDoor(35, kCharacterMadame, 1, 10, 9);
@@ -654,13 +761,63 @@ void LogicManager::HAND_Madame_ClosedComp1(HAND_PARAMS) {
 			getCharacterCurrentParams(kCharacterMadame)[1] = 0;
 		}
 
-		return;
+		break;
 	case 18:
 		switch (getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8]) {
 		case 1:
 			setDoor(35, kCharacterMadame, 1, 10, 9);
 			setDoor(51, kCharacterMadame, 1, 10, 9);
-			goto LABEL_30;
+
+			if (_gameProgress[kProgressField24] && getCharacterCurrentParams(kCharacterMadame)[6] != 0x7FFFFFFF && _gameTime) {
+				if (_gameTime > 1093500) {
+					getCharacterCurrentParams(kCharacterMadame)[6] = 0x7FFFFFFF;
+					getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 2;
+					MadameCall(&LogicManager::CONS_Madame_FranStory, 0, 0, 0, 0);
+					break;
+				}
+
+				if (!getCharacterCurrentParams(kCharacterMadame)[4] || !cathInCorridor(kCarRedSleeping) || !getCharacterCurrentParams(kCharacterMadame)[6]) {
+					getCharacterCurrentParams(kCharacterMadame)[6] = _gameTime;
+					if (!_gameTime) {
+						getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 2;
+						MadameCall(&LogicManager::CONS_Madame_FranStory, 0, 0, 0, 0);
+						break;
+					}
+				}
+
+				if (getCharacterCurrentParams(kCharacterMadame)[6] < _gameTime) {
+					getCharacterCurrentParams(kCharacterMadame)[6] = 0x7FFFFFFF;
+					getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 2;
+					MadameCall(&LogicManager::CONS_Madame_FranStory, 0, 0, 0, 0);
+					break;
+				}
+			}
+
+			if (_gameTime > 1094400 && !getCharacterCurrentParams(kCharacterMadame)[7]) {
+				getCharacterCurrentParams(kCharacterMadame)[7] = 1;
+				CONS_Madame_OpenComp(0, 0, 0, 0);
+				break;
+			}
+
+			if (getCharacterCurrentParams(kCharacterMadame)[3]) {
+				if (getCharacterCurrentParams(kCharacterMadame)[8] || (getCharacterCurrentParams(kCharacterMadame)[8] = _currentGameSessionTicks + 75,
+																	   _currentGameSessionTicks != -75)) {
+					if (getCharacterCurrentParams(kCharacterMadame)[8] >= _currentGameSessionTicks)
+						break;
+
+					getCharacterCurrentParams(kCharacterMadame)[8] = 0x7FFFFFFF;
+				}
+
+				getCharacterCurrentParams(kCharacterMadame)[3] = 0;
+				getCharacterCurrentParams(kCharacterMadame)[2] = 1;
+				setDoor(35, kCharacterMadame, 1, 0, 0);
+				setDoor(51, kCharacterMadame, 1, 0, 0);
+				getCharacterCurrentParams(kCharacterMadame)[8] = 0;
+			} else {
+				getCharacterCurrentParams(kCharacterMadame)[8] = 0;
+			}
+
+			break;
 		case 2:
 			CONS_Madame_OpenComp(0, 0, 0, 0);
 			break;
@@ -673,6 +830,7 @@ void LogicManager::HAND_Madame_ClosedComp1(HAND_PARAMS) {
 				getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 5;
 				MadameCall(&LogicManager::CONS_Madame_DoDialog, "MME1038C", 0, 0, 0);
 			}
+
 			break;
 		case 5:
 		case 6:
@@ -686,11 +844,12 @@ void LogicManager::HAND_Madame_ClosedComp1(HAND_PARAMS) {
 			getCharacterCurrentParams(kCharacterMadame)[2] = 1;
 			break;
 		default:
-			return;
+			break;
 		}
-		return;
+
+		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -725,20 +884,23 @@ void LogicManager::HAND_Madame_OpenComp(HAND_PARAMS) {
 		case 3:
 			setDoor(35, kCharacterCath, 1, 255, 255);
 			getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 4;
-			MadameCall(&LogicManager::CONS_Madame_DoCorrOtis, "606Cd", 0x23, 0, 0);
+			MadameCall(&LogicManager::CONS_Madame_DoCorrOtis, "606Cd", 35, 0, 0);
 			break;
 		case 4:
 			endGraphics(kCharacterMadame);
 			CONS_Madame_InComp(0, 0, 0, 0);
 			break;
 		default:
-			return;
+			break;
 		}
+
 		break;
 	case 101107728:
 		getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 2;
 		MadameCall(&LogicManager::CONS_Madame_LetsGo, 0, 0, 0, 0);
 		break;
+	default:
+		break;
 	}
 }
 
@@ -753,83 +915,38 @@ void LogicManager::CONS_Madame_InComp(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Madame_InComp(HAND_PARAMS) {
-	if (msg->action > 9) {
-		if (msg->action > 17) {
-			if (msg->action == 18) {
-				switch (getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8]) {
-				case 1:
-					setDoor(35, kCharacterCath, 1, 10, 9);
-					getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 2;
-					MadameCall(&LogicManager::CONS_Madame_DoWalk, 4, 2000, 0, 0);
-					break;
-				case 2:
-					getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 3;
-					MadameCall(&LogicManager::CONS_Madame_ComplainCond2, "MME1101", 0, 0, 0);
-					break;
-				case 3:
-					getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 4;
-					MadameCall(&LogicManager::CONS_Madame_DoWalk, 4, 5790, 0, 0);
-					break;
-				case 4:
-					getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 5;
-					MadameCall(&LogicManager::CONS_Madame_DoEnterCorrOtis, "606Td", 35, 0, 0);
-					break;
-				case 5:
-					getCharacter(kCharacterMadame).characterPosition.location = 1;
-					getCharacter(kCharacterMadame).characterPosition.position = 5790;
-					endGraphics(kCharacterMadame);
-					setDoor(35, kCharacterMadame, 1, 10, 9);
-					setDoor(51, kCharacterMadame, 1, 10, 9);
-					goto LABEL_34;
-				case 6:
-				case 7:
-					if (getCharacterCurrentParams(kCharacterMadame)[2] <= 1) {
-						getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 9;
-						MadameCall(&LogicManager::CONS_Madame_DoDialog, "MME1038", 0, 0, 0);
-					} else {
-						getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 8;
-						MadameCall(&LogicManager::CONS_Madame_DoDialog, "MME1038C", 0, 0, 0);
-					}
-					break;
-				case 8:
-				case 9:
-					setDoor(35, kCharacterMadame, 1, 14, 0);
-					setDoor(51, kCharacterMadame, 1, 14, 0);
-					getCharacterCurrentParams(kCharacterMadame)[1] = 1;
-					break;
-				case 10:
-				case 11:
-					getCharacterCurrentParams(kCharacterMadame)[1] = 0;
-					getCharacterCurrentParams(kCharacterMadame)[0] = 1;
-					break;
-				case 12:
-					setDoor(35, kCharacterMadame, 1, 10, 9);
-					setDoor(51, kCharacterMadame, 1, 10, 9);
+	switch (msg->action) {
+	case 0:
+		if (_gameTime > 1170000 && !getCharacterCurrentParams(kCharacterMadame)[3]) {
+			getCharacterCurrentParams(kCharacterMadame)[3] = 1;
+			getCharacter(kCharacterMadame).characterPosition.location = 0;
+			setDoor(51, kCharacterCath, 1, 10, 9);
+			getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 1;
+			MadameCall(&LogicManager::CONS_Madame_DoCorrOtis, "606Rd", 35, 0, 0);
+			break;
+		}
+
+		if (getCharacterCurrentParams(kCharacterMadame)[1]) {
+			if (getCharacterCurrentParams(kCharacterMadame)[4] || (getCharacterCurrentParams(kCharacterMadame)[4] = _currentGameSessionTicks + 75,
+																   _currentGameSessionTicks != -75)) {
+				if (getCharacterCurrentParams(kCharacterMadame)[4] >= _currentGameSessionTicks)
 					break;
-				default:
-					return;
-				}
-			} else if (msg->action == 223068211) {
-				setDoor(35, kCharacterMadame, 1, 0, 0);
-				setDoor(51, kCharacterMadame, 1, 0, 0);
-				getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 12;
-				MadameCall(&LogicManager::CONS_Madame_DoDialog, "MME1151B", 0, 0, 0);
-			}
-		} else if (msg->action == 17) {
-			if (getCharacterCurrentParams(kCharacterMadame)[0] || getCharacterCurrentParams(kCharacterMadame)[1]) {
-				setDoor(35, kCharacterMadame, 1, 10, 9);
-				setDoor(51, kCharacterMadame, 1, 10, 9);
-				getCharacterCurrentParams(kCharacterMadame)[2] = 0;
-				getCharacterCurrentParams(kCharacterMadame)[0] = 0;
+
+				getCharacterCurrentParams(kCharacterMadame)[4] = 0x7FFFFFFF;
 			}
-		} else if (msg->action == 12) {
-			setDoor(35, kCharacterMadame, 1, 10, 9);
-			setDoor(51, kCharacterMadame, 1, 10, 9);
-			getCharacter(kCharacterMadame).characterPosition.car = kCarRedSleeping;
-			getCharacter(kCharacterMadame).characterPosition.location = 1;
-			getCharacter(kCharacterMadame).characterPosition.position = 5790;
+
+			getCharacterCurrentParams(kCharacterMadame)[1] = 0;
+			getCharacterCurrentParams(kCharacterMadame)[0] = 1;
+			setDoor(35, kCharacterMadame, 1, 0, 0);
+			setDoor(51, kCharacterMadame, 1, 0, 0);
+			getCharacterCurrentParams(kCharacterMadame)[4] = 0;
+		} else {
+			getCharacterCurrentParams(kCharacterMadame)[4] = 0;
 		}
-	} else if (msg->action >= 8) {
+
+		break;
+	case 8:
+	case 9:
 		if (getCharacterCurrentParams(kCharacterMadame)[1]) {
 			setDoor(35, kCharacterMadame, 1, 0, 0);
 			setDoor(51, kCharacterMadame, 1, 0, 0);
@@ -857,33 +974,108 @@ void LogicManager::HAND_Madame_InComp(HAND_PARAMS) {
 				MadameCall(&LogicManager::CONS_Madame_DoDialog, "LIB012", 0, 0, 0);
 			}
 		}
-	} else if (msg->action == 0) {
-		if (_gameTime > 1170000 && !getCharacterCurrentParams(kCharacterMadame)[3]) {
-			getCharacterCurrentParams(kCharacterMadame)[3] = 1;
-			getCharacter(kCharacterMadame).characterPosition.location = 0;
-			setDoor(51, kCharacterCath, 1, 10, 9);
-			getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 1;
-			MadameCall(&LogicManager::CONS_Madame_DoCorrOtis, "606Rd", 35, 0, 0);
-			return;
+
+		break;
+	case 12:
+		setDoor(35, kCharacterMadame, 1, 10, 9);
+		setDoor(51, kCharacterMadame, 1, 10, 9);
+		getCharacter(kCharacterMadame).characterPosition.car = kCarRedSleeping;
+		getCharacter(kCharacterMadame).characterPosition.location = 1;
+		getCharacter(kCharacterMadame).characterPosition.position = 5790;
+		break;
+	case 17:
+		if (getCharacterCurrentParams(kCharacterMadame)[0] || getCharacterCurrentParams(kCharacterMadame)[1]) {
+			setDoor(35, kCharacterMadame, 1, 10, 9);
+			setDoor(51, kCharacterMadame, 1, 10, 9);
+			getCharacterCurrentParams(kCharacterMadame)[2] = 0;
+			getCharacterCurrentParams(kCharacterMadame)[0] = 0;
 		}
-	LABEL_34:
-		if (getCharacterCurrentParams(kCharacterMadame)[1]) {
-			if (getCharacterCurrentParams(kCharacterMadame)[4] || (getCharacterCurrentParams(kCharacterMadame)[4] = _currentGameSessionTicks + 75,
-																   _currentGameSessionTicks != -75)) {
-				if (getCharacterCurrentParams(kCharacterMadame)[4] >= _currentGameSessionTicks)
-					return;
 
-				getCharacterCurrentParams(kCharacterMadame)[4] = 0x7FFFFFFF;
+		break;
+	case 18:
+		switch (getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8]) {
+		case 1:
+			setDoor(35, kCharacterCath, 1, 10, 9);
+			getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 2;
+			MadameCall(&LogicManager::CONS_Madame_DoWalk, 4, 2000, 0, 0);
+			break;
+		case 2:
+			getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 3;
+			MadameCall(&LogicManager::CONS_Madame_ComplainCond2, "MME1101", 0, 0, 0);
+			break;
+		case 3:
+			getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 4;
+			MadameCall(&LogicManager::CONS_Madame_DoWalk, 4, 5790, 0, 0);
+			break;
+		case 4:
+			getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 5;
+			MadameCall(&LogicManager::CONS_Madame_DoEnterCorrOtis, "606Td", 35, 0, 0);
+			break;
+		case 5:
+			getCharacter(kCharacterMadame).characterPosition.location = 1;
+			getCharacter(kCharacterMadame).characterPosition.position = 5790;
+			endGraphics(kCharacterMadame);
+			setDoor(35, kCharacterMadame, 1, 10, 9);
+			setDoor(51, kCharacterMadame, 1, 10, 9);
+
+			if (getCharacterCurrentParams(kCharacterMadame)[1]) {
+				if (getCharacterCurrentParams(kCharacterMadame)[4] || (getCharacterCurrentParams(kCharacterMadame)[4] = _currentGameSessionTicks + 75,
+																	   _currentGameSessionTicks != -75)) {
+					if (getCharacterCurrentParams(kCharacterMadame)[4] >= _currentGameSessionTicks)
+						break;
+
+					getCharacterCurrentParams(kCharacterMadame)[4] = 0x7FFFFFFF;
+				}
+
+				getCharacterCurrentParams(kCharacterMadame)[1] = 0;
+				getCharacterCurrentParams(kCharacterMadame)[0] = 1;
+				setDoor(35, kCharacterMadame, 1, 0, 0);
+				setDoor(51, kCharacterMadame, 1, 0, 0);
+				getCharacterCurrentParams(kCharacterMadame)[4] = 0;
+			} else {
+				getCharacterCurrentParams(kCharacterMadame)[4] = 0;
+			}
+
+			break;
+		case 6:
+		case 7:
+			if (getCharacterCurrentParams(kCharacterMadame)[2] <= 1) {
+				getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 9;
+				MadameCall(&LogicManager::CONS_Madame_DoDialog, "MME1038", 0, 0, 0);
+			} else {
+				getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 8;
+				MadameCall(&LogicManager::CONS_Madame_DoDialog, "MME1038C", 0, 0, 0);
 			}
 
+			break;
+		case 8:
+		case 9:
+			setDoor(35, kCharacterMadame, 1, 14, 0);
+			setDoor(51, kCharacterMadame, 1, 14, 0);
+			getCharacterCurrentParams(kCharacterMadame)[1] = 1;
+			break;
+		case 10:
+		case 11:
 			getCharacterCurrentParams(kCharacterMadame)[1] = 0;
 			getCharacterCurrentParams(kCharacterMadame)[0] = 1;
-			setDoor(35, kCharacterMadame, 1, 0, 0);
-			setDoor(51, kCharacterMadame, 1, 0, 0);
-			getCharacterCurrentParams(kCharacterMadame)[4] = 0;
-		} else {
-			getCharacterCurrentParams(kCharacterMadame)[4] = 0;
+			break;
+		case 12:
+			setDoor(35, kCharacterMadame, 1, 10, 9);
+			setDoor(51, kCharacterMadame, 1, 10, 9);
+			break;
+		default:
+			break;
 		}
+
+		break;
+	case 223068211:
+		setDoor(35, kCharacterMadame, 1, 0, 0);
+		setDoor(51, kCharacterMadame, 1, 0, 0);
+		getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 12;
+		MadameCall(&LogicManager::CONS_Madame_DoDialog, "MME1151B", 0, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -898,13 +1090,17 @@ void LogicManager::CONS_Madame_Asleep(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Madame_Asleep(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterMadame).characterPosition.car = kCarRedSleeping;
 		getCharacter(kCharacterMadame).characterPosition.position = 5790;
 		getCharacter(kCharacterMadame).characterPosition.location = 1;
 		setDoor(35, kCharacterCath, 1, 10, 9);
 		setDoor(51, kCharacterCath, 1, 10, 9);
 		endGraphics(kCharacterMadame);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -919,20 +1115,23 @@ void LogicManager::CONS_Madame_StartPart2(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Madame_StartPart2(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			endGraphics(kCharacterMadame);
-			getCharacter(kCharacterMadame).characterPosition.position = 4689;
-			getCharacter(kCharacterMadame).characterPosition.location = 1;
-			getCharacter(kCharacterMadame).characterPosition.car = kCarRestaurant;
-			getCharacter(kCharacterMadame).inventoryItem = 0;
-			getCharacter(kCharacterMadame).clothes = 0;
-			setDoor(35, kCharacterCath, 0, 10, 9);
-			setDoor(51, kCharacterCath, 0, 10, 9);
-			setDoor(43, kCharacterCath, 0, 255, 255);
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		CONS_Madame_AtBreakfast(0, 0, 0, 0);
+		break;
+	case 12:
+		endGraphics(kCharacterMadame);
+		getCharacter(kCharacterMadame).characterPosition.position = 4689;
+		getCharacter(kCharacterMadame).characterPosition.location = 1;
+		getCharacter(kCharacterMadame).characterPosition.car = kCarRestaurant;
+		getCharacter(kCharacterMadame).inventoryItem = 0;
+		getCharacter(kCharacterMadame).clothes = 0;
+		setDoor(35, kCharacterCath, 0, 10, 9);
+		setDoor(51, kCharacterCath, 0, 10, 9);
+		setDoor(43, kCharacterCath, 0, 255, 255);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -964,6 +1163,7 @@ void LogicManager::HAND_Madame_AtBreakfast(HAND_PARAMS) {
 			getCharacter(kCharacterMadame).characterPosition.location = 1;
 			CONS_Madame_OpenComp2(0, 0, 0, 0);
 		}
+
 		break;
 	case 100901266:
 		getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 1;
@@ -975,6 +1175,8 @@ void LogicManager::HAND_Madame_AtBreakfast(HAND_PARAMS) {
 		getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 3;
 		MadameCall(&LogicManager::CONS_Madame_DoEnterCorrOtis, "606Ad", 35, 0, 0);
 		break;
+	default:
+		break;
 	}
 }
 
@@ -989,34 +1191,40 @@ void LogicManager::CONS_Madame_OpenComp2(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Madame_OpenComp2(HAND_PARAMS) {
-	if (msg->action > 12) {
-		switch (msg->action) {
-		case 18:
-			if (getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] == 1 && checkCathDir(kCarRedSleeping, 44)) {
-				bumpCath(kCarRedSleeping, 11, 255);
+	switch (msg->action) {
+	case 0:
+		if (checkCathDir(kCarRedSleeping, 44) && !getCharacterCurrentParams(kCharacterMadame)[1]) {
+			if (getCharacterCurrentParams(kCharacterMadame)[0]) {
+				getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 1;
+				MadameCall(&LogicManager::CONS_Madame_DoSeqOtis, "502B", 0, 0, 0);
+			} else {
+				getCharacterCurrentParams(kCharacterMadame)[0] = 1;
 			}
-			break;
-		case 102484312:
-			startCycOtis(kCharacterMadame, "501");
-			getCharacterCurrentParams(kCharacterMadame)[1] = 1;
-			break;
-		case 134289824:
-			startCycOtis(kCharacterMadame, "502A");
-			getCharacterCurrentParams(kCharacterMadame)[1] = 0;
-			break;
 		}
-	} else if (msg->action == 12) {
+
+		break;
+	case 12:
 		setDoor(35, kCharacterCath, 2, 0, 0);
 		setDoor(51, kCharacterCath, 0, 10, 9);
 		getCharacterCurrentParams(kCharacterMadame)[1] = 1;
 		startCycOtis(kCharacterMadame, "501");
-	} else if (msg->action == 0 && checkCathDir(kCarRedSleeping, 44) && !getCharacterCurrentParams(kCharacterMadame)[1]) {
-		if (getCharacterCurrentParams(kCharacterMadame)[0]) {
-			getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 1;
-			MadameCall(&LogicManager::CONS_Madame_DoSeqOtis, "502B", 0, 0, 0);
-		} else {
-			getCharacterCurrentParams(kCharacterMadame)[0] = 1;
+		break;
+	case 18:
+		if (getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] == 1 && checkCathDir(kCarRedSleeping, 44)) {
+			bumpCath(kCarRedSleeping, 11, 255);
 		}
+
+		break;
+	case 102484312:
+		startCycOtis(kCharacterMadame, "501");
+		getCharacterCurrentParams(kCharacterMadame)[1] = 1;
+		break;
+	case 134289824:
+		startCycOtis(kCharacterMadame, "502A");
+		getCharacterCurrentParams(kCharacterMadame)[1] = 0;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1031,17 +1239,20 @@ void LogicManager::CONS_Madame_StartPart3(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Madame_StartPart3(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			endGraphics(kCharacterMadame);
-			getCharacter(kCharacterMadame).characterPosition.position = 5790;
-			getCharacter(kCharacterMadame).characterPosition.location = 1;
-			getCharacter(kCharacterMadame).characterPosition.car = kCarRedSleeping;
-			getCharacter(kCharacterMadame).inventoryItem = 0;
-			getCharacter(kCharacterMadame).clothes = 0;
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		CONS_Madame_OpenComp3(0, 0, 0, 0);
+		break;
+	case 12:
+		endGraphics(kCharacterMadame);
+		getCharacter(kCharacterMadame).characterPosition.position = 5790;
+		getCharacter(kCharacterMadame).characterPosition.location = 1;
+		getCharacter(kCharacterMadame).characterPosition.car = kCarRedSleeping;
+		getCharacter(kCharacterMadame).inventoryItem = 0;
+		getCharacter(kCharacterMadame).clothes = 0;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1056,88 +1267,104 @@ void LogicManager::CONS_Madame_OpenComp3(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Madame_OpenComp3(HAND_PARAMS) {
-	if (msg->action > 12) {
-		if (msg->action > 101107728) {
-			if (msg->action == 102484312) {
-			LABEL_36:
-				startCycOtis(kCharacterMadame, "501");
-				getCharacterCurrentParams(kCharacterMadame)[0] = 1;
-			} else if (msg->action == 134289824) {
-				startCycOtis(kCharacterMadame, "502A");
-				getCharacterCurrentParams(kCharacterMadame)[0] = 0;
-			}
-		} else if (msg->action == 101107728) {
-			getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 9;
-			MadameCall(&LogicManager::CONS_Madame_LetsGo, 0, 0, 0, 0);
-		} else if (msg->action == 18) {
-			switch (getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8]) {
-			case 1:
-				getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 2;
-				MadameCall(&LogicManager::CONS_Madame_DoCorrOtis, "606Rd", 35, 0, 0);
-				break;
-			case 2:
-				getCharacter(kCharacterMadame).characterPosition.location = 0;
-				getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 3;
-				MadameCall(&LogicManager::CONS_Madame_DoWalk, 4, 2000, 0, 0);
-				break;
-			case 3:
-				getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 4;
-				MadameCall(&LogicManager::CONS_Madame_ComplainCond2, "MME3001", 0, 0, 0);
-				break;
-			case 4:
-				getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 5;
-				MadameCall(&LogicManager::CONS_Madame_DoWalk, 4, 5790, 0, 0);
-				break;
-			case 5:
-				getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 6;
-				MadameCall(&LogicManager::CONS_Madame_DoEnterCorrOtis, "606Td", 35, 0, 0);
-				break;
-			case 6:
-				endGraphics(kCharacterMadame);
-				setDoor(35, kCharacterCath, 1, 10, 9);
-				getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 7;
-				MadameCall(&LogicManager::CONS_Madame_DoWait, 150, 0, 0, 0);
-				break;
-			case 7:
-				getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 8;
-				MadameCall(&LogicManager::CONS_Madame_DoCorrOtis, "606Dd", 35, 0, 0);
-				break;
-			case 8:
-				setDoor(35, kCharacterCath, 2, 0, 0);
-				startCycOtis(kCharacterMadame, "501");
-				send(kCharacterMadame, kCharacterFrancois, 190390860, 0);
-				break;
-			case 9:
-				goto LABEL_36;
-			default:
-				return;
+	switch (msg->action) {
+	case 0:
+		if (getCharacterParams(kCharacterMadame, 8)[0] && getCharacterCurrentParams(kCharacterMadame)[1] != 0x7FFFFFFF && _gameTime) {
+			if (_gameTime <= 2038500) {
+				if (!cathInCorridor(kCarRedSleeping) || !getCharacterCurrentParams(kCharacterMadame)[0] ||
+					dialogRunning("FRA2012") || dialogRunning("FRA2010") || dialogRunning("FRA2012") ||
+					!getCharacterCurrentParams(kCharacterMadame)[1]) {
+
+					getCharacterCurrentParams(kCharacterMadame)[1] = _gameTime;
+					if (!_gameTime) {
+						send(kCharacterMadame, kCharacterFrancois, 189872836, 0);
+						setDoor(35, kCharacterCath, 1, 10, 9);
+						getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 1;
+						MadameCall(&LogicManager::CONS_Madame_DoCorrOtis, "606Cd", 35, 0, 0);
+						break;
+					}
+				}
+
+				if (getCharacterCurrentParams(kCharacterMadame)[1] >= _gameTime)
+					break;
 			}
+
+			getCharacterCurrentParams(kCharacterMadame)[1] = 0x7FFFFFFF;
+			send(kCharacterMadame, kCharacterFrancois, 189872836, 0);
+			setDoor(35, kCharacterCath, 1, 10, 9);
+			getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 1;
+			MadameCall(&LogicManager::CONS_Madame_DoCorrOtis, "606Cd", 35, 0, 0);
 		}
-	} else if (msg->action == 12) {
+
+		break;
+	case 12:
 		getCharacterCurrentParams(kCharacterMadame)[0] = 1;
 		setDoor(35, kCharacterCath, 2, 0, 0);
 		setDoor(51, kCharacterCath, 1, 10, 9);
 		setDoor(43, kCharacterCath, 0, 255, 255);
 		startCycOtis(kCharacterMadame, "501");
-	} else if (msg->action == 0 && getCharacterParams(kCharacterMadame, 8)[0] && getCharacterCurrentParams(kCharacterMadame)[1] != 0x7FFFFFFF && _gameTime) {
-		if (_gameTime <= 2038500) {
-			if (!cathInCorridor(kCarRedSleeping) || !getCharacterCurrentParams(kCharacterMadame)[0] ||
-				dialogRunning("FRA2012") || dialogRunning("FRA2010") || dialogRunning("FRA2012") ||
-				!getCharacterCurrentParams(kCharacterMadame)[1]) {
-
-				getCharacterCurrentParams(kCharacterMadame)[1] = _gameTime;
-				if (!_gameTime)
-					goto LABEL_25;
-			}
-			if (getCharacterCurrentParams(kCharacterMadame)[1] >= _gameTime)
-				return;
+		break;
+	case 18:
+		switch (getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8]) {
+		case 1:
+			getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 2;
+			MadameCall(&LogicManager::CONS_Madame_DoCorrOtis, "606Rd", 35, 0, 0);
+			break;
+		case 2:
+			getCharacter(kCharacterMadame).characterPosition.location = 0;
+			getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 3;
+			MadameCall(&LogicManager::CONS_Madame_DoWalk, 4, 2000, 0, 0);
+			break;
+		case 3:
+			getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 4;
+			MadameCall(&LogicManager::CONS_Madame_ComplainCond2, "MME3001", 0, 0, 0);
+			break;
+		case 4:
+			getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 5;
+			MadameCall(&LogicManager::CONS_Madame_DoWalk, 4, 5790, 0, 0);
+			break;
+		case 5:
+			getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 6;
+			MadameCall(&LogicManager::CONS_Madame_DoEnterCorrOtis, "606Td", 35, 0, 0);
+			break;
+		case 6:
+			endGraphics(kCharacterMadame);
+			setDoor(35, kCharacterCath, 1, 10, 9);
+			getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 7;
+			MadameCall(&LogicManager::CONS_Madame_DoWait, 150, 0, 0, 0);
+			break;
+		case 7:
+			getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 8;
+			MadameCall(&LogicManager::CONS_Madame_DoCorrOtis, "606Dd", 35, 0, 0);
+			break;
+		case 8:
+			setDoor(35, kCharacterCath, 2, 0, 0);
+			startCycOtis(kCharacterMadame, "501");
+			send(kCharacterMadame, kCharacterFrancois, 190390860, 0);
+			break;
+		case 9:
+			startCycOtis(kCharacterMadame, "501");
+			getCharacterCurrentParams(kCharacterMadame)[0] = 1;
+			break;
+		default:
+			break;
 		}
-		getCharacterCurrentParams(kCharacterMadame)[1] = 0x7FFFFFFF;
-	LABEL_25:
-		send(kCharacterMadame, kCharacterFrancois, 189872836, 0);
-		setDoor(35, kCharacterCath, 1, 10, 9);
-		getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 1;
-		MadameCall(&LogicManager::CONS_Madame_DoCorrOtis, "606Cd", 35, 0, 0);
+
+		break;
+	case 101107728:
+		getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 9;
+		MadameCall(&LogicManager::CONS_Madame_LetsGo, 0, 0, 0, 0);
+		break;
+	case 102484312:
+		startCycOtis(kCharacterMadame, "501");
+		getCharacterCurrentParams(kCharacterMadame)[0] = 1;
+		break;
+	case 134289824:
+		startCycOtis(kCharacterMadame, "502A");
+		getCharacterCurrentParams(kCharacterMadame)[0] = 0;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1152,17 +1379,20 @@ void LogicManager::CONS_Madame_StartPart4(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Madame_StartPart4(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			endGraphics(kCharacterMadame);
-			getCharacter(kCharacterMadame).characterPosition.position = 5790;
-			getCharacter(kCharacterMadame).characterPosition.location = 1;
-			getCharacter(kCharacterMadame).characterPosition.car = kCarRedSleeping;
-			getCharacter(kCharacterMadame).inventoryItem = 0;
-			getCharacter(kCharacterMadame).clothes = 0;
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		CONS_Madame_OpenComp4(0, 0, 0, 0);
+		break;
+	case 12:
+		endGraphics(kCharacterMadame);
+		getCharacter(kCharacterMadame).characterPosition.position = 5790;
+		getCharacter(kCharacterMadame).characterPosition.location = 1;
+		getCharacter(kCharacterMadame).characterPosition.car = kCarRedSleeping;
+		getCharacter(kCharacterMadame).inventoryItem = 0;
+		getCharacter(kCharacterMadame).clothes = 0;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1177,35 +1407,44 @@ void LogicManager::CONS_Madame_OpenComp4(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Madame_OpenComp4(HAND_PARAMS) {
-	if (msg->action > 12) {
-		if (msg->action == 18) {
-			if (getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] == 1) {
-				endGraphics(kCharacterMadame);
-				CONS_Madame_ClosedComp4(0, 0, 0, 0);
-			} else if (getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] == 2) {
-				startCycOtis(kCharacterMadame, "501");
-				getCharacterCurrentParams(kCharacterMadame)[0] = 1;
+	switch (msg->action) {
+	case 0:
+		if (getCharacterCurrentParams(kCharacterMadame)[0]) {
+			if (getCharacterCurrentParams(kCharacterMadame)[1] || (getCharacterCurrentParams(kCharacterMadame)[1] = _gameTime + 900,
+																   _gameTime != -900)) {
+				if (getCharacterCurrentParams(kCharacterMadame)[1] >= _gameTime)
+					break;
+
+				getCharacterCurrentParams(kCharacterMadame)[1] = 0x7FFFFFFF;
 			}
-		} else if (msg->action == 101107728) {
-			getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 2;
-			MadameCall(&LogicManager::CONS_Madame_LetsGo, 0, 0, 0, 0);
+
+			setDoor(35, kCharacterCath, 1, 255, 255);
+			getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 1;
+			MadameCall(&LogicManager::CONS_Madame_DoCorrOtis, "606Cd", 35, 0, 0);
 		}
-	} else if (msg->action == 12) {
+
+		break;
+	case 12:
 		setDoor(35, kCharacterCath, 2, 0, 0);
 		setDoor(51, kCharacterCath, 1, 10, 9);
 		startCycOtis(kCharacterMadame, "501");
-	} else if (msg->action == 0 && getCharacterCurrentParams(kCharacterMadame)[0]) {
-		if (getCharacterCurrentParams(kCharacterMadame)[1] || (getCharacterCurrentParams(kCharacterMadame)[1] = _gameTime + 900,
-															   _gameTime != -900)) {
-			if (getCharacterCurrentParams(kCharacterMadame)[1] >= _gameTime)
-				return;
-
-			getCharacterCurrentParams(kCharacterMadame)[1] = 0x7FFFFFFF;
+		break;
+	case 18:
+		if (getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] == 1) {
+			endGraphics(kCharacterMadame);
+			CONS_Madame_ClosedComp4(0, 0, 0, 0);
+		} else if (getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] == 2) {
+			startCycOtis(kCharacterMadame, "501");
+			getCharacterCurrentParams(kCharacterMadame)[0] = 1;
 		}
 
-		setDoor(35, kCharacterCath, 1, 255, 255);
-		getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 1;
-		MadameCall(&LogicManager::CONS_Madame_DoCorrOtis, "606Cd", 35, 0, 0);
+		break;
+	case 101107728:
+		getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 2;
+		MadameCall(&LogicManager::CONS_Madame_LetsGo, 0, 0, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1220,63 +1459,35 @@ void LogicManager::CONS_Madame_ClosedComp4(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Madame_ClosedComp4(HAND_PARAMS) {
-	if (msg->action > 9) {
-		if (msg->action > 17) {
-			switch (msg->action) {
-			case 18:
-				switch (getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8]) {
-				case 1:
-				case 2:
-					if (getCharacterCurrentParams(kCharacterMadame)[2] <= 1) {
-						getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 4;
-						MadameCall(&LogicManager::CONS_Madame_DoDialog, "MME1038", 0, 0, 0);
-					} else {
-						getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 3;
-						MadameCall(&LogicManager::CONS_Madame_DoDialog, "MME1038C", 0, 0, 0);
-					}
-					break;
-				case 3:
-				case 4:
-					setDoor(35, kCharacterMadame, 1, 14, 0);
-					setDoor(51, kCharacterMadame, 1, 14, 0);
-					getCharacterCurrentParams(kCharacterMadame)[1] = 1;
-					break;
-				case 5:
-				case 6:
-					getCharacterCurrentParams(kCharacterMadame)[1] = 0;
-					getCharacterCurrentParams(kCharacterMadame)[0] = 1;
-					break;
-				case 7:
-					send(kCharacterMadame, kCharacterCond2, 123199584, 0);
-					break;
-				case 8:
-					send(kCharacterMadame, kCharacterCond2, 88652208, 0);
+	switch (msg->action) {
+	case 0:
+		if (_gameTime > 2470500 && !getCharacterCurrentParams(kCharacterMadame)[3]) {
+			getCharacterCurrentParams(kCharacterMadame)[3] = 1;
+			CONS_Madame_Asleep4(0, 0, 0, 0);
+			break;
+		}
+
+		if (getCharacterCurrentParams(kCharacterMadame)[1]) {
+			if (getCharacterCurrentParams(kCharacterMadame)[4] || (getCharacterCurrentParams(kCharacterMadame)[4] = _currentGameSessionTicks + 75,
+																   _currentGameSessionTicks != -75)) {
+				if (getCharacterCurrentParams(kCharacterMadame)[4] >= _currentGameSessionTicks)
 					break;
-				default:
-					return;
-				}
-				break;
-			case 122865568:
-				getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 8;
-				MadameCall(&LogicManager::CONS_Madame_DoDialog, "Mme1151A", 0, 0, 0);
-				break;
-			case 221683008:
-				getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 7;
-				MadameCall(&LogicManager::CONS_Madame_DoDialog, "Mme1038", 0, 0, 0);
-				break;
-			}
-		} else if (msg->action == 17) {
-			if (getCharacterCurrentParams(kCharacterMadame)[0] || getCharacterCurrentParams(kCharacterMadame)[1]) {
-				setDoor(35, kCharacterMadame, 1, 10, 9);
-				setDoor(51, kCharacterMadame, 1, 10, 9);
-				getCharacterCurrentParams(kCharacterMadame)[0] = 0;
-				getCharacterCurrentParams(kCharacterMadame)[1] = 0;
+
+				getCharacterCurrentParams(kCharacterMadame)[4] = 0x7FFFFFFF;
 			}
-		} else if (msg->action == 12) {
-			setDoor(35, kCharacterMadame, 1, 10, 9);
+
+			getCharacterCurrentParams(kCharacterMadame)[1] = 0;
+			getCharacterCurrentParams(kCharacterMadame)[0] = 1;
+			setDoor(35, kCharacterMadame, 1, 0, 0);
 			setDoor(51, kCharacterMadame, 1, 10, 9);
+			getCharacterCurrentParams(kCharacterMadame)[4] = 0;
+		} else {
+			getCharacterCurrentParams(kCharacterMadame)[4] = 0;
 		}
-	} else if (msg->action >= 8) {
+
+		break;
+	case 8:
+	case 9:
 		if (getCharacterCurrentParams(kCharacterMadame)[1]) {
 			setDoor(35, kCharacterMadame, 1, 0, 0);
 			setDoor(51, kCharacterMadame, 1, 0, 0);
@@ -1304,29 +1515,66 @@ void LogicManager::HAND_Madame_ClosedComp4(HAND_PARAMS) {
 				MadameCall(&LogicManager::CONS_Madame_DoDialog, "LIB012", 0, 0, 0);
 			}
 		}
-	} else if (msg->action == 0) {
-		if (_gameTime > 2470500 && !getCharacterCurrentParams(kCharacterMadame)[3]) {
-			getCharacterCurrentParams(kCharacterMadame)[3] = 1;
-			CONS_Madame_Asleep4(0, 0, 0, 0);
-			return;
+
+		break;
+	case 12:
+		setDoor(35, kCharacterMadame, 1, 10, 9);
+		setDoor(51, kCharacterMadame, 1, 10, 9);
+		break;
+	case 17:
+		if (getCharacterCurrentParams(kCharacterMadame)[0] || getCharacterCurrentParams(kCharacterMadame)[1]) {
+			setDoor(35, kCharacterMadame, 1, 10, 9);
+			setDoor(51, kCharacterMadame, 1, 10, 9);
+			getCharacterCurrentParams(kCharacterMadame)[0] = 0;
+			getCharacterCurrentParams(kCharacterMadame)[1] = 0;
 		}
-		if (getCharacterCurrentParams(kCharacterMadame)[1]) {
-			if (getCharacterCurrentParams(kCharacterMadame)[4] || (getCharacterCurrentParams(kCharacterMadame)[4] = _currentGameSessionTicks + 75,
-																   _currentGameSessionTicks != -75)) {
-				if (getCharacterCurrentParams(kCharacterMadame)[4] >= _currentGameSessionTicks)
-					return;
 
-				getCharacterCurrentParams(kCharacterMadame)[4] = 0x7FFFFFFF;
+		break;
+	case 18:
+		switch (getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8]) {
+		case 1:
+		case 2:
+			if (getCharacterCurrentParams(kCharacterMadame)[2] <= 1) {
+				getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 4;
+				MadameCall(&LogicManager::CONS_Madame_DoDialog, "MME1038", 0, 0, 0);
+			} else {
+				getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 3;
+				MadameCall(&LogicManager::CONS_Madame_DoDialog, "MME1038C", 0, 0, 0);
 			}
 
+			break;
+		case 3:
+		case 4:
+			setDoor(35, kCharacterMadame, 1, 14, 0);
+			setDoor(51, kCharacterMadame, 1, 14, 0);
+			getCharacterCurrentParams(kCharacterMadame)[1] = 1;
+			break;
+		case 5:
+		case 6:
 			getCharacterCurrentParams(kCharacterMadame)[1] = 0;
 			getCharacterCurrentParams(kCharacterMadame)[0] = 1;
-			setDoor(35, kCharacterMadame, 1, 0, 0);
-			setDoor(51, kCharacterMadame, 1, 10, 9);
-			getCharacterCurrentParams(kCharacterMadame)[4] = 0;
-		} else {
-			getCharacterCurrentParams(kCharacterMadame)[4] = 0;
+			break;
+		case 7:
+			send(kCharacterMadame, kCharacterCond2, 123199584, 0);
+			break;
+		case 8:
+			send(kCharacterMadame, kCharacterCond2, 88652208, 0);
+			break;
+		default:
+			break;
 		}
+
+		break;
+	case 122865568:
+		getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 8;
+		MadameCall(&LogicManager::CONS_Madame_DoDialog, "Mme1151A", 0, 0, 0);
+		break;
+	case 221683008:
+		getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 7;
+		MadameCall(&LogicManager::CONS_Madame_DoDialog, "Mme1038", 0, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1341,13 +1589,17 @@ void LogicManager::CONS_Madame_Asleep4(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Madame_Asleep4(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		endGraphics(kCharacterMadame);
 		getCharacter(kCharacterMadame).characterPosition.car = kCarRedSleeping;
 		getCharacter(kCharacterMadame).characterPosition.position = 5790;
 		getCharacter(kCharacterMadame).characterPosition.location = 1;
 		setDoor(35, kCharacterCath, 1, 10, 9);
 		setDoor(51, kCharacterCath, 1, 10, 9);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1362,17 +1614,20 @@ void LogicManager::CONS_Madame_StartPart5(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Madame_StartPart5(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			endGraphics(kCharacterMadame);
-			getCharacter(kCharacterMadame).characterPosition.position = 3969;
-			getCharacter(kCharacterMadame).characterPosition.location = 1;
-			getCharacter(kCharacterMadame).characterPosition.car = kCarRestaurant;
-			getCharacter(kCharacterMadame).inventoryItem = 0;
-			getCharacter(kCharacterMadame).clothes = 0;
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		CONS_Madame_Prisoner(0, 0, 0, 0);
+		break;
+	case 12:
+		endGraphics(kCharacterMadame);
+		getCharacter(kCharacterMadame).characterPosition.position = 3969;
+		getCharacter(kCharacterMadame).characterPosition.location = 1;
+		getCharacter(kCharacterMadame).characterPosition.car = kCarRestaurant;
+		getCharacter(kCharacterMadame).inventoryItem = 0;
+		getCharacter(kCharacterMadame).clothes = 0;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1387,8 +1642,13 @@ void LogicManager::CONS_Madame_Prisoner(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Madame_Prisoner(HAND_PARAMS) {
-	if (msg->action == 70549068)
+	switch (msg->action) {
+	case 70549068:
 		CONS_Madame_Hiding(0, 0, 0, 0);
+		break;
+	default:
+		break;
+	}
 }
 
 void LogicManager::CONS_Madame_Hiding(CONS_PARAMS) {
@@ -1402,52 +1662,28 @@ void LogicManager::CONS_Madame_Hiding(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Madame_Hiding(HAND_PARAMS) {
-	if (msg->action > 9) {
-		if (msg->action > 17) {
-			switch (msg->action) {
-			case 18:
-				switch (getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8]) {
-				case 1:
-					goto LABEL_33;
-				case 2:
-				case 3:
-					setDoor(35, kCharacterMadame, 1, 0, 0);
-					setDoor(51, kCharacterMadame, 1, 0, 0);
-					getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 4;
-					MadameCall(&LogicManager::CONS_Madame_DoDialog, "Mme5001", 0, 0, 0);
-					break;
-				case 4:
-					getCharacterCurrentParams(kCharacterMadame)[0] = 1;
-					setDoor(35, kCharacterMadame, 1, 14, 0);
-					setDoor(51, kCharacterMadame, 1, 14, 0);
+	switch (msg->action) {
+	case 0:
+		if (getCharacterCurrentParams(kCharacterMadame)[0]) {
+			if (getCharacterCurrentParams(kCharacterMadame)[2] || (getCharacterCurrentParams(kCharacterMadame)[2] = _currentGameSessionTicks + 75,
+																   _currentGameSessionTicks != -75)) {
+				if (getCharacterCurrentParams(kCharacterMadame)[2] >= _currentGameSessionTicks)
 					break;
-				default:
-					return;
-				}
-				break;
-			case 135800432:
-				CONS_Madame_Disappear(0, 0, 0, 0);
-				break;
-			case 155604840:
-			LABEL_33:
-				setDoor(35, kCharacterMadame, 1, 10, 9);
-				setDoor(51, kCharacterMadame, 1, 10, 9);
-				break;
-			}
-		} else if (msg->action == 17) {
-			if (getCharacterCurrentParams(kCharacterMadame)[1] || getCharacterCurrentParams(kCharacterMadame)[0]) {
-				getCharacterCurrentParams(kCharacterMadame)[1] = 0;
-				getCharacterCurrentParams(kCharacterMadame)[0] = 0;
-				setDoor(35, kCharacterMadame, 1, 10, 9);
-				setDoor(51, kCharacterMadame, 1, 10, 9);
+
+				getCharacterCurrentParams(kCharacterMadame)[2] = 0x7FFFFFFF;
 			}
-		} else if (msg->action == 12) {
-			getCharacter(kCharacterMadame).characterPosition.car = kCarRedSleeping;
-			getCharacter(kCharacterMadame).characterPosition.position = 5790;
-			getCharacter(kCharacterMadame).characterPosition.location = 1;
-			endGraphics(kCharacterMadame);
+			getCharacterCurrentParams(kCharacterMadame)[0] = 0;
+			getCharacterCurrentParams(kCharacterMadame)[1] = 1;
+			setDoor(35, kCharacterMadame, 1, 0, 0);
+			setDoor(51, kCharacterMadame, 1, 0, 0);
+			getCharacterCurrentParams(kCharacterMadame)[2] = 0;
+		} else {
+			getCharacterCurrentParams(kCharacterMadame)[2] = 0;
 		}
-	} else if (msg->action >= 8) {
+
+		break;
+	case 8:
+	case 9:
 		if (getCharacterCurrentParams(kCharacterMadame)[0]) {
 			setDoor(35, kCharacterMadame, 1, 0, 0);
 			setDoor(51, kCharacterMadame, 1, 0, 0);
@@ -1462,23 +1698,55 @@ void LogicManager::HAND_Madame_Hiding(HAND_PARAMS) {
 			getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 3;
 			MadameCall(&LogicManager::CONS_Madame_DoDialog, "LIB013", 0, 0, 0);
 		}
-	} else if (msg->action == 0) {
-		if (getCharacterCurrentParams(kCharacterMadame)[0]) {
-			if (getCharacterCurrentParams(kCharacterMadame)[2] || (getCharacterCurrentParams(kCharacterMadame)[2] = _currentGameSessionTicks + 75,
-																   _currentGameSessionTicks != -75)) {
-				if (getCharacterCurrentParams(kCharacterMadame)[2] >= _currentGameSessionTicks)
-					return;
 
-				getCharacterCurrentParams(kCharacterMadame)[2] = 0x7FFFFFFF;
-			}
+		break;
+	case 12:
+		getCharacter(kCharacterMadame).characterPosition.car = kCarRedSleeping;
+		getCharacter(kCharacterMadame).characterPosition.position = 5790;
+		getCharacter(kCharacterMadame).characterPosition.location = 1;
+		endGraphics(kCharacterMadame);
+		break;
+	case 17:
+		if (getCharacterCurrentParams(kCharacterMadame)[1] || getCharacterCurrentParams(kCharacterMadame)[0]) {
+			getCharacterCurrentParams(kCharacterMadame)[1] = 0;
 			getCharacterCurrentParams(kCharacterMadame)[0] = 0;
-			getCharacterCurrentParams(kCharacterMadame)[1] = 1;
+			setDoor(35, kCharacterMadame, 1, 10, 9);
+			setDoor(51, kCharacterMadame, 1, 10, 9);
+		}
+
+		break;
+	case 18:
+		switch (getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8]) {
+		case 1:
+			setDoor(35, kCharacterMadame, 1, 10, 9);
+			setDoor(51, kCharacterMadame, 1, 10, 9);
+			break;
+		case 2:
+		case 3:
 			setDoor(35, kCharacterMadame, 1, 0, 0);
 			setDoor(51, kCharacterMadame, 1, 0, 0);
-			getCharacterCurrentParams(kCharacterMadame)[2] = 0;
-		} else {
-			getCharacterCurrentParams(kCharacterMadame)[2] = 0;
+			getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 4;
+			MadameCall(&LogicManager::CONS_Madame_DoDialog, "Mme5001", 0, 0, 0);
+			break;
+		case 4:
+			getCharacterCurrentParams(kCharacterMadame)[0] = 1;
+			setDoor(35, kCharacterMadame, 1, 14, 0);
+			setDoor(51, kCharacterMadame, 1, 14, 0);
+			break;
+		default:
+			break;
 		}
+
+		break;
+	case 135800432:
+		CONS_Madame_Disappear(0, 0, 0, 0);
+		break;
+	case 155604840:
+		setDoor(35, kCharacterMadame, 1, 10, 9);
+		setDoor(51, kCharacterMadame, 1, 10, 9);
+		break;
+	default:
+		break;
 	}
 }
 


Commit: 11b223fe172b566586bbcbf7c6b9ced89768ba15
    https://github.com/scummvm/scummvm/commit/11b223fe172b566586bbcbf7c6b9ced89768ba15
Author: AndywinXp (andywinxp at gmail.com)
Date: 2025-06-16T23:12:18+02:00

Commit Message:
LASTEXPRESS: Clean up Milos logic

Changed paths:
    engines/lastexpress/characters/milos.cpp


diff --git a/engines/lastexpress/characters/milos.cpp b/engines/lastexpress/characters/milos.cpp
index 15cbfca6d1d..7ab065a304d 100644
--- a/engines/lastexpress/characters/milos.cpp
+++ b/engines/lastexpress/characters/milos.cpp
@@ -48,7 +48,7 @@ void LogicManager::CONS_Milos(int chapter) {
 		CONS_Milos_StartPart5(0, 0, 0, 0);
 		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -69,19 +69,25 @@ void LogicManager::CONS_Milos_DebugWalks(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Milos_DebugWalks(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			getCharacter(kCharacterMilos).characterPosition.position = 0;
-			getCharacter(kCharacterMilos).characterPosition.location = 0;
-			getCharacter(kCharacterMilos).characterPosition.car = kCarGreenSleeping;
-			getCharacterCurrentParams(kCharacterMilos)[0] = 10000;
-		}
-	} else if (walk(kCharacterMilos, kCarGreenSleeping, getCharacterCurrentParams(kCharacterMilos)[0])) {
-		if (getCharacterCurrentParams(kCharacterMilos)[0] == 10000) {
-			getCharacterCurrentParams(kCharacterMilos)[0] = 0;
-		} else {
-			getCharacterCurrentParams(kCharacterMilos)[0] = 10000;
+	switch (msg->action) {
+	case 0:
+		if (walk(kCharacterMilos, kCarGreenSleeping, getCharacterCurrentParams(kCharacterMilos)[0])) {
+			if (getCharacterCurrentParams(kCharacterMilos)[0] == 10000) {
+				getCharacterCurrentParams(kCharacterMilos)[0] = 0;
+			} else {
+				getCharacterCurrentParams(kCharacterMilos)[0] = 10000;
+			}
 		}
+
+		break;
+	case 12:
+		getCharacter(kCharacterMilos).characterPosition.position = 0;
+		getCharacter(kCharacterMilos).characterPosition.location = 0;
+		getCharacter(kCharacterMilos).characterPosition.car = kCarGreenSleeping;
+		getCharacterCurrentParams(kCharacterMilos)[0] = 10000;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -98,12 +104,17 @@ void LogicManager::CONS_Milos_DoSeqOtis(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Milos_DoSeqOtis(HAND_PARAMS) {
-	if (msg->action == 3) {
+	switch (msg->action) {
+	case 3:
 		getCharacter(kCharacterMilos).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterMilos, _functionsMilos[getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall]]);
 		fedEx(kCharacterMilos, kCharacterMilos, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		startSeqOtis(kCharacterMilos, (char *)&getCharacterCurrentParams(kCharacterMilos)[0]);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -122,15 +133,20 @@ void LogicManager::CONS_Milos_DoCorrOtis(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Milos_DoCorrOtis(HAND_PARAMS) {
-	if (msg->action == 3) {
+	switch (msg->action) {
+	case 3:
 		releaseAtDoor(kCharacterMilos, getCharacterCurrentParams(kCharacterMilos)[3]);
 
 		getCharacter(kCharacterMilos).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterMilos, _functionsMilos[getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall]]);
 		fedEx(kCharacterMilos, kCharacterMilos, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		startSeqOtis(kCharacterMilos, (char *)&getCharacterCurrentParams(kCharacterMilos)[0]);
 		blockAtDoor(kCharacterMilos, getCharacterCurrentParams(kCharacterMilos)[3]);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -149,15 +165,20 @@ void LogicManager::CONS_Milos_DoBriefCorrOtis(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Milos_DoBriefCorrOtis(HAND_PARAMS) {
-	if (msg->action == 3) {
+	switch (msg->action) {
+	case 3:
 		releaseAtDoor(kCharacterMilos, getCharacterCurrentParams(kCharacterMilos)[3]);
 
 		getCharacter(kCharacterMilos).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterMilos, _functionsMilos[getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall]]);
 		fedEx(kCharacterMilos, kCharacterMilos, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		startSeqOtis(kCharacterMilos, (char *)&getCharacterCurrentParams(kCharacterMilos)[0]);
 		blockAtDoor(kCharacterMilos, getCharacterCurrentParams(kCharacterMilos)[3]);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -172,16 +193,22 @@ void LogicManager::CONS_Milos_FinishSeqOtis(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Milos_FinishSeqOtis(HAND_PARAMS) {
-	if (msg->action == 0) {
-		if (getCharacter(kCharacterMilos).direction == 4)
-			return;
-		goto LABEL_5;
-	}
-	if (msg->action == 3) {
-	LABEL_5:
+	switch (msg->action) {
+	case 0:
+		if (getCharacter(kCharacterMilos).direction != 4) {
+			getCharacter(kCharacterMilos).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterMilos, _functionsMilos[getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall]]);
+			fedEx(kCharacterMilos, kCharacterMilos, 18, 0);
+		}
+
+		break;
+	case 3:
 		getCharacter(kCharacterMilos).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterMilos, _functionsMilos[getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall]]);
 		fedEx(kCharacterMilos, kCharacterMilos, 18, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -198,12 +225,17 @@ void LogicManager::CONS_Milos_DoDialog(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Milos_DoDialog(HAND_PARAMS) {
-	if (msg->action == 2) {
+	switch (msg->action) {
+	case 2:
 		getCharacter(kCharacterMilos).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterMilos, _functionsMilos[getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall]]);
 		fedEx(kCharacterMilos, kCharacterMilos, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		playDialog(kCharacterMilos, (char *)&getCharacterCurrentParams(kCharacterMilos)[0], -1, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -220,12 +252,17 @@ void LogicManager::CONS_Milos_DoDialogFullVol(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Milos_DoDialogFullVol(HAND_PARAMS) {
-	if (msg->action == 2) {
+	switch (msg->action) {
+	case 2:
 		getCharacter(kCharacterMilos).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterMilos, _functionsMilos[getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall]]);
 		fedEx(kCharacterMilos, kCharacterMilos, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		playDialog(kCharacterMilos, (char *)&getCharacterCurrentParams(kCharacterMilos)[0], 16, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -243,22 +280,25 @@ void LogicManager::CONS_Milos_SaveGame(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Milos_SaveGame(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			save(
-				kCharacterMilos,
-				getCharacterCurrentParams(kCharacterMilos)[0],
-				getCharacterCurrentParams(kCharacterMilos)[1]
-			);
+	switch (msg->action) {
+	case 0:
+		getCharacter(kCharacterMilos).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterMilos, _functionsMilos[getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall]]);
+		fedEx(kCharacterMilos, kCharacterMilos, 18, 0);
+		break;
+	case 12:
+		save(
+			kCharacterMilos,
+			getCharacterCurrentParams(kCharacterMilos)[0],
+			getCharacterCurrentParams(kCharacterMilos)[1]
+		);
 
-			getCharacter(kCharacterMilos).currentCall--;
-			_engine->getMessageManager()->setMessageHandle(kCharacterMilos, _functionsMilos[getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall]]);
-			fedEx(kCharacterMilos, kCharacterMilos, 18, 0);
-		}
-	} else {
 		getCharacter(kCharacterMilos).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterMilos, _functionsMilos[getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall]]);
 		fedEx(kCharacterMilos, kCharacterMilos, 18, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -275,11 +315,12 @@ void LogicManager::CONS_Milos_DoWait(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Milos_DoWait(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		if (getCharacterCurrentParams(kCharacterMilos)[1] || (getCharacterCurrentParams(kCharacterMilos)[1] = _gameTime + getCharacterCurrentParams(kCharacterMilos)[0],
 															  _gameTime + getCharacterCurrentParams(kCharacterMilos)[0] != 0)) {
 			if (getCharacterCurrentParams(kCharacterMilos)[1] >= _gameTime)
-				return;
+				break;
 
 			getCharacterCurrentParams(kCharacterMilos)[1] = 0x7FFFFFFF;
 		}
@@ -287,6 +328,9 @@ void LogicManager::HAND_Milos_DoWait(HAND_PARAMS) {
 		getCharacter(kCharacterMilos).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterMilos, _functionsMilos[getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall]]);
 		fedEx(kCharacterMilos, kCharacterMilos, 18, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -306,8 +350,13 @@ void LogicManager::CONS_Milos_DoWalk(CONS_PARAMS) {
 void LogicManager::HAND_Milos_DoWalk(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
-		if (walk(kCharacterMilos, getCharacterCurrentParams(kCharacterMilos)[0], getCharacterCurrentParams(kCharacterMilos)[1]))
-			goto LABEL_15;
+	case 12:
+		if (walk(kCharacterMilos, getCharacterCurrentParams(kCharacterMilos)[0], getCharacterCurrentParams(kCharacterMilos)[1])) {
+			getCharacter(kCharacterMilos).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterMilos, _functionsMilos[getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall]]);
+			fedEx(kCharacterMilos, kCharacterMilos, 18, 0);
+		}
+
 		break;
 	case 5:
 	case 6:
@@ -327,17 +376,10 @@ void LogicManager::HAND_Milos_DoWalk(HAND_PARAMS) {
 		} else {
 			playCathExcuseMe();
 		}
-		break;
-	case 12:
-		if (walk(kCharacterMilos, getCharacterCurrentParams(kCharacterMilos)[0], getCharacterCurrentParams(kCharacterMilos)[1])) {
-		LABEL_15:
-			getCharacter(kCharacterMilos).currentCall--;
-			_engine->getMessageManager()->setMessageHandle(kCharacterMilos, _functionsMilos[getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall]]);
-			fedEx(kCharacterMilos, kCharacterMilos, 18, 0);
-		}
+
 		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -354,110 +396,127 @@ void LogicManager::CONS_Milos_CompLogic(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Milos_CompLogic(HAND_PARAMS) {
-	if (msg->action > 9) {
-		if (msg->action > 17) {
-			if (msg->action > 122865568) {
-				if (msg->action == 123852928) {
-					getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 13;
-					MilosCall(&LogicManager::CONS_Milos_DoCorrOtis, "611Dg", 38, 0, 0);
-				} else if (msg->action == 221683008) {
-					getCharacterCurrentParams(kCharacterMilos)[4] = 1;
-					send(kCharacterMilos, kCharacterCond2, 123199584, 0);
+	switch (msg->action) {
+	case 0:
+	{
+		if (!getCharacterCurrentParams(kCharacterMilos)[4] && getCharacterCurrentParams(kCharacterMilos)[0] < _gameTime && !getCharacterCurrentParams(kCharacterMilos)[6]) {
+			getCharacterCurrentParams(kCharacterMilos)[6] = 1;
+			getCharacter(kCharacterMilos).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterMilos, _functionsMilos[getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall]]);
+			fedEx(kCharacterMilos, kCharacterMilos, 18, 0);
+			break;
+		}
+
+		bool skip1 = false;
+
+		if (!getCharacterCurrentParams(kCharacterMilos)[1]) {
+			getCharacterCurrentParams(kCharacterMilos)[7] = 0;
+			skip1 = true;
+		}
+
+		if (!skip1 && !getCharacterCurrentParams(kCharacterMilos)[7]) {
+			getCharacterCurrentParams(kCharacterMilos)[7] = _currentGameSessionTicks + 75;
+			if (_currentGameSessionTicks == -75) {
+				getCharacterCurrentParams(kCharacterMilos)[1] = 0;
+				getCharacterCurrentParams(kCharacterMilos)[2] = 1;
+				setDoor(38, kCharacterMilos, 1, 0, 0);
+				getCharacterCurrentParams(kCharacterMilos)[7] = 0;
+				skip1 = true;
+			}
+		}
+
+		if (!skip1 && getCharacterCurrentParams(kCharacterMilos)[7] < _currentGameSessionTicks) {
+			getCharacterCurrentParams(kCharacterMilos)[7] = 0x7FFFFFFF;
+			getCharacterCurrentParams(kCharacterMilos)[1] = 0;
+			getCharacterCurrentParams(kCharacterMilos)[2] = 1;
+			setDoor(38, kCharacterMilos, 1, 0, 0);
+			getCharacterCurrentParams(kCharacterMilos)[7] = 0;
+		}
+
+		if (_gameProgress[kProgressChapter] == 1 && !getCharacterCurrentParams(kCharacterMilos)[4]) {
+			bool skip2 = false;
+
+			if (getCharacterCurrentParams(kCharacterMilos)[5]) {
+				if (getCharacterCurrentParams(kCharacterMilos)[8] || (getCharacterCurrentParams(kCharacterMilos)[8] = _gameTime + 4500, _gameTime != -4500)) {
+					if (getCharacterCurrentParams(kCharacterMilos)[8] >= _gameTime) {
+						skip2 = true;
+					}
+
+					if (!skip2) {
+						getCharacterCurrentParams(kCharacterMilos)[8] = 0x7FFFFFFF;
+					}
 				}
-			} else if (msg->action == 122865568) {
-				getCharacter(kCharacterMilos).characterPosition.location = 0;
-				getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 12;
-				MilosCall(&LogicManager::CONS_Milos_DoCorrOtis, "611Bg", 38, 0, 0);
-			} else if (msg->action == 18) {
-				switch (getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8]) {
-				case 1:
-					getCharacter(kCharacterMilos).characterPosition.location = 0;
-					getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 2;
-					MilosCall(&LogicManager::CONS_Milos_DoWalk, 3, 8200, 0, 0);
-					break;
-				case 2:
-					getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 3;
-					MilosCall(&LogicManager::CONS_Milos_KnockTyler, 0, 0, 0, 0);
-					break;
-				case 3:
-					if (_gameProgress[kProgressField14] == 14)
-						_gameProgress[kProgressField14] = 0;
-					getCharacterCurrentParams(kCharacterMilos)[5] = 1;
-					getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 4;
-					MilosCall(&LogicManager::CONS_Milos_DoWalk, 4, 3050, 0, 0);
-					break;
-				case 4:
-					getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 5;
-					MilosCall(&LogicManager::CONS_Milos_DoCorrOtis, "609Bg", 38, 0, 0);
-					break;
-				case 5:
-					getCharacter(kCharacterMilos).characterPosition.location = 1;
-					endGraphics(kCharacterMilos);
-					send(kCharacterMilos, kCharacterVesna, 101687594, 0);
-					setDoor(38, kCharacterMilos, 3, 10, 9);
-					break;
-				case 6:
-					goto LABEL_62;
-				case 7:
-				case 8:
-					getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 9;
-					MilosCall(&LogicManager::CONS_Milos_DoDialog, "MIL1117A", 0, 0, 0);
-					break;
-				case 9:
-					setDoor(38, kCharacterMilos, 3, 14, 0);
-					getCharacterCurrentParams(kCharacterMilos)[1] = 1;
-					break;
-				case 10:
-				case 11:
-					getCharacterCurrentParams(kCharacterMilos)[1] = 0;
-					getCharacterCurrentParams(kCharacterMilos)[2] = 1;
-					break;
-				case 12:
-					startCycOtis(kCharacterMilos, "611Cg");
-					softBlockAtDoor(kCharacterMilos, 38);
-					send(kCharacterMilos, kCharacterCond2, 88652208, 0);
-					break;
-				case 13:
-					softReleaseAtDoor(kCharacterMilos, 38);
-					getCharacter(kCharacterMilos).characterPosition.location = 1;
-					endGraphics(kCharacterMilos);
-					setDoor(38, kCharacterMilos, 3, 10, 9);
-					getCharacterCurrentParams(kCharacterMilos)[4] = 0;
-					break;
-				default:
-					return;
+
+				if (!skip2) {
+					getCharacterCurrentParams(kCharacterMilos)[5] = 0;
+					getCharacterCurrentParams(kCharacterMilos)[8] = 0;
 				}
 			}
-		} else if (msg->action == 17) {
-			if (getCharacterCurrentParams(kCharacterMilos)[2] || getCharacterCurrentParams(kCharacterMilos)[1]) {
-				setDoor(38, kCharacterMilos, 3, 10, 9);
-				getCharacterCurrentParams(kCharacterMilos)[2] = 0;
-				getCharacterCurrentParams(kCharacterMilos)[1] = 0;
+
+			if (!_gameProgress[kProgressFieldCC]) {
+				if (getCharacterParams(kCharacterMilos, 8)[2] && !_gameProgress[kProgressField14] && !getCharacterCurrentParams(kCharacterMilos)[5]) {
+					_gameProgress[kProgressField14] = 14;
+					send(kCharacterMilos, kCharacterVesna, 190412928, 0);
+					getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 1;
+					MilosCall(&LogicManager::CONS_Milos_DoCorrOtis, "609Cg", 38, 0, 0);
+				}
+
+				break;
+			}
+
+			if (!getCharacterCurrentParams(kCharacterMilos)[3])
+				getCharacterCurrentParams(kCharacterMilos)[3] = _gameTime + 18000;
+
+			if (getCharacterCurrentParams(kCharacterMilos)[9] != 0x7FFFFFFF && _gameTime) {
+				if (getCharacterCurrentParams(kCharacterMilos)[3] >= _gameTime) {
+					if (!nearChar(kCharacterCath, kCharacterMilos, 2000) || !getCharacterCurrentParams(kCharacterMilos)[9]) {
+						getCharacterCurrentParams(kCharacterMilos)[9] = _gameTime + 150;
+						if (_gameTime == -150) {
+							if (nearChar(kCharacterCath, kCharacterMilos, 2000))
+								_gameProgress[kProgressField98] = 1;
+
+							setDoor(38, kCharacterMilos, 3, 0, 0);
+							getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 6;
+							MilosCall(&LogicManager::CONS_Milos_DoDialog, "MIL1012", 0, 0, 0);
+							break;
+						}
+					}
+
+					if (getCharacterCurrentParams(kCharacterMilos)[9] >= _gameTime)
+						break;
+				}
+
+				getCharacterCurrentParams(kCharacterMilos)[9] = 0x7FFFFFFF;
+				if (nearChar(kCharacterCath, kCharacterMilos, 2000))
+					_gameProgress[kProgressField98] = 1;
+
+				setDoor(38, kCharacterMilos, 3, 0, 0);
+				getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 6;
+				MilosCall(&LogicManager::CONS_Milos_DoDialog, "MIL1012", 0, 0, 0);
 			}
-		} else if (msg->action == 12) {
-		LABEL_62:
-			setDoor(38, kCharacterMilos, 3, 10, 9);
 		}
-		return;
+
+		break;
 	}
-	if (msg->action >= 8) {
+	case 8:
+	case 9:
 		if (getCharacterCurrentParams(kCharacterMilos)[1]) {
 			setDoor(38, kCharacterMilos, 3, 0, 0);
+
 			if (cathHasItem(kItemPassengerList)) {
 				getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 10;
-
 				if (rnd(2) != 0) {
 					MilosCall(&LogicManager::CONS_Milos_DoDialog, getCathSorryDialog(), 0, 0, 0);
 				} else {
 					MilosCall(&LogicManager::CONS_Milos_DoDialog, "CAT1504", 0, 0, 0);
 				}
-
 			} else {
 				getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 11;
 				MilosCall(&LogicManager::CONS_Milos_DoDialog, getCathSorryDialog(), 0, 0, 0);
 			}
 		} else {
 			setDoor(38, kCharacterMilos, 3, 0, 0);
+
 			if (msg->action == 8) {
 				getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 7;
 				MilosCall(&LogicManager::CONS_Milos_DoDialog, "LIB012", 0, 0, 0);
@@ -466,76 +525,97 @@ void LogicManager::HAND_Milos_CompLogic(HAND_PARAMS) {
 				MilosCall(&LogicManager::CONS_Milos_DoDialog, "LIB013", 0, 0, 0);
 			}
 		}
-		return;
-	}
-	if (msg->action)
-		return;
-	if (!getCharacterCurrentParams(kCharacterMilos)[4] && getCharacterCurrentParams(kCharacterMilos)[0] < _gameTime && !getCharacterCurrentParams(kCharacterMilos)[6]) {
-		getCharacterCurrentParams(kCharacterMilos)[6] = 1;
-		getCharacter(kCharacterMilos).currentCall--;
-		_engine->getMessageManager()->setMessageHandle(kCharacterMilos, _functionsMilos[getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall]]);
-		fedEx(kCharacterMilos, kCharacterMilos, 18, 0);
-		return;
-	}
-	if (!getCharacterCurrentParams(kCharacterMilos)[1])
-		goto LABEL_26;
-	if (!getCharacterCurrentParams(kCharacterMilos)[7]) {
-		getCharacterCurrentParams(kCharacterMilos)[7] = _currentGameSessionTicks + 75;
-		if (_currentGameSessionTicks == -75) {
-		LABEL_25:
+
+		break;
+	case 12:
+		setDoor(38, kCharacterMilos, 3, 10, 9);
+		break;
+	case 17:
+		if (getCharacterCurrentParams(kCharacterMilos)[2] || getCharacterCurrentParams(kCharacterMilos)[1]) {
+			setDoor(38, kCharacterMilos, 3, 10, 9);
+			getCharacterCurrentParams(kCharacterMilos)[2] = 0;
 			getCharacterCurrentParams(kCharacterMilos)[1] = 0;
-			getCharacterCurrentParams(kCharacterMilos)[2] = 1;
-			setDoor(38, kCharacterMilos, 1, 0, 0);
-		LABEL_26:
-			getCharacterCurrentParams(kCharacterMilos)[7] = 0;
-			goto LABEL_27;
-		}
-	}
-	if (getCharacterCurrentParams(kCharacterMilos)[7] < _currentGameSessionTicks) {
-		getCharacterCurrentParams(kCharacterMilos)[7] = 0x7FFFFFFF;
-		goto LABEL_25;
-	}
-LABEL_27:
-	if (_gameProgress[kProgressChapter] != 1 || getCharacterCurrentParams(kCharacterMilos)[4])
-		return;
-	if (getCharacterCurrentParams(kCharacterMilos)[5]) {
-		if (getCharacterCurrentParams(kCharacterMilos)[8] || (getCharacterCurrentParams(kCharacterMilos)[8] = _gameTime + 4500, _gameTime != -4500)) {
-			if (getCharacterCurrentParams(kCharacterMilos)[8] >= _gameTime)
-				goto LABEL_35;
-			getCharacterCurrentParams(kCharacterMilos)[8] = 0x7FFFFFFF;
-		}
-		getCharacterCurrentParams(kCharacterMilos)[5] = 0;
-		getCharacterCurrentParams(kCharacterMilos)[8] = 0;
-	}
-LABEL_35:
-	if (!_gameProgress[kProgressFieldCC]) {
-		if (getCharacterParams(kCharacterMilos, 8)[2] && !_gameProgress[kProgressField14] && !getCharacterCurrentParams(kCharacterMilos)[5]) {
-			_gameProgress[kProgressField14] = 14;
-			send(kCharacterMilos, kCharacterVesna, 190412928, 0);
-			getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 1;
-			MilosCall(&LogicManager::CONS_Milos_DoCorrOtis, "609Cg", 38, 0, 0);
 		}
-		return;
-	}
-	if (!getCharacterCurrentParams(kCharacterMilos)[3])
-		getCharacterCurrentParams(kCharacterMilos)[3] = _gameTime + 18000;
-	if (getCharacterCurrentParams(kCharacterMilos)[9] != 0x7FFFFFFF && _gameTime) {
-		if (getCharacterCurrentParams(kCharacterMilos)[3] >= _gameTime) {
-			if (!nearChar(kCharacterCath, kCharacterMilos, 2000) || !getCharacterCurrentParams(kCharacterMilos)[9]) {
-				getCharacterCurrentParams(kCharacterMilos)[9] = _gameTime + 150;
-				if (_gameTime == -150)
-					goto LABEL_50;
-			}
-			if (getCharacterCurrentParams(kCharacterMilos)[9] >= _gameTime)
-				return;
+
+		break;
+	case 18:
+		switch (getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8]) {
+		case 1:
+			getCharacter(kCharacterMilos).characterPosition.location = 0;
+			getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 2;
+			MilosCall(&LogicManager::CONS_Milos_DoWalk, 3, 8200, 0, 0);
+			break;
+		case 2:
+			getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 3;
+			MilosCall(&LogicManager::CONS_Milos_KnockTyler, 0, 0, 0, 0);
+			break;
+		case 3:
+			if (_gameProgress[kProgressField14] == 14)
+				_gameProgress[kProgressField14] = 0;
+
+			getCharacterCurrentParams(kCharacterMilos)[5] = 1;
+			getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 4;
+			MilosCall(&LogicManager::CONS_Milos_DoWalk, 4, 3050, 0, 0);
+			break;
+		case 4:
+			getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 5;
+			MilosCall(&LogicManager::CONS_Milos_DoCorrOtis, "609Bg", 38, 0, 0);
+			break;
+		case 5:
+			getCharacter(kCharacterMilos).characterPosition.location = 1;
+			endGraphics(kCharacterMilos);
+			send(kCharacterMilos, kCharacterVesna, 101687594, 0);
+			setDoor(38, kCharacterMilos, 3, 10, 9);
+			break;
+		case 6:
+			setDoor(38, kCharacterMilos, 3, 10, 9);
+			break;
+		case 7:
+		case 8:
+			getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 9;
+			MilosCall(&LogicManager::CONS_Milos_DoDialog, "MIL1117A", 0, 0, 0);
+			break;
+		case 9:
+			setDoor(38, kCharacterMilos, 3, 14, 0);
+			getCharacterCurrentParams(kCharacterMilos)[1] = 1;
+			break;
+		case 10:
+		case 11:
+			getCharacterCurrentParams(kCharacterMilos)[1] = 0;
+			getCharacterCurrentParams(kCharacterMilos)[2] = 1;
+			break;
+		case 12:
+			startCycOtis(kCharacterMilos, "611Cg");
+			softBlockAtDoor(kCharacterMilos, 38);
+			send(kCharacterMilos, kCharacterCond2, 88652208, 0);
+			break;
+		case 13:
+			softReleaseAtDoor(kCharacterMilos, 38);
+			getCharacter(kCharacterMilos).characterPosition.location = 1;
+			endGraphics(kCharacterMilos);
+			setDoor(38, kCharacterMilos, 3, 10, 9);
+			getCharacterCurrentParams(kCharacterMilos)[4] = 0;
+			break;
+		default:
+			break;
 		}
-		getCharacterCurrentParams(kCharacterMilos)[9] = 0x7FFFFFFF;
-	LABEL_50:
-		if (nearChar(kCharacterCath, kCharacterMilos, 2000))
-			_gameProgress[kProgressField98] = 1;
-		setDoor(38, kCharacterMilos, 3, 0, 0);
-		getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 6;
-		MilosCall(&LogicManager::CONS_Milos_DoDialog, "MIL1012", 0, 0, 0);
+
+		break;
+	case 122865568:
+		getCharacter(kCharacterMilos).characterPosition.location = 0;
+		getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 12;
+		MilosCall(&LogicManager::CONS_Milos_DoCorrOtis, "611Bg", 38, 0, 0);
+		break;
+	case 123852928:
+		getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 13;
+		MilosCall(&LogicManager::CONS_Milos_DoCorrOtis, "611Dg", 38, 0, 0);
+		break;
+	case 221683008:
+		getCharacterCurrentParams(kCharacterMilos)[4] = 1;
+		send(kCharacterMilos, kCharacterCond2, 123199584, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -550,20 +630,26 @@ void LogicManager::CONS_Milos_Birth(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Milos_Birth(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			setDoor(38, kCharacterCath, 3, 10, 9);
-			setDoor(46, kCharacterCath, 0, 255, 255);
-			getCharacter(kCharacterMilos).characterPosition.position = 4689;
-			getCharacter(kCharacterMilos).characterPosition.location = 1;
-			getCharacter(kCharacterMilos).characterPosition.car = kCarRestaurant;
-			autoMessage(kCharacterMilos, 157691176, 0);
-			autoMessage(kCharacterMilos, 208228224, 2);
-			autoMessage(kCharacterMilos, 259125998, 3);
+	switch (msg->action) {
+	case 0:
+		if (_gameTime > 1062000 && !getCharacterCurrentParams(kCharacterMilos)[0]) {
+			getCharacterCurrentParams(kCharacterMilos)[0] = 1;
+			CONS_Milos_AtDinner(0, 0, 0, 0);
 		}
-	} else if (_gameTime > 1062000 && !getCharacterCurrentParams(kCharacterMilos)[0]) {
-		getCharacterCurrentParams(kCharacterMilos)[0] = 1;
-		CONS_Milos_AtDinner(0, 0, 0, 0);
+
+		break;
+	case 12:
+		setDoor(38, kCharacterCath, 3, 10, 9);
+		setDoor(46, kCharacterCath, 0, 255, 255);
+		getCharacter(kCharacterMilos).characterPosition.position = 4689;
+		getCharacter(kCharacterMilos).characterPosition.location = 1;
+		getCharacter(kCharacterMilos).characterPosition.car = kCarRestaurant;
+		autoMessage(kCharacterMilos, 157691176, 0);
+		autoMessage(kCharacterMilos, 208228224, 2);
+		autoMessage(kCharacterMilos, 259125998, 3);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -578,7 +664,8 @@ void LogicManager::CONS_Milos_DoOtis5009D(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Milos_DoOtis5009D(HAND_PARAMS) {
-	if (msg->action == 3) {
+	switch (msg->action) {
+	case 3:
 		send(kCharacterMilos, kCharacterTableC, 103798704, "009E");
 		endGraphics(kCharacterVesna);
 		endGraphics(kCharacterIvo);
@@ -587,12 +674,16 @@ void LogicManager::HAND_Milos_DoOtis5009D(HAND_PARAMS) {
 		getCharacter(kCharacterMilos).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterMilos, _functionsMilos[getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall]]);
 		fedEx(kCharacterMilos, kCharacterMilos, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		startSeqOtis(kCharacterSalko, "009D5");
 		startSeqOtis(kCharacterTableC, "009D4");
 		startSeqOtis(kCharacterIvo, "009D3");
 		startSeqOtis(kCharacterVesna, "009D2");
 		startSeqOtis(kCharacterMilos, "009D1");
+		break;
+	default:
+		break;
 	}
 }
 
@@ -617,7 +708,6 @@ void LogicManager::HAND_Milos_KnockTyler(HAND_PARAMS) {
 				MilosCall(&LogicManager::CONS_Milos_DoCorrOtis, "609Ca", 1, 0, 0);
 			} else {
 				softReleaseAtDoor(kCharacterMilos, 1);
-			LABEL_59:
 				setDoor(1, kCharacterCath, 0, 10, 9);
 
 				getCharacter(kCharacterMilos).currentCall--;
@@ -629,7 +719,7 @@ void LogicManager::HAND_Milos_KnockTyler(HAND_PARAMS) {
 				if (checkDoor(1) == 1) {
 					if (getCharacterCurrentParams(kCharacterMilos)[9] || (getCharacterCurrentParams(kCharacterMilos)[9] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
 						if (getCharacterCurrentParams(kCharacterMilos)[9] >= _currentGameSessionTicks)
-							return;
+							break;
 						getCharacterCurrentParams(kCharacterMilos)[9] = 0x7FFFFFFF;
 					}
 
@@ -640,20 +730,22 @@ void LogicManager::HAND_Milos_KnockTyler(HAND_PARAMS) {
 					case 1:
 						getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 6;
 						MilosCall(&LogicManager::CONS_Milos_DoDialog, "LIB013", 0, 0, 0);
-						return;
+						break;
 					case 2:
 						getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 8;
 						MilosCall(&LogicManager::CONS_Milos_DoDialog, "LIB012", 0, 0, 0);
-						return;
+						break;
 					case 3:
 						getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 10;
 						MilosCall(&LogicManager::CONS_Milos_DoDialog, "LIB012", 0, 0, 0);
-						return;
+						break;
 					case 4:
 						getCharacterCurrentParams(kCharacterMilos)[6]++;
 						if (getCharacterCurrentParams(kCharacterMilos)[6] < 3) {
 							getCharacterCurrentParams(kCharacterMilos)[4] = 1;
-							goto LABEL_25;
+							setDoor(1, kCharacterMilos, checkDoor(1), getCharacterCurrentParams(kCharacterMilos)[2] == 0 ? 14 : 0, 9);
+							getCharacterCurrentParams(kCharacterMilos)[9] = 0;
+							break;
 						}
 
 						setDoor(1, kCharacterCath, checkDoor(1), 10, 9);
@@ -663,7 +755,9 @@ void LogicManager::HAND_Milos_KnockTyler(HAND_PARAMS) {
 						fedEx(kCharacterMilos, kCharacterMilos, 18, 0);
 						break;
 					default:
-						goto LABEL_25;
+						setDoor(1, kCharacterMilos, checkDoor(1), getCharacterCurrentParams(kCharacterMilos)[2] == 0 ? 14 : 0, 9);
+						getCharacterCurrentParams(kCharacterMilos)[9] = 0;
+						break;
 					}
 				} else if (!_gameProgress[kProgressEventCorpseMovedFromFloor] || _gameProgress[kProgressJacket] == 1) {
 					setDoor(9, kCharacterCath, 0, 255, 255);
@@ -683,17 +777,18 @@ void LogicManager::HAND_Milos_KnockTyler(HAND_PARAMS) {
 			if (!getCharacterCurrentParams(kCharacterMilos)[3]) {
 				getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 12;
 				MilosCall(&LogicManager::CONS_Milos_DoDialog, "MIL1030C", 0, 0, 0);
-				return;
+				break;
 			}
-		LABEL_70:
+
 			if (getCharacterCurrentParams(kCharacterMilos)[11] || (getCharacterCurrentParams(kCharacterMilos)[11] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
 				if (getCharacterCurrentParams(kCharacterMilos)[11] >= _currentGameSessionTicks)
-					return;
+					break;
 
 				getCharacterCurrentParams(kCharacterMilos)[11] = 0x7FFFFFFF;
 			}
 
 			softReleaseAtDoor(kCharacterMilos, 1);
+
 			if (_gameProgress[kProgressEventCorpseMovedFromFloor]) {
 				getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 13;
 				MilosCall(&LogicManager::CONS_Milos_DoCorrOtis, "609Ba", 1, 0, 0);
@@ -702,12 +797,12 @@ void LogicManager::HAND_Milos_KnockTyler(HAND_PARAMS) {
 				MilosCall(&LogicManager::CONS_Milos_DoBriefCorrOtis, "609Ba", 1, 0, 0);
 			} else {
 				bumpCath(kCarNone, 1, 255);
-			LABEL_79:
 				setDoor(9, kCharacterCath, 0, 255, 255);
 				getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 15;
 				MilosCall(&LogicManager::CONS_Milos_SaveGame, 2, kEventMilosCorpseFloor, 0, 0);
 			}
 		}
+
 		break;
 	case 8:
 		if (getCharacterCurrentParams(kCharacterMilos)[1]) {
@@ -719,6 +814,7 @@ void LogicManager::HAND_Milos_KnockTyler(HAND_PARAMS) {
 			getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 22;
 			MilosCall(&LogicManager::CONS_Milos_DoDialogFullVol, "MIL1032", 0, 0, 0);
 		}
+
 		break;
 	case 9:
 		if (!_gameProgress[kProgressEventCorpseMovedFromFloor] || _gameProgress[kProgressJacket] == 1) {
@@ -728,18 +824,22 @@ void LogicManager::HAND_Milos_KnockTyler(HAND_PARAMS) {
 		} else {
 			if (getCharacterCurrentParams(kCharacterMilos)[1]) {
 				getCharacter(kCharacterCath).characterPosition.location = 1;
-				if (getModel(1) == 1)
+				if (getModel(1) == 1) {
 					getCharacterCurrentParams(kCharacterMilos)[5] = kEventMilosTylerCompartmentBed;
-				else
+				} else {
 					getCharacterCurrentParams(kCharacterMilos)[5] = kEventMilosTylerCompartment;
+				}
 			} else {
 				getCharacterCurrentParams(kCharacterMilos)[5] = kEventMilosTylerCompartmentBedVisit;
+
 				if (getModel(1) != 1)
 					getCharacterCurrentParams(kCharacterMilos)[5] = kEventMilosTylerCompartmentVisit;
 			}
+
 			getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 17;
 			MilosCall(&LogicManager::CONS_Milos_SaveGame, 2, kEventMilosTylerCompartmentVisit, 0, 0);
 		}
+
 		break;
 	case 12:
 		if (inComp(kCharacterCath, kCarGreenSleeping, 8200) || inComp(kCharacterCath, kCarGreenSleeping, 7850) || cathOutHisWindow()) {
@@ -755,17 +855,23 @@ void LogicManager::HAND_Milos_KnockTyler(HAND_PARAMS) {
 			startCycOtis(kCharacterMilos, "609Aa");
 			softBlockAtDoor(kCharacterMilos, 1);
 		}
+
 		break;
 	case 18:
 		switch (getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8]) {
 		case 1:
 			getCharacter(kCharacterMilos).characterPosition.location = 0;
-			goto LABEL_59;
+			setDoor(1, kCharacterCath, 0, 10, 9);
+
+			getCharacter(kCharacterMilos).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterMilos, _functionsMilos[getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall]]);
+			fedEx(kCharacterMilos, kCharacterMilos, 18, 0);
+			break;
 		case 2:
 			playDialog(0, "LIB014", -1, 0);
 			playNIS(kEventMilosCorpseFloor);
 			endGame(0, 1, _gameProgress[kProgressEventCorpseMovedFromFloor] == kProgressField0 ? 57 : 55, 1);
-			return;
+			break;
 		case 3:
 			setDoor(1, kCharacterCath, 0, 10, 9);
 			setDoor(9, kCharacterCath, 0, 255, 255);
@@ -773,12 +879,16 @@ void LogicManager::HAND_Milos_KnockTyler(HAND_PARAMS) {
 			playNIS(getCharacterCurrentParams(kCharacterMilos)[5]);
 			getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 4;
 			MilosCall(&LogicManager::CONS_Milos_SaveGame, 1, 0, 0, 0);
-			return;
+			break;
 		case 4:
 			fightOutcome = playFight(2001);
 			getCharacterCurrentParams(kCharacterMilos)[7] = fightOutcome;
-			if (fightOutcome)
-				goto LABEL_63;
+
+			if (fightOutcome) {
+				endGame(0, 0, 0, fightOutcome == 1);
+				break;
+			}
+
 			_gameTime += 1800;
 			_gameProgress[kProgressFieldCC] = 1;
 			getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 5;
@@ -794,41 +904,65 @@ void LogicManager::HAND_Milos_KnockTyler(HAND_PARAMS) {
 			getCharacter(kCharacterMilos).currentCall--;
 			_engine->getMessageManager()->setMessageHandle(kCharacterMilos, _functionsMilos[getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall]]);
 			fedEx(kCharacterMilos, kCharacterMilos, 18, 0);
-			return;
+			break;
 		case 6:
 			getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 7;
 			MilosCall(&LogicManager::CONS_Milos_DoDialogFullVol, "MIL1031C", 0, 0, 0);
-			return;
+			break;
 		case 7:
 		case 9:
 		case 11:
-		LABEL_25:
 			setDoor(1, kCharacterMilos, checkDoor(1), getCharacterCurrentParams(kCharacterMilos)[2] == 0 ? 14 : 0, 9);
 			getCharacterCurrentParams(kCharacterMilos)[9] = 0;
-			return;
+			break;
 		case 8:
 			getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 9;
 			MilosCall(&LogicManager::CONS_Milos_DoDialogFullVol, "MIL1031A", 0, 0, 0);
-			return;
+			break;
 		case 10:
 			getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 11;
 			MilosCall(&LogicManager::CONS_Milos_DoDialogFullVol, "MIL1031B", 0, 0, 0);
-			return;
+			break;
 		case 12:
 			getCharacterCurrentParams(kCharacterMilos)[3] = 1;
-			goto LABEL_70;
+
+			if (getCharacterCurrentParams(kCharacterMilos)[11] || (getCharacterCurrentParams(kCharacterMilos)[11] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
+				if (getCharacterCurrentParams(kCharacterMilos)[11] >= _currentGameSessionTicks)
+					break;
+
+				getCharacterCurrentParams(kCharacterMilos)[11] = 0x7FFFFFFF;
+			}
+
+			softReleaseAtDoor(kCharacterMilos, 1);
+			if (_gameProgress[kProgressEventCorpseMovedFromFloor]) {
+				getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 13;
+				MilosCall(&LogicManager::CONS_Milos_DoCorrOtis, "609Ba", 1, 0, 0);
+			} else if (checkLoc(kCharacterCath, kCarGreenSleeping)) {
+				getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 14;
+				MilosCall(&LogicManager::CONS_Milos_DoBriefCorrOtis, "609Ba", 1, 0, 0);
+			} else {
+				bumpCath(kCarNone, 1, 255);
+				setDoor(9, kCharacterCath, 0, 255, 255);
+				getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 15;
+				MilosCall(&LogicManager::CONS_Milos_SaveGame, 2, kEventMilosCorpseFloor, 0, 0);
+			}
+
+			break;
 		case 13:
 			getCharacterCurrentParams(kCharacterMilos)[1] = 1;
 			endGraphics(kCharacterMilos);
 			getCharacter(kCharacterMilos).characterPosition.location = 1;
-			setDoor(1, 14, 0, 10, 9);
-			return;
+			setDoor(1, kCharacterMilos, 0, 10, 9);
+			break;
 		case 14:
-			goto LABEL_79;
+			setDoor(9, kCharacterCath, 0, 255, 255);
+			getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 15;
+			MilosCall(&LogicManager::CONS_Milos_SaveGame, 2, kEventMilosCorpseFloor, 0, 0);
+			break;
 		case 15:
 			playNIS(kEventMilosCorpseFloor);
-			endGame(0, 1, 57, 1);
-			return;
+			endGame(0, 1, 57, true);
+			break;
 		case 16:
 			if (checkDoor(1) != 1) {
 				playDialog(0, "LIB014", -1, 0);
@@ -837,8 +971,8 @@ void LogicManager::HAND_Milos_KnockTyler(HAND_PARAMS) {
 			}
 			
 			playNIS(kEventMilosCorpseFloor);
-			endGame(0, 1, _gameProgress[kProgressEventCorpseMovedFromFloor] == 0 ? 57 : 55, 1);
-			return;
+			endGame(0, 1, _gameProgress[kProgressEventCorpseMovedFromFloor] == 0 ? 57 : 55, true);
+			break;
 		case 17:
 			if (checkDoor(1) != 1) {
 				playDialog(0, "LIB014", -1, 0);
@@ -851,12 +985,11 @@ void LogicManager::HAND_Milos_KnockTyler(HAND_PARAMS) {
 			playNIS(getCharacterCurrentParams(kCharacterMilos)[5]);
 			getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 18;
 			MilosCall(&LogicManager::CONS_Milos_SaveGame, 1, 0, 0, 0);
-			return;
+			break;
 		case 18:
 			fightOutcome = playFight(2001);
 			getCharacterCurrentParams(kCharacterMilos)[7] = fightOutcome;
 			if (fightOutcome) {
-			LABEL_63:
 				endGame(0, 0, 0, fightOutcome == 1);
 			} else {
 				_gameTime += 1800;
@@ -864,24 +997,26 @@ void LogicManager::HAND_Milos_KnockTyler(HAND_PARAMS) {
 				getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 19;
 				MilosCall(&LogicManager::CONS_Milos_SaveGame, 2, kEventMilosTylerCompartmentDefeat, 0, 0);
 			}
+
 			break;
 		case 20:
 			getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 21;
 			MilosCall(&LogicManager::CONS_Milos_DoDialog, "MIL1117A", 0, 0, 0);
 			break;
 		case 21:
-			setDoor(1, 14, 0, 10, 9);
+			setDoor(1, kCharacterMilos, 0, 10, 9);
 			break;
 		case 22:
 			getCharacterCurrentParams(kCharacterMilos)[2] = 1;
 			setDoor(1, kCharacterMilos, checkDoor(1), 0, 9);
 			break;
 		default:
-			return;
+			break;
 		}
+
 		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -896,54 +1031,91 @@ void LogicManager::CONS_Milos_AtDinner(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Milos_AtDinner(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			send(kCharacterMilos, kCharacterTableC, 136455232, 0);
-			startCycOtis(kCharacterMilos, "009A");
-			return;
-		}
-		if (msg->action != 18)
-			return;
-		if (getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] != 1) {
-			if (getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] == 2) {
-				startCycOtis(kCharacterMilos, "009A");
-				getCharacterCurrentParams(kCharacterMilos)[1] = 1;
-			}
-			return;
-		}
-		startCycOtis(kCharacterMilos, "009A");
-		getCharacterCurrentParams(kCharacterMilos)[0] = 1;
-	} else {
+	switch (msg->action) {
+	case 0:
 		if (_gameTime > 1071000 && !getCharacterCurrentParams(kCharacterMilos)[2]) {
 			getCharacterCurrentParams(kCharacterMilos)[2] = 1;
 			send(kCharacterMilos, kCharacterWaiter2, 223002560, 0);
 		}
+
 		if (_gameTime > 1089000 && rcClear()) {
 			CONS_Milos_ReturnFromDinner(0, 0, 0, 0);
-			return;
+			break;
 		}
+
 		if (checkCathDir(kCarRestaurant, 61) && !getCharacterCurrentParams(kCharacterMilos)[0]) {
 			if (getCharacterCurrentParams(kCharacterMilos)[3] || (getCharacterCurrentParams(kCharacterMilos)[3] = _currentGameSessionTicks + 45,
 																  _currentGameSessionTicks != -45)) {
-				if (getCharacterCurrentParams(kCharacterMilos)[3] >= _currentGameSessionTicks)
-					goto LABEL_23;
+				if (getCharacterCurrentParams(kCharacterMilos)[3] >= _currentGameSessionTicks) {
+					if (checkCathDir(kCarRestaurant, 70) && !getCharacterCurrentParams(kCharacterMilos)[1]) {
+						if (getCharacterCurrentParams(kCharacterMilos)[4] || (getCharacterCurrentParams(kCharacterMilos)[4] = _currentGameSessionTicks + 45,
+																			  _currentGameSessionTicks != -45)) {
+							if (getCharacterCurrentParams(kCharacterMilos)[4] >= _currentGameSessionTicks)
+								break;
+
+							getCharacterCurrentParams(kCharacterMilos)[4] = 0x7FFFFFFF;
+						}
+						getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 2;
+						MilosCall(&LogicManager::CONS_Milos_DoSeqOtis, "009C", 0, 0, 0);
+					}
+
+					break;
+				}
+
 				getCharacterCurrentParams(kCharacterMilos)[3] = 0x7FFFFFFF;
 			}
+
 			getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 1;
 			MilosCall(&LogicManager::CONS_Milos_DoSeqOtis, "009C", 0, 0, 0);
-			return;
+			break;
 		}
-	}
-LABEL_23:
-	if (checkCathDir(kCarRestaurant, 70) && !getCharacterCurrentParams(kCharacterMilos)[1]) {
-		if (getCharacterCurrentParams(kCharacterMilos)[4] || (getCharacterCurrentParams(kCharacterMilos)[4] = _currentGameSessionTicks + 45,
-															  _currentGameSessionTicks != -45)) {
-			if (getCharacterCurrentParams(kCharacterMilos)[4] >= _currentGameSessionTicks)
-				return;
-			getCharacterCurrentParams(kCharacterMilos)[4] = 0x7FFFFFFF;
+
+		if (checkCathDir(kCarRestaurant, 70) && !getCharacterCurrentParams(kCharacterMilos)[1]) {
+			if (getCharacterCurrentParams(kCharacterMilos)[4] || (getCharacterCurrentParams(kCharacterMilos)[4] = _currentGameSessionTicks + 45,
+																  _currentGameSessionTicks != -45)) {
+				if (getCharacterCurrentParams(kCharacterMilos)[4] >= _currentGameSessionTicks)
+					break;
+
+				getCharacterCurrentParams(kCharacterMilos)[4] = 0x7FFFFFFF;
+			}
+			getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 2;
+			MilosCall(&LogicManager::CONS_Milos_DoSeqOtis, "009C", 0, 0, 0);
 		}
-		getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 2;
-		MilosCall(&LogicManager::CONS_Milos_DoSeqOtis, "009C", 0, 0, 0);
+
+		break;
+	case 12:
+		send(kCharacterMilos, kCharacterTableC, 136455232, 0);
+		startCycOtis(kCharacterMilos, "009A");
+		break;
+	case 18:
+		if (getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] != 1) {
+			if (getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] == 2) {
+				startCycOtis(kCharacterMilos, "009A");
+				getCharacterCurrentParams(kCharacterMilos)[1] = 1;
+			}
+
+			break;
+		}
+
+		startCycOtis(kCharacterMilos, "009A");
+		getCharacterCurrentParams(kCharacterMilos)[0] = 1;
+
+		if (checkCathDir(kCarRestaurant, 70) && !getCharacterCurrentParams(kCharacterMilos)[1]) {
+			if (getCharacterCurrentParams(kCharacterMilos)[4] || (getCharacterCurrentParams(kCharacterMilos)[4] = _currentGameSessionTicks + 45,
+																  _currentGameSessionTicks != -45)) {
+				if (getCharacterCurrentParams(kCharacterMilos)[4] >= _currentGameSessionTicks)
+					break;
+
+				getCharacterCurrentParams(kCharacterMilos)[4] = 0x7FFFFFFF;
+			}
+
+			getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 2;
+			MilosCall(&LogicManager::CONS_Milos_DoSeqOtis, "009C", 0, 0, 0);
+		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -958,61 +1130,71 @@ void LogicManager::CONS_Milos_ReturnFromDinner(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Milos_ReturnFromDinner(HAND_PARAMS) {
-	if (msg->action > 12) {
-		if (msg->action == 18) {
-			switch (getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8]) {
-			case 1:
-				send(kCharacterMilos, kCharacterWaiter2, 269485588, 0);
-				send(kCharacterMilos, kCharacterIvo, 125242096, 0);
-				startSeqOtis(kCharacterMilos, "807DS");
-				if (inDiningRoom(kCharacterCath))
-					advanceFrame(kCharacterMilos);
-				getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 2;
-				MilosCall(&LogicManager::CONS_Milos_FinishSeqOtis, 0, 0, 0, 0);
-				break;
-			case 2:
-				endGraphics(kCharacterMilos);
-				break;
-			case 3:
-				if (nearChar(kCharacterMilos, kCharacterVesna, 750) || nearX(kCharacterVesna, 3050, 500)) {
-					send(kCharacterMilos, kCharacterVesna, 123668192, 0);
-					getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 4;
-					MilosCall(&LogicManager::CONS_Milos_DoCorrOtis, "611Ag", 0x26, 0, 0);
-				} else {
-					getCharacterCurrentParams(kCharacterMilos)[0] = 1;
-					startCycOtis(kCharacterMilos, "609Dg");
-					softBlockAtDoor(kCharacterMilos, 38);
-				}
-				break;
-			case 4:
-				getCharacter(kCharacterMilos).characterPosition.position = 3050;
-				getCharacter(kCharacterMilos).characterPosition.location = 1;
-				endGraphics(kCharacterMilos);
-				CONS_Milos_InComp(0, 0, 0, 0);
-				break;
-			case 5:
-				softReleaseAtDoor(kCharacterMilos, 38);
-				getCharacter(kCharacterMilos).characterPosition.position = 3050;
-				getCharacter(kCharacterMilos).characterPosition.location = 1;
-				endGraphics(kCharacterMilos);
-				CONS_Milos_InComp(0, 0, 0, 0);
-				break;
-			default:
-				return;
-			}
-		} else if (msg->action == 135024800) {
-			send(kCharacterMilos, kCharacterVesna, 204832737, 0);
-			getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 3;
-			MilosCall(&LogicManager::CONS_Milos_DoWalk, 4, 0xBEA, 0, 0);
+	switch (msg->action) {
+	case 0:
+		if (getCharacterCurrentParams(kCharacterMilos)[0] && (nearChar(kCharacterMilos, kCharacterVesna, 750) || nearX(kCharacterVesna, 3050, 500))) {
+			send(kCharacterMilos, kCharacterVesna, 123668192, 0);
+			getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 5;
+			MilosCall(&LogicManager::CONS_Milos_DoCorrOtis, "611Ag", 38, 0, 0);
 		}
-	} else if (msg->action == 12) {
+
+		break;
+	case 12:
 		getCharacter(kCharacterMilos).characterPosition.location = 0;
 		getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 1;
 		MilosCall(&LogicManager::CONS_Milos_DoOtis5009D, 0, 0, 0, 0);
-	} else if (msg->action == 0 && getCharacterCurrentParams(kCharacterMilos)[0] && (nearChar(kCharacterMilos, kCharacterVesna, 750) || nearX(kCharacterVesna, 3050, 500))) {
-		send(kCharacterMilos, kCharacterVesna, 123668192, 0);
-		getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 5;
-		MilosCall(&LogicManager::CONS_Milos_DoCorrOtis, "611Ag", 38, 0, 0);
+		break;
+	case 18:
+		switch (getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8]) {
+		case 1:
+			send(kCharacterMilos, kCharacterWaiter2, 269485588, 0);
+			send(kCharacterMilos, kCharacterIvo, 125242096, 0);
+			startSeqOtis(kCharacterMilos, "807DS");
+			if (inDiningRoom(kCharacterCath))
+				advanceFrame(kCharacterMilos);
+			getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 2;
+			MilosCall(&LogicManager::CONS_Milos_FinishSeqOtis, 0, 0, 0, 0);
+			break;
+		case 2:
+			endGraphics(kCharacterMilos);
+			break;
+		case 3:
+			if (nearChar(kCharacterMilos, kCharacterVesna, 750) || nearX(kCharacterVesna, 3050, 500)) {
+				send(kCharacterMilos, kCharacterVesna, 123668192, 0);
+				getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 4;
+				MilosCall(&LogicManager::CONS_Milos_DoCorrOtis, "611Ag", 38, 0, 0);
+			} else {
+				getCharacterCurrentParams(kCharacterMilos)[0] = 1;
+				startCycOtis(kCharacterMilos, "609Dg");
+				softBlockAtDoor(kCharacterMilos, 38);
+			}
+
+			break;
+		case 4:
+			getCharacter(kCharacterMilos).characterPosition.position = 3050;
+			getCharacter(kCharacterMilos).characterPosition.location = 1;
+			endGraphics(kCharacterMilos);
+			CONS_Milos_InComp(0, 0, 0, 0);
+			break;
+		case 5:
+			softReleaseAtDoor(kCharacterMilos, 38);
+			getCharacter(kCharacterMilos).characterPosition.position = 3050;
+			getCharacter(kCharacterMilos).characterPosition.location = 1;
+			endGraphics(kCharacterMilos);
+			CONS_Milos_InComp(0, 0, 0, 0);
+			break;
+		default:
+			break;
+		}
+
+		break;
+	case 135024800:
+		send(kCharacterMilos, kCharacterVesna, 204832737, 0);
+		getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 3;
+		MilosCall(&LogicManager::CONS_Milos_DoWalk, 4, 3050, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1027,9 +1209,13 @@ void LogicManager::CONS_Milos_InComp(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Milos_InComp(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 1;
 		MilosCall(&LogicManager::CONS_Milos_CompLogic, 1404000, 0, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1044,12 +1230,16 @@ void LogicManager::CONS_Milos_Asleep(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Milos_Asleep(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterMilos).characterPosition.car = kCarRedSleeping;
 		getCharacter(kCharacterMilos).characterPosition.position = 3050;
 		getCharacter(kCharacterMilos).characterPosition.location = 1;
 		endGraphics(kCharacterMilos);
 		setDoor(38, kCharacterCath, 3, 10, 9);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1064,19 +1254,22 @@ void LogicManager::CONS_Milos_StartPart2(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Milos_StartPart2(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			endGraphics(kCharacterMilos);
-			getCharacter(kCharacterMilos).characterPosition.car = kCarRedSleeping;
-			getCharacter(kCharacterMilos).characterPosition.position = 540;
-			getCharacter(kCharacterMilos).characterPosition.location = 0;
-			getCharacter(kCharacterMilos).inventoryItem = 0;
-			getCharacter(kCharacterMilos).clothes = 0;
-			setDoor(38, kCharacterCath, 3, 10, 9);
-			setDoor(46, kCharacterCath, 0, 255, 255);
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		CONS_Milos_OnRearPlat(0, 0, 0, 0);
+		break;
+	case 12:
+		endGraphics(kCharacterMilos);
+		getCharacter(kCharacterMilos).characterPosition.car = kCarRedSleeping;
+		getCharacter(kCharacterMilos).characterPosition.position = 540;
+		getCharacter(kCharacterMilos).characterPosition.location = 0;
+		getCharacter(kCharacterMilos).inventoryItem = 0;
+		getCharacter(kCharacterMilos).clothes = 0;
+		setDoor(38, kCharacterCath, 3, 10, 9);
+		setDoor(46, kCharacterCath, 0, 255, 255);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1103,6 +1296,7 @@ void LogicManager::HAND_Milos_OnRearPlat(HAND_PARAMS) {
 			getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 1;
 			MilosCall(&LogicManager::CONS_Milos_DoWalk, 4, 3050, 0, 0);
 		}
+
 		break;
 	case 18:
 		if (getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] == 1) {
@@ -1115,6 +1309,9 @@ void LogicManager::HAND_Milos_OnRearPlat(HAND_PARAMS) {
 			send(kCharacterMilos, kCharacterVesna, 101687594, 0);
 			CONS_Milos_InPart2(0, 0, 0, 0);
 		}
+
+		break;
+	default:
 		break;
 	}
 }
@@ -1134,33 +1331,38 @@ void LogicManager::HAND_Milos_InPart2(HAND_PARAMS) {
 	case 0:
 		if (!getCharacterCurrentParams(kCharacterMilos)[1]) {
 			getCharacterCurrentParams(kCharacterMilos)[1] = _gameTime + 4500;
-			if (_gameTime == -4500)
-				goto LABEL_7;
+			if (_gameTime == -4500) {
+				getCharacterCurrentParams(kCharacterMilos)[0] = 1;
+				break;
+			}
 		}
+
 		if (getCharacterCurrentParams(kCharacterMilos)[1] < _gameTime) {
 			getCharacterCurrentParams(kCharacterMilos)[1] = 0x7FFFFFFF;
-		LABEL_7:
 			getCharacterCurrentParams(kCharacterMilos)[0] = 1;
 		}
+
 		break;
 	case 8:
 		setDoor(38, kCharacterMilos, 3, 0, 0);
 		getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 1;
 		MilosCall(&LogicManager::CONS_Milos_DoDialog, "LIB012", 0, 0, 0);
-		return;
+		break;
 	case 9:
 		setDoor(38, kCharacterMilos, 3, 0, 0);
 		getCharacter(kCharacterCath).characterPosition.location = 1;
 		getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 3;
 		MilosCall(&LogicManager::CONS_Milos_SaveGame, 2, kEventMilosCompartmentVisitAugust, 0, 0);
-		return;
+		break;
 	case 12:
-		goto LABEL_10;
+		setDoor(38, kCharacterMilos, 3, 10, 9);
+		break;
 	case 17:
 		if (!_gameEvents[kEventMilosCompartmentVisitAugust] && !checkLoc(kCharacterCath, kCarRedSleeping) && getCharacterCurrentParams(kCharacterMilos)[0]) {
 			CONS_Milos_OnRearPlat(0, 0, 0, 0);
 		}
-		return;
+
+		break;
 	case 18:
 		switch (getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8]) {
 		case 1:
@@ -1168,7 +1370,6 @@ void LogicManager::HAND_Milos_InPart2(HAND_PARAMS) {
 			MilosCall(&LogicManager::CONS_Milos_DoDialog, "Mil1118", 0, 0, 0);
 			break;
 		case 2:
-		LABEL_10:
 			setDoor(38, kCharacterMilos, 3, 10, 9);
 			break;
 		case 3:
@@ -1178,10 +1379,13 @@ void LogicManager::HAND_Milos_InPart2(HAND_PARAMS) {
 			getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 4;
 			MilosCall(&LogicManager::CONS_Milos_CompLogic, 15803100, 0, 0, 0);
 			break;
+		default:
+			break;
 		}
-		return;
+
+		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -1196,19 +1400,25 @@ void LogicManager::CONS_Milos_StartPart3(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Milos_StartPart3(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			endGraphics(kCharacterMilos);
-			getCharacter(kCharacterMilos).inventoryItem = 0;
-			getCharacter(kCharacterMilos).clothes = 0;
-			setDoor(38, kCharacterMilos, 3, 10, 9);
-			getCharacterParams(kCharacterMilos, 8)[0] = 0;
-			getCharacterParams(kCharacterMilos, 8)[3] = 0;
+	switch (msg->action) {
+	case 0:
+		if (_gameEvents[kEventMilosCompartmentVisitAugust]) {
+			CONS_Milos_Unfriendly(0, 0, 0, 0);
+		} else {
+			CONS_Milos_OnRearPlat3(0, 0, 0, 0);
 		}
-	} else if (_gameEvents[kEventMilosCompartmentVisitAugust]) {
-		CONS_Milos_Unfriendly(0, 0, 0, 0);
-	} else {
-		CONS_Milos_OnRearPlat3(0, 0, 0, 0);
+
+		break;
+	case 12:
+		endGraphics(kCharacterMilos);
+		getCharacter(kCharacterMilos).inventoryItem = 0;
+		getCharacter(kCharacterMilos).clothes = 0;
+		setDoor(38, kCharacterMilos, 3, 10, 9);
+		getCharacterParams(kCharacterMilos, 8)[0] = 0;
+		getCharacterParams(kCharacterMilos, 8)[3] = 0;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1230,6 +1440,7 @@ void LogicManager::HAND_Milos_OnRearPlat3(HAND_PARAMS) {
 			getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 1;
 			MilosCall(&LogicManager::CONS_Milos_DoWalk, 4, 3050, 0, 0);
 		}
+
 		break;
 	case 12:
 		getCharacter(kCharacterMilos).characterPosition.position = 540;
@@ -1242,6 +1453,7 @@ void LogicManager::HAND_Milos_OnRearPlat3(HAND_PARAMS) {
 			getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 3;
 			MilosCall(&LogicManager::CONS_Milos_DoWalk, 4, 0xBEA, 0, 0);
 		}
+
 		break;
 	case 18:
 		switch (getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8]) {
@@ -1261,11 +1473,12 @@ void LogicManager::HAND_Milos_OnRearPlat3(HAND_PARAMS) {
 			MilosCall(&LogicManager::CONS_Milos_DoCorrOtis, "609Bg", 38, 0, 0);
 			break;
 		default:
-			return;
+			break;
 		}
+
 		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -1282,26 +1495,33 @@ void LogicManager::CONS_Milos_Unfriendly(CONS_PARAMS) {
 void LogicManager::HAND_Milos_Unfriendly(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
+	{
+		bool skip = false;
+
 		if (!getCharacterCurrentParams(kCharacterMilos)[3]) {
 			getCharacterCurrentParams(kCharacterMilos)[3] = _gameTime + 4500;
-			if (_gameTime == -4500)
-				goto LABEL_7;
+			if (_gameTime == -4500) {
+				skip = true;
+				getCharacterCurrentParams(kCharacterMilos)[2] = 1;
+			}
 		}
-		if (getCharacterCurrentParams(kCharacterMilos)[3] < _gameTime) {
+
+		if (!skip && getCharacterCurrentParams(kCharacterMilos)[3] < _gameTime) {
 			getCharacterCurrentParams(kCharacterMilos)[3] = 0x7FFFFFFF;
-		LABEL_7:
 			getCharacterCurrentParams(kCharacterMilos)[2] = 1;
 		}
+
 		if (getCharacterParams(kCharacterMilos, 8)[0]) {
 			getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 1;
 			MilosCall(&LogicManager::CONS_Milos_DoCorrOtis, "609Cg", 38, 0, 0);
-			return;
+			break;
 		}
+
 		if (getCharacterCurrentParams(kCharacterMilos)[0]) {
 			if (getCharacterCurrentParams(kCharacterMilos)[4] || (getCharacterCurrentParams(kCharacterMilos)[4] = _currentGameSessionTicks + 75,
 																  _currentGameSessionTicks != -75)) {
 				if (getCharacterCurrentParams(kCharacterMilos)[4] >= _currentGameSessionTicks)
-					return;
+					break;
 
 				getCharacterCurrentParams(kCharacterMilos)[4] = 0x7FFFFFFF;
 			}
@@ -1313,7 +1533,9 @@ void LogicManager::HAND_Milos_Unfriendly(HAND_PARAMS) {
 		} else {
 			getCharacterCurrentParams(kCharacterMilos)[4] = 0;
 		}
+
 		break;
+	}
 	case 8:
 		if (getCharacterCurrentParams(kCharacterMilos)[0]) {
 			setDoor(38, kCharacterMilos, 3, 0, 0);
@@ -1334,7 +1556,8 @@ void LogicManager::HAND_Milos_Unfriendly(HAND_PARAMS) {
 			getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 6;
 			MilosCall(&LogicManager::CONS_Milos_DoDialog, "LIB012", 0, 0, 0);
 		}
-		return;
+
+		break;
 	case 9:
 		setDoor(38, kCharacterMilos, 3, 0, 0);
 		if (_gameEvents[kEventMilosCompartmentVisitAugust] || _gameTime >= 2106000) {
@@ -1345,13 +1568,14 @@ void LogicManager::HAND_Milos_Unfriendly(HAND_PARAMS) {
 			getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 11;
 			MilosCall(&LogicManager::CONS_Milos_SaveGame, 2, kEventMilosCompartmentVisitAugust, 0, 0);
 		}
-		return;
+
+		break;
 	case 12:
 		getCharacter(kCharacterMilos).characterPosition.position = 3050;
 		getCharacter(kCharacterMilos).characterPosition.location = 1;
 		getCharacter(kCharacterMilos).characterPosition.car = kCarRedSleeping;
 		setDoor(38, kCharacterMilos, 3, 10, 9);
-		return;
+		break;
 	case 17:
 		if (_gameEvents[kEventMilosCompartmentVisitAugust] || checkLoc(kCharacterCath, kCarRedSleeping) || !getCharacterCurrentParams(kCharacterMilos)[2] || _gameTime >= 2106000) {
 			if (getCharacterCurrentParams(kCharacterMilos)[1] || getCharacterCurrentParams(kCharacterMilos)[0]) {
@@ -1362,7 +1586,8 @@ void LogicManager::HAND_Milos_Unfriendly(HAND_PARAMS) {
 		} else {
 			CONS_Milos_OnRearPlat3(0, 0, 0, 0);
 		}
-		return;
+
+		break;
 	case 18:
 		switch (getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8]) {
 		case 1:
@@ -1373,21 +1598,33 @@ void LogicManager::HAND_Milos_Unfriendly(HAND_PARAMS) {
 			MilosCall(&LogicManager::CONS_Milos_LookingForCath, 2223000, 0, 0, 0);
 			break;
 		case 2:
-			if (!getCharacterParams(kCharacterMilos, 8)[1])
-				goto LABEL_47;
+			if (!getCharacterParams(kCharacterMilos, 8)[1]) {
+				getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 4;
+				MilosCall(&LogicManager::CONS_Milos_DoWalk, 4, 3050, 0, 0);
+				break;
+			}
+
 			getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 3;
 			MilosCall(&LogicManager::CONS_Milos_SaveGame, 2, kEventMilosCorridorThanksD, 0, 0);
 			break;
 		case 3:
-			playNIS(((getCharacter(kCharacterMilos).characterPosition.position < getCharacter(kCharacterCath).characterPosition.position) + kEventMilosCorridorThanks));
+			if (getCharacter(kCharacterMilos).characterPosition.position < getCharacter(kCharacterCath).characterPosition.position) {
+				playNIS(kEventMilosCorridorThanksD);
+			} else {
+				playNIS(kEventMilosCorridorThanks);
+			}
+
 			if (getCharacter(kCharacterMilos).characterPosition.car == 4 && nearX(kCharacterMilos, 3050, 500))
 				getCharacter(kCharacterMilos).characterPosition.position = 3550;
+
 			walk(kCharacterMilos, kCarRedSleeping, 3050);
-			if (getCharacter(kCharacterMilos).direction == 2)
+
+			if (getCharacter(kCharacterMilos).direction == 2) {
 				bumpCathRx(getCharacter(kCharacterMilos).characterPosition.car, getCharacter(kCharacterMilos).characterPosition.position + 750);
-			else
+			} else {
 				bumpCathFx(getCharacter(kCharacterMilos).characterPosition.car, getCharacter(kCharacterMilos).characterPosition.position - 750);
-		LABEL_47:
+			}
+
 			getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 4;
 			MilosCall(&LogicManager::CONS_Milos_DoWalk, 4, 3050, 0, 0);
 			break;
@@ -1409,6 +1646,7 @@ void LogicManager::HAND_Milos_Unfriendly(HAND_PARAMS) {
 				getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 7;
 				MilosCall(&LogicManager::CONS_Milos_DoDialog, "Mil1118", 0, 0, 0);
 			}
+
 			break;
 		case 7:
 			setDoor(38, kCharacterMilos, 3, 10, 9);
@@ -1434,11 +1672,12 @@ void LogicManager::HAND_Milos_Unfriendly(HAND_PARAMS) {
 			MilosCall(&LogicManager::CONS_Milos_DoDialog, "MIL1117A", 0, 0, 0);
 			break;
 		default:
-			return;
+			break;
 		}
-		return;
+
+		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -1455,28 +1694,34 @@ void LogicManager::CONS_Milos_Friendly(CONS_PARAMS) {
 void LogicManager::HAND_Milos_Friendly(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
-		if (_gameEvents[kEventMilosCompartmentVisitTyler] || _gameProgress[kProgressField54] || getCharacterParams(kCharacterMilos, 8)[3]) {
-			goto LABEL_11;
-		}
-		if (!getCharacterCurrentParams(kCharacterMilos)[2]) {
-			getCharacterCurrentParams(kCharacterMilos)[2] = _gameTime + 13500;
-			if (_gameTime == -13500)
-				goto LABEL_10;
-		}
-		if (getCharacterCurrentParams(kCharacterMilos)[2] < _gameTime) {
-			getCharacterCurrentParams(kCharacterMilos)[2] = 0x7FFFFFFF;
-		LABEL_10:
-			send(kCharacterMilos, kCharacterVesna, 155913424, 0);
-			getCharacterCurrentParams(kCharacterMilos)[2] = 0;
+		if (!_gameEvents[kEventMilosCompartmentVisitTyler] && !_gameProgress[kProgressField54] && !getCharacterParams(kCharacterMilos, 8)[3]) {
+			bool skip = false;
+
+			if (!getCharacterCurrentParams(kCharacterMilos)[2]) {
+				getCharacterCurrentParams(kCharacterMilos)[2] = _gameTime + 13500;
+				if (_gameTime == -13500) {
+					skip = true;
+					send(kCharacterMilos, kCharacterVesna, 155913424, 0);
+					getCharacterCurrentParams(kCharacterMilos)[2] = 0;
+				}
+			}
+
+			if (!skip && getCharacterCurrentParams(kCharacterMilos)[2] < _gameTime) {
+				getCharacterCurrentParams(kCharacterMilos)[2] = 0x7FFFFFFF;
+				send(kCharacterMilos, kCharacterVesna, 155913424, 0);
+				getCharacterCurrentParams(kCharacterMilos)[2] = 0;
+			}
 		}
-	LABEL_11:
+
 		if (getCharacterCurrentParams(kCharacterMilos)[0]) {
 			if (getCharacterCurrentParams(kCharacterMilos)[3] || (getCharacterCurrentParams(kCharacterMilos)[3] = _currentGameSessionTicks + 75,
 																	_currentGameSessionTicks != -75)) {
 				if (getCharacterCurrentParams(kCharacterMilos)[3] >= _currentGameSessionTicks)
-					return;
+					break;
+
 				getCharacterCurrentParams(kCharacterMilos)[3] = 0x7FFFFFFF;
 			}
+
 			getCharacterCurrentParams(kCharacterMilos)[0] = 0;
 			getCharacterCurrentParams(kCharacterMilos)[1] = 1;
 			setDoor(38, kCharacterMilos, 1, 0, 0);
@@ -1484,6 +1729,7 @@ void LogicManager::HAND_Milos_Friendly(HAND_PARAMS) {
 		} else {
 			getCharacterCurrentParams(kCharacterMilos)[3] = 0;
 		}
+
 		break;
 	case 8:
 	case 9:
@@ -1506,20 +1752,23 @@ void LogicManager::HAND_Milos_Friendly(HAND_PARAMS) {
 				MilosCall(&LogicManager::CONS_Milos_DoDialog, "LIB013", 0, 0, 0);
 			}
 		}
-		return;
+
+		break;
 	case 12:
 		setDoor(38, kCharacterMilos, 3, 10, 9);
 		if (!_gameEvents[kEventMilosCompartmentVisitTyler] && !_gameProgress[kProgressField54] && !getCharacterParams(kCharacterMilos, 8)[3]) {
 			send(kCharacterMilos, kCharacterVesna, 155913424, 0);
 		}
-		return;
+
+		break;
 	case 17:
 		if (getCharacterCurrentParams(kCharacterMilos)[1] || getCharacterCurrentParams(kCharacterMilos)[0]) {
 			setDoor(38, kCharacterMilos, 3, 10, 9);
 			getCharacterCurrentParams(kCharacterMilos)[1] = 0;
 			getCharacterCurrentParams(kCharacterMilos)[0] = 0;
 		}
-		return;
+
+		break;
 	case 18:
 		switch (getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8]) {
 		case 1:
@@ -1528,22 +1777,26 @@ void LogicManager::HAND_Milos_Friendly(HAND_PARAMS) {
 				getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 3;
 				MilosCall(&LogicManager::CONS_Milos_DoDialog, "VES1015A", 0, 0, 0);
 			} else {
-				if (_gameEvents[kEventMilosCompartmentVisitTyler] || getCharacterParams(kCharacterMilos, 8)[3])
-					goto LABEL_40;
+				if (_gameEvents[kEventMilosCompartmentVisitTyler] || getCharacterParams(kCharacterMilos, 8)[3]) {
+					setDoor(38, kCharacterMilos, 1, 10, 9);
+					break;
+				}
+
 				forceJump(kCharacterVesna, &LogicManager::CONS_Vesna_InComp);
 				getCharacter(kCharacterCath).characterPosition.location = 1;
 				getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 4;
 				MilosCall(&LogicManager::CONS_Milos_SaveGame, 2, kEventMilosCompartmentVisitTyler, 0, 0);
 			}
+
 			break;
 		case 3:
 			setDoor(38, kCharacterMilos, 1, 14, 0);
 			getCharacterCurrentParams(kCharacterMilos)[0] = 1;
-			goto LABEL_40;
+			setDoor(38, kCharacterMilos, 1, 10, 9);
+			break;
 		case 4:
 			playNIS(kEventMilosCompartmentVisitTyler);
 			bumpCath(kCarRestaurant, 5, 255);
-		LABEL_40:
 			setDoor(38, kCharacterMilos, 1, 10, 9);
 			break;
 		case 5:
@@ -1551,11 +1804,12 @@ void LogicManager::HAND_Milos_Friendly(HAND_PARAMS) {
 			getCharacterCurrentParams(kCharacterMilos)[1] = 1;
 			break;
 		default:
-			return;
+			break;
 		}
-		return;
+
+		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -1572,60 +1826,78 @@ void LogicManager::CONS_Milos_LookingForCath(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Milos_LookingForCath(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			getCharacterParams(kCharacterMilos, 8)[1] = 0;
-			getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 1;
-			MilosCall(&LogicManager::CONS_Milos_DoWalkSearchingForCath, 4, 540, 0, 0);
-		} else if (msg->action == 18) {
-			switch (getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8]) {
-			case 1:
-				if (!getCharacterParams(kCharacterMilos, 8)[1])
-					goto LABEL_23;
-				goto LABEL_22;
-			case 2:
-			case 3:
-				if (getCharacterParams(kCharacterMilos, 8)[1])
-					goto LABEL_22;
-				endGraphics(kCharacterMilos);
-				getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 4;
-				MilosCall(&LogicManager::CONS_Milos_DoWait, 450, 0, 0, 0);
-				break;
-			case 4:
-				getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 5;
-				MilosCall(&LogicManager::CONS_Milos_DoWalkSearchingForCath, 4, 540, 0, 0);
-				return;
-			case 5:
-				if (getCharacterParams(kCharacterMilos, 8)[1]) {
-				LABEL_22:
-					getCharacter(kCharacterMilos).currentCall--;
-					_engine->getMessageManager()->setMessageHandle(kCharacterMilos, _functionsMilos[getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall]]);
-					fedEx(kCharacterMilos, kCharacterMilos, 18, 0);
+	switch (msg->action) {
+	case 0:
+		if (getCharacterCurrentParams(kCharacterMilos)[0] >= _gameTime || getCharacterCurrentParams(kCharacterMilos)[1]) {
+			if (cathInCorridor(kCarGreenSleeping) || cathInCorridor(kCarRedSleeping)) {
+				if (checkLoc(kCharacterCath, kCarGreenSleeping)) {
+					getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 2;
+					MilosCall(&LogicManager::CONS_Milos_DoWalkSearchingForCath, 3, 540, 0, 0);
 				} else {
-				LABEL_23:
-					endGraphics(kCharacterMilos);
+					getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 3;
+					MilosCall(&LogicManager::CONS_Milos_DoWalkSearchingForCath, 4, 9460, 0, 0);
 				}
-				break;
-			default:
-				return;
 			}
+		} else {
+			getCharacterCurrentParams(kCharacterMilos)[1] = 1;
+
+			getCharacter(kCharacterMilos).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterMilos, _functionsMilos[getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall]]);
+			fedEx(kCharacterMilos, kCharacterMilos, 18, 0);
 		}
-	} else if (getCharacterCurrentParams(kCharacterMilos)[0] >= _gameTime || getCharacterCurrentParams(kCharacterMilos)[1]) {
-		if (cathInCorridor(kCarGreenSleeping) || cathInCorridor(kCarRedSleeping)) {
-			if (checkLoc(kCharacterCath, kCarGreenSleeping)) {
-				getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 2;
-				MilosCall(&LogicManager::CONS_Milos_DoWalkSearchingForCath, 3, 540, 0, 0);
+
+		break;
+	case 12:
+		getCharacterParams(kCharacterMilos, 8)[1] = 0;
+		getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 1;
+		MilosCall(&LogicManager::CONS_Milos_DoWalkSearchingForCath, 4, 540, 0, 0);
+		break;
+	case 18:
+		switch (getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8]) {
+		case 1:
+			if (getCharacterParams(kCharacterMilos, 8)[1]) {
+				getCharacter(kCharacterMilos).currentCall--;
+				_engine->getMessageManager()->setMessageHandle(kCharacterMilos, _functionsMilos[getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall]]);
+				fedEx(kCharacterMilos, kCharacterMilos, 18, 0);
 			} else {
-				getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 3;
-				MilosCall(&LogicManager::CONS_Milos_DoWalkSearchingForCath, 4, 9460, 0, 0);
+				endGraphics(kCharacterMilos);
+			}
+
+			break;
+		case 2:
+		case 3:
+			if (getCharacterParams(kCharacterMilos, 8)[1]) {
+				getCharacter(kCharacterMilos).currentCall--;
+				_engine->getMessageManager()->setMessageHandle(kCharacterMilos, _functionsMilos[getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall]]);
+				fedEx(kCharacterMilos, kCharacterMilos, 18, 0);
+			} else {
+				endGraphics(kCharacterMilos);
+				getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 4;
+				MilosCall(&LogicManager::CONS_Milos_DoWait, 450, 0, 0, 0);
+			}
+
+			break;
+		case 4:
+			getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 5;
+			MilosCall(&LogicManager::CONS_Milos_DoWalkSearchingForCath, 4, 540, 0, 0);
+			break;
+		case 5:
+			if (getCharacterParams(kCharacterMilos, 8)[1]) {
+				getCharacter(kCharacterMilos).currentCall--;
+				_engine->getMessageManager()->setMessageHandle(kCharacterMilos, _functionsMilos[getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall]]);
+				fedEx(kCharacterMilos, kCharacterMilos, 18, 0);
+			} else {
+				endGraphics(kCharacterMilos);
 			}
+
+			break;
+		default:
+			break;
 		}
-	} else {
-		getCharacterCurrentParams(kCharacterMilos)[1] = 1;
 
-		getCharacter(kCharacterMilos).currentCall--;
-		_engine->getMessageManager()->setMessageHandle(kCharacterMilos, _functionsMilos[getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall]]);
-		fedEx(kCharacterMilos, kCharacterMilos, 18, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1643,18 +1915,13 @@ void LogicManager::CONS_Milos_DoWalkSearchingForCath(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Milos_DoWalkSearchingForCath(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12 && walk(kCharacterMilos, getCharacterCurrentParams(kCharacterMilos)[0], getCharacterCurrentParams(kCharacterMilos)[1]))
-			goto LABEL_13;
-	} else {
+	switch (msg->action) {
+	case 0:
 		if (walk(kCharacterMilos, getCharacterCurrentParams(kCharacterMilos)[0], getCharacterCurrentParams(kCharacterMilos)[1])) {
-		LABEL_13:
 			getCharacter(kCharacterMilos).currentCall--;
 			_engine->getMessageManager()->setMessageHandle(kCharacterMilos, _functionsMilos[getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall]]);
 			fedEx(kCharacterMilos, kCharacterMilos, 18, 0);
-			return;
-		}
-		if (nearChar(kCharacterMilos, kCharacterCath, 1000) && !onLowPlatform(kCharacterCath) && !inComp(kCharacterCath) && !whoOutside(kCharacterCath)) {
+		} else if (nearChar(kCharacterMilos, kCharacterCath, 1000) && !onLowPlatform(kCharacterCath) && !inComp(kCharacterCath) && !whoOutside(kCharacterCath)) {
 			if (getCharacter(kCharacterMilos).characterPosition.car == kCarGreenSleeping || getCharacter(kCharacterMilos).characterPosition.car == kCarRedSleeping) {
 				getCharacterParams(kCharacterMilos, 8)[1] = 1;
 
@@ -1663,6 +1930,18 @@ void LogicManager::HAND_Milos_DoWalkSearchingForCath(HAND_PARAMS) {
 				fedEx(kCharacterMilos, kCharacterMilos, 18, 0);
 			}
 		}
+
+		break;
+	case 12:
+		if (walk(kCharacterMilos, getCharacterCurrentParams(kCharacterMilos)[0], getCharacterCurrentParams(kCharacterMilos)[1])) {
+			getCharacter(kCharacterMilos).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterMilos, _functionsMilos[getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall]]);
+			fedEx(kCharacterMilos, kCharacterMilos, 18, 0);
+		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1677,16 +1956,19 @@ void LogicManager::CONS_Milos_StartPart4(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Milos_StartPart4(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			endGraphics(kCharacterMilos);
-			getCharacter(kCharacterMilos).characterPosition.position = 3050;
-			getCharacter(kCharacterMilos).characterPosition.location = 1;
-			getCharacter(kCharacterMilos).characterPosition.car = kCarRedSleeping;
-			getCharacter(kCharacterMilos).inventoryItem = 0;
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		CONS_Milos_Conspiring(0, 0, 0, 0);
+		break;
+	case 12:
+		endGraphics(kCharacterMilos);
+		getCharacter(kCharacterMilos).characterPosition.position = 3050;
+		getCharacter(kCharacterMilos).characterPosition.location = 1;
+		getCharacter(kCharacterMilos).characterPosition.car = kCarRedSleeping;
+		getCharacter(kCharacterMilos).inventoryItem = 0;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1701,24 +1983,42 @@ void LogicManager::CONS_Milos_Conspiring(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Milos_Conspiring(HAND_PARAMS) {
-	if (msg->action > 18) {
-		if (msg->action > 123852928) {
-			if (msg->action == 135600432) {
-				getCharacterCurrentParams(kCharacterMilos)[1] = 1;
-			} else if (msg->action == 221683008) {
-				if (whoRunningDialog(kCharacterMilos))
-					fadeDialog(kCharacterMilos);
-				getCharacterCurrentParams(kCharacterMilos)[0] = 1;
-				send(kCharacterMilos, kCharacterCond2, 123199584, 0);
+	switch (msg->action) {
+	case 0:
+		if (!getCharacterCurrentParams(kCharacterMilos)[0]) {
+			if (getCharacterCurrentParams(kCharacterMilos)[1]) {
+				CONS_Milos_InCharge(0, 0, 0, 0);
+			} else {
+				if (_gameTime > 2356200 && !getCharacterCurrentParams(kCharacterMilos)[2]) {
+					getCharacterCurrentParams(kCharacterMilos)[2] = 1;
+					playDialog(kCharacterMilos, "Mil4013", -1, 0);
+					if (nearChar(kCharacterMilos, kCharacterCath, 2000))
+						_gameProgress[kProgressField94] = 1;
+				}
+
+				if (_gameTime > 2360700 && !getCharacterCurrentParams(kCharacterMilos)[3]) {
+					getCharacterCurrentParams(kCharacterMilos)[3] = 1;
+					playDialog(kCharacterMilos, "Mil4014", -1, 0);
+					if (nearChar(kCharacterMilos, kCharacterCath, 2000))
+						_gameProgress[kProgressField94] = 1;
+				}
+
+				if (_gameTime > 2370600 && !getCharacterCurrentParams(kCharacterMilos)[4]) {
+					getCharacterCurrentParams(kCharacterMilos)[4] = 1;
+					playDialog(kCharacterMilos, "Mil4015", -1, 0);
+					if (nearChar(kCharacterMilos, kCharacterCath, 2000))
+						_gameProgress[kProgressField94] = 1;
+				}
+
+				if (_gameTime > 2407500 && !getCharacterCurrentParams(kCharacterMilos)[5]) {
+					getCharacterCurrentParams(kCharacterMilos)[5] = 1;
+					send(kCharacterMilos, kCharacterVesna, 55996766, 0);
+				}
 			}
-		} else if (msg->action == 123852928) {
-			getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 2;
-			MilosCall(&LogicManager::CONS_Milos_DoCorrOtis, "611Dg", 38, 0, 0);
-		} else if (msg->action == 122865568) {
-			getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 1;
-			MilosCall(&LogicManager::CONS_Milos_DoCorrOtis, "611Bg", 38, 0, 0);
 		}
-	} else if (msg->action == 18) {
+
+		break;
+	case 18:
 		if (getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] == 1) {
 			getCharacter(kCharacterMilos).characterPosition.location = 0;
 			startCycOtis(kCharacterMilos, "611Cg");
@@ -1731,33 +2031,28 @@ void LogicManager::HAND_Milos_Conspiring(HAND_PARAMS) {
 			endGraphics(kCharacterMilos);
 			getCharacterCurrentParams(kCharacterMilos)[0] = 0;
 		}
-	} else if (msg->action == 0 && !getCharacterCurrentParams(kCharacterMilos)[0]) {
-		if (getCharacterCurrentParams(kCharacterMilos)[1]) {
-			CONS_Milos_InCharge(0, 0, 0, 0);
-		} else {
-			if (_gameTime > 2356200 && !getCharacterCurrentParams(kCharacterMilos)[2]) {
-				getCharacterCurrentParams(kCharacterMilos)[2] = 1;
-				playDialog(kCharacterMilos, "Mil4013", -1, 0);
-				if (nearChar(kCharacterMilos, kCharacterCath, 2000))
-					_gameProgress[kProgressField94] = 1;
-			}
-			if (_gameTime > 2360700 && !getCharacterCurrentParams(kCharacterMilos)[3]) {
-				getCharacterCurrentParams(kCharacterMilos)[3] = 1;
-				playDialog(kCharacterMilos, "Mil4014", -1, 0);
-				if (nearChar(kCharacterMilos, kCharacterCath, 2000))
-					_gameProgress[kProgressField94] = 1;
-			}
-			if (_gameTime > 2370600 && !getCharacterCurrentParams(kCharacterMilos)[4]) {
-				getCharacterCurrentParams(kCharacterMilos)[4] = 1;
-				playDialog(kCharacterMilos, "Mil4015", -1, 0);
-				if (nearChar(kCharacterMilos, kCharacterCath, 2000))
-					_gameProgress[kProgressField94] = 1;
-			}
-			if (_gameTime > 2407500 && !getCharacterCurrentParams(kCharacterMilos)[5]) {
-				getCharacterCurrentParams(kCharacterMilos)[5] = 1;
-				send(kCharacterMilos, kCharacterVesna, 55996766, 0);
-			}
-		}
+
+		break;
+	case 122865568:
+		getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 1;
+		MilosCall(&LogicManager::CONS_Milos_DoCorrOtis, "611Bg", 38, 0, 0);
+		break;
+	case 123852928:
+		getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 2;
+		MilosCall(&LogicManager::CONS_Milos_DoCorrOtis, "611Dg", 38, 0, 0);
+		break;
+	case 135600432:
+		getCharacterCurrentParams(kCharacterMilos)[1] = 1;
+		break;
+	case 221683008:
+		if (whoRunningDialog(kCharacterMilos))
+			fadeDialog(kCharacterMilos);
+
+		getCharacterCurrentParams(kCharacterMilos)[0] = 1;
+		send(kCharacterMilos, kCharacterCond2, 123199584, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1772,10 +2067,12 @@ void LogicManager::CONS_Milos_InCharge(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Milos_InCharge(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 1;
 		MilosCall(&LogicManager::CONS_Milos_CompLogic, 2410200, 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8]) {
 		case 1:
 			send(kCharacterMilos, kCharacterIvo, 55996766, 0);
@@ -1790,7 +2087,13 @@ void LogicManager::HAND_Milos_InCharge(HAND_PARAMS) {
 		case 3:
 			CONS_Milos_LeaveComp4(0, 0, 0, 0);
 			break;
+		default:
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1805,10 +2108,12 @@ void LogicManager::CONS_Milos_LeaveComp4(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Milos_LeaveComp4(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 1;
 		MilosCall(&LogicManager::CONS_Milos_DoCorrOtis, "609CG", 38, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		if (getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] == 1) {
 			getCharacter(kCharacterMilos).characterPosition.location = 0;
 			setDoor(38, kCharacterCath, 3, 10, 9);
@@ -1817,6 +2122,10 @@ void LogicManager::HAND_Milos_LeaveComp4(HAND_PARAMS) {
 		} else if (getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] == 2) {
 			CONS_Milos_EndPart4(0, 0, 0, 0);
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1831,13 +2140,17 @@ void LogicManager::CONS_Milos_EndPart4(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Milos_EndPart4(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		endGraphics(kCharacterMilos);
 		setDoor(38, kCharacterCath, 3, 10, 9);
 		getCharacter(kCharacterMilos).characterPosition.location = 1;
 		getCharacter(kCharacterMilos).characterPosition.position = 540;
 		getCharacter(kCharacterMilos).characterPosition.car = kCarCoalTender;
 		getCharacter(kCharacterMilos).inventoryItem = 0;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1852,16 +2165,18 @@ void LogicManager::CONS_Milos_StartPart5(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Milos_StartPart5(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			endGraphics(kCharacterMilos);
-			getCharacter(kCharacterMilos).characterPosition.location = 1;
-			getCharacter(kCharacterMilos).characterPosition.position = 540;
-			getCharacter(kCharacterMilos).characterPosition.car = kCarCoalTender;
-			getCharacter(kCharacterMilos).inventoryItem = 0;
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		CONS_Milos_RunningTrain(0, 0, 0, 0);
+	case 12:
+		endGraphics(kCharacterMilos);
+		getCharacter(kCharacterMilos).characterPosition.location = 1;
+		getCharacter(kCharacterMilos).characterPosition.position = 540;
+		getCharacter(kCharacterMilos).characterPosition.car = kCarCoalTender;
+		getCharacter(kCharacterMilos).inventoryItem = 0;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1876,32 +2191,17 @@ void LogicManager::CONS_Milos_RunningTrain(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Milos_RunningTrain(HAND_PARAMS) {
-	if (msg->action > 18) {
-		if (msg->action == 168646401) {
-			if (_gameEvents[kEventLocomotiveMilosShovelingDay] || _gameEvents[kEventLocomotiveMilosShovelingNight]) {
-				if (!_gameEvents[kEventLocomotiveMilosDay] && !_gameEvents[kEventLocomotiveMilosNight]) {
-					if (_gameProgress[kProgressIsDayTime] && _gameTime < 2943000)
-						_gameTime = 2943000;
-					getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 2;
-					MilosCall(&LogicManager::CONS_Milos_SaveGame, 2, kEventLocomotiveMilosDay, 0, 0);
-				}
-			} else {
-				getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 1;
-				MilosCall(&LogicManager::CONS_Milos_SaveGame, 2, kEventLocomotiveMilosShovelingDay, 0, 0);
-			}
-		} else if (msg->action == 169773228) {
-			if (_gameProgress[14]) {
-				fadeDialog(kCharacterMilos);
-				if (_gameTime < 2949300)
-					_gameTime = 2949300;
-				getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 4;
-				MilosCall(&LogicManager::CONS_Milos_SaveGame, 2, kEventLocomotiveRestartTrain, 0, 0);
-			} else {
-				getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 3;
-				MilosCall(&LogicManager::CONS_Milos_SaveGame, 2, kEventLocomotiveAnnaStopsTrain, 0, 0);
-			}
+	switch (msg->action) {
+	case 2:
+		if (_gameProgress[kProgressIsDayTime]) {
+			endGame(0, 0, 52, true);
+		} else {
+			getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 6;
+			MilosCall(&LogicManager::CONS_Milos_SaveGame, 2, kEventTrainStopped, 0, 0);
 		}
-	} else if (msg->action == 18) {
+
+		break;
+	case 18:
 		switch (getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8]) {
 		case 1:
 			playNIS(((_gameProgress[kProgressIsDayTime] == kProgressField0) + kEventLocomotiveMilosShovelingDay));
@@ -1910,8 +2210,10 @@ void LogicManager::HAND_Milos_RunningTrain(HAND_PARAMS) {
 		case 2:
 			if (dialogRunning("MUS050"))
 				fadeDialog("MUS050");
+
 			if (dialogRunning("ARRIVE"))
 				endDialog("ARRIVE");
+
 			_engine->getSoundManager()->endAmbient();
 			playNIS(((_gameProgress[kProgressIsDayTime] == kProgressField0) + kEventLocomotiveMilosDay));
 			claimNISLink(kCharacterMilos);
@@ -1919,7 +2221,7 @@ void LogicManager::HAND_Milos_RunningTrain(HAND_PARAMS) {
 			break;
 		case 3:
 			playNIS(kEventLocomotiveAnnaStopsTrain);
-			endGame(3, 108, 51, 1);
+			endGame(3, 108, 51, true);
 			break;
 		case 4:
 			playNIS(kEventLocomotiveRestartTrain);
@@ -1936,18 +2238,42 @@ void LogicManager::HAND_Milos_RunningTrain(HAND_PARAMS) {
 			break;
 		case 6:
 			playNIS(kEventTrainStopped);
-			endGame(0, 1, 51, 1);
+			endGame(0, 1, 51, true);
 			break;
 		default:
-			return;
+			break;
+		}
+
+		break;
+	case 168646401:
+		if (_gameEvents[kEventLocomotiveMilosShovelingDay] || _gameEvents[kEventLocomotiveMilosShovelingNight]) {
+			if (!_gameEvents[kEventLocomotiveMilosDay] && !_gameEvents[kEventLocomotiveMilosNight]) {
+				if (_gameProgress[kProgressIsDayTime] && _gameTime < 2943000)
+					_gameTime = 2943000;
+				getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 2;
+				MilosCall(&LogicManager::CONS_Milos_SaveGame, 2, kEventLocomotiveMilosDay, 0, 0);
+			}
+		} else {
+			getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 1;
+			MilosCall(&LogicManager::CONS_Milos_SaveGame, 2, kEventLocomotiveMilosShovelingDay, 0, 0);
 		}
-	} else if (msg->action == 2) {
+
+		break;
+	case 169773228:
 		if (_gameProgress[kProgressIsDayTime]) {
-			endGame(0, 0, 52, 1);
+			fadeDialog(kCharacterMilos);
+			if (_gameTime < 2949300)
+				_gameTime = 2949300;
+			getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 4;
+			MilosCall(&LogicManager::CONS_Milos_SaveGame, 2, kEventLocomotiveRestartTrain, 0, 0);
 		} else {
-			getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 6;
-			MilosCall(&LogicManager::CONS_Milos_SaveGame, 2, kEventTrainStopped, 0, 0);
+			getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 3;
+			MilosCall(&LogicManager::CONS_Milos_SaveGame, 2, kEventLocomotiveAnnaStopsTrain, 0, 0);
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1962,8 +2288,12 @@ void LogicManager::CONS_Milos_Dead(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Milos_Dead(HAND_PARAMS) {
-	if (msg->action == 12)
-		endGraphics(14);
+	switch (msg->action) {
+	case 12:
+		endGraphics(kCharacterMilos);
+	default:
+		break;
+	}
 }
 
 void (LogicManager::*LogicManager::_functionsMilos[])(HAND_PARAMS) = {


Commit: 7f1fe3eab386932573229fd0678aae4352233655
    https://github.com/scummvm/scummvm/commit/7f1fe3eab386932573229fd0678aae4352233655
Author: AndywinXp (andywinxp at gmail.com)
Date: 2025-06-16T23:12:18+02:00

Commit Message:
LASTEXPRESS: Clean up Vesna logic

Changed paths:
    engines/lastexpress/characters/vesna.cpp


diff --git a/engines/lastexpress/characters/vesna.cpp b/engines/lastexpress/characters/vesna.cpp
index b1af56b88b2..682d98b65fe 100644
--- a/engines/lastexpress/characters/vesna.cpp
+++ b/engines/lastexpress/characters/vesna.cpp
@@ -48,7 +48,7 @@ void LogicManager::CONS_Vesna(int chapter) {
 		CONS_Vesna_StartPart5(0, 0, 0, 0);
 		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -69,19 +69,25 @@ void LogicManager::CONS_Vesna_DebugWalks(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Vesna_DebugWalks(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			getCharacter(kCharacterVesna).characterPosition.position = 0;
-			getCharacter(kCharacterVesna).characterPosition.location = 0;
-			getCharacter(kCharacterVesna).characterPosition.car = kCarGreenSleeping;
-			getCharacterCurrentParams(kCharacterVesna)[0] = 10000;
-		}
-	} else if (walk(kCharacterVesna, kCarGreenSleeping, getCharacterCurrentParams(kCharacterVesna)[0])) {
-		if (getCharacterCurrentParams(kCharacterVesna)[0] == 10000) {
-			getCharacterCurrentParams(kCharacterVesna)[0] = 0;
-		} else {
-			getCharacterCurrentParams(kCharacterVesna)[0] = 10000;
+	switch (msg->action) {
+	case 0:
+		if (walk(kCharacterVesna, kCarGreenSleeping, getCharacterCurrentParams(kCharacterVesna)[0])) {
+			if (getCharacterCurrentParams(kCharacterVesna)[0] == 10000) {
+				getCharacterCurrentParams(kCharacterVesna)[0] = 0;
+			} else {
+				getCharacterCurrentParams(kCharacterVesna)[0] = 10000;
+			}
 		}
+
+		break;
+	case 12:
+		getCharacter(kCharacterVesna).characterPosition.position = 0;
+		getCharacter(kCharacterVesna).characterPosition.location = 0;
+		getCharacter(kCharacterVesna).characterPosition.car = kCarGreenSleeping;
+		getCharacterCurrentParams(kCharacterVesna)[0] = 10000;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -98,12 +104,17 @@ void LogicManager::CONS_Vesna_DoDialog(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Vesna_DoDialog(HAND_PARAMS) {
-	if (msg->action == 2) {
+	switch (msg->action) {
+	case 2:
 		getCharacter(kCharacterVesna).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterVesna, _functionsVesna[getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall]]);
 		fedEx(kCharacterVesna, kCharacterVesna, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		playDialog(kCharacterVesna, (char *)&getCharacterCurrentParams(kCharacterVesna)[0], -1, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -122,15 +133,20 @@ void LogicManager::CONS_Vesna_DoCorrOtis(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Vesna_DoCorrOtis(HAND_PARAMS) {
-	if (msg->action == 3) {
+	switch (msg->action) {
+	case 3:
 		releaseAtDoor(kCharacterVesna, getCharacterCurrentParams(kCharacterVesna)[3]);
 
 		getCharacter(kCharacterVesna).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterVesna, _functionsVesna[getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall]]);
 		fedEx(kCharacterVesna, kCharacterVesna, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		startSeqOtis(kCharacterVesna, (char *)&getCharacterCurrentParams(kCharacterVesna)[0]);
 		blockAtDoor(kCharacterVesna, getCharacterCurrentParams(kCharacterVesna)[3]);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -147,12 +163,17 @@ void LogicManager::CONS_Vesna_DoSeqOtis(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Vesna_DoSeqOtis(HAND_PARAMS) {
-	if (msg->action == 3) {
+	switch (msg->action) {
+	case 3:
 		getCharacter(kCharacterVesna).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterVesna, _functionsVesna[getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall]]);
 		fedEx(kCharacterVesna, kCharacterVesna, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		startSeqOtis(kCharacterVesna, (char *)&getCharacterCurrentParams(kCharacterVesna)[0]);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -178,6 +199,7 @@ void LogicManager::HAND_Vesna_DoWalk(HAND_PARAMS) {
 			_engine->getMessageManager()->setMessageHandle(kCharacterVesna, _functionsVesna[getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall]]);
 			fedEx(kCharacterVesna, kCharacterVesna, 18, 0);
 		}
+
 		break;
 	case 5:
 		if (rnd(2) == 0) {
@@ -208,17 +230,22 @@ void LogicManager::CONS_Vesna_DoWait(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Vesna_DoWait(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		if (getCharacterCurrentParams(kCharacterVesna)[1] || (getCharacterCurrentParams(kCharacterVesna)[1] = _gameTime + getCharacterCurrentParams(kCharacterVesna)[0],
 															  _gameTime + getCharacterCurrentParams(kCharacterVesna)[0] != 0)) {
 			if (getCharacterCurrentParams(kCharacterVesna)[1] >= _gameTime)
-				return;
+				break;
+
 			getCharacterCurrentParams(kCharacterVesna)[1] = 0x7FFFFFFF;
 		}
 
 		getCharacter(kCharacterVesna).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterVesna, _functionsVesna[getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall]]);
 		fedEx(kCharacterVesna, kCharacterVesna, 18, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -236,32 +263,36 @@ void LogicManager::CONS_Vesna_DoWalkBehind(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Vesna_DoWalkBehind(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action != 12) {
-			if (msg->action == 123668192) {
-				getCharacter(kCharacterVesna).currentCall--;
-				_engine->getMessageManager()->setMessageHandle(kCharacterVesna, _functionsVesna[getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall]]);
-				fedEx(kCharacterVesna, kCharacterVesna, 18, 0);
-			}
-			return;
+	switch (msg->action) {
+	case 0:
+		getCharacterCurrentParams(kCharacterVesna)[2] = 0;
+
+		if (nearChar(kCharacterVesna, kCharacterMilos, 500) ||
+			(getCharacter(kCharacterVesna).direction == 1) &&
+				((getCharacter(kCharacterVesna).characterPosition.car > getCharacter(kCharacterMilos).characterPosition.car) ||
+				 getCharacter(kCharacterVesna).characterPosition.car == getCharacter(kCharacterMilos).characterPosition.car && getCharacter(kCharacterVesna).characterPosition.position > getCharacter(kCharacterMilos).characterPosition.position) ||
+			getCharacter(kCharacterVesna).direction == 2 && ((getCharacter(kCharacterVesna).characterPosition.car < getCharacter(kCharacterMilos).characterPosition.car) ||
+															 getCharacter(kCharacterVesna).characterPosition.car == getCharacter(kCharacterMilos).characterPosition.car && getCharacter(kCharacterVesna).characterPosition.position < getCharacter(kCharacterMilos).characterPosition.position)) {
+
+			getCharacter(kCharacterVesna).waitedTicksUntilCycleRestart = 0;
+			getCharacterCurrentParams(kCharacterVesna)[2] = 1;
 		}
 
+		if (!getCharacterCurrentParams(kCharacterVesna)[2]) {
+			walk(kCharacterVesna, getCharacterCurrentParams(kCharacterVesna)[0], getCharacterCurrentParams(kCharacterVesna)[1]);
+		}
+
+		break;
+	case 12:
 		walk(kCharacterVesna, getCharacterCurrentParams(kCharacterVesna)[0], getCharacterCurrentParams(kCharacterVesna)[1]);
-		return;
-	}
-	getCharacterCurrentParams(kCharacterVesna)[2] = 0;
-	if (nearChar(kCharacterVesna, kCharacterMilos, 500) ||
-		(getCharacter(kCharacterVesna).direction == 1) &&
-			((getCharacter(kCharacterVesna).characterPosition.car > getCharacter(kCharacterMilos).characterPosition.car) ||
-			 getCharacter(kCharacterVesna).characterPosition.car == getCharacter(kCharacterMilos).characterPosition.car && getCharacter(kCharacterVesna).characterPosition.position > getCharacter(kCharacterMilos).characterPosition.position) ||
-		getCharacter(kCharacterVesna).direction == 2 && ((getCharacter(kCharacterVesna).characterPosition.car < getCharacter(kCharacterMilos).characterPosition.car) ||
-			getCharacter(kCharacterVesna).characterPosition.car == getCharacter(kCharacterMilos).characterPosition.car && getCharacter(kCharacterVesna).characterPosition.position < getCharacter(kCharacterMilos).characterPosition.position)) {
-
-		getCharacter(kCharacterVesna).waitedTicksUntilCycleRestart = 0;
-		getCharacterCurrentParams(kCharacterVesna)[2] = 1;
-	}
-	if (!getCharacterCurrentParams(kCharacterVesna)[2]) {
-		walk(kCharacterVesna, getCharacterCurrentParams(kCharacterVesna)[0], getCharacterCurrentParams(kCharacterVesna)[1]);
+		break;
+	case 123668192:
+		getCharacter(kCharacterVesna).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterVesna, _functionsVesna[getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall]]);
+		fedEx(kCharacterVesna, kCharacterVesna, 18, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -276,10 +307,18 @@ void LogicManager::CONS_Vesna_WaitRCClear(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Vesna_WaitRCClear(HAND_PARAMS) {
-	if ((msg->action == 0 && rcClear()) || (msg->action == 12 && rcClear())) {
-		getCharacter(kCharacterVesna).currentCall--;
-		_engine->getMessageManager()->setMessageHandle(kCharacterVesna, _functionsVesna[getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall]]);
-		fedEx(kCharacterVesna, kCharacterVesna, 18, 0);
+	switch (msg->action) {
+	case 0:
+	case 12:
+		if (rcClear()) {
+			getCharacter(kCharacterVesna).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterVesna, _functionsVesna[getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall]]);
+			fedEx(kCharacterVesna, kCharacterVesna, 18, 0);
+		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -294,16 +333,22 @@ void LogicManager::CONS_Vesna_FinishSeqOtis(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Vesna_FinishSeqOtis(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		if (getCharacter(kCharacterVesna).direction != 4) {
 			getCharacter(kCharacterVesna).currentCall--;
 			_engine->getMessageManager()->setMessageHandle(kCharacterVesna, _functionsVesna[getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall]]);
 			fedEx(kCharacterVesna, kCharacterVesna, 18, 0);
 		}
-	} else if (msg->action == 3) {
+
+		break;
+	case 3:
 		getCharacter(kCharacterVesna).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterVesna, _functionsVesna[getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall]]);
 		fedEx(kCharacterVesna, kCharacterVesna, 18, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -321,22 +366,25 @@ void LogicManager::CONS_Vesna_SaveGame(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Vesna_SaveGame(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			save(
-				kCharacterVesna,
-				getCharacterCurrentParams(kCharacterVesna)[0],
-				getCharacterCurrentParams(kCharacterVesna)[1]
-			);
+	switch (msg->action) {
+	case 0:
+		getCharacter(kCharacterVesna).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterVesna, _functionsVesna[getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall]]);
+		fedEx(kCharacterVesna, kCharacterVesna, 18, 0);
+		break;
+	case 12:
+		save(
+			kCharacterVesna,
+			getCharacterCurrentParams(kCharacterVesna)[0],
+			getCharacterCurrentParams(kCharacterVesna)[1]
+		);
 
-			getCharacter(kCharacterVesna).currentCall--;
-			_engine->getMessageManager()->setMessageHandle(kCharacterVesna, _functionsVesna[getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall]]);
-			fedEx(kCharacterVesna, kCharacterVesna, 18, 0);
-		}
-	} else {
 		getCharacter(kCharacterVesna).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterVesna, _functionsVesna[getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall]]);
 		fedEx(kCharacterVesna, kCharacterVesna, 18, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -351,48 +399,32 @@ void LogicManager::CONS_Vesna_HomeAlone(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Vesna_HomeAlone(HAND_PARAMS) {
-	if (msg->action > 9) {
-		if (msg->action > 17) {
-			if (msg->action == 18) {
-				switch (getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8]) {
-				case 1:
-				case 2:
-					getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8] = 3;
-					VesnaCall(&LogicManager::CONS_Vesna_DoDialog, (char *)&getCharacterCurrentParams(kCharacterVesna)[3], 0, 0, 0);
-					break;
-				case 3:
-					setDoor(38, kCharacterVesna, 3, 14, 0);
-					getCharacterCurrentParams(kCharacterVesna)[2] = 1;
-					break;
-				case 4:
-					getCharacterCurrentParams(kCharacterVesna)[2] = 0;
-					getCharacterCurrentParams(kCharacterVesna)[1] = 1;
+	switch (msg->action) {
+	case 0:
+		if (getCharacterCurrentParams(kCharacterVesna)[2]) {
+			if (getCharacterCurrentParams(kCharacterVesna)[6] || (getCharacterCurrentParams(kCharacterVesna)[6] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
+				if (getCharacterCurrentParams(kCharacterVesna)[6] >= _currentGameSessionTicks)
 					break;
-				default:
-					return;
-				}
-			} else if (msg->action == 55996766 || msg->action == 101687594) {
-				getCharacter(kCharacterVesna).currentCall--;
-				_engine->getMessageManager()->setMessageHandle(kCharacterVesna, _functionsVesna[getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall]]);
-				fedEx(kCharacterVesna, kCharacterVesna, 18, 0);
-			}
-		} else if (msg->action == 17) {
-			if (getCharacterCurrentParams(kCharacterVesna)[1] || getCharacterCurrentParams(kCharacterVesna)[2]) {
-				setDoor(38, kCharacterVesna, 1, 10, 9);
-				getCharacterCurrentParams(kCharacterVesna)[1] = 0;
-				getCharacterCurrentParams(kCharacterVesna)[2] = 0;
+
+				getCharacterCurrentParams(kCharacterVesna)[6] = 0x7FFFFFFF;
 			}
-		} else if (msg->action == 12) {
-			setDoor(38, kCharacterVesna, 3, 10, 9);
+
+			getCharacterCurrentParams(kCharacterVesna)[2] = 0;
+			getCharacterCurrentParams(kCharacterVesna)[1] = 1;
+			setDoor(38, kCharacterVesna, 1, 0, 0);
+			getCharacterCurrentParams(kCharacterVesna)[6] = 0;
+		} else {
+			getCharacterCurrentParams(kCharacterVesna)[6] = 0;
 		}
-		return;
-	}
-	if (msg->action >= 8) {
+
+		break;
+	case 8:
+	case 9:
 		if (getCharacterCurrentParams(kCharacterVesna)[2]) {
 			setDoor(38, kCharacterVesna, 3, 0, 0);
 			getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8] = 4;
 			VesnaCall(&LogicManager::CONS_Vesna_DoDialog, getCathSorryDialog(), 0, 0, 0);
-			return;
+			break;
 		}
 
 		getCharacterCurrentParams(kCharacterVesna)[0]++;
@@ -415,22 +447,47 @@ void LogicManager::HAND_Vesna_HomeAlone(HAND_PARAMS) {
 			getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8] = 2;
 			VesnaCall(&LogicManager::CONS_Vesna_DoDialog, "LIB012", 0, 0, 0);
 		}
-		return;
-	}
-	if (msg->action == 0) {
-		if (getCharacterCurrentParams(kCharacterVesna)[2]) {
-			if (getCharacterCurrentParams(kCharacterVesna)[6] || (getCharacterCurrentParams(kCharacterVesna)[6] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
-				if (getCharacterCurrentParams(kCharacterVesna)[6] >= _currentGameSessionTicks)
-					return;
-				getCharacterCurrentParams(kCharacterVesna)[6] = 0x7FFFFFFF;
-			}
+
+		break;
+	case 12:
+		setDoor(38, kCharacterVesna, 3, 10, 9);
+		break;
+	case 17:
+		if (getCharacterCurrentParams(kCharacterVesna)[1] || getCharacterCurrentParams(kCharacterVesna)[2]) {
+			setDoor(38, kCharacterVesna, 1, 10, 9);
+			getCharacterCurrentParams(kCharacterVesna)[1] = 0;
+			getCharacterCurrentParams(kCharacterVesna)[2] = 0;
+		}
+
+		break;
+	case 18:
+		switch (getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8]) {
+		case 1:
+		case 2:
+			getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8] = 3;
+			VesnaCall(&LogicManager::CONS_Vesna_DoDialog, (char *)&getCharacterCurrentParams(kCharacterVesna)[3], 0, 0, 0);
+			break;
+		case 3:
+			setDoor(38, kCharacterVesna, 3, 14, 0);
+			getCharacterCurrentParams(kCharacterVesna)[2] = 1;
+			break;
+		case 4:
 			getCharacterCurrentParams(kCharacterVesna)[2] = 0;
 			getCharacterCurrentParams(kCharacterVesna)[1] = 1;
-			setDoor(38, kCharacterVesna, 1, 0, 0);
-			getCharacterCurrentParams(kCharacterVesna)[6] = 0;
-		} else {
-			getCharacterCurrentParams(kCharacterVesna)[6] = 0;
+			break;
+		default:
+			break;
 		}
+
+		break;
+	case 55996766:
+	case 101687594:
+		getCharacter(kCharacterVesna).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterVesna, _functionsVesna[getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall]]);
+		fedEx(kCharacterVesna, kCharacterVesna, 18, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -445,16 +502,22 @@ void LogicManager::CONS_Vesna_Birth(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Vesna_Birth(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			autoMessage(kCharacterVesna, 124190740, 0);
-			getCharacter(kCharacterVesna).characterPosition.position = 4689;
-			getCharacter(kCharacterVesna).characterPosition.location = 1;
-			getCharacter(kCharacterVesna).characterPosition.car = kCarRestaurant;
+	switch (msg->action) {
+	case 0:
+		if (_gameTime > 1062000 && !getCharacterCurrentParams(kCharacterVesna)[0]) {
+			getCharacterCurrentParams(kCharacterVesna)[0] = 1;
+			CONS_Vesna_WithMilos(0, 0, 0, 0);
 		}
-	} else if (_gameTime > 1062000 && !getCharacterCurrentParams(kCharacterVesna)[0]) {
-		getCharacterCurrentParams(kCharacterVesna)[0] = 1;
-		CONS_Vesna_WithMilos(0, 0, 0, 0);
+
+		break;
+	case 12:
+		autoMessage(kCharacterVesna, 124190740, 0);
+		getCharacter(kCharacterVesna).characterPosition.position = 4689;
+		getCharacter(kCharacterVesna).characterPosition.location = 1;
+		getCharacter(kCharacterVesna).characterPosition.car = kCarRestaurant;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -469,18 +532,23 @@ void LogicManager::CONS_Vesna_WithMilos(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Vesna_WithMilos(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 18) {
-			if (getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8] == 1) {
-				endGraphics(kCharacterVesna);
-				CONS_Vesna_HomeTogether(0, 0, 0, 0);
-			}
-		} else if (msg->action == 204832737) {
-			getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8] = 1;
-			VesnaCall(&LogicManager::CONS_Vesna_DoWalkBehind, 4, 3050, 0, 0);
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		getCharacter(kCharacterVesna).characterPosition = getCharacter(kCharacterMilos).characterPosition;
+		break;
+	case 18:
+		if (getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8] == 1) {
+			endGraphics(kCharacterVesna);
+			CONS_Vesna_HomeTogether(0, 0, 0, 0);
+		}
+
+		break;
+	case 204832737:
+		getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8] = 1;
+		VesnaCall(&LogicManager::CONS_Vesna_DoWalkBehind, 4, 3050, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -495,13 +563,18 @@ void LogicManager::CONS_Vesna_HomeTogether(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Vesna_HomeTogether(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterVesna).characterPosition.position = 3050;
 		getCharacter(kCharacterVesna).characterPosition.location = 1;
-		getCharacter(kCharacterVesna).characterPosition.car = 4;
-	} else if (msg->action == 190412928) {
+		getCharacter(kCharacterVesna).characterPosition.car = kCarRedSleeping;
+		break;
+	case 190412928:
 		getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8] = 1;
 		VesnaCall(&LogicManager::CONS_Vesna_HomeAlone, 0, 0, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -516,12 +589,16 @@ void LogicManager::CONS_Vesna_Asleep(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Vesna_Asleep(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterVesna).characterPosition.car = kCarRedSleeping;
 		getCharacter(kCharacterVesna).characterPosition.position = 3050;
 		getCharacter(kCharacterVesna).characterPosition.location = 1;
 		endGraphics(kCharacterVesna);
 		setDoor(38, kCharacterCath, 3, 10, 9);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -536,17 +613,20 @@ void LogicManager::CONS_Vesna_StartPart2(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Vesna_StartPart2(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			endGraphics(kCharacterVesna);
-			getCharacter(kCharacterVesna).characterPosition.car = kCarRedSleeping;
-			getCharacter(kCharacterVesna).characterPosition.position = 3050;
-			getCharacter(kCharacterVesna).characterPosition.location = 1;
-			getCharacter(kCharacterVesna).clothes = 0;
-			getCharacter(kCharacterVesna).inventoryItem = 0;
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		CONS_Vesna_InPart2(0, 0, 0, 0);
+		break;
+	case 12:
+		endGraphics(kCharacterVesna);
+		getCharacter(kCharacterVesna).characterPosition.car = kCarRedSleeping;
+		getCharacter(kCharacterVesna).characterPosition.position = 3050;
+		getCharacter(kCharacterVesna).characterPosition.location = 1;
+		getCharacter(kCharacterVesna).clothes = 0;
+		getCharacter(kCharacterVesna).inventoryItem = 0;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -561,14 +641,19 @@ void LogicManager::CONS_Vesna_InPart2(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Vesna_InPart2(HAND_PARAMS) {
-	if (msg->action != 18) {
-		if (msg->action == 135024800) {
-			getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8] = 2;
-			VesnaCall(&LogicManager::CONS_Vesna_CheckTrain, 0, 0, 0, 0);
-		} else if (msg->action == 137165825) {
-			getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8] = 1;
-			VesnaCall(&LogicManager::CONS_Vesna_HomeAlone, 0, 0, 0, 0);
-		}
+	switch (msg->action) {
+	case 18:
+		break;
+	case 135024800:
+		getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8] = 2;
+		VesnaCall(&LogicManager::CONS_Vesna_CheckTrain, 0, 0, 0, 0);
+		break;
+	case 137165825:
+		getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8] = 1;
+		VesnaCall(&LogicManager::CONS_Vesna_HomeAlone, 0, 0, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -583,15 +668,19 @@ void LogicManager::CONS_Vesna_CheckTrain(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Vesna_CheckTrain(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8] = 1;
 		VesnaCall(&LogicManager::CONS_Vesna_DoCorrOtis, "610BG", 38, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8]) {
 		case 1:
 			getCharacter(kCharacterVesna).characterPosition.location = 0;
+
 			if (getCharacter(kCharacterVesna).characterPosition.position < 2087)
 				getCharacter(kCharacterVesna).characterPosition.position = 2088;
+
 			getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8] = 2;
 			VesnaCall(&LogicManager::CONS_Vesna_DoWalk, 5, 850, 0, 0);
 			break;
@@ -607,8 +696,10 @@ void LogicManager::HAND_Vesna_CheckTrain(HAND_PARAMS) {
 			break;
 		case 4:
 			startSeqOtis(kCharacterVesna, "808UD");
+
 			if (inSalon(kCharacterCath))
 				advanceFrame(kCharacterVesna);
+
 			getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8] = 5;
 			VesnaCall(&LogicManager::CONS_Vesna_FinishSeqOtis, 0, 0, 0, 0);
 			break;
@@ -652,8 +743,12 @@ void LogicManager::HAND_Vesna_CheckTrain(HAND_PARAMS) {
 			fedEx(kCharacterVesna, kCharacterVesna, 18, 0);
 			break;
 		default:
-			return;
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -668,24 +763,27 @@ void LogicManager::CONS_Vesna_StartPart3(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Vesna_StartPart3(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			endGraphics(kCharacterVesna);
-			getCharacter(kCharacterVesna).characterPosition.car = kCarRedSleeping;
-			getCharacter(kCharacterVesna).characterPosition.position = 3050;
-			getCharacter(kCharacterVesna).characterPosition.location = 1;
-			getCharacter(kCharacterVesna).clothes = 0;
-			getCharacter(kCharacterVesna).inventoryItem = 0;
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		CONS_Vesna_InComp(0, 0, 0, 0);
-	}
-}
-
-void LogicManager::CONS_Vesna_InComp(CONS_PARAMS) {
-	CharacterCallParams *params = &getCharacter(kCharacterVesna).callParams[getCharacter(kCharacterVesna).currentCall];
-	_engine->getMessageManager()->setMessageHandle(kCharacterVesna, &LogicManager::HAND_Vesna_InComp);
-	getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall] = 20;
+		break;
+	case 12:
+		endGraphics(kCharacterVesna);
+		getCharacter(kCharacterVesna).characterPosition.car = kCarRedSleeping;
+		getCharacter(kCharacterVesna).characterPosition.position = 3050;
+		getCharacter(kCharacterVesna).characterPosition.location = 1;
+		getCharacter(kCharacterVesna).clothes = 0;
+		getCharacter(kCharacterVesna).inventoryItem = 0;
+		break;
+	default:
+		break;
+	}
+}
+
+void LogicManager::CONS_Vesna_InComp(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterVesna).callParams[getCharacter(kCharacterVesna).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterVesna, &LogicManager::HAND_Vesna_InComp);
+	getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall] = 20;
 
 	params->clear();
 
@@ -693,59 +791,54 @@ void LogicManager::CONS_Vesna_InComp(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Vesna_InComp(HAND_PARAMS) {
-	if (msg->action > 9) {
-		if (msg->action > 17) {
-			if (msg->action > 137165825) {
-				if (msg->action == 155913424) {
-					getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8] = 6;
-					VesnaCall(&LogicManager::CONS_Vesna_TakeAWalk, 0, 0, 0, 0);
-				} else if (msg->action == 203663744) {
-					setDoor(38, kCharacterVesna, 3, 10, 9);
-				}
-			} else if (msg->action == 137165825) {
-				getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8] = 5;
-				VesnaCall(&LogicManager::CONS_Vesna_HomeAlone, 0, 0, 0, 0);
-			} else if (msg->action == 18) {
-				switch (getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8]) {
-				case 1:
-				case 2:
-					getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8] = 3;
-					VesnaCall(&LogicManager::CONS_Vesna_DoDialog, (char *)&getCharacterCurrentParams(kCharacterVesna)[3], 0, 0, 0);
-					break;
-				case 3:
-					setDoor(38, kCharacterVesna, 3, 14, 0);
-					getCharacterCurrentParams(kCharacterVesna)[1] = 1;
-					break;
-				case 4:
-					getCharacterCurrentParams(kCharacterVesna)[1] = 0;
-					getCharacterCurrentParams(kCharacterVesna)[0] = 1;
+	switch (msg->action) {
+	case 0:
+		if (_gameProgress[kProgressField54] && getCharacterCurrentParams(kCharacterVesna)[6] != 0x7FFFFFFF && _gameTime) {
+			if (_gameTime > 2250000) {
+				getCharacterCurrentParams(kCharacterVesna)[6] = 0x7FFFFFFF;
+				CONS_Vesna_KillAnna(0, 0, 0, 0);
+				break;
+			}
+
+			if (!cathInCorridor(kCarRedSleeping) || !getCharacterCurrentParams(kCharacterVesna)[6]) {
+				getCharacterCurrentParams(kCharacterVesna)[6] = _gameTime;
+				if (!_gameTime) {
+					CONS_Vesna_KillAnna(0, 0, 0, 0);
 					break;
-				default:
-					return;
 				}
 			}
-		} else if (msg->action == 17) {
-			if (getCharacterCurrentParams(kCharacterVesna)[0] || getCharacterCurrentParams(kCharacterVesna)[1]) {
-				setDoor(38, kCharacterVesna, 1, 10, 9);
-				getCharacterCurrentParams(kCharacterVesna)[0] = 0;
-				getCharacterCurrentParams(kCharacterVesna)[1] = 0;
+
+			if (getCharacterCurrentParams(kCharacterVesna)[6] < _gameTime) {
+				getCharacterCurrentParams(kCharacterVesna)[6] = 0x7FFFFFFF;
+				CONS_Vesna_KillAnna(0, 0, 0, 0);
+				break;
 			}
-		} else if (msg->action == 12) {
-			getCharacter(kCharacterVesna).characterPosition.car = kCarRedSleeping;
-			getCharacter(kCharacterVesna).characterPosition.position = 3050;
-			getCharacter(kCharacterVesna).characterPosition.location = 1;
-			getCharacter(kCharacterVesna).clothes = 0;
-			getCharacter(kCharacterVesna).inventoryItem = 0;
-			endGraphics(kCharacterVesna);
 		}
-		return;
-	}
-	if (msg->action >= 8) {
+
+		if (getCharacterCurrentParams(kCharacterVesna)[1]) {
+			if (getCharacterCurrentParams(kCharacterVesna)[7] || (getCharacterCurrentParams(kCharacterVesna)[7] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
+				if (getCharacterCurrentParams(kCharacterVesna)[7] >= _currentGameSessionTicks)
+					break;
+
+				getCharacterCurrentParams(kCharacterVesna)[7] = 0x7FFFFFFF;
+			}
+
+			getCharacterCurrentParams(kCharacterVesna)[1] = 0;
+			getCharacterCurrentParams(kCharacterVesna)[0] = 1;
+			setDoor(38, kCharacterVesna, 1, 0, 0);
+			getCharacterCurrentParams(kCharacterVesna)[7] = 0;
+		} else {
+			getCharacterCurrentParams(kCharacterVesna)[7] = 0;
+		}
+
+		break;
+	case 8:
+	case 9:
 		if (getCharacterCurrentParams(kCharacterVesna)[1]) {
 			setDoor(38, kCharacterVesna, 3, 0, 0);
 			getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8] = 4;
 			VesnaCall(&LogicManager::CONS_Vesna_DoDialog, getCathSorryDialog(), 0, 0, 0);
-			return;
+			break;
 		}
 
 		getCharacterCurrentParams(kCharacterVesna)[2]++;
@@ -768,39 +861,57 @@ void LogicManager::HAND_Vesna_InComp(HAND_PARAMS) {
 			getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8] = 2;
 			VesnaCall(&LogicManager::CONS_Vesna_DoDialog, "LIB012", 0, 0, 0);
 		}
-		return;
-	}
-	if (msg->action)
-		return;
-
-	if (_gameProgress[kProgressField54] && getCharacterCurrentParams(kCharacterVesna)[6] != 0x7FFFFFFF && _gameTime) {
-		if (_gameTime > 2250000)
-			goto LABEL_24;
-		if (!cathInCorridor(kCarRedSleeping) || !getCharacterCurrentParams(kCharacterVesna)[6]) {
-			getCharacterCurrentParams(kCharacterVesna)[6] = _gameTime;
-			if (!_gameTime)
-				goto LABEL_25;
-		}
-		if (getCharacterCurrentParams(kCharacterVesna)[6] < _gameTime) {
-		LABEL_24:
-			getCharacterCurrentParams(kCharacterVesna)[6] = 0x7FFFFFFF;
-		LABEL_25:
-			CONS_Vesna_KillAnna(0, 0, 0, 0);
-			return;
+
+		break;
+	case 12:
+		getCharacter(kCharacterVesna).characterPosition.car = kCarRedSleeping;
+		getCharacter(kCharacterVesna).characterPosition.position = 3050;
+		getCharacter(kCharacterVesna).characterPosition.location = 1;
+		getCharacter(kCharacterVesna).clothes = 0;
+		getCharacter(kCharacterVesna).inventoryItem = 0;
+		endGraphics(kCharacterVesna);
+		break;
+	case 17:
+		if (getCharacterCurrentParams(kCharacterVesna)[0] || getCharacterCurrentParams(kCharacterVesna)[1]) {
+			setDoor(38, kCharacterVesna, 1, 10, 9);
+			getCharacterCurrentParams(kCharacterVesna)[0] = 0;
+			getCharacterCurrentParams(kCharacterVesna)[1] = 0;
 		}
-	}
-	if (getCharacterCurrentParams(kCharacterVesna)[1]) {
-		if (getCharacterCurrentParams(kCharacterVesna)[7] || (getCharacterCurrentParams(kCharacterVesna)[7] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
-			if (getCharacterCurrentParams(kCharacterVesna)[7] >= _currentGameSessionTicks)
-				return;
-			getCharacterCurrentParams(kCharacterVesna)[7] = 0x7FFFFFFF;
+
+		break;
+	case 18:
+		switch (getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8]) {
+		case 1:
+		case 2:
+			getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8] = 3;
+			VesnaCall(&LogicManager::CONS_Vesna_DoDialog, (char *)&getCharacterCurrentParams(kCharacterVesna)[3], 0, 0, 0);
+			break;
+		case 3:
+			setDoor(38, kCharacterVesna, 3, 14, 0);
+			getCharacterCurrentParams(kCharacterVesna)[1] = 1;
+			break;
+		case 4:
+			getCharacterCurrentParams(kCharacterVesna)[1] = 0;
+			getCharacterCurrentParams(kCharacterVesna)[0] = 1;
+			break;
+		default:
+			break;
 		}
-		getCharacterCurrentParams(kCharacterVesna)[1] = 0;
-		getCharacterCurrentParams(kCharacterVesna)[0] = 1;
-		setDoor(38, kCharacterVesna, 1, 0, 0);
-		getCharacterCurrentParams(kCharacterVesna)[7] = 0;
-	} else {
-		getCharacterCurrentParams(kCharacterVesna)[7] = 0;
+
+		break;
+	case 137165825:
+		getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8] = 5;
+		VesnaCall(&LogicManager::CONS_Vesna_HomeAlone, 0, 0, 0, 0);
+		break;
+	case 155913424:
+		getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8] = 6;
+		VesnaCall(&LogicManager::CONS_Vesna_TakeAWalk, 0, 0, 0, 0);
+		break;
+	case 203663744:
+		setDoor(38, kCharacterVesna, 3, 10, 9);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -815,15 +926,19 @@ void LogicManager::CONS_Vesna_TakeAWalk(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Vesna_TakeAWalk(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8] = 1;
 		VesnaCall(&LogicManager::CONS_Vesna_DoCorrOtis, "610Bg", 38, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8]) {
 		case 1:
 			getCharacter(kCharacterVesna).characterPosition.location = 0;
+
 			if (getCharacter(kCharacterVesna).characterPosition.position < 2087)
 				getCharacter(kCharacterVesna).characterPosition.position = 2088;
+
 			getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8] = 2;
 			VesnaCall(&LogicManager::CONS_Vesna_DoWalk, 5, 850, 0, 0);
 			break;
@@ -839,8 +954,10 @@ void LogicManager::HAND_Vesna_TakeAWalk(HAND_PARAMS) {
 			break;
 		case 4:
 			startSeqOtis(kCharacterVesna, "808UD");
+
 			if (inSalon(kCharacterCath))
 				advanceFrame(kCharacterVesna);
+
 			getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8] = 5;
 			VesnaCall(&LogicManager::CONS_Vesna_FinishSeqOtis, 0, 0, 0, 0);
 			break;
@@ -863,8 +980,10 @@ void LogicManager::HAND_Vesna_TakeAWalk(HAND_PARAMS) {
 			break;
 		case 8:
 			startSeqOtis(kCharacterVesna, "808DS");
+
 			if (inDiningRoom(kCharacterCath))
 				advanceFrame(kCharacterVesna);
+
 			getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8] = 9;
 			VesnaCall(&LogicManager::CONS_Vesna_FinishSeqOtis, 0, 0, 0, 0);
 			break;
@@ -886,8 +1005,12 @@ void LogicManager::HAND_Vesna_TakeAWalk(HAND_PARAMS) {
 			fedEx(kCharacterVesna, kCharacterVesna, 18, 0);
 			break;
 		default:
-			return;
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -912,8 +1035,10 @@ void LogicManager::HAND_Vesna_KillAnna(HAND_PARAMS) {
 		switch (getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8]) {
 		case 1:
 			getCharacter(kCharacterVesna).characterPosition.location = 0;
+
 			if (getCharacter(kCharacterVesna).characterPosition.position < 2087)
 				getCharacter(kCharacterVesna).characterPosition.position = 2088;
+
 			getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8] = 2;
 			VesnaCall(&LogicManager::CONS_Vesna_DoWalk, kCarRestaurant, 850, 0, 0);
 			break;
@@ -929,8 +1054,10 @@ void LogicManager::HAND_Vesna_KillAnna(HAND_PARAMS) {
 			break;
 		case 4:
 			startSeqOtis(kCharacterVesna, "808UD");
+
 			if (inSalon(kCharacterCath))
 				advanceFrame(kCharacterVesna);
+
 			getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8] = 5;
 			VesnaCall(&LogicManager::CONS_Vesna_FinishSeqOtis, 0, 0, 0, 0);
 			break;
@@ -948,8 +1075,10 @@ void LogicManager::HAND_Vesna_KillAnna(HAND_PARAMS) {
 			break;
 		case 7:
 			startSeqOtis(kCharacterVesna, "808DS");
+
 			if (inDiningRoom(kCharacterCath))
 				advanceFrame(kCharacterVesna);
+
 			getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8] = 8;
 			VesnaCall(&LogicManager::CONS_Vesna_FinishSeqOtis, 0, 0, 0, 0);
 			break;
@@ -968,8 +1097,9 @@ void LogicManager::HAND_Vesna_KillAnna(HAND_PARAMS) {
 			CONS_Vesna_KilledAnna(0, 0, 0, 0);
 			break;
 		default:
-			return;
+			break;
 		}
+
 		break;
 	case 189299008:
 		getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8] = 6;
@@ -989,44 +1119,43 @@ void LogicManager::CONS_Vesna_KilledAnna(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Vesna_KilledAnna(HAND_PARAMS) {
-	if (msg->action <= 12) {
-		if (msg->action == 12) {
-			getCharacter(kCharacterVesna).characterPosition.car = kCarRedSleeping;
-			getCharacter(kCharacterVesna).characterPosition.position = 3050;
-			getCharacter(kCharacterVesna).characterPosition.location = 1;
-			getCharacter(kCharacterVesna).clothes = 0;
-			getCharacter(kCharacterVesna).inventoryItem = 0;
-		} else if (msg->action >= 8 && msg->action <= 9) {
-			setDoor(38, kCharacterVesna, 3, 0, 0);
-			if (msg->action == 8) {
-				getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8] = 1;
-				VesnaCall(&LogicManager::CONS_Vesna_DoDialog, "LIB012", 0, 0, 0);
-			} else {
-				getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8] = 2;
-				VesnaCall(&LogicManager::CONS_Vesna_DoDialog, "LIB013", 0, 0, 0);
-			}
+	switch (msg->action) {
+	case 8:
+	case 9:
+		setDoor(38, kCharacterVesna, 3, 0, 0);
+		if (msg->action == 8) {
+			getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8] = 1;
+			VesnaCall(&LogicManager::CONS_Vesna_DoDialog, "LIB012", 0, 0, 0);
+		} else {
+			getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8] = 2;
+			VesnaCall(&LogicManager::CONS_Vesna_DoDialog, "LIB013", 0, 0, 0);
 		}
-		return;
-	}
-	if (msg->action != 18) {
-		if (msg->action != 203663744)
-			return;
-	LABEL_18:
-		setDoor(38, kCharacterVesna, 3, 10, 9);
-		return;
-	}
 
-	if (!getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8])
-		return;
+		break;
+	case 12:
+		getCharacter(kCharacterVesna).characterPosition.car = kCarRedSleeping;
+		getCharacter(kCharacterVesna).characterPosition.position = 3050;
+		getCharacter(kCharacterVesna).characterPosition.location = 1;
+		getCharacter(kCharacterVesna).clothes = 0;
+		getCharacter(kCharacterVesna).inventoryItem = 0;
+		break;
+	case 18:
+		if (getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8]) {
+			if (getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8] <= 2) {
+				getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8] = 3;
+				VesnaCall(&LogicManager::CONS_Vesna_DoDialog, "VES1015A", 0, 0, 0);
+			} else if (getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8] == 3) {
+				setDoor(38, kCharacterVesna, 3, 10, 9);
+			}
+		}
 
-	if (getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8] <= 2) {
-		getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8] = 3;
-		VesnaCall(&LogicManager::CONS_Vesna_DoDialog, "VES1015A", 0, 0, 0);
-		return;
+		break;
+	case 203663744:
+		setDoor(38, kCharacterVesna, 3, 10, 9);
+		break;
+	default:
+		break;
 	}
-
-	if (getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8] == 3)
-		goto LABEL_18;
 }
 
 void LogicManager::CONS_Vesna_StartPart4(CONS_PARAMS) {
@@ -1040,20 +1169,27 @@ void LogicManager::CONS_Vesna_StartPart4(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Vesna_StartPart4(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			endGraphics(kCharacterVesna);
-			getCharacter(kCharacterVesna).characterPosition.position = 3050;
-			getCharacter(kCharacterVesna).characterPosition.location = 1;
-			getCharacter(kCharacterVesna).characterPosition.car = kCarRedSleeping;
-			getCharacter(kCharacterVesna).inventoryItem = 0;
-			setDoor(38, kCharacterVesna, 3, 10, 9);
-		} else if (msg->action == 18 && getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8] == 1) {
-			CONS_Vesna_Exit(0, 0, 0, 0);
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8] = 1;
 		VesnaCall(&LogicManager::CONS_Vesna_HomeAlone, 0, 0, 0, 0);
+		break;
+	case 12:
+		endGraphics(kCharacterVesna);
+		getCharacter(kCharacterVesna).characterPosition.position = 3050;
+		getCharacter(kCharacterVesna).characterPosition.location = 1;
+		getCharacter(kCharacterVesna).characterPosition.car = kCarRedSleeping;
+		getCharacter(kCharacterVesna).inventoryItem = 0;
+		setDoor(38, kCharacterVesna, 3, 10, 9);
+		break;
+	case 18:
+		if (getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8] == 1) {
+			CONS_Vesna_Exit(0, 0, 0, 0);
+		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1068,50 +1204,62 @@ void LogicManager::CONS_Vesna_Exit(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Vesna_Exit(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			send(kCharacterVesna, kCharacterMilos, 135600432, 0);
-			getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8] = 1;
-			VesnaCall(&LogicManager::CONS_Vesna_DoCorrOtis, "610BG", 38, 0, 0);
-		} else if (msg->action == 18) {
-			switch (getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8]) {
-			case 1:
-				getCharacter(kCharacterVesna).characterPosition.location = 0;
-				if (getCharacter(kCharacterVesna).characterPosition.position < 2087)
-					getCharacter(kCharacterVesna).characterPosition.position = 2088;
-				getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8] = 2;
-				VesnaCall(&LogicManager::CONS_Vesna_DoWalk, 5, 850, 0, 0);
-				break;
-			case 2:
-				getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8] = 3;
-				VesnaCall(&LogicManager::CONS_Vesna_WaitRCClear, 0, 0, 0, 0);
-				break;
-			case 3:
-				getCharacter(kCharacterVesna).characterPosition.position = 1540;
-				getCharacter(kCharacterVesna).characterPosition.location = 0;
-				getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8] = 4;
-				VesnaCall(&LogicManager::CONS_Vesna_DoSeqOtis, "808US", 0, 0, 0);
-				break;
-			case 4:
-				startSeqOtis(kCharacterVesna, "808UD");
-				if (inSalon(kCharacterCath))
-					advanceFrame(kCharacterVesna);
-				getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8] = 5;
-				VesnaCall(&LogicManager::CONS_Vesna_FinishSeqOtis, 0, 0, 0, 0);
-				break;
-			case 5:
-				endGraphics(kCharacterVesna);
-				getCharacter(kCharacterVesna).characterPosition.position = 5900;
-				getCharacter(kCharacterVesna).characterPosition.location = 1;
-				endGraphics(kCharacterVesna);
-				break;
-			default:
-				return;
-			}
+	switch (msg->action) {
+	case 0:
+		if (_gameTime > 2428200 && !getCharacterCurrentParams(kCharacterVesna)[0]) {
+			getCharacterCurrentParams(kCharacterVesna)[0] = 1;
+			CONS_Vesna_Done(0, 0, 0, 0);
 		}
-	} else if (_gameTime > 2428200 && !getCharacterCurrentParams(kCharacterVesna)[0]) {
-		getCharacterCurrentParams(kCharacterVesna)[0] = 1;
-		CONS_Vesna_Done(0, 0, 0, 0);
+
+		break;
+	case 12:
+		send(kCharacterVesna, kCharacterMilos, 135600432, 0);
+		getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8] = 1;
+		VesnaCall(&LogicManager::CONS_Vesna_DoCorrOtis, "610BG", 38, 0, 0);
+		break;
+	case 18:
+		switch (getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8]) {
+		case 1:
+			getCharacter(kCharacterVesna).characterPosition.location = 0;
+
+			if (getCharacter(kCharacterVesna).characterPosition.position < 2087)
+				getCharacter(kCharacterVesna).characterPosition.position = 2088;
+
+			getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8] = 2;
+			VesnaCall(&LogicManager::CONS_Vesna_DoWalk, 5, 850, 0, 0);
+			break;
+		case 2:
+			getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8] = 3;
+			VesnaCall(&LogicManager::CONS_Vesna_WaitRCClear, 0, 0, 0, 0);
+			break;
+		case 3:
+			getCharacter(kCharacterVesna).characterPosition.position = 1540;
+			getCharacter(kCharacterVesna).characterPosition.location = 0;
+			getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8] = 4;
+			VesnaCall(&LogicManager::CONS_Vesna_DoSeqOtis, "808US", 0, 0, 0);
+			break;
+		case 4:
+			startSeqOtis(kCharacterVesna, "808UD");
+
+			if (inSalon(kCharacterCath))
+				advanceFrame(kCharacterVesna);
+
+			getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8] = 5;
+			VesnaCall(&LogicManager::CONS_Vesna_FinishSeqOtis, 0, 0, 0, 0);
+			break;
+		case 5:
+			endGraphics(kCharacterVesna);
+			getCharacter(kCharacterVesna).characterPosition.position = 5900;
+			getCharacter(kCharacterVesna).characterPosition.location = 1;
+			endGraphics(kCharacterVesna);
+			break;
+		default:
+			break;
+		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1126,10 +1274,12 @@ void LogicManager::CONS_Vesna_Done(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Vesna_Done(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8] = 1;
 		VesnaCall(&LogicManager::CONS_Vesna_WaitRCClear, 0, 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8]) {
 		case 1:
 			getCharacter(kCharacterVesna).characterPosition.car = kCarRestaurant;
@@ -1140,8 +1290,10 @@ void LogicManager::HAND_Vesna_Done(HAND_PARAMS) {
 			break;
 		case 2:
 			startSeqOtis(kCharacterVesna, "808DS");
+
 			if (inDiningRoom(kCharacterCath))
 				advanceFrame(kCharacterVesna);
+
 			getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8] = 3;
 			VesnaCall(&LogicManager::CONS_Vesna_FinishSeqOtis, 0, 0, 0, 0);
 			break;
@@ -1157,8 +1309,12 @@ void LogicManager::HAND_Vesna_Done(HAND_PARAMS) {
 			CONS_Vesna_EndPart4(0, 0, 0, 0);
 			break;
 		default:
-			return;
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1173,13 +1329,17 @@ void LogicManager::CONS_Vesna_EndPart4(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Vesna_EndPart4(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		endGraphics(kCharacterVesna);
 		setDoor(38, kCharacterCath, 3, 10, 9);
 		getCharacter(kCharacterVesna).characterPosition.location = 1;
 		getCharacter(kCharacterVesna).characterPosition.position = 3050;
 		getCharacter(kCharacterVesna).characterPosition.car = kCarRedSleeping;
 		getCharacter(kCharacterVesna).inventoryItem = 0;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1194,15 +1354,18 @@ void LogicManager::CONS_Vesna_StartPart5(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Vesna_StartPart5(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			endGraphics(kCharacterVesna);
-			getCharacter(kCharacterVesna).characterPosition.location = 1;
-			getCharacter(kCharacterVesna).characterPosition.car = kCarRestaurant;
-			getCharacter(kCharacterVesna).inventoryItem = 0;
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		CONS_Vesna_Guarding(0, 0, 0, 0);
+		break;
+	case 12:
+		endGraphics(kCharacterVesna);
+		getCharacter(kCharacterVesna).characterPosition.location = 1;
+		getCharacter(kCharacterVesna).characterPosition.car = kCarRestaurant;
+		getCharacter(kCharacterVesna).inventoryItem = 0;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1217,21 +1380,27 @@ void LogicManager::CONS_Vesna_Guarding(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Vesna_Guarding(HAND_PARAMS) {
-	if (msg->action > 12) {
-		if (msg->action == 18) {
-			if (getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8] == 1) {
-				playNIS(kEventCathVesnaRestaurantKilled);
-				endGame(0, 1, 0, 1);
-			}
-		} else if (msg->action == 134427424) {
-			setDoor(64, kCharacterCath, 0, 0, 1);
-			CONS_Vesna_Climbing(0, 0, 0, 0);
-		}
-	} else if (msg->action == 12) {
-		setDoor(64, kCharacterVesna, 0, 0, 1);
-	} else if (msg->action == 9) {
+	switch (msg->action) {
+	case 9:
 		getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8] = 1;
 		VesnaCall(&LogicManager::CONS_Vesna_SaveGame, 2, kEventCathVesnaRestaurantKilled, 0, 0);
+		break;
+	case 12:
+		setDoor(64, kCharacterVesna, 0, 0, 1);
+		break;
+	case 18:
+		if (getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8] == 1) {
+			playNIS(kEventCathVesnaRestaurantKilled);
+			endGame(0, 1, 0, true);
+		}
+
+		break;
+	case 134427424:
+		setDoor(64, kCharacterCath, 0, 0, 1);
+		CONS_Vesna_Climbing(0, 0, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1248,27 +1417,45 @@ void LogicManager::CONS_Vesna_Climbing(CONS_PARAMS) {
 void LogicManager::HAND_Vesna_Climbing(HAND_PARAMS) {
 	int fightOutcome;
 
-	if (msg->action > 18) {
-		if (msg->action == 167992577) {
-			getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8] = 3;
-			VesnaCall(&LogicManager::CONS_Vesna_SaveGame, 2, kEventCathVesnaTrainTopFight, 0, 0);
-		} else if (msg->action == 202884544) {
-			if (getCharacterCurrentParams(kCharacterVesna)[0]) {
-				getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8] = 2;
-				VesnaCall(&LogicManager::CONS_Vesna_SaveGame, 2, kEventCathVesnaTrainTopKilled, 0, 0);
-			} else {
+	switch (msg->action) {
+	case 0:
+	{
+		bool skip = false;
+
+		if (!getCharacterCurrentParams(kCharacterVesna)[0]) {
+			if (getCharacterCurrentParams(kCharacterVesna)[2] || (getCharacterCurrentParams(kCharacterVesna)[2] = _currentGameSessionTicks + 120, _currentGameSessionTicks != -120)) {
+				if (getCharacterCurrentParams(kCharacterVesna)[2] >= _currentGameSessionTicks) {
+					skip = true;
+				}
+
+				if (!skip) {
+					getCharacterCurrentParams(kCharacterVesna)[2] = 0x7FFFFFFF;
+				}
+			}
+
+			if (!skip) {
 				playDialog(kCharacterVesna, "Ves5001", 16, 0);
 				getCharacterCurrentParams(kCharacterVesna)[0] = 1;
 			}
 		}
-		return;
+
+		if (getCharacterCurrentParams(kCharacterVesna)[3] || (getCharacterCurrentParams(kCharacterVesna)[3] = _currentGameSessionTicks + 180, _currentGameSessionTicks != -180)) {
+			if (getCharacterCurrentParams(kCharacterVesna)[3] >= _currentGameSessionTicks)
+				break;
+
+			getCharacterCurrentParams(kCharacterVesna)[3] = 0x7FFFFFFF;
+		}
+
+		getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8] = 1;
+		VesnaCall(&LogicManager::CONS_Vesna_SaveGame, 2, kEventCathVesnaTrainTopKilled, 0, 0);
+		break;
 	}
-	if (msg->action == 18) {
+	case 18:
 		switch (getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8]) {
 		case 1:
 		case 2:
 			playNIS(kEventCathVesnaTrainTopKilled);
-			endGame(0, 1, 0, 1);
+			endGame(0, 1, 0, true);
 			break;
 		case 3:
 			playNIS(kEventCathVesnaTrainTopFight);
@@ -1278,6 +1465,7 @@ void LogicManager::HAND_Vesna_Climbing(HAND_PARAMS) {
 		case 4:
 			fightOutcome = playFight(2005);
 			getCharacterCurrentParams(kCharacterVesna)[1] = fightOutcome;
+
 			if (fightOutcome) {
 				endGame(0, 0, 0, fightOutcome == 1);
 			} else {
@@ -1287,6 +1475,7 @@ void LogicManager::HAND_Vesna_Climbing(HAND_PARAMS) {
 				getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8] = 5;
 				VesnaCall(&LogicManager::CONS_Vesna_SaveGame, 2, kEventCathVesnaTrainTopWin, 0, 0);
 			}
+
 			break;
 		case 5:
 			playNIS(kEventCathVesnaTrainTopWin);
@@ -1294,29 +1483,26 @@ void LogicManager::HAND_Vesna_Climbing(HAND_PARAMS) {
 			CONS_Vesna_Disappear(0, 0, 0, 0);
 			break;
 		default:
-			return;
+			break;
 		}
-		return;
-	}
-	if (msg->action)
-		return;
-	if (!getCharacterCurrentParams(kCharacterVesna)[0]) {
-		if (getCharacterCurrentParams(kCharacterVesna)[2] || (getCharacterCurrentParams(kCharacterVesna)[2] = _currentGameSessionTicks + 120, _currentGameSessionTicks != -120)) {
-			if (getCharacterCurrentParams(kCharacterVesna)[2] >= _currentGameSessionTicks)
-				goto LABEL_14;
-			getCharacterCurrentParams(kCharacterVesna)[2] = 0x7FFFFFFF;
+
+		break;
+	case 167992577:
+		getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8] = 3;
+		VesnaCall(&LogicManager::CONS_Vesna_SaveGame, 2, kEventCathVesnaTrainTopFight, 0, 0);
+		break;
+	case 202884544:
+		if (getCharacterCurrentParams(kCharacterVesna)[0]) {
+			getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8] = 2;
+			VesnaCall(&LogicManager::CONS_Vesna_SaveGame, 2, kEventCathVesnaTrainTopKilled, 0, 0);
+		} else {
+			playDialog(kCharacterVesna, "Ves5001", 16, 0);
+			getCharacterCurrentParams(kCharacterVesna)[0] = 1;
 		}
-		playDialog(kCharacterVesna, "Ves5001", 16, 0);
-		getCharacterCurrentParams(kCharacterVesna)[0] = 1;
-	}
-LABEL_14:
-	if (getCharacterCurrentParams(kCharacterVesna)[3] || (getCharacterCurrentParams(kCharacterVesna)[3] = _currentGameSessionTicks + 180, _currentGameSessionTicks != -180)) {
-		if (getCharacterCurrentParams(kCharacterVesna)[3] >= _currentGameSessionTicks)
-			return;
-		getCharacterCurrentParams(kCharacterVesna)[3] = 0x7FFFFFFF;
+		break;
+	default:
+		break;
 	}
-	getCharacter(kCharacterVesna).callbacks[getCharacter(kCharacterVesna).currentCall + 8] = 1;
-	VesnaCall(&LogicManager::CONS_Vesna_SaveGame, 2, kEventCathVesnaTrainTopKilled, 0, 0);
 }
 
 void LogicManager::CONS_Vesna_Disappear(CONS_PARAMS) {


Commit: 5521c7ecb56aac156488021ce54a94061d91cd4e
    https://github.com/scummvm/scummvm/commit/5521c7ecb56aac156488021ce54a94061d91cd4e
Author: AndywinXp (andywinxp at gmail.com)
Date: 2025-06-16T23:12:18+02:00

Commit Message:
LASTEXPRESS: Clean up Tatiana logic

Changed paths:
    engines/lastexpress/characters/tatiana.cpp


diff --git a/engines/lastexpress/characters/tatiana.cpp b/engines/lastexpress/characters/tatiana.cpp
index 786005eb8cc..7652f8a8302 100644
--- a/engines/lastexpress/characters/tatiana.cpp
+++ b/engines/lastexpress/characters/tatiana.cpp
@@ -48,7 +48,7 @@ void LogicManager::CONS_Tatiana(int chapter) {
 		CONS_Tatiana_StartPart5(0, 0, 0, 0);
 		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -69,24 +69,32 @@ void LogicManager::CONS_Tatiana_DebugWalks(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Tatiana_DebugWalks(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 1) {
-			getCharacter(kCharacterTatiana).clothes++;
-			if (getCharacter(kCharacterTatiana).clothes > 3)
-				getCharacter(kCharacterTatiana).clothes = 0;
-		} else if (msg->action == 12) {
-			getCharacter(kCharacterTatiana).characterPosition.position = 0;
-			getCharacter(kCharacterTatiana).characterPosition.location = 0;
-			getCharacter(kCharacterTatiana).characterPosition.car = kCarGreenSleeping;
-			getCharacter(kCharacterTatiana).inventoryItem = 0x80;
-			getCharacterCurrentParams(kCharacterTatiana)[0] = 10000;
-		}
-	} else if (walk(kCharacterTatiana, kCarGreenSleeping, getCharacterCurrentParams(kCharacterTatiana)[0])) {
-		if (getCharacterCurrentParams(kCharacterTatiana)[0] == 10000) {
-			getCharacterCurrentParams(kCharacterTatiana)[0] = 0;
-		} else {
-			getCharacterCurrentParams(kCharacterTatiana)[0] = 10000;
+	switch (msg->action) {
+	case 0:
+		if (walk(kCharacterTatiana, kCarGreenSleeping, getCharacterCurrentParams(kCharacterTatiana)[0])) {
+			if (getCharacterCurrentParams(kCharacterTatiana)[0] == 10000) {
+				getCharacterCurrentParams(kCharacterTatiana)[0] = 0;
+			} else {
+				getCharacterCurrentParams(kCharacterTatiana)[0] = 10000;
+			}
 		}
+
+		break;
+	case 1:
+		getCharacter(kCharacterTatiana).clothes++;
+		if (getCharacter(kCharacterTatiana).clothes > 3)
+			getCharacter(kCharacterTatiana).clothes = 0;
+
+		break;
+	case 12:
+		getCharacter(kCharacterTatiana).characterPosition.position = 0;
+		getCharacter(kCharacterTatiana).characterPosition.location = 0;
+		getCharacter(kCharacterTatiana).characterPosition.car = kCarGreenSleeping;
+		getCharacter(kCharacterTatiana).inventoryItem = 0x80;
+		getCharacterCurrentParams(kCharacterTatiana)[0] = 10000;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -103,12 +111,17 @@ void LogicManager::CONS_Tatiana_DoDialog(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Tatiana_DoDialog(HAND_PARAMS) {
-	if (msg->action == 2) {
+	switch (msg->action) {
+	case 2:
 		getCharacter(kCharacterTatiana).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterTatiana, _functionsTatiana[getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall]]);
 		fedEx(kCharacterTatiana, kCharacterTatiana, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		playDialog(kCharacterTatiana, (char *)&getCharacterCurrentParams(kCharacterTatiana)[0], -1, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -125,12 +138,17 @@ void LogicManager::CONS_Tatiana_DoSeqOtis(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Tatiana_DoSeqOtis(HAND_PARAMS) {
-	if (msg->action == 3) {
+	switch (msg->action) {
+	case 3:
 		getCharacter(kCharacterTatiana).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterTatiana, _functionsTatiana[getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall]]);
 		fedEx(kCharacterTatiana, kCharacterTatiana, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		startSeqOtis(kCharacterTatiana, (char *)&getCharacterCurrentParams(kCharacterTatiana)[0]);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -150,15 +168,20 @@ void LogicManager::CONS_Tatiana_DoBlockSeqOtis(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Tatiana_DoBlockSeqOtis(HAND_PARAMS) {
-	if (msg->action == 3) {
+	switch (msg->action) {
+	case 3:
 		releaseView(kCharacterTatiana, getCharacterCurrentParams(kCharacterTatiana)[3], getCharacterCurrentParams(kCharacterTatiana)[4]);
 
 		getCharacter(kCharacterTatiana).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterTatiana, _functionsTatiana[getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall]]);
 		fedEx(kCharacterTatiana, kCharacterTatiana, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		startSeqOtis(kCharacterTatiana, (char *)&getCharacterCurrentParams(kCharacterTatiana)[0]);
 		blockView(kCharacterTatiana, getCharacterCurrentParams(kCharacterTatiana)[3], getCharacterCurrentParams(kCharacterTatiana)[4]);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -177,15 +200,20 @@ void LogicManager::CONS_Tatiana_DoCorrOtis(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Tatiana_DoCorrOtis(HAND_PARAMS) {
-	if (msg->action == 3) {
+	switch (msg->action) {
+	case 3:
 		releaseAtDoor(kCharacterTatiana, getCharacterCurrentParams(kCharacterTatiana)[3]);
 
 		getCharacter(kCharacterTatiana).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterTatiana, _functionsTatiana[getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall]]);
 		fedEx(kCharacterTatiana, kCharacterTatiana, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		startSeqOtis(kCharacterTatiana, (char *)&getCharacterCurrentParams(kCharacterTatiana)[0]);
 		blockAtDoor(kCharacterTatiana, getCharacterCurrentParams(kCharacterTatiana)[3]);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -204,22 +232,29 @@ void LogicManager::CONS_Tatiana_DoEnterCorrOtis(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Tatiana_DoEnterCorrOtis(HAND_PARAMS) {
-	if (msg->action == 3) {
+	switch (msg->action) {
+	case 3:
 		releaseAtDoor(kCharacterTatiana, getCharacterCurrentParams(kCharacterTatiana)[3]);
 		getCharacter(kCharacterTatiana).characterPosition.position = 7500;
 
 		getCharacter(kCharacterTatiana).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterTatiana, _functionsTatiana[getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall]]);
 		fedEx(kCharacterTatiana, kCharacterTatiana, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		startSeqOtis(kCharacterTatiana, (char *)&getCharacterCurrentParams(kCharacterTatiana)[0]);
 		blockAtDoor(kCharacterTatiana, getCharacterCurrentParams(kCharacterTatiana)[3]);
 		getCharacter(kCharacterTatiana).characterPosition.location = 1;
+
 		if (inComp(kCharacterCath, kCarRedSleeping, 7500) || inComp(kCharacterCath, kCarRedSleeping, 7850)) {
 			playNIS((kEventCathTurningNight - !isNight()));
 			playDialog(0, "BUMP", -1, 0);
 			bumpCathRDoor(33);
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -255,10 +290,13 @@ void LogicManager::HAND_Tatiana_DoJoinedSeqOtis(HAND_PARAMS) {
 			fedEx(kCharacterTatiana, getCharacterCurrentParams(kCharacterTatiana)[3], getCharacterCurrentParams(kCharacterTatiana)[4], (char *)&getCharacterCurrentParams(kCharacterTatiana)[5]);
 			getCharacterCurrentParams(kCharacterTatiana)[8] = 1;
 		}
+
 		break;
 	case 12:
 		startSeqOtis(kCharacterTatiana, (char *)&getCharacterCurrentParams(kCharacterTatiana)[0]);
 		break;
+	default:
+		break;
 	}
 }
 
@@ -273,16 +311,22 @@ void LogicManager::CONS_Tatiana_FinishSeqOtis(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Tatiana_FinishSeqOtis(HAND_PARAMS) {
-	if (msg->action == 0) {
-		if (getCharacter(kCharacterTatiana).direction == 4)
-			return;
-		goto LABEL_5;
-	}
-	if (msg->action == 3) {
-	LABEL_5:
+	switch (msg->action) {
+	case 0:
+		if (getCharacter(kCharacterTatiana).direction != 4) {
+			getCharacter(kCharacterTatiana).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterTatiana, _functionsTatiana[getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall]]);
+			fedEx(kCharacterTatiana, kCharacterTatiana, 18, 0);
+		}
+
+		break;
+	case 3:
 		getCharacter(kCharacterTatiana).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterTatiana, _functionsTatiana[getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall]]);
 		fedEx(kCharacterTatiana, kCharacterTatiana, 18, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -299,17 +343,22 @@ void LogicManager::CONS_Tatiana_DoWaitRealTime(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Tatiana_DoWaitRealTime(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		if (getCharacterCurrentParams(kCharacterTatiana)[1] || (getCharacterCurrentParams(kCharacterTatiana)[1] = _currentGameSessionTicks + getCharacterCurrentParams(kCharacterTatiana)[0],
 																_currentGameSessionTicks + getCharacterCurrentParams(kCharacterTatiana)[0] != 0)) {
 			if (getCharacterCurrentParams(kCharacterTatiana)[1] >= _currentGameSessionTicks)
-				return;
+				break;
+
 			getCharacterCurrentParams(kCharacterTatiana)[1] = 0x7FFFFFFF;
 		}
 
 		getCharacter(kCharacterTatiana).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterTatiana, _functionsTatiana[getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall]]);
 		fedEx(kCharacterTatiana, kCharacterTatiana, 18, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -326,11 +375,12 @@ void LogicManager::CONS_Tatiana_DoWait(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Tatiana_DoWait(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		if (getCharacterCurrentParams(kCharacterTatiana)[1] || (getCharacterCurrentParams(kCharacterTatiana)[1] = _gameTime + getCharacterCurrentParams(kCharacterTatiana)[0],
 																_gameTime + getCharacterCurrentParams(kCharacterTatiana)[0] != 0)) {
 			if (getCharacterCurrentParams(kCharacterTatiana)[1] >= _gameTime)
-				return;
+				break;
 
 			getCharacterCurrentParams(kCharacterTatiana)[1] = 0x7FFFFFFF;
 		}
@@ -338,6 +388,9 @@ void LogicManager::HAND_Tatiana_DoWait(HAND_PARAMS) {
 		getCharacter(kCharacterTatiana).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterTatiana, _functionsTatiana[getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall]]);
 		fedEx(kCharacterTatiana, kCharacterTatiana, 18, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -352,16 +405,18 @@ void LogicManager::CONS_Tatiana_WaitRCClear(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Tatiana_WaitRCClear(HAND_PARAMS) {
-	if (msg->action == 0) {
-		if (!rcClear())
-			return;
-		goto LABEL_7;
-	}
-	if (msg->action == 12 && rcClear()) {
-	LABEL_7:
-		getCharacter(kCharacterTatiana).currentCall--;
-		_engine->getMessageManager()->setMessageHandle(kCharacterTatiana, _functionsTatiana[getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall]]);
-		fedEx(kCharacterTatiana, kCharacterTatiana, 18, 0);
+	switch (msg->action) {
+	case 0:
+	case 12:
+		if (rcClear()) {
+			getCharacter(kCharacterTatiana).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterTatiana, _functionsTatiana[getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall]]);
+			fedEx(kCharacterTatiana, kCharacterTatiana, 18, 0);
+		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -379,22 +434,25 @@ void LogicManager::CONS_Tatiana_SaveGame(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Tatiana_SaveGame(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			save(
-				kCharacterTatiana,
-				getCharacterCurrentParams(kCharacterTatiana)[0],
-				getCharacterCurrentParams(kCharacterTatiana)[1]
-			);
+	switch (msg->action) {
+	case 0:
+		getCharacter(kCharacterTatiana).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterTatiana, _functionsTatiana[getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall]]);
+		fedEx(kCharacterTatiana, kCharacterTatiana, 18, 0);
+		break;
+	case 12:
+		save(
+			kCharacterTatiana,
+			getCharacterCurrentParams(kCharacterTatiana)[0],
+			getCharacterCurrentParams(kCharacterTatiana)[1]
+		);
 
-			getCharacter(kCharacterTatiana).currentCall--;
-			_engine->getMessageManager()->setMessageHandle(kCharacterTatiana, _functionsTatiana[getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall]]);
-			fedEx(kCharacterTatiana, kCharacterTatiana, 18, 0);
-		}
-	} else {
 		getCharacter(kCharacterTatiana).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterTatiana, _functionsTatiana[getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall]]);
 		fedEx(kCharacterTatiana, kCharacterTatiana, 18, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -414,8 +472,13 @@ void LogicManager::CONS_Tatiana_DoWalk(CONS_PARAMS) {
 void LogicManager::HAND_Tatiana_DoWalk(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
-		if (walk(kCharacterTatiana, getCharacterCurrentParams(kCharacterTatiana)[0], getCharacterCurrentParams(kCharacterTatiana)[1]))
-			goto LABEL_14;
+	case 12:
+		if (walk(kCharacterTatiana, getCharacterCurrentParams(kCharacterTatiana)[0], getCharacterCurrentParams(kCharacterTatiana)[1])) {
+			getCharacter(kCharacterTatiana).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterTatiana, _functionsTatiana[getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall]]);
+			fedEx(kCharacterTatiana, kCharacterTatiana, 18, 0);
+		}
+
 		break;
 	case 5:
 		if (_gameEvents[kEventTatianaAskMatchSpeakRussian] || _gameEvents[kEventTatianaAskMatch] || _gameEvents[kEventVassiliSeizure]) {
@@ -432,16 +495,8 @@ void LogicManager::HAND_Tatiana_DoWalk(HAND_PARAMS) {
 	case 6:
 		playChrExcuseMe(kCharacterTatiana, kCharacterCath, 0);
 		break;
-	case 12:
-		if (walk(kCharacterTatiana, getCharacterCurrentParams(kCharacterTatiana)[0], getCharacterCurrentParams(kCharacterTatiana)[1])) {
-		LABEL_14:
-			getCharacter(kCharacterTatiana).currentCall--;
-			_engine->getMessageManager()->setMessageHandle(kCharacterTatiana, _functionsTatiana[getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall]]);
-			fedEx(kCharacterTatiana, kCharacterTatiana, 18, 0);
-		}
-		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -479,6 +534,7 @@ void LogicManager::HAND_Tatiana_EnterComp(HAND_PARAMS) {
 			_engine->getMessageManager()->setMessageHandle(kCharacterTatiana, _functionsTatiana[getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall]]);
 			fedEx(kCharacterTatiana, kCharacterTatiana, 18, 0);
 		}
+
 		break;
 	case 69239528:
 		if (_gameProgress[kProgressChapter] == 1) {
@@ -488,6 +544,9 @@ void LogicManager::HAND_Tatiana_EnterComp(HAND_PARAMS) {
 			getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 2;
 			TatianaCall(&LogicManager::CONS_Tatiana_DoEnterCorrOtis, "673Db", 33, 0, 0);
 		}
+
+		break;
+	default:
 		break;
 	}
 }
@@ -512,6 +571,7 @@ void LogicManager::HAND_Tatiana_ExitComp(HAND_PARAMS) {
 			getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 2;
 			TatianaCall(&LogicManager::CONS_Tatiana_DoCorrOtis, "673Bb", 33, 0, 0);
 		}
+
 		break;
 	case 18:
 		if (getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] &&
@@ -527,6 +587,7 @@ void LogicManager::HAND_Tatiana_ExitComp(HAND_PARAMS) {
 			
 			softBlockAtDoor(kCharacterTatiana, 33);
 		}
+
 		break;
 	case 69239528:
 		softReleaseAtDoor(kCharacterTatiana, 33);
@@ -536,6 +597,8 @@ void LogicManager::HAND_Tatiana_ExitComp(HAND_PARAMS) {
 		_engine->getMessageManager()->setMessageHandle(kCharacterTatiana, _functionsTatiana[getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall]]);
 		fedEx(kCharacterTatiana, kCharacterTatiana, 18, 0);
 		break;
+	default:
+		break;
 	}
 }
 
@@ -562,12 +625,13 @@ void LogicManager::HAND_Tatiana_CompLogic(HAND_PARAMS) {
 			getCharacter(kCharacterTatiana).currentCall--;
 			_engine->getMessageManager()->setMessageHandle(kCharacterTatiana, _functionsTatiana[getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall]]);
 			fedEx(kCharacterTatiana, kCharacterTatiana, 18, 0);
-			return;
+			break;
 		}
+
 		if (getCharacterCurrentParams(kCharacterTatiana)[1]) {
 			if (getCharacterCurrentParams(kCharacterTatiana)[4] || (getCharacterCurrentParams(kCharacterTatiana)[4] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
 				if (getCharacterCurrentParams(kCharacterTatiana)[4] >= _currentGameSessionTicks)
-					return;
+					break;
 
 				getCharacterCurrentParams(kCharacterTatiana)[4] = 0x7FFFFFFF;
 			}
@@ -580,12 +644,14 @@ void LogicManager::HAND_Tatiana_CompLogic(HAND_PARAMS) {
 		} else {
 			getCharacterCurrentParams(kCharacterTatiana)[4] = 0;
 		}
+
 		break;
 	case 8:
 	case 9:
 		if (getCharacterCurrentParams(kCharacterTatiana)[1]) {
 			setDoor(33, kCharacterTatiana, 1, 0, 0);
 			setDoor(49, kCharacterTatiana, 1, 0, 0);
+
 			if (msg->param.intParam == 49) {
 				getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 4;
 				TatianaCall(&LogicManager::CONS_Tatiana_DoDialog, getCathWCDialog(), 0, 0, 0);
@@ -612,6 +678,7 @@ void LogicManager::HAND_Tatiana_CompLogic(HAND_PARAMS) {
 				TatianaCall(&LogicManager::CONS_Tatiana_DoDialog, "LIB013", 0, 0, 0);
 			}
 		}
+
 		break;
 	case 12:
 		setDoor(33, kCharacterTatiana, 1, 10, 9);
@@ -624,6 +691,7 @@ void LogicManager::HAND_Tatiana_CompLogic(HAND_PARAMS) {
 			getCharacterCurrentParams(kCharacterTatiana)[2] = 0;
 			getCharacterCurrentParams(kCharacterTatiana)[1] = 0;
 		}
+
 		break;
 	case 18:
 		switch (getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8]) {
@@ -649,11 +717,12 @@ void LogicManager::HAND_Tatiana_CompLogic(HAND_PARAMS) {
 			getCharacterCurrentParams(kCharacterTatiana)[2] = 1;
 			break;
 		default:
-			return;
+			break;
 		}
+
 		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -668,19 +737,25 @@ void LogicManager::CONS_Tatiana_Birth(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Tatiana_Birth(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			autoMessage(kCharacterTatiana, 191198209, 0);
-			getCharacter(kCharacterTatiana).characterPosition.position = 5419;
-			getCharacter(kCharacterTatiana).characterPosition.location = 1;
-			getCharacter(kCharacterTatiana).characterPosition.car = kCarRestaurant;
-			setDoor(33, kCharacterCath, 1, 10, 9);
-			setDoor(49, kCharacterCath, 1, 10, 9);
-			setDoor(41, kCharacterCath, 0, 255, 255);
+	switch (msg->action) {
+	case 0:
+		if (_gameTime > 1062000 && !getCharacterCurrentParams(kCharacterTatiana)[0]) {
+			getCharacterCurrentParams(kCharacterTatiana)[0] = 1;
+			CONS_Tatiana_AtDinner(0, 0, 0, 0);
 		}
-	} else if (_gameTime > 1062000 && !getCharacterCurrentParams(kCharacterTatiana)[0]) {
-		getCharacterCurrentParams(kCharacterTatiana)[0] = 1;
-		CONS_Tatiana_AtDinner(0, 0, 0, 0);
+
+		break;
+	case 12:
+		autoMessage(kCharacterTatiana, 191198209, 0);
+		getCharacter(kCharacterTatiana).characterPosition.position = 5419;
+		getCharacter(kCharacterTatiana).characterPosition.location = 1;
+		getCharacter(kCharacterTatiana).characterPosition.car = kCarRestaurant;
+		setDoor(33, kCharacterCath, 1, 10, 9);
+		setDoor(49, kCharacterCath, 1, 10, 9);
+		setDoor(41, kCharacterCath, 0, 255, 255);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -697,27 +772,33 @@ void LogicManager::CONS_Tatiana_DoSpecialSalonWalk(CONS_PARAMS) {
 void LogicManager::HAND_Tatiana_DoSpecialSalonWalk(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
-		if (getCharacterCurrentParams(kCharacterTatiana)[0])
-			goto LABEL_13;
-		if (_gameTime > 1143000 && !getCharacterCurrentParams(kCharacterTatiana)[1]) {
-			getCharacterCurrentParams(kCharacterTatiana)[1] = 1;
-			startSeqOtis(kCharacterTatiana, "806DS");
-			getCharacterCurrentParams(kCharacterTatiana)[0] = 1;
-		}
-		if (getCharacterCurrentParams(kCharacterTatiana)[0])
-			goto LABEL_13;
-		if (!getCharacterCurrentParams(kCharacterTatiana)[2]) {
-			getCharacterCurrentParams(kCharacterTatiana)[2] = _gameTime + 4500;
-			if (_gameTime == -4500)
-				goto LABEL_12;
-		}
-		if (getCharacterCurrentParams(kCharacterTatiana)[2] < _gameTime) {
-			getCharacterCurrentParams(kCharacterTatiana)[2] = 0x7FFFFFFF;
-		LABEL_12:
-			startSeqOtis(kCharacterTatiana, "806DS");
-			getCharacterCurrentParams(kCharacterTatiana)[0] = 1;
+		if (!getCharacterCurrentParams(kCharacterTatiana)[0]) {
+			if (_gameTime > 1143000 && !getCharacterCurrentParams(kCharacterTatiana)[1]) {
+				getCharacterCurrentParams(kCharacterTatiana)[1] = 1;
+				startSeqOtis(kCharacterTatiana, "806DS");
+				getCharacterCurrentParams(kCharacterTatiana)[0] = 1;
+			}
+
+			if (!getCharacterCurrentParams(kCharacterTatiana)[0]) {
+				bool skip = false;
+
+				if (!getCharacterCurrentParams(kCharacterTatiana)[2]) {
+					getCharacterCurrentParams(kCharacterTatiana)[2] = _gameTime + 4500;
+					if (_gameTime == -4500) {
+						skip = true;
+						startSeqOtis(kCharacterTatiana, "806DS");
+						getCharacterCurrentParams(kCharacterTatiana)[0] = 1;
+					}
+				}
+
+				if (!skip && getCharacterCurrentParams(kCharacterTatiana)[2] < _gameTime) {
+					getCharacterCurrentParams(kCharacterTatiana)[2] = 0x7FFFFFFF;
+					startSeqOtis(kCharacterTatiana, "806DS");
+					getCharacterCurrentParams(kCharacterTatiana)[0] = 1;
+				}
+			}
 		}
-	LABEL_13:
+
 		if (getCharacter(kCharacterTatiana).characterPosition.position <= 2330) {
 			send(kCharacterTatiana, kCharacterAlexei, 157159392, 0);
 			endGraphics(kCharacterTatiana);
@@ -726,6 +807,7 @@ void LogicManager::HAND_Tatiana_DoSpecialSalonWalk(HAND_PARAMS) {
 			_engine->getMessageManager()->setMessageHandle(kCharacterTatiana, _functionsTatiana[getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall]]);
 			fedEx(kCharacterTatiana, kCharacterTatiana, 18, 0);
 		}
+
 		break;
 	case 3:
 		send(kCharacterTatiana, kCharacterAlexei, 188784532, 0);
@@ -733,7 +815,7 @@ void LogicManager::HAND_Tatiana_DoSpecialSalonWalk(HAND_PARAMS) {
 		getCharacter(kCharacterTatiana).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterTatiana, _functionsTatiana[getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall]]);
 		fedEx(kCharacterTatiana, kCharacterTatiana, 18, 0);
-		return;
+		break;
 	case 12:
 		if (inSalon(kCharacterCath)) {
 			startSeqOtis(kCharacterTatiana, "806DS");
@@ -741,16 +823,18 @@ void LogicManager::HAND_Tatiana_DoSpecialSalonWalk(HAND_PARAMS) {
 		} else {
 			endGraphics(kCharacterTatiana);
 		}
-		return;
+
+		break;
 	case 17:
 		if (!getCharacterCurrentParams(kCharacterTatiana)[0] && inSalon(kCharacterCath)) {
 			startSeqOtis(kCharacterTatiana, "806DS");
 			advanceFrame(kCharacterTatiana);
 			getCharacterCurrentParams(kCharacterTatiana)[0] = 1;
 		}
-		return;
+
+		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -765,68 +849,61 @@ void LogicManager::CONS_Tatiana_AtDinner(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Tatiana_AtDinner(HAND_PARAMS) {
-	if (msg->action > 12) {
-		if (msg->action > 122288808) {
-			if (msg->action == 122358304) {
-				startCycOtis(kCharacterTatiana, "BLANK");
-			} else if (msg->action == 124973510) {
-				CONS_Tatiana_ExitDining(0, 0, 0, 0);
+	switch (msg->action) {
+	case 0:
+	{
+		if (!whoRunningDialog(kCharacterTatiana) && getCharacterCurrentParams(kCharacterTatiana)[3] && getCharacterCurrentParams(kCharacterTatiana)[2] < 2 && !dialogRunning("TAT1066")) {
+			bool skip1 = false;
+
+			if (getCharacterCurrentParams(kCharacterTatiana)[4] || (getCharacterCurrentParams(kCharacterTatiana)[4] = _currentGameSessionTicks + 450, _currentGameSessionTicks != -450)) {
+				if (getCharacterCurrentParams(kCharacterTatiana)[4] >= _currentGameSessionTicks) {
+					skip1 = true;
+				}
+
+				if (!skip1) {
+					getCharacterCurrentParams(kCharacterTatiana)[4] = 0x7FFFFFFF;
+				}
 			}
-		} else if (msg->action == 122288808) {
-			startCycOtis(kCharacterTatiana, "014A");
-		} else if (msg->action == 17) {
-			getCharacterCurrentParams(kCharacterTatiana)[0] = 1;
-			if (!checkCathDir(kCarRestaurant, 67))
-				getCharacterCurrentParams(kCharacterTatiana)[0] = 0;
-			getCharacterCurrentParams(kCharacterTatiana)[3] = checkCathDir(kCarRestaurant, 69) || checkCathDir(kCarRestaurant, 70) || checkCathDir(kCarRestaurant, 71);
-		}
-		return;
-	}
-	if (msg->action == 12) {
-		send(kCharacterTatiana, kCharacterTableE, 136455232, 0);
-		startCycOtis(kCharacterTatiana, "014A");
-		return;
-	}
-	if (msg->action == 0) {
-		if (whoRunningDialog(kCharacterTatiana) || !getCharacterCurrentParams(kCharacterTatiana)[3] || getCharacterCurrentParams(kCharacterTatiana)[2] >= 2 || dialogRunning("TAT1066")) {
-			goto tatiana_chapter1_handler_goto;
-		}
 
-		if (getCharacterCurrentParams(kCharacterTatiana)[4] || (getCharacterCurrentParams(kCharacterTatiana)[4] = _currentGameSessionTicks + 450, _currentGameSessionTicks != -450)) {
-			if (getCharacterCurrentParams(kCharacterTatiana)[4] >= _currentGameSessionTicks)
-				goto LABEL_23;
-			getCharacterCurrentParams(kCharacterTatiana)[4] = 0x7FFFFFFF;
-		}
-		
-		if (!getCharacterCurrentParams(kCharacterTatiana)[2]) {
-			playDialog(kCharacterTatiana, "TAT1069A", -1, 0);
-		} else {
-			playDialog(kCharacterTatiana, "TAT1069B", -1, 0);
-		}
-		
-		_gameProgress[kProgressField64] = 1;
-		getCharacterCurrentParams(kCharacterTatiana)[2]++;
-		getCharacterCurrentParams(kCharacterTatiana)[4] = 0;
-	LABEL_23:
-		if (checkCathDir(kCarRestaurant, 71)) {
-			if (getCharacterCurrentParams(kCharacterTatiana)[5] || (getCharacterCurrentParams(kCharacterTatiana)[5] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
-				if (getCharacterCurrentParams(kCharacterTatiana)[5] >= _currentGameSessionTicks)
-					goto tatiana_chapter1_handler_goto;
-				getCharacterCurrentParams(kCharacterTatiana)[5] = 0x7FFFFFFF;
+			if (!skip1) {
+				if (!getCharacterCurrentParams(kCharacterTatiana)[2]) {
+					playDialog(kCharacterTatiana, "TAT1069A", -1, 0);
+				} else {
+					playDialog(kCharacterTatiana, "TAT1069B", -1, 0);
+				}
+
+				_gameProgress[kProgressField64] = 1;
+				getCharacterCurrentParams(kCharacterTatiana)[2]++;
+				getCharacterCurrentParams(kCharacterTatiana)[4] = 0;
 			}
-			
-			if (!getCharacterCurrentParams(kCharacterTatiana)[2]) {
-				playDialog(kCharacterTatiana, "TAT1069A", -1, 0);
-			} else {
-				playDialog(kCharacterTatiana, "TAT1069B", -1, 0);
+
+			bool skip2 = false;
+
+			if (checkCathDir(kCarRestaurant, 71)) {
+				if (getCharacterCurrentParams(kCharacterTatiana)[5] || (getCharacterCurrentParams(kCharacterTatiana)[5] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
+					if (getCharacterCurrentParams(kCharacterTatiana)[5] >= _currentGameSessionTicks) {
+						skip2 = true;
+					}
+
+					if (!skip2) {
+						getCharacterCurrentParams(kCharacterTatiana)[5] = 0x7FFFFFFF;
+					}
+				}
+
+				if (!skip2) {
+					if (!getCharacterCurrentParams(kCharacterTatiana)[2]) {
+						playDialog(kCharacterTatiana, "TAT1069A", -1, 0);
+					} else {
+						playDialog(kCharacterTatiana, "TAT1069B", -1, 0);
+					}
+
+					_gameProgress[kProgressField64] = 1;
+					getCharacterCurrentParams(kCharacterTatiana)[2]++;
+					getCharacterCurrentParams(kCharacterTatiana)[5] = 0;
+				}
 			}
-			
-			_gameProgress[kProgressField64] = 1;
-			getCharacterCurrentParams(kCharacterTatiana)[2]++;
-			getCharacterCurrentParams(kCharacterTatiana)[5] = 0;
 		}
 
-	tatiana_chapter1_handler_goto:
 		if (_gameTime > 1084500 && !getCharacterCurrentParams(kCharacterTatiana)[6]) {
 			getCharacterCurrentParams(kCharacterTatiana)[6] = 1;
 			send(kCharacterTatiana, kCharacterHeadWait, 257489762, 0);
@@ -835,7 +912,7 @@ void LogicManager::HAND_Tatiana_AtDinner(HAND_PARAMS) {
 		if (getCharacterCurrentParams(kCharacterTatiana)[0]) {
 			if (getCharacterCurrentParams(kCharacterTatiana)[7] || (getCharacterCurrentParams(kCharacterTatiana)[7] = _currentGameSessionTicks + 90, _currentGameSessionTicks != -90)) {
 				if (getCharacterCurrentParams(kCharacterTatiana)[7] >= _currentGameSessionTicks)
-					return;
+					break;
 
 				getCharacterCurrentParams(kCharacterTatiana)[7] = 0x7FFFFFFF;
 			}
@@ -844,6 +921,32 @@ void LogicManager::HAND_Tatiana_AtDinner(HAND_PARAMS) {
 		} else {
 			getCharacterCurrentParams(kCharacterTatiana)[7] = 0;
 		}
+
+		break;
+	}
+	case 12:
+		send(kCharacterTatiana, kCharacterTableE, 136455232, 0);
+		startCycOtis(kCharacterTatiana, "014A");
+		break;
+	case 17:
+		getCharacterCurrentParams(kCharacterTatiana)[0] = 1;
+
+		if (!checkCathDir(kCarRestaurant, 67))
+			getCharacterCurrentParams(kCharacterTatiana)[0] = 0;
+
+		getCharacterCurrentParams(kCharacterTatiana)[3] = (checkCathDir(kCarRestaurant, 69) || checkCathDir(kCarRestaurant, 70) || checkCathDir(kCarRestaurant, 71)) ? 1 : 0;
+		break;
+	case 122358304:
+		startCycOtis(kCharacterTatiana, "BLANK");
+		break;
+	case 124973510:
+		CONS_Tatiana_ExitDining(0, 0, 0, 0);
+		break;
+	case 122288808:
+		startCycOtis(kCharacterTatiana, "014A");
+		break;
+	default:
+		break;
 	}
 }
 
@@ -858,10 +961,12 @@ void LogicManager::CONS_Tatiana_ExitDining(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Tatiana_ExitDining(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 1;
 		TatianaCall(&LogicManager::CONS_Tatiana_WaitRCClear, 0, 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8]) {
 		case 1:
 			getCharacter(kCharacterTatiana).characterPosition.location = 0;
@@ -881,8 +986,14 @@ void LogicManager::HAND_Tatiana_ExitDining(HAND_PARAMS) {
 			send(kCharacterTatiana, kCharacterAugust, 268620864, 0);
 			CONS_Tatiana_ReturnToComp(0, 0, 0, 0);
 			break;
+		default:
+			break;
 		}
-	}
+
+		break;
+	default:
+		break;
+	}
 }
 
 void LogicManager::CONS_Tatiana_ReturnToComp(CONS_PARAMS) {
@@ -896,11 +1007,13 @@ void LogicManager::CONS_Tatiana_ReturnToComp(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Tatiana_ReturnToComp(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterTatiana).clothes = 1;
 		getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 1;
 		TatianaCall(&LogicManager::CONS_Tatiana_DoWalk, 4, 8513, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8]) {
 		case 1:
 			getCharacter(kCharacterTatiana).clothes = 0;
@@ -908,11 +1021,13 @@ void LogicManager::HAND_Tatiana_ReturnToComp(HAND_PARAMS) {
 			startSeqOtis(kCharacterTatiana, "604Aa");
 			blockAtDoor(kCharacterTatiana, 32);
 			getCharacter(kCharacterTatiana).characterPosition.location = 1;
+
 			if (inSuite(kCharacterCath, kCarRedSleeping, 7850)) {
 				playNIS((kEventCathTurningNight - !isNight()));
 				playDialog(0, "BUMP", -1, 0);
 				bumpCathFDoor(32);
 			}
+
 			getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 2;
 			TatianaCall(&LogicManager::CONS_Tatiana_FinishSeqOtis, 0, 0, 0, 0);
 			break;
@@ -923,9 +1038,9 @@ void LogicManager::HAND_Tatiana_ReturnToComp(HAND_PARAMS) {
 			send(kCharacterTatiana, kCharacterAlexei, 135854208, 0);
 			setDoor(32, kCharacterCath, 1, 0, 0);
 			setDoor(33, kCharacterCath, 1, 0, 0);
-			goto LABEL_10;
+
+			// fall through
 		case 3:
-		LABEL_10:
 			if (whoRunningDialog(kCharacterTatiana)) {
 				getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 3;
 				TatianaCall(&LogicManager::CONS_Tatiana_DoWait, 75, 0, 0, 0);
@@ -933,6 +1048,7 @@ void LogicManager::HAND_Tatiana_ReturnToComp(HAND_PARAMS) {
 				getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 4;
 				TatianaCall(&LogicManager::CONS_Tatiana_DoDialog, "TAT1071A", 0, 0, 0);
 			}
+
 			break;
 		case 4:
 			getCharacter(kCharacterTatiana).characterPosition.position = 7500;
@@ -949,10 +1065,15 @@ void LogicManager::HAND_Tatiana_ReturnToComp(HAND_PARAMS) {
 				setDoor(49, kCharacterCath, 1, 10, 9);
 				CONS_Tatiana_GetSomeAir(0, 0, 0, 0);
 			}
+
 			break;
 		default:
-			return;
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -969,52 +1090,90 @@ void LogicManager::CONS_Tatiana_GetSomeAir(CONS_PARAMS) {
 void LogicManager::HAND_Tatiana_GetSomeAir(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
-		if (getCharacterCurrentParams(kCharacterTatiana)[0] == 0x7FFFFFFF || _gameTime <= 1179000)
-			goto LABEL_17;
-		if (_gameTime > 1233000)
-			goto LABEL_12;
+		if (getCharacterCurrentParams(kCharacterTatiana)[0] == 0x7FFFFFFF || _gameTime <= 1179000) {
+			if (!_gameEvents[kEventTatianaAskMatchSpeakRussian] && !_gameEvents[kEventTatianaAskMatch] && cathHasItem(kItemMatchBox) && onLowPlatform(kCharacterCath)) {
+				setDoor(25, kCharacterTatiana, 1, 0, 1);
+				setDoor(23, kCharacterTatiana, 1, 0, 1);
+			}
+
+			break;
+		}
+
+		if (_gameTime > 1233000) {
+			getCharacterCurrentParams(kCharacterTatiana)[0] = 0x7FFFFFFF;
+			setDoor(25, kCharacterCath, 0, 255, 255);
+			setDoor(23, kCharacterCath, 0, 255, 255);
+			releaseView(kCharacterTatiana, kCarGreenSleeping, 70);
+			releaseView(kCharacterTatiana, kCarGreenSleeping, 71);
+
+			if (onLowPlatform(kCharacterCath)) {
+				playChrExcuseMe(kCharacterTatiana, kCharacterCath, 0);
+				if (checkCathDir(kCarGreenSleeping, 62))
+					bumpCath(kCarGreenSleeping, 72, 255);
+			}
+
+			getCharacter(kCharacterTatiana).inventoryItem = 0;
+			CONS_Tatiana_ReturnToCompAgain(0, 0, 0, 0);
+			break;
+		}
+
 		if (!_gameEvents[kEventTatianaAskMatchSpeakRussian] && !_gameEvents[kEventTatianaAskMatch] || onLowPlatform(kCharacterCath) || !getCharacterCurrentParams(kCharacterTatiana)[0]) {
 			getCharacterCurrentParams(kCharacterTatiana)[0] = _gameTime;
-			if (!_gameTime)
-				goto LABEL_13;
+			if (!_gameTime) {
+				setDoor(25, kCharacterCath, 0, 255, 255);
+				setDoor(23, kCharacterCath, 0, 255, 255);
+				releaseView(kCharacterTatiana, kCarGreenSleeping, 70);
+				releaseView(kCharacterTatiana, kCarGreenSleeping, 71);
+
+				if (onLowPlatform(kCharacterCath)) {
+					playChrExcuseMe(kCharacterTatiana, kCharacterCath, 0);
+					if (checkCathDir(kCarGreenSleeping, 62))
+						bumpCath(kCarGreenSleeping, 72, 255);
+				}
+
+				getCharacter(kCharacterTatiana).inventoryItem = 0;
+				CONS_Tatiana_ReturnToCompAgain(0, 0, 0, 0);
+				break;
+			}
 		}
+
 		if (getCharacterCurrentParams(kCharacterTatiana)[0] >= _gameTime) {
-		LABEL_17:
 			if (!_gameEvents[kEventTatianaAskMatchSpeakRussian] && !_gameEvents[kEventTatianaAskMatch] && cathHasItem(kItemMatchBox) && onLowPlatform(kCharacterCath)) {
 				setDoor(25, kCharacterTatiana, 1, 0, 1);
 				setDoor(23, kCharacterTatiana, 1, 0, 1);
 			}
 		} else {
-		LABEL_12:
 			getCharacterCurrentParams(kCharacterTatiana)[0] = 0x7FFFFFFF;
-		LABEL_13:
 			setDoor(25, kCharacterCath, 0, 255, 255);
 			setDoor(23, kCharacterCath, 0, 255, 255);
 			releaseView(kCharacterTatiana, kCarGreenSleeping, 70);
 			releaseView(kCharacterTatiana, kCarGreenSleeping, 71);
+
 			if (onLowPlatform(kCharacterCath)) {
 				playChrExcuseMe(kCharacterTatiana, kCharacterCath, 0);
 				if (checkCathDir(kCarGreenSleeping, 62))
 					bumpCath(kCarGreenSleeping, 72, 255);
 			}
+
 			getCharacter(kCharacterTatiana).inventoryItem = 0;
 			CONS_Tatiana_ReturnToCompAgain(0, 0, 0, 0);
 		}
+
 		break;
 	case 1:
 		getCharacter(kCharacterTatiana).inventoryItem = 0;
 		getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 4;
 		TatianaCall(&LogicManager::CONS_Tatiana_SaveGame, 2, kEventTatianaGivePoem, 0, 0);
-		return;
+		break;
 	case 9:
 		getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 3;
 		TatianaCall(&LogicManager::CONS_Tatiana_SaveGame, 2, kEventTatianaAskMatchSpeakRussian, 0, 0);
-		return;
+		break;
 	case 12:
 		send(kCharacterTatiana, kCharacterVassili, 122732000, 0);
 		getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 1;
 		TatianaCall(&LogicManager::CONS_Tatiana_ExitComp, 0, 0, 0, 0);
-		return;
+		break;
 	case 18:
 		switch (getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8]) {
 		case 1:
@@ -1045,11 +1204,12 @@ void LogicManager::HAND_Tatiana_GetSomeAir(HAND_PARAMS) {
 			cleanNIS();
 			break;
 		default:
-			return;
+			break;
 		}
-		return;
+
+		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -1064,16 +1224,22 @@ void LogicManager::CONS_Tatiana_ReturnToCompAgain(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Tatiana_ReturnToCompAgain(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 1;
 		TatianaCall(&LogicManager::CONS_Tatiana_DoWalk, 4, 7500, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		if (getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] == 1) {
 			getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 2;
 			TatianaCall(&LogicManager::CONS_Tatiana_EnterComp, 0, 0, 0, 0);
 		} else if (getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] == 2) {
 			CONS_Tatiana_Asleep(0, 0, 0, 0);
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1088,7 +1254,8 @@ void LogicManager::CONS_Tatiana_Asleep(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Tatiana_Asleep(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterTatiana).characterPosition.car = kCarRedSleeping;
 		getCharacter(kCharacterTatiana).characterPosition.position = 7500;
 		getCharacter(kCharacterTatiana).characterPosition.location = 1;
@@ -1100,6 +1267,9 @@ void LogicManager::HAND_Tatiana_Asleep(HAND_PARAMS) {
 		setDoor(33, kCharacterCath, 1, 10, 9);
 		setDoor(49, kCharacterCath, 1, 10, 9);
 		setDoor(41, kCharacterCath, 0, 255, 255);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1114,19 +1284,22 @@ void LogicManager::CONS_Tatiana_StartPart2(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Tatiana_StartPart2(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			endGraphics(kCharacterTatiana);
-			getCharacter(kCharacterTatiana).characterPosition.car = kCarRestaurant;
-			getCharacter(kCharacterTatiana).characterPosition.position = 5420;
-			getCharacter(kCharacterTatiana).characterPosition.location = 1;
-			getCharacter(kCharacterTatiana).clothes = 2;
-			setDoor(33, kCharacterCath, 1, 10, 9);
-			setDoor(49, kCharacterCath, 1, 10, 9);
-			setDoor(41, kCharacterCath, 0, 255, 255);
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		CONS_Tatiana_EatingBreakfast(0, 0, 0, 0);
+		break;
+	case 12:
+		endGraphics(kCharacterTatiana);
+		getCharacter(kCharacterTatiana).characterPosition.car = kCarRestaurant;
+		getCharacter(kCharacterTatiana).characterPosition.position = 5420;
+		getCharacter(kCharacterTatiana).characterPosition.location = 1;
+		getCharacter(kCharacterTatiana).clothes = 2;
+		setDoor(33, kCharacterCath, 1, 10, 9);
+		setDoor(49, kCharacterCath, 1, 10, 9);
+		setDoor(41, kCharacterCath, 0, 255, 255);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1141,27 +1314,35 @@ void LogicManager::CONS_Tatiana_EatingBreakfast(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Tatiana_EatingBreakfast(HAND_PARAMS) {
-	if (msg->action > 12) {
-		if (msg->action == 17) {
-			if (checkCathDir(kCarRestaurant, 64) || checkCathDir(kCarRestaurant, 65)) {
-				getCharacter(kCharacterTatiana).inventoryItem = 0;
-				CONS_Tatiana_BreakfastClick(0, 0, 0, 0);
-			}
-		} else if (msg->action == 290869168) {
-			getCharacterCurrentParams(kCharacterTatiana)[0] = 1;
+	switch (msg->action) {
+	case 0:
+		if (_gameTime > 1800000 && getCharacterCurrentParams(kCharacterTatiana)[0] && rcClear()) {
+			getCharacter(kCharacterTatiana).inventoryItem = 0;
+			CONS_Tatiana_JoinAlexei(0, 0, 0, 0);
 		}
-	} else if (msg->action == 12) {
+
+		break;
+	case 1:
+		getCharacter(kCharacterTatiana).inventoryItem = 0;
+		CONS_Tatiana_BreakfastClick(0, 0, 0, 0);
+		break;
+	case 12:
 		startCycOtis(kCharacterTatiana, "024A");
 		send(kCharacterTatiana, kCharacterTableF, 136455232, 0);
 		getCharacter(kCharacterTatiana).inventoryItem = 0x80;
-	} else if (msg->action) {
-		if (msg->action == 1) {
+		break;
+	case 17:
+		if (checkCathDir(kCarRestaurant, 64) || checkCathDir(kCarRestaurant, 65)) {
 			getCharacter(kCharacterTatiana).inventoryItem = 0;
 			CONS_Tatiana_BreakfastClick(0, 0, 0, 0);
 		}
-	} else if (_gameTime > 1800000 && getCharacterCurrentParams(kCharacterTatiana)[0] && rcClear()) {
-		getCharacter(kCharacterTatiana).inventoryItem = 0;
-		CONS_Tatiana_JoinAlexei(0, 0, 0, 0);
+
+		break;
+	case 290869168:
+		getCharacterCurrentParams(kCharacterTatiana)[0] = 1;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1176,7 +1357,8 @@ void LogicManager::CONS_Tatiana_BreakfastClick(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Tatiana_BreakfastClick(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		if (_gameEvents[kEventTatianaGivePoem]) {
 			getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 1;
 			TatianaCall(&LogicManager::CONS_Tatiana_SaveGame, 2, kEventTatianaBreakfastAlexei, 0, 0);
@@ -1184,7 +1366,9 @@ void LogicManager::HAND_Tatiana_BreakfastClick(HAND_PARAMS) {
 			getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 2;
 			TatianaCall(&LogicManager::CONS_Tatiana_SaveGame, 2, kEventTatianaBreakfast, 0, 0);
 		}
-	} else if (msg->action == 18) {
+
+		break;
+	case 18:
 		if (getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] == 1) {
 			forceJump(kCharacterAlexei, &LogicManager::CONS_Alexei_AtBreakfast);
 			playNIS(kEventTatianaBreakfastAlexei);
@@ -1194,14 +1378,20 @@ void LogicManager::HAND_Tatiana_BreakfastClick(HAND_PARAMS) {
 		} else if (getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] == 2) {
 			forceJump(kCharacterAlexei, &LogicManager::CONS_Alexei_AtBreakfast);
 			playNIS(kEventTatianaBreakfast);
+
 			if (cathHasItem(kItemParchemin)) {
 				playNIS(kEventTatianaBreakfastGivePoem);
 				takeCathItem(kItemParchemin);
 			} else {
 				playNIS(kEventTatianaAlexei);
 			}
+
 			CONS_Tatiana_JoinAlexei(0, 0, 0, 0);
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1216,27 +1406,34 @@ void LogicManager::CONS_Tatiana_JoinAlexei(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Tatiana_JoinAlexei(HAND_PARAMS) {
-	if (msg->action > 18) {
-		if (msg->action == 123857088) {
-			startCycOtis(kCharacterTatiana, "018G");
-			getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 1;
-			TatianaCall(&LogicManager::CONS_Tatiana_DoWait, 1800, 0, 0, 0);
-		} else if (msg->action == 156444784) {
-			getCharacter(kCharacterTatiana).characterPosition.location = 1;
-			startCycOtis(kCharacterTatiana, "BLANK");
-		}
-	} else if (msg->action == 18) {
+	switch (msg->action) {
+	case 8:
 		if (getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] == 1)
 			CONS_Tatiana_LeaveBreakfast(0, 0, 0, 0);
-	} else if (msg->action == 12) {
+
+		break;
+	case 12:
 		getCharacter(kCharacterTatiana).inventoryItem = 0;
 		getCharacter(kCharacterTatiana).characterPosition.location = 0;
 		send(kCharacterTatiana, kCharacterTableF, 103798704, "024D");
-		if (_gameEvents[kEventTatianaBreakfastAlexei] || (_gameEvents[kEventTatianaBreakfast], _gameEvents[kEventTatianaBreakfast])) {
+		if (_gameEvents[kEventTatianaBreakfastAlexei] || _gameEvents[kEventTatianaBreakfast]) {
 			send(kCharacterTatiana, kCharacterAlexei, 236053296, 69);
 		} else {
 			send(kCharacterTatiana, kCharacterAlexei, 236053296, 0);
 		}
+
+		break;
+	case 123857088:
+		startCycOtis(kCharacterTatiana, "018G");
+		getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 1;
+		TatianaCall(&LogicManager::CONS_Tatiana_DoWait, 1800, 0, 0, 0);
+		break;
+	case 156444784:
+		getCharacter(kCharacterTatiana).characterPosition.location = 1;
+		startCycOtis(kCharacterTatiana, "BLANK");
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1251,10 +1448,12 @@ void LogicManager::CONS_Tatiana_LeaveBreakfast(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Tatiana_LeaveBreakfast(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 1;
 		TatianaCall(&LogicManager::CONS_Tatiana_WaitRCClear, 0, 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8]) {
 		case 1:
 			getCharacter(kCharacterTatiana).characterPosition.location = 0;
@@ -1266,15 +1465,23 @@ void LogicManager::HAND_Tatiana_LeaveBreakfast(HAND_PARAMS) {
 			releaseView(kCharacterTatiana, kCarRestaurant, 63);
 			send(kCharacterTatiana, kCharacterWaiter2, 302203328, 0);
 			startSeqOtis(kCharacterTatiana, "805DS");
+
 			if (inDiningRoom(kCharacterCath))
 				advanceFrame(kCharacterTatiana);
+
 			getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 3;
 			TatianaCall(&LogicManager::CONS_Tatiana_FinishSeqOtis, 0, 0, 0, 0);
 			break;
 		case 3:
 			CONS_Tatiana_ReturnComp(0, 0, 0, 0);
 			break;
+		default:
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1289,10 +1496,12 @@ void LogicManager::CONS_Tatiana_ReturnComp(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Tatiana_ReturnComp(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 1;
 		TatianaCall(&LogicManager::CONS_Tatiana_DoWalk, 4, 7500, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		if (getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] == 1) {
 			getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 2;
 			TatianaCall(&LogicManager::CONS_Tatiana_EnterComp, 0, 0, 0, 0);
@@ -1300,6 +1509,10 @@ void LogicManager::HAND_Tatiana_ReturnComp(HAND_PARAMS) {
 			getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 3;
 			TatianaCall(&LogicManager::CONS_Tatiana_CompLogic, 15803100, 0, 0, 0);
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1314,23 +1527,28 @@ void LogicManager::CONS_Tatiana_StartPart3(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Tatiana_StartPart3(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			endGraphics(kCharacterTatiana);
-			getCharacter(kCharacterTatiana).characterPosition.position = 1750;
-			getCharacter(kCharacterTatiana).characterPosition.location = 1;
-			getCharacter(kCharacterTatiana).characterPosition.car = kCarRestaurant;
-			getCharacter(kCharacterTatiana).inventoryItem = 0;
-			getCharacter(kCharacterTatiana).clothes = 2;
-			setDoor(33, kCharacterCath, 1, 10, 9);
-			setDoor(49, kCharacterCath, 1, 10, 9);
-			_gameInventory[kItemFirebird].location = 2;
-			if (_gameEvents[kEventTatianaBreakfastGivePoem] || _gameEvents[kEventTatianaGivePoem] && !_gameEvents[kEventTatianaBreakfastAlexei]) {
-				_gameInventory[kItemParchemin].location = 2;
-			}
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		CONS_Tatiana_PlayChess(0, 0, 0, 0);
+		break;
+	case 12:
+		endGraphics(kCharacterTatiana);
+		getCharacter(kCharacterTatiana).characterPosition.position = 1750;
+		getCharacter(kCharacterTatiana).characterPosition.location = 1;
+		getCharacter(kCharacterTatiana).characterPosition.car = kCarRestaurant;
+		getCharacter(kCharacterTatiana).inventoryItem = 0;
+		getCharacter(kCharacterTatiana).clothes = 2;
+		setDoor(33, kCharacterCath, 1, 10, 9);
+		setDoor(49, kCharacterCath, 1, 10, 9);
+		_gameInventory[kItemFirebird].location = 2;
+
+		if (_gameEvents[kEventTatianaBreakfastGivePoem] || _gameEvents[kEventTatianaGivePoem] && !_gameEvents[kEventTatianaBreakfastAlexei]) {
+			_gameInventory[kItemParchemin].location = 2;
+		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1345,76 +1563,21 @@ void LogicManager::CONS_Tatiana_PlayChess(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Tatiana_PlayChess(HAND_PARAMS) {
-	if (msg->action > 12) {
-		if (msg->action == 18) {
-			if (getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] == 1) {
-				send(kCharacterTatiana, kCharacterAlexei, 122288808, 0);
-				CONS_Tatiana_ReturnComp3(0, 0, 0, 0);
-			}
-		} else if (msg->action == 101169422) {
-			getCharacterCurrentParams(kCharacterTatiana)[3] = 1;
-		}
-	} else if (msg->action == 12) {
-		send(kCharacterTatiana, kCharacterAlexei, 122358304, 0);
-		send(kCharacterTatiana, kCharacterKronos, 157159392, 0);
-		startCycOtis(kCharacterTatiana, "110C");
-		playDialog(kCharacterTatiana, "Tat3160A", -1, 0);
-		getCharacterCurrentParams(kCharacterTatiana)[1] = 1;
-	} else if (msg->action) {
-		if (msg->action == 2) {
-			getCharacterCurrentParams(kCharacterTatiana)[1] = 0;
-			getCharacterCurrentParams(kCharacterTatiana)[2]++;
-			switch (getCharacterCurrentParams(kCharacterTatiana)[2]) {
-			case 1:
-				getCharacterCurrentParams(kCharacterTatiana)[0] = 900;
-				startCycOtis(kCharacterTatiana, "110A");
-				Common::strcpy_s((char *)&getCharacterCurrentParams(kCharacterTatiana)[5], 12, "Tat3160B");
-				Common::strcpy_s((char *)&getCharacterCurrentParams(kCharacterTatiana)[8], 12, "110A");
-				return;
-			case 2:
-				getCharacterCurrentParams(kCharacterTatiana)[0] = 9000;
-				Common::strcpy_s((char *)&getCharacterCurrentParams(kCharacterTatiana)[5], 12, "Tat3160C");
-				Common::strcpy_s((char *)&getCharacterCurrentParams(kCharacterTatiana)[8], 12, "110C");
-				return;
-			case 3:
-				getCharacterCurrentParams(kCharacterTatiana)[0] = 13500;
-				startCycOtis(kCharacterTatiana, "110B");
-				Common::strcpy_s((char *)&getCharacterCurrentParams(kCharacterTatiana)[5], 12, "Tat3160D");
-				Common::strcpy_s((char *)&getCharacterCurrentParams(kCharacterTatiana)[8], 12, "110D");
-				break;
-			case 4:
-				getCharacterCurrentParams(kCharacterTatiana)[0] = 9000;
-				startCycOtis(kCharacterTatiana, "110B");
-				Common::strcpy_s((char *)&getCharacterCurrentParams(kCharacterTatiana)[5], 12, "Tat3160E");
-				Common::strcpy_s((char *)&getCharacterCurrentParams(kCharacterTatiana)[8], 12, "110D");
-				break;
-			case 5:
-				getCharacterCurrentParams(kCharacterTatiana)[0] = 4500;
-				startCycOtis(kCharacterTatiana, "110B");
-				Common::strcpy_s((char *)&getCharacterCurrentParams(kCharacterTatiana)[5], 12, "Tat3160G");
-				Common::strcpy_s((char *)&getCharacterCurrentParams(kCharacterTatiana)[8], 12, "110D");
-				break;
-			case 6:
-				getCharacterCurrentParams(kCharacterTatiana)[0] = 4500;
-				startCycOtis(kCharacterTatiana, "110B");
-				Common::strcpy_s((char *)&getCharacterCurrentParams(kCharacterTatiana)[5], 12, "Tat3160F");
-				break;
-			default:
-				getCharacterCurrentParams(kCharacterTatiana)[4] = 1;
-				break;
-			}
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		if (!getCharacterCurrentParams(kCharacterTatiana)[1] && !getCharacterCurrentParams(kCharacterTatiana)[4]) {
 			getCharacterCurrentParams(kCharacterTatiana)[0] -= _gameTimeTicksDelta;
 			if (_gameTimeTicksDelta > getCharacterCurrentParams(kCharacterTatiana)[0]) {
 				startCycOtis(kCharacterTatiana, (char *)&getCharacterCurrentParams(kCharacterTatiana)[8]);
 				playDialog(kCharacterTatiana, (char *)&getCharacterCurrentParams(kCharacterTatiana)[5], -1, 0);
+
 				if (getCharacterCurrentParams(kCharacterTatiana)[2] == 4 && inSalon(kCharacterCath))
 					_gameProgress[kProgressField90] = 1;
+
 				getCharacterCurrentParams(kCharacterTatiana)[1] = 1;
 			}
 		}
+
 		if (getCharacterCurrentParams(kCharacterTatiana)[3] && getCharacterCurrentParams(kCharacterTatiana)[4]) {
 			if (!getCharacterCurrentParams(kCharacterTatiana)[11] && (getCharacterCurrentParams(kCharacterTatiana)[11] = _gameTime + 6300, _gameTime == -6300) || getCharacterCurrentParams(kCharacterTatiana)[11] < _gameTime) {
 				if (rcClear()) {
@@ -1424,6 +1587,72 @@ void LogicManager::HAND_Tatiana_PlayChess(HAND_PARAMS) {
 				}
 			}
 		}
+
+		break;
+	case 2:
+		getCharacterCurrentParams(kCharacterTatiana)[1] = 0;
+		getCharacterCurrentParams(kCharacterTatiana)[2]++;
+
+		switch (getCharacterCurrentParams(kCharacterTatiana)[2]) {
+		case 1:
+			getCharacterCurrentParams(kCharacterTatiana)[0] = 900;
+			startCycOtis(kCharacterTatiana, "110A");
+			Common::strcpy_s((char *)&getCharacterCurrentParams(kCharacterTatiana)[5], 12, "Tat3160B");
+			Common::strcpy_s((char *)&getCharacterCurrentParams(kCharacterTatiana)[8], 12, "110A");
+			break;
+		case 2:
+			getCharacterCurrentParams(kCharacterTatiana)[0] = 9000;
+			Common::strcpy_s((char *)&getCharacterCurrentParams(kCharacterTatiana)[5], 12, "Tat3160C");
+			Common::strcpy_s((char *)&getCharacterCurrentParams(kCharacterTatiana)[8], 12, "110C");
+			break;
+		case 3:
+			getCharacterCurrentParams(kCharacterTatiana)[0] = 13500;
+			startCycOtis(kCharacterTatiana, "110B");
+			Common::strcpy_s((char *)&getCharacterCurrentParams(kCharacterTatiana)[5], 12, "Tat3160D");
+			Common::strcpy_s((char *)&getCharacterCurrentParams(kCharacterTatiana)[8], 12, "110D");
+			break;
+		case 4:
+			getCharacterCurrentParams(kCharacterTatiana)[0] = 9000;
+			startCycOtis(kCharacterTatiana, "110B");
+			Common::strcpy_s((char *)&getCharacterCurrentParams(kCharacterTatiana)[5], 12, "Tat3160E");
+			Common::strcpy_s((char *)&getCharacterCurrentParams(kCharacterTatiana)[8], 12, "110D");
+			break;
+		case 5:
+			getCharacterCurrentParams(kCharacterTatiana)[0] = 4500;
+			startCycOtis(kCharacterTatiana, "110B");
+			Common::strcpy_s((char *)&getCharacterCurrentParams(kCharacterTatiana)[5], 12, "Tat3160G");
+			Common::strcpy_s((char *)&getCharacterCurrentParams(kCharacterTatiana)[8], 12, "110D");
+			break;
+		case 6:
+			getCharacterCurrentParams(kCharacterTatiana)[0] = 4500;
+			startCycOtis(kCharacterTatiana, "110B");
+			Common::strcpy_s((char *)&getCharacterCurrentParams(kCharacterTatiana)[5], 12, "Tat3160F");
+			break;
+		default:
+			getCharacterCurrentParams(kCharacterTatiana)[4] = 1;
+			break;
+		}
+
+		break;
+	case 12:
+		send(kCharacterTatiana, kCharacterAlexei, 122358304, 0);
+		send(kCharacterTatiana, kCharacterKronos, 157159392, 0);
+		startCycOtis(kCharacterTatiana, "110C");
+		playDialog(kCharacterTatiana, "Tat3160A", -1, 0);
+		getCharacterCurrentParams(kCharacterTatiana)[1] = 1;
+		break;
+	case 18:
+		if (getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] == 1) {
+			send(kCharacterTatiana, kCharacterAlexei, 122288808, 0);
+			CONS_Tatiana_ReturnComp3(0, 0, 0, 0);
+		}
+
+		break;
+	case 101169422:
+		getCharacterCurrentParams(kCharacterTatiana)[3] = 1;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1438,11 +1667,13 @@ void LogicManager::CONS_Tatiana_ReturnComp3(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Tatiana_ReturnComp3(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		endGraphics(kCharacterTatiana);
 		getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 1;
 		TatianaCall(&LogicManager::CONS_Tatiana_DoWait, 75, 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8]) {
 		case 1:
 			getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 2;
@@ -1455,7 +1686,13 @@ void LogicManager::HAND_Tatiana_ReturnComp3(HAND_PARAMS) {
 		case 3:
 			CONS_Tatiana_BeforeConcert(0, 0, 0, 0);
 			break;
+		default:
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1470,15 +1707,19 @@ void LogicManager::CONS_Tatiana_BeforeConcert(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Tatiana_BeforeConcert(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 1;
 		TatianaCall(&LogicManager::CONS_Tatiana_CompLogic, 2097000, 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8]) {
 		case 1:
 			_gameInventory[kItemFirebird].location = 1;
+
 			if (inSuite(kCharacterCath, kCarRedSleeping, 7850))
 				bumpCathRDoor(33);
+
 			setDoor(33, kCharacterCath, 1, 10, 9);
 			setDoor(49, kCharacterCath, 0, 10, 9);
 			getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 2;
@@ -1491,7 +1732,13 @@ void LogicManager::HAND_Tatiana_BeforeConcert(HAND_PARAMS) {
 		case 3:
 			CONS_Tatiana_Concert(0, 0, 0, 0);
 			break;
+		default:
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1506,41 +1753,49 @@ void LogicManager::CONS_Tatiana_Concert(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Tatiana_Concert(HAND_PARAMS) {
-	if (msg->action > 12) {
-		if (msg->action != 18) {
-			if (msg->action != 191668032)
-				return;
-			goto LABEL_21;
+	switch (msg->action) {
+	case 0:
+		if (!getCharacterCurrentParams(kCharacterTatiana)[0] && cathHasItem(kItemFirebird) && inSuite(kCharacterCath, kCarRedSleeping, 7850) && (_gameTime < 2133000 || _gameProgress[16])) {
+			getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 1;
+			TatianaCall(&LogicManager::CONS_Tatiana_TrapCath, 0, 0, 0, 0);
+			break;
 		}
-		if (getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] != 1)
-			return;
-		getCharacterCurrentParams(kCharacterTatiana)[0] = 1;
-	LABEL_17:
+
 		if (_gameTime <= 2133000)
-			return;
+			break;
 
 		if (getCharacter(kCharacterAugust).characterPosition.car < kCarRedSleeping && (getCharacter(kCharacterAugust).characterPosition.car != kCarGreenSleeping || getCharacter(kCharacterAugust).characterPosition.position <= 5790))
-			return;
-	LABEL_21:
+			break;
+
 		CONS_Tatiana_LeaveConcert(0, 0, 0, 0);
-		return;
-	}
-	if (msg->action == 12) {
+		break;
+	case 12:
 		setDoor(33, kCharacterCath, 1, 10, 9);
 		setDoor(49, kCharacterCath, 0, 10, 9);
 		endGraphics(kCharacterTatiana);
 		getCharacter(kCharacterTatiana).characterPosition.car = kCarKronos;
 		getCharacter(kCharacterTatiana).characterPosition.position = 6000;
 		getCharacter(kCharacterTatiana).characterPosition.location = 1;
-		return;
-	}
-	if (msg->action == 0) {
-		if (!getCharacterCurrentParams(kCharacterTatiana)[0] && cathHasItem(kItemFirebird) && inSuite(kCharacterCath, kCarRedSleeping, 7850) && (_gameTime < 2133000 || _gameProgress[16])) {
-			getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 1;
-			TatianaCall(&LogicManager::CONS_Tatiana_TrapCath, 0, 0, 0, 0);
-			return;
-		}
-		goto LABEL_17;
+		break;
+	case 18:
+		if (getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] != 1)
+			break;
+
+		getCharacterCurrentParams(kCharacterTatiana)[0] = 1;
+
+		if (_gameTime <= 2133000)
+			break;
+
+		if (getCharacter(kCharacterAugust).characterPosition.car < kCarRedSleeping && (getCharacter(kCharacterAugust).characterPosition.car != kCarGreenSleeping || getCharacter(kCharacterAugust).characterPosition.position <= 5790))
+			break;
+
+		CONS_Tatiana_LeaveConcert(0, 0, 0, 0);
+		break;
+	case 191668032:
+		CONS_Tatiana_LeaveConcert(0, 0, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1555,21 +1810,22 @@ void LogicManager::CONS_Tatiana_LeaveConcert(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Tatiana_LeaveConcert(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterTatiana).characterPosition.car = kCarGreenSleeping;
 		getCharacter(kCharacterTatiana).characterPosition.position = 850;
 		getCharacter(kCharacterTatiana).characterPosition.location = 0;
 		getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 1;
 		TatianaCall(&LogicManager::CONS_Tatiana_DoWalk, 4, 7500, 0, 0);
-		return;
-	}
-	if (msg->action == 18) {
+		break;
+	case 18:
 		if (getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] == 1) {
 			if (!inSuite(kCharacterCath, kCarRedSleeping, 7850) || inComp(kCharacterCath, kCarRedSleeping, 8200)) {
 				getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 2;
 				TatianaCall(&LogicManager::CONS_Tatiana_EnterComp, 0, 0, 0, 0);
-				return;
+				break;
 			}
+
 			if (cathHasItem(kItemFirebird)) {
 				playNIS(kEventTatianaCompartmentStealEgg);
 				takeCathItem(kItemFirebird);
@@ -1577,11 +1833,15 @@ void LogicManager::HAND_Tatiana_LeaveConcert(HAND_PARAMS) {
 			} else {
 				playNIS(kEventTatianaCompartment);
 			}
+
 			bumpCathRDoor(33);
-		} else if (getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] != 2) {
-			return;
+		} else if (getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] == 2) {
+			CONS_Tatiana_AfterConcert(0, 0, 0, 0);
 		}
-		CONS_Tatiana_AfterConcert(0, 0, 0, 0);
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1598,36 +1858,54 @@ void LogicManager::CONS_Tatiana_AfterConcert(CONS_PARAMS) {
 void LogicManager::HAND_Tatiana_AfterConcert(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
-		if (_gameInventory[kItemFirebird].location == 1 || _gameInventory[kItemFirebird].location == 2)
-			goto LABEL_17;
-		if (!getCharacterCurrentParams(kCharacterTatiana)[2])
-			getCharacterCurrentParams(kCharacterTatiana)[2] = _gameTime + 900;
-		if (getCharacterCurrentParams(kCharacterTatiana)[3] == 0x7FFFFFFF || getCharacterCurrentParams(kCharacterTatiana)[2] >= _gameTime)
-			goto LABEL_17;
-		if (_gameTime > 2227500)
-			goto LABEL_14;
-		if (!cathInCorridor(kCarRedSleeping) || !getCharacterCurrentParams(kCharacterTatiana)[3]) {
-			getCharacterCurrentParams(kCharacterTatiana)[3] = _gameTime + 450;
-			if (_gameTime == -450)
-				goto LABEL_15;
-		}
-		if (getCharacterCurrentParams(kCharacterTatiana)[3] < _gameTime) {
-		LABEL_14:
-			getCharacterCurrentParams(kCharacterTatiana)[3] = 0x7FFFFFFF;
-		LABEL_15:
-			_gameProgress[23] = 1;
-			if (inComp(kCharacterAnna, kCarRedSleeping, 4070)) {
-				CONS_Tatiana_CryAnna(0, 0, 0, 0);
-				return;
+		if (_gameInventory[kItemFirebird].location != 1 && _gameInventory[kItemFirebird].location != 2) {
+			if (!getCharacterCurrentParams(kCharacterTatiana)[2])
+				getCharacterCurrentParams(kCharacterTatiana)[2] = _gameTime + 900;
+
+			if (getCharacterCurrentParams(kCharacterTatiana)[3] != 0x7FFFFFFF && getCharacterCurrentParams(kCharacterTatiana)[2] < _gameTime) {
+				if (_gameTime > 2227500) {
+					getCharacterCurrentParams(kCharacterTatiana)[3] = 0x7FFFFFFF;
+					_gameProgress[kProgressField5C] = 1;
+
+					if (inComp(kCharacterAnna, kCarRedSleeping, 4070)) {
+						CONS_Tatiana_CryAnna(0, 0, 0, 0);
+						break;
+					}
+				} else {
+					bool skip = false;
+					if (!cathInCorridor(kCarRedSleeping) || !getCharacterCurrentParams(kCharacterTatiana)[3]) {
+						getCharacterCurrentParams(kCharacterTatiana)[3] = _gameTime + 450;
+						if (_gameTime == -450) {
+							skip = true;
+
+							_gameProgress[kProgressField5C] = 1;
+							if (inComp(kCharacterAnna, kCarRedSleeping, 4070)) {
+								CONS_Tatiana_CryAnna(0, 0, 0, 0);
+								break;
+							}
+						}
+					}
+
+					if (!skip && getCharacterCurrentParams(kCharacterTatiana)[3] < _gameTime) {
+						getCharacterCurrentParams(kCharacterTatiana)[3] = 0x7FFFFFFF;
+						_gameProgress[kProgressField5C] = 1;
+						if (inComp(kCharacterAnna, kCarRedSleeping, 4070)) {
+							CONS_Tatiana_CryAnna(0, 0, 0, 0);
+							break;
+						}
+					}
+				}
 			}
 		}
-	LABEL_17:
+
 		if (getCharacterCurrentParams(kCharacterTatiana)[0]) {
 			if (getCharacterCurrentParams(kCharacterTatiana)[4] || (getCharacterCurrentParams(kCharacterTatiana)[4] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
 				if (getCharacterCurrentParams(kCharacterTatiana)[4] >= _currentGameSessionTicks)
-					return;
+					break;
+
 				getCharacterCurrentParams(kCharacterTatiana)[4] = 0x7FFFFFFF;
 			}
+
 			getCharacterCurrentParams(kCharacterTatiana)[0] = 0;
 			getCharacterCurrentParams(kCharacterTatiana)[1] = 1;
 			setDoor(33, kCharacterTatiana, 1, 0, 0);
@@ -1636,12 +1914,14 @@ void LogicManager::HAND_Tatiana_AfterConcert(HAND_PARAMS) {
 		} else {
 			getCharacterCurrentParams(kCharacterTatiana)[4] = 0;
 		}
+
 		break;
 	case 8:
 	case 9:
 		if (getCharacterCurrentParams(kCharacterTatiana)[0]) {
 			setDoor(33, kCharacterTatiana, 1, 0, 0);
 			setDoor(49, kCharacterTatiana, 1, 0, 0);
+
 			if (msg->param.intParam == 49) {
 				getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 4;
 				TatianaCall(&LogicManager::CONS_Tatiana_DoDialog, getCathWCDialog(), 0, 0, 0);
@@ -1665,10 +1945,12 @@ void LogicManager::HAND_Tatiana_AfterConcert(HAND_PARAMS) {
 			} else {
 				playNIS(kEventTatianaCompartment);
 			}
+
 			bumpCathRDoor(33);
 		} else {
 			setDoor(33, kCharacterTatiana, 1, 0, 0);
 			setDoor(49, kCharacterTatiana, 1, 0, 0);
+
 			if (msg->action == 8) {
 				getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 1;
 				TatianaCall(&LogicManager::CONS_Tatiana_DoDialog, "LIB012", 0, 0, 0);
@@ -1677,13 +1959,14 @@ void LogicManager::HAND_Tatiana_AfterConcert(HAND_PARAMS) {
 				TatianaCall(&LogicManager::CONS_Tatiana_DoDialog, "LIB013", 0, 0, 0);
 			}
 		}
-		return;
+
+		break;
 	case 12:
 		setDoor(33, kCharacterTatiana, 1, 10, 9);
 		setDoor(49, kCharacterTatiana, 1, 0, 9);
 		getCharacter(kCharacterTatiana).characterPosition.location = 1;
 		endGraphics(kCharacterTatiana);
-		return;
+		break;
 	case 17:
 		if (getCharacterCurrentParams(kCharacterTatiana)[1] || getCharacterCurrentParams(kCharacterTatiana)[0]) {
 			getCharacterCurrentParams(kCharacterTatiana)[1] = 0;
@@ -1691,7 +1974,8 @@ void LogicManager::HAND_Tatiana_AfterConcert(HAND_PARAMS) {
 			setDoor(33, kCharacterTatiana, 1, 10, 9);
 			setDoor(49, kCharacterTatiana, 1, 0, 9);
 		}
-		return;
+
+		break;
 	case 18:
 		switch (getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8]) {
 		case 1:
@@ -1702,6 +1986,8 @@ void LogicManager::HAND_Tatiana_AfterConcert(HAND_PARAMS) {
 			} else {
 				TatianaCall(&LogicManager::CONS_Tatiana_DoDialog, "TAT1133A", 0, 0, 0);
 			}
+
+			break;
 		case 3:
 			setDoor(33, kCharacterTatiana, 1, 14, 0);
 			setDoor(49, kCharacterTatiana, 1, 14, 0);
@@ -1714,11 +2000,12 @@ void LogicManager::HAND_Tatiana_AfterConcert(HAND_PARAMS) {
 			getCharacterCurrentParams(kCharacterTatiana)[1] = 1;
 			break;
 		default:
-			return;
+			break;
 		}
-		return;
+
+		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -1733,75 +2020,11 @@ void LogicManager::CONS_Tatiana_CryAnna(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Tatiana_CryAnna(HAND_PARAMS) {
-	if (msg->action > 12) {
-		if (msg->action == 18) {
-			switch (getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8]) {
-			case 1:
-				getCharacter(kCharacterTatiana).characterPosition.location = 0;
-				setDoor(33, kCharacterCath, 0, 10, 9);
-				setDoor(49, kCharacterCath, 0, 10, 9);
-				getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 2;
-				TatianaCall(&LogicManager::CONS_Tatiana_WalkSniffle, 4, 4070, 0, 0);
-				break;
-			case 2:
-				startCycOtis(kCharacterTatiana, "673Gf");
-				softBlockAtDoor(kCharacterTatiana, 37);
-				getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 3;
-				TatianaCall(&LogicManager::CONS_Tatiana_DoDialog, "Tat3164", 0, 0, 0);
-				break;
-			case 3:
-				send(kCharacterTatiana, kCharacterAnna, 236241630, 0);
-				break;
-			case 4:
-				getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 5;
-				TatianaCall(&LogicManager::CONS_Tatiana_DoEnterCorrOtis, "673Db", 0x21, 0, 0);
-				break;
-			case 5:
-			case 11:
-				getCharacter(kCharacterTatiana).characterPosition.location = 1;
-				endGraphics(kCharacterTatiana);
-				CONS_Tatiana_Upset(0, 0, 0, 0);
-				break;
-			case 6:
-				softReleaseAtDoor(kCharacterTatiana, 37);
-				endGraphics(kCharacterTatiana);
-				getCharacter(kCharacterTatiana).characterPosition.location = 1;
-				getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 7;
-				TatianaCall(&LogicManager::CONS_Tatiana_DoDialog, "ANN3011", 0, 0, 0);
-				break;
-			case 7:
-				getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 8;
-				TatianaCall(&LogicManager::CONS_Tatiana_DoWait, 900, 0, 0, 0);
-				break;
-			case 8:
-				getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 9;
-				TatianaCall(&LogicManager::CONS_Tatiana_DoCorrOtis, "673Jf", 37, 0, 0);
-				break;
-			case 9:
-				getCharacter(kCharacterTatiana).characterPosition.location = 0;
-				getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 10;
-				TatianaCall(&LogicManager::CONS_Tatiana_WalkSniffle, 4, 7500, 0, 0);
-				break;
-			case 10:
-				send(kCharacterTatiana, kCharacterAnna, 236517970, 0);
-				getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 11;
-				TatianaCall(&LogicManager::CONS_Tatiana_DoEnterCorrOtis, "673Db", 33, 0, 0);
-				break;
-			default:
-				return;
-			}
-		} else if (msg->action == 100906246) {
-			getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 6;
-			TatianaCall(&LogicManager::CONS_Tatiana_DoCorrOtis, "673Df", 37, 0, 0);
-		}
-	} else if (msg->action == 12) {
-		getCharacter(kCharacterTatiana).clothes = 3;
-		getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 1;
-		TatianaCall(&LogicManager::CONS_Tatiana_DoCorrOtis, "673Jb", 33, 0, 0);
-	} else if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		if (getCharacterCurrentParams(kCharacterTatiana)[0] || (getCharacterCurrentParams(kCharacterTatiana)[0] = _gameTime + 450, _gameTime != -450)) {
 			if (getCharacterCurrentParams(kCharacterTatiana)[0] >= _gameTime)
-				return;
+				break;
 
 			getCharacterCurrentParams(kCharacterTatiana)[0] = 0x7FFFFFFF;
 		}
@@ -1809,6 +2032,76 @@ void LogicManager::HAND_Tatiana_CryAnna(HAND_PARAMS) {
 		softReleaseAtDoor(kCharacterTatiana, 37);
 		getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 4;
 		TatianaCall(&LogicManager::CONS_Tatiana_WalkSniffle, 4, 7500, 0, 0);
+		break;
+	case 12:
+		getCharacter(kCharacterTatiana).clothes = 3;
+		getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 1;
+		TatianaCall(&LogicManager::CONS_Tatiana_DoCorrOtis, "673Jb", 33, 0, 0);
+		break;
+	case 18:
+		switch (getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8]) {
+		case 1:
+			getCharacter(kCharacterTatiana).characterPosition.location = 0;
+			setDoor(33, kCharacterCath, 0, 10, 9);
+			setDoor(49, kCharacterCath, 0, 10, 9);
+			getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 2;
+			TatianaCall(&LogicManager::CONS_Tatiana_WalkSniffle, 4, 4070, 0, 0);
+			break;
+		case 2:
+			startCycOtis(kCharacterTatiana, "673Gf");
+			softBlockAtDoor(kCharacterTatiana, 37);
+			getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 3;
+			TatianaCall(&LogicManager::CONS_Tatiana_DoDialog, "Tat3164", 0, 0, 0);
+			break;
+		case 3:
+			send(kCharacterTatiana, kCharacterAnna, 236241630, 0);
+			break;
+		case 4:
+			getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 5;
+			TatianaCall(&LogicManager::CONS_Tatiana_DoEnterCorrOtis, "673Db", 0x21, 0, 0);
+			break;
+		case 5:
+		case 11:
+			getCharacter(kCharacterTatiana).characterPosition.location = 1;
+			endGraphics(kCharacterTatiana);
+			CONS_Tatiana_Upset(0, 0, 0, 0);
+			break;
+		case 6:
+			softReleaseAtDoor(kCharacterTatiana, 37);
+			endGraphics(kCharacterTatiana);
+			getCharacter(kCharacterTatiana).characterPosition.location = 1;
+			getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 7;
+			TatianaCall(&LogicManager::CONS_Tatiana_DoDialog, "ANN3011", 0, 0, 0);
+			break;
+		case 7:
+			getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 8;
+			TatianaCall(&LogicManager::CONS_Tatiana_DoWait, 900, 0, 0, 0);
+			break;
+		case 8:
+			getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 9;
+			TatianaCall(&LogicManager::CONS_Tatiana_DoCorrOtis, "673Jf", 37, 0, 0);
+			break;
+		case 9:
+			getCharacter(kCharacterTatiana).characterPosition.location = 0;
+			getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 10;
+			TatianaCall(&LogicManager::CONS_Tatiana_WalkSniffle, 4, 7500, 0, 0);
+			break;
+		case 10:
+			send(kCharacterTatiana, kCharacterAnna, 236517970, 0);
+			getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 11;
+			TatianaCall(&LogicManager::CONS_Tatiana_DoEnterCorrOtis, "673Db", 33, 0, 0);
+			break;
+		default:
+			break;
+		}
+
+		break;
+	case 100906246:
+		getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 6;
+		TatianaCall(&LogicManager::CONS_Tatiana_DoCorrOtis, "673Df", 37, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1823,14 +2116,20 @@ void LogicManager::CONS_Tatiana_Upset(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Tatiana_Upset(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			setDoor(33, kCharacterCath, 1, 10, 9);
-			setDoor(49, kCharacterCath, 1, 10, 9);
+	switch (msg->action) {
+	case 0:
+		if (!getCharacterCurrentParams(kCharacterTatiana)[0] && nearChar(kCharacterTatiana, kCharacterCath, 1000)) {
+			playDialog(kCharacterTatiana, "Tat3164", -1, 0);
+			getCharacterCurrentParams(kCharacterTatiana)[0] = 1;
 		}
-	} else if (!getCharacterCurrentParams(kCharacterTatiana)[0] && nearChar(kCharacterTatiana, kCharacterCath, 1000)) {
-		playDialog(kCharacterTatiana, "Tat3164", -1, 0);
-		getCharacterCurrentParams(kCharacterTatiana)[0] = 1;
+
+		break;
+	case 12:
+		setDoor(33, kCharacterCath, 1, 10, 9);
+		setDoor(49, kCharacterCath, 1, 10, 9);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1845,26 +2144,37 @@ void LogicManager::CONS_Tatiana_DoConcertWalk(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Tatiana_DoConcertWalk(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 6) {
-			if (_gameEvents[kEventTatianaAskMatchSpeakRussian] || _gameEvents[kEventTatianaAskMatch] || _gameEvents[kEventVassiliSeizure]) {
-				if (rnd(2) == 0) {
-					playDialog(kCharacterCath, "CAT1010A", -1, 0);
-				} else{
-					playDialog(kCharacterCath, "CAT1010", -1, 0);
-				}
-				
+	switch (msg->action) {
+	case 0:
+		if (checkLoc(kCharacterCath, kCarKronos) || getCharacter(kCharacterTatiana).characterPosition.car != getCharacter(kCharacterCath).characterPosition.car || walk(kCharacterTatiana, kCarKronos, 9270)) {
+			getCharacter(kCharacterTatiana).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterTatiana, _functionsTatiana[getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall]]);
+			fedEx(kCharacterTatiana, kCharacterTatiana, 18, 0);
+		}
+
+		break;
+	case 6:
+		if (_gameEvents[kEventTatianaAskMatchSpeakRussian] || _gameEvents[kEventTatianaAskMatch] || _gameEvents[kEventVassiliSeizure]) {
+			if (rnd(2) == 0) {
+				playDialog(kCharacterCath, "CAT1010A", -1, 0);
 			} else {
-				playCathExcuseMe();
+				playDialog(kCharacterCath, "CAT1010", -1, 0);
 			}
-		} else if (msg->action == 12 && walk(kCharacterTatiana, kCarKronos, 9270)) {
-		LABEL_18:
+		} else {
+			playCathExcuseMe();
+		}
+
+		break;
+	case 12:
+		if (walk(kCharacterTatiana, kCarKronos, 9270)) {
 			getCharacter(kCharacterTatiana).currentCall--;
 			_engine->getMessageManager()->setMessageHandle(kCharacterTatiana, _functionsTatiana[getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall]]);
 			fedEx(kCharacterTatiana, kCharacterTatiana, 18, 0);
 		}
-	} else if (checkLoc(kCharacterCath, kCarKronos) || getCharacter(kCharacterTatiana).characterPosition.car != getCharacter(kCharacterCath).characterPosition.car || walk(kCharacterTatiana, kCarKronos, 9270)) {
-		goto LABEL_18;
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1879,80 +2189,91 @@ void LogicManager::CONS_Tatiana_TrapCath(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Tatiana_TrapCath(HAND_PARAMS) {
-	if (msg->action > 12) {
-		if (msg->action == 18) {
-			switch (getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8]) {
-			case 1:
-				getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 2;
-				TatianaCall(&LogicManager::CONS_Tatiana_DoDialog, "Tat3161B", 0, 0, 0);
-				break;
-			case 2:
-				send(kCharacterTatiana, kCharacterCond2, 168316032, 0);
-				getCharacterCurrentParams(kCharacterTatiana)[0] = 1;
-				break;
-			case 3:
-			case 6:
-				endGraphics(kCharacterTatiana);
+	switch (msg->action) {
+	case 0:
+		if (getCharacterCurrentParams(kCharacterTatiana)[0]) {
+			if (inSuite(kCharacterCath, kCarRedSleeping, 7850) && !_gameEvents[kEventVassiliCompartmentStealEgg] && (_gameTime <= 2133000 || _gameProgress[kProgressField40])) {
+				if (inComp(kCharacterCath, kCarRedSleeping, 7500)) {
+					send(kCharacterTatiana, kCharacterCond2, 235061888, 0);
+					endGraphics(kCharacterTatiana);
+					softReleaseAtDoor(kCharacterTatiana, 33);
+					getCharacter(kCharacterTatiana).characterPosition.location = 1;
+
+					if (cathHasItem(kItemFirebird)) {
+						playNIS(kEventTatianaCompartmentStealEgg);
+						takeCathItem(kItemFirebird);
+						_gameInventory[kItemFirebird].location = 2;
+					} else {
+						playNIS(kEventTatianaCompartment);
+					}
 
-				getCharacter(kCharacterTatiana).currentCall--;
-				_engine->getMessageManager()->setMessageHandle(kCharacterTatiana, _functionsTatiana[getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall]]);
-				fedEx(kCharacterTatiana, kCharacterTatiana, 18, 0);
-				break;
-			case 4:
-				getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 5;
-				TatianaCall(&LogicManager::CONS_Tatiana_ExitComp, 0, 0, 0, 0);
-				break;
-			case 5:
-				getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 6;
-				TatianaCall(&LogicManager::CONS_Tatiana_DoConcertWalk, 0, 0, 0, 0);
-				break;
-			default:
-				return;
+					bumpCathRDoor(33);
+					getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 4;
+					TatianaCall(&LogicManager::CONS_Tatiana_DoWait, 150, 0, 0, 0);
+				}
+			} else {
+				softReleaseAtDoor(kCharacterTatiana, 33);
+				if (_gameTime < 2133000 || _gameProgress[16]) {
+					getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 3;
+					TatianaCall(&LogicManager::CONS_Tatiana_DoConcertWalk, 0, 0, 0, 0);
+				} else {
+					endGraphics(kCharacterTatiana);
+
+					getCharacter(kCharacterTatiana).currentCall--;
+					_engine->getMessageManager()->setMessageHandle(kCharacterTatiana, _functionsTatiana[getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall]]);
+					fedEx(kCharacterTatiana, kCharacterTatiana, 18, 0);
+				}
 			}
-		} else if (msg->action == 154071333) {
-			setDoor(33, kCharacterCath, 1, 0, 0);
-			setDoor(32, kCharacterCath, 1, 0, 0);
-			getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 1;
-			TatianaCall(&LogicManager::CONS_Tatiana_SaveGame, 1, 0, 0, 0);
 		}
-	} else if (msg->action == 12) {
+
+		break;
+	case 12:
 		getCharacter(kCharacterTatiana).characterPosition.car = kCarRedSleeping;
 		getCharacter(kCharacterTatiana).characterPosition.position = 7500;
 		getCharacter(kCharacterTatiana).characterPosition.location = 0;
 		forceJump(kCharacterCond2, &LogicManager::CONS_Cond2_TatianaComeHere);
 		startCycOtis(kCharacterTatiana, "673Fb");
 		softBlockAtDoor(kCharacterTatiana, 33);
-	} else if (msg->action == 0 && getCharacterCurrentParams(kCharacterTatiana)[0]) {
-		if (inSuite(kCharacterCath, kCarRedSleeping, 7850) && !_gameEvents[kEventVassiliCompartmentStealEgg] && (_gameTime <= 2133000 || _gameProgress[kProgressField40])) {
-			if (inComp(kCharacterCath, kCarRedSleeping, 7500)) {
-				send(kCharacterTatiana, kCharacterCond2, 235061888, 0);
-				endGraphics(kCharacterTatiana);
-				softReleaseAtDoor(kCharacterTatiana, 33);
-				getCharacter(kCharacterTatiana).characterPosition.location = 1;
-				if (cathHasItem(kItemFirebird)) {
-					playNIS(kEventTatianaCompartmentStealEgg);
-					takeCathItem(kItemFirebird);
-					_gameInventory[kItemFirebird].location = 2;
-				} else {
-					playNIS(kEventTatianaCompartment);
-				}
-				bumpCathRDoor(33);
-				getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 4;
-				TatianaCall(&LogicManager::CONS_Tatiana_DoWait, 150, 0, 0, 0);
-			}
-		} else {
-			softReleaseAtDoor(kCharacterTatiana, 33);
-			if (_gameTime < 2133000 || _gameProgress[16]) {
-				getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 3;
-				TatianaCall(&LogicManager::CONS_Tatiana_DoConcertWalk, 0, 0, 0, 0);
-			} else {
-				endGraphics(kCharacterTatiana);
+		break;
+	case 18:
+		switch (getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8]) {
+		case 1:
+			getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 2;
+			TatianaCall(&LogicManager::CONS_Tatiana_DoDialog, "Tat3161B", 0, 0, 0);
+			break;
+		case 2:
+			send(kCharacterTatiana, kCharacterCond2, 168316032, 0);
+			getCharacterCurrentParams(kCharacterTatiana)[0] = 1;
+			break;
+		case 3:
+		case 6:
+			endGraphics(kCharacterTatiana);
 
-				getCharacter(kCharacterTatiana).currentCall--;
-				_engine->getMessageManager()->setMessageHandle(kCharacterTatiana, _functionsTatiana[getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall]]);
-				fedEx(kCharacterTatiana, kCharacterTatiana, 18, 0);
-			}
+			getCharacter(kCharacterTatiana).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterTatiana, _functionsTatiana[getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall]]);
+			fedEx(kCharacterTatiana, kCharacterTatiana, 18, 0);
+			break;
+		case 4:
+			getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 5;
+			TatianaCall(&LogicManager::CONS_Tatiana_ExitComp, 0, 0, 0, 0);
+			break;
+		case 5:
+			getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 6;
+			TatianaCall(&LogicManager::CONS_Tatiana_DoConcertWalk, 0, 0, 0, 0);
+			break;
+		default:
+			break;
 		}
+
+		break;
+	case 154071333:
+		setDoor(33, kCharacterCath, 1, 0, 0);
+		setDoor(32, kCharacterCath, 1, 0, 0);
+		getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 1;
+		TatianaCall(&LogicManager::CONS_Tatiana_SaveGame, 1, 0, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1972,23 +2293,20 @@ void LogicManager::CONS_Tatiana_WalkSniffle(CONS_PARAMS) {
 void LogicManager::HAND_Tatiana_WalkSniffle(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
-		if (walk(kCharacterTatiana, getCharacterCurrentParams(kCharacterTatiana)[0], getCharacterCurrentParams(kCharacterTatiana)[1]))
-			goto LABEL_7;
-		break;
-	case 5:
-	case 6:
-		playDialog(0, "Tat3124", getVolume(kCharacterTatiana), 0);
-		break;
 	case 12:
 		if (walk(kCharacterTatiana, getCharacterCurrentParams(kCharacterTatiana)[0], getCharacterCurrentParams(kCharacterTatiana)[1])) {
-		LABEL_7:
 			getCharacter(kCharacterTatiana).currentCall--;
 			_engine->getMessageManager()->setMessageHandle(kCharacterTatiana, _functionsTatiana[getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall]]);
 			fedEx(kCharacterTatiana, kCharacterTatiana, 18, 0);
 		}
+
 		break;
+	case 5:
+	case 6:
+		playDialog(kCharacterCath, "Tat3124", getVolume(kCharacterTatiana), 0);
+		break;	
 	default:
-		return;
+		break;
 	}
 }
 
@@ -2003,20 +2321,23 @@ void LogicManager::CONS_Tatiana_StartPart4(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Tatiana_StartPart4(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			endGraphics(kCharacterTatiana);
-			getCharacter(kCharacterTatiana).characterPosition.position = 7500;
-			getCharacter(kCharacterTatiana).characterPosition.location = 1;
-			getCharacter(kCharacterTatiana).characterPosition.car = kCarRedSleeping;
-			getCharacter(kCharacterTatiana).inventoryItem = 0;
-			getCharacter(kCharacterTatiana).clothes = 2;
-			getCharacter(kCharacterTatiana).callParams[8].parameters[0] = 0;
-			setDoor(33, kCharacterCath, 1, 10, 9);
-			setDoor(49, kCharacterCath, 1, 10, 9);
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		CONS_Tatiana_InComp(0, 0, 0, 0);
+		break;
+	case 12:
+		endGraphics(kCharacterTatiana);
+		getCharacter(kCharacterTatiana).characterPosition.position = 7500;
+		getCharacter(kCharacterTatiana).characterPosition.location = 1;
+		getCharacter(kCharacterTatiana).characterPosition.car = kCarRedSleeping;
+		getCharacter(kCharacterTatiana).inventoryItem = 0;
+		getCharacter(kCharacterTatiana).clothes = 2;
+		getCharacter(kCharacterTatiana).callParams[8].parameters[0] = 0;
+		setDoor(33, kCharacterCath, 1, 10, 9);
+		setDoor(49, kCharacterCath, 1, 10, 9);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -2031,11 +2352,19 @@ void LogicManager::CONS_Tatiana_InComp(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Tatiana_InComp(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 1;
 		TatianaCall(&LogicManager::CONS_Tatiana_CompLogic, 2362500, 0, 0, 0);
-	} else if (msg->action == 18 && getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] == 1) {
-		CONS_Tatiana_MeetAlexei(0, 0, 0, 0);
+		break;
+	case 18:
+		if (getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] == 1) {
+			CONS_Tatiana_MeetAlexei(0, 0, 0, 0);
+		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -2050,24 +2379,32 @@ void LogicManager::CONS_Tatiana_MeetAlexei(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Tatiana_MeetAlexei(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 1;
 		TatianaCall(&LogicManager::CONS_Tatiana_DoCorrOtis, "673Bb", 33, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		if (getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] == 1) {
-			setDoor(33, 0, 0, 10, 9);
+			setDoor(33, kCharacterCath, 0, 10, 9);
 			getCharacter(kCharacterTatiana).characterPosition.location = 0;
 			getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 2;
 			TatianaCall(&LogicManager::CONS_Tatiana_DoWalk, 3, 540, 0, 0);
 		} else if (getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] == 2) {
 			if (onLowPlatform(kCharacterCath)) {
 				playChrExcuseMe(kCharacterTatiana, kCharacterCath, 0);
+
 				if (checkCathDir(kCarGreenSleeping, 62))
 					bumpCath(kCarGreenSleeping, 72, 255);
 			}
+
 			send(kCharacterTatiana, kCharacterAlexei, 123712592, 0);
 			CONS_Tatiana_WithAlexei(0, 0, 0, 0);
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -2093,25 +2430,32 @@ void LogicManager::HAND_Tatiana_WithAlexei(HAND_PARAMS) {
 				} else if (getCharacterCurrentParams(kCharacterTatiana)[3] == 7 && nearChar(kCharacterTatiana, kCharacterCath, 2000)) {
 					_gameProgress[kProgressField88] = 1;
 				}
+
 				getCharacterCurrentParams(kCharacterTatiana)[1] = 1;
 			}
 		}
+
 		if (getCharacterCurrentParams(kCharacterTatiana)[8] == 0x7FFFFFFF || _gameTime <= 2394000)
-			return;
-		if (_gameTime > 2398500)
-			goto LABEL_20;
-		if (!onLowPlatform(kCharacterCath) && getCharacterCurrentParams(kCharacterTatiana)[8] ||
-			(getCharacterCurrentParams(kCharacterTatiana)[8] = _gameTime, _gameTime)) {
-			if (getCharacterCurrentParams(kCharacterTatiana)[8] >= _gameTime)
-				return;
-		LABEL_20:
+			break;
+
+		if (_gameTime > 2398500) {
 			getCharacterCurrentParams(kCharacterTatiana)[8] = 0x7FFFFFFF;
+		} else {
+			if (!onLowPlatform(kCharacterCath) && getCharacterCurrentParams(kCharacterTatiana)[8] ||
+				(getCharacterCurrentParams(kCharacterTatiana)[8] = _gameTime, _gameTime)) {
+				if (getCharacterCurrentParams(kCharacterTatiana)[8] >= _gameTime)
+					break;
+
+				getCharacterCurrentParams(kCharacterTatiana)[8] = 0x7FFFFFFF;
+			}
 		}
+
 		if (onLowPlatform(kCharacterCath)) {
 			playChrExcuseMe(kCharacterTatiana, kCharacterCath, 0);
 			if (checkCathDir(kCarGreenSleeping, 62))
 				bumpCath(kCarGreenSleeping, 72, 255);
 		}
+
 		send(kCharacterTatiana, kCharacterAlexei, 123536024, 0);
 		CONS_Tatiana_Thinking(0, 0, 0, 0);
 		break;
@@ -2151,12 +2495,13 @@ void LogicManager::HAND_Tatiana_WithAlexei(HAND_PARAMS) {
 			getCharacterCurrentParams(kCharacterTatiana)[0] = 162000;
 			break;
 		}
-		return;
+
+		break;
 	case 12:
 		startCycOtis(kCharacterTatiana, "306E");
 		getCharacterCurrentParams(kCharacterTatiana)[0] = 450;
 		Common::strcpy_s((char *)&getCharacterCurrentParams(kCharacterTatiana)[5], 12, "Tat4165A");
-		return;
+		break;
 	case 17:
 		if (onLowPlatform(kCharacterCath)) {
 			getCharacterCurrentParams(kCharacterTatiana)[2] = 1;
@@ -2168,19 +2513,22 @@ void LogicManager::HAND_Tatiana_WithAlexei(HAND_PARAMS) {
 			getCharacterCurrentParams(kCharacterTatiana)[2] = 0;
 			getCharacterCurrentParams(kCharacterTatiana)[4] = 0;
 		}
+
 		if (checkCathDir(kCarGreenSleeping, 62) && !getCharacterCurrentParams(kCharacterTatiana)[4]) {
 			getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 1;
 			TatianaCall(&LogicManager::CONS_Tatiana_DoSeqOtis, "306D", 0, 0, 0);
 		}
-		return;
+
+		break;
 	case 18:
 		if (getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] == 1) {
 			startCycOtis(kCharacterTatiana, "306E");
 			getCharacterCurrentParams(kCharacterTatiana)[4] = 1;
 		}
-		return;
+
+		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -2195,10 +2543,12 @@ void LogicManager::CONS_Tatiana_Thinking(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Tatiana_Thinking(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 1;
 		TatianaCall(&LogicManager::CONS_Tatiana_DoWalk, 4, 7500, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8]) {
 		case 1:
 			getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 2;
@@ -2218,10 +2568,15 @@ void LogicManager::HAND_Tatiana_Thinking(HAND_PARAMS) {
 				getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 4;
 				TatianaCall(&LogicManager::CONS_Tatiana_CompLogic, 900, 0, 0, 0);
 			}
+
 			break;
 		default:
-			return;
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -2237,91 +2592,16 @@ void LogicManager::CONS_Tatiana_SeekCath(CONS_PARAMS) {
 
 void LogicManager::HAND_Tatiana_SeekCath(HAND_PARAMS) {
 	int rndNum;
-
-	if (msg->action > 9) {
-		switch (msg->action) {
-		case 12:
-			getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 1;
-			TatianaCall(&LogicManager::CONS_Tatiana_DoCorrOtis, "673Bb", 33, 0, 0);
-			break;
-		case 18:
-			switch (getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8]) {
-			case 1:
-				setDoor(33, 0, 0, 10, 9);
-				getCharacter(kCharacterTatiana).characterPosition.location = 0;
-				getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 2;
-				TatianaCall(&LogicManager::CONS_Tatiana_DoWalk, 3, 7500, 0, 0);
-				break;
-			case 2:
-			case 7:
-				startCycOtis(kCharacterTatiana, "673Fb");
-				softBlockAtDoor(kCharacterTatiana, 2);
-				break;
-			case 3:
-				getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 4;
-				TatianaCall(&LogicManager::CONS_Tatiana_DoEnterCorrOtis, "673Db", 33, 0, 0);
-				break;
-			case 4:
-				getCharacter(kCharacterTatiana).characterPosition.location = 1;
-				endGraphics(kCharacterTatiana);
-				CONS_Tatiana_Asleep4(0, 0, 0, 0);
-				break;
-			case 5:
-				setDoor(9, 0, 0, 255, 255);
-				playNIS(kEventTatianaTylerCompartment);
-				playDialog(0, "LIB015", -1, 0);
-				bumpCathTylerComp();
-				break;
-			case 6:
-				getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 7;
-				TatianaCall(&LogicManager::CONS_Tatiana_DoWalk, 3, 7500, 0, 0);
-				break;
-			default:
-				return;
-			}
-			break;
-		case 238790488:
-			getCharacterCurrentParams(kCharacterTatiana)[0] = 0;
-			setDoor(1, 0, checkDoor(1), 10, 9);
-			softReleaseAtDoor(kCharacterTatiana, 2);
-			endGraphics(kCharacterTatiana);
-			getCharacter(kCharacterTatiana).characterPosition.car = 3;
-			getCharacter(kCharacterTatiana).characterPosition.position = 9460;
-			getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 6;
-			TatianaCall(&LogicManager::CONS_Tatiana_DoWait, 1800, 0, 0, 0);
-			break;
-		}
-		return;
-	}
-	if (msg->action == 9) {
-		getCharacterCurrentParams(kCharacterTatiana)[0] = 0;
-		setDoor(1, 0, 0, 10, 9);
-		getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 5;
-		TatianaCall(&LogicManager::CONS_Tatiana_SaveGame, 2, kEventTatianaTylerCompartment, 0, 0);
-		return;
-	}
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		if (!getCharacterCurrentParams(kCharacterTatiana)[0]) {
 			if (!_gameEvents[kEventTatianaTylerCompartment] && inComp(kCharacterCath, kCarGreenSleeping, 8200)) {
 				getCharacterCurrentParams(kCharacterTatiana)[0] = 1;
 				_gameProgress[kProgressFieldE4] = 1;
 				setDoor(1, kCharacterTatiana, checkDoor(1), 0, 9);
 			}
-			if (!getCharacterCurrentParams(kCharacterTatiana)[0])
-				goto LABEL_23;
-		}
-		if (!inSuite(kCharacterCath, kCarGreenSleeping, 7850)) {
-			setDoor(1, kCharacterCath, checkDoor(1), 10, 9);
-			getCharacterCurrentParams(kCharacterTatiana)[0] = 0;
-		}
-		if (!getCharacterCurrentParams(kCharacterTatiana)[0] || whoRunningDialog(kCharacterTatiana))
-			goto LABEL_23;
 
-		rndNum = 5 * (3 * rnd(5) + 30);
-		if (getCharacterCurrentParams(kCharacterTatiana)[1] || (getCharacterCurrentParams(kCharacterTatiana)[1] = _currentGameSessionTicks + rndNum,
-																_currentGameSessionTicks + rndNum != 0)) {
-			if (getCharacterCurrentParams(kCharacterTatiana)[1] >= _currentGameSessionTicks) {
-			LABEL_23:
+			if (!getCharacterCurrentParams(kCharacterTatiana)[0]) {
 				if (_gameEvents[kEventTatianaTylerCompartment] || _gameTime > 2475000) {
 					if (getCharacterCurrentParams(kCharacterTatiana)[0]) {
 						setDoor(1, 0, checkDoor(1), 10, 9);
@@ -2331,13 +2611,111 @@ void LogicManager::HAND_Tatiana_SeekCath(HAND_PARAMS) {
 					getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 3;
 					TatianaCall(&LogicManager::CONS_Tatiana_DoWalk, 4, 7500, 0, 0);
 				}
-				return;
+
+				break;
 			}
-			getCharacterCurrentParams(kCharacterTatiana)[1] = 0x7FFFFFFF;
 		}
-		playDialog(kCharacterTatiana, "LIB012", 16, 0);
-		getCharacterCurrentParams(kCharacterTatiana)[1] = 0;
-		goto LABEL_23;
+
+		if (!inSuite(kCharacterCath, kCarGreenSleeping, 7850)) {
+			setDoor(1, kCharacterCath, checkDoor(1), 10, 9);
+			getCharacterCurrentParams(kCharacterTatiana)[0] = 0;
+		}
+
+		if (getCharacterCurrentParams(kCharacterTatiana)[0] && !whoRunningDialog(kCharacterTatiana)) {
+			rndNum = 5 * (3 * rnd(5) + 30);
+			if (getCharacterCurrentParams(kCharacterTatiana)[1] || (getCharacterCurrentParams(kCharacterTatiana)[1] = _currentGameSessionTicks + rndNum,
+																	_currentGameSessionTicks + rndNum != 0)) {
+				if (getCharacterCurrentParams(kCharacterTatiana)[1] >= _currentGameSessionTicks) {
+					if (_gameEvents[kEventTatianaTylerCompartment] || _gameTime > 2475000) {
+						if (getCharacterCurrentParams(kCharacterTatiana)[0]) {
+							setDoor(1, 0, checkDoor(1), 10, 9);
+						}
+						_gameProgress[kProgressFieldE4] = 0;
+						softReleaseAtDoor(kCharacterTatiana, 2);
+						getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 3;
+						TatianaCall(&LogicManager::CONS_Tatiana_DoWalk, 4, 7500, 0, 0);
+					}
+
+					break;
+				}
+
+				getCharacterCurrentParams(kCharacterTatiana)[1] = 0x7FFFFFFF;
+			}
+
+			playDialog(kCharacterTatiana, "LIB012", 16, 0);
+			getCharacterCurrentParams(kCharacterTatiana)[1] = 0;
+		}
+
+		if (_gameEvents[kEventTatianaTylerCompartment] || _gameTime > 2475000) {
+			if (getCharacterCurrentParams(kCharacterTatiana)[0]) {
+				setDoor(1, 0, checkDoor(1), 10, 9);
+			}
+			_gameProgress[kProgressFieldE4] = 0;
+			softReleaseAtDoor(kCharacterTatiana, 2);
+			getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 3;
+			TatianaCall(&LogicManager::CONS_Tatiana_DoWalk, 4, 7500, 0, 0);
+		}
+
+		break;
+	case 9:
+		getCharacterCurrentParams(kCharacterTatiana)[0] = 0;
+		setDoor(1, kCharacterCath, 0, 10, 9);
+		getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 5;
+		TatianaCall(&LogicManager::CONS_Tatiana_SaveGame, 2, kEventTatianaTylerCompartment, 0, 0);
+		break;
+	case 12:
+		getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 1;
+		TatianaCall(&LogicManager::CONS_Tatiana_DoCorrOtis, "673Bb", 33, 0, 0);
+		break;
+	case 18:
+		switch (getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8]) {
+		case 1:
+			setDoor(33, 0, 0, 10, 9);
+			getCharacter(kCharacterTatiana).characterPosition.location = 0;
+			getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 2;
+			TatianaCall(&LogicManager::CONS_Tatiana_DoWalk, 3, 7500, 0, 0);
+			break;
+		case 2:
+		case 7:
+			startCycOtis(kCharacterTatiana, "673Fb");
+			softBlockAtDoor(kCharacterTatiana, 2);
+			break;
+		case 3:
+			getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 4;
+			TatianaCall(&LogicManager::CONS_Tatiana_DoEnterCorrOtis, "673Db", 33, 0, 0);
+			break;
+		case 4:
+			getCharacter(kCharacterTatiana).characterPosition.location = 1;
+			endGraphics(kCharacterTatiana);
+			CONS_Tatiana_Asleep4(0, 0, 0, 0);
+			break;
+		case 5:
+			setDoor(9, kCharacterCath, 0, 255, 255);
+			playNIS(kEventTatianaTylerCompartment);
+			playDialog(0, "LIB015", -1, 0);
+			bumpCathTylerComp();
+			break;
+		case 6:
+			getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 7;
+			TatianaCall(&LogicManager::CONS_Tatiana_DoWalk, 3, 7500, 0, 0);
+			break;
+		default:
+			break;
+		}
+
+		break;
+	case 238790488:
+		getCharacterCurrentParams(kCharacterTatiana)[0] = 0;
+		setDoor(1, kCharacterCath, checkDoor(1), 10, 9);
+		softReleaseAtDoor(kCharacterTatiana, 2);
+		endGraphics(kCharacterTatiana);
+		getCharacter(kCharacterTatiana).characterPosition.car = 3;
+		getCharacter(kCharacterTatiana).characterPosition.position = 9460;
+		getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 6;
+		TatianaCall(&LogicManager::CONS_Tatiana_DoWait, 1800, 0, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -2352,14 +2730,19 @@ void LogicManager::CONS_Tatiana_Asleep4(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Tatiana_Asleep4(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterTatiana).characterPosition.car = kCarRedSleeping;
 		getCharacter(kCharacterTatiana).characterPosition.position = 7500;
 		getCharacter(kCharacterTatiana).characterPosition.location = 1;
 		setDoor(33, kCharacterCath, 1, 10, 9);
 		setDoor(49, kCharacterCath, 1, 10, 9);
-	} else if (msg->action == 169360385) {
+		break;
+	case 169360385:
 		CONS_Tatiana_AlexeiDead(0, 0, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -2380,12 +2763,15 @@ void LogicManager::HAND_Tatiana_AlexeiDead(HAND_PARAMS) {
 			getCharacterCurrentParams(kCharacterTatiana)[0] = 1;
 			CONS_Tatiana_Calm(0, 0, 0, 0);
 		}
+
 		break;
 	case 2:
-		goto LABEL_10;
+		playDialog(kCharacterTatiana, "Tat4166", -1, 0);
+		break;
 	case 8:
 		if (!cathRunningDialog("LIB012"))
 			playDialog(0, "LIB012", -1, 0);
+
 		break;
 	case 9:
 		playDialog(0, "LIB014", -1, 0);
@@ -2400,22 +2786,25 @@ void LogicManager::HAND_Tatiana_AlexeiDead(HAND_PARAMS) {
 		setDoor(49, kCharacterCath, 0, 10, 9);
 		setDoor(48, kCharacterTatiana, 0, 10, 9);
 		setDoor(32, kCharacterTatiana, 0, 10, 9);
+
 		if (!whoRunningDialog(kCharacterTatiana))
-		LABEL_10:
 			playDialog(kCharacterTatiana, "Tat4166", -1, 0);
+
 		break;
 	case 18:
 		if (getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] == 1) {
 			if (dialogRunning("MUS013"))
 				fadeDialog("MUS013");
+
 			playNIS(kEventVassiliDeadAlexei);
 			send(kCharacterTatiana, kCharacterAbbot, 104060776, 0);
 			bumpCath(kCarRedSleeping, 38, 255);
 			CONS_Tatiana_Calm(0, 0, 0, 0);
 		}
+
 		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -2430,9 +2819,13 @@ void LogicManager::CONS_Tatiana_Calm(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Tatiana_Calm(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		setDoor(32, kCharacterCath, 1, 0, 0);
 		setDoor(48, kCharacterCath, 1, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -2447,17 +2840,20 @@ void LogicManager::CONS_Tatiana_StartPart5(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Tatiana_StartPart5(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			endGraphics(kCharacterTatiana);
-			getCharacter(kCharacterTatiana).characterPosition.location = 1;
-			getCharacter(kCharacterTatiana).characterPosition.position = 3969;
-			getCharacter(kCharacterTatiana).characterPosition.car = kCarRestaurant;
-			getCharacter(kCharacterTatiana).inventoryItem = 0;
-			getCharacter(kCharacterTatiana).clothes = 0;
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		CONS_Tatiana_Trapped(0, 0, 0, 0);
+		break;
+	case 12:
+		endGraphics(kCharacterTatiana);
+		getCharacter(kCharacterTatiana).characterPosition.location = 1;
+		getCharacter(kCharacterTatiana).characterPosition.position = 3969;
+		getCharacter(kCharacterTatiana).characterPosition.car = kCarRestaurant;
+		getCharacter(kCharacterTatiana).inventoryItem = 0;
+		getCharacter(kCharacterTatiana).clothes = 0;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -2472,8 +2868,13 @@ void LogicManager::CONS_Tatiana_Trapped(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Tatiana_Trapped(HAND_PARAMS) {
-	if (msg->action == 70549068)
+	switch (msg->action) {
+	case 70549068:
 		CONS_Tatiana_Autistic(0, 0, 0, 0);
+		break;
+	default:
+		break;
+	}
 }
 
 void LogicManager::CONS_Tatiana_Autistic(CONS_PARAMS) {
@@ -2487,72 +2888,87 @@ void LogicManager::CONS_Tatiana_Autistic(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Tatiana_Autistic(HAND_PARAMS) {
-	if (msg->action > 12) {
-		switch (msg->action) {
-		case 18:
-			if (getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] == 1) {
-				if (dialogRunning("MUS050"))
-					fadeDialog("MUS050");
-				if (whoRunningDialog(kCharacterTatiana))
-					fadeDialog(kCharacterTatiana);
-
-				playNIS((kEventTatianaVassiliTalkNight - !isNight()));
-				cleanNIS();
-				getCharacterCurrentParams(kCharacterTatiana)[0] = 4;
-				getCharacterCurrentParams(kCharacterTatiana)[1] = 0;
-				getCharacterCurrentParams(kCharacterTatiana)[2] = 0;
-			}
-			break;
-		case 203078272:
-			startCycOtis(kCharacterTatiana, "033E");
-			break;
-		case 236060709:
-			getCharacter(kCharacterTatiana).inventoryItem = 0;
-			CONS_Tatiana_Asleep5(0, 0, 0, 0);
-			break;
-		}
-	} else if (msg->action == 12) {
-		startCycOtis(kCharacterTatiana, "033A");
-		getCharacter(kCharacterTatiana).inventoryItem = 0x80;
-	} else if (msg->action) {
-		if (msg->action == 1) {
-			getCharacter(kCharacterTatiana).inventoryItem = 0;
-			getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 1;
-			TatianaCall(&LogicManager::CONS_Tatiana_SaveGame, 2, kEventTatianaVassiliTalk, 0, 0);
-		} else if (msg->action == 2) {
-			++getCharacterCurrentParams(kCharacterTatiana)[0];
-			getCharacterCurrentParams(kCharacterTatiana)[1] = 0;
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		if (!getCharacterCurrentParams(kCharacterTatiana)[1]) {
 			switch (getCharacterCurrentParams(kCharacterTatiana)[0]) {
 			case 0:
 				playDialog(kCharacterTatiana, "Tat5167A", -1, 0);
-				goto LABEL_17;
+				getCharacterCurrentParams(kCharacterTatiana)[1] = 1;
+				break;
 			case 1:
 				playDialog(kCharacterTatiana, "Tat5167B", -1, 0);
-				goto LABEL_17;
+				getCharacterCurrentParams(kCharacterTatiana)[1] = 1;
+				break;
 			case 2:
 				playDialog(kCharacterTatiana, "Tat5167C", -1, 0);
-				goto LABEL_17;
+				getCharacterCurrentParams(kCharacterTatiana)[1] = 1;
+				break;
 			case 3:
 				playDialog(kCharacterTatiana, "Tat5167D", -1, 0);
-			LABEL_17:
 				getCharacterCurrentParams(kCharacterTatiana)[1] = 1;
 				break;
 			default:
 				break;
 			}
 		}
+
 		if (getCharacterCurrentParams(kCharacterTatiana)[0] > 3) {
 			if (getCharacterCurrentParams(kCharacterTatiana)[2] || (getCharacterCurrentParams(kCharacterTatiana)[2] = _currentGameSessionTicks + 225, _currentGameSessionTicks != -225)) {
 				if (getCharacterCurrentParams(kCharacterTatiana)[2] >= _currentGameSessionTicks)
-					return;
+					break;
+
 				getCharacterCurrentParams(kCharacterTatiana)[2] = 0x7FFFFFFF;
 			}
+
 			getCharacterCurrentParams(kCharacterTatiana)[0] = 0;
 			getCharacterCurrentParams(kCharacterTatiana)[2] = 0;
 		}
+
+		break;
+	case 1:
+		getCharacter(kCharacterTatiana).inventoryItem = 0;
+		getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 1;
+		TatianaCall(&LogicManager::CONS_Tatiana_SaveGame, 2, kEventTatianaVassiliTalk, 0, 0);
+		break;
+	case 2:
+		getCharacterCurrentParams(kCharacterTatiana)[0]++;
+		getCharacterCurrentParams(kCharacterTatiana)[1] = 0;
+		break;
+	case 12:
+		startCycOtis(kCharacterTatiana, "033A");
+		getCharacter(kCharacterTatiana).inventoryItem = 0x80;
+		break;
+	case 18:
+		if (getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] == 1) {
+			if (dialogRunning("MUS050"))
+				fadeDialog("MUS050");
+
+			if (whoRunningDialog(kCharacterTatiana))
+				fadeDialog(kCharacterTatiana);
+
+			if (isNight()) {
+				playNIS(kEventTatianaVassiliTalkNight);
+			} else {
+				playNIS(kEventTatianaVassiliTalk);
+			}
+			
+			cleanNIS();
+			getCharacterCurrentParams(kCharacterTatiana)[0] = 4;
+			getCharacterCurrentParams(kCharacterTatiana)[1] = 0;
+			getCharacterCurrentParams(kCharacterTatiana)[2] = 0;
+		}
+
+		break;
+	case 203078272:
+		startCycOtis(kCharacterTatiana, "033E");
+		break;
+	case 236060709:
+		getCharacter(kCharacterTatiana).inventoryItem = 0;
+		CONS_Tatiana_Asleep5(0, 0, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -2567,15 +2983,21 @@ void LogicManager::CONS_Tatiana_Asleep5(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Tatiana_Asleep5(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		endGraphics(kCharacterTatiana);
-		if (!checkCathDir(kCarRestaurant, 72))
-			return;
-		goto LABEL_7;
+		if (checkCathDir(kCarRestaurant, 72))
+			bumpCath(kCarRestaurant, 86, 255);
+
+		break;
+	case 17:
+		if (checkCathDir(kCarRestaurant, 72))
+			bumpCath(kCarRestaurant, 86, 255);
+
+		break;
+	default:
+		break;
 	}
-	if (msg->action == 17 && checkCathDir(kCarRestaurant, 72))
-	LABEL_7:
-		bumpCath(kCarRestaurant, 86, 255);
 }
 
 void (LogicManager::*LogicManager::_functionsTatiana[])(HAND_PARAMS) = {


Commit: e4752d4a34b58f8ed8ec6ce2fded9bb0c5f92905
    https://github.com/scummvm/scummvm/commit/e4752d4a34b58f8ed8ec6ce2fded9bb0c5f92905
Author: AndywinXp (andywinxp at gmail.com)
Date: 2025-06-16T23:12:18+02:00

Commit Message:
LASTEXPRESS: Clean up Rebecca logic

Changed paths:
    engines/lastexpress/characters/rebecca.cpp


diff --git a/engines/lastexpress/characters/rebecca.cpp b/engines/lastexpress/characters/rebecca.cpp
index 01a746437e1..437675dc794 100644
--- a/engines/lastexpress/characters/rebecca.cpp
+++ b/engines/lastexpress/characters/rebecca.cpp
@@ -48,7 +48,7 @@ void LogicManager::CONS_Rebecca(int chapter) {
 		CONS_Rebecca_StartPart5(0, 0, 0, 0);
 		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -69,18 +69,24 @@ void LogicManager::CONS_Rebecca_DebugWalks(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Rebecca_DebugWalks(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			getCharacter(kCharacterRebecca).characterPosition.position = 0;
-			getCharacter(kCharacterRebecca).characterPosition.location = 0;
-			getCharacter(kCharacterRebecca).characterPosition.car = kCarGreenSleeping;
-			getCharacterCurrentParams(kCharacterRebecca)[0] = 10000;
-		}
-	} else if (walk(kCharacterRebecca, kCarGreenSleeping, getCharacterCurrentParams(kCharacterRebecca)[0])) {
-		if (getCharacterCurrentParams(kCharacterRebecca)[0]== 10000)
-			getCharacterCurrentParams(kCharacterRebecca)[0]= 0;
-		else
-			getCharacterCurrentParams(kCharacterRebecca)[0] = 10000;
+	switch (msg->action) {
+	case 0:
+		if (walk(kCharacterRebecca, kCarGreenSleeping, getCharacterCurrentParams(kCharacterRebecca)[0])) {
+			if (getCharacterCurrentParams(kCharacterRebecca)[0] == 10000)
+				getCharacterCurrentParams(kCharacterRebecca)[0] = 0;
+			else
+				getCharacterCurrentParams(kCharacterRebecca)[0] = 10000;
+		}
+
+		break;
+	case 12:
+		getCharacter(kCharacterRebecca).characterPosition.position = 0;
+		getCharacter(kCharacterRebecca).characterPosition.location = 0;
+		getCharacter(kCharacterRebecca).characterPosition.car = kCarGreenSleeping;
+		getCharacterCurrentParams(kCharacterRebecca)[0] = 10000;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -97,16 +103,20 @@ void LogicManager::CONS_Rebecca_DoWait(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Rebecca_DoWait(HAND_PARAMS) {
-	if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		if (getCharacterCurrentParams(kCharacterRebecca)[1] || (getCharacterCurrentParams(kCharacterRebecca)[1] = _gameTime + getCharacterCurrentParams(kCharacterRebecca)[0], _gameTime + getCharacterCurrentParams(kCharacterRebecca)[0] != 0)) {
 			if (getCharacterCurrentParams(kCharacterRebecca)[1] >= _gameTime)
-				return;
+				break;
+
 			getCharacterCurrentParams(kCharacterRebecca)[1] = 0x7FFFFFFF;
 		}
 
 		getCharacter(kCharacterRebecca).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterRebecca, _functionsRebecca[getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall]]);
 		fedEx(kCharacterRebecca, kCharacterRebecca, 18, 0);
+	default:
+		break;
 	}
 }
 
@@ -123,12 +133,17 @@ void LogicManager::CONS_Rebecca_DoDialog(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Rebecca_DoDialog(HAND_PARAMS) {
-	if (msg->action == 2) {
+	switch (msg->action) {
+	case 2:
 		getCharacter(kCharacterRebecca).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterRebecca, _functionsRebecca[getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall]]);
 		fedEx(kCharacterRebecca, kCharacterRebecca, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		playDialog(kCharacterRebecca, (char *)&getCharacterCurrentParams(kCharacterRebecca)[0], -1, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -145,12 +160,17 @@ void LogicManager::CONS_Rebecca_DoCondDialog(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Rebecca_DoCondDialog(HAND_PARAMS) {
-	if (msg->action == 2) {
+	switch (msg->action) {
+	case 2:
 		getCharacter(kCharacterRebecca).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterRebecca, _functionsRebecca[getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall]]);
 		fedEx(kCharacterRebecca, kCharacterRebecca, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		playDialog(kCharacterRebecca, (char *)&getCharacterCurrentParams(kCharacterRebecca)[0], getVolume(kCharacterCond2), 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -186,10 +206,13 @@ void LogicManager::HAND_Rebecca_DoJoinedSeqOtis(HAND_PARAMS) {
 			fedEx(kCharacterRebecca, getCharacterCurrentParams(kCharacterRebecca)[3], getCharacterCurrentParams(kCharacterRebecca)[4], (char *)&getCharacterCurrentParams(kCharacterRebecca)[5]);
 			getCharacterCurrentParams(kCharacterRebecca)[8] = 1;
 		}
+
 		break;
 	case 12:
 		startSeqOtis(kCharacterRebecca, (char *)&getCharacterCurrentParams(kCharacterRebecca)[0]);
 		break;
+	default:
+		break;
 	}
 }
 
@@ -206,12 +229,17 @@ void LogicManager::CONS_Rebecca_DoSeqOtis(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Rebecca_DoSeqOtis(HAND_PARAMS) {
-	if (msg->action == 3) {
+	switch (msg->action) {
+	case 3:
 		getCharacter(kCharacterRebecca).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterRebecca, _functionsRebecca[getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall]]);
 		fedEx(kCharacterRebecca, kCharacterRebecca, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		startSeqOtis(kCharacterRebecca, (char *)&getCharacterCurrentParams(kCharacterRebecca)[0]);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -230,15 +258,20 @@ void LogicManager::CONS_Rebecca_DoCorrOtis(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Rebecca_DoCorrOtis(HAND_PARAMS) {
-	if (msg->action == 3) {
+	switch (msg->action) {
+	case 3:
 		releaseAtDoor(kCharacterRebecca, getCharacterCurrentParams(kCharacterRebecca)[3]);
 
 		getCharacter(kCharacterRebecca).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterRebecca, _functionsRebecca[getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall]]);
 		fedEx(kCharacterRebecca, kCharacterRebecca, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		startSeqOtis(kCharacterRebecca, (char *)&getCharacterCurrentParams(kCharacterRebecca)[0]);
 		blockAtDoor(kCharacterRebecca, getCharacterCurrentParams(kCharacterRebecca)[3]);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -257,17 +290,20 @@ void LogicManager::CONS_Rebecca_DoEnterCorrOtis(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Rebecca_DoEnterCorrOtis(HAND_PARAMS) {
-	if (msg->action == 3) {
+	switch (msg->action) {
+	case 3:
 		releaseAtDoor(kCharacterRebecca, getCharacterCurrentParams(kCharacterRebecca)[3]);
 		getCharacter(kCharacterRebecca).characterPosition.position = 4840;
 
 		getCharacter(kCharacterRebecca).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterRebecca, _functionsRebecca[getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall]]);
 		fedEx(kCharacterRebecca, kCharacterRebecca, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		startSeqOtis(kCharacterRebecca, (char *)&getCharacterCurrentParams(kCharacterRebecca)[0]);
 		blockAtDoor(kCharacterRebecca, getCharacterCurrentParams(kCharacterRebecca)[3]);
 		getCharacter(kCharacterRebecca).characterPosition.location = 1;
+
 		if (inComp(kCharacterCath, kCarRedSleeping, 4840) || inComp(kCharacterCath, kCarRedSleeping, 4455)) {
 			if (isNight()) {
 				playNIS(kEventCathTurningNight);
@@ -278,6 +314,10 @@ void LogicManager::HAND_Rebecca_DoEnterCorrOtis(HAND_PARAMS) {
 			playDialog(0, "BUMP", -1, 0);
 			bumpCathFDoor(36);
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -296,16 +336,20 @@ void LogicManager::CONS_Rebecca_DoBriefCorrOtis(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Rebecca_DoBriefCorrOtis(HAND_PARAMS) {
-	if (msg->action >= 3) {
-		if (msg->action <= 4) {
-			releaseAtDoor(kCharacterRebecca, getCharacterCurrentParams(kCharacterRebecca)[3]);
-			getCharacter(kCharacterRebecca).currentCall--;
-			_engine->getMessageManager()->setMessageHandle(kCharacterRebecca, _functionsRebecca[getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall]]);
-			fedEx(kCharacterRebecca, kCharacterRebecca, 18, 0);
-		} else if (msg->action == 12) {
-			startSeqOtis(kCharacterRebecca, (char *)&getCharacterCurrentParams(kCharacterRebecca)[0]);
-			blockAtDoor(kCharacterRebecca, getCharacterCurrentParams(kCharacterRebecca)[3]);
-		}
+	switch (msg->action) {
+	case 3:
+	case 4:
+		releaseAtDoor(kCharacterRebecca, getCharacterCurrentParams(kCharacterRebecca)[3]);
+		getCharacter(kCharacterRebecca).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterRebecca, _functionsRebecca[getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall]]);
+		fedEx(kCharacterRebecca, kCharacterRebecca, 18, 0);
+		break;
+	case 12:
+		startSeqOtis(kCharacterRebecca, (char *)&getCharacterCurrentParams(kCharacterRebecca)[0]);
+		blockAtDoor(kCharacterRebecca, getCharacterCurrentParams(kCharacterRebecca)[3]);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -320,16 +364,22 @@ void LogicManager::CONS_Rebecca_FinishSeqOtis(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Rebecca_FinishSeqOtis(HAND_PARAMS) {
-	if (msg->action == 0) {
-		if (getCharacter(kCharacterRebecca).direction == 4)
-			return;
-		goto LABEL_5;
-	}
-	if (msg->action == 3) {
-	LABEL_5:
+	switch (msg->action) {
+	case 0:
+		if (getCharacter(kCharacterRebecca).direction != 4) {
+			getCharacter(kCharacterRebecca).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterRebecca, _functionsRebecca[getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall]]);
+			fedEx(kCharacterRebecca, kCharacterRebecca, 18, 0);
+		}
+
+		break;
+	case 3:
 		getCharacter(kCharacterRebecca).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterRebecca, _functionsRebecca[getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall]]);
 		fedEx(kCharacterRebecca, kCharacterRebecca, 18, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -344,16 +394,18 @@ void LogicManager::CONS_Rebecca_WaitRCClear(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Rebecca_WaitRCClear(HAND_PARAMS) {
-	if (msg->action == 0) {
-		if (!rcClear())
-			return;
-		goto LABEL_7;
-	}
-	if (msg->action == 12 && rcClear()) {
-	LABEL_7:
-		getCharacter(kCharacterRebecca).currentCall--;
-		_engine->getMessageManager()->setMessageHandle(kCharacterRebecca, _functionsRebecca[getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall]]);
-		fedEx(kCharacterRebecca, kCharacterRebecca, 18, 0);
+	switch (msg->action) {
+	case 0:
+	case 12:
+		if (rcClear()) {
+			getCharacter(kCharacterRebecca).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterRebecca, _functionsRebecca[getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall]]);
+			fedEx(kCharacterRebecca, kCharacterRebecca, 18, 0);
+		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -373,25 +425,22 @@ void LogicManager::CONS_Rebecca_DoWalk(CONS_PARAMS) {
 void LogicManager::HAND_Rebecca_DoWalk(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
-		if (walk(kCharacterRebecca, getCharacterCurrentParams(kCharacterRebecca)[0], getCharacterCurrentParams(kCharacterRebecca)[1]))
-			goto LABEL_8;
-		break;
-	case 5:
-		playCathExcuseMe();
-		break;
-	case 6:
-		playChrExcuseMe(kCharacterRebecca, kCharacterCath, 0);
-		break;
 	case 12:
 		if (walk(kCharacterRebecca, getCharacterCurrentParams(kCharacterRebecca)[0], getCharacterCurrentParams(kCharacterRebecca)[1])) {
-		LABEL_8:
 			getCharacter(kCharacterRebecca).currentCall--;
 			_engine->getMessageManager()->setMessageHandle(kCharacterRebecca, _functionsRebecca[getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall]]);
 			fedEx(kCharacterRebecca, kCharacterRebecca, 18, 0);
 		}
+
+		break;
+	case 5:
+		playCathExcuseMe();
+		break;
+	case 6:
+		playChrExcuseMe(kCharacterRebecca, kCharacterCath, 0);
 		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -411,14 +460,19 @@ void LogicManager::CONS_Rebecca_DoBlockSeqOtis(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Rebecca_DoBlockSeqOtis(HAND_PARAMS) {
-	if (msg->action == 3) {
+	switch (msg->action) {
+	case 3:
 		releaseView(kCharacterRebecca, getCharacterCurrentParams(kCharacterRebecca)[3], getCharacterCurrentParams(kCharacterRebecca)[4]);
 		getCharacter(kCharacterRebecca).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterRebecca, _functionsRebecca[getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall]]);
 		fedEx(kCharacterRebecca, kCharacterRebecca, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		startSeqOtis(kCharacterRebecca, (char *)&getCharacterCurrentParams(kCharacterRebecca)[0]);
 		blockView(kCharacterRebecca, getCharacterCurrentParams(kCharacterRebecca)[3], getCharacterCurrentParams(kCharacterRebecca)[4]);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -438,13 +492,18 @@ void LogicManager::CONS_Rebecca_DoComplexSeqOtis(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Rebecca_DoComplexSeqOtis(HAND_PARAMS) {
-	if (msg->action == 3) {
+	switch (msg->action) {
+	case 3:
 		getCharacter(kCharacterRebecca).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterRebecca, _functionsRebecca[getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall]]);
 		fedEx(kCharacterRebecca, kCharacterRebecca, 18, 0);
-	} else if (msg->action == 12) {
+		break;
+	case 12:
 		startSeqOtis(kCharacterRebecca, (char *)&getCharacterCurrentParams(kCharacterRebecca)[0]);
 		startSeqOtis(getCharacterCurrentParams(kCharacterRebecca)[6], (char *)&getCharacterCurrentParams(kCharacterRebecca)[3]);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -459,19 +518,28 @@ void LogicManager::CONS_Rebecca_EnterComp(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Rebecca_EnterComp(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		if (cathOutRebeccaWindow())
 			bumpCath(kCarRedSleeping, 49, 255);
+
 		getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 1;
 		RebeccaCall(&LogicManager::CONS_Rebecca_DoEnterCorrOtis, "624Ae", 36, 0, 0);
-	} else if (msg->action == 18 && getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] == 1) {
-		setDoor(44, 0, 0, 255, 255);
-		getCharacter(kCharacterRebecca).characterPosition.location = 1;
-		endGraphics(kCharacterRebecca);
+		break;
+	case 18:
+		if (getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] == 1) {
+			setDoor(44, kCharacterCath, 0, 255, 255);
+			getCharacter(kCharacterRebecca).characterPosition.location = 1;
+			endGraphics(kCharacterRebecca);
 
-		getCharacter(kCharacterRebecca).currentCall--;
-		_engine->getMessageManager()->setMessageHandle(kCharacterRebecca, _functionsRebecca[getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall]]);
-		fedEx(kCharacterRebecca, kCharacterRebecca, 18, 0);
+			getCharacter(kCharacterRebecca).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterRebecca, _functionsRebecca[getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall]]);
+			fedEx(kCharacterRebecca, kCharacterRebecca, 18, 0);
+		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -488,62 +556,76 @@ void LogicManager::CONS_Rebecca_GotoDinner(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Rebecca_GotoDinner(HAND_PARAMS) {
-	if (msg->action > 12) {
-		if (msg->action == 18) {
-			switch (getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8]) {
-			case 1:
-				setDoor(36, 0, 0, 10, 9);
-				setDoor(52, 0, 0, 10, 9);
-				getCharacter(kCharacterRebecca).characterPosition.location = 0;
-				send(kCharacterRebecca, kCharacterSophie, 125242096, 0);
-				getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 2;
-				RebeccaCall(&LogicManager::CONS_Rebecca_DoWalk, 5, 850, 0, 0);
-				break;
-			case 2:
-				endGraphics(kCharacterRebecca);
-				break;
-			case 3:
-				getCharacter(kCharacterRebecca).characterPosition.position = 1540;
-				getCharacter(kCharacterRebecca).characterPosition.location = 0;
-				getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 4;
-				RebeccaCall(&LogicManager::CONS_Rebecca_DoSeqOtis, "810US", 0, 0, 0);
-				break;
-			case 4:
-				startSeqOtis(kCharacterRebecca, "012B");
-				if (inSalon(kCharacterCath))
-					advanceFrame(kCharacterRebecca);
-				getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 5;
-				RebeccaCall(&LogicManager::CONS_Rebecca_FinishSeqOtis, 0, 0, 0, 0);
-				break;
-			case 5:
-				startCycOtis(kCharacterRebecca, "012A");
-				if (_gameProgress[kProgressChapter] == 3)
-					playDialog(23, "REB3000", -1, 0);
-				send(kCharacterRebecca, kCharacterHeadWait, 269479296, 0);
-				getCharacterCurrentParams(kCharacterRebecca)[1] = 1;
-				break;
-			default:
-				return;
-			}
-		} else if (msg->action == 157370960) {
-			send(kCharacterRebecca, kCharacterTableD, 136455232, 0);
-			getCharacter(kCharacterRebecca).characterPosition.location = 1;
-
-			getCharacter(kCharacterRebecca).currentCall--;
-			_engine->getMessageManager()->setMessageHandle(kCharacterRebecca, _functionsRebecca[getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall]]);
-			fedEx(kCharacterRebecca, kCharacterRebecca, 18, 0);
+	switch (msg->action) {
+	case 0:
+		if (!getCharacterCurrentParams(kCharacterRebecca)[1] && nearChar(kCharacterRebecca, kCharacterSophie, 750) && !whoOnScreen(kCharacterSophie)) {
+			send(kCharacterRebecca, kCharacterSophie, 123668192, 0);
+			getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 3;
+			RebeccaCall(&LogicManager::CONS_Rebecca_WaitRCClear, 0, 0, 0, 0);
 		}
-	} else if (msg->action == 12) {
+
+		break;
+	case 12:
 		getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 1;
 		if (!getCharacterCurrentParams(kCharacterRebecca)[0]) {
 			RebeccaCall(&LogicManager::CONS_Rebecca_DoCorrOtis, "623Ee", 36, 0, 0);
 		} else {
 			RebeccaCall(&LogicManager::CONS_Rebecca_DoCorrOtis, "624Be", 36, 0, 0);
-		}	
-	} else if (msg->action == 0 && !getCharacterCurrentParams(kCharacterRebecca)[1] && nearChar(kCharacterRebecca, kCharacterSophie, 750) && !whoOnScreen(kCharacterSophie)) {
-		send(kCharacterRebecca, kCharacterSophie, 123668192, 0);
-		getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 3;
-		RebeccaCall(&LogicManager::CONS_Rebecca_WaitRCClear, 0, 0, 0, 0);
+		}
+
+		break;
+	case 18:
+		switch (getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8]) {
+		case 1:
+			setDoor(36, kCharacterCath, 0, 10, 9);
+			setDoor(52, kCharacterCath, 0, 10, 9);
+			getCharacter(kCharacterRebecca).characterPosition.location = 0;
+			send(kCharacterRebecca, kCharacterSophie, 125242096, 0);
+			getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 2;
+			RebeccaCall(&LogicManager::CONS_Rebecca_DoWalk, 5, 850, 0, 0);
+			break;
+		case 2:
+			endGraphics(kCharacterRebecca);
+			break;
+		case 3:
+			getCharacter(kCharacterRebecca).characterPosition.position = 1540;
+			getCharacter(kCharacterRebecca).characterPosition.location = 0;
+			getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 4;
+			RebeccaCall(&LogicManager::CONS_Rebecca_DoSeqOtis, "810US", 0, 0, 0);
+			break;
+		case 4:
+			startSeqOtis(kCharacterRebecca, "012B");
+
+			if (inSalon(kCharacterCath))
+				advanceFrame(kCharacterRebecca);
+
+			getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 5;
+			RebeccaCall(&LogicManager::CONS_Rebecca_FinishSeqOtis, 0, 0, 0, 0);
+			break;
+		case 5:
+			startCycOtis(kCharacterRebecca, "012A");
+
+			if (_gameProgress[kProgressChapter] == 3)
+				playDialog(kCharacterRebecca, "REB3000", -1, 0);
+
+			send(kCharacterRebecca, kCharacterHeadWait, 269479296, 0);
+			getCharacterCurrentParams(kCharacterRebecca)[1] = 1;
+			break;
+		default:
+			break;
+		}
+
+		break;
+	case 157370960:
+		send(kCharacterRebecca, kCharacterTableD, 136455232, 0);
+		getCharacter(kCharacterRebecca).characterPosition.location = 1;
+
+		getCharacter(kCharacterRebecca).currentCall--;
+		_engine->getMessageManager()->setMessageHandle(kCharacterRebecca, _functionsRebecca[getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall]]);
+		fedEx(kCharacterRebecca, kCharacterRebecca, 18, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -560,105 +642,128 @@ void LogicManager::CONS_Rebecca_GotoSalon(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Rebecca_GotoSalon(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 1;
-			RebeccaCall(&LogicManager::CONS_Rebecca_DoCorrOtis, "624Be", 36, 0, 0);
-		} else if (msg->action == 18) {
-			switch (getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8]) {
-			case 1:
-				setDoor(36, 0, 0, 10, 9);
-				setDoor(52, 0, 0, 10, 9);
-				getCharacter(kCharacterRebecca).characterPosition.location = 0;
-				send(kCharacterRebecca, kCharacterSophie, 125242096, 0);
-				getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 2;
-				RebeccaCall(&LogicManager::CONS_Rebecca_DoWalk, 5, 850, 0, 0);
-				break;
-			case 2:
-				endGraphics(kCharacterRebecca);
-				break;
-			case 3:
-				getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 4;
-				RebeccaCall(&LogicManager::CONS_Rebecca_WaitRCClear, 0, 0, 0, 0);
-				break;
-			case 4:
-				getCharacter(kCharacterRebecca).characterPosition.position = 1540;
-				getCharacter(kCharacterRebecca).characterPosition.location = 0;
-				if (_gameProgress[11] == 3)
-					playDialog(kCharacterRebecca, "Reb3005", -1, 75);
-				if (getCharacterCurrentParams(kCharacterRebecca)[0]) {
-					getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 5;
-					RebeccaCall(&LogicManager::CONS_Rebecca_DoBlockSeqOtis, "118A", 5, 52, 0);
-				} else {
-					blockView(kCharacterRebecca, kCarRestaurant, 57);
-					getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 6;
-					RebeccaCall(&LogicManager::CONS_Rebecca_DoComplexSeqOtis, "107A1", "107A2", 24, 0);
-				}
-				break;
-			case 5:
-				goto LABEL_19;
-			case 6:
-				releaseView(kCharacterRebecca, kCarRestaurant, 57);
-				endGraphics(kCharacterSophie);
-			LABEL_19:
-				getCharacter(kCharacterRebecca).characterPosition.location = 1;
-
-				getCharacter(kCharacterRebecca).currentCall--;
-				_engine->getMessageManager()->setMessageHandle(kCharacterRebecca, _functionsRebecca[getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall]]);
-				fedEx(kCharacterRebecca, kCharacterRebecca, 18, 0);
-				break;
-			default:
-				return;
-			}
+	switch (msg->action) {
+	case 0:
+		if (nearChar(kCharacterRebecca, kCharacterSophie, 750) && !whoOnScreen(kCharacterSophie)) {
+			send(kCharacterRebecca, kCharacterSophie, 123668192, 0);
+			getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 3;
+			RebeccaCall(&LogicManager::CONS_Rebecca_DoWait, 0, 0, 0, 0);
 		}
-	} else if (nearChar(kCharacterRebecca, kCharacterSophie, 0x2EE) && !whoOnScreen(kCharacterSophie)) {
-		send(kCharacterRebecca, kCharacterSophie, 123668192, 0);
-		getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 3;
-		RebeccaCall(&LogicManager::CONS_Rebecca_DoWait, 0, 0, 0, 0);
-	}
-}
-
-void LogicManager::CONS_Rebecca_ReturnFromSalon(CONS_PARAMS) {
-	CharacterCallParams *params = &getCharacter(kCharacterRebecca).callParams[getCharacter(kCharacterRebecca).currentCall];
-	_engine->getMessageManager()->setMessageHandle(kCharacterRebecca, &LogicManager::HAND_Rebecca_ReturnFromSalon);
-	getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall] = 18;
-
-	params->clear();
-
-	fedEx(kCharacterRebecca, kCharacterRebecca, 12, 0);
-}
 
-void LogicManager::HAND_Rebecca_ReturnFromSalon(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			getCharacter(kCharacterRebecca).characterPosition.car = 4;
-			getCharacter(kCharacterRebecca).characterPosition.position = 9270;
-			getCharacter(kCharacterRebecca).characterPosition.location = 0;
-			send(kCharacterRebecca, kCharacterSophie, 136654208, 0);
-			getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 1;
-			RebeccaCall(&LogicManager::CONS_Rebecca_DoWalk, 4, 4840, 0, 0);
-		} else if (msg->action == 18) {
-			if (getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] == 1) {
-				if (nearChar(kCharacterRebecca, kCharacterSophie, 750) || nearX(kCharacterSophie, 4840, 500)) {
-					send(kCharacterRebecca, kCharacterSophie, 123668192, 0);
-					getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 2;
-					RebeccaCall(&LogicManager::CONS_Rebecca_EnterComp, 0, 0, 0, 0);
-				} else {
-					startCycOtis(kCharacterRebecca, "623Ge");
-					softBlockAtDoor(kCharacterRebecca, 36);
-				}
-			} else if (getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] == 2 ||
-				getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] == 3) {
-				getCharacter(kCharacterRebecca).currentCall--;
-				_engine->getMessageManager()->setMessageHandle(kCharacterRebecca, _functionsRebecca[getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall]]);
-				fedEx(kCharacterRebecca, kCharacterRebecca, 18, 0);
+		break;
+	case 12:
+		getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 1;
+		RebeccaCall(&LogicManager::CONS_Rebecca_DoCorrOtis, "624Be", 36, 0, 0);
+		break;
+	case 18:
+		switch (getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8]) {
+		case 1:
+			setDoor(36, kCharacterCath, 0, 10, 9);
+			setDoor(52, kCharacterCath, 0, 10, 9);
+			getCharacter(kCharacterRebecca).characterPosition.location = 0;
+			send(kCharacterRebecca, kCharacterSophie, 125242096, 0);
+			getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 2;
+			RebeccaCall(&LogicManager::CONS_Rebecca_DoWalk, 5, 850, 0, 0);
+			break;
+		case 2:
+			endGraphics(kCharacterRebecca);
+			break;
+		case 3:
+			getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 4;
+			RebeccaCall(&LogicManager::CONS_Rebecca_WaitRCClear, 0, 0, 0, 0);
+			break;
+		case 4:
+			getCharacter(kCharacterRebecca).characterPosition.position = 1540;
+			getCharacter(kCharacterRebecca).characterPosition.location = 0;
+
+			if (_gameProgress[kProgressChapter] == 3)
+				playDialog(kCharacterRebecca, "Reb3005", -1, 75);
+
+			if (getCharacterCurrentParams(kCharacterRebecca)[0]) {
+				getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 5;
+				RebeccaCall(&LogicManager::CONS_Rebecca_DoBlockSeqOtis, "118A", 5, 52, 0);
+			} else {
+				blockView(kCharacterRebecca, kCarRestaurant, 57);
+				getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 6;
+				RebeccaCall(&LogicManager::CONS_Rebecca_DoComplexSeqOtis, "107A1", "107A2", 24, 0);
 			}
+
+			break;
+		case 5:
+			getCharacter(kCharacterRebecca).characterPosition.location = 1;
+
+			getCharacter(kCharacterRebecca).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterRebecca, _functionsRebecca[getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall]]);
+			fedEx(kCharacterRebecca, kCharacterRebecca, 18, 0);
+			break;
+		case 6:
+			releaseView(kCharacterRebecca, kCarRestaurant, 57);
+			endGraphics(kCharacterSophie);
+			getCharacter(kCharacterRebecca).characterPosition.location = 1;
+
+			getCharacter(kCharacterRebecca).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterRebecca, _functionsRebecca[getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall]]);
+			fedEx(kCharacterRebecca, kCharacterRebecca, 18, 0);
+			break;
+		default:
+			break;
 		}
-	} else if (nearChar(kCharacterRebecca, kCharacterSophie, 750) || nearX(kCharacterSophie, 4840, 500)) {
-		send(kCharacterRebecca, kCharacterSophie, 123668192, 0);
-		softReleaseAtDoor(kCharacterRebecca, 36);
-		getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 3;
-		RebeccaCall(&LogicManager::CONS_Rebecca_EnterComp, 0, 0, 0, 0);
+
+		break;
+	default:
+		break;
+	}
+}
+
+void LogicManager::CONS_Rebecca_ReturnFromSalon(CONS_PARAMS) {
+	CharacterCallParams *params = &getCharacter(kCharacterRebecca).callParams[getCharacter(kCharacterRebecca).currentCall];
+	_engine->getMessageManager()->setMessageHandle(kCharacterRebecca, &LogicManager::HAND_Rebecca_ReturnFromSalon);
+	getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall] = 18;
+
+	params->clear();
+
+	fedEx(kCharacterRebecca, kCharacterRebecca, 12, 0);
+}
+
+void LogicManager::HAND_Rebecca_ReturnFromSalon(HAND_PARAMS) {
+	switch (msg->action) {
+	case 0:
+		if (nearChar(kCharacterRebecca, kCharacterSophie, 750) || nearX(kCharacterSophie, 4840, 500)) {
+			send(kCharacterRebecca, kCharacterSophie, 123668192, 0);
+			softReleaseAtDoor(kCharacterRebecca, 36);
+			getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 3;
+			RebeccaCall(&LogicManager::CONS_Rebecca_EnterComp, 0, 0, 0, 0);
+		}
+
+		break;
+	case 12:
+		getCharacter(kCharacterRebecca).characterPosition.car = 4;
+		getCharacter(kCharacterRebecca).characterPosition.position = 9270;
+		getCharacter(kCharacterRebecca).characterPosition.location = 0;
+		send(kCharacterRebecca, kCharacterSophie, 136654208, 0);
+		getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 1;
+		RebeccaCall(&LogicManager::CONS_Rebecca_DoWalk, 4, 4840, 0, 0);
+		break;
+	case 18:
+		if (getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] == 1) {
+			if (nearChar(kCharacterRebecca, kCharacterSophie, 750) || nearX(kCharacterSophie, 4840, 500)) {
+				send(kCharacterRebecca, kCharacterSophie, 123668192, 0);
+				getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 2;
+				RebeccaCall(&LogicManager::CONS_Rebecca_EnterComp, 0, 0, 0, 0);
+			} else {
+				startCycOtis(kCharacterRebecca, "623Ge");
+				softBlockAtDoor(kCharacterRebecca, 36);
+			}
+		} else if (getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] == 2 ||
+			getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] == 3) {
+			getCharacter(kCharacterRebecca).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterRebecca, _functionsRebecca[getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall]]);
+			fedEx(kCharacterRebecca, kCharacterRebecca, 18, 0);
+		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -673,58 +778,69 @@ void LogicManager::CONS_Rebecca_ReturnFromDinner(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Rebecca_ReturnFromDinner(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 1;
-			RebeccaCall(&LogicManager::CONS_Rebecca_WaitRCClear, 0, 0, 0, 0);
-		} else if (msg->action == 18) {
-			switch (getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8]) {
-			case 1:
-				getCharacter(kCharacterRebecca).characterPosition.location = 0;
-				getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 2;
-				RebeccaCall(&LogicManager::CONS_Rebecca_DoJoinedSeqOtis, "012H", 36, 103798704, "010M");
-				break;
-			case 2:
-				send(kCharacterRebecca, kCharacterWaiter1, 337548856, 0);
-				startSeqOtis(kCharacterRebecca, "810DS");
-				if (inDiningRoom(kCharacterCath))
-					advanceFrame(kCharacterRebecca);
-				getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 3;
-				RebeccaCall(&LogicManager::CONS_Rebecca_FinishSeqOtis, 0, 0, 0, 0);
-				break;
-			case 3:
-				getCharacter(kCharacterRebecca).characterPosition.car = 4;
-				getCharacter(kCharacterRebecca).characterPosition.position = 9270;
-				getCharacter(kCharacterRebecca).characterPosition.location = 0;
-				send(kCharacterRebecca, kCharacterSophie, 136654208, 0);
-				getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 4;
-				RebeccaCall(&LogicManager::CONS_Rebecca_DoWalk, 4, 4840, 0, 0);
-				break;
-			case 4:
-				if (nearChar(kCharacterRebecca, kCharacterSophie, 750) || nearX(kCharacterSophie, 4840, 500)) {
-					send(kCharacterRebecca, kCharacterSophie, 123668192, 0);
-					getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 5;
-					RebeccaCall(&LogicManager::CONS_Rebecca_EnterComp, 0, 0, 0, 0);
-				} else {
-					startCycOtis(kCharacterRebecca, "623Ge");
-					softBlockAtDoor(kCharacterRebecca, 36);
-				}
-				break;
-			case 5:
-			case 6:
-				getCharacter(kCharacterRebecca).currentCall--;
-				_engine->getMessageManager()->setMessageHandle(kCharacterRebecca, _functionsRebecca[getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall]]);
-				fedEx(kCharacterRebecca, kCharacterRebecca, 18, 0);
-				break;
-			default:
-				return;
+	switch (msg->action) {
+	case 0:
+		if (nearChar(kCharacterRebecca, kCharacterSophie, 750) || nearX(kCharacterSophie, 4840, 500)) {
+			send(kCharacterRebecca, kCharacterSophie, 123668192, 0);
+			softReleaseAtDoor(kCharacterRebecca, 36);
+			getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 6;
+			RebeccaCall(&LogicManager::CONS_Rebecca_EnterComp, 0, 0, 0, 0);
+		}
+
+		break;
+	case 12:
+		getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 1;
+		RebeccaCall(&LogicManager::CONS_Rebecca_WaitRCClear, 0, 0, 0, 0);
+		break;
+	case 18:
+		switch (getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8]) {
+		case 1:
+			getCharacter(kCharacterRebecca).characterPosition.location = 0;
+			getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 2;
+			RebeccaCall(&LogicManager::CONS_Rebecca_DoJoinedSeqOtis, "012H", 36, 103798704, "010M");
+			break;
+		case 2:
+			send(kCharacterRebecca, kCharacterWaiter1, 337548856, 0);
+			startSeqOtis(kCharacterRebecca, "810DS");
+
+			if (inDiningRoom(kCharacterCath))
+				advanceFrame(kCharacterRebecca);
+
+			getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 3;
+			RebeccaCall(&LogicManager::CONS_Rebecca_FinishSeqOtis, 0, 0, 0, 0);
+			break;
+		case 3:
+			getCharacter(kCharacterRebecca).characterPosition.car = 4;
+			getCharacter(kCharacterRebecca).characterPosition.position = 9270;
+			getCharacter(kCharacterRebecca).characterPosition.location = 0;
+			send(kCharacterRebecca, kCharacterSophie, 136654208, 0);
+			getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 4;
+			RebeccaCall(&LogicManager::CONS_Rebecca_DoWalk, 4, 4840, 0, 0);
+			break;
+		case 4:
+			if (nearChar(kCharacterRebecca, kCharacterSophie, 750) || nearX(kCharacterSophie, 4840, 500)) {
+				send(kCharacterRebecca, kCharacterSophie, 123668192, 0);
+				getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 5;
+				RebeccaCall(&LogicManager::CONS_Rebecca_EnterComp, 0, 0, 0, 0);
+			} else {
+				startCycOtis(kCharacterRebecca, "623Ge");
+				softBlockAtDoor(kCharacterRebecca, 36);
 			}
+
+			break;
+		case 5:
+		case 6:
+			getCharacter(kCharacterRebecca).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterRebecca, _functionsRebecca[getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall]]);
+			fedEx(kCharacterRebecca, kCharacterRebecca, 18, 0);
+			break;
+		default:
+			break;
 		}
-	} else if (nearChar(kCharacterRebecca, kCharacterSophie, 750) || nearX(kCharacterSophie, 4840, 500)) {
-		send(kCharacterRebecca, kCharacterSophie, 123668192, 0);
-		softReleaseAtDoor(kCharacterRebecca, 36);
-		getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 6;
-		RebeccaCall(&LogicManager::CONS_Rebecca_EnterComp, 0, 0, 0, 0);
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -741,90 +857,129 @@ void LogicManager::CONS_Rebecca_CompLogic(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Rebecca_CompLogic(HAND_PARAMS) {
-	if (msg->action <= 9) {
-		if (msg->action < 8) {
-			if (msg->action)
-				return;
-			if (getCharacterCurrentParams(kCharacterRebecca)[0] < _gameTime && !getCharacterCurrentParams(kCharacterRebecca)[4]) {
-				getCharacterCurrentParams(kCharacterRebecca)[4] = 1;
-				setDoor(36, 0, 0, 10, 9);
-				setDoor(52, 0, 0, 10, 9);
+	switch (msg->action) {
+	case 0: {
+		if (getCharacterCurrentParams(kCharacterRebecca)[0] < _gameTime && !getCharacterCurrentParams(kCharacterRebecca)[4]) {
+			getCharacterCurrentParams(kCharacterRebecca)[4] = 1;
+			setDoor(36, kCharacterCath, 0, 10, 9);
+			setDoor(52, kCharacterCath, 0, 10, 9);
 
-				getCharacter(kCharacterRebecca).currentCall--;
-				_engine->getMessageManager()->setMessageHandle(kCharacterRebecca, _functionsRebecca[getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall]]);
-				fedEx(kCharacterRebecca, kCharacterRebecca, 18, 0);
-				return;
-			}
-			if (getCharacterCurrentParams(kCharacterRebecca)[1]) {
-				if (getCharacterCurrentParams(kCharacterRebecca)[5] || (getCharacterCurrentParams(kCharacterRebecca)[5] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
-					if (getCharacterCurrentParams(kCharacterRebecca)[5] >= _currentGameSessionTicks)
-						goto LABEL_22;
+			getCharacter(kCharacterRebecca).currentCall--;
+			_engine->getMessageManager()->setMessageHandle(kCharacterRebecca, _functionsRebecca[getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall]]);
+			fedEx(kCharacterRebecca, kCharacterRebecca, 18, 0);
+			break;
+		}
+
+		bool skip = false;
+
+		if (getCharacterCurrentParams(kCharacterRebecca)[1]) {
+			if (getCharacterCurrentParams(kCharacterRebecca)[5] || (getCharacterCurrentParams(kCharacterRebecca)[5] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
+				if (getCharacterCurrentParams(kCharacterRebecca)[5] >= _currentGameSessionTicks) {
+					skip = true;
+				}
+
+				if (!skip) {
 					getCharacterCurrentParams(kCharacterRebecca)[5] = 0x7FFFFFFF;
 				}
+			}
+
+			if (!skip) {
 				getCharacterCurrentParams(kCharacterRebecca)[1] = 0;
 				getCharacterCurrentParams(kCharacterRebecca)[2] = 1;
-				setDoor(36, 23, 1, 0, 0);
-				setDoor(52, 23, 1, 0, 0);
+				setDoor(36, kCharacterRebecca, 1, 0, 0);
+				setDoor(52, kCharacterRebecca, 1, 0, 0);
 			}
+		}
+
+		if (!skip) {
 			getCharacterCurrentParams(kCharacterRebecca)[5] = 0;
-		LABEL_22:
-			if (_gameProgress[kProgressChapter] == 1 && !getCharacterParams(kCharacterRebecca, 8)[2]) {
-				if (getCharacterCurrentParams(kCharacterRebecca)[6] != 0x7FFFFFFF && _gameTime > 1174500) {
-					if (_gameTime > 1183500)
-						goto LABEL_32;
-					if (!nearChar(kCharacterRebecca, kCharacterCath, 2000) || dialogRunning("CON1210") || !getCharacterCurrentParams(kCharacterRebecca)[6]) {
-						getCharacterCurrentParams(kCharacterRebecca)[6] = _gameTime;
-						if (!_gameTime)
-							goto LABEL_33;
-					}
-					if (getCharacterCurrentParams(kCharacterRebecca)[6] < _gameTime) {
-					LABEL_32:
-						getCharacterCurrentParams(kCharacterRebecca)[6] = 0x7FFFFFFF;
-					LABEL_33:
+		}
+
+		if (_gameProgress[kProgressChapter] == 1 && !getCharacterParams(kCharacterRebecca, 8)[2]) {
+			if (getCharacterCurrentParams(kCharacterRebecca)[6] != 0x7FFFFFFF && _gameTime > 1174500) {
+				if (_gameTime > 1183500) {
+					getCharacterCurrentParams(kCharacterRebecca)[6] = 0x7FFFFFFF;
+					getCharacterParams(kCharacterRebecca, 8)[2] = 1;
+					setDoor(36, kCharacterRebecca, 1, 0, 0);
+					setDoor(52, kCharacterRebecca, 1, 0, 0);
+					getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 1;
+					RebeccaCall(&LogicManager::CONS_Rebecca_DoDialog, "REB1205", 0, 0, 0);
+					break;
+				}
+
+				if (!nearChar(kCharacterRebecca, kCharacterCath, 2000) || dialogRunning("CON1210") || !getCharacterCurrentParams(kCharacterRebecca)[6]) {
+					getCharacterCurrentParams(kCharacterRebecca)[6] = _gameTime;
+					if (!_gameTime) {
 						getCharacterParams(kCharacterRebecca, 8)[2] = 1;
-						setDoor(36, 23, 1, 0, 0);
-						setDoor(52, 23, 1, 0, 0);
+						setDoor(36, kCharacterRebecca, 1, 0, 0);
+						setDoor(52, kCharacterRebecca, 1, 0, 0);
 						getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 1;
 						RebeccaCall(&LogicManager::CONS_Rebecca_DoDialog, "REB1205", 0, 0, 0);
-						return;
+						break;
 					}
 				}
-				goto LABEL_67;
-			}
-			if (_gameProgress[kProgressChapter] == 3 && !getCharacterParams(kCharacterRebecca, 8)[3] && getCharacterCurrentParams(kCharacterRebecca)[7] != 0x7FFFFFFF && _gameTime > 2097000) {
-				if (_gameTime > 2106000)
-					goto LABEL_43;
-				if (!nearChar(kCharacterRebecca, kCharacterCath, 1000) || !getCharacterCurrentParams(kCharacterRebecca)[7]) {
-					getCharacterCurrentParams(kCharacterRebecca)[7] = _gameTime;
-					if (!_gameTime)
-						goto LABEL_44;
+
+				if (getCharacterCurrentParams(kCharacterRebecca)[6] < _gameTime) {
+					getCharacterCurrentParams(kCharacterRebecca)[6] = 0x7FFFFFFF;
+					getCharacterParams(kCharacterRebecca, 8)[2] = 1;
+					setDoor(36, kCharacterRebecca, 1, 0, 0);
+					setDoor(52, kCharacterRebecca, 1, 0, 0);
+					getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 1;
+					RebeccaCall(&LogicManager::CONS_Rebecca_DoDialog, "REB1205", 0, 0, 0);
+					break;
 				}
-				if (getCharacterCurrentParams(kCharacterRebecca)[7] < _gameTime) {
-				LABEL_43:
-					getCharacterCurrentParams(kCharacterRebecca)[7] = 0x7FFFFFFF;
-				LABEL_44:
+			}
+		} else if (_gameProgress[kProgressChapter] == 3 && !getCharacterParams(kCharacterRebecca, 8)[3] && getCharacterCurrentParams(kCharacterRebecca)[7] != 0x7FFFFFFF && _gameTime > 2097000) {
+			if (_gameTime > 2106000) {
+				getCharacterCurrentParams(kCharacterRebecca)[7] = 0x7FFFFFFF;
+				getCharacterParams(kCharacterRebecca, 8)[3] = 1;
+				setDoor(36, kCharacterRebecca, 1, 0, 0);
+				setDoor(52, kCharacterRebecca, 1, 0, 0);
+				getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 2;
+				RebeccaCall(&LogicManager::CONS_Rebecca_DoDialog, "REB3010", 0, 0, 0);
+				break;
+			}
+
+			if (!nearChar(kCharacterRebecca, kCharacterCath, 1000) || !getCharacterCurrentParams(kCharacterRebecca)[7]) {
+				getCharacterCurrentParams(kCharacterRebecca)[7] = _gameTime;
+				if (!_gameTime) {
 					getCharacterParams(kCharacterRebecca, 8)[3] = 1;
-					setDoor(36, 23, 1, 0, 0);
-					setDoor(52, 23, 1, 0, 0);
+					setDoor(36, kCharacterRebecca, 1, 0, 0);
+					setDoor(52, kCharacterRebecca, 1, 0, 0);
 					getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 2;
 					RebeccaCall(&LogicManager::CONS_Rebecca_DoDialog, "REB3010", 0, 0, 0);
-					return;
+					break;
 				}
 			}
-		LABEL_67:
-			if (getCharacterParams(kCharacterRebecca, 8)[1]) {
-				if (nearChar(kCharacterRebecca, kCharacterCath, 1000)) {
-					setDoor(36, 23, 1, 0, 0);
-					setDoor(52, 23, 1, 0, 0);
-					getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 3;
-					RebeccaCall(&LogicManager::CONS_Rebecca_DoDialog, "REB1040", 0, 0, 0);
-				}
+
+			if (getCharacterCurrentParams(kCharacterRebecca)[7] < _gameTime) {
+				getCharacterCurrentParams(kCharacterRebecca)[7] = 0x7FFFFFFF;
+				getCharacterParams(kCharacterRebecca, 8)[3] = 1;
+				setDoor(36, kCharacterRebecca, 1, 0, 0);
+				setDoor(52, kCharacterRebecca, 1, 0, 0);
+				getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 2;
+				RebeccaCall(&LogicManager::CONS_Rebecca_DoDialog, "REB3010", 0, 0, 0);
+				break;
+			}
+		}
+
+		if (getCharacterParams(kCharacterRebecca, 8)[1]) {
+			if (nearChar(kCharacterRebecca, kCharacterCath, 1000)) {
+				setDoor(36, kCharacterRebecca, 1, 0, 0);
+				setDoor(52, kCharacterRebecca, 1, 0, 0);
+				getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 3;
+				RebeccaCall(&LogicManager::CONS_Rebecca_DoDialog, "REB1040", 0, 0, 0);
 			}
-			return;
 		}
+
+		break;
+	}
+	case 8:
+	case 9:
 		if (!getCharacterCurrentParams(kCharacterRebecca)[1]) {
-			setDoor(36, 23, 1, 0, 0);
-			setDoor(52, 23, 1, 0, 0);
+			setDoor(36, kCharacterRebecca, 1, 0, 0);
+			setDoor(52, kCharacterRebecca, 1, 0, 0);
+
 			if (msg->action == 8) {
 				getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 4;
 				RebeccaCall(&LogicManager::CONS_Rebecca_DoDialog, "LIB012", 0, 0, 0);
@@ -832,26 +987,33 @@ void LogicManager::HAND_Rebecca_CompLogic(HAND_PARAMS) {
 				getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 5;
 				RebeccaCall(&LogicManager::CONS_Rebecca_DoDialog, "LIB013", 0, 0, 0);
 			}
-			return;
+
+			break;
 		}
-		setDoor(36, 23, 1, 0, 0);
-		setDoor(52, 23, 1, 0, 0);
+
+		setDoor(36, kCharacterRebecca, 1, 0, 0);
+		setDoor(52, kCharacterRebecca, 1, 0, 0);
+
 		if (msg->param.intParam == 52) {
 			getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 8;
 			RebeccaCall(&LogicManager::CONS_Rebecca_DoDialog, getCathWCDialog(), 0, 0, 0);
-			return;
+			break;
 		}
+
 		if (!cathHasItem(kItemPassengerList)) {
 			getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 11;
 			RebeccaCall(&LogicManager::CONS_Rebecca_DoDialog, getCathSorryDialog(), 0, 0, 0);
-			return;
+			break;
 		}
+
 		if (rnd(2)) {
 			getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 9;
 			RebeccaCall(&LogicManager::CONS_Rebecca_DoDialog, getCathSorryDialog(), 0, 0, 0);
-			return;
+			break;
 		}
+
 		getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 10;
+
 		if (getCharacterCurrentParams(kCharacterRebecca)[3]) {
 			RebeccaCall(&LogicManager::CONS_Rebecca_DoDialog, "CAT1509", 0, 0, 0);
 		} else {
@@ -861,87 +1023,112 @@ void LogicManager::HAND_Rebecca_CompLogic(HAND_PARAMS) {
 				RebeccaCall(&LogicManager::CONS_Rebecca_DoDialog, "CAT1508", 0, 0, 0);
 			}
 		}
-		
-		return;
-	}
-	if (msg->action > 17) {
-		if (msg->action == 18) {
-			switch (getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8]) {
-			case 1:
-				setDoor(36, 23, 1, 10, 9);
-				setDoor(52, 23, 1, 10, 9);
-				getCharacterParams(kCharacterRebecca, 8)[1] = 0;
-				goto LABEL_67;
-			case 2:
-				setDoor(36, 23, 1, 10, 9);
-				setDoor(52, 23, 1, 10, 9);
-				goto LABEL_67;
-			case 3:
-				setDoor(36, 23, 1, 10, 9);
-				setDoor(52, 23, 1, 10, 9);
-				getCharacterParams(kCharacterRebecca, 8)[1] = 0;
-				return;
-			case 4:
-			case 5:
-				if (rnd(2)) {
-					getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 6;
-					RebeccaCall(&LogicManager::CONS_Rebecca_DoDialog, "REB1039", 0, 0, 0);
-					return;
+
+		break;
+	case 12:
+		setDoor(36, kCharacterRebecca, 1, 10, 9);
+		setDoor(52, kCharacterRebecca, 1, 10, 9);
+		break;
+	case 17:
+		if (getCharacterCurrentParams(kCharacterRebecca)[2] || getCharacterCurrentParams(kCharacterRebecca)[1]) {
+			setDoor(36, kCharacterRebecca, 1, 10, 9);
+			setDoor(52, kCharacterRebecca, 1, 10, 9);
+			getCharacterCurrentParams(kCharacterRebecca)[2] = 0;
+			getCharacterCurrentParams(kCharacterRebecca)[1] = 0;
+		}
+
+		break;
+	case 18:
+		switch (getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8]) {
+		case 1:
+			setDoor(36, kCharacterRebecca, 1, 10, 9);
+			setDoor(52, kCharacterRebecca, 1, 10, 9);
+			getCharacterParams(kCharacterRebecca, 8)[1] = 0;
+			if (getCharacterParams(kCharacterRebecca, 8)[1]) {
+				if (nearChar(kCharacterRebecca, kCharacterCath, 1000)) {
+					setDoor(36, kCharacterRebecca, 1, 0, 0);
+					setDoor(52, kCharacterRebecca, 1, 0, 0);
+					getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 3;
+					RebeccaCall(&LogicManager::CONS_Rebecca_DoDialog, "REB1040", 0, 0, 0);
 				}
-				getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 7;
+			}
 
-				if (rnd(2) == 0) {
-					RebeccaCall(&LogicManager::CONS_Rebecca_DoDialog, "SOP1039A", 0, 0, 0);
-				} else {
-					RebeccaCall(&LogicManager::CONS_Rebecca_DoDialog, "SOP1039", 0, 0, 0);
+			break;
+		case 2:
+			setDoor(36, kCharacterRebecca, 1, 10, 9);
+			setDoor(52, kCharacterRebecca, 1, 10, 9);
+			if (getCharacterParams(kCharacterRebecca, 8)[1]) {
+				if (nearChar(kCharacterRebecca, kCharacterCath, 1000)) {
+					setDoor(36, kCharacterRebecca, 1, 0, 0);
+					setDoor(52, kCharacterRebecca, 1, 0, 0);
+					getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 3;
+					RebeccaCall(&LogicManager::CONS_Rebecca_DoDialog, "REB1040", 0, 0, 0);
 				}
+			}
+
+			break;
+		case 3:
+			setDoor(36, kCharacterRebecca, 1, 10, 9);
+			setDoor(52, kCharacterRebecca, 1, 10, 9);
+			getCharacterParams(kCharacterRebecca, 8)[1] = 0;
+			break;
+		case 4:
+		case 5:
+			if (rnd(2)) {
+				getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 6;
+				RebeccaCall(&LogicManager::CONS_Rebecca_DoDialog, "REB1039", 0, 0, 0);
 				break;
-			case 6:
-				getCharacterCurrentParams(kCharacterRebecca)[3] = 0;
-				goto LABEL_78;
-			case 7:
-				getCharacterCurrentParams(kCharacterRebecca)[3] = 1;
-			LABEL_78:
-				setDoor(36, 23, 1, 14, 0);
-				setDoor(52, 23, 1, 14, 0);
-				getCharacterCurrentParams(kCharacterRebecca)[1] = 1;
-				return;
-			case 8:
-			case 9:
-			case 10:
-			case 11:
-				getCharacterCurrentParams(kCharacterRebecca)[1] = 0;
-				getCharacterCurrentParams(kCharacterRebecca)[2] = 1;
-				return;
-			case 12:
-				getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 13;
-				RebeccaCall(&LogicManager::CONS_Rebecca_DoCondDialog, "JAC1012B", 0, 0, 0);
-				return;
-			case 13:
-				goto LABEL_60;
-			default:
-				return;
 			}
-			
-			return;
-		}
-		if (msg->action == 254915200) {
-			setDoor(36, 23, 1, 0, 0);
-			setDoor(52, 23, 1, 0, 0);
-			getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 12;
-			RebeccaCall(&LogicManager::CONS_Rebecca_DoDialog, "REB1039A", 0, 0, 0);
-		}
-	} else if (msg->action == 17) {
-		if (getCharacterCurrentParams(kCharacterRebecca)[2] || getCharacterCurrentParams(kCharacterRebecca)[1]) {
-			setDoor(36, 23, 1, 10, 9);
-			setDoor(52, 23, 1, 10, 9);
-			getCharacterCurrentParams(kCharacterRebecca)[2] = 0;
+
+			getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 7;
+
+			if (rnd(2) == 0) {
+				RebeccaCall(&LogicManager::CONS_Rebecca_DoDialog, "SOP1039A", 0, 0, 0);
+			} else {
+				RebeccaCall(&LogicManager::CONS_Rebecca_DoDialog, "SOP1039", 0, 0, 0);
+			}
+
+			break;
+		case 6:
+			getCharacterCurrentParams(kCharacterRebecca)[3] = 0;
+			setDoor(36, kCharacterRebecca, 1, 14, 0);
+			setDoor(52, kCharacterRebecca, 1, 14, 0);
+			getCharacterCurrentParams(kCharacterRebecca)[1] = 1;
+			break;
+		case 7:
+			getCharacterCurrentParams(kCharacterRebecca)[3] = 1;
+			setDoor(36, kCharacterRebecca, 1, 14, 0);
+			setDoor(52, kCharacterRebecca, 1, 14, 0);
+			getCharacterCurrentParams(kCharacterRebecca)[1] = 1;
+			break;
+		case 8:
+		case 9:
+		case 10:
+		case 11:
 			getCharacterCurrentParams(kCharacterRebecca)[1] = 0;
+			getCharacterCurrentParams(kCharacterRebecca)[2] = 1;
+			break;
+		case 12:
+			getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 13;
+			RebeccaCall(&LogicManager::CONS_Rebecca_DoCondDialog, "JAC1012B", 0, 0, 0);
+			break;
+		case 13:
+			setDoor(36, kCharacterRebecca, 1, 10, 9);
+			setDoor(52, kCharacterRebecca, 1, 10, 9);
+			break;
+		default:
+			break;
 		}
-	} else if (msg->action == 12) {
-	LABEL_60:
-		setDoor(36, 23, 1, 10, 9);
-		setDoor(52, 23, 1, 10, 9);
+
+		break;
+	case 254915200:
+		setDoor(36, kCharacterRebecca, 1, 0, 0);
+		setDoor(52, kCharacterRebecca, 1, 0, 0);
+		getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 12;
+		RebeccaCall(&LogicManager::CONS_Rebecca_DoDialog, "REB1039A", 0, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -956,21 +1143,27 @@ void LogicManager::CONS_Rebecca_Birth(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Rebecca_Birth(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			autoMessage(kCharacterRebecca, 224253538, 0);
-			setDoor(36, 0, 0, 10, 9);
-			setDoor(52, 0, 0, 10, 9);
-			setDoor(44, 0, 0, 255, 255);
-			setModel(110, 1);
-			getCharacter(kCharacterRebecca).characterPosition.position = 2830;
-			getCharacter(kCharacterRebecca).characterPosition.location = 1;
-			getCharacter(kCharacterRebecca).characterPosition.car = kCarRestaurant;
-			getCharacterParams(kCharacterRebecca, 8)[1] = 1;
+	switch (msg->action) {
+	case 0:
+		if (_gameTime > 1062000 && !getCharacterCurrentParams(kCharacterRebecca)[0]) {
+			getCharacterCurrentParams(kCharacterRebecca)[0] = 1;
+			CONS_Rebecca_InSalon1A(0, 0, 0, 0);
 		}
-	} else if (_gameTime > 1062000 && !getCharacterCurrentParams(kCharacterRebecca)[0]) {
-		getCharacterCurrentParams(kCharacterRebecca)[0] = 1;
-		CONS_Rebecca_InSalon1A(0, 0, 0, 0);
+
+		break;
+	case 12:
+		autoMessage(kCharacterRebecca, 224253538, 0);
+		setDoor(36, kCharacterCath, 0, 10, 9);
+		setDoor(52, kCharacterCath, 0, 10, 9);
+		setDoor(44, kCharacterCath, 0, 255, 255);
+		setModel(110, 1);
+		getCharacter(kCharacterRebecca).characterPosition.position = 2830;
+		getCharacter(kCharacterRebecca).characterPosition.location = 1;
+		getCharacter(kCharacterRebecca).characterPosition.car = kCarRestaurant;
+		getCharacterParams(kCharacterRebecca, 8)[1] = 1;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -987,59 +1180,85 @@ void LogicManager::CONS_Rebecca_InSalon1A(CONS_PARAMS) {
 void LogicManager::HAND_Rebecca_InSalon1A(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
+	{
 		if (_gameTime > 1084500 && !getCharacterCurrentParams(kCharacterRebecca)[2]) {
 			getCharacterCurrentParams(kCharacterRebecca)[2] = 1;
 			getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 1;
 			RebeccaCall(&LogicManager::CONS_Rebecca_DoDialog, "REB1015", 0, 0, 0);
-			return;
-		}
-		if (getCharacterCurrentParams(kCharacterRebecca)[3] == 0x7FFFFFFF || !_gameTime)
-			goto LABEL_27;
-		if (_gameTime > 1080000)
-			goto LABEL_13;
-		if (!inSalon(kCharacterCath) || !getCharacterCurrentParams(kCharacterRebecca)[3]) {
-			getCharacterCurrentParams(kCharacterRebecca)[3] = _gameTime + 150;
-			if (_gameTime == -150)
-				goto LABEL_14;
-		}
-		if (getCharacterCurrentParams(kCharacterRebecca)[3] >= _gameTime) {
-		LABEL_27:
+			break;
+		}
+
+		bool skip = false;
+
+		if (getCharacterCurrentParams(kCharacterRebecca)[3] == 0x7FFFFFFF || !_gameTime) {
+			skip = true;
+		}
+
+		if (!skip) {
+			if (_gameTime > 1080000) {
+				getCharacterCurrentParams(kCharacterRebecca)[3] = 0x7FFFFFFF;
+				if (inSalon(kCharacterCath))
+					_gameProgress[kProgressFieldB8] = 1;
+
+				getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 4;
+				RebeccaCall(&LogicManager::CONS_Rebecca_DoDialog, "REB1012", 0, 0, 0);
+				break;
+			}
+
+			if (!inSalon(kCharacterCath) || !getCharacterCurrentParams(kCharacterRebecca)[3]) {
+				getCharacterCurrentParams(kCharacterRebecca)[3] = _gameTime + 150;
+				if (_gameTime == -150) {
+					if (inSalon(kCharacterCath))
+						_gameProgress[kProgressFieldB8] = 1;
+
+					getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 4;
+					RebeccaCall(&LogicManager::CONS_Rebecca_DoDialog, "REB1012", 0, 0, 0);
+					break;
+				}
+			}
+		}
+
+		if (skip || getCharacterCurrentParams(kCharacterRebecca)[3] >= _gameTime) {
 			if (getCharacterCurrentParams(kCharacterRebecca)[0]) {
 				if (!getCharacterCurrentParams(kCharacterRebecca)[4] && (getCharacterCurrentParams(kCharacterRebecca)[4] = _gameTime + 900, _gameTime == -900) || getCharacterCurrentParams(kCharacterRebecca)[4] < _gameTime) {
 					if (inSalon(kCharacterCath)) {
 						getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 5;
 						RebeccaCall(&LogicManager::CONS_Rebecca_DoDialog, "REB1013", 0, 0, 0);
-						return;
+						break;
 					}
 				}
 			}
-		LABEL_34:
+
 			if (getCharacterCurrentParams(kCharacterRebecca)[1]) {
 				if (getCharacterCurrentParams(kCharacterRebecca)[5] || (getCharacterCurrentParams(kCharacterRebecca)[5] = _currentGameSessionTicks + 90, _currentGameSessionTicks != -90)) {
 					if (getCharacterCurrentParams(kCharacterRebecca)[5] >= _currentGameSessionTicks)
-						return;
+						break;
+
 					getCharacterCurrentParams(kCharacterRebecca)[5] = 0x7FFFFFFF;
 				}
+
 				bumpCath(kCarRestaurant, 55, 255);
 			} else {
 				getCharacterCurrentParams(kCharacterRebecca)[5] = 0;
 			}
 		} else {
-		LABEL_13:
 			getCharacterCurrentParams(kCharacterRebecca)[3] = 0x7FFFFFFF;
-		LABEL_14:
+
 			if (inSalon(kCharacterCath))
-				_gameProgress[46] = 1;
+				_gameProgress[kProgressFieldB8] = 1;
+
 			getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 4;
 			RebeccaCall(&LogicManager::CONS_Rebecca_DoDialog, "REB1012", 0, 0, 0);
 		}
+
 		break;
+	}
 	case 12:
 		startCycOtis(kCharacterRebecca, "107B");
-		return;
+		break;
 	case 17:
 		getCharacterCurrentParams(kCharacterRebecca)[1] = checkCathDir(kCarRestaurant, 57);
-		return;
+		break;
 	case 18:
 		switch (getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8]) {
 		case 1:
@@ -1055,17 +1274,55 @@ void LogicManager::HAND_Rebecca_InSalon1A(HAND_PARAMS) {
 			break;
 		case 4:
 			getCharacterCurrentParams(kCharacterRebecca)[0] = 1;
-			goto LABEL_27;
+			if (getCharacterCurrentParams(kCharacterRebecca)[0]) {
+				if (!getCharacterCurrentParams(kCharacterRebecca)[4] && (getCharacterCurrentParams(kCharacterRebecca)[4] = _gameTime + 900, _gameTime == -900) || getCharacterCurrentParams(kCharacterRebecca)[4] < _gameTime) {
+					if (inSalon(kCharacterCath)) {
+						getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 5;
+						RebeccaCall(&LogicManager::CONS_Rebecca_DoDialog, "REB1013", 0, 0, 0);
+						break;
+					}
+				}
+			}
+
+			if (getCharacterCurrentParams(kCharacterRebecca)[1]) {
+				if (getCharacterCurrentParams(kCharacterRebecca)[5] || (getCharacterCurrentParams(kCharacterRebecca)[5] = _currentGameSessionTicks + 90, _currentGameSessionTicks != -90)) {
+					if (getCharacterCurrentParams(kCharacterRebecca)[5] >= _currentGameSessionTicks)
+						break;
+
+					getCharacterCurrentParams(kCharacterRebecca)[5] = 0x7FFFFFFF;
+				}
+
+				bumpCath(kCarRestaurant, 55, 255);
+			} else {
+				getCharacterCurrentParams(kCharacterRebecca)[5] = 0;
+			}
+
+			break;
 		case 5:
 			_gameProgress[kProgressFieldB4] = 1;
 			getCharacterCurrentParams(kCharacterRebecca)[0] = 0;
-			goto LABEL_34;
+
+			if (getCharacterCurrentParams(kCharacterRebecca)[1]) {
+				if (getCharacterCurrentParams(kCharacterRebecca)[5] || (getCharacterCurrentParams(kCharacterRebecca)[5] = _currentGameSessionTicks + 90, _currentGameSessionTicks != -90)) {
+					if (getCharacterCurrentParams(kCharacterRebecca)[5] >= _currentGameSessionTicks)
+						break;
+
+					getCharacterCurrentParams(kCharacterRebecca)[5] = 0x7FFFFFFF;
+				}
+
+				bumpCath(kCarRestaurant, 55, 255);
+			} else {
+				getCharacterCurrentParams(kCharacterRebecca)[5] = 0;
+			}
+
+			break;
 		default:
-			return;
+			break;
 		}
-		return;
+
+		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -1080,62 +1337,74 @@ void LogicManager::CONS_Rebecca_InComp1(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Rebecca_InComp1(HAND_PARAMS) {
-	if (msg->action > 12) {
-		if (msg->action == 18) {
-			switch (getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8]) {
-			case 1:
-				getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 2;
-				RebeccaCall(&LogicManager::CONS_Rebecca_DoCorrOtis, "623Ce", 36, 0, 0);
-				break;
-			case 2:
-				setDoor(36, 0, 2, 0, 0);
-				startCycOtis(kCharacterRebecca, "504");
-				break;
-			case 3:
-				endGraphics(kCharacterRebecca);
-				getCharacter(kCharacterRebecca).characterPosition.position = 4840;
-				getCharacter(kCharacterRebecca).characterPosition.location = 1;
-				getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 4;
-				RebeccaCall(&LogicManager::CONS_Rebecca_CompLogic, 1120500, 0, 0, 0);
-				break;
-			case 4:
-			case 5:
-				if (getCharacterParams(kCharacterRebecca, 8)[0])
-					goto LABEL_21;
-				getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 5;
-				RebeccaCall(&LogicManager::CONS_Rebecca_CompLogic, _gameTime + 900, 0, 0, 0);
-				break;
-			case 6:
-				endGraphics(kCharacterRebecca);
-				getCharacter(kCharacterRebecca).characterPosition.position = 4840;
-				getCharacter(kCharacterRebecca).characterPosition.location = 1;
-				getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 7;
-				RebeccaCall(&LogicManager::CONS_Rebecca_CompLogic, 1120500, 0, 0, 0);
-				break;
-			case 7:
-			case 8:
-				if (getCharacterParams(kCharacterRebecca, 8)[0]) {
-				LABEL_21:
-					CONS_Rebecca_GoDinner(0, 0, 0, 0);
-				} else {
-					getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 8;
-					RebeccaCall(&LogicManager::CONS_Rebecca_CompLogic, _gameTime + 900, 0, 0, 0);
-				}
-				break;
-			default:
-				return;
-			}
-		} else if (msg->action == 285528346) {
-			getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 6;
+	switch (msg->action) {
+	case 0:
+		if (_gameTime > 1111500 && !getCharacterCurrentParams(kCharacterRebecca)[1]) {
+			getCharacterCurrentParams(kCharacterRebecca)[1] = 1;
+			getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 3;
 			RebeccaCall(&LogicManager::CONS_Rebecca_DoCorrOtis, "623De", 36, 0, 0);
 		}
-	} else if (msg->action == 12) {
+
+		break;
+	case 12:
 		getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 1;
 		RebeccaCall(&LogicManager::CONS_Rebecca_DoWait, 900, 0, 0, 0);
-	} else if (msg->action == 0 && _gameTime > 1111500 && !getCharacterCurrentParams(kCharacterRebecca)[1]) {
-		getCharacterCurrentParams(kCharacterRebecca)[1] = 1;
-		getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 3;
+		break;
+	case 18:
+		switch (getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8]) {
+		case 1:
+			getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 2;
+			RebeccaCall(&LogicManager::CONS_Rebecca_DoCorrOtis, "623Ce", 36, 0, 0);
+			break;
+		case 2:
+			setDoor(36, kCharacterCath, 2, 0, 0);
+			startCycOtis(kCharacterRebecca, "504");
+			break;
+		case 3:
+			endGraphics(kCharacterRebecca);
+			getCharacter(kCharacterRebecca).characterPosition.position = 4840;
+			getCharacter(kCharacterRebecca).characterPosition.location = 1;
+			getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 4;
+			RebeccaCall(&LogicManager::CONS_Rebecca_CompLogic, 1120500, 0, 0, 0);
+			break;
+		case 4:
+		case 5:
+			if (getCharacterParams(kCharacterRebecca, 8)[0]) {
+				CONS_Rebecca_GoDinner(0, 0, 0, 0);
+			} else {
+				getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 5;
+				RebeccaCall(&LogicManager::CONS_Rebecca_CompLogic, _gameTime + 900, 0, 0, 0);
+			}
+
+			break;
+		case 6:
+			endGraphics(kCharacterRebecca);
+			getCharacter(kCharacterRebecca).characterPosition.position = 4840;
+			getCharacter(kCharacterRebecca).characterPosition.location = 1;
+			getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 7;
+			RebeccaCall(&LogicManager::CONS_Rebecca_CompLogic, 1120500, 0, 0, 0);
+			break;
+		case 7:
+		case 8:
+			if (getCharacterParams(kCharacterRebecca, 8)[0]) {
+				CONS_Rebecca_GoDinner(0, 0, 0, 0);
+			} else {
+				getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 8;
+				RebeccaCall(&LogicManager::CONS_Rebecca_CompLogic, _gameTime + 900, 0, 0, 0);
+			}
+
+			break;
+		default:
+			break;
+		}
+
+		break;
+	case 285528346:
+		getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 6;
 		RebeccaCall(&LogicManager::CONS_Rebecca_DoCorrOtis, "623De", 36, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1150,81 +1419,106 @@ void LogicManager::CONS_Rebecca_GoDinner(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Rebecca_GoDinner(HAND_PARAMS) {
-	if (msg->action > 12) {
-		if (msg->action == 18) {
-			switch (getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8]) {
-			case 1:
-				startCycOtis(kCharacterRebecca, "012D");
-				getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 2;
-				RebeccaCall(&LogicManager::CONS_Rebecca_DoDialog, "REB1199", 0, 0, 0);
-				break;
-			case 2:
-				if (!inDiningRoom(kCharacterCath))
-					goto LABEL_30;
-				getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 3;
-				RebeccaCall(&LogicManager::CONS_Rebecca_DoDialog, "REB1199A", 0, 0, 0);
-				break;
-			case 3:
-				_gameProgress[kProgressFieldBC] = 1;
-			LABEL_30:
-				if (!inDiningRoom(kCharacterAnna))
-					goto LABEL_34;
-				getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 4;
-				RebeccaCall(&LogicManager::CONS_Rebecca_DoDialog, "REB1199B", 0, 0, 0);
-				break;
-			case 4:
-			LABEL_34:
-				getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 5;
-				RebeccaCall(&LogicManager::CONS_Rebecca_DoDialog, "REB1199C", 0, 0, 0);
-				break;
-			case 6:
-				CONS_Rebecca_AfterDinner(0, 0, 0, 0);
-				break;
-			case 8:
-				send(kCharacterRebecca, kCharacterWaiter1, 136702400, 0);
-				startCycOtis(kCharacterRebecca, "012G");
-				getCharacterCurrentParams(kCharacterRebecca)[0] = 1;
-				break;
-			default:
-				return;
-			}
-		} else if (msg->action == 123712592) {
-			startCycOtis(kCharacterWaiter1, "BLANK");
-			startCycOtis(kCharacterRebecca, "012E");
-			getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 8;
-			RebeccaCall(&LogicManager::CONS_Rebecca_DoDialog, "REB1200", 0, 0, 0);
-		}
-	} else if (msg->action == 12) {
-		getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 1;
-		RebeccaCall(&LogicManager::CONS_Rebecca_GotoDinner, 1, 0, 0, 0);
-	} else if (msg->action == 0) {
+	switch (msg->action) {
+	case 0:
 		if (_gameTime > 1134000 && !getCharacterCurrentParams(kCharacterRebecca)[1]) {
 			getCharacterCurrentParams(kCharacterRebecca)[1] = 1;
 			send(kCharacterRebecca, kCharacterWaiter1, 223712416, 0);
 		}
+
 		if (getCharacterCurrentParams(kCharacterRebecca)[0]) {
 			if (_gameTime > 1165500 && !getCharacterCurrentParams(kCharacterRebecca)[2]) {
 				getCharacterCurrentParams(kCharacterRebecca)[2] = 1;
 				getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 6;
 				RebeccaCall(&LogicManager::CONS_Rebecca_ReturnFromDinner, 0, 0, 0, 0);
-				return;
+				break;
 			}
+
 			if (getCharacterCurrentParams(kCharacterRebecca)[3] != 0x7FFFFFFF && _gameTime) {
 				if (_gameTime <= 1161000) {
 					if (!inDiningRoom(kCharacterCath) || !getCharacterCurrentParams(kCharacterRebecca)[3]) {
 						getCharacterCurrentParams(kCharacterRebecca)[3] = _gameTime + 150;
-						if (_gameTime == -150)
-							goto LABEL_23;
+						if (_gameTime == -150) {
+							getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 7;
+							RebeccaCall(&LogicManager::CONS_Rebecca_DoDialog, "REB1200A", 0, 0, 0);
+							break;
+						}
 					}
+
 					if (getCharacterCurrentParams(kCharacterRebecca)[3] >= _gameTime)
-						return;
+						break;
 				}
+
 				getCharacterCurrentParams(kCharacterRebecca)[3] = 0x7FFFFFFF;
-			LABEL_23:
 				getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 7;
 				RebeccaCall(&LogicManager::CONS_Rebecca_DoDialog, "REB1200A", 0, 0, 0);
 			}
 		}
+
+		break;
+	case 12:
+		getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 1;
+		RebeccaCall(&LogicManager::CONS_Rebecca_GotoDinner, 1, 0, 0, 0);
+		break;
+	case 18:
+		switch (getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8]) {
+		case 1:
+			startCycOtis(kCharacterRebecca, "012D");
+			getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 2;
+			RebeccaCall(&LogicManager::CONS_Rebecca_DoDialog, "REB1199", 0, 0, 0);
+			break;
+		case 2:
+			if (!inDiningRoom(kCharacterCath)) {
+				if (!inDiningRoom(kCharacterAnna)) {
+					getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 5;
+					RebeccaCall(&LogicManager::CONS_Rebecca_DoDialog, "REB1199C", 0, 0, 0);
+				} else {
+					getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 4;
+					RebeccaCall(&LogicManager::CONS_Rebecca_DoDialog, "REB1199B", 0, 0, 0);
+				}
+			} else {
+				getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 3;
+				RebeccaCall(&LogicManager::CONS_Rebecca_DoDialog, "REB1199A", 0, 0, 0);
+			}
+
+			break;
+		case 3:
+			_gameProgress[kProgressFieldBC] = 1;
+
+			if (!inDiningRoom(kCharacterAnna)) {
+				getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 5;
+				RebeccaCall(&LogicManager::CONS_Rebecca_DoDialog, "REB1199C", 0, 0, 0);
+			} else {
+				getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 4;
+				RebeccaCall(&LogicManager::CONS_Rebecca_DoDialog, "REB1199B", 0, 0, 0);
+			}
+
+			break;
+		case 4:
+			getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 5;
+			RebeccaCall(&LogicManager::CONS_Rebecca_DoDialog, "REB1199C", 0, 0, 0);
+			break;
+		case 6:
+			CONS_Rebecca_AfterDinner(0, 0, 0, 0);
+			break;
+		case 8:
+			send(kCharacterRebecca, kCharacterWaiter1, 136702400, 0);
+			startCycOtis(kCharacterRebecca, "012G");
+			getCharacterCurrentParams(kCharacterRebecca)[0] = 1;
+			break;
+		default:
+			break;
+		}
+
+		break;
+	case 123712592:
+		startCycOtis(kCharacterWaiter1, "BLANK");
+		startCycOtis(kCharacterRebecca, "012E");
+		getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 8;
+		RebeccaCall(&LogicManager::CONS_Rebecca_DoDialog, "REB1200", 0, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1239,16 +1533,22 @@ void LogicManager::CONS_Rebecca_AfterDinner(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Rebecca_AfterDinner(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 1;
 		RebeccaCall(&LogicManager::CONS_Rebecca_CompLogic, 1184400, 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		if (getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] == 1) {
 			getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 2;
 			RebeccaCall(&LogicManager::CONS_Rebecca_GotoSalon, 1, 0, 0, 0);
 		} else if (getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] == 2) {
 			CONS_Rebecca_InSalon1B(0, 0, 0, 0);
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1263,46 +1563,49 @@ void LogicManager::CONS_Rebecca_InSalon1B(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Rebecca_InSalon1B(HAND_PARAMS) {
-	if (msg->action <= 18) {
-		switch (msg->action) {
-		case 0:
-			if (_gameTime > 1224000 && !getCharacterCurrentParams(kCharacterRebecca)[1]) {
-				getCharacterCurrentParams(kCharacterRebecca)[1] = 1;
-				getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 1;
-				RebeccaCall(&LogicManager::CONS_Rebecca_DoBlockSeqOtis, "118H", 5, 52, 0);
-				return;
-			}
-			if (getCharacterCurrentParams(kCharacterRebecca)[0]) {
-				if (getCharacterCurrentParams(kCharacterRebecca)[2] || (getCharacterCurrentParams(kCharacterRebecca)[2] = _currentGameSessionTicks + 90, _currentGameSessionTicks != -90)) {
-					if (getCharacterCurrentParams(kCharacterRebecca)[2] >= _currentGameSessionTicks)
-						return;
+	switch (msg->action) {
+	case 0:
+		if (_gameTime > 1224000 && !getCharacterCurrentParams(kCharacterRebecca)[1]) {
+			getCharacterCurrentParams(kCharacterRebecca)[1] = 1;
+			getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 1;
+			RebeccaCall(&LogicManager::CONS_Rebecca_DoBlockSeqOtis, "118H", 5, 52, 0);
+			break;
+		}
 
-					getCharacterCurrentParams(kCharacterRebecca)[2] = 0x7FFFFFFF;
-				}
+		if (getCharacterCurrentParams(kCharacterRebecca)[0]) {
+			if (getCharacterCurrentParams(kCharacterRebecca)[2] || (getCharacterCurrentParams(kCharacterRebecca)[2] = _currentGameSessionTicks + 90, _currentGameSessionTicks != -90)) {
+				if (getCharacterCurrentParams(kCharacterRebecca)[2] >= _currentGameSessionTicks)
+					break;
 
-				bumpCath(kCarRestaurant, 51, 255);
-			}
-			break;
-		case 12:
-			startCycOtis(kCharacterRebecca, "118D");
-			break;
-		case 17:
-			getCharacterCurrentParams(kCharacterRebecca)[0] = 1;
-			if (!checkCathDir(kCarRestaurant, 52))
-				getCharacterCurrentParams(kCharacterRebecca)[0] = 0;
-			getCharacterCurrentParams(kCharacterRebecca)[2] = 0;
-			break;
-		case 18:
-			if (getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] == 1) {
-				getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 2;
-				RebeccaCall(&LogicManager::CONS_Rebecca_ReturnFromSalon, 0, 0, 0, 0);
-			} else if (getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] == 2) {
-				CONS_Rebecca_Asleep(0, 0, 0, 0);
+				getCharacterCurrentParams(kCharacterRebecca)[2] = 0x7FFFFFFF;
 			}
-			break;
-		default:
-			return;
+
+			bumpCath(kCarRestaurant, 51, 255);
+		}
+
+		break;
+	case 12:
+		startCycOtis(kCharacterRebecca, "118D");
+		break;
+	case 17:
+		getCharacterCurrentParams(kCharacterRebecca)[0] = 1;
+
+		if (!checkCathDir(kCarRestaurant, 52))
+			getCharacterCurrentParams(kCharacterRebecca)[0] = 0;
+
+		getCharacterCurrentParams(kCharacterRebecca)[2] = 0;
+		break;
+	case 18:
+		if (getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] == 1) {
+			getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 2;
+			RebeccaCall(&LogicManager::CONS_Rebecca_ReturnFromSalon, 0, 0, 0, 0);
+		} else if (getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] == 2) {
+			CONS_Rebecca_Asleep(0, 0, 0, 0);
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1317,13 +1620,17 @@ void LogicManager::CONS_Rebecca_Asleep(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Rebecca_Asleep(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterRebecca).characterPosition.car = kCarRedSleeping;
 		getCharacter(kCharacterRebecca).characterPosition.position = 4840;
 		getCharacter(kCharacterRebecca).characterPosition.location = 1;
-		setDoor(36, 0, 1, 10, 9);
-		setDoor(52, 0, 1, 10, 9);
+		setDoor(36, kCharacterCath, 1, 10, 9);
+		setDoor(52, kCharacterCath, 1, 10, 9);
 		endGraphics(kCharacterRebecca);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1338,21 +1645,24 @@ void LogicManager::CONS_Rebecca_StartPart2(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Rebecca_StartPart2(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			endGraphics(kCharacterRebecca);
-			getCharacter(kCharacterRebecca).characterPosition.car = kCarRedSleeping;
-			getCharacter(kCharacterRebecca).characterPosition.position = 4840;
-			getCharacter(kCharacterRebecca).characterPosition.location = 1;
-			getCharacter(kCharacterRebecca).clothes = 0;
-			getCharacter(kCharacterRebecca).inventoryItem = 0;
-			setDoor(36, 0, 1, 10, 9);
-			setDoor(52, 0, 1, 10, 9);
-			setModel(110, 2);
-			getCharacterParams(kCharacterRebecca, 8)[1] = 1;
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		CONS_Rebecca_InComp2(0, 0, 0, 0);
+		break;
+	case 12:
+		endGraphics(kCharacterRebecca);
+		getCharacter(kCharacterRebecca).characterPosition.car = kCarRedSleeping;
+		getCharacter(kCharacterRebecca).characterPosition.position = 4840;
+		getCharacter(kCharacterRebecca).characterPosition.location = 1;
+		getCharacter(kCharacterRebecca).clothes = 0;
+		getCharacter(kCharacterRebecca).inventoryItem = 0;
+		setDoor(36, kCharacterCath, 1, 10, 9);
+		setDoor(52, kCharacterCath, 1, 10, 9);
+		setModel(110, 2);
+		getCharacterParams(kCharacterRebecca, 8)[1] = 1;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1367,16 +1677,22 @@ void LogicManager::CONS_Rebecca_InComp2(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Rebecca_InComp2(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 1;
 		RebeccaCall(&LogicManager::CONS_Rebecca_CompLogic, 1764000, 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		if (getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] == 1) {
 			getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 2;
 			RebeccaCall(&LogicManager::CONS_Rebecca_GotoSalon, 0, 0, 0, 0);
 		} else if (getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] == 2) {
 			CONS_Rebecca_InSalon2(0, 0, 0, 0);
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1391,61 +1707,83 @@ void LogicManager::CONS_Rebecca_InSalon2(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Rebecca_InSalon2(HAND_PARAMS) {
-	if (msg->action > 12) {
-		if (msg->action > 125496184) {
-			if (msg->action == 155465152) {
-				startCycOtis(kCharacterRebecca, "BLANK");
-			} else if (msg->action == 155980128) {
-				getCharacterCurrentParams(kCharacterRebecca)[2] = 1;
-				getCharacterCurrentParams(kCharacterRebecca)[0] = 1;
+	switch (msg->action) {
+	case 0:
+		if (!getCharacterCurrentParams(kCharacterRebecca)[0] && getCharacterCurrentParams(kCharacterRebecca)[3] != 0x7FFFFFFF && _gameTime) {
+			bool skip = false;
+
+			if (_gameTime > 15803100) {
+				getCharacterCurrentParams(kCharacterRebecca)[3] = 0x7FFFFFFF;
+				playDialog(kCharacterRebecca, "Reb2001", -1, 0);
+				_gameProgress[kProgressFieldB0] = 1;
+				getCharacterCurrentParams(kCharacterRebecca)[1] = 1;
+				skip = true;
+			}
+
+			if (!skip) {
+				if (!inSalon(kCharacterCath) || !getCharacterCurrentParams(kCharacterRebecca)[3]) {
+					getCharacterCurrentParams(kCharacterRebecca)[3] = _gameTime + 450;
+					if (_gameTime == -450) {
+						skip = true;
+						playDialog(kCharacterRebecca, "Reb2001", -1, 0);
+						_gameProgress[kProgressFieldB0] = 1;
+						getCharacterCurrentParams(kCharacterRebecca)[1] = 1;
+					}
+				}
+
+				if (!skip && getCharacterCurrentParams(kCharacterRebecca)[3] < _gameTime) {
+					getCharacterCurrentParams(kCharacterRebecca)[3] = 0x7FFFFFFF;
+					playDialog(kCharacterRebecca, "Reb2001", -1, 0);
+					_gameProgress[kProgressFieldB0] = 1;
+					getCharacterCurrentParams(kCharacterRebecca)[1] = 1;
+				}
 			}
-		} else if (msg->action == 125496184) {
-			getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 1;
-			RebeccaCall(&LogicManager::CONS_Rebecca_ReturnFromSalon, 0, 0, 0, 0);
-		} else if (msg->action == 18 && getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] == 1) {
-			CONS_Rebecca_OpenComp2(0, 0, 0, 0);
-		}
-		return;
-	}
-	if (msg->action == 12) {
-		startCycOtis(kCharacterRebecca, "107B");
-		return;
-	}
-	if (msg->action) {
-		if (msg->action == 2)
-			getCharacterCurrentParams(kCharacterRebecca)[1] = 0;
-		return;
-	}
-	if (!getCharacterCurrentParams(kCharacterRebecca)[0] && getCharacterCurrentParams(kCharacterRebecca)[3] != 0x7FFFFFFF && _gameTime) {
-		if (_gameTime > 15803100)
-			goto LABEL_21;
-		if (!inSalon(kCharacterCath) || !getCharacterCurrentParams(kCharacterRebecca)[3]) {
-			getCharacterCurrentParams(kCharacterRebecca)[3] = _gameTime + 450;
-			if (_gameTime == -450)
-				goto LABEL_22;
-		}
-		if (getCharacterCurrentParams(kCharacterRebecca)[3] < _gameTime) {
-		LABEL_21:
-			getCharacterCurrentParams(kCharacterRebecca)[3] = 0x7FFFFFFF;
-		LABEL_22:
-			playDialog(kCharacterRebecca, "Reb2001", -1, 0);
-			_gameProgress[kProgressFieldB0] = 1;
-			getCharacterCurrentParams(kCharacterRebecca)[1] = 1;
 		}
-	}
-	if (getCharacterCurrentParams(kCharacterRebecca)[2] && !getCharacterCurrentParams(kCharacterRebecca)[1] && getCharacterCurrentParams(kCharacterRebecca)[4] != 0x7FFFFFFF && _gameTime) {
-		if (_gameTime <= 10881000) {
-			if (!inSalon(kCharacterCath) || !getCharacterCurrentParams(kCharacterRebecca)[4]) {
-				getCharacterCurrentParams(kCharacterRebecca)[4] = _gameTime + 450;
-				if (_gameTime == -450)
-					goto LABEL_33;
+
+		if (getCharacterCurrentParams(kCharacterRebecca)[2] && !getCharacterCurrentParams(kCharacterRebecca)[1] && getCharacterCurrentParams(kCharacterRebecca)[4] != 0x7FFFFFFF && _gameTime) {
+			if (_gameTime <= 10881000) {
+				if (!inSalon(kCharacterCath) || !getCharacterCurrentParams(kCharacterRebecca)[4]) {
+					getCharacterCurrentParams(kCharacterRebecca)[4] = _gameTime + 450;
+					if (_gameTime == -450) {
+						send(kCharacterRebecca, kCharacterAugust, 169358379, 0);
+						break;
+					}
+				}
+
+				if (getCharacterCurrentParams(kCharacterRebecca)[4] >= _gameTime)
+					break;
 			}
-			if (getCharacterCurrentParams(kCharacterRebecca)[4] >= _gameTime)
-				return;
+
+			getCharacterCurrentParams(kCharacterRebecca)[4] = 0x7FFFFFFF;
+			send(kCharacterRebecca, kCharacterAugust, 169358379, 0);
+		}
+
+		break;
+	case 2:
+		getCharacterCurrentParams(kCharacterRebecca)[1] = 0;
+		break;
+	case 12:
+		startCycOtis(kCharacterRebecca, "107B");
+		break;
+	case 18:
+		if (getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] == 1) {
+			CONS_Rebecca_OpenComp2(0, 0, 0, 0);
 		}
-		getCharacterCurrentParams(kCharacterRebecca)[4] = 0x7FFFFFFF;
-	LABEL_33:
-		send(kCharacterRebecca, kCharacterAugust, 169358379, 0);
+
+		break;
+	case 125496184:
+		getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 1;
+		RebeccaCall(&LogicManager::CONS_Rebecca_ReturnFromSalon, 0, 0, 0, 0);
+		break;
+	case 155465152:
+		startCycOtis(kCharacterRebecca, "BLANK");
+		break;
+	case 155980128:
+		getCharacterCurrentParams(kCharacterRebecca)[2] = 1;
+		getCharacterCurrentParams(kCharacterRebecca)[0] = 1;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1460,17 +1798,23 @@ void LogicManager::CONS_Rebecca_OpenComp2(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Rebecca_OpenComp2(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 1;
 		RebeccaCall(&LogicManager::CONS_Rebecca_DoWait, 900, 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		if (getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] == 1) {
 			getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 2;
 			RebeccaCall(&LogicManager::CONS_Rebecca_DoCorrOtis, "623CE", 36, 0, 0);
 		} else if (getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] == 2) {
-			setDoor(36, 0, 2, 0, 0);
+			setDoor(36, kCharacterCath, 2, 0, 0);
 			startCycOtis(kCharacterRebecca, "504");
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1485,17 +1829,20 @@ void LogicManager::CONS_Rebecca_StartPart3(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Rebecca_StartPart3(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			endGraphics(kCharacterRebecca);
-			getCharacter(kCharacterRebecca).characterPosition.car = kCarRedSleeping;
-			getCharacter(kCharacterRebecca).characterPosition.position = 4840;
-			getCharacter(kCharacterRebecca).characterPosition.location = 1;
-			getCharacter(kCharacterRebecca).clothes = 0;
-			getCharacter(kCharacterRebecca).inventoryItem = 0;
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		CONS_Rebecca_InComp3a(0, 0, 0, 0);
+		break;
+	case 12:
+		endGraphics(kCharacterRebecca);
+		getCharacter(kCharacterRebecca).characterPosition.car = kCarRedSleeping;
+		getCharacter(kCharacterRebecca).characterPosition.position = 4840;
+		getCharacter(kCharacterRebecca).characterPosition.location = 1;
+		getCharacter(kCharacterRebecca).clothes = 0;
+		getCharacter(kCharacterRebecca).inventoryItem = 0;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1510,11 +1857,19 @@ void LogicManager::CONS_Rebecca_InComp3a(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Rebecca_InComp3a(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 1;
 		RebeccaCall(&LogicManager::CONS_Rebecca_CompLogic, 2016000, 0, 0, 0);
-	} else if (msg->action == 18 && getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] == 1) {
-		CONS_Rebecca_GoLunch(0, 0, 0, 0);
+		break;
+	case 18:
+		if (getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] == 1) {
+			CONS_Rebecca_GoLunch(0, 0, 0, 0);
+		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1529,44 +1884,65 @@ void LogicManager::CONS_Rebecca_GoLunch(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Rebecca_GoLunch(HAND_PARAMS) {
-	if (msg->action <= 12) {
-		if (msg->action == 12) {
-			getCharacter(kCharacterRebecca).characterPosition.location = 0;
-			getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 1;
-			RebeccaCall(&LogicManager::CONS_Rebecca_GotoDinner, 1, 0, 0, 0);
-			return;
-		}
-		if (msg->action) {
-			if (msg->action == 2) {
-				getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 5;
-				RebeccaCall(&LogicManager::CONS_Rebecca_DoDialog, "Reb3004", 0, 0, 0);
+	switch (msg->action) {
+	case 0:
+		if (getCharacterCurrentParams(kCharacterRebecca)[1] == 0x7FFFFFFF || !_gameTime) {
+			if (getCharacterCurrentParams(kCharacterRebecca)[0] && _gameTime > 2052000 && !getCharacterCurrentParams(kCharacterRebecca)[2]) {
+				getCharacterCurrentParams(kCharacterRebecca)[2] = 1;
+				getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 3;
+				RebeccaCall(&LogicManager::CONS_Rebecca_ReturnFromDinner, 0, 0, 0, 0);
 			}
-			return;
+
+			break;
 		}
-		if (getCharacterCurrentParams(kCharacterRebecca)[1] == 0x7FFFFFFF || !_gameTime)
-			goto LABEL_18;
+
 		if (_gameTime <= 1386000) {
 			if (!inDiningRoom(kCharacterCath) || !getCharacterCurrentParams(kCharacterRebecca)[1]) {
 				getCharacterCurrentParams(kCharacterRebecca)[1] = _gameTime;
-				if (!_gameTime)
-					goto LABEL_17;
+				if (!_gameTime) {
+					send(kCharacterRebecca, kCharacterWaiter1, 223712416, 0);
+
+					if (getCharacterCurrentParams(kCharacterRebecca)[0] && _gameTime > 2052000 && !getCharacterCurrentParams(kCharacterRebecca)[2]) {
+						getCharacterCurrentParams(kCharacterRebecca)[2] = 1;
+						getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 3;
+						RebeccaCall(&LogicManager::CONS_Rebecca_ReturnFromDinner, 0, 0, 0, 0);
+					}
+
+					break;
+				}
 			}
+
 			if (getCharacterCurrentParams(kCharacterRebecca)[1] >= _gameTime) {
-			LABEL_18:
 				if (getCharacterCurrentParams(kCharacterRebecca)[0] && _gameTime > 2052000 && !getCharacterCurrentParams(kCharacterRebecca)[2]) {
 					getCharacterCurrentParams(kCharacterRebecca)[2] = 1;
 					getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 3;
 					RebeccaCall(&LogicManager::CONS_Rebecca_ReturnFromDinner, 0, 0, 0, 0);
 				}
-				return;
+
+				break;
 			}
 		}
+
 		getCharacterCurrentParams(kCharacterRebecca)[1] = 0x7FFFFFFF;
-	LABEL_17:
 		send(kCharacterRebecca, kCharacterWaiter1, 223712416, 0);
-		goto LABEL_18;
-	}
-	if (msg->action == 18) {
+
+		if (getCharacterCurrentParams(kCharacterRebecca)[0] && _gameTime > 2052000 && !getCharacterCurrentParams(kCharacterRebecca)[2]) {
+			getCharacterCurrentParams(kCharacterRebecca)[2] = 1;
+			getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 3;
+			RebeccaCall(&LogicManager::CONS_Rebecca_ReturnFromDinner, 0, 0, 0, 0);
+		}
+
+		break;
+	case 2:
+		getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 5;
+		RebeccaCall(&LogicManager::CONS_Rebecca_DoDialog, "Reb3004", 0, 0, 0);
+		break;
+	case 12:
+		getCharacter(kCharacterRebecca).characterPosition.location = 0;
+		getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 1;
+		RebeccaCall(&LogicManager::CONS_Rebecca_GotoDinner, 1, 0, 0, 0);
+		break;
+	case 18:
 		switch (getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8]) {
 		case 1:
 			startCycOtis(kCharacterRebecca, "012D");
@@ -1582,12 +1958,19 @@ void LogicManager::HAND_Rebecca_GoLunch(HAND_PARAMS) {
 			startCycOtis(kCharacterRebecca, "012G");
 			getCharacterCurrentParams(kCharacterRebecca)[0] = 1;
 			break;
+		default:
+			break;
 		}
-	} else if (msg->action == 123712592) {
+
+		break;
+	case 123712592:
 		startCycOtis(kCharacterWaiter1, "BLANK");
 		playDialog(kCharacterRebecca, "Reb3003", -1, 0);
 		getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 4;
 		RebeccaCall(&LogicManager::CONS_Rebecca_DoSeqOtis, "012E", 0, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1602,11 +1985,19 @@ void LogicManager::CONS_Rebecca_InComp3b(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Rebecca_InComp3b(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 1;
 		RebeccaCall(&LogicManager::CONS_Rebecca_CompLogic, 2070000, 0, 0, 0);
-	} else if (msg->action == 18 && getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] == 1) {
-		CONS_Rebecca_GoSalon(0, 0, 0, 0);
+		break;
+	case 18:
+		if (getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] == 1) {
+			CONS_Rebecca_GoSalon(0, 0, 0, 0);
+		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1625,40 +2016,84 @@ void LogicManager::HAND_Rebecca_GoSalon(HAND_PARAMS) {
 	case 0:
 		if (!getCharacterCurrentParams(kCharacterRebecca)[1])
 			getCharacterCurrentParams(kCharacterRebecca)[1] = _gameTime + 1800;
-		if (getCharacterCurrentParams(kCharacterRebecca)[3] == 0x7FFFFFFF || getCharacterCurrentParams(kCharacterRebecca)[1] >= _gameTime)
-			goto LABEL_19;
-		if (_gameTime > 2083500)
-			goto LABEL_12;
-		if (!inSalon(kCharacterCath) || !getCharacterCurrentParams(kCharacterRebecca)[3]) {
-			getCharacterCurrentParams(kCharacterRebecca)[3] = _gameTime + 300;
-			if (_gameTime == -300)
-				goto LABEL_13;
-		}
-		if (getCharacterCurrentParams(kCharacterRebecca)[3] < _gameTime) {
-		LABEL_12:
-			getCharacterCurrentParams(kCharacterRebecca)[3] = 0x7FFFFFFF;
-		LABEL_13:
-			playDialog(kCharacterRebecca, "Reb3007", -1, 0);
-			getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 2;
-			RebeccaCall(&LogicManager::CONS_Rebecca_DoBlockSeqOtis, "118E", 5, 52, 0);
-			return;
+
+		if (getCharacterCurrentParams(kCharacterRebecca)[3] != 0x7FFFFFFF && getCharacterCurrentParams(kCharacterRebecca)[1] < _gameTime) {
+			if (_gameTime > 2083500) {
+				getCharacterCurrentParams(kCharacterRebecca)[3] = 0x7FFFFFFF;
+				playDialog(kCharacterRebecca, "Reb3007", -1, 0);
+				getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 2;
+				RebeccaCall(&LogicManager::CONS_Rebecca_DoBlockSeqOtis, "118E", 5, 52, 0);
+				break;
+			}
+
+			if (!inSalon(kCharacterCath) || !getCharacterCurrentParams(kCharacterRebecca)[3]) {
+				getCharacterCurrentParams(kCharacterRebecca)[3] = _gameTime + 300;
+				if (_gameTime == -300) {
+					playDialog(kCharacterRebecca, "Reb3007", -1, 0);
+					getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 2;
+					RebeccaCall(&LogicManager::CONS_Rebecca_DoBlockSeqOtis, "118E", 5, 52, 0);
+					break;
+				}
+			}
+
+			if (getCharacterCurrentParams(kCharacterRebecca)[3] < _gameTime) {
+				getCharacterCurrentParams(kCharacterRebecca)[3] = 0x7FFFFFFF;
+				playDialog(kCharacterRebecca, "Reb3007", -1, 0);
+				getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 2;
+				RebeccaCall(&LogicManager::CONS_Rebecca_DoBlockSeqOtis, "118E", 5, 52, 0);
+				break;
+			}
+		}
+
+		if (!getCharacterCurrentParams(kCharacterRebecca)[0]) {
+			if (_gameTime > 2097000 && !getCharacterCurrentParams(kCharacterRebecca)[5]) {
+				getCharacterCurrentParams(kCharacterRebecca)[5] = 1;
+				getCharacter(kCharacterRebecca).inventoryItem = 0;
+				getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 4;
+				RebeccaCall(&LogicManager::CONS_Rebecca_DoBlockSeqOtis, "118H", 5, 52, 0);
+			}
+
+			break;
 		}
-	LABEL_19:
-		if (!getCharacterCurrentParams(kCharacterRebecca)[0])
-			goto LABEL_32;
+
 		if (!getCharacterCurrentParams(kCharacterRebecca)[2])
 			getCharacterCurrentParams(kCharacterRebecca)[2] = _gameTime + 9000;
-		if (getCharacterCurrentParams(kCharacterRebecca)[4] == 0x7FFFFFFF || getCharacterCurrentParams(kCharacterRebecca)[2] >= _gameTime)
-			goto LABEL_32;
-		if (_gameTime > 2092500)
-			goto LABEL_29;
+
+		if (getCharacterCurrentParams(kCharacterRebecca)[4] == 0x7FFFFFFF || getCharacterCurrentParams(kCharacterRebecca)[2] >= _gameTime) {
+			if (_gameTime > 2097000 && !getCharacterCurrentParams(kCharacterRebecca)[5]) {
+				getCharacterCurrentParams(kCharacterRebecca)[5] = 1;
+				getCharacter(kCharacterRebecca).inventoryItem = 0;
+				getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 4;
+				RebeccaCall(&LogicManager::CONS_Rebecca_DoBlockSeqOtis, "118H", 5, 52, 0);
+			}
+
+			break;
+		}
+
+		if (_gameTime > 2092500) {
+			getCharacterCurrentParams(kCharacterRebecca)[4] = 0x7FFFFFFF;
+			getCharacter(kCharacterRebecca).inventoryItem = 0;
+			playDialog(kCharacterRebecca, "Reb3008", -1, 60);
+			blockView(kCharacterRebecca, kCarRestaurant, 52);
+			getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 3;
+			RebeccaCall(&LogicManager::CONS_Rebecca_DoComplexSeqOtis, "118G1", "118G2", 24, 0);
+			break;
+		}
+
 		if (!inSalon(kCharacterCath) || !getCharacterCurrentParams(kCharacterRebecca)[4]) {
 			getCharacterCurrentParams(kCharacterRebecca)[4] = _gameTime + 300;
-			if (_gameTime == -300)
-				goto LABEL_30;
+
+			if (_gameTime == -300) {
+				getCharacter(kCharacterRebecca).inventoryItem = 0;
+				playDialog(kCharacterRebecca, "Reb3008", -1, 60);
+				blockView(kCharacterRebecca, kCarRestaurant, 52);
+				getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 3;
+				RebeccaCall(&LogicManager::CONS_Rebecca_DoComplexSeqOtis, "118G1", "118G2", 24, 0);
+				break;
+			}
 		}
+
 		if (getCharacterCurrentParams(kCharacterRebecca)[4] >= _gameTime) {
-		LABEL_32:
 			if (_gameTime > 2097000 && !getCharacterCurrentParams(kCharacterRebecca)[5]) {
 				getCharacterCurrentParams(kCharacterRebecca)[5] = 1;
 				getCharacter(kCharacterRebecca).inventoryItem = 0;
@@ -1666,25 +2101,24 @@ void LogicManager::HAND_Rebecca_GoSalon(HAND_PARAMS) {
 				RebeccaCall(&LogicManager::CONS_Rebecca_DoBlockSeqOtis, "118H", 5, 52, 0);
 			}
 		} else {
-		LABEL_29:
 			getCharacterCurrentParams(kCharacterRebecca)[4] = 0x7FFFFFFF;
-		LABEL_30:
 			getCharacter(kCharacterRebecca).inventoryItem = 0;
 			playDialog(kCharacterRebecca, "Reb3008", -1, 60);
 			blockView(kCharacterRebecca, kCarRestaurant, 52);
 			getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 3;
 			RebeccaCall(&LogicManager::CONS_Rebecca_DoComplexSeqOtis, "118G1", "118G2", 24, 0);
 		}
+
 		break;
 	case 1:
 		getCharacter(kCharacterRebecca).inventoryItem = 0;
 		getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 6;
 		RebeccaCall(&LogicManager::CONS_Rebecca_DoDialog, "SOP3008", 0, 0, 0);
-		return;
+		break;
 	case 12:
 		getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 1;
 		RebeccaCall(&LogicManager::CONS_Rebecca_GotoSalon, 1, 0, 0, 0);
-		return;
+		break;
 	case 18:
 		switch (getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8]) {
 		case 1:
@@ -1694,12 +2128,85 @@ void LogicManager::HAND_Rebecca_GoSalon(HAND_PARAMS) {
 			getCharacterCurrentParams(kCharacterRebecca)[0] = 1;
 			getCharacter(kCharacterRebecca).inventoryItem = 0x80;
 			startCycOtis(kCharacterRebecca, "118F");
-			goto LABEL_19;
+
+			if (!getCharacterCurrentParams(kCharacterRebecca)[0]) {
+				if (_gameTime > 2097000 && !getCharacterCurrentParams(kCharacterRebecca)[5]) {
+					getCharacterCurrentParams(kCharacterRebecca)[5] = 1;
+					getCharacter(kCharacterRebecca).inventoryItem = 0;
+					getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 4;
+					RebeccaCall(&LogicManager::CONS_Rebecca_DoBlockSeqOtis, "118H", 5, 52, 0);
+				}
+
+				break;
+			}
+
+			if (!getCharacterCurrentParams(kCharacterRebecca)[2])
+				getCharacterCurrentParams(kCharacterRebecca)[2] = _gameTime + 9000;
+
+			if (getCharacterCurrentParams(kCharacterRebecca)[4] == 0x7FFFFFFF || getCharacterCurrentParams(kCharacterRebecca)[2] >= _gameTime) {
+				if (_gameTime > 2097000 && !getCharacterCurrentParams(kCharacterRebecca)[5]) {
+					getCharacterCurrentParams(kCharacterRebecca)[5] = 1;
+					getCharacter(kCharacterRebecca).inventoryItem = 0;
+					getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 4;
+					RebeccaCall(&LogicManager::CONS_Rebecca_DoBlockSeqOtis, "118H", 5, 52, 0);
+				}
+
+				break;
+			}
+
+			if (_gameTime > 2092500) {
+				getCharacterCurrentParams(kCharacterRebecca)[4] = 0x7FFFFFFF;
+				getCharacter(kCharacterRebecca).inventoryItem = 0;
+				playDialog(kCharacterRebecca, "Reb3008", -1, 60);
+				blockView(kCharacterRebecca, kCarRestaurant, 52);
+				getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 3;
+				RebeccaCall(&LogicManager::CONS_Rebecca_DoComplexSeqOtis, "118G1", "118G2", 24, 0);
+				break;
+			}
+
+			if (!inSalon(kCharacterCath) || !getCharacterCurrentParams(kCharacterRebecca)[4]) {
+				getCharacterCurrentParams(kCharacterRebecca)[4] = _gameTime + 300;
+
+				if (_gameTime == -300) {
+					getCharacter(kCharacterRebecca).inventoryItem = 0;
+					playDialog(kCharacterRebecca, "Reb3008", -1, 60);
+					blockView(kCharacterRebecca, kCarRestaurant, 52);
+					getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 3;
+					RebeccaCall(&LogicManager::CONS_Rebecca_DoComplexSeqOtis, "118G1", "118G2", 24, 0);
+					break;
+				}
+			}
+
+			if (getCharacterCurrentParams(kCharacterRebecca)[4] >= _gameTime) {
+				if (_gameTime > 2097000 && !getCharacterCurrentParams(kCharacterRebecca)[5]) {
+					getCharacterCurrentParams(kCharacterRebecca)[5] = 1;
+					getCharacter(kCharacterRebecca).inventoryItem = 0;
+					getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 4;
+					RebeccaCall(&LogicManager::CONS_Rebecca_DoBlockSeqOtis, "118H", 5, 52, 0);
+				}
+			} else {
+				getCharacterCurrentParams(kCharacterRebecca)[4] = 0x7FFFFFFF;
+				getCharacter(kCharacterRebecca).inventoryItem = 0;
+				playDialog(kCharacterRebecca, "Reb3008", -1, 60);
+				blockView(kCharacterRebecca, kCarRestaurant, 52);
+				getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 3;
+				RebeccaCall(&LogicManager::CONS_Rebecca_DoComplexSeqOtis, "118G1", "118G2", 24, 0);
+			}
+
+			break;
 		case 3:
 			endGraphics(kCharacterSophie);
 			releaseView(kCharacterRebecca, kCarRestaurant, 52);
 			startCycOtis(kCharacterRebecca, "118D");
-			goto LABEL_32;
+
+			if (_gameTime > 2097000 && !getCharacterCurrentParams(kCharacterRebecca)[5]) {
+				getCharacterCurrentParams(kCharacterRebecca)[5] = 1;
+				getCharacter(kCharacterRebecca).inventoryItem = 0;
+				getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 4;
+				RebeccaCall(&LogicManager::CONS_Rebecca_DoBlockSeqOtis, "118H", 5, 52, 0);
+			}
+
+			break;
 		case 4:
 			getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 5;
 			RebeccaCall(&LogicManager::CONS_Rebecca_ReturnFromSalon, 0, 0, 0, 0);
@@ -1708,11 +2215,12 @@ void LogicManager::HAND_Rebecca_GoSalon(HAND_PARAMS) {
 			CONS_Rebecca_ClosedComp(0, 0, 0, 0);
 			break;
 		default:
-			return;
+			break;
 		}
-		return;
+
+		break;
 	default:
-		return;
+		break;
 	}
 }
 
@@ -1727,11 +2235,19 @@ void LogicManager::CONS_Rebecca_ClosedComp(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Rebecca_ClosedComp(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 1;
 		RebeccaCall(&LogicManager::CONS_Rebecca_CompLogic, 2110500, 0, 0, 0);
-	} else if (msg->action == 18 && getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] == 1) {
-		CONS_Rebecca_GoConcert(0, 0, 0, 0);
+		break;
+	case 18:
+		if (getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] == 1) {
+			CONS_Rebecca_GoConcert(0, 0, 0, 0);
+		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1746,13 +2262,15 @@ void LogicManager::CONS_Rebecca_GoConcert(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Rebecca_GoConcert(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterRebecca).characterPosition.location = 0;
 		getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 1;
 		RebeccaCall(&LogicManager::CONS_Rebecca_DoBriefCorrOtis, "624Be", 36, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		if (getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] == 1) {
-			setDoor(36, 0, 0, 10, 9);
+			setDoor(36, kCharacterCath, 0, 10, 9);
 			send(kCharacterRebecca, kCharacterSophie, 259921280, 0);
 			getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 2;
 			RebeccaCall(&LogicManager::CONS_Rebecca_DoWalk, 2, 9270, 0, 0);
@@ -1760,6 +2278,10 @@ void LogicManager::HAND_Rebecca_GoConcert(HAND_PARAMS) {
 			send(kCharacterRebecca, kCharacterSophie, 123668192, 0);
 			CONS_Rebecca_Concert(0, 0, 0, 0);
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1774,15 +2296,20 @@ void LogicManager::CONS_Rebecca_Concert(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Rebecca_Concert(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		endGraphics(kCharacterRebecca);
-		setDoor(36, 0, 0, 10, 9);
-		setDoor(52, 0, 0, 10, 9);
+		setDoor(36, kCharacterCath, 0, 10, 9);
+		setDoor(52, kCharacterCath, 0, 10, 9);
 		getCharacter(kCharacterRebecca).characterPosition.car = kCarKronos;
 		getCharacter(kCharacterRebecca).characterPosition.position = 6000;
 		getCharacter(kCharacterRebecca).characterPosition.location = 1;
-	} else if (msg->action == 191668032) {
+		break;
+	case 191668032:
 		CONS_Rebecca_LeaveConcert(0, 0, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1797,11 +2324,13 @@ void LogicManager::CONS_Rebecca_LeaveConcert(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Rebecca_LeaveConcert(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterRebecca).characterPosition.position = 9270;
 		getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 1;
 		RebeccaCall(&LogicManager::CONS_Rebecca_DoWalk, 3, 2740, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		switch (getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8]) {
 		case 1:
 			send(kCharacterRebecca, kCharacterSophie, 292775040, 0);
@@ -1822,8 +2351,12 @@ void LogicManager::HAND_Rebecca_LeaveConcert(HAND_PARAMS) {
 			CONS_Rebecca_SiestaTime(0, 0, 0, 0);
 			break;
 		default:
-			return;
+			break;
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1838,10 +2371,14 @@ void LogicManager::CONS_Rebecca_SiestaTime(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Rebecca_SiestaTime(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacterParams(kCharacterRebecca, 8)[1] = 1;
 		getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 1;
 		RebeccaCall(&LogicManager::CONS_Rebecca_CompLogic, 15803100, 0, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1856,20 +2393,23 @@ void LogicManager::CONS_Rebecca_StartPart4(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Rebecca_StartPart4(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			endGraphics(kCharacterRebecca);
-			getCharacter(kCharacterRebecca).characterPosition.car = kCarRedSleeping;
-			getCharacter(kCharacterRebecca).characterPosition.position = 4840;
-			getCharacter(kCharacterRebecca).characterPosition.location = 1;
-			getCharacter(kCharacterRebecca).clothes = 0;
-			getCharacter(kCharacterRebecca).inventoryItem = 0;
-			setModel(110, 3);
-			getCharacterParams(kCharacterRebecca, 8)[0] = 0;
-			getCharacterParams(kCharacterRebecca, 8)[1] = 1;
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		CONS_Rebecca_InComp4(0, 0, 0, 0);
+		break;
+	case 12:
+		endGraphics(kCharacterRebecca);
+		getCharacter(kCharacterRebecca).characterPosition.car = kCarRedSleeping;
+		getCharacter(kCharacterRebecca).characterPosition.position = 4840;
+		getCharacter(kCharacterRebecca).characterPosition.location = 1;
+		getCharacter(kCharacterRebecca).clothes = 0;
+		getCharacter(kCharacterRebecca).inventoryItem = 0;
+		setModel(110, 3);
+		getCharacterParams(kCharacterRebecca, 8)[0] = 0;
+		getCharacterParams(kCharacterRebecca, 8)[1] = 1;
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1884,10 +2424,12 @@ void LogicManager::CONS_Rebecca_InComp4(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Rebecca_InComp4(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 1;
 		RebeccaCall(&LogicManager::CONS_Rebecca_CompLogic, 2385000, 0, 0, 0);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		if (getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] == 1 || getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] == 2) {
 			if (getCharacterParams(kCharacterRebecca, 8)[0]) {
 				CONS_Rebecca_GoDinner4(0, 0, 0, 0);
@@ -1896,6 +2438,10 @@ void LogicManager::HAND_Rebecca_InComp4(HAND_PARAMS) {
 				RebeccaCall(&LogicManager::CONS_Rebecca_CompLogic, _gameTime + 900, 0, 0, 0);
 			}
 		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -1910,88 +2456,114 @@ void LogicManager::CONS_Rebecca_GoDinner4(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Rebecca_GoDinner4(HAND_PARAMS) {
-	if (msg->action > 12) {
-		if (msg->action == 18) {
-			switch (getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8]) {
-			case 1:
-				startCycOtis(kCharacterRebecca, "012D");
-				getCharacter(kCharacterRebecca).characterPosition.location = 1;
-				break;
-			case 2:
-				goto LABEL_36;
-			case 3:
-				CONS_Rebecca_Asleep4(0, 0, 0, 0);
+	switch (msg->action) {
+	case 0:
+		if (getCharacterCurrentParams(kCharacterRebecca)[2] != 0x7FFFFFFF && _gameTime) {
+			bool skip = false;
+
+			if (_gameTime > 2412000) {
+				getCharacterCurrentParams(kCharacterRebecca)[2] = 0x7FFFFFFF;
+				send(kCharacterRebecca, kCharacterWaiter1, 223712416, 0);
+				skip = true;
+			}
+
+			if (!skip) {
+				if (!inDiningRoom(kCharacterCath) || !getCharacterCurrentParams(kCharacterRebecca)[2]) {
+					getCharacterCurrentParams(kCharacterRebecca)[2] = _gameTime;
+					if (!_gameTime) {
+						skip = true;
+						send(kCharacterRebecca, kCharacterWaiter1, 223712416, 0);
+					}
+				}
+
+				if (!skip && getCharacterCurrentParams(kCharacterRebecca)[2] < _gameTime) {
+					getCharacterCurrentParams(kCharacterRebecca)[2] = 0x7FFFFFFF;
+					send(kCharacterRebecca, kCharacterWaiter1, 223712416, 0);
+				}
+			}
+		}
+
+		if (getCharacterCurrentParams(kCharacterRebecca)[0] && getCharacterCurrentParams(kCharacterRebecca)[3] != 0x7FFFFFFF && _gameTime) {
+			if (_gameTime > 2430000) {
+				getCharacterCurrentParams(kCharacterRebecca)[3] = 0x7FFFFFFF;
+				getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 2;
+				RebeccaCall(&LogicManager::CONS_Rebecca_DoDialog, "Reb4004", 0, 0, 0);
 				break;
-			case 4:
-				send(kCharacterRebecca, kCharacterWaiter1, 136702400, 0);
-				startCycOtis(kCharacterRebecca, "012G");
-				getCharacterCurrentParams(kCharacterRebecca)[1] = 1;
+			}
+
+			if (!inDiningRoom(kCharacterCath) || !getCharacterCurrentParams(kCharacterRebecca)[3]) {
+				getCharacterCurrentParams(kCharacterRebecca)[3] = _gameTime + 150;
+				if (_gameTime == -150) {
+					getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 2;
+					RebeccaCall(&LogicManager::CONS_Rebecca_DoDialog, "Reb4004", 0, 0, 0);
+					break;
+				}
+			}
+
+			if (getCharacterCurrentParams(kCharacterRebecca)[3] < _gameTime) {
+				getCharacterCurrentParams(kCharacterRebecca)[3] = 0x7FFFFFFF;
+				getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 2;
+				RebeccaCall(&LogicManager::CONS_Rebecca_DoDialog, "Reb4004", 0, 0, 0);
 				break;
-			default:
-				return;
 			}
-		} else if (msg->action == 123712592) {
-			startCycOtis(kCharacterWaiter1, "BLANK");
-			playDialog(kCharacterRebecca, "Reb4003", -1, 0);
-			getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 4;
-			RebeccaCall(&LogicManager::CONS_Rebecca_DoSeqOtis, "012E", 0, 0, 0);
 		}
-		return;
-	}
-	if (msg->action == 12) {
+
+		if (getCharacterCurrentParams(kCharacterRebecca)[1] && _gameTime > 2443500 && !getCharacterCurrentParams(kCharacterRebecca)[4]) {
+			getCharacterCurrentParams(kCharacterRebecca)[4] = 1;
+			getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 3;
+			RebeccaCall(&LogicManager::CONS_Rebecca_ReturnFromDinner, 0, 0, 0, 0);
+		}
+
+		break;
+	case 2:
+		if (inDiningRoom(kCharacterCath)) {
+			getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 5;
+			RebeccaCall(&LogicManager::CONS_Rebecca_DoDialog, "Reb4004", 0, 0, 0);
+		} else {
+			getCharacterCurrentParams(kCharacterRebecca)[0] = 1;
+		}
+
+		break;
+	case 12:
 		getCharacter(kCharacterRebecca).characterPosition.location = 0;
 		getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 1;
 		RebeccaCall(&LogicManager::CONS_Rebecca_GotoDinner, 1, 0, 0, 0);
-		return;
-	}
-	if (msg->action) {
-		if (msg->action == 2) {
-			if (inDiningRoom(kCharacterCath)) {
-				getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 5;
-				RebeccaCall(&LogicManager::CONS_Rebecca_DoDialog, "Reb4004", 0, 0, 0);
-			} else {
-				getCharacterCurrentParams(kCharacterRebecca)[0] = 1;
+		break;
+	case 18:
+		switch (getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8]) {
+		case 1:
+			startCycOtis(kCharacterRebecca, "012D");
+			getCharacter(kCharacterRebecca).characterPosition.location = 1;
+			break;
+		case 2:
+			if (getCharacterCurrentParams(kCharacterRebecca)[1] && _gameTime > 2443500 && !getCharacterCurrentParams(kCharacterRebecca)[4]) {
+				getCharacterCurrentParams(kCharacterRebecca)[4] = 1;
+				getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 3;
+				RebeccaCall(&LogicManager::CONS_Rebecca_ReturnFromDinner, 0, 0, 0, 0);
 			}
+
+			break;
+		case 3:
+			CONS_Rebecca_Asleep4(0, 0, 0, 0);
+			break;
+		case 4:
+			send(kCharacterRebecca, kCharacterWaiter1, 136702400, 0);
+			startCycOtis(kCharacterRebecca, "012G");
+			getCharacterCurrentParams(kCharacterRebecca)[1] = 1;
+			break;
+		default:
+			break;
 		}
-		return;
-	}
-	if (getCharacterCurrentParams(kCharacterRebecca)[2] != 0x7FFFFFFF && _gameTime) {
-		if (_gameTime > 2412000)
-			goto LABEL_16;
-		if (!inDiningRoom(kCharacterCath) || !getCharacterCurrentParams(kCharacterRebecca)[2]) {
-			getCharacterCurrentParams(kCharacterRebecca)[2] = _gameTime;
-			if (!_gameTime)
-				goto LABEL_17;
-		}
-		if (getCharacterCurrentParams(kCharacterRebecca)[2] < _gameTime) {
-		LABEL_16:
-			getCharacterCurrentParams(kCharacterRebecca)[2] = 0x7FFFFFFF;
-		LABEL_17:
-			send(kCharacterRebecca, kCharacterWaiter1, 223712416, 0);
-		}
-	}
-	if (getCharacterCurrentParams(kCharacterRebecca)[0] && getCharacterCurrentParams(kCharacterRebecca)[3] != 0x7FFFFFFF && _gameTime) {
-		if (_gameTime > 2430000)
-			goto LABEL_26;
-		if (!inDiningRoom(kCharacterCath) || !getCharacterCurrentParams(kCharacterRebecca)[3]) {
-			getCharacterCurrentParams(kCharacterRebecca)[3] = _gameTime + 150;
-			if (_gameTime == -150)
-				goto LABEL_27;
-		}
-		if (getCharacterCurrentParams(kCharacterRebecca)[3] < _gameTime) {
-		LABEL_26:
-			getCharacterCurrentParams(kCharacterRebecca)[3] = 0x7FFFFFFF;
-		LABEL_27:
-			getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 2;
-			RebeccaCall(&LogicManager::CONS_Rebecca_DoDialog, "Reb4004", 0, 0, 0);
-			return;
-		}
-	}
-LABEL_36:
-	if (getCharacterCurrentParams(kCharacterRebecca)[1] && _gameTime > 2443500 && !getCharacterCurrentParams(kCharacterRebecca)[4]) {
-		getCharacterCurrentParams(kCharacterRebecca)[4] = 1;
-		getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 3;
-		RebeccaCall(&LogicManager::CONS_Rebecca_ReturnFromDinner, 0, 0, 0, 0);
+
+		break;
+	case 123712592:
+		startCycOtis(kCharacterWaiter1, "BLANK");
+		playDialog(kCharacterRebecca, "Reb4003", -1, 0);
+		getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 4;
+		RebeccaCall(&LogicManager::CONS_Rebecca_DoSeqOtis, "012E", 0, 0, 0);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -2006,19 +2578,29 @@ void LogicManager::CONS_Rebecca_Asleep4(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Rebecca_Asleep4(HAND_PARAMS) {
-	if (msg->action == 12) {
+	switch (msg->action) {
+	case 12:
 		getCharacter(kCharacterRebecca).characterPosition.car = 4;
 		getCharacter(kCharacterRebecca).characterPosition.position = 4840;
 		getCharacter(kCharacterRebecca).characterPosition.location = 1;
-		setDoor(36, 0, 1, 10, 9);
-		setDoor(52, 0, 1, 10, 9);
+		setDoor(36, kCharacterCath, 1, 10, 9);
+		setDoor(52, kCharacterCath, 1, 10, 9);
 		endGraphics(kCharacterRebecca);
-	} else if (msg->action == 18) {
+		break;
+	case 18:
 		if (getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] == 1)
 			getCharacterCurrentParams(kCharacterRebecca)[0] = 1;
-	} else if (msg->action == 205034665 && !getCharacterCurrentParams(kCharacterRebecca)[0] && _gameTime < 2511000) {
-		getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 1;
-		RebeccaCall(&LogicManager::CONS_Rebecca_DoDialog, "Reb6969", 0, 0, 0);
+
+		break;
+	case 205034665:
+		if (!getCharacterCurrentParams(kCharacterRebecca)[0] && _gameTime < 2511000) {
+			getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 1;
+			RebeccaCall(&LogicManager::CONS_Rebecca_DoDialog, "Reb6969", 0, 0, 0);
+		}
+
+		break;
+	default:
+		break;
 	}
 }
 
@@ -2033,17 +2615,20 @@ void LogicManager::CONS_Rebecca_StartPart5(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Rebecca_StartPart5(HAND_PARAMS) {
-	if (msg->action) {
-		if (msg->action == 12) {
-			endGraphics(kCharacterRebecca);
-			getCharacter(kCharacterRebecca).characterPosition.car = kCarRestaurant;
-			getCharacter(kCharacterRebecca).characterPosition.position = 3969;
-			getCharacter(kCharacterRebecca).characterPosition.location = 1;
-			getCharacter(kCharacterRebecca).inventoryItem = 0;
-			setModel(110, 4);
-		}
-	} else {
+	switch (msg->action) {
+	case 0:
 		CONS_Rebecca_Prisoner(0, 0, 0, 0);
+		break;
+	case 12:
+		endGraphics(kCharacterRebecca);
+		getCharacter(kCharacterRebecca).characterPosition.car = kCarRestaurant;
+		getCharacter(kCharacterRebecca).characterPosition.position = 3969;
+		getCharacter(kCharacterRebecca).characterPosition.location = 1;
+		getCharacter(kCharacterRebecca).inventoryItem = 0;
+		setModel(110, 4);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -2058,8 +2643,13 @@ void LogicManager::CONS_Rebecca_Prisoner(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Rebecca_Prisoner(HAND_PARAMS) {
-	if (msg->action == 70549068)
+	switch (msg->action) {
+	case 70549068:
 		CONS_Rebecca_Hiding(0, 0, 0, 0);
+		break;
+	default:
+		break;
+	}
 }
 
 void LogicManager::CONS_Rebecca_Hiding(CONS_PARAMS) {
@@ -2073,56 +2663,34 @@ void LogicManager::CONS_Rebecca_Hiding(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_Rebecca_Hiding(HAND_PARAMS) {
-	if (msg->action > 9) {
-		if (msg->action > 17) {
-			switch (msg->action) {
-			case 18:
-				switch (getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8]) {
-				case 1:
-					endGraphics(kCharacterRebecca);
-					getCharacter(kCharacterRebecca).characterPosition.location = 1;
-					getCharacter(kCharacterRebecca).characterPosition.position = 4840;
-					setDoor(36, 23, 1, 10, 9);
-					break;
-				case 3:
-				case 4:
-					getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 5;
-					RebeccaCall(&LogicManager::CONS_Rebecca_DoDialog, "Reb5001", 0, 0, 0);
-					break;
-				case 5:
-					getCharacterCurrentParams(kCharacterRebecca)[0] = 1;
-					setDoor(36, 23, 1, 14, 0);
+	switch (msg->action) {
+	case 0:
+		if (getCharacterCurrentParams(kCharacterRebecca)[0]) {
+			if (getCharacterCurrentParams(kCharacterRebecca)[2] || (getCharacterCurrentParams(kCharacterRebecca)[2] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
+				if (getCharacterCurrentParams(kCharacterRebecca)[2] >= _currentGameSessionTicks)
 					break;
-				default:
-					return;
-				}
-				break;
-			case 135800432:
-				CONS_Rebecca_Disappear(0, 0, 0, 0);
-				break;
-			case 155604840:
-				setDoor(36, 23, 1, 10, 9);
-				break;
-			}
-		} else if (msg->action == 17) {
-			if (getCharacterCurrentParams(kCharacterRebecca)[1] || getCharacterCurrentParams(kCharacterRebecca)[0]) {
-				getCharacterCurrentParams(kCharacterRebecca)[1] = 0;
-				getCharacterCurrentParams(kCharacterRebecca)[0] = 0;
-				setDoor(36, 23, 1, 10, 9);
+
+				getCharacterCurrentParams(kCharacterRebecca)[2] = 0x7FFFFFFF;
 			}
-		} else if (msg->action == 12) {
-			getCharacter(kCharacterRebecca).characterPosition.car = 4;
-			getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 1;
-			RebeccaCall(&LogicManager::CONS_Rebecca_DoCorrOtis, "624AE", 0x24, 0, 0);
+
+			getCharacterCurrentParams(kCharacterRebecca)[0] = 0;
+			getCharacterCurrentParams(kCharacterRebecca)[1] = 1;
+			setDoor(36, kCharacterRebecca, 1, 0, 0);
+			getCharacterCurrentParams(kCharacterRebecca)[2] = 0;
+		} else {
+			getCharacterCurrentParams(kCharacterRebecca)[2] = 0;
 		}
-	} else if (msg->action >= 8) {
+
+		break;
+	case 8:
+	case 9:
 		if (getCharacterCurrentParams(kCharacterRebecca)[0]) {
-			setDoor(36, 23, 1, 0, 0);
+			setDoor(36, kCharacterRebecca, 1, 0, 0);
 			getCharacterCurrentParams(kCharacterRebecca)[1] = 1;
 			getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 2;
 			RebeccaCall(&LogicManager::CONS_Rebecca_DoDialog, getCathJustChecking(), 0, 0, 0);
 		} else {
-			setDoor(36, 23, 1, 0, 0);
+			setDoor(36, kCharacterRebecca, 1, 0, 0);
 			if (msg->action == 8) {
 				getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 3;
 				RebeccaCall(&LogicManager::CONS_Rebecca_DoDialog, "LIB012", 0, 0, 0);
@@ -2131,20 +2699,51 @@ void LogicManager::HAND_Rebecca_Hiding(HAND_PARAMS) {
 				RebeccaCall(&LogicManager::CONS_Rebecca_DoDialog, "LIB013", 0, 0, 0);
 			}
 		}
-	} else if (msg->action == 0) {
-		if (getCharacterCurrentParams(kCharacterRebecca)[0]) {
-			if (getCharacterCurrentParams(kCharacterRebecca)[2] || (getCharacterCurrentParams(kCharacterRebecca)[2] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
-				if (getCharacterCurrentParams(kCharacterRebecca)[2] >= _currentGameSessionTicks)
-					return;
-				getCharacterCurrentParams(kCharacterRebecca)[2] = 0x7FFFFFFF;
-			}
+
+		break;
+	case 12:
+		getCharacter(kCharacterRebecca).characterPosition.car = 4;
+		getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 1;
+		RebeccaCall(&LogicManager::CONS_Rebecca_DoCorrOtis, "624AE", 36, 0, 0);
+		break;
+	case 17:
+		if (getCharacterCurrentParams(kCharacterRebecca)[1] || getCharacterCurrentParams(kCharacterRebecca)[0]) {
+			getCharacterCurrentParams(kCharacterRebecca)[1] = 0;
 			getCharacterCurrentParams(kCharacterRebecca)[0] = 0;
-			getCharacterCurrentParams(kCharacterRebecca)[1] = 1;
-			setDoor(36, 23, 1, 0, 0);
-			getCharacterCurrentParams(kCharacterRebecca)[2] = 0;
-		} else {
-			getCharacterCurrentParams(kCharacterRebecca)[2] = 0;
+			setDoor(36, kCharacterRebecca, 1, 10, 9);
+		}
+
+		break;
+	case 18:
+		switch (getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8]) {
+		case 1:
+			endGraphics(kCharacterRebecca);
+			getCharacter(kCharacterRebecca).characterPosition.location = 1;
+			getCharacter(kCharacterRebecca).characterPosition.position = 4840;
+			setDoor(36, kCharacterRebecca, 1, 10, 9);
+			break;
+		case 3:
+		case 4:
+			getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 5;
+			RebeccaCall(&LogicManager::CONS_Rebecca_DoDialog, "Reb5001", 0, 0, 0);
+			break;
+		case 5:
+			getCharacterCurrentParams(kCharacterRebecca)[0] = 1;
+			setDoor(36, kCharacterRebecca, 1, 14, 0);
+			break;
+		default:
+			break;
 		}
+
+		break;
+	case 135800432:
+		CONS_Rebecca_Disappear(0, 0, 0, 0);
+		break;
+	case 155604840:
+		setDoor(36, kCharacterRebecca, 1, 10, 9);
+		break;
+	default:
+		break;
 	}
 }
 


Commit: 3d071e9a93921ef95a8692208e6c7ebeb97d3e74
    https://github.com/scummvm/scummvm/commit/3d071e9a93921ef95a8692208e6c7ebeb97d3e74
Author: AndywinXp (andywinxp at gmail.com)
Date: 2025-06-16T23:12:18+02:00

Commit Message:
LASTEXPRESS: Add myself to credits

Changed paths:
    engines/lastexpress/credits.pl


diff --git a/engines/lastexpress/credits.pl b/engines/lastexpress/credits.pl
index 095bd098b21..7be2f436454 100644
--- a/engines/lastexpress/credits.pl
+++ b/engines/lastexpress/credits.pl
@@ -1,4 +1,5 @@
 begin_section("Lastexpress");
+	add_person("Andrea Boscarino", "Bosca", "Engine rewrite");
 	add_person("Matthew Hoops", "clone2727", "(retired)");
 	add_person("Jordi Vilalta Prat", "jvprat", "");
 	add_person("Julien Templier", "littleboy", "");


Commit: 51fde2f649be0b2b37fb4ade19fe29f3ec34d625
    https://github.com/scummvm/scummvm/commit/51fde2f649be0b2b37fb4ade19fe29f3ec34d625
Author: AndywinXp (andywinxp at gmail.com)
Date: 2025-06-16T23:12:18+02:00

Commit Message:
LASTEXPRESS: Clean up sprites.h/.cpp

Changed paths:
    engines/lastexpress/data/sprites.cpp
    engines/lastexpress/data/sprites.h


diff --git a/engines/lastexpress/data/sprites.cpp b/engines/lastexpress/data/sprites.cpp
index 5373efdad45..3909de96771 100644
--- a/engines/lastexpress/data/sprites.cpp
+++ b/engines/lastexpress/data/sprites.cpp
@@ -29,20 +29,20 @@ SpriteManager::SpriteManager(LastExpressEngine *engine) {
 }
 
 void SpriteManager::drawCycle() {
-	if (g_flag_drawSequences) {
+	if (_drawSequencesFlag) {
 		Extent extent = Extent(0, 480, 0, 0, 0, 0);
-		Sprite *queue = g_frameQueue;
+		Sprite *queue = _frameQueue;
 
 		int oldLeft = 640;
 		int oldRight = 0;
 		
-		if (g_flag_coordinates_set) {
-			if (g_eraseRect.right >= g_eraseRect.left &&
-				g_eraseRect.right < 640 &&
-				g_eraseRect.top <= g_eraseRect.bottom &&
-				g_eraseRect.bottom < 480) {
+		if (_coordinatesAreSet) {
+			if (_eraseRect.right >= _eraseRect.left &&
+				_eraseRect.right < 640 &&
+				_eraseRect.top <= _eraseRect.bottom &&
+				_eraseRect.bottom < 480) {
 
-				memcpy(&extent, &g_eraseRect, sizeof(extent));
+				memcpy(&extent, &_eraseRect, sizeof(extent));
 
 				oldRight = extent.right;
 				oldLeft = extent.left;
@@ -51,10 +51,10 @@ void SpriteManager::drawCycle() {
 					_engine->getGraphicsManager()->copy(
 						_engine->getGraphicsManager()->_screenBuffer,
 						(PixMap *)_engine->getGraphicsManager()->_screenSurface.getPixels(),
-						g_eraseRect.left,
-						g_eraseRect.top,
-						g_eraseRect.right - g_eraseRect.left + 1,
-						g_eraseRect.bottom - g_eraseRect.top + 1);
+						_eraseRect.left,
+						_eraseRect.top,
+						_eraseRect.right - _eraseRect.left + 1,
+						_eraseRect.bottom - _eraseRect.top + 1);
 					_engine->getGraphicsManager()->unlockSurface();
 				}
 			}
@@ -67,7 +67,7 @@ void SpriteManager::drawCycle() {
 				_engine->getGraphicsManager()->eraseSprite(queue->eraseMask);
 		}
 
-		for (Sprite *i = g_frameQueue; i; i = i->nextSprite) {
+		for (Sprite *i = _frameQueue; i; i = i->nextSprite) {
 			if (i->rect.left < oldLeft)
 				oldLeft = i->rect.left;
 
@@ -143,12 +143,12 @@ void SpriteManager::drawCycle() {
 		if (oldLeft != 640)
 			_engine->getGraphicsManager()->burstBox(oldLeft, extent.top, oldRight - oldLeft + 1, extent.bottom - extent.top + 1);
 
-		g_flag_drawSequences = false;
+		_drawSequencesFlag = false;
 	}
 }
 
 void SpriteManager::drawCycleSimple(PixMap *pixels) {
-	for (Sprite *i = g_frameQueue; i; i = i->nextSprite) {
+	for (Sprite *i = _frameQueue; i; i = i->nextSprite) {
 		if (i->compType != 2 && i->compType != 3) {
 			switch (i->compBits) {
 			case 3:
@@ -172,42 +172,42 @@ void SpriteManager::drawCycleSimple(PixMap *pixels) {
 
 void SpriteManager::queueErase(Sprite *sprite) {
 	if (sprite && sprite->compType != 3) {
-		g_flag_coordinates_set = true;
+		_coordinatesAreSet = true;
 
-		if (g_eraseRect.left > sprite->rect.left)
-			g_eraseRect.left = sprite->rect.left;
+		if (_eraseRect.left > sprite->rect.left)
+			_eraseRect.left = sprite->rect.left;
 
-		if (g_eraseRect.top > sprite->rect.top)
-			g_eraseRect.top = sprite->rect.top;
+		if (_eraseRect.top > sprite->rect.top)
+			_eraseRect.top = sprite->rect.top;
 
-		if (g_eraseRect.right < sprite->rect.right)
-			g_eraseRect.right = sprite->rect.right;
+		if (_eraseRect.right < sprite->rect.right)
+			_eraseRect.right = sprite->rect.right;
 
-		if (g_eraseRect.bottom < sprite->rect.bottom)
-			g_eraseRect.bottom = sprite->rect.bottom;
+		if (_eraseRect.bottom < sprite->rect.bottom)
+			_eraseRect.bottom = sprite->rect.bottom;
 	}
 }
 
 void SpriteManager::resetEraseQueue() {
-	g_eraseRect.left = 640;
-	g_eraseRect.top = 480;
-	g_flag_coordinates_set = false;
-	g_eraseRect.right = 0;
-	g_eraseRect.bottom = 0;
+	_eraseRect.left = 640;
+	_eraseRect.top = 480;
+	_coordinatesAreSet = false;
+	_eraseRect.right = 0;
+	_eraseRect.bottom = 0;
 }
 
 void SpriteManager::killSpriteQueue() {
-	g_flag_drawSequences = true;
-	g_frameQueue = nullptr;
+	_drawSequencesFlag = true;
+	_frameQueue = nullptr;
 }
 
 void SpriteManager::touchSpriteQueue() {
-	g_flag_drawSequences = true;
+	_drawSequencesFlag = true;
 }
 
 void SpriteManager::drawSprite(Sprite *sprite) {
 	if (sprite) {
-		Sprite *queue = g_frameQueue;
+		Sprite *queue = _frameQueue;
 
 		while (queue) {
 			if (queue == sprite)
@@ -216,15 +216,15 @@ void SpriteManager::drawSprite(Sprite *sprite) {
 			queue = queue->nextSprite;
 		}
 
-		g_flag_drawSequences = true;
+		_drawSequencesFlag = true;
 
-		if (g_frameQueue) {
+		if (_frameQueue) {
 			bool insertedInQueue = false;
 
-			if (sprite->hotspotPriority <= g_frameQueue->hotspotPriority) {
-				queue = g_frameQueue;
+			if (sprite->hotspotPriority <= _frameQueue->hotspotPriority) {
+				queue = _frameQueue;
 
-				for (Sprite *i = g_frameQueue->nextSprite; !insertedInQueue && i; i = i->nextSprite) {
+				for (Sprite *i = _frameQueue->nextSprite; !insertedInQueue && i; i = i->nextSprite) {
 					if (sprite->hotspotPriority > i->hotspotPriority) {
 						queue->nextSprite = sprite;
 						sprite->nextSprite = i;
@@ -240,18 +240,18 @@ void SpriteManager::drawSprite(Sprite *sprite) {
 				}
 
 			} else {
-				sprite->nextSprite = g_frameQueue;
-				g_frameQueue = sprite;
+				sprite->nextSprite = _frameQueue;
+				_frameQueue = sprite;
 			}
 		} else {
-			g_frameQueue = sprite;
+			_frameQueue = sprite;
 			sprite->nextSprite = nullptr;
 		}
 	}
 }
 
 void SpriteManager::removeSprite(Sprite *sprite) {
-	Sprite *queue = g_frameQueue;
+	Sprite *queue = _frameQueue;
 	Sprite *spriteToRemove = nullptr;
 
 	if (sprite) {
@@ -264,10 +264,10 @@ void SpriteManager::removeSprite(Sprite *sprite) {
 			if (spriteToRemove) {
 				spriteToRemove->nextSprite = queue->nextSprite;
 			} else {
-				g_frameQueue = queue->nextSprite;
+				_frameQueue = queue->nextSprite;
 			}
 
-			g_flag_drawSequences = true;
+			_drawSequencesFlag = true;
 		}
 	}
 }
diff --git a/engines/lastexpress/data/sprites.h b/engines/lastexpress/data/sprites.h
index dfb200fe976..151b774f7d7 100644
--- a/engines/lastexpress/data/sprites.h
+++ b/engines/lastexpress/data/sprites.h
@@ -78,10 +78,10 @@ public:
 private:
 	LastExpressEngine *_engine = nullptr;
 
-	bool g_flag_drawSequences = false;
-	Sprite *g_frameQueue = nullptr;
-	bool g_flag_coordinates_set = false;
-	Extent g_eraseRect = Extent(640, 480, 0, 0, 0, 0);
+	bool _drawSequencesFlag = false;
+	Sprite *_frameQueue = nullptr;
+	bool _coordinatesAreSet = false;
+	Extent _eraseRect = Extent(640, 480, 0, 0, 0, 0);
 };
 
 } // End of namespace LastExpress


Commit: d53d6f851d1463d451f019fc96fac557792b00c8
    https://github.com/scummvm/scummvm/commit/d53d6f851d1463d451f019fc96fac557792b00c8
Author: AndywinXp (andywinxp at gmail.com)
Date: 2025-06-16T23:12:18+02:00

Commit Message:
LASTEXPRESS: More clean-up

Changed paths:
    engines/lastexpress/characters/abbot.cpp
    engines/lastexpress/characters/alexei.cpp
    engines/lastexpress/characters/anna.cpp
    engines/lastexpress/characters/august.cpp
    engines/lastexpress/characters/clerk.cpp
    engines/lastexpress/characters/cond1.cpp
    engines/lastexpress/characters/cond2.cpp
    engines/lastexpress/characters/cook.cpp
    engines/lastexpress/characters/demo/demo_anna.cpp
    engines/lastexpress/characters/demo/demo_francois.cpp
    engines/lastexpress/characters/demo/demo_madame.cpp
    engines/lastexpress/characters/demo/demo_master.cpp
    engines/lastexpress/characters/demo/demo_tatiana.cpp
    engines/lastexpress/characters/demo/demo_vesna.cpp
    engines/lastexpress/characters/francois.cpp
    engines/lastexpress/characters/headwait.cpp
    engines/lastexpress/characters/ivo.cpp
    engines/lastexpress/characters/kahina.cpp
    engines/lastexpress/characters/kronos.cpp
    engines/lastexpress/characters/madame.cpp
    engines/lastexpress/characters/mahmud.cpp
    engines/lastexpress/characters/master.cpp
    engines/lastexpress/characters/max.cpp
    engines/lastexpress/characters/milos.cpp
    engines/lastexpress/characters/monsieur.cpp
    engines/lastexpress/characters/police.cpp
    engines/lastexpress/characters/rebecca.cpp
    engines/lastexpress/characters/tablec.cpp
    engines/lastexpress/characters/tatiana.cpp
    engines/lastexpress/characters/trainm.cpp
    engines/lastexpress/characters/vassili.cpp
    engines/lastexpress/characters/vesna.cpp
    engines/lastexpress/characters/waiter1.cpp
    engines/lastexpress/characters/yasmin.cpp
    engines/lastexpress/data/archive.cpp
    engines/lastexpress/data/cvcrfile.h
    engines/lastexpress/data/gold_archive.cpp
    engines/lastexpress/debug.cpp
    engines/lastexpress/fight/fight.cpp
    engines/lastexpress/game/action.cpp
    engines/lastexpress/game/beetle.cpp
    engines/lastexpress/game/logic.cpp
    engines/lastexpress/game/logic.h
    engines/lastexpress/game/navigation.cpp
    engines/lastexpress/game/otis.cpp
    engines/lastexpress/game/savegame.cpp
    engines/lastexpress/game/vcr.cpp
    engines/lastexpress/graphics.cpp
    engines/lastexpress/lastexpress.cpp
    engines/lastexpress/lastexpress.h
    engines/lastexpress/memory.cpp
    engines/lastexpress/menu/menu.cpp
    engines/lastexpress/shared.h
    engines/lastexpress/sound/sound.cpp


diff --git a/engines/lastexpress/characters/abbot.cpp b/engines/lastexpress/characters/abbot.cpp
index 473f1b79939..066aca1e789 100644
--- a/engines/lastexpress/characters/abbot.cpp
+++ b/engines/lastexpress/characters/abbot.cpp
@@ -316,17 +316,17 @@ void LogicManager::HAND_Abbot_DoWaitReal(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
 		if (getCharacterCurrentParams(kCharacterAbbot)[1]) {
-			if (getCharacterCurrentParams(kCharacterAbbot)[1] >= _currentGameSessionTicks)
+			if (getCharacterCurrentParams(kCharacterAbbot)[1] >= _realTime)
 				break;
 
 			getCharacterCurrentParams(kCharacterAbbot)[1] = 0x7FFFFFFF;
 		} else {
-			getCharacterCurrentParams(kCharacterAbbot)[1] = _currentGameSessionTicks + getCharacterCurrentParams(kCharacterAbbot)[0];
+			getCharacterCurrentParams(kCharacterAbbot)[1] = _realTime + getCharacterCurrentParams(kCharacterAbbot)[0];
 
-			if (_currentGameSessionTicks + getCharacterCurrentParams(kCharacterAbbot)[0] == 0)
+			if (_realTime + getCharacterCurrentParams(kCharacterAbbot)[0] == 0)
 				break;
 
-			if (getCharacterCurrentParams(kCharacterAbbot)[1] >= _currentGameSessionTicks)
+			if (getCharacterCurrentParams(kCharacterAbbot)[1] >= _realTime)
 				break;
 
 			getCharacterCurrentParams(kCharacterAbbot)[1] = 0x7FFFFFFF;
@@ -437,7 +437,7 @@ void LogicManager::HAND_Abbot_DoWalk(HAND_PARAMS) {
 			break;
 		}
 
-		if (_gameEvents[kEventAbbotIntroduction]) {
+		if (_doneNIS[kEventAbbotIntroduction]) {
 			playDialog(kCharacterCath, "CAT1013", -1, 0);
 		} else {
 			playCathExcuseMe();
@@ -859,7 +859,7 @@ void LogicManager::HAND_Abbot_EatingLunch(HAND_PARAMS) {
 	case 12:
 		startCycOtis(kCharacterAbbot, "029E");
 
-		if (!_gameEvents[kEventAbbotIntroduction])
+		if (!_doneNIS[kEventAbbotIntroduction])
 			getCharacter(kCharacterAbbot).inventoryItem = kItemInvalid;
 
 		break;
@@ -1802,7 +1802,7 @@ void LogicManager::HAND_Abbot_DoWalkSearchingForCath(HAND_PARAMS) {
 			getCharacter(kCharacterAbbot).currentCall--;
 			_engine->getMessageManager()->setMessageHandle(kCharacterAbbot, _functionsAbbot[getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall]]);
 			fedEx(kCharacterAbbot, kCharacterAbbot, 18, 0);
-		} else if (!_gameEvents[kEventAbbotInvitationDrink] && nearChar(kCharacterAbbot, kCharacterCath, 1000) && !inComp(kCharacterCath) && !whoOutside(kCharacterCath)) {
+		} else if (!_doneNIS[kEventAbbotInvitationDrink] && nearChar(kCharacterAbbot, kCharacterCath, 1000) && !inComp(kCharacterCath) && !whoOutside(kCharacterCath)) {
 			if (getCharacter(kCharacterAbbot).characterPosition.car == kCarGreenSleeping || getCharacter(kCharacterAbbot).characterPosition.car == kCarRedSleeping) {
 				getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 1;
 				AbbotCall(&LogicManager::CONS_Abbot_SaveGame, 2, kEventAbbotInvitationDrink, 0, 0);
@@ -1973,8 +1973,8 @@ void LogicManager::HAND_Abbot_InComp(HAND_PARAMS) {
 		}
 
 		if (getCharacterCurrentParams(kCharacterAbbot)[2]) {
-			if (getCharacterCurrentParams(kCharacterAbbot)[5] || (getCharacterCurrentParams(kCharacterAbbot)[5] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
-				if (getCharacterCurrentParams(kCharacterAbbot)[5] >= _currentGameSessionTicks)
+			if (getCharacterCurrentParams(kCharacterAbbot)[5] || (getCharacterCurrentParams(kCharacterAbbot)[5] = _realTime + 75, _realTime != -75)) {
+				if (getCharacterCurrentParams(kCharacterAbbot)[5] >= _realTime)
 					break;
 
 				getCharacterCurrentParams(kCharacterAbbot)[5] = 0x7FFFFFFF;
@@ -2042,8 +2042,8 @@ void LogicManager::HAND_Abbot_InComp(HAND_PARAMS) {
 			}
 
 			if (getCharacterCurrentParams(kCharacterAbbot)[2]) {
-				if (getCharacterCurrentParams(kCharacterAbbot)[5] || (getCharacterCurrentParams(kCharacterAbbot)[5] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
-					if (getCharacterCurrentParams(kCharacterAbbot)[5] >= _currentGameSessionTicks)
+				if (getCharacterCurrentParams(kCharacterAbbot)[5] || (getCharacterCurrentParams(kCharacterAbbot)[5] = _realTime + 75, _realTime != -75)) {
+					if (getCharacterCurrentParams(kCharacterAbbot)[5] >= _realTime)
 						break;
 
 					getCharacterCurrentParams(kCharacterAbbot)[5] = 0x7FFFFFFF;
@@ -2310,7 +2310,7 @@ void LogicManager::HAND_Abbot_AfterBomb(HAND_PARAMS) {
 			startCycOtis(13, "126B");
 			break;
 		case 4:
-			if (!_gameEvents[kEventAbbotDrinkDefuse] && getCharacterParams(kCharacterAbbot, 8)[0])
+			if (!_doneNIS[kEventAbbotDrinkDefuse] && getCharacterParams(kCharacterAbbot, 8)[0])
 				getCharacter(kCharacterAbbot).inventoryItem = kItemInvalid;
 
 			startCycOtis(kCharacterAbbot, "126B");
@@ -2371,8 +2371,8 @@ void LogicManager::CONS_Abbot_CatchCath(CONS_PARAMS) {
 void LogicManager::HAND_Abbot_CatchCath(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
-		if (getCharacterCurrentParams(kCharacterAbbot)[0] || (getCharacterCurrentParams(kCharacterAbbot)[0] = _currentGameSessionTicks + 150, _currentGameSessionTicks != -150)) {
-			if (getCharacterCurrentParams(kCharacterAbbot)[0] >= _currentGameSessionTicks)
+		if (getCharacterCurrentParams(kCharacterAbbot)[0] || (getCharacterCurrentParams(kCharacterAbbot)[0] = _realTime + 150, _realTime != -150)) {
+			if (getCharacterCurrentParams(kCharacterAbbot)[0] >= _realTime)
 				break;
 
 			getCharacterCurrentParams(kCharacterAbbot)[0] = 0x7FFFFFFF;
@@ -2545,10 +2545,10 @@ void LogicManager::HAND_Abbot_RunningTrain(HAND_PARAMS) {
 
 		break;
 	case 168646401:
-		if (!_gameEvents[kEventLocomotiveAbbotGetSomeRest]) {
+		if (!_doneNIS[kEventLocomotiveAbbotGetSomeRest]) {
 			getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 1;
 			AbbotCall(&LogicManager::CONS_Abbot_SaveGame, 2, kEventLocomotiveAbbotGetSomeRest, 0, 0);
-		} else if (!_gameEvents[kEventLocomotiveAbbotShoveling]) {
+		} else if (!_doneNIS[kEventLocomotiveAbbotShoveling]) {
 			getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 2;
 			AbbotCall(&LogicManager::CONS_Abbot_SaveGame, 2, kEventLocomotiveAbbotShoveling, 0, 0);
 		} else {
diff --git a/engines/lastexpress/characters/alexei.cpp b/engines/lastexpress/characters/alexei.cpp
index 8f45bd11f1d..2765c5577ce 100644
--- a/engines/lastexpress/characters/alexei.cpp
+++ b/engines/lastexpress/characters/alexei.cpp
@@ -380,7 +380,7 @@ void LogicManager::HAND_Alexei_DoWalk(HAND_PARAMS) {
 			break;
 		}
 
-		if (_gameEvents[kEventAlexeiSalonVassili] || _gameEvents[kEventTatianaAskMatchSpeakRussian] && cathHasItem(kItemPassengerList)) {
+		if (_doneNIS[kEventAlexeiSalonVassili] || _doneNIS[kEventTatianaAskMatchSpeakRussian] && cathHasItem(kItemPassengerList)) {
 			if (rnd(2) == 0) {
 				playDialog(kCharacterCath, "CAT1012A", -1, 0);
 			} else {
@@ -621,8 +621,8 @@ void LogicManager::HAND_Alexei_CompLogic(HAND_PARAMS) {
 			fedEx(kCharacterAlexei, kCharacterAlexei, 18, 0);
 		} else {
 			if (getCharacterCurrentParams(kCharacterAlexei)[4]) {
-				if (getCharacterCurrentParams(kCharacterAlexei)[8] || (getCharacterCurrentParams(kCharacterAlexei)[8] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
-					if (getCharacterCurrentParams(kCharacterAlexei)[8] >= _currentGameSessionTicks)
+				if (getCharacterCurrentParams(kCharacterAlexei)[8] || (getCharacterCurrentParams(kCharacterAlexei)[8] = _realTime + 75, _realTime != -75)) {
+					if (getCharacterCurrentParams(kCharacterAlexei)[8] >= _realTime)
 						break;
 
 					getCharacterCurrentParams(kCharacterAlexei)[8] = 0x7FFFFFFF;
@@ -804,8 +804,8 @@ void LogicManager::HAND_Alexei_AtDinner(HAND_PARAMS) {
 			AlexeiCall(&LogicManager::CONS_Alexei_DoJoinedSeqOtis, "005D", 34, 103798704, "005E");
 		} else {
 			if (getCharacterCurrentParams(kCharacterAlexei)[0]) {
-				if (getCharacterCurrentParams(kCharacterAlexei)[2] || (getCharacterCurrentParams(kCharacterAlexei)[2] = _currentGameSessionTicks + 90, _currentGameSessionTicks != -90)) {
-					if (getCharacterCurrentParams(kCharacterAlexei)[2] >= _currentGameSessionTicks)
+				if (getCharacterCurrentParams(kCharacterAlexei)[2] || (getCharacterCurrentParams(kCharacterAlexei)[2] = _realTime + 90, _realTime != -90)) {
+					if (getCharacterCurrentParams(kCharacterAlexei)[2] >= _realTime)
 						break;
 
 					getCharacterCurrentParams(kCharacterAlexei)[2] = 0x7FFFFFFF;
@@ -838,7 +838,7 @@ void LogicManager::HAND_Alexei_AtDinner(HAND_PARAMS) {
 			releaseView(kCharacterAlexei, kCarRestaurant, 63);
 			CONS_Alexei_ReturnComp(0, 0, 0, 0);
 		} else if (getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] == 2) {
-			if (_gameProgress[kProgressJacket] == 2)
+			if (_globals[kProgressJacket] == 2)
 				playNIS(kEventAlexeiDiner);
 			else
 				playNIS(kEventAlexeiDinerOriginalJacket);
@@ -847,7 +847,7 @@ void LogicManager::HAND_Alexei_AtDinner(HAND_PARAMS) {
 			getCharacter(kCharacterAlexei).characterPosition.position = 3650;
 			getCharacter(kCharacterAlexei).characterPosition.location = 0;
 			endGraphics(kCharacterAlexei);
-			_gameInventory[kItem17].location = 1;
+			_items[kItem17].floating = 1;
 			bumpCath(kCarRestaurant, 63, 255);
 			CONS_Alexei_ReturnComp(0, 0, 0, 0);
 		}
@@ -1026,7 +1026,7 @@ void LogicManager::HAND_Alexei_Sitting(HAND_PARAMS) {
 		startCycOtis(kCharacterAlexei, "103B");
 		getCharacterCurrentParams(kCharacterAlexei)[0] = 225 * (4 * rnd(3) + 4);
 
-		if (!_gameEvents[kEventAlexeiSalonPoem])
+		if (!_doneNIS[kEventAlexeiSalonPoem])
 			getCharacter(kCharacterAlexei).inventoryItem = 10;
 
 		break;
@@ -1111,7 +1111,7 @@ void LogicManager::HAND_Alexei_StandingAtWindow(HAND_PARAMS) {
 	case 12:
 		getCharacterCurrentParams(kCharacterAlexei)[0] = 225 * (4 * rnd(4) + 8);
 		startCycOtis(kCharacterAlexei, "103E");
-		if (!_gameEvents[kEventAlexeiSalonPoem])
+		if (!_doneNIS[kEventAlexeiSalonPoem])
 			getCharacter(kCharacterAlexei).inventoryItem = 10;
 
 		break;
@@ -1159,7 +1159,7 @@ void LogicManager::CONS_Alexei_WaitingForTat(CONS_PARAMS) {
 void LogicManager::HAND_Alexei_WaitingForTat(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
-		if (!inDiningRoom(kCharacterTatiana) || _gameEvents[kEventAlexeiSalonPoem]) {
+		if (!inDiningRoom(kCharacterTatiana) || _doneNIS[kEventAlexeiSalonPoem]) {
 			getCharacter(kCharacterAlexei).inventoryItem = 0;
 		} else {
 			getCharacter(kCharacterAlexei).inventoryItem = 10;
@@ -1223,7 +1223,7 @@ void LogicManager::HAND_Alexei_Upset(HAND_PARAMS) {
 		AlexeiCall(&LogicManager::CONS_Alexei_SaveGame, 2, kEventAlexeiSalonCath, 0, 0);
 		break;
 	case 12:
-		if (_gameEvents[kEventAlexeiSalonVassili])
+		if (_doneNIS[kEventAlexeiSalonVassili])
 			getCharacter(kCharacterAlexei).inventoryItem = 0x80;
 
 		break;
@@ -1468,7 +1468,7 @@ void LogicManager::HAND_Alexei_AtBreakfast(HAND_PARAMS) {
 			startCycOtis(kCharacterAlexei, "018E");
 
 			if (inDiningRoom(kCharacterCath))
-				_gameProgress[kProgressField68] = 1;
+				_globals[kProgressField68] = 1;
 
 			getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 2;
 			AlexeiCall(&LogicManager::CONS_Alexei_DoDialog, "TAT2116", 0, 0, 0);
@@ -1789,9 +1789,9 @@ void LogicManager::HAND_Alexei_GoSalon3(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
 		if (!getCharacterCurrentParams(kCharacterAlexei)[2] && !getCharacterCurrentParams(kCharacterAlexei)[1]) {
-			if (getCharacterCurrentParams(kCharacterAlexei)[3] || (getCharacterCurrentParams(kCharacterAlexei)[3] = _currentGameSessionTicks + getCharacterCurrentParams(kCharacterAlexei)[0],
-																   _currentGameSessionTicks + getCharacterCurrentParams(kCharacterAlexei)[0] != 0)) {
-				if (getCharacterCurrentParams(kCharacterAlexei)[3] >= _currentGameSessionTicks)
+			if (getCharacterCurrentParams(kCharacterAlexei)[3] || (getCharacterCurrentParams(kCharacterAlexei)[3] = _realTime + getCharacterCurrentParams(kCharacterAlexei)[0],
+																   _realTime + getCharacterCurrentParams(kCharacterAlexei)[0] != 0)) {
+				if (getCharacterCurrentParams(kCharacterAlexei)[3] >= _realTime)
 					break;
 
 				getCharacterCurrentParams(kCharacterAlexei)[3] = 0x7FFFFFFF;
diff --git a/engines/lastexpress/characters/anna.cpp b/engines/lastexpress/characters/anna.cpp
index 0fb0e6e80d6..b9af64ca4b5 100644
--- a/engines/lastexpress/characters/anna.cpp
+++ b/engines/lastexpress/characters/anna.cpp
@@ -372,7 +372,7 @@ void LogicManager::HAND_Anna_DoWalk(HAND_PARAMS) {
 
 		break;
 	case 5:
-		if (_gameEvents[kEventAugustPresentAnna] || _gameEvents[kEventAugustPresentAnnaFirstIntroduction] || _gameProgress[kProgressChapter] >= 2) {
+		if (_doneNIS[kEventAugustPresentAnna] || _doneNIS[kEventAugustPresentAnnaFirstIntroduction] || _globals[kProgressChapter] >= 2) {
 			playDialog(kCharacterCath, "CAT1001", -1, 0);
 		} else {
 			playCathExcuseMe();
@@ -439,8 +439,8 @@ void LogicManager::HAND_Anna_PracticeMusic(HAND_PARAMS) {
 			bool skip = false; // Horrible way to unroll a goto...
 
 			if (!getCharacterCurrentParams(kCharacterAnna)[6]) {
-				getCharacterCurrentParams(kCharacterAnna)[6] = _currentGameSessionTicks + 75;
-				if (_currentGameSessionTicks == -75) {
+				getCharacterCurrentParams(kCharacterAnna)[6] = _realTime + 75;
+				if (_realTime == -75) {
 					skip = true;
 					send(kCharacterAnna, kCharacterAnna, 2, 0);
 					getCharacterCurrentParams(kCharacterAnna)[5] = 0;
@@ -448,7 +448,7 @@ void LogicManager::HAND_Anna_PracticeMusic(HAND_PARAMS) {
 				}
 			}
 
-			if (!skip && getCharacterCurrentParams(kCharacterAnna)[6] < _currentGameSessionTicks) {
+			if (!skip && getCharacterCurrentParams(kCharacterAnna)[6] < _realTime) {
 				getCharacterCurrentParams(kCharacterAnna)[6] = 0x7FFFFFFF;
 				send(kCharacterAnna, kCharacterAnna, 2, 0);
 				getCharacterCurrentParams(kCharacterAnna)[5] = 0;
@@ -457,8 +457,8 @@ void LogicManager::HAND_Anna_PracticeMusic(HAND_PARAMS) {
 		}
 
 		if (getCharacterCurrentParams(kCharacterAnna)[3]) {
-			if (getCharacterCurrentParams(kCharacterAnna)[7] || (getCharacterCurrentParams(kCharacterAnna)[7] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
-				if (getCharacterCurrentParams(kCharacterAnna)[7] >= _currentGameSessionTicks)
+			if (getCharacterCurrentParams(kCharacterAnna)[7] || (getCharacterCurrentParams(kCharacterAnna)[7] = _realTime + 75, _realTime != -75)) {
+				if (getCharacterCurrentParams(kCharacterAnna)[7] >= _realTime)
 					break;
 
 				getCharacterCurrentParams(kCharacterAnna)[7] = 0x7FFFFFFF;
@@ -682,9 +682,9 @@ void LogicManager::HAND_Anna_DoWaitReal(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
 		if (getCharacterCurrentParams(kCharacterAnna)[1] ||
-			(getCharacterCurrentParams(kCharacterAnna)[1] = _currentGameSessionTicks + getCharacterCurrentParams(kCharacterAnna)[0],
-			_currentGameSessionTicks + getCharacterCurrentParams(kCharacterAnna)[0] != 0)) {
-			if (getCharacterCurrentParams(kCharacterAnna)[1] >= _currentGameSessionTicks)
+			(getCharacterCurrentParams(kCharacterAnna)[1] = _realTime + getCharacterCurrentParams(kCharacterAnna)[0],
+			_realTime + getCharacterCurrentParams(kCharacterAnna)[0] != 0)) {
+			if (getCharacterCurrentParams(kCharacterAnna)[1] >= _realTime)
 				break;
 
 			getCharacterCurrentParams(kCharacterAnna)[1] = 0x7FFFFFFF;
@@ -728,8 +728,8 @@ void LogicManager::HAND_Anna_CompLogic(HAND_PARAMS) {
 		}
 
 		if (getCharacterCurrentParams(kCharacterAnna)[4]) {
-			if (getCharacterCurrentParams(kCharacterAnna)[7] || (getCharacterCurrentParams(kCharacterAnna)[7] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
-				if (getCharacterCurrentParams(kCharacterAnna)[7] >= _currentGameSessionTicks)
+			if (getCharacterCurrentParams(kCharacterAnna)[7] || (getCharacterCurrentParams(kCharacterAnna)[7] = _realTime + 75, _realTime != -75)) {
+				if (getCharacterCurrentParams(kCharacterAnna)[7] >= _realTime)
 					break;
 
 				getCharacterCurrentParams(kCharacterAnna)[7] = 0x7FFFFFFF;
@@ -925,7 +925,7 @@ void LogicManager::HAND_Anna_DoWalkP1(HAND_PARAMS) {
 
 		break;
 	case 5:
-		if (_gameEvents[kEventAugustPresentAnna] || _gameEvents[kEventAugustPresentAnnaFirstIntroduction] || _gameProgress[kProgressChapter] >= 2) {
+		if (_doneNIS[kEventAugustPresentAnna] || _doneNIS[kEventAugustPresentAnnaFirstIntroduction] || _globals[kProgressChapter] >= 2) {
 			playDialog(kCharacterCath, "CAT1001", -1, 0);
 		} else {
 			playCathExcuseMe();
@@ -937,11 +937,11 @@ void LogicManager::HAND_Anna_DoWalkP1(HAND_PARAMS) {
 		break;
 	case 12:
 		getCharacter(kCharacterAnna).inventoryItem = 0;
-		if (_gameProgress[kProgressJacket] == 2 && !_gameEvents[kEventGotALight] && !_gameEvents[kEventGotALightD] && !_gameEvents[kEventAugustPresentAnna] && !_gameEvents[kEventAugustPresentAnnaFirstIntroduction]) {
+		if (_globals[kProgressJacket] == 2 && !_doneNIS[kEventGotALight] && !_doneNIS[kEventGotALightD] && !_doneNIS[kEventAugustPresentAnna] && !_doneNIS[kEventAugustPresentAnnaFirstIntroduction]) {
 			getCharacterCurrentParams(kCharacterAnna)[2] = 128;
 		}
 
-		if (_gameProgress[kProgressJacket] == 2 && !getCharacterCurrentParams(kCharacterAnna)[2] && !_gameEvents[kEventAnnaGiveScarfAsk] && !_gameEvents[kEventAnnaGiveScarfDinerAsk] && !_gameEvents[kEventAnnaGiveScarfSalonAsk]) {
+		if (_globals[kProgressJacket] == 2 && !getCharacterCurrentParams(kCharacterAnna)[2] && !_doneNIS[kEventAnnaGiveScarfAsk] && !_doneNIS[kEventAnnaGiveScarfDinerAsk] && !_doneNIS[kEventAnnaGiveScarfSalonAsk]) {
 			getCharacterCurrentParams(kCharacterAnna)[2] = 8;
 		}
 
@@ -954,9 +954,9 @@ void LogicManager::HAND_Anna_DoWalkP1(HAND_PARAMS) {
 		break;
 	case 18:
 		if (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 1) {
-			if (_gameEvents[kEventAnnaGiveScarf] || _gameEvents[kEventAnnaGiveScarfDiner] || _gameEvents[kEventAnnaGiveScarfSalon] || _gameEvents[kEventAnnaGiveScarfMonogram] || _gameEvents[kEventAnnaGiveScarfDinerMonogram] || _gameEvents[kEventAnnaGiveScarfSalonMonogram]) {
+			if (_doneNIS[kEventAnnaGiveScarf] || _doneNIS[kEventAnnaGiveScarfDiner] || _doneNIS[kEventAnnaGiveScarfSalon] || _doneNIS[kEventAnnaGiveScarfMonogram] || _doneNIS[kEventAnnaGiveScarfDinerMonogram] || _doneNIS[kEventAnnaGiveScarfSalonMonogram]) {
 				playNIS(kEventAnnaGiveScarfAsk);
-			} else if (_gameEvents[kEventAugustPresentAnna] || _gameEvents[kEventAugustPresentAnnaFirstIntroduction]) {
+			} else if (_doneNIS[kEventAugustPresentAnna] || _doneNIS[kEventAugustPresentAnnaFirstIntroduction]) {
 				playNIS(kEventAnnaGiveScarfMonogram);
 			} else {
 				playNIS(kEventAnnaGiveScarf);
@@ -979,7 +979,7 @@ void LogicManager::HAND_Anna_DoWalkP1(HAND_PARAMS) {
 
 			int32 tmp = getCharacterCurrentParams(kCharacterAnna)[2] & 0xFFFFFF7F;
 			getCharacterCurrentParams(kCharacterAnna)[2] = tmp;
-			if (_gameProgress[kProgressJacket] == 2 && !_gameEvents[kEventAnnaGiveScarfAsk] && !_gameEvents[kEventAnnaGiveScarfDinerAsk] && !_gameEvents[kEventAnnaGiveScarfSalonAsk])
+			if (_globals[kProgressJacket] == 2 && !_doneNIS[kEventAnnaGiveScarfAsk] && !_doneNIS[kEventAnnaGiveScarfDinerAsk] && !_doneNIS[kEventAnnaGiveScarfSalonAsk])
 				getCharacterCurrentParams(kCharacterAnna)[2] = tmp | 8;
 
 			if (getCharacter(kCharacterAnna).direction != 1) {
@@ -1022,8 +1022,8 @@ void LogicManager::HAND_Anna_DiningLogic(HAND_PARAMS) {
 			if (getCharacterCurrentParams(kCharacterAnna)[5] || (getCharacterCurrentParams(kCharacterAnna)[5] = _gameTime + 900, _gameTime != -900)) {
 				if (getCharacterCurrentParams(kCharacterAnna)[5] >= _gameTime) {
 					if (getCharacterCurrentParams(kCharacterAnna)[2]) {
-						if (getCharacterCurrentParams(kCharacterAnna)[6] || (getCharacterCurrentParams(kCharacterAnna)[6] = _currentGameSessionTicks + 90, _currentGameSessionTicks != -90)) {
-							if (getCharacterCurrentParams(kCharacterAnna)[6] >= _currentGameSessionTicks)
+						if (getCharacterCurrentParams(kCharacterAnna)[6] || (getCharacterCurrentParams(kCharacterAnna)[6] = _realTime + 90, _realTime != -90)) {
+							if (getCharacterCurrentParams(kCharacterAnna)[6] >= _realTime)
 								break;
 
 							getCharacterCurrentParams(kCharacterAnna)[6] = 0x7FFFFFFF;
@@ -1045,8 +1045,8 @@ void LogicManager::HAND_Anna_DiningLogic(HAND_PARAMS) {
 		}
 
 		if (getCharacterCurrentParams(kCharacterAnna)[2]) {
-			if (getCharacterCurrentParams(kCharacterAnna)[6] || (getCharacterCurrentParams(kCharacterAnna)[6] = _currentGameSessionTicks + 90, _currentGameSessionTicks != -90)) {
-				if (getCharacterCurrentParams(kCharacterAnna)[6] >= _currentGameSessionTicks)
+			if (getCharacterCurrentParams(kCharacterAnna)[6] || (getCharacterCurrentParams(kCharacterAnna)[6] = _realTime + 90, _realTime != -90)) {
+				if (getCharacterCurrentParams(kCharacterAnna)[6] >= _realTime)
 					break;
 
 				getCharacterCurrentParams(kCharacterAnna)[6] = 0x7FFFFFFF;
@@ -1069,11 +1069,11 @@ void LogicManager::HAND_Anna_DiningLogic(HAND_PARAMS) {
 
 		break;
 	case 12:
-		if (_gameProgress[kProgressJacket] == 2 && !_gameEvents[kEventDinerMindJoin] && !_gameEvents[kEventAugustPresentAnna] && !_gameEvents[kEventAugustPresentAnnaFirstIntroduction]) {
+		if (_globals[kProgressJacket] == 2 && !_doneNIS[kEventDinerMindJoin] && !_doneNIS[kEventAugustPresentAnna] && !_doneNIS[kEventAugustPresentAnnaFirstIntroduction]) {
 			getCharacterCurrentParams(kCharacterAnna)[1] |= 0x80;
 		}
 
-		if (_gameProgress[kProgressJacket] == 2 && !getCharacterCurrentParams(kCharacterAnna)[1] && !_gameEvents[kEventAnnaGiveScarfAsk] && !_gameEvents[kEventAnnaGiveScarfDinerAsk] && !_gameEvents[kEventAnnaGiveScarfSalonAsk]) {
+		if (_globals[kProgressJacket] == 2 && !getCharacterCurrentParams(kCharacterAnna)[1] && !_doneNIS[kEventAnnaGiveScarfAsk] && !_doneNIS[kEventAnnaGiveScarfDinerAsk] && !_doneNIS[kEventAnnaGiveScarfSalonAsk]) {
 			getCharacterCurrentParams(kCharacterAnna)[1] = 8;
 		}
 
@@ -1084,10 +1084,10 @@ void LogicManager::HAND_Anna_DiningLogic(HAND_PARAMS) {
 		break;
 	case 18:
 		if (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 1) {
-			if (_gameEvents[kEventAnnaGiveScarf] || _gameEvents[kEventAnnaGiveScarfDiner] || _gameEvents[kEventAnnaGiveScarfSalon] || _gameEvents[kEventAnnaGiveScarfMonogram] || _gameEvents[kEventAnnaGiveScarfDinerMonogram] || _gameEvents[kEventAnnaGiveScarfSalonMonogram]) {
+			if (_doneNIS[kEventAnnaGiveScarf] || _doneNIS[kEventAnnaGiveScarfDiner] || _doneNIS[kEventAnnaGiveScarfSalon] || _doneNIS[kEventAnnaGiveScarfMonogram] || _doneNIS[kEventAnnaGiveScarfDinerMonogram] || _doneNIS[kEventAnnaGiveScarfSalonMonogram]) {
 				playNIS(kEventAnnaGiveScarfDinerAsk);
 			} else {
-				if (_gameEvents[kEventAugustPresentAnna] || _gameEvents[kEventAugustPresentAnnaFirstIntroduction])
+				if (_doneNIS[kEventAugustPresentAnna] || _doneNIS[kEventAugustPresentAnnaFirstIntroduction])
 					playNIS(kEventAnnaGiveScarfDinerMonogram);
 				else
 					playNIS(kEventAnnaGiveScarfDiner);
@@ -1104,7 +1104,7 @@ void LogicManager::HAND_Anna_DiningLogic(HAND_PARAMS) {
 			int32 tmp = getCharacterCurrentParams(kCharacterAnna)[1] & 0xFFFFFF7F;
 			getCharacterCurrentParams(kCharacterAnna)[1] = tmp;
 
-			if (_gameProgress[kProgressJacket] == 2 && !_gameEvents[kEventAnnaGiveScarfAsk] && !_gameEvents[kEventAnnaGiveScarfDinerAsk] && !_gameEvents[kEventAnnaGiveScarfSalonAsk]) {
+			if (_globals[kProgressJacket] == 2 && !_doneNIS[kEventAnnaGiveScarfAsk] && !_doneNIS[kEventAnnaGiveScarfDinerAsk] && !_doneNIS[kEventAnnaGiveScarfSalonAsk]) {
 				getCharacterCurrentParams(kCharacterAnna)[1] = tmp | 8;
 			}
 
@@ -1378,7 +1378,7 @@ void LogicManager::HAND_Anna_EatingDinner(HAND_PARAMS) {
 	switch (msg->action) {
 	case 12:
 		startCycOtis(kCharacterAnna, "001J");
-		_gameProgress[kProgressField28] = 1;
+		_globals[kProgressField28] = 1;
 		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
 		AnnaCall(&LogicManager::CONS_Anna_DiningLogic, 0, 0, 0, 0);
 
@@ -1480,7 +1480,7 @@ void LogicManager::HAND_Anna_FreshenUp(HAND_PARAMS) {
 	case 18:
 		if (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 1 ||
 			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 2) {
-			if (_gameProgress[kProgressField14] == 29) {
+			if (_globals[kProgressField14] == 29) {
 				getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = _gameTime + 900;
 				getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 2;
 				AnnaCall(&LogicManager::CONS_Anna_CompLogic, getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8], "NONE", 0, 0);
@@ -1560,8 +1560,8 @@ void LogicManager::HAND_Anna_WaitAugust(HAND_PARAMS) {
 			if (getCharacterCurrentParams(kCharacterAnna)[2] || (getCharacterCurrentParams(kCharacterAnna)[2] = _gameTime + 900, _gameTime != -900)) {
 				if (getCharacterCurrentParams(kCharacterAnna)[2] >= _gameTime) {
 					if (getCharacterCurrentParams(kCharacterAnna)[0]) {
-						if (getCharacterCurrentParams(kCharacterAnna)[3] || (getCharacterCurrentParams(kCharacterAnna)[3] = _currentGameSessionTicks + 90, _currentGameSessionTicks != -90)) {
-							if (getCharacterCurrentParams(kCharacterAnna)[3] >= _currentGameSessionTicks)
+						if (getCharacterCurrentParams(kCharacterAnna)[3] || (getCharacterCurrentParams(kCharacterAnna)[3] = _realTime + 90, _realTime != -90)) {
+							if (getCharacterCurrentParams(kCharacterAnna)[3] >= _realTime)
 								break;
 
 							getCharacterCurrentParams(kCharacterAnna)[3] = 0x7FFFFFFF;
@@ -1584,8 +1584,8 @@ void LogicManager::HAND_Anna_WaitAugust(HAND_PARAMS) {
 		}
 
 		if (getCharacterCurrentParams(kCharacterAnna)[0]) {
-			if (getCharacterCurrentParams(kCharacterAnna)[3] || (getCharacterCurrentParams(kCharacterAnna)[3] = _currentGameSessionTicks + 90, _currentGameSessionTicks != -90)) {
-				if (getCharacterCurrentParams(kCharacterAnna)[3] >= _currentGameSessionTicks)
+			if (getCharacterCurrentParams(kCharacterAnna)[3] || (getCharacterCurrentParams(kCharacterAnna)[3] = _realTime + 90, _realTime != -90)) {
+				if (getCharacterCurrentParams(kCharacterAnna)[3] >= _realTime)
 					break;
 
 				getCharacterCurrentParams(kCharacterAnna)[3] = 0x7FFFFFFF;
@@ -1610,10 +1610,10 @@ void LogicManager::HAND_Anna_WaitAugust(HAND_PARAMS) {
 	case 12:
 		getCharacter(kCharacterAnna).inventoryItem = 0;
 
-		if (_gameProgress[kProgressJacket] == 2 && !_gameEvents[kEventAnnaConversationGoodNight] && !_gameEvents[kEventAnnaIntroductionRejected])
+		if (_globals[kProgressJacket] == 2 && !_doneNIS[kEventAnnaConversationGoodNight] && !_doneNIS[kEventAnnaIntroductionRejected])
 			getCharacter(kCharacterAnna).inventoryItem = 0x80;
 
-		if (_gameProgress[kProgressJacket] == 2 && !getCharacter(kCharacterAnna).inventoryItem && !_gameEvents[kEventAnnaGiveScarfAsk] && !_gameEvents[kEventAnnaGiveScarfDinerAsk] && !_gameEvents[kEventAnnaGiveScarfSalonAsk]) {
+		if (_globals[kProgressJacket] == 2 && !getCharacter(kCharacterAnna).inventoryItem && !_doneNIS[kEventAnnaGiveScarfAsk] && !_doneNIS[kEventAnnaGiveScarfDinerAsk] && !_doneNIS[kEventAnnaGiveScarfSalonAsk]) {
 			getCharacter(kCharacterAnna).inventoryItem = 8;
 		}
 
@@ -1624,15 +1624,15 @@ void LogicManager::HAND_Anna_WaitAugust(HAND_PARAMS) {
 		break;
 	case 18:
 		if (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 1) {
-			if (_gameEvents[kEventAnnaGiveScarf] ||
-				_gameEvents[kEventAnnaGiveScarfDiner] ||
-				_gameEvents[kEventAnnaGiveScarfSalon] ||
-				_gameEvents[kEventAnnaGiveScarfMonogram] ||
-				_gameEvents[kEventAnnaGiveScarfDinerMonogram] ||
-				_gameEvents[kEventAnnaGiveScarfSalonMonogram]) {
+			if (_doneNIS[kEventAnnaGiveScarf] ||
+				_doneNIS[kEventAnnaGiveScarfDiner] ||
+				_doneNIS[kEventAnnaGiveScarfSalon] ||
+				_doneNIS[kEventAnnaGiveScarfMonogram] ||
+				_doneNIS[kEventAnnaGiveScarfDinerMonogram] ||
+				_doneNIS[kEventAnnaGiveScarfSalonMonogram]) {
 				playNIS(kEventAnnaGiveScarfSalonAsk);
 			} else {
-				if (_gameEvents[kEventAugustPresentAnna] || _gameEvents[kEventAugustPresentAnnaFirstIntroduction]) {
+				if (_doneNIS[kEventAugustPresentAnna] || _doneNIS[kEventAugustPresentAnnaFirstIntroduction]) {
 					playNIS(kEventAnnaGiveScarfSalonMonogram);
 				} else {
 					playNIS(kEventAnnaGiveScarfSalon);
@@ -1644,17 +1644,17 @@ void LogicManager::HAND_Anna_WaitAugust(HAND_PARAMS) {
 			getCharacter(kCharacterAnna).inventoryItem &= ~8;
 			bumpCath(kCarRestaurant, 51, 255);
 		} else if (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 2) {
-			if (_gameEvents[kEventAugustPresentAnna] || _gameEvents[kEventAugustPresentAnnaFirstIntroduction]) {
+			if (_doneNIS[kEventAugustPresentAnna] || _doneNIS[kEventAugustPresentAnnaFirstIntroduction]) {
 				playNIS(kEventAnnaConversationGoodNight);
 			} else {
 				playNIS(kEventAnnaIntroductionRejected);
 			}
 
 			getCharacter(kCharacterAnna).inventoryItem &= ~0x80;
-			if (_gameProgress[kProgressJacket] == 2 &&
-				!_gameEvents[kEventAnnaGiveScarfAsk] &&
-				!_gameEvents[kEventAnnaGiveScarfDinerAsk] &&
-				!_gameEvents[kEventAnnaGiveScarfSalonAsk]) {
+			if (_globals[kProgressJacket] == 2 &&
+				!_doneNIS[kEventAnnaGiveScarfAsk] &&
+				!_doneNIS[kEventAnnaGiveScarfDinerAsk] &&
+				!_doneNIS[kEventAnnaGiveScarfSalonAsk]) {
 				getCharacter(kCharacterAnna).inventoryItem |= kItemScarf;
 			}
 
@@ -1729,8 +1729,8 @@ void LogicManager::HAND_Anna_FlirtAugust(HAND_PARAMS) {
 		}
 
 		if (getCharacterCurrentParams(kCharacterAnna)[0]) {
-			if (getCharacterCurrentParams(kCharacterAnna)[4] || (getCharacterCurrentParams(kCharacterAnna)[4] = _currentGameSessionTicks + 90, _currentGameSessionTicks != -90)) {
-				if (getCharacterCurrentParams(kCharacterAnna)[4] >= _currentGameSessionTicks)
+			if (getCharacterCurrentParams(kCharacterAnna)[4] || (getCharacterCurrentParams(kCharacterAnna)[4] = _realTime + 90, _realTime != -90)) {
+				if (getCharacterCurrentParams(kCharacterAnna)[4] >= _realTime)
 					break;
 
 				getCharacterCurrentParams(kCharacterAnna)[4] = 0x7FFFFFFF;
@@ -1978,8 +1978,8 @@ void LogicManager::HAND_Anna_WakeNight(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
 		if (getCharacterCurrentParams(kCharacterAnna)[0]) {
-			if (getCharacterCurrentParams(kCharacterAnna)[2] || (getCharacterCurrentParams(kCharacterAnna)[2] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
-				if (getCharacterCurrentParams(kCharacterAnna)[2] >= _currentGameSessionTicks)
+			if (getCharacterCurrentParams(kCharacterAnna)[2] || (getCharacterCurrentParams(kCharacterAnna)[2] = _realTime + 75, _realTime != -75)) {
+				if (getCharacterCurrentParams(kCharacterAnna)[2] >= _realTime)
 					break;
 
 				getCharacterCurrentParams(kCharacterAnna)[2] = 0x7FFFFFFF;
@@ -2171,7 +2171,7 @@ void LogicManager::HAND_Anna_DoWalk1019(HAND_PARAMS) {
 		if (msg->action == 12) {
 			getCharacter(kCharacterAnna).inventoryItem = 0;
 
-			if (!_gameEvents[kEventAnnaGoodNight] && !_gameEvents[kEventAnnaGoodNightInverse])
+			if (!_doneNIS[kEventAnnaGoodNight] && !_doneNIS[kEventAnnaGoodNightInverse])
 				getCharacter(kCharacterAnna).inventoryItem = 0x80;
 		}
 
@@ -2597,7 +2597,7 @@ void LogicManager::HAND_Anna_GoLunch(HAND_PARAMS) {
 			AnnaCall(&LogicManager::CONS_Anna_DoSeqOtis, "801VS", 0, 0, 0);
 			break;
 		case 4:
-			if (!_gameEvents[kEventAugustLunch]) {
+			if (!_doneNIS[kEventAugustLunch]) {
 				playDialog(kCharacterAnna, "Ann3136A", -1, 30);
 			} else {
 				playDialog(kCharacterAnna, "Ann3136", -1, 30);
@@ -2907,7 +2907,7 @@ void LogicManager::HAND_Anna_AfterLunch(HAND_PARAMS) {
 
 		break;
 	case 101169422:
-		if (_gameEvents[kEventKronosVisit]) {
+		if (_doneNIS[kEventKronosVisit]) {
 			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 3;
 			AnnaCall(&LogicManager::CONS_Anna_DoBlockSeqOtis, "112J", 5, 0x39, 0);
 		} else {
@@ -2994,7 +2994,7 @@ void LogicManager::HAND_Anna_Dressing(HAND_PARAMS) {
 
 	switch (msg->action) {
 	case 0:
-		if (_gameProgress[kProgressField48] != 0 && getCharacterCurrentParams(kCharacterAnna)[4] != 0x7FFFFFFF && _gameTime != 0) {
+		if (_globals[kProgressField48] != 0 && getCharacterCurrentParams(kCharacterAnna)[4] != 0x7FFFFFFF && _gameTime != 0) {
 			if (_gameTime > 2065500) {
 				getCharacterCurrentParams(kCharacterAnna)[4] = 0x7FFFFFFF;
 				CONS_Anna_GiveMaxToCond2(0, 0, 0, 0);
@@ -3054,8 +3054,8 @@ void LogicManager::HAND_Anna_Dressing(HAND_PARAMS) {
 		}
 
 		if (getCharacterCurrentParams(kCharacterAnna)[0]) {
-			if (getCharacterCurrentParams(kCharacterAnna)[6] || (getCharacterCurrentParams(kCharacterAnna)[6] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
-				if (getCharacterCurrentParams(kCharacterAnna)[6] >= _currentGameSessionTicks)
+			if (getCharacterCurrentParams(kCharacterAnna)[6] || (getCharacterCurrentParams(kCharacterAnna)[6] = _realTime + 75, _realTime != -75)) {
+				if (getCharacterCurrentParams(kCharacterAnna)[6] >= _realTime)
 					break;
 
 				getCharacterCurrentParams(kCharacterAnna)[6] = 0x7FFFFFFF;
@@ -3215,8 +3215,8 @@ void LogicManager::HAND_Anna_GiveMaxToCond2(HAND_PARAMS) {
 			if (getCharacterCurrentParams(kCharacterAnna)[5] || (getCharacterCurrentParams(kCharacterAnna)[5] = _gameTime + 9000, _gameTime != -9000)) {
 				if (getCharacterCurrentParams(kCharacterAnna)[5] >= _gameTime) {
 					if (getCharacterCurrentParams(kCharacterAnna)[0]) {
-						if (getCharacterCurrentParams(kCharacterAnna)[6] || (getCharacterCurrentParams(kCharacterAnna)[6] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
-							if (getCharacterCurrentParams(kCharacterAnna)[6] >= _currentGameSessionTicks)
+						if (getCharacterCurrentParams(kCharacterAnna)[6] || (getCharacterCurrentParams(kCharacterAnna)[6] = _realTime + 75, _realTime != -75)) {
+							if (getCharacterCurrentParams(kCharacterAnna)[6] >= _realTime)
 								break;
 
 							getCharacterCurrentParams(kCharacterAnna)[6] = 0x7FFFFFFF;
@@ -3251,8 +3251,8 @@ void LogicManager::HAND_Anna_GiveMaxToCond2(HAND_PARAMS) {
 		}
 
 		if (getCharacterCurrentParams(kCharacterAnna)[0]) {
-			if (getCharacterCurrentParams(kCharacterAnna)[6] || (getCharacterCurrentParams(kCharacterAnna)[6] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
-				if (getCharacterCurrentParams(kCharacterAnna)[6] >= _currentGameSessionTicks)
+			if (getCharacterCurrentParams(kCharacterAnna)[6] || (getCharacterCurrentParams(kCharacterAnna)[6] = _realTime + 75, _realTime != -75)) {
+				if (getCharacterCurrentParams(kCharacterAnna)[6] >= _realTime)
 					break;
 
 				getCharacterCurrentParams(kCharacterAnna)[6] = 0x7FFFFFFF;
@@ -3621,8 +3621,8 @@ void LogicManager::HAND_Anna_AfterConcert(HAND_PARAMS) {
 		}
 
 		if (getCharacterCurrentParams(kCharacterAnna)[0]) {
-			if (getCharacterCurrentParams(kCharacterAnna)[4] || (getCharacterCurrentParams(kCharacterAnna)[4] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
-				if (getCharacterCurrentParams(kCharacterAnna)[4] >= _currentGameSessionTicks)
+			if (getCharacterCurrentParams(kCharacterAnna)[4] || (getCharacterCurrentParams(kCharacterAnna)[4] = _realTime + 75, _realTime != -75)) {
+				if (getCharacterCurrentParams(kCharacterAnna)[4] >= _realTime)
 					break;
 
 				getCharacterCurrentParams(kCharacterAnna)[4] = 0x7FFFFFFF;
@@ -3818,7 +3818,7 @@ void LogicManager::CONS_Anna_GoBagg(CONS_PARAMS) {
 void LogicManager::HAND_Anna_GoBagg(HAND_PARAMS) {
 	switch (msg->action) {
 	case 12:
-		_gameTimeTicksDelta = 3;
+		_timeSpeed = 3;
 		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
 		AnnaCall(&LogicManager::CONS_Anna_SaveGame, 1, 0, 0, 0);
 		break;
@@ -3889,7 +3889,7 @@ void LogicManager::HAND_Anna_InBagg(HAND_PARAMS) {
 		break;
 	case 12:
 		getCharacter(kCharacterAnna).characterPosition.car = kCarBaggage;
-		_gameProgress[kProgressField54] = 1;
+		_globals[kProgressField54] = 1;
 		break;
 	case 235856512:
 		getCharacterCurrentParams(kCharacterAnna)[0] = 1;
@@ -3970,7 +3970,7 @@ void LogicManager::HAND_Anna_BaggageFight(HAND_PARAMS) {
 		case 3:
 			playNIS(kEventAnnaBagagePart2);
 			bumpCath(kCarBaggage, 96, 255);
-			_gameProgress[kProgressField54] = 0;
+			_globals[kProgressField54] = 0;
 			forceJump(kCharacterVesna, &LogicManager::CONS_Vesna_InComp);
 			_gameTime = 2266200;
 			CONS_Anna_PrepareVienna(0, 0, 0, 0);
@@ -4054,11 +4054,11 @@ void LogicManager::HAND_Anna_Reading(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
 		if (checkCathDir(kCarRedSleeping, 46)) {
-			if (getCharacterCurrentParams(kCharacterAnna)[3] || (getCharacterCurrentParams(kCharacterAnna)[3] = _currentGameSessionTicks + 30, _currentGameSessionTicks != -30)) {
-				if (getCharacterCurrentParams(kCharacterAnna)[3] >= _currentGameSessionTicks) {
+			if (getCharacterCurrentParams(kCharacterAnna)[3] || (getCharacterCurrentParams(kCharacterAnna)[3] = _realTime + 30, _realTime != -30)) {
+				if (getCharacterCurrentParams(kCharacterAnna)[3] >= _realTime) {
 					if (getCharacterCurrentParams(kCharacterAnna)[0]) {
-						if (getCharacterCurrentParams(kCharacterAnna)[4] || (getCharacterCurrentParams(kCharacterAnna)[4] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
-							if (getCharacterCurrentParams(kCharacterAnna)[4] >= _currentGameSessionTicks)
+						if (getCharacterCurrentParams(kCharacterAnna)[4] || (getCharacterCurrentParams(kCharacterAnna)[4] = _realTime + 75, _realTime != -75)) {
+							if (getCharacterCurrentParams(kCharacterAnna)[4] >= _realTime)
 								break;
 
 							getCharacterCurrentParams(kCharacterAnna)[4] = 0x7FFFFFFF;
@@ -4085,8 +4085,8 @@ void LogicManager::HAND_Anna_Reading(HAND_PARAMS) {
 		getCharacterCurrentParams(kCharacterAnna)[3] = 0;
 
 		if (getCharacterCurrentParams(kCharacterAnna)[0]) {
-			if (getCharacterCurrentParams(kCharacterAnna)[4] || (getCharacterCurrentParams(kCharacterAnna)[4] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
-				if (getCharacterCurrentParams(kCharacterAnna)[4] >= _currentGameSessionTicks)
+			if (getCharacterCurrentParams(kCharacterAnna)[4] || (getCharacterCurrentParams(kCharacterAnna)[4] = _realTime + 75, _realTime != -75)) {
+				if (getCharacterCurrentParams(kCharacterAnna)[4] >= _realTime)
 					break;
 
 				getCharacterCurrentParams(kCharacterAnna)[4] = 0x7FFFFFFF;
@@ -4387,7 +4387,7 @@ void LogicManager::HAND_Anna_EnterCompCathFollowsAnna(HAND_PARAMS) {
 
 		break;
 	case 17:
-		if (!_gameEvents[kEventAnnaTiredKiss] && nearChar(kCharacterCath, kCharacterAnna, 2000) && whoOnScreen(kCharacterAnna) &&
+		if (!_doneNIS[kEventAnnaTiredKiss] && nearChar(kCharacterCath, kCharacterAnna, 2000) && whoOnScreen(kCharacterAnna) &&
 			getCharacter(kCharacterAnna).characterPosition.position < getCharacter(kCharacterCath).characterPosition.position) {
 			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
 			AnnaCall(&LogicManager::CONS_Anna_SaveGame, 2, kEventAnnaTiredKiss, 0, 0);
@@ -4422,7 +4422,7 @@ void LogicManager::CONS_Anna_DoWalkCathFollowsAnna(CONS_PARAMS) {
 void LogicManager::HAND_Anna_DoWalkCathFollowsAnna(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
-		if (_gameEvents[kEventAnnaTired] || whoFacingCath(kCharacterAnna)) {
+		if (_doneNIS[kEventAnnaTired] || whoFacingCath(kCharacterAnna)) {
 			getCharacter(kCharacterAnna).inventoryItem = 0;
 		} else {
 			getCharacter(kCharacterAnna).inventoryItem = 0x80;
@@ -4447,7 +4447,7 @@ void LogicManager::HAND_Anna_DoWalkCathFollowsAnna(HAND_PARAMS) {
 			getCharacter(kCharacterAnna).currentCall--;
 			_engine->getMessageManager()->setMessageHandle(kCharacterAnna, _functionsAnna[getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall]]);
 			fedEx(kCharacterAnna, kCharacterAnna, 18, 0);
-		} else if (!_gameEvents[kEventAnnaTired]) {
+		} else if (!_doneNIS[kEventAnnaTired]) {
 			getCharacter(kCharacterAnna).inventoryItem = 0x80;
 		}
 
@@ -4509,7 +4509,7 @@ void LogicManager::HAND_Anna_LetDownHair(HAND_PARAMS) {
 		break;
 	case 12:
 		setDoor(37, kCharacterAnna, 0, 10, 9);
-		_gameTimeTicksDelta = 1;
+		_timeSpeed = 1;
 		getCharacterCurrentParams(kCharacterAnna)[0] = _gameTime + 4500;
 		getCharacterCurrentParams(kCharacterAnna)[1] = _gameTime + 9000;
 		break;
@@ -4583,13 +4583,13 @@ void LogicManager::HAND_Anna_TiedUp(HAND_PARAMS) {
 	switch (msg->action) {
 	case 18:
 		if (getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] == 1) {
-			if (_gameProgress[kProgressFieldC]) {
-				if (_gameEvents[kEventAnnaKissTrainHijacked]) {
+			if (_globals[kProgressFieldC]) {
+				if (_doneNIS[kEventAnnaKissTrainHijacked]) {
 					playNIS(kEventAnnaBaggageTies2);
 				} else {
 					playNIS(kEventAnnaBaggageTies);
 				}
-			} else if (_gameEvents[kEventAnnaKissTrainHijacked]) {
+			} else if (_doneNIS[kEventAnnaKissTrainHijacked]) {
 				playNIS(kEventAnnaBaggageTies3);
 			} else {
 				playNIS(kEventAnnaBaggageTies4);
@@ -4644,7 +4644,7 @@ void LogicManager::HAND_Anna_ReadyToScore(HAND_PARAMS) {
 	case 0:
 		if (_gameTime > 3645000 && !getCharacterCurrentParams(kCharacterAnna)[1]) {
 			getCharacterCurrentParams(kCharacterAnna)[1] = 1;
-			_gameTimeTicksDelta = 0;
+			_timeSpeed = 0;
 		}
 
 		break;
@@ -4678,7 +4678,7 @@ void LogicManager::HAND_Anna_ReadyToScore(HAND_PARAMS) {
 			setDoor(106, kCharacterCath, 0, 10, 9);
 			playNIS(kEventAnnaDialogGoToJerusalem);
 			_gameTime = 4914000;
-			_gameTimeTicksDelta = 0;
+			_timeSpeed = 0;
 			send(kCharacterAnna, kCharacterTatiana, 236060709, 0);
 			bumpCath(kCarBaggage, 97, 1);
 			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 3;
@@ -4725,7 +4725,7 @@ void LogicManager::HAND_Anna_Kidnapped(HAND_PARAMS) {
 
 		_gameTime = 4920300;
 
-		if (_gameInventory[kItemFirebird].location == 4) {
+		if (_items[kItemFirebird].floating == 4) {
 			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 2;
 			AnnaCall(&LogicManager::CONS_Anna_SaveGame, 2, kEventKronosHostageAnna, 0, 0);
 		} else {
@@ -4771,7 +4771,7 @@ void LogicManager::HAND_Anna_Waiting(HAND_PARAMS) {
 	case 17:
 		if (inDiningRoom(kCharacterCath) && cathHasItem(kItemFirebird)) {
 			CONS_Anna_FinalSequence(0, 0, 0, 0);
-		} else if (inSalon(kCharacterCath) && !_gameEvents[kEventKahinaPunch]) {
+		} else if (inSalon(kCharacterCath) && !_doneNIS[kEventKahinaPunch]) {
 			_gameTime = 4923000;
 			getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 2;
 			AnnaCall(&LogicManager::CONS_Anna_SaveGame, 2, kEventKahinaPunch, 0, 0);
@@ -4817,8 +4817,8 @@ void LogicManager::CONS_Anna_FinalSequence(CONS_PARAMS) {
 void LogicManager::HAND_Anna_FinalSequence(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
-		if (getCharacterCurrentParams(kCharacterAnna)[0] || (getCharacterCurrentParams(kCharacterAnna)[0] = _currentGameSessionTicks + 450, _currentGameSessionTicks != -450)) {
-			if (getCharacterCurrentParams(kCharacterAnna)[0] >= _currentGameSessionTicks)
+		if (getCharacterCurrentParams(kCharacterAnna)[0] || (getCharacterCurrentParams(kCharacterAnna)[0] = _realTime + 450, _realTime != -450)) {
+			if (getCharacterCurrentParams(kCharacterAnna)[0] >= _realTime)
 				break;
 
 			getCharacterCurrentParams(kCharacterAnna)[0] = 0x7FFFFFFF;
@@ -4852,7 +4852,7 @@ void LogicManager::HAND_Anna_FinalSequence(HAND_PARAMS) {
 			endGame(0, 1, 0, true);
 			break;
 		case 3:
-			_gameProgress[kProgressIsEggOpen] = 1;
+			_globals[kProgressIsEggOpen] = 1;
 
 			if (whoRunningDialog(kCharacterAnna))
 				fadeDialog(kCharacterAnna);
@@ -4887,8 +4887,8 @@ void LogicManager::CONS_Anna_OpenFirebird(CONS_PARAMS) {
 void LogicManager::HAND_Anna_OpenFirebird(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
-		if (getCharacterCurrentParams(kCharacterAnna)[0] || (getCharacterCurrentParams(kCharacterAnna)[0] = _currentGameSessionTicks + 180, _currentGameSessionTicks != -180)) {
-			if (getCharacterCurrentParams(kCharacterAnna)[0] >= _currentGameSessionTicks)
+		if (getCharacterCurrentParams(kCharacterAnna)[0] || (getCharacterCurrentParams(kCharacterAnna)[0] = _realTime + 180, _realTime != -180)) {
+			if (getCharacterCurrentParams(kCharacterAnna)[0] >= _realTime)
 				break;
 
 			getCharacterCurrentParams(kCharacterAnna)[0] = 0x7FFFFFFF;
@@ -4903,7 +4903,7 @@ void LogicManager::HAND_Anna_OpenFirebird(HAND_PARAMS) {
 			playNIS(kEventKronosGiveFirebird);
 			if (cathHasItem(kItemWhistle)) {
 				endGame(0, 1, 53, true);
-			} else if (_gameInventory[kItemWhistle].location == 1) {
+			} else if (_items[kItemWhistle].floating == 1) {
 				endGame(3, 208, 0, true);
 			} else {
 				endGame(3, 42, 54, true);
@@ -4915,13 +4915,13 @@ void LogicManager::HAND_Anna_OpenFirebird(HAND_PARAMS) {
 
 		break;
 	case 224309120:
-		_gameProgress[kProgressIsEggOpen] = 0;
+		_globals[kProgressIsEggOpen] = 0;
 		_gameTime = 4941000;
 		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 1;
 		AnnaCall(&LogicManager::CONS_Anna_SaveGame, 2, kEventKronosGiveFirebird, 0, 0);
 		break;
 	case 270751616:
-		_gameProgress[kProgressIsEggOpen] = 0;
+		_globals[kProgressIsEggOpen] = 0;
 		killGracePeriod();
 		_gameTime = 4941000;
 		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 2;
diff --git a/engines/lastexpress/characters/august.cpp b/engines/lastexpress/characters/august.cpp
index 0bebad61cf6..4b6ac078116 100644
--- a/engines/lastexpress/characters/august.cpp
+++ b/engines/lastexpress/characters/august.cpp
@@ -583,7 +583,7 @@ void LogicManager::HAND_August_DoWalk(HAND_PARAMS) {
 
 		break;
 	case 5:
-		if (_gameProgress[kProgressEventMetAugust]) {
+		if (_globals[kProgressEventMetAugust]) {
 			if (rnd(2) == 0) {
 				playDialog(kCharacterCath, "CAT1002A", -1, 0);
 			} else {
@@ -756,7 +756,7 @@ void LogicManager::HAND_August_EnterComp(HAND_PARAMS) {
 		break;
 	case 12:
 		getCharacter(kCharacterAugust).inventoryItem = 0;
-		switch (_gameProgress[kProgressChapter]) {
+		switch (_globals[kProgressChapter]) {
 		case 1:
 			Common::strcpy_s((char *)&getCharacterCurrentParams(kCharacterAugust)[2], 12, "626");
 			break;
@@ -845,7 +845,7 @@ void LogicManager::CONS_August_ExitComp(CONS_PARAMS) {
 void LogicManager::HAND_August_ExitComp(HAND_PARAMS) {
 	switch (msg->action) {
 	case 12:
-		switch (_gameProgress[kProgressChapter]) {
+		switch (_globals[kProgressChapter]) {
 		case 1:
 			Common::strcpy_s((char *)&getCharacterCurrentParams(kCharacterAugust)[1], 12, "626");
 			break;
@@ -884,7 +884,7 @@ void LogicManager::HAND_August_ExitComp(HAND_PARAMS) {
 			Common::strcat_s((char *)&getCharacterCurrentParams(kCharacterAugust)[4], 12, "Pc");
 			startCycOtis(kCharacterAugust, (char *)&getCharacterCurrentParams(kCharacterAugust)[4]);
 			softBlockAtDoor(kCharacterAugust, 3);
-			if (_gameProgress[kProgressChapter] == 3 && _gameTime < 1998000) {
+			if (_globals[kProgressChapter] == 3 && _gameTime < 1998000) {
 				getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 2;
 				AugustCall(&LogicManager::CONS_August_DoDialog, "AUG2094", 0, 0, 0);
 			} else {
@@ -939,16 +939,16 @@ void LogicManager::HAND_August_CompLogic(HAND_PARAMS) {
 
 		if (getCharacterCurrentParams(kCharacterAugust)[1]) {
 			if (getCharacterCurrentParams(kCharacterAugust)[7] ||
-				(getCharacterCurrentParams(kCharacterAugust)[7] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
-				if (getCharacterCurrentParams(kCharacterAugust)[7] >= _currentGameSessionTicks) {
-					if (_gameProgress[kProgressChapter] == 1) {
+				(getCharacterCurrentParams(kCharacterAugust)[7] = _realTime + 75, _realTime != -75)) {
+				if (getCharacterCurrentParams(kCharacterAugust)[7] >= _realTime) {
+					if (_globals[kProgressChapter] == 1) {
 						if (getCharacterCurrentParams(kCharacterAugust)[5] != 0) {
 							if (getCharacterCurrentParams(kCharacterAugust)[8] ||
 								(getCharacterCurrentParams(kCharacterAugust)[8] = _gameTime + 6300, _gameTime != -6300)) {
 								if (getCharacterCurrentParams(kCharacterAugust)[8] >= _gameTime) {
 
-									if (!getCharacterCurrentParams(kCharacterAugust)[3] && !_gameProgress[kProgressEventMetAugust] && !getCharacterCurrentParams(kCharacterAugust)[5] && getCharacterCurrentParams(kCharacterAugust)[0] - 4500 > _gameTime && !_gameProgress[kProgressField14]) {
-										_gameProgress[kProgressField14] = 2;
+									if (!getCharacterCurrentParams(kCharacterAugust)[3] && !_globals[kProgressEventMetAugust] && !getCharacterCurrentParams(kCharacterAugust)[5] && getCharacterCurrentParams(kCharacterAugust)[0] - 4500 > _gameTime && !_globals[kProgressField14]) {
+										_globals[kProgressField14] = 2;
 										getCharacter(kCharacterAugust).characterPosition.location = 0;
 										getCharacter(kCharacterAugust).characterPosition.position = 8200;
 										getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 1;
@@ -965,8 +965,8 @@ void LogicManager::HAND_August_CompLogic(HAND_PARAMS) {
 							getCharacterCurrentParams(kCharacterAugust)[8] = 0;
 						}
 
-						if (!getCharacterCurrentParams(kCharacterAugust)[3] && !_gameProgress[kProgressEventMetAugust] && !getCharacterCurrentParams(kCharacterAugust)[5] && getCharacterCurrentParams(kCharacterAugust)[0] - 4500 > _gameTime && !_gameProgress[kProgressField14]) {
-							_gameProgress[kProgressField14] = 2;
+						if (!getCharacterCurrentParams(kCharacterAugust)[3] && !_globals[kProgressEventMetAugust] && !getCharacterCurrentParams(kCharacterAugust)[5] && getCharacterCurrentParams(kCharacterAugust)[0] - 4500 > _gameTime && !_globals[kProgressField14]) {
+							_globals[kProgressField14] = 2;
 							getCharacter(kCharacterAugust).characterPosition.location = 0;
 							getCharacter(kCharacterAugust).characterPosition.position = 8200;
 							getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 1;
@@ -983,7 +983,7 @@ void LogicManager::HAND_August_CompLogic(HAND_PARAMS) {
 			getCharacterCurrentParams(kCharacterAugust)[1] = 0;
 			getCharacterCurrentParams(kCharacterAugust)[2] = 1;
 
-			if (_gameProgress[kProgressEventMetAugust] || _gameProgress[kProgressJacket] != 2) {
+			if (_globals[kProgressEventMetAugust] || _globals[kProgressJacket] != 2) {
 				setDoor(3, kCharacterAugust, 1, 0, 0);
 			} else {
 				setDoor(3, kCharacterAugust, 1, 0, 9);
@@ -992,14 +992,14 @@ void LogicManager::HAND_August_CompLogic(HAND_PARAMS) {
 
 		getCharacterCurrentParams(kCharacterAugust)[7] = 0;
 
-		if (_gameProgress[kProgressChapter] == 1) {
+		if (_globals[kProgressChapter] == 1) {
 			if (getCharacterCurrentParams(kCharacterAugust)[5] != 0) {
 				if (getCharacterCurrentParams(kCharacterAugust)[8] ||
 					(getCharacterCurrentParams(kCharacterAugust)[8] = _gameTime + 6300, _gameTime != -6300)) {
 					if (getCharacterCurrentParams(kCharacterAugust)[8] >= _gameTime) {
 
-						if (!getCharacterCurrentParams(kCharacterAugust)[3] && !_gameProgress[kProgressEventMetAugust] && !getCharacterCurrentParams(kCharacterAugust)[5] && getCharacterCurrentParams(kCharacterAugust)[0] - 4500 > _gameTime && !_gameProgress[kProgressField14]) {
-							_gameProgress[kProgressField14] = 2;
+						if (!getCharacterCurrentParams(kCharacterAugust)[3] && !_globals[kProgressEventMetAugust] && !getCharacterCurrentParams(kCharacterAugust)[5] && getCharacterCurrentParams(kCharacterAugust)[0] - 4500 > _gameTime && !_globals[kProgressField14]) {
+							_globals[kProgressField14] = 2;
 							getCharacter(kCharacterAugust).characterPosition.location = 0;
 							getCharacter(kCharacterAugust).characterPosition.position = 8200;
 							getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 1;
@@ -1016,8 +1016,8 @@ void LogicManager::HAND_August_CompLogic(HAND_PARAMS) {
 				getCharacterCurrentParams(kCharacterAugust)[8] = 0;
 			}
 
-			if (!getCharacterCurrentParams(kCharacterAugust)[3] && !_gameProgress[kProgressEventMetAugust] && !getCharacterCurrentParams(kCharacterAugust)[5] && getCharacterCurrentParams(kCharacterAugust)[0] - 4500 > _gameTime && !_gameProgress[kProgressField14]) {
-				_gameProgress[kProgressField14] = 2;
+			if (!getCharacterCurrentParams(kCharacterAugust)[3] && !_globals[kProgressEventMetAugust] && !getCharacterCurrentParams(kCharacterAugust)[5] && getCharacterCurrentParams(kCharacterAugust)[0] - 4500 > _gameTime && !_globals[kProgressField14]) {
+				_globals[kProgressField14] = 2;
 				getCharacter(kCharacterAugust).characterPosition.location = 0;
 				getCharacter(kCharacterAugust).characterPosition.position = 8200;
 				getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 1;
@@ -1028,7 +1028,7 @@ void LogicManager::HAND_August_CompLogic(HAND_PARAMS) {
 		break;
 	case 8:
 	case 9:
-		if (msg->action == 9 && _gameProgress[kProgressChapter] == 1 && !_gameProgress[kProgressEventMetAugust] && _gameProgress[kProgressJacket] == 2) {
+		if (msg->action == 9 && _globals[kProgressChapter] == 1 && !_globals[kProgressEventMetAugust] && _globals[kProgressJacket] == 2) {
 			setDoor(9, kCharacterCath, 0, 255, 255);
 			getCharacter(kCharacterCath).characterPosition.location = 1;
 			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 6;
@@ -1093,8 +1093,8 @@ void LogicManager::HAND_August_CompLogic(HAND_PARAMS) {
 			AugustCall(&LogicManager::CONS_August_EnterComp, 0, 0, 0, 0);
 			break;
 		case 5:
-			if (_gameProgress[kProgressField14] == 2)
-				_gameProgress[kProgressField14] = 0;
+			if (_globals[kProgressField14] == 2)
+				_globals[kProgressField14] = 0;
 			getCharacterCurrentParams(kCharacterAugust)[5] = 1;
 			getCharacterCurrentParams(kCharacterAugust)[1] = 0;
 			getCharacterCurrentParams(kCharacterAugust)[2] = 0;
@@ -1108,7 +1108,7 @@ void LogicManager::HAND_August_CompLogic(HAND_PARAMS) {
 			else
 				playNIS(kEventMeetAugustHisCompartment);
 
-			_gameProgress[kProgressEventMetAugust] = 1;
+			_globals[kProgressEventMetAugust] = 1;
 			setDoor(3, 2, 1, 0, 0);
 			getCharacterCurrentParams(kCharacterAugust)[1] = 0;
 			getCharacterCurrentParams(kCharacterAugust)[2] = 1;
@@ -1129,7 +1129,7 @@ void LogicManager::HAND_August_CompLogic(HAND_PARAMS) {
 				break;
 			case 2:
 				getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 10;
-				if (!_gameProgress[kProgressEventMetAugust]) {
+				if (!_globals[kProgressEventMetAugust]) {
 					AugustCall(&LogicManager::CONS_August_DoDialog, "AUG1128G", 0, 0, 0);
 				} else {
 					AugustCall(&LogicManager::CONS_August_DoDialog, "AUG1128E", 0, 0, 0);
@@ -1138,7 +1138,7 @@ void LogicManager::HAND_August_CompLogic(HAND_PARAMS) {
 				break;
 			case 3:
 				getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 11;
-				if (!_gameProgress[kProgressEventMetAugust]) {
+				if (!_globals[kProgressEventMetAugust]) {
 					AugustCall(&LogicManager::CONS_August_DoDialog, "AUG1128H", 0, 0, 0);
 				} else {
 					AugustCall(&LogicManager::CONS_August_DoDialog, "AUG1128F", 0, 0, 0);
@@ -1146,7 +1146,7 @@ void LogicManager::HAND_August_CompLogic(HAND_PARAMS) {
 
 				break;
 			default:
-				if (_gameProgress[kProgressEventMetAugust] || _gameProgress[kProgressJacket] != 2) {
+				if (_globals[kProgressEventMetAugust] || _globals[kProgressJacket] != 2) {
 					setDoor(3, kCharacterAugust, 1, 14, 0);
 				} else {
 					setDoor(3, kCharacterAugust, 1, 14, 9);
@@ -1160,7 +1160,7 @@ void LogicManager::HAND_August_CompLogic(HAND_PARAMS) {
 		case 9:
 		case 10:
 		case 11:
-			if (_gameProgress[kProgressEventMetAugust] || _gameProgress[kProgressJacket] != 2) {
+			if (_globals[kProgressEventMetAugust] || _globals[kProgressJacket] != 2) {
 				setDoor(3, kCharacterAugust, 1, 14, 0);
 			} else {
 				setDoor(3, kCharacterAugust, 1, 14, 9);
@@ -1170,7 +1170,7 @@ void LogicManager::HAND_August_CompLogic(HAND_PARAMS) {
 			break;
 		case 12:
 		case 13:
-			if (_gameProgress[kProgressEventMetAugust] || _gameProgress[kProgressJacket] != 2) {
+			if (_globals[kProgressEventMetAugust] || _globals[kProgressJacket] != 2) {
 				setDoor(3, kCharacterAugust, 1, 0, 0);
 			} else {
 				setDoor(3, kCharacterAugust, 1, 0, 9);
@@ -1254,7 +1254,7 @@ void LogicManager::HAND_August_Birth(HAND_PARAMS) {
 		getCharacter(kCharacterAugust).characterPosition.location = 1;
 		getCharacter(kCharacterAugust).characterPosition.car = kCarRestaurant;
 		getCharacter(kCharacterAugust).clothes = 0;
-		_gameProgress[kProgressEventMetAugust] = 0;
+		_globals[kProgressEventMetAugust] = 0;
 		break;
 	default:
 		break;
@@ -1276,7 +1276,7 @@ void LogicManager::CONS_August_KnockTyler(CONS_PARAMS) {
 void LogicManager::HAND_August_KnockTyler(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
-		if (_gameProgress[kProgressField14] == 29 || _gameProgress[kProgressField14] == 3) {
+		if (_globals[kProgressField14] == 29 || _globals[kProgressField14] == 3) {
 			if (getCharacterCurrentParams(kCharacterAugust)[2]) {
 				getCharacter(kCharacterAugust).characterPosition.location = 0;
 				getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 2;
@@ -1295,8 +1295,8 @@ void LogicManager::HAND_August_KnockTyler(HAND_PARAMS) {
 
 		if (!getCharacterCurrentParams(kCharacterAugust)[1]) {
 			if (!getCharacterCurrentParams(kCharacterAugust)[10] &&
-				(getCharacterCurrentParams(kCharacterAugust)[10] = _currentGameSessionTicks + 75, _currentGameSessionTicks == -75) ||
-				getCharacterCurrentParams(kCharacterAugust)[10] < _currentGameSessionTicks) {
+				(getCharacterCurrentParams(kCharacterAugust)[10] = _realTime + 75, _realTime == -75) ||
+				getCharacterCurrentParams(kCharacterAugust)[10] < _realTime) {
 				if (!getCharacterCurrentParams(kCharacterAugust)[4]) {
 					getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 8;
 					AugustCall(&LogicManager::CONS_August_DoDialog, "AUG1002B", 0, 0, 0);
@@ -1304,10 +1304,10 @@ void LogicManager::HAND_August_KnockTyler(HAND_PARAMS) {
 				}
 
 				if (!getCharacterCurrentParams(kCharacterAugust)[11]) {
-					getCharacterCurrentParams(kCharacterAugust)[11] = _currentGameSessionTicks + 75;
-					if (_currentGameSessionTicks == -75) {
+					getCharacterCurrentParams(kCharacterAugust)[11] = _realTime + 75;
+					if (_realTime == -75) {
 						softReleaseAtDoor(kCharacterAugust, 1);
-						if (_gameProgress[kProgressEventCorpseMovedFromFloor]) {
+						if (_globals[kProgressEventCorpseMovedFromFloor]) {
 							getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 9;
 							AugustCall(&LogicManager::CONS_August_DoCorrOtis, "626Da", 1, 0, 0);
 						} else if (checkLoc(kCharacterCath, kCarGreenSleeping)) {
@@ -1324,10 +1324,10 @@ void LogicManager::HAND_August_KnockTyler(HAND_PARAMS) {
 					}
 				}
 
-				if (getCharacterCurrentParams(kCharacterAugust)[11] < _currentGameSessionTicks) {
+				if (getCharacterCurrentParams(kCharacterAugust)[11] < _realTime) {
 					getCharacterCurrentParams(kCharacterAugust)[11] = 0x7FFFFFFF;
 					softReleaseAtDoor(kCharacterAugust, 1);
-					if (_gameProgress[kProgressEventCorpseMovedFromFloor]) {
+					if (_globals[kProgressEventCorpseMovedFromFloor]) {
 						getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 9;
 						AugustCall(&LogicManager::CONS_August_DoCorrOtis, "626Da", 1, 0, 0);
 					} else if (checkLoc(kCharacterCath, kCarGreenSleeping)) {
@@ -1354,10 +1354,10 @@ void LogicManager::HAND_August_KnockTyler(HAND_PARAMS) {
 			break;
 		}
 
-		if (!getCharacterCurrentParams(kCharacterAugust)[8] && (getCharacterCurrentParams(kCharacterAugust)[8] = _currentGameSessionTicks + 45, _currentGameSessionTicks == -45) || getCharacterCurrentParams(kCharacterAugust)[8] < _currentGameSessionTicks) {
+		if (!getCharacterCurrentParams(kCharacterAugust)[8] && (getCharacterCurrentParams(kCharacterAugust)[8] = _realTime + 45, _realTime == -45) || getCharacterCurrentParams(kCharacterAugust)[8] < _realTime) {
 			if (checkDoor(1) == 1) {
-				if (getCharacterCurrentParams(kCharacterAugust)[9] || (getCharacterCurrentParams(kCharacterAugust)[9] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
-					if (getCharacterCurrentParams(kCharacterAugust)[9] >= _currentGameSessionTicks)
+				if (getCharacterCurrentParams(kCharacterAugust)[9] || (getCharacterCurrentParams(kCharacterAugust)[9] = _realTime + 75, _realTime != -75)) {
+					if (getCharacterCurrentParams(kCharacterAugust)[9] >= _realTime)
 						break;
 
 					getCharacterCurrentParams(kCharacterAugust)[9] = 0x7FFFFFFF;
@@ -1392,7 +1392,7 @@ void LogicManager::HAND_August_KnockTyler(HAND_PARAMS) {
 
 				setDoor(1, kCharacterAugust, checkDoor(1), getCharacterCurrentParams(kCharacterAugust)[3] == 0 ? 14 : 0, 9);
 				getCharacterCurrentParams(kCharacterAugust)[9] = 0;
-			} else if (!_gameProgress[kProgressEventCorpseMovedFromFloor] || _gameProgress[kProgressJacket] == 1) {
+			} else if (!_globals[kProgressEventCorpseMovedFromFloor] || _globals[kProgressJacket] == 1) {
 				setDoor(9, 0, 0, 255, 255);
 				getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 3;
 				AugustCall(&LogicManager::CONS_August_SaveGame, 2, kEventAugustFindCorpse, 0, 0);
@@ -1420,7 +1420,7 @@ void LogicManager::HAND_August_KnockTyler(HAND_PARAMS) {
 
 		break;
 	case 9:
-		if (!_gameProgress[kProgressEventCorpseMovedFromFloor] || _gameProgress[kProgressJacket] == 1) {
+		if (!_globals[kProgressEventCorpseMovedFromFloor] || _globals[kProgressJacket] == 1) {
 			setDoor(9, kCharacterCath, 0, 255, 255);
 			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 13;
 			AugustCall(&LogicManager::CONS_August_SaveGame, 2, kEventAugustFindCorpse, 0, 0);
@@ -1474,12 +1474,12 @@ void LogicManager::HAND_August_KnockTyler(HAND_PARAMS) {
 			playDialog(0, "LIB014", -1, 0);
 			playNIS(kEventAugustFindCorpse);
 
-			if (_gameEvents[kEventDinerAugustOriginalJacket]) {
-				endGame(3, 4, _gameProgress[kProgressEventFoundCorpse] == kProgressField0 ? 56 : 50, true);
-			} else if (_gameProgress[kProgressEventCorpseMovedFromFloor]) {
+			if (_doneNIS[kEventDinerAugustOriginalJacket]) {
+				endGame(3, 4, _globals[kProgressEventFoundCorpse] == kProgressField0 ? 56 : 50, true);
+			} else if (_globals[kProgressEventCorpseMovedFromFloor]) {
 				endGame(0, 1, 55, true);
 			} else {
-				endGame(0, 1, _gameProgress[kProgressEventFoundCorpse] == kProgressField0 ? 56 : 50, true);
+				endGame(0, 1, _globals[kProgressEventFoundCorpse] == kProgressField0 ? 56 : 50, true);
 			}
 
 			break;
@@ -1490,7 +1490,7 @@ void LogicManager::HAND_August_KnockTyler(HAND_PARAMS) {
 			getCharacter(kCharacterAugust).characterPosition.location = 1;
 			playNIS(getCharacterCurrentParams(kCharacterAugust)[6]);
 			playDialog(0, "LIB015", -1, 0);
-			_gameProgress[kProgressEventMetAugust] = 1;
+			_globals[kProgressEventMetAugust] = 1;
 			getCharacter(kCharacterAugust).characterPosition.location = 0;
 			bumpCathTylerComp();
 
@@ -1510,10 +1510,10 @@ void LogicManager::HAND_August_KnockTyler(HAND_PARAMS) {
 		case 8:
 			getCharacterCurrentParams(kCharacterAugust)[4] = 1;
 			if (!getCharacterCurrentParams(kCharacterAugust)[11]) {
-				getCharacterCurrentParams(kCharacterAugust)[11] = _currentGameSessionTicks + 75;
-				if (_currentGameSessionTicks == -75) {
+				getCharacterCurrentParams(kCharacterAugust)[11] = _realTime + 75;
+				if (_realTime == -75) {
 					softReleaseAtDoor(kCharacterAugust, 1);
-					if (_gameProgress[kProgressEventCorpseMovedFromFloor]) {
+					if (_globals[kProgressEventCorpseMovedFromFloor]) {
 						getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 9;
 						AugustCall(&LogicManager::CONS_August_DoCorrOtis, "626Da", 1, 0, 0);
 					} else if (checkLoc(kCharacterCath, kCarGreenSleeping)) {
@@ -1530,10 +1530,10 @@ void LogicManager::HAND_August_KnockTyler(HAND_PARAMS) {
 				}
 			}
 
-			if (getCharacterCurrentParams(kCharacterAugust)[11] < _currentGameSessionTicks) {
+			if (getCharacterCurrentParams(kCharacterAugust)[11] < _realTime) {
 				getCharacterCurrentParams(kCharacterAugust)[11] = 0x7FFFFFFF;
 				softReleaseAtDoor(kCharacterAugust, 1);
-				if (_gameProgress[kProgressEventCorpseMovedFromFloor]) {
+				if (_globals[kProgressEventCorpseMovedFromFloor]) {
 					getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 9;
 					AugustCall(&LogicManager::CONS_August_DoCorrOtis, "626Da", 1, 0, 0);
 				} else if (checkLoc(kCharacterCath, kCarGreenSleeping)) {
@@ -1577,10 +1577,10 @@ void LogicManager::HAND_August_KnockTyler(HAND_PARAMS) {
 			break;
 		case 11:
 			playNIS(kEventAugustFindCorpse);
-			if (_gameEvents[kEventDinerAugustOriginalJacket]) {
-				endGame(3, 4, _gameProgress[kProgressEventFoundCorpse] == kProgressField0 ? 56 : 50, true);
+			if (_doneNIS[kEventDinerAugustOriginalJacket]) {
+				endGame(3, 4, _globals[kProgressEventFoundCorpse] == kProgressField0 ? 56 : 50, true);
 			} else {
-				endGame(0, 1, _gameProgress[kProgressEventFoundCorpse] == kProgressField0 ? 56 : 50, true);
+				endGame(0, 1, _globals[kProgressEventFoundCorpse] == kProgressField0 ? 56 : 50, true);
 			}
 
 			break;
@@ -1600,12 +1600,12 @@ void LogicManager::HAND_August_KnockTyler(HAND_PARAMS) {
 
 			playNIS(kEventAugustFindCorpse);
 
-			if (_gameEvents[kEventDinerAugustOriginalJacket]) {
-				endGame(3, 4, _gameProgress[kProgressEventFoundCorpse] == kProgressField0 ? 56 : 50, true);
-			} else if (_gameProgress[kProgressEventCorpseMovedFromFloor]) {
+			if (_doneNIS[kEventDinerAugustOriginalJacket]) {
+				endGame(3, 4, _globals[kProgressEventFoundCorpse] == kProgressField0 ? 56 : 50, true);
+			} else if (_globals[kProgressEventCorpseMovedFromFloor]) {
 				endGame(0, 1, 55, true);
 			} else {
-				endGame(0, 1, _gameProgress[kProgressEventFoundCorpse] == kProgressField0 ? 56 : 50, true);
+				endGame(0, 1, _globals[kProgressEventFoundCorpse] == kProgressField0 ? 56 : 50, true);
 			}
 
 			break;
@@ -1621,7 +1621,7 @@ void LogicManager::HAND_August_KnockTyler(HAND_PARAMS) {
 			setDoor(1, kCharacterCath, 0, 10, 9);
 			setDoor(9, kCharacterCath, 0, 255, 255);
 			playNIS(getCharacterCurrentParams(kCharacterAugust)[6]);
-			_gameProgress[kProgressEventMetAugust] = 1;
+			_globals[kProgressEventMetAugust] = 1;
 			getCharacter(kCharacterAugust).characterPosition.location = 0;
 			bumpCathTylerComp();
 
@@ -1673,7 +1673,7 @@ void LogicManager::HAND_August_DoNIS1006(HAND_PARAMS) {
 			else
 				playNIS(kEventDinerAugust);
 
-			_gameProgress[kProgressEventMetAugust] = 1;
+			_globals[kProgressEventMetAugust] = 1;
 			bumpCath(kCarRestaurant, 61, 255);
 
 			getCharacter(kCharacterAugust).currentCall--;
@@ -1700,7 +1700,7 @@ void LogicManager::CONS_August_WaitTyler(CONS_PARAMS) {
 void LogicManager::HAND_August_WaitTyler(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
-		if (!getCharacterCurrentParams(kCharacterAugust)[0] && _gameProgress[kProgressEventFoundCorpse]) {
+		if (!getCharacterCurrentParams(kCharacterAugust)[0] && _globals[kProgressEventFoundCorpse]) {
 			send(kCharacterAugust, kCharacterHeadWait, 239072064, 0);
 			getCharacterCurrentParams(kCharacterAugust)[0] = 1;
 		}
@@ -1725,7 +1725,7 @@ void LogicManager::HAND_August_WaitTyler(HAND_PARAMS) {
 		getCharacterCurrentParams(kCharacterAugust)[1] = 0;
 		getCharacter(kCharacterAugust).inventoryItem = 0;
 		send(kCharacterAugust, kCharacterHeadWait, 191604416, 0);
-		if (_gameProgress[kProgressJacket] == 2) {
+		if (_globals[kProgressJacket] == 2) {
 			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 3;
 			AugustCall(&LogicManager::CONS_August_DoNIS1006, 0, 0, 0, 0);
 		} else {
@@ -1738,7 +1738,7 @@ void LogicManager::HAND_August_WaitTyler(HAND_PARAMS) {
 		send(kCharacterAugust, kCharacterTableD, 136455232, 0);
 		startCycOtis(kCharacterAugust, "010B");
 
-		if (!_gameProgress[kProgressEventMetAugust])
+		if (!_globals[kProgressEventMetAugust])
 			getCharacterCurrentParams(kCharacterAugust)[1] = 128;
 
 		getCharacter(kCharacterAugust).inventoryItem = getCharacterCurrentParams(kCharacterAugust)[1];
@@ -1781,7 +1781,7 @@ void LogicManager::HAND_August_WaitTyler(HAND_PARAMS) {
 			AugustCall(&LogicManager::CONS_August_FinishSeqOtis, 0, 0, 0, 0);
 			break;
 		case 6:
-			_gameProgress[kProgressField14] = 2;
+			_globals[kProgressField14] = 2;
 			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 7;
 			AugustCall(&LogicManager::CONS_August_DoWalk, 3, 8200, 0, 0);
 			break;
@@ -1821,11 +1821,11 @@ void LogicManager::CONS_August_SeekTyler(CONS_PARAMS) {
 void LogicManager::HAND_August_SeekTyler(HAND_PARAMS) {
 	switch (msg->action) {
 	case 12:
-		if (_gameProgress[kProgressEventMetAugust] || _gameProgress[kProgressField14]) {
+		if (_globals[kProgressEventMetAugust] || _globals[kProgressField14]) {
 			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 5;
 			AugustCall(&LogicManager::CONS_August_DoWalk, 3, 6470, 0, 0);
 		} else {
-			_gameProgress[kProgressField14] = 2;
+			_globals[kProgressField14] = 2;
 			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 1;
 			AugustCall(&LogicManager::CONS_August_DoWalk, 3, 8200, 0, 0);
 		}
@@ -1846,8 +1846,8 @@ void LogicManager::HAND_August_SeekTyler(HAND_PARAMS) {
 			AugustCall(&LogicManager::CONS_August_EnterComp, 0, 0, 0, 0);
 			break;
 		case 4:
-			if (_gameProgress[kProgressField14] == 2)
-				_gameProgress[kProgressField14] = 0;
+			if (_globals[kProgressField14] == 2)
+				_globals[kProgressField14] = 0;
 
 			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 7;
 			AugustCall(&LogicManager::CONS_August_CompLogic, _gameTime + 900, 0, 0, 0);
@@ -1945,7 +1945,7 @@ void LogicManager::HAND_August_OrderDinner(HAND_PARAMS) {
 		AugustCall(&LogicManager::CONS_August_DoNIS1006, 0, 0, 0, 0);
 		break;
 	case 12:
-		if (!_gameProgress[kProgressEventMetAugust] && _gameProgress[kProgressJacket] == 2)
+		if (!_globals[kProgressEventMetAugust] && _globals[kProgressJacket] == 2)
 			getCharacterCurrentParams(kCharacterAugust)[0] = 128;
 
 		startCycOtis(kCharacterAugust, "010B");
@@ -2001,13 +2001,13 @@ void LogicManager::CONS_August_EatingDinner(CONS_PARAMS) {
 void LogicManager::HAND_August_EatingDinner(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
-		if (_gameProgress[kProgressField28] && !getCharacterCurrentParams(kCharacterAugust)[1] && getCharacterCurrentParams(kCharacterAugust)[2] != 0x7FFFFFFF && _gameTime) {
+		if (_globals[kProgressField28] && !getCharacterCurrentParams(kCharacterAugust)[1] && getCharacterCurrentParams(kCharacterAugust)[2] != 0x7FFFFFFF && _gameTime) {
 			if (_gameTime <= 1134000) {
 				if (!inDiningRoom(kCharacterCath) || dialogRunning("MRB1076") || dialogRunning("MRB1078") || dialogRunning("MRB1078A") || !getCharacterCurrentParams(kCharacterAugust)[2]) {
 					getCharacterCurrentParams(kCharacterAugust)[2] = _gameTime + 225;
 					if (_gameTime == -225) {
 						getCharacter(kCharacterAugust).inventoryItem = 0;
-						_gameProgress[kProgressField28] = 0;
+						_globals[kProgressField28] = 0;
 						CONS_August_GreetAnna(0, 0, 0, 0);
 						break;
 					}
@@ -2019,7 +2019,7 @@ void LogicManager::HAND_August_EatingDinner(HAND_PARAMS) {
 
 			getCharacterCurrentParams(kCharacterAugust)[2] = 0x7FFFFFFF;
 			getCharacter(kCharacterAugust).inventoryItem = 0;
-			_gameProgress[kProgressField28] = 0;
+			_globals[kProgressField28] = 0;
 			CONS_August_GreetAnna(0, 0, 0, 0);
 		}
 
@@ -2031,7 +2031,7 @@ void LogicManager::HAND_August_EatingDinner(HAND_PARAMS) {
 		AugustCall(&LogicManager::CONS_August_DoNIS1006, 0, 0, 0, 0);
 		break;
 	case 12:
-		if (!_gameProgress[kProgressEventMetAugust] && _gameProgress[kProgressJacket] == 2)
+		if (!_globals[kProgressEventMetAugust] && _globals[kProgressJacket] == 2)
 			getCharacterCurrentParams(kCharacterAugust)[0] = 128;
 
 		getCharacter(kCharacterAugust).inventoryItem = getCharacterCurrentParams(kCharacterAugust)[0];
@@ -2067,8 +2067,8 @@ void LogicManager::CONS_August_GreetAnna(CONS_PARAMS) {
 void LogicManager::HAND_August_GreetAnna(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
-		if (getCharacterCurrentParams(kCharacterAugust)[2] || (getCharacterCurrentParams(kCharacterAugust)[2] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
-			if (getCharacterCurrentParams(kCharacterAugust)[2] >= _currentGameSessionTicks)
+		if (getCharacterCurrentParams(kCharacterAugust)[2] || (getCharacterCurrentParams(kCharacterAugust)[2] = _realTime + 75, _realTime != -75)) {
+			if (getCharacterCurrentParams(kCharacterAugust)[2] >= _realTime)
 				break;
 
 			getCharacterCurrentParams(kCharacterAugust)[2] = 0x7FFFFFFF;
@@ -2093,7 +2093,7 @@ void LogicManager::HAND_August_GreetAnna(HAND_PARAMS) {
 		} else if (getCharacterCurrentParams(kCharacterAugust)[1]) {
 			getCharacterCurrentParams(kCharacterAugust)[1] = 0;
 
-			if (_gameProgress[kProgressEventMetAugust])
+			if (_globals[kProgressEventMetAugust])
 				getCharacter(kCharacterAugust).inventoryItem = 0;
 
 			playDialog(kCharacterAugust, "AUG1003A", -1, 0);
@@ -2129,12 +2129,12 @@ void LogicManager::HAND_August_GreetAnna(HAND_PARAMS) {
 			playDialog(kCharacterAugust, "AUG1003", -1, 0);
 
 			if (inDiningRoom(kCharacterCath))
-				_gameProgress[kProgressField60] = 1;
+				_globals[kProgressField60] = 1;
 
 			getCharacterCurrentParams(kCharacterAugust)[1] = 1;
 			break;
 		case 4:
-			if (_gameProgress[kProgressEventMetAugust]) {
+			if (_globals[kProgressEventMetAugust]) {
 				playNIS(kEventAugustPresentAnna);
 				send(kCharacterAugust, kCharacterAnna, 201437056, 0);
 				startSeqOtis(kCharacterAugust, "803GS");
@@ -2212,7 +2212,7 @@ void LogicManager::HAND_August_ReturnFromDinner(HAND_PARAMS) {
 			break;
 		case 3:
 		case 4:
-			if (_gameProgress[kProgressField14] == 29) {
+			if (_globals[kProgressField14] == 29) {
 				getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 4;
 				AugustCall(&LogicManager::CONS_August_CompLogic, _gameTime + 900, 0, 0, 0);
 			} else {
@@ -2301,8 +2301,8 @@ void LogicManager::HAND_August_GoSalon(HAND_PARAMS) {
 		}
 
 		if (getCharacterCurrentParams(kCharacterAugust)[2]) {
-			if (getCharacterCurrentParams(kCharacterAugust)[7] || (getCharacterCurrentParams(kCharacterAugust)[7] = _currentGameSessionTicks + 90, _currentGameSessionTicks != -90)) {
-				if (getCharacterCurrentParams(kCharacterAugust)[7] >= _currentGameSessionTicks)
+			if (getCharacterCurrentParams(kCharacterAugust)[7] || (getCharacterCurrentParams(kCharacterAugust)[7] = _realTime + 90, _realTime != -90)) {
+				if (getCharacterCurrentParams(kCharacterAugust)[7] >= _realTime)
 					break;
 
 				getCharacterCurrentParams(kCharacterAugust)[7] = 0x7FFFFFFF;
@@ -2394,7 +2394,7 @@ void LogicManager::CONS_August_BackFromSalon(CONS_PARAMS) {
 void LogicManager::HAND_August_BackFromSalon(HAND_PARAMS) {
 	switch (msg->action) {
 	case 12:
-		if (_gameProgress[kProgressEventMetAugust]) {
+		if (_globals[kProgressEventMetAugust]) {
 			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 1;
 			AugustCall(&LogicManager::CONS_August_CompLogic, _gameTime + 9000, 0, 0, 0);
 		} else {
@@ -2428,7 +2428,7 @@ void LogicManager::CONS_August_Asleep(CONS_PARAMS) {
 void LogicManager::HAND_August_Asleep(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
-		if (!whoRunningDialog(kCharacterAugust) && _gameProgress[kProgressField18] != 4) {
+		if (!whoRunningDialog(kCharacterAugust) && _globals[kProgressField18] != 4) {
 			playDialog(kCharacterAugust, "AUG1057", -1, 0);
 		}
 
@@ -2508,7 +2508,7 @@ void LogicManager::HAND_August_AtBreakfast(HAND_PARAMS) {
 		AugustCall(&LogicManager::CONS_August_SaveGame, 2, kEventAugustGoodMorning, 0, 0);
 		break;
 	case 12:
-		if (!_gameEvents[kEventAugustGoodMorning])
+		if (!_doneNIS[kEventAugustGoodMorning])
 			getCharacter(kCharacterAugust).inventoryItem = 0x80;
 
 		send(kCharacterAugust, kCharacterTableA, 136455232, 0);
@@ -2541,7 +2541,7 @@ void LogicManager::HAND_August_AtBreakfast(HAND_PARAMS) {
 			CONS_August_OpenComp(0, 0, 0, 0);
 			break;
 		case 6:
-			if (!_gameEvents[kEventAugustGoodMorning])
+			if (!_doneNIS[kEventAugustGoodMorning])
 				getCharacter(kCharacterAugust).inventoryItem = 0x80;
 			send(kCharacterAugust, kCharacterWaiter1, 219522616, 0);
 			startCycOtis(kCharacterAugust, "016B");
@@ -2815,7 +2815,7 @@ void LogicManager::HAND_August_DoWalkP3A(HAND_PARAMS) {
 			getCharacter(kCharacterAugust).currentCall--;
 			_engine->getMessageManager()->setMessageHandle(kCharacterAugust, _functionsAugust[getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall]]);
 			fedEx(kCharacterAugust, kCharacterAugust, 18, 0);
-		} else if (!_gameEvents[kEventAugustMerchandise] && nearChar(kCharacterAugust, kCharacterCath, 1000) && !inComp(kCharacterCath) && !whoOutside(kCharacterCath)) {
+		} else if (!_doneNIS[kEventAugustMerchandise] && nearChar(kCharacterAugust, kCharacterCath, 1000) && !inComp(kCharacterCath) && !whoOutside(kCharacterCath)) {
 			if (getCharacter(kCharacterAugust).characterPosition.car == kCarGreenSleeping || getCharacter(kCharacterAugust).characterPosition.car == kCarRedSleeping) {
 				playNIS(kEventAugustMerchandise);
 				if (getCharacter(kCharacterAugust).direction == 1)
@@ -2840,7 +2840,7 @@ void LogicManager::HAND_August_DoWalkP3A(HAND_PARAMS) {
 
 		break;
 	case 5:
-		if (_gameProgress[kProgressEventMetAugust]) {
+		if (_globals[kProgressEventMetAugust]) {
 			if (rnd(2) == 0) {
 				playDialog(kCharacterCath, "CAT1002A", -1, 0);
 			} else {
@@ -2859,7 +2859,7 @@ void LogicManager::HAND_August_DoWalkP3A(HAND_PARAMS) {
 			getCharacter(kCharacterAugust).currentCall--;
 			_engine->getMessageManager()->setMessageHandle(kCharacterAugust, _functionsAugust[getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall]]);
 			fedEx(kCharacterAugust, kCharacterAugust, 18, 0);
-		} else if (_gameEvents[kEventAugustMerchandise] && !_gameEvents[kEventAugustTalkGold] && !_gameEvents[kEventAugustTalkGoldDay]) {
+		} else if (_doneNIS[kEventAugustMerchandise] && !_doneNIS[kEventAugustTalkGold] && !_doneNIS[kEventAugustTalkGoldDay]) {
 			getCharacterCurrentParams(kCharacterAugust)[2] = 128;
 		}
 
@@ -2906,7 +2906,7 @@ void LogicManager::HAND_August_DoWalkP3B(HAND_PARAMS) {
 		getCharacter(kCharacterAugust).inventoryItem = 0;
 		playDialog(0, "CAT1002", -1, 0);
 
-		if (_gameEvents[kEventAugustBringBriefcase]) {
+		if (_doneNIS[kEventAugustBringBriefcase]) {
 			playDialog(kCharacterAugust, "AUG3103", -1, 15);
 		} else {
 			playDialog(kCharacterAugust, "AUG3100", -1, 15);
@@ -2925,7 +2925,7 @@ void LogicManager::HAND_August_DoWalkP3B(HAND_PARAMS) {
 			fedEx(kCharacterAugust, kCharacterAugust, 18, 0);
 		} else if (getCharacterCurrentParams(kCharacterAugust)[2]) {
 			getCharacterCurrentParams(kCharacterAugust)[3] = 128;
-			if (!_gameEvents[kEventAugustBringBriefcase])
+			if (!_doneNIS[kEventAugustBringBriefcase])
 				getCharacterCurrentParams(kCharacterAugust)[3] = 147;
 		}
 
@@ -2999,7 +2999,7 @@ void LogicManager::HAND_August_GoLunch(HAND_PARAMS) {
 		case 5:
 			getCharacter(kCharacterAugust).characterPosition.location = 1;
 			startCycOtis(kCharacterAugust, "010B2");
-			if (!_gameEvents[kEventAugustLunch])
+			if (!_doneNIS[kEventAugustLunch])
 				getCharacter(kCharacterAugust).inventoryItem = 0x80;
 
 			break;
@@ -3047,7 +3047,7 @@ void LogicManager::HAND_August_ReturnLunch(HAND_PARAMS) {
 	case 18:
 		switch (getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8]) {
 		case 1:
-			if (_gameEvents[kEventAugustMerchandise]) {
+			if (_doneNIS[kEventAugustMerchandise]) {
 				getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 4;
 				AugustCall(&LogicManager::CONS_August_DoWalkP3A, 3, 6470, 0, 0);
 			} else {
@@ -3247,7 +3247,7 @@ void LogicManager::HAND_August_Dressing(HAND_PARAMS) {
 		break;
 	case 8:
 	case 9:
-		if (!_gameEvents[kEventAugustTalkCompartmentDoorBlueRedingote] && !_gameEvents[kEventAugustTalkCompartmentDoor] && !_gameEvents[kEventAugustBringEgg] && !_gameEvents[kEventAugustBringBriefcase]) {
+		if (!_doneNIS[kEventAugustTalkCompartmentDoorBlueRedingote] && !_doneNIS[kEventAugustTalkCompartmentDoor] && !_doneNIS[kEventAugustBringEgg] && !_doneNIS[kEventAugustBringBriefcase]) {
 			if (msg->action == 8)
 				playDialog(0, "LIB012", -1, 0);
 
@@ -3407,8 +3407,8 @@ void LogicManager::HAND_August_AfterConcert(HAND_PARAMS) {
 
 			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 3;
 			AugustCall(&LogicManager::CONS_August_SaveGame, 2, kEventAugustBringBriefcase, 0, 0);
-		} else if (!cathHasItem(kItemFirebird) || _gameEvents[kEventAugustBringEgg]) {
-			if (_gameEvents[kEventAugustTalkCompartmentDoorBlueRedingote] || _gameEvents[kEventAugustBringEgg] || _gameEvents[kEventAugustBringBriefcase]) {
+		} else if (!cathHasItem(kItemFirebird) || _doneNIS[kEventAugustBringEgg]) {
+			if (_doneNIS[kEventAugustTalkCompartmentDoorBlueRedingote] || _doneNIS[kEventAugustBringEgg] || _doneNIS[kEventAugustBringBriefcase]) {
 				setDoor(3, kCharacterAugust, 1, 0, 0);
 
 				if (msg->action == 8) {
@@ -3530,7 +3530,7 @@ void LogicManager::CONS_August_InSalon3(CONS_PARAMS) {
 void LogicManager::HAND_August_InSalon3(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
-		if (!getCharacterCurrentParams(kCharacterAugust)[3] || getCharacterCurrentParams(kCharacterAugust)[1] || _gameProgress[kProgressField44]) {
+		if (!getCharacterCurrentParams(kCharacterAugust)[3] || getCharacterCurrentParams(kCharacterAugust)[1] || _globals[kProgressField44]) {
 			getCharacter(kCharacterAugust).inventoryItem = 0;
 		} else {
 			getCharacter(kCharacterAugust).inventoryItem = 0x80;
@@ -3606,7 +3606,7 @@ void LogicManager::HAND_August_InSalon3(HAND_PARAMS) {
 	case 122288808:
 		startCycOtis(kCharacterAugust, "122B");
 		getCharacterCurrentParams(kCharacterAugust)[1] = 0;
-		if (_gameEvents[kEventAugustTalkCigar])
+		if (_doneNIS[kEventAugustTalkCigar])
 			getCharacterCurrentParams(kCharacterAugust)[0] = 9000;
 
 		break;
@@ -4045,8 +4045,8 @@ void LogicManager::HAND_August_Drinking(HAND_PARAMS) {
 		}
 
 		if (getCharacterCurrentParams(kCharacterAugust)[4] ||
-			(getCharacterCurrentParams(kCharacterAugust)[4] = _currentGameSessionTicks + getCharacterCurrentParams(kCharacterAugust)[0], _currentGameSessionTicks + getCharacterCurrentParams(kCharacterAugust)[0] != 0)) {
-			if (getCharacterCurrentParams(kCharacterAugust)[4] >= _currentGameSessionTicks)
+			(getCharacterCurrentParams(kCharacterAugust)[4] = _realTime + getCharacterCurrentParams(kCharacterAugust)[0], _realTime + getCharacterCurrentParams(kCharacterAugust)[0] != 0)) {
+			if (getCharacterCurrentParams(kCharacterAugust)[4] >= _realTime)
 				break;
 
 			getCharacterCurrentParams(kCharacterAugust)[4] = 0x7FFFFFFF;
@@ -4243,8 +4243,8 @@ void LogicManager::HAND_August_Hiding(HAND_PARAMS) {
 	case 0:
 		if (getCharacterCurrentParams(kCharacterAugust)[0]) {
 			if (getCharacterCurrentParams(kCharacterAugust)[3] ||
-				(getCharacterCurrentParams(kCharacterAugust)[3] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
-				if (getCharacterCurrentParams(kCharacterAugust)[3] >= _currentGameSessionTicks)
+				(getCharacterCurrentParams(kCharacterAugust)[3] = _realTime + 75, _realTime != -75)) {
+				if (getCharacterCurrentParams(kCharacterAugust)[3] >= _realTime)
 					break;
 
 				getCharacterCurrentParams(kCharacterAugust)[3] = 0x7FFFFFFF;
@@ -4368,7 +4368,7 @@ void LogicManager::HAND_August_CutLoose(HAND_PARAMS) {
 		break;
 	case 18:
 		if (getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] == 1) {
-			if (_gameProgress[kProgressFieldC])
+			if (_globals[kProgressFieldC])
 				playNIS(kEventAugustUnhookCarsBetrayal);
 			else
 				playNIS(kEventAugustUnhookCars);
diff --git a/engines/lastexpress/characters/clerk.cpp b/engines/lastexpress/characters/clerk.cpp
index 10dd70d94f6..936b25abcc9 100644
--- a/engines/lastexpress/characters/clerk.cpp
+++ b/engines/lastexpress/characters/clerk.cpp
@@ -266,8 +266,8 @@ void LogicManager::HAND_Clerk_DoHaremKnock(HAND_PARAMS) {
 				break;
 			}
 
-			_gameProgress[kProgressFieldDC] = 1;
-			_gameProgress[kProgressFieldE0] = 1;
+			_globals[kProgressFieldDC] = 1;
+			_globals[kProgressFieldE0] = 1;
 		} else {
 			if (getCharacterCurrentParams(kCharacterClerk)[5] && getCharacterCurrentParams(kCharacterClerk)[6]) {
 				getCharacterParams(kCharacterClerk, 8)[5]++;
@@ -296,7 +296,7 @@ void LogicManager::HAND_Clerk_DoHaremKnock(HAND_PARAMS) {
 						getCharacterCurrentParams(kCharacterClerk)[7] = 1;
 					}
 
-					_gameProgress[kProgressFieldE0] = 1;
+					_globals[kProgressFieldE0] = 1;
 
 				} else {
 					if (getCharacterCurrentParams(kCharacterClerk)[5]) {
@@ -319,7 +319,7 @@ void LogicManager::HAND_Clerk_DoHaremKnock(HAND_PARAMS) {
 								getCharacterCurrentParams(kCharacterClerk)[7] = 1;
 							}
 
-							_gameProgress[kProgressFieldDC] = 1;
+							_globals[kProgressFieldDC] = 1;
 						} else {
 							if (getCharacterCurrentParams(kCharacterClerk)[6]) {
 								getCharacterParams(kCharacterClerk, 8)[3]++;
@@ -374,7 +374,7 @@ void LogicManager::HAND_Clerk_Processing(HAND_PARAMS) {
 				if (!getCharacterCurrentParams(kCharacterClerk)[4]) {
 					getCharacterCurrentParams(kCharacterClerk)[3]--;
 
-					if (!getCharacterCurrentParams(kCharacterClerk)[3] && _gameProgress[kProgressJacket] == 2) {
+					if (!getCharacterCurrentParams(kCharacterClerk)[3] && _globals[kProgressJacket] == 2) {
 						if (isNight()) {
 							playNIS(kEventCathSmokeNight);
 						} else {
@@ -411,7 +411,7 @@ void LogicManager::HAND_Clerk_Processing(HAND_PARAMS) {
 			if (getCharacterParams(kCharacterClerk, 8)[7] && !whoRunningDialog(kCharacterTableF)) {
 				setDoor(
 					getCharacterParams(kCharacterClerk, 8)[7],
-					_gameObjects[getCharacterParams(kCharacterClerk, 8)[7]].character,
+					_doors[getCharacterParams(kCharacterClerk, 8)[7]].who,
 					3,
 					10,
 					9
@@ -433,7 +433,7 @@ void LogicManager::HAND_Clerk_Processing(HAND_PARAMS) {
 				if (getCharacterParams(kCharacterClerk, 8)[7] && !whoRunningDialog(kCharacterTableF)) {
 					setDoor(
 						getCharacterParams(kCharacterClerk, 8)[7],
-						_gameObjects[getCharacterParams(kCharacterClerk, 8)[7]].character,
+						_doors[getCharacterParams(kCharacterClerk, 8)[7]].who,
 						3,
 						10,
 						9
@@ -459,7 +459,7 @@ void LogicManager::HAND_Clerk_Processing(HAND_PARAMS) {
 		if (getCharacterParams(kCharacterClerk, 8)[7] && !whoRunningDialog(kCharacterTableF)) {
 			setDoor(
 				getCharacterParams(kCharacterClerk, 8)[7],
-				_gameObjects[getCharacterParams(kCharacterClerk, 8)[7]].character,
+				_doors[getCharacterParams(kCharacterClerk, 8)[7]].who,
 				3,
 				10,
 				9);
@@ -490,7 +490,7 @@ void LogicManager::HAND_Clerk_Processing(HAND_PARAMS) {
 		break;
 	case 12:
 		getCharacterCurrentParams(kCharacterClerk)[2] = 1;
-		if (_gameProgress[kProgressChapter] < 5) {
+		if (_globals[kProgressChapter] < 5) {
 			setDoor(5, kCharacterClerk, 3, 10, 9);
 			setDoor(6, kCharacterClerk, 3, 10, 9);
 			setDoor(7, kCharacterClerk, 3, 10, 9);
@@ -518,7 +518,7 @@ void LogicManager::HAND_Clerk_Processing(HAND_PARAMS) {
 			switch (getCharacter(kCharacterCath).characterPosition.car) {
 			case 1:
 			case 6:
-				if (_gameProgress[kProgressIsDayTime]) {
+				if (_globals[kProgressIsDayTime]) {
 					startCycOtis(kCharacterClerk, "B1WNM");
 				} else if (isNight()) {
 					startCycOtis(kCharacterClerk, "B1WNN");
@@ -529,7 +529,7 @@ void LogicManager::HAND_Clerk_Processing(HAND_PARAMS) {
 				break;
 			case 3:
 			case 4:
-				if (_gameProgress[kProgressIsDayTime]) {
+				if (_globals[kProgressIsDayTime]) {
 					startCycOtis(kCharacterClerk, "S1WNM");
 				} else if (isNight()) {
 					startCycOtis(kCharacterClerk, "S1WNN");
@@ -539,7 +539,7 @@ void LogicManager::HAND_Clerk_Processing(HAND_PARAMS) {
 
 				break;
 			case 5:
-				if (_gameProgress[kProgressIsDayTime]) {
+				if (_globals[kProgressIsDayTime]) {
 					startCycOtis(kCharacterClerk, "RCWNM");
 				} else if (isNight()) {
 					startCycOtis(kCharacterClerk, "RCWNN");
@@ -562,7 +562,7 @@ void LogicManager::HAND_Clerk_Processing(HAND_PARAMS) {
 			getCharacterCurrentParams(kCharacterClerk)[4] = 0;
 		}
 
-		if (_gameProgress[kProgressJacket] != 1) {
+		if (_globals[kProgressJacket] != 1) {
 			if (getCharacterCurrentParams(kCharacterClerk)[7] && !inComp(kCharacterCath, getCharacterCurrentParams(kCharacterClerk)[8], getCharacterCurrentParams(kCharacterClerk)[9]) && !inComp(kCharacterCath, getCharacterCurrentParams(kCharacterClerk)[8], getCharacterCurrentParams(kCharacterClerk)[10])) {
 				if (dialogRunning((char *)&getCharacterCurrentParams(kCharacterClerk)[11]))
 					fadeDialog((char *)&getCharacterCurrentParams(kCharacterClerk)[11]);
diff --git a/engines/lastexpress/characters/cond1.cpp b/engines/lastexpress/characters/cond1.cpp
index 678e16b773a..30b0beed67d 100644
--- a/engines/lastexpress/characters/cond1.cpp
+++ b/engines/lastexpress/characters/cond1.cpp
@@ -106,7 +106,7 @@ void LogicManager::CONS_Cond1_DoSeqOtis(CONS_PARAMS) {
 void LogicManager::HAND_Cond1_DoSeqOtis(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
-		if (_gameProgress[kProgressJacket] == 1 &&
+		if (_globals[kProgressJacket] == 1 &&
 			nearChar(kCharacterCond1, kCharacterCath, 1000) &&
 			!inComp(kCharacterCath) && !whoOutside(kCharacterCath)) {
 
@@ -152,7 +152,7 @@ void LogicManager::CONS_Cond1_DoCorrOtis(CONS_PARAMS) {
 void LogicManager::HAND_Cond1_DoCorrOtis(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
-		if (_gameProgress[kProgressJacket] == 1 &&
+		if (_globals[kProgressJacket] == 1 &&
 			nearChar(kCharacterCond1, kCharacterCath, 1000) &&
 			!inComp(kCharacterCath) && !whoOutside(kCharacterCath)) {
 
@@ -200,7 +200,7 @@ void LogicManager::CONS_Cond1_DoBriefCorrOtis(CONS_PARAMS) {
 void LogicManager::HAND_Cond1_DoBriefCorrOtis(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
-		if (_gameProgress[kProgressJacket] == 1 &&
+		if (_globals[kProgressJacket] == 1 &&
 			nearChar(kCharacterCond1, kCharacterCath, 1000) &&
 			!inComp(kCharacterCath) && !whoOutside(kCharacterCath)) {
 
@@ -251,7 +251,7 @@ void LogicManager::CONS_Cond1_DoEnterCorrOtis(CONS_PARAMS) {
 void LogicManager::HAND_Cond1_DoEnterCorrOtis(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
-		if (_gameProgress[kProgressJacket] == 1 &&
+		if (_globals[kProgressJacket] == 1 &&
 			nearChar(kCharacterCond1, kCharacterCath, 1000) &&
 			!inComp(kCharacterCath) && !whoOutside(kCharacterCath)) {
 			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 1;
@@ -311,7 +311,7 @@ void LogicManager::HAND_Cond1_FinishSeqOtis(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
 		if (getCharacter(kCharacterCond1).direction == 4) {
-			if (_gameProgress[kProgressJacket] == 1 &&
+			if (_globals[kProgressJacket] == 1 &&
 				nearChar(kCharacterCond1, kCharacterCath, 1000) &&
 				!inComp(kCharacterCath) && !whoOutside(kCharacterCath)) {
 
@@ -357,7 +357,7 @@ void LogicManager::CONS_Cond1_DoDialog(CONS_PARAMS) {
 void LogicManager::HAND_Cond1_DoDialog(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
-		if (_gameProgress[kProgressJacket] == 1 &&
+		if (_globals[kProgressJacket] == 1 &&
 			nearChar(kCharacterCond1, kCharacterCath, 1000) &&
 			!inComp(kCharacterCath) && !whoOutside(kCharacterCath)) {
 
@@ -401,7 +401,7 @@ void LogicManager::CONS_Cond1_DoDialogFullVol(CONS_PARAMS) {
 void LogicManager::HAND_Cond1_DoDialogFullVol(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
-		if (_gameProgress[kProgressJacket] == 1 &&
+		if (_globals[kProgressJacket] == 1 &&
 			nearChar(kCharacterCond1, kCharacterCath, 1000) &&
 			!inComp(kCharacterCath) && !whoOutside(kCharacterCath)) {
 
@@ -500,13 +500,13 @@ void LogicManager::HAND_Cond1_DoWalk(HAND_PARAMS) {
 			break;
 		}
 
-		if (_gameProgress[kProgressJacket] == 1) {
+		if (_globals[kProgressJacket] == 1) {
 			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 1;
 			Cond1Call(&LogicManager::CONS_Cond1_SaveGame, 2, kEventMertensBloodJacket, 0, 0);
-		} else if ((getCharacterParams(kCharacterCond1, 8)[5] || getCharacterParams(kCharacterCond1, 8)[6]) && !_gameEvents[kEventKronosConversation] && _gameProgress[kProgressJacket] == 2) {
+		} else if ((getCharacterParams(kCharacterCond1, 8)[5] || getCharacterParams(kCharacterCond1, 8)[6]) && !_doneNIS[kEventKronosConversation] && _globals[kProgressJacket] == 2) {
 			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 2;
 			Cond1Call(&LogicManager::CONS_Cond1_SaveGame, 2, kEventMertensKronosInvitation, 0, 0);
-		} else if (getCharacterParams(kCharacterCond1, 8)[9] && _gameProgress[kProgressJacket] == 2 && !_gameProgress[kProgressEventMetAugust]) {
+		} else if (getCharacterParams(kCharacterCond1, 8)[9] && _globals[kProgressJacket] == 2 && !_globals[kProgressEventMetAugust]) {
 			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 3;
 			Cond1Call(&LogicManager::CONS_Cond1_SaveGame, 2, kEventMertensAugustWaiting, 0, 0);
 		} else {
@@ -530,8 +530,8 @@ void LogicManager::HAND_Cond1_DoWalk(HAND_PARAMS) {
 		getCharacterCurrentParams(kCharacterCond1)[2] = 0;
 		getCharacter(kCharacterCond1).inventoryItem = kItemNone;
 
-		if (_gameProgress[kProgressEventFoundCorpse] || _gameEvents[kEventMertensAskTylerCompartment] || _gameEvents[kEventMertensAskTylerCompartmentD]) {
-			if (getCharacterParams(kCharacterCond1, 8)[3] && _gameProgress[kProgressJacket] == 2 && !_gameEvents[kEventMertensDontMakeBed] && !_gameProgress[kProgressEventCorpseThrown]) {
+		if (_globals[kProgressEventFoundCorpse] || _doneNIS[kEventMertensAskTylerCompartment] || _doneNIS[kEventMertensAskTylerCompartmentD]) {
+			if (getCharacterParams(kCharacterCond1, 8)[3] && _globals[kProgressJacket] == 2 && !_doneNIS[kEventMertensDontMakeBed] && !_globals[kProgressEventCorpseThrown]) {
 				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 6;
 				Cond1Call(&LogicManager::CONS_Cond1_SaveGame, 2, kEventMertensDontMakeBed, 0, 0);
 			}
@@ -548,7 +548,7 @@ void LogicManager::HAND_Cond1_DoWalk(HAND_PARAMS) {
 		playChrExcuseMe(kCharacterCond1, kCharacterCath, 0);
 		break;
 	case 12:
-		if (!_gameProgress[kProgressEventFoundCorpse] && !_gameEvents[kEventMertensAskTylerCompartment] && !_gameEvents[kEventMertensAskTylerCompartmentD] || getCharacterParams(kCharacterCond1, 8)[3] && _gameProgress[kProgressJacket] == 2 && !_gameEvents[kEventMertensDontMakeBed] && !_gameProgress[kProgressEventCorpseThrown]) {
+		if (!_globals[kProgressEventFoundCorpse] && !_doneNIS[kEventMertensAskTylerCompartment] && !_doneNIS[kEventMertensAskTylerCompartmentD] || getCharacterParams(kCharacterCond1, 8)[3] && _globals[kProgressJacket] == 2 && !_doneNIS[kEventMertensDontMakeBed] && !_globals[kProgressEventCorpseThrown]) {
 			getCharacterCurrentParams(kCharacterCond1)[2] = 1;
 		}
 
@@ -564,7 +564,7 @@ void LogicManager::HAND_Cond1_DoWalk(HAND_PARAMS) {
 		case 1:
 			playNIS(kEventMertensBloodJacket);
 			endGame(0, 1, 55, true);
-			break;
+			return;
 		case 2:
 			if (getCharacter(kCharacterCond1).characterPosition.position < getCharacter(kCharacterCath).characterPosition.position) {
 				playNIS(kEventMertensKronosInvitation);
@@ -572,7 +572,7 @@ void LogicManager::HAND_Cond1_DoWalk(HAND_PARAMS) {
 				playNIS(kEventMertensKronosInvitationClosedWindows);
 			}
 
-			_gameProgress[kProgressEventMertensChronosInvitation] = 1;
+			_globals[kProgressEventMertensChronosInvitation] = 1;
 			getCharacterParams(kCharacterCond1, 8)[6] = 0;
 			getCharacterParams(kCharacterCond1, 8)[5] = 0;
 
@@ -599,7 +599,7 @@ void LogicManager::HAND_Cond1_DoWalk(HAND_PARAMS) {
 			break;
 		case 3:
 			playNIS(kEventMertensAugustWaiting);
-			_gameProgress[kProgressEventMertensAugustWaiting] = 1;
+			_globals[kProgressEventMertensAugustWaiting] = 1;
 			getCharacterParams(kCharacterCond1, 8)[9] = 0;
 
 			if (getCharacterCurrentParams(kCharacterCond1)[0] == 3 && getCharacterCurrentParams(kCharacterCond1)[1] == 8200) {
@@ -641,7 +641,7 @@ void LogicManager::HAND_Cond1_DoWalk(HAND_PARAMS) {
 			else
 				bumpCathRx(getCharacter(kCharacterCond1).characterPosition.car, getCharacter(kCharacterCond1).characterPosition.position + 750);
 
-			break;
+			return;
 		case 6:
 			playNIS(kEventMertensDontMakeBed);
 
@@ -651,9 +651,9 @@ void LogicManager::HAND_Cond1_DoWalk(HAND_PARAMS) {
 				bumpCathRx(getCharacter(kCharacterCond1).characterPosition.car, getCharacter(kCharacterCond1).characterPosition.position + 750);
 
 			getCharacterParams(kCharacterCond1, 8)[3] = 0;
-			break;
+			return;
 		default:
-			break;
+			return;
 		}
 
 		if (walk(kCharacterCond1, getCharacterCurrentParams(kCharacterCond1)[0], getCharacterCurrentParams(kCharacterCond1)[1])) {
@@ -684,7 +684,7 @@ void LogicManager::CONS_Cond1_DoWait(CONS_PARAMS) {
 void LogicManager::HAND_Cond1_DoWait(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
-		if (_gameProgress[kProgressJacket] == 1 &&
+		if (_globals[kProgressJacket] == 1 &&
 			nearChar(kCharacterCond1, kCharacterCath, 1000) &&
 			!inComp(kCharacterCath) && !whoOutside(kCharacterCath)) {
 
@@ -735,7 +735,7 @@ void LogicManager::HAND_Cond1_StandAsideDialog(HAND_PARAMS) {
 		if (!whoRunningDialog(kCharacterCond1)) {
 			if (isNight()) {
 				if (!isFemale(getCharacterCurrentParams(kCharacterCond1)[0])) {
-					if (getCharacterCurrentParams(kCharacterCond1)[0] || _gameProgress[kProgressField18] != 2) {
+					if (getCharacterCurrentParams(kCharacterCond1)[0] || _globals[kProgressField18] != 2) {
 						playDialog(kCharacterCond1, "CON1112F", -1, 0);
 					} else {
 						switch (rnd(3)) {
@@ -804,7 +804,7 @@ void LogicManager::CONS_Cond1_Passing(CONS_PARAMS) {
 void LogicManager::HAND_Cond1_Passing(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
-		if (_gameProgress[kProgressJacket] == 1 &&
+		if (_globals[kProgressJacket] == 1 &&
 			nearChar(kCharacterCond1, kCharacterCath, 1000) &&
 			!inComp(kCharacterCath) && !whoOutside(kCharacterCath)) {
 			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 4;
@@ -813,8 +813,8 @@ void LogicManager::HAND_Cond1_Passing(HAND_PARAMS) {
 		}
 		if (!getCharacterCurrentParams(kCharacterCond1)[1] && !getCharacterCurrentParams(kCharacterCond1)[2]) {
 			if (!getCharacterCurrentParams(kCharacterCond1)[3]) {
-				getCharacterCurrentParams(kCharacterCond1)[3] = _currentGameSessionTicks + 75;
-				if (_currentGameSessionTicks + 75 == 0) {
+				getCharacterCurrentParams(kCharacterCond1)[3] = _realTime + 75;
+				if (_realTime + 75 == 0) {
 					getCharacter(kCharacterCond1).inventoryItem = kItemNone;
 					getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 5;
 					Cond1Call(&LogicManager::CONS_Cond1_SitDownFast, 0, 0, 0, 0);
@@ -822,7 +822,7 @@ void LogicManager::HAND_Cond1_Passing(HAND_PARAMS) {
 				}
 			}
 
-			if (getCharacterCurrentParams(kCharacterCond1)[3] < _currentGameSessionTicks) {
+			if (getCharacterCurrentParams(kCharacterCond1)[3] < _realTime) {
 				getCharacterCurrentParams(kCharacterCond1)[3] = 0x7FFFFFFF;
 				getCharacter(kCharacterCond1).inventoryItem = kItemNone;
 				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 5;
@@ -832,8 +832,8 @@ void LogicManager::HAND_Cond1_Passing(HAND_PARAMS) {
 		}
 
 		if (!getCharacterCurrentParams(kCharacterCond1)[4]) {
-			getCharacterCurrentParams(kCharacterCond1)[4] = _currentGameSessionTicks + 225;
-			if (_currentGameSessionTicks + 225 == 0) {
+			getCharacterCurrentParams(kCharacterCond1)[4] = _realTime + 225;
+			if (_realTime + 225 == 0) {
 				getCharacter(kCharacterCond1).inventoryItem = kItemNone;
 				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 6;
 				Cond1Call(&LogicManager::CONS_Cond1_SitDownFast, 0, 0, 0, 0);
@@ -841,8 +841,8 @@ void LogicManager::HAND_Cond1_Passing(HAND_PARAMS) {
 			}
 		}
 
-		if (getCharacterCurrentParams(kCharacterCond1)[4] >= _currentGameSessionTicks) {
-			getCharacter(kCharacterCond1).inventoryItem = _gameProgress[kProgressChapter] == 1 && !getCharacterParams(kCharacterCond1, 8)[16] && !_gameProgress[kProgressEventFoundCorpse] && !_gameEvents[kEventMertensAskTylerCompartment] && !_gameEvents[kEventMertensAskTylerCompartmentD];
+		if (getCharacterCurrentParams(kCharacterCond1)[4] >= _realTime) {
+			getCharacter(kCharacterCond1).inventoryItem = _globals[kProgressChapter] == 1 && !getCharacterParams(kCharacterCond1, 8)[16] && !_globals[kProgressEventFoundCorpse] && !_doneNIS[kEventMertensAskTylerCompartment] && !_doneNIS[kEventMertensAskTylerCompartmentD];
 		} else {
 			getCharacterCurrentParams(kCharacterCond1)[4] = 0x7FFFFFFF;
 			getCharacter(kCharacterCond1).inventoryItem = kItemNone;
@@ -871,7 +871,7 @@ void LogicManager::HAND_Cond1_Passing(HAND_PARAMS) {
 			break;
 		}
 
-		if (_gameProgress[kProgressChapter] == 3 && !getCharacterCurrentParams(kCharacterCond1)[0] && _gameTime < 2173500 && (_gameTime > 2106000 || getCharacterCurrentParams(kCharacterCond1)[1] && _gameTime > 2079000)) {
+		if (_globals[kProgressChapter] == 3 && !getCharacterCurrentParams(kCharacterCond1)[0] && _gameTime < 2173500 && (_gameTime > 2106000 || getCharacterCurrentParams(kCharacterCond1)[1] && _gameTime > 2079000)) {
 			if (getCharacterCurrentParams(kCharacterCond1)[1] == 2) {
 				playDialog(kCharacterCond1, "CON3052", -1, 0);
 				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 3;
@@ -886,7 +886,7 @@ void LogicManager::HAND_Cond1_Passing(HAND_PARAMS) {
 				break;
 			}
 			if (!getCharacterCurrentParams(kCharacterCond1)[1]) {
-				if (_gameProgress[kProgressField40])
+				if (_globals[kProgressField40])
 					playDialog(kCharacterCond1, "CON3054", -1, 0);
 				else
 					playDialog(kCharacterCond1, "CON3053", -1, 0);
@@ -913,7 +913,7 @@ void LogicManager::HAND_Cond1_Passing(HAND_PARAMS) {
 		}
 		return;
 	case 17:
-		if (checkCathDir(kCarGreenSleeping, 23) && getCharacterParams(kCharacterCond1, 8)[6] && !_gameEvents[kProgressFieldCC]) {
+		if (checkCathDir(kCarGreenSleeping, 23) && getCharacterParams(kCharacterCond1, 8)[6] && !_doneNIS[kProgressFieldCC]) {
 			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 8;
 			Cond1Call(&LogicManager::CONS_Cond1_SaveGame, 2, kEventMertensKronosInvitation, 0, 0);
 		} else {
@@ -994,7 +994,7 @@ void LogicManager::CONS_Cond1_Listen(CONS_PARAMS) {
 void LogicManager::HAND_Cond1_Listen(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
-		if (_gameProgress[kProgressJacket] == 1 &&
+		if (_globals[kProgressJacket] == 1 &&
 			nearChar(kCharacterCond1, kCharacterCath, 1000) &&
 			!inComp(kCharacterCath) && !whoOutside(kCharacterCath)) {
 			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 4;
@@ -1522,16 +1522,16 @@ void LogicManager::HAND_Cond1_MakeBed(HAND_PARAMS) {
 		break;
 	case 12:
 		getCharacterCurrentParams(kCharacterCond1)[2] = 1;
-		getCharacterCurrentParams(kCharacterCond1)[3] = _gameObjects[getCharacterCurrentParams(kCharacterCond1)[0]].character;
-		getCharacterCurrentParams(kCharacterCond1)[4] = _gameObjects[getCharacterCurrentParams(kCharacterCond1)[0]].door;
-		getCharacterCurrentParams(kCharacterCond1)[5] = _gameObjects[getCharacterCurrentParams(kCharacterCond1)[0]].cursor;
-		getCharacterCurrentParams(kCharacterCond1)[6] = _gameObjects[getCharacterCurrentParams(kCharacterCond1)[0]].cursor2;
+		getCharacterCurrentParams(kCharacterCond1)[3] = _doors[getCharacterCurrentParams(kCharacterCond1)[0]].who;
+		getCharacterCurrentParams(kCharacterCond1)[4] = _doors[getCharacterCurrentParams(kCharacterCond1)[0]].status;
+		getCharacterCurrentParams(kCharacterCond1)[5] = _doors[getCharacterCurrentParams(kCharacterCond1)[0]].windowCursor;
+		getCharacterCurrentParams(kCharacterCond1)[6] = _doors[getCharacterCurrentParams(kCharacterCond1)[0]].handleCursor;
 
 		if (getCharacterCurrentParams(kCharacterCond1)[1]) {
-			getCharacterCurrentParams(kCharacterCond1)[7] = _gameObjects[getCharacterCurrentParams(kCharacterCond1)[1]].character;
-			getCharacterCurrentParams(kCharacterCond1)[8] = _gameObjects[getCharacterCurrentParams(kCharacterCond1)[1]].door;
-			getCharacterCurrentParams(kCharacterCond1)[9] = _gameObjects[getCharacterCurrentParams(kCharacterCond1)[1]].cursor;
-			getCharacterCurrentParams(kCharacterCond1)[10] = _gameObjects[getCharacterCurrentParams(kCharacterCond1)[1]].cursor2;
+			getCharacterCurrentParams(kCharacterCond1)[7] = _doors[getCharacterCurrentParams(kCharacterCond1)[1]].who;
+			getCharacterCurrentParams(kCharacterCond1)[8] = _doors[getCharacterCurrentParams(kCharacterCond1)[1]].status;
+			getCharacterCurrentParams(kCharacterCond1)[9] = _doors[getCharacterCurrentParams(kCharacterCond1)[1]].windowCursor;
+			getCharacterCurrentParams(kCharacterCond1)[10] = _doors[getCharacterCurrentParams(kCharacterCond1)[1]].handleCursor;
 			setDoor(getCharacterCurrentParams(kCharacterCond1)[1], kCharacterCond1, 1, 10, 9);
 		}
 
@@ -1727,8 +1727,8 @@ void LogicManager::HAND_Cond1_MakeBedAugust(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
 		if (!getCharacterCurrentParams(kCharacterCond1)[0]) {
-			if (getCharacterCurrentParams(kCharacterCond1)[1] || (getCharacterCurrentParams(kCharacterCond1)[1] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
-				if (getCharacterCurrentParams(kCharacterCond1)[1] >= _currentGameSessionTicks)
+			if (getCharacterCurrentParams(kCharacterCond1)[1] || (getCharacterCurrentParams(kCharacterCond1)[1] = _realTime + 75, _realTime != -75)) {
+				if (getCharacterCurrentParams(kCharacterCond1)[1] >= _realTime)
 					break;
 
 				getCharacterCurrentParams(kCharacterCond1)[1] = 0x7FFFFFFF;
@@ -1831,8 +1831,8 @@ void LogicManager::HAND_Cond1_MakeBedAlexei(HAND_PARAMS) {
 	case 0:
 		if (!getCharacterCurrentParams(kCharacterCond1)[0]) {
 			if (getCharacterCurrentParams(kCharacterCond1)[1] ||
-				(getCharacterCurrentParams(kCharacterCond1)[1] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
-				if (getCharacterCurrentParams(kCharacterCond1)[1] >= _currentGameSessionTicks)
+				(getCharacterCurrentParams(kCharacterCond1)[1] = _realTime + 75, _realTime != -75)) {
+				if (getCharacterCurrentParams(kCharacterCond1)[1] >= _realTime)
 					break;
 
 				getCharacterCurrentParams(kCharacterCond1)[1] = 0x7FFFFFFF;
@@ -1863,10 +1863,10 @@ void LogicManager::HAND_Cond1_MakeBedAlexei(HAND_PARAMS) {
 			getCharacter(kCharacterCond1).characterPosition.location = 1;
 			endGraphics(kCharacterCond1);
 
-			if (_gameProgress[kProgressChapter] == 1 &&
+			if (_globals[kProgressChapter] == 1 &&
 				getCharacterParams(kCharacterCond1, 8)[3] &&
-				_gameProgress[kProgressField14] != 29) {
-				_gameProgress[kProgressField14] = 3;
+				_globals[kProgressField14] != 29) {
+				_globals[kProgressField14] = 3;
 			}
 
 			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 4;
@@ -1888,10 +1888,10 @@ void LogicManager::HAND_Cond1_MakeBedAlexei(HAND_PARAMS) {
 			getCharacter(kCharacterCond1).characterPosition.location = 1;
 			endGraphics(kCharacterCond1);
 
-			if (_gameProgress[kProgressChapter] == 1 &&
+			if (_globals[kProgressChapter] == 1 &&
 				getCharacterParams(kCharacterCond1, 8)[3] &&
-				_gameProgress[kProgressField14] != 29) {
-				_gameProgress[kProgressField14] = 3;
+				_globals[kProgressField14] != 29) {
+				_globals[kProgressField14] = 3;
 			}
 
 			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 7;
@@ -1946,9 +1946,9 @@ void LogicManager::CONS_Cond1_SubMakeBed(CONS_PARAMS) {
 void LogicManager::HAND_Cond1_SubMakeBed(HAND_PARAMS) {
 	switch (msg->action) {
 	case 12:
-		if (!_gameProgress[kProgressEventCorpseThrown] &&
+		if (!_globals[kProgressEventCorpseThrown] &&
 			getCharacterCurrentParams(kCharacterCond1)[0] &&
-			_gameProgress[kProgressChapter] == 1 && _gameProgress[kProgressJacket] == 2) {
+			_globals[kProgressChapter] == 1 && _globals[kProgressJacket] == 2) {
 			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 1;
 			Cond1Call(&LogicManager::CONS_Cond1_SaveGame, 1, 0, 0, 0);
 		} else {
@@ -1975,10 +1975,10 @@ void LogicManager::HAND_Cond1_SubMakeBed(HAND_PARAMS) {
 			fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
 			break;
 		case 3:
-			if (_gameProgress[kProgressJacket] == 1) {
+			if (_globals[kProgressJacket] == 1) {
 				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 4;
 				Cond1Call(&LogicManager::CONS_Cond1_SaveGame, 2, kEventMertensBloodJacket, 0, 0);
-			} else if (_gameProgress[kProgressEventCorpseMovedFromFloor]) {
+			} else if (_globals[kProgressEventCorpseMovedFromFloor]) {
 				blockAtDoor(kCharacterCond1, 1);
 				startSeqOtis(kCharacterCond1, "601Ra");
 				bumpCath(kCarGreenSleeping, 16, 255);
@@ -1996,7 +1996,7 @@ void LogicManager::HAND_Cond1_SubMakeBed(HAND_PARAMS) {
 			break;
 		case 5:
 			playNIS(kEventMertensCorpseFloor);
-			endGame(0, 1, _gameProgress[kProgressEventFoundCorpse] == kProgressField0 ? 56 : 50, true);
+			endGame(0, 1, _globals[kProgressEventFoundCorpse] == kProgressField0 ? 56 : 50, true);
 			break;
 		case 6:
 			releaseAtDoor(kCharacterCond1, 1);
@@ -2006,7 +2006,7 @@ void LogicManager::HAND_Cond1_SubMakeBed(HAND_PARAMS) {
 			Cond1Call(&LogicManager::CONS_Cond1_MakeBed, 1, 17, 0, 0);
 			break;
 		case 7:
-			if (_gameProgress[kProgressEventCorpseThrown] || _gameProgress[kProgressChapter] != 1) {
+			if (_globals[kProgressEventCorpseThrown] || _globals[kProgressChapter] != 1) {
 				if (nearChar(kCharacterCond1, kCharacterCath, 1000) && !whoOutside(kCharacterCath))
 					playDialog(kCharacterCond1, "CON1061", -1, 0);
 
@@ -2060,7 +2060,7 @@ void LogicManager::HAND_Cond1_EnterTyler(HAND_PARAMS) {
 	case 0:
 	case 10:
 		if (msg->action == 0) {
-			if (_gameProgress[kProgressField14] == 29) {
+			if (_globals[kProgressField14] == 29) {
 				getCharacter(kCharacterCond1).currentCall--;
 				_engine->getMessageManager()->setMessageHandle(kCharacterCond1, _functionsCond1[getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall]]);
 				fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
@@ -2068,8 +2068,8 @@ void LogicManager::HAND_Cond1_EnterTyler(HAND_PARAMS) {
 			}
 
 			if (!getCharacterCurrentParams(kCharacterCond1)[1]) {
-				getCharacterCurrentParams(kCharacterCond1)[1] = _currentGameSessionTicks + 150;
-				if (_currentGameSessionTicks == -150) {
+				getCharacterCurrentParams(kCharacterCond1)[1] = _realTime + 150;
+				if (_realTime == -150) {
 					setDoor(1, kCharacterCath, checkDoor(1), 0, 0);
 					getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 10;
 					Cond1Call(&LogicManager::CONS_Cond1_DoDialogFullVol, "CON1018A", 0, 0, 0);
@@ -2077,7 +2077,7 @@ void LogicManager::HAND_Cond1_EnterTyler(HAND_PARAMS) {
 				}
 			}
 
-			if (getCharacterCurrentParams(kCharacterCond1)[1] < _currentGameSessionTicks) {
+			if (getCharacterCurrentParams(kCharacterCond1)[1] < _realTime) {
 				getCharacterCurrentParams(kCharacterCond1)[1] = 0x7FFFFFFF;
 				setDoor(1, kCharacterCath, checkDoor(1), 0, 0);
 				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 10;
@@ -2089,16 +2089,16 @@ void LogicManager::HAND_Cond1_EnterTyler(HAND_PARAMS) {
 		}
 
 		if (!getCharacterCurrentParams(kCharacterCond1)[2]) {
-			getCharacterCurrentParams(kCharacterCond1)[2] = _currentGameSessionTicks + 300;
-			if (_currentGameSessionTicks == -300) {
+			getCharacterCurrentParams(kCharacterCond1)[2] = _realTime + 300;
+			if (_realTime == -300) {
 				if (checkDoor(1) == 1) {
 					setDoor(1, kCharacterCath, checkDoor(1), 0, 0);
 					getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 11;
 					Cond1Call(&LogicManager::CONS_Cond1_DoDialogFullVol, "CON1018B", 0, 0, 0);
 				} else {
 					playDialog(0, "LIB014", -1, 0);
-					if (_gameProgress[kProgressEventCorpseMovedFromFloor]) {
-						if (_gameProgress[kProgressJacket] == 1) {
+					if (_globals[kProgressEventCorpseMovedFromFloor]) {
+						if (_globals[kProgressJacket] == 1) {
 							getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 13;
 							Cond1Call(&LogicManager::CONS_Cond1_SaveGame, 2, kEventMertensBloodJacket, 0, 0);
 						} else if (getCharacterCurrentParams(kCharacterCond1)[0]) {
@@ -2152,9 +2152,9 @@ void LogicManager::HAND_Cond1_EnterTyler(HAND_PARAMS) {
 			}
 		}
 
-		if (getCharacterCurrentParams(kCharacterCond1)[2] >= _currentGameSessionTicks) {
-			if (getCharacterCurrentParams(kCharacterCond1)[3] || (getCharacterCurrentParams(kCharacterCond1)[3] = _currentGameSessionTicks + 375, _currentGameSessionTicks != -375)) {
-				if (getCharacterCurrentParams(kCharacterCond1)[3] >= _currentGameSessionTicks)
+		if (getCharacterCurrentParams(kCharacterCond1)[2] >= _realTime) {
+			if (getCharacterCurrentParams(kCharacterCond1)[3] || (getCharacterCurrentParams(kCharacterCond1)[3] = _realTime + 375, _realTime != -375)) {
+				if (getCharacterCurrentParams(kCharacterCond1)[3] >= _realTime)
 					break;
 
 				getCharacterCurrentParams(kCharacterCond1)[3] = 0x7FFFFFFF;
@@ -2162,8 +2162,8 @@ void LogicManager::HAND_Cond1_EnterTyler(HAND_PARAMS) {
 
 			playDialog(0, "LIB033", -1, 0);
 
-			if (_gameProgress[kProgressEventCorpseMovedFromFloor]) {
-				if (_gameProgress[kProgressJacket] == 1) {
+			if (_globals[kProgressEventCorpseMovedFromFloor]) {
+				if (_globals[kProgressJacket] == 1) {
 					getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 18;
 					Cond1Call(&LogicManager::CONS_Cond1_SaveGame, 2, kEventMertensBloodJacket, 0, 0);
 				} else if (getCharacterCurrentParams(kCharacterCond1)[0]) {
@@ -2222,8 +2222,8 @@ void LogicManager::HAND_Cond1_EnterTyler(HAND_PARAMS) {
 				Cond1Call(&LogicManager::CONS_Cond1_DoDialogFullVol, "CON1018B", 0, 0, 0);
 			} else {
 				playDialog(0, "LIB014", -1, 0);
-				if (_gameProgress[kProgressEventCorpseMovedFromFloor]) {
-					if (_gameProgress[kProgressJacket] == 1) {
+				if (_globals[kProgressEventCorpseMovedFromFloor]) {
+					if (_globals[kProgressJacket] == 1) {
 						getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 13;
 						Cond1Call(&LogicManager::CONS_Cond1_SaveGame, 2, kEventMertensBloodJacket, 0, 0);
 					} else if (getCharacterCurrentParams(kCharacterCond1)[0]) {
@@ -2310,8 +2310,8 @@ void LogicManager::HAND_Cond1_EnterTyler(HAND_PARAMS) {
 			playDialog(0, "LIB032", -1, 0);
 		}
 
-		if (_gameProgress[kProgressEventCorpseMovedFromFloor]) {
-			if (_gameProgress[kProgressJacket] == 1) {
+		if (_globals[kProgressEventCorpseMovedFromFloor]) {
+			if (_globals[kProgressJacket] == 1) {
 				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 27;
 				Cond1Call(&LogicManager::CONS_Cond1_SaveGame, 2, kEventMertensBloodJacket, 0, 0);
 			} else if (getCharacterCurrentParams(kCharacterCond1)[0]) {
@@ -2378,7 +2378,7 @@ void LogicManager::HAND_Cond1_EnterTyler(HAND_PARAMS) {
 	case 18:
 		switch (getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8]) {
 		case 1:
-			if (_gameProgress[kProgressEventCorpseMovedFromFloor]) {
+			if (_globals[kProgressEventCorpseMovedFromFloor]) {
 				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 4;
 				Cond1Call(&LogicManager::CONS_Cond1_DoCorrOtis, "601Ra", 1, 0, 0);
 			} else if (checkLoc(kCharacterCath, 3)) {
@@ -2400,7 +2400,7 @@ void LogicManager::HAND_Cond1_EnterTyler(HAND_PARAMS) {
 		case 17:
 		case 26:
 			playNIS(kEventMertensCorpseFloor);
-			endGame(0, 1, _gameProgress[kProgressEventFoundCorpse] == 0 ? 56 : 50, true);
+			endGame(0, 1, _globals[kProgressEventFoundCorpse] == 0 ? 56 : 50, true);
 			return;
 		case 4:
 			setDoor(1, kCharacterCath, 1, 0, 0);
@@ -2413,7 +2413,7 @@ void LogicManager::HAND_Cond1_EnterTyler(HAND_PARAMS) {
 				break;
 			}
 
-			if (_gameProgress[kProgressEventCorpseThrown] || _gameProgress[kProgressChapter] != 1) {
+			if (_globals[kProgressEventCorpseThrown] || _globals[kProgressChapter] != 1) {
 				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 6;
 				Cond1Call(&LogicManager::CONS_Cond1_MakeBed, 1, 17, 0, 0);
 			} else {
@@ -2454,8 +2454,8 @@ void LogicManager::HAND_Cond1_EnterTyler(HAND_PARAMS) {
 				endGame(0, 1, 55, 1);
 			}
 
-			if (getCharacterCurrentParams(kCharacterCond1)[3] || (getCharacterCurrentParams(kCharacterCond1)[3] = _currentGameSessionTicks + 375, _currentGameSessionTicks != -375)) {
-				if (getCharacterCurrentParams(kCharacterCond1)[3] >= _currentGameSessionTicks)
+			if (getCharacterCurrentParams(kCharacterCond1)[3] || (getCharacterCurrentParams(kCharacterCond1)[3] = _realTime + 375, _realTime != -375)) {
+				if (getCharacterCurrentParams(kCharacterCond1)[3] >= _realTime)
 					break;
 
 				getCharacterCurrentParams(kCharacterCond1)[3] = 0x7FFFFFFF;
@@ -2463,8 +2463,8 @@ void LogicManager::HAND_Cond1_EnterTyler(HAND_PARAMS) {
 
 			playDialog(0, "LIB033", -1, 0);
 
-			if (_gameProgress[kProgressEventCorpseMovedFromFloor]) {
-				if (_gameProgress[kProgressJacket] == 1) {
+			if (_globals[kProgressEventCorpseMovedFromFloor]) {
+				if (_globals[kProgressJacket] == 1) {
 					getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 18;
 					Cond1Call(&LogicManager::CONS_Cond1_SaveGame, 2, kEventMertensBloodJacket, 0, 0);
 				} else if (getCharacterCurrentParams(kCharacterCond1)[0]) {
@@ -2526,7 +2526,7 @@ void LogicManager::HAND_Cond1_EnterTyler(HAND_PARAMS) {
 			break;
 		case 15:
 			playNIS(kEventMertensAugustWaitingCompartment);
-			_gameProgress[kProgressEventMertensAugustWaiting] = 1;
+			_globals[kProgressEventMertensAugustWaiting] = 1;
 			playDialog(0, "LIB015", -1, 0);
 			bumpCathTylerComp();
 
@@ -2536,7 +2536,7 @@ void LogicManager::HAND_Cond1_EnterTyler(HAND_PARAMS) {
 			break;
 		case 16:
 			playNIS(kEventMertensKronosInvitationCompartment);
-			_gameProgress[kProgressEventMertensChronosInvitation] = 1;
+			_globals[kProgressEventMertensChronosInvitation] = 1;
 			playDialog(0, "LIB015", -1, 0);
 			bumpCathTylerComp();
 
@@ -2551,7 +2551,7 @@ void LogicManager::HAND_Cond1_EnterTyler(HAND_PARAMS) {
 			break;
 		case 20:
 			playNIS(kEventMertensAugustWaitingCompartment);
-			_gameProgress[kProgressEventMertensAugustWaiting] = 1;
+			_globals[kProgressEventMertensAugustWaiting] = 1;
 			playDialog(0, "LIB015", -1, 0);
 			bumpCathTylerComp();
 
@@ -2561,7 +2561,7 @@ void LogicManager::HAND_Cond1_EnterTyler(HAND_PARAMS) {
 			break;
 		case 21:
 			playNIS(kEventMertensKronosInvitationCompartment);
-			_gameProgress[kProgressEventMertensChronosInvitation] = 1;
+			_globals[kProgressEventMertensChronosInvitation] = 1;
 			playDialog(0, "LIB015", -1, 0);
 			bumpCathTylerComp();
 
@@ -2570,7 +2570,7 @@ void LogicManager::HAND_Cond1_EnterTyler(HAND_PARAMS) {
 			fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
 			break;
 		case 23:
-			_gameProgress[kProgressEventMertensAugustWaiting] = 1;
+			_globals[kProgressEventMertensAugustWaiting] = 1;
 			setDoor(1, kCharacterCath, checkDoor(1), 10, 9);
 
 			getCharacter(kCharacterCond1).currentCall--;
@@ -2578,7 +2578,7 @@ void LogicManager::HAND_Cond1_EnterTyler(HAND_PARAMS) {
 			fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
 			break;
 		case 24:
-			_gameProgress[kProgressEventMertensChronosInvitation] = 1;
+			_globals[kProgressEventMertensChronosInvitation] = 1;
 			setDoor(1, kCharacterCath, checkDoor(1), 10, 9);
 
 			getCharacter(kCharacterCond1).currentCall--;
@@ -2594,7 +2594,7 @@ void LogicManager::HAND_Cond1_EnterTyler(HAND_PARAMS) {
 			break;
 		case 29:
 			playNIS(kEventMertensAugustWaitingCompartment);
-			_gameProgress[kProgressEventMertensAugustWaiting] = 1;
+			_globals[kProgressEventMertensAugustWaiting] = 1;
 			playDialog(0, "LIB015", -1, 0);
 			bumpCathTylerComp();
 
@@ -2604,7 +2604,7 @@ void LogicManager::HAND_Cond1_EnterTyler(HAND_PARAMS) {
 			break;
 		case 30:
 			playNIS(kEventMertensKronosInvitationCompartment);
-			_gameProgress[kProgressEventMertensChronosInvitation] = 1;
+			_globals[kProgressEventMertensChronosInvitation] = 1;
 			playDialog(0, "LIB015", -1, 0);
 			bumpCathTylerComp();
 
@@ -2740,8 +2740,9 @@ void LogicManager::HAND_Cond1_VisitCond2Double(HAND_PARAMS) {
 			fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
 			break;
 		default:
-			return;
+			break;
 		}
+
 		break;
 	case 155853632:
 		getCharacterCurrentParams(kCharacterCond1)[7] = 1;
@@ -2784,14 +2785,14 @@ void LogicManager::HAND_Cond1_CathBuzzing(HAND_PARAMS) {
 		}
 
 		if (getCharacterCurrentParams(kCharacterCond1)[0] == 1) {
-			if (_gameProgress[kProgressField14]) {
+			if (_globals[kProgressField14]) {
 				getCharacter(kCharacterCond1).currentCall--;
 				_engine->getMessageManager()->setMessageHandle(kCharacterCond1, _functionsCond1[getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall]]);
 				fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
 				break;
 			}
 
-			_gameProgress[kProgressField14] = 3;
+			_globals[kProgressField14] = 3;
 		}
 
 		getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 1;
@@ -2805,7 +2806,7 @@ void LogicManager::HAND_Cond1_CathBuzzing(HAND_PARAMS) {
 			return;
 		case 2:
 			if (getCharacterCurrentParams(kCharacterCond1)[0] == 1) {
-				if (_gameProgress[kProgressChapter] == 4)
+				if (_globals[kProgressChapter] == 4)
 					send(kCharacterCond1, kCharacterTatiana, 238790488, 0);
 				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 3;
 				Cond1Call(&LogicManager::CONS_Cond1_EnterTyler, 3, 0, 0, 0);
@@ -2825,8 +2826,8 @@ void LogicManager::HAND_Cond1_CathBuzzing(HAND_PARAMS) {
 				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 6;
 				Cond1Call(&LogicManager::CONS_Cond1_DoCorrOtis, "601Mc", 3, 0, 0);
 			} else {
-				if (_gameProgress[kProgressField14] == 3)
-					_gameProgress[kProgressField14] = 0;
+				if (_globals[kProgressField14] == 3)
+					_globals[kProgressField14] = 0;
 
 				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 8;
 				Cond1Call(&LogicManager::CONS_Cond1_DoWalk, 3, 2000, 0, 0);
@@ -2834,8 +2835,8 @@ void LogicManager::HAND_Cond1_CathBuzzing(HAND_PARAMS) {
 
 			break;
 		case 3:
-			if (_gameProgress[kProgressField14] == 3)
-				_gameProgress[kProgressField14] = 0;
+			if (_globals[kProgressField14] == 3)
+				_globals[kProgressField14] = 0;
 
 			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 8;
 			Cond1Call(&LogicManager::CONS_Cond1_DoWalk, 3, 2000, 0, 0);
@@ -2852,8 +2853,8 @@ void LogicManager::HAND_Cond1_CathBuzzing(HAND_PARAMS) {
 			}
 
 			softReleaseAtDoor(kCharacterCond1, 2);
-			if (_gameProgress[kProgressField14] == 3)
-				_gameProgress[kProgressField14] = 0;
+			if (_globals[kProgressField14] == 3)
+				_globals[kProgressField14] = 0;
 
 			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 8;
 			Cond1Call(&LogicManager::CONS_Cond1_DoWalk, 3, 2000, 0, 0);
@@ -2870,8 +2871,8 @@ void LogicManager::HAND_Cond1_CathBuzzing(HAND_PARAMS) {
 			}
 
 			softReleaseAtDoor(kCharacterCond1, 3);
-			if (_gameProgress[kProgressField14] == 3)
-				_gameProgress[kProgressField14] = 0;
+			if (_globals[kProgressField14] == 3)
+				_globals[kProgressField14] = 0;
 
 			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 8;
 			Cond1Call(&LogicManager::CONS_Cond1_DoWalk, 3, 2000, 0, 0);
@@ -3204,12 +3205,12 @@ void LogicManager::CONS_Cond1_DeliverAugustMessage(CONS_PARAMS) {
 void LogicManager::HAND_Cond1_DeliverAugustMessage(HAND_PARAMS) {
 	switch (msg->action) {
 	case 12:
-		if (_gameProgress[kProgressField14] == 29) {
+		if (_globals[kProgressField14] == 29) {
 			getCharacter(kCharacterCond1).currentCall--;
 			_engine->getMessageManager()->setMessageHandle(kCharacterCond1, _functionsCond1[getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall]]);
 			fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
 		} else {
-			_gameProgress[kProgressField14] = 3;
+			_globals[kProgressField14] = 3;
 			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 1;
 			Cond1Call(&LogicManager::CONS_Cond1_GetUp, 0, 0, 0, 0);
 		}
@@ -3223,11 +3224,11 @@ void LogicManager::HAND_Cond1_DeliverAugustMessage(HAND_PARAMS) {
 			break;
 		case 2:
 			if (!getCharacterParams(kCharacterCond1, 8)[9] ||
-				_gameProgress[kProgressEventMetAugust]) {
+				_globals[kProgressEventMetAugust]) {
 				getCharacterParams(kCharacterCond1, 8)[9] = 0;
 
-				if (_gameProgress[kProgressField14] == 3)
-					_gameProgress[kProgressField14] = 0;
+				if (_globals[kProgressField14] == 3)
+					_globals[kProgressField14] = 0;
 
 				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 3;
 				Cond1Call(&LogicManager::CONS_Cond1_DoWalk, 3, 2000, 0, 0);
@@ -3248,10 +3249,10 @@ void LogicManager::HAND_Cond1_DeliverAugustMessage(HAND_PARAMS) {
 			fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
 			break;
 		case 5:
-			if (_gameProgress[kProgressField14] == 3)
-				_gameProgress[kProgressField14] = 0;
+			if (_globals[kProgressField14] == 3)
+				_globals[kProgressField14] = 0;
 
-			if (_gameProgress[kProgressEventMertensAugustWaiting])
+			if (_globals[kProgressEventMertensAugustWaiting])
 				getCharacterParams(kCharacterCond1, 8)[9] = 0;
 
 			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 6;
@@ -3285,12 +3286,12 @@ void LogicManager::CONS_Cond1_DeliverKronosMessage(CONS_PARAMS) {
 void LogicManager::HAND_Cond1_DeliverKronosMessage(HAND_PARAMS) {
 	switch (msg->action) {
 	case 12:
-		if (_gameProgress[kProgressField14] == 29) {
+		if (_globals[kProgressField14] == 29) {
 			getCharacter(kCharacterCond1).currentCall--;
 			_engine->getMessageManager()->setMessageHandle(kCharacterCond1, _functionsCond1[getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall]]);
 			fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
 		} else {
-			_gameProgress[kProgressField14] = 3;
+			_globals[kProgressField14] = 3;
 			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 1;
 			Cond1Call(&LogicManager::CONS_Cond1_GetUp, 0, 0, 0, 0);
 		}
@@ -3307,8 +3308,8 @@ void LogicManager::HAND_Cond1_DeliverKronosMessage(HAND_PARAMS) {
 				getCharacterParams(kCharacterCond1, 8)[5] = 0;
 				getCharacterParams(kCharacterCond1, 8)[6] = 0;
 
-				if (_gameProgress[kProgressField14] == 3)
-					_gameProgress[kProgressField14] = 0;
+				if (_globals[kProgressField14] == 3)
+					_globals[kProgressField14] = 0;
 
 				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 5;
 				Cond1Call(&LogicManager::CONS_Cond1_DoWalk, 3, 2000, 0, 0);
@@ -3327,8 +3328,8 @@ void LogicManager::HAND_Cond1_DeliverKronosMessage(HAND_PARAMS) {
 					getCharacterParams(kCharacterCond1, 8)[5] = 0;
 					getCharacterParams(kCharacterCond1, 8)[6] = 0;
 
-					if (_gameProgress[kProgressField14] == 3)
-						_gameProgress[kProgressField14] = 0;
+					if (_globals[kProgressField14] == 3)
+						_globals[kProgressField14] = 0;
 
 					getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 5;
 					Cond1Call(&LogicManager::CONS_Cond1_DoWalk, 3, 2000, 0, 0);
@@ -3347,8 +3348,8 @@ void LogicManager::HAND_Cond1_DeliverKronosMessage(HAND_PARAMS) {
 			} else {
 				getCharacterParams(kCharacterCond1, 8)[5] = 0;
 				getCharacterParams(kCharacterCond1, 8)[6] = 0;
-				if (_gameProgress[kProgressField14] == 3)
-					_gameProgress[kProgressField14] = 0;
+				if (_globals[kProgressField14] == 3)
+					_globals[kProgressField14] = 0;
 				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 5;
 				Cond1Call(&LogicManager::CONS_Cond1_DoWalk, 3, 2000, 0, 0);
 			}
@@ -3365,10 +3366,10 @@ void LogicManager::HAND_Cond1_DeliverKronosMessage(HAND_PARAMS) {
 			fedEx(kCharacterCond1, kCharacterCond1, 18, 0);
 			break;
 		case 7:
-			if (_gameProgress[kProgressField14] == 3)
-				_gameProgress[kProgressField14] = 0;
+			if (_globals[kProgressField14] == 3)
+				_globals[kProgressField14] = 0;
 
-			if (!_gameProgress[kProgressEventMertensChronosInvitation])
+			if (!_globals[kProgressEventMertensChronosInvitation])
 				getCharacterParams(kCharacterCond1, 8)[6] = 1;
 
 			getCharacterParams(kCharacterCond1, 8)[5] = 0;
@@ -3472,7 +3473,7 @@ void LogicManager::CONS_Cond1_MakeBedTyler(CONS_PARAMS) {
 void LogicManager::HAND_Cond1_MakeBedTyler(HAND_PARAMS) {
 	switch (msg->action) {
 	case 12:
-		if (getCharacterParams(kCharacterCond1, 8)[3] && _gameProgress[kProgressField14] != 29) {
+		if (getCharacterParams(kCharacterCond1, 8)[3] && _globals[kProgressField14] != 29) {
 			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 1;
 			Cond1Call(&LogicManager::CONS_Cond1_DoWalk, 3, 8200, 0, 0);
 		} else {
@@ -3557,8 +3558,8 @@ void LogicManager::HAND_Cond1_MakeAllBeds(HAND_PARAMS) {
 			Cond1Call(&LogicManager::CONS_Cond1_MakeBedTyler, 0, 0, 0, 0);
 			break;
 		case 8:
-			if (_gameProgress[kProgressField14] == 3)
-				_gameProgress[kProgressField14] = 0;
+			if (_globals[kProgressField14] == 3)
+				_globals[kProgressField14] = 0;
 
 			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 9;
 			Cond1Call(&LogicManager::CONS_Cond1_DoWalk, 3, 2000, 0, 0);
@@ -3699,9 +3700,9 @@ void LogicManager::HAND_Cond1_Sitting(HAND_PARAMS) {
 		}
 
 		if (getCharacterParams(kCharacterCond1, 8)[16] ||
-			_gameProgress[kProgressEventFoundCorpse] ||
-			_gameEvents[kEventMertensAskTylerCompartment] ||
-			_gameEvents[kEventMertensAskTylerCompartmentD]) {
+			_globals[kProgressEventFoundCorpse] ||
+			_doneNIS[kEventMertensAskTylerCompartment] ||
+			_doneNIS[kEventMertensAskTylerCompartmentD]) {
 			getCharacter(kCharacterCond1).inventoryItem = kItemNone;
 		} else {
 			getCharacter(kCharacterCond1).inventoryItem = 0x80;
@@ -3774,7 +3775,7 @@ void LogicManager::HAND_Cond1_Sitting(HAND_PARAMS) {
 			break;
 		}
 
-		if (_gameProgress[kProgressField14] != 29) {
+		if (_globals[kProgressField14] != 29) {
 			if (getCharacterParams(kCharacterCond1, 8)[13]) {
 				getCharacter(kCharacterCond1).inventoryItem = kItemNone;
 				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 10;
@@ -3843,7 +3844,7 @@ void LogicManager::HAND_Cond1_Sitting(HAND_PARAMS) {
 
 		if (getCharacterCurrentParams(kCharacterCond1)[0] || !getCharacterParams(kCharacterCond1, 8)[4]) {
 			if (getCharacterParams(kCharacterCond1, 8)[0] &&
-				!whoRunningDialog(kCharacterCond1) && _gameProgress[kProgressField18] != 4) {
+				!whoRunningDialog(kCharacterCond1) && _globals[kProgressField18] != 4) {
 				playDialog(kCharacterCond1, "CON1505", -1, 0);
 			}
 
@@ -3877,12 +3878,12 @@ void LogicManager::HAND_Cond1_Sitting(HAND_PARAMS) {
 		break;
 	case 17:
 		if (!getCharacterParams(kCharacterCond1, 8)[16]) {
-			if (checkCathDir(kCarGreenSleeping, 23) && getCharacterParams(kCharacterCond1, 8)[6] && !_gameEvents[kEventKronosConversation]) {
+			if (checkCathDir(kCarGreenSleeping, 23) && getCharacterParams(kCharacterCond1, 8)[6] && !_doneNIS[kEventKronosConversation]) {
 				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 1;
 				Cond1Call(&LogicManager::CONS_Cond1_SaveGame, 2, kEventMertensKronosInvitation, 0, 0);
-			} else if (!checkCathDir(kCarGreenSleeping, 23) || _gameProgress[kProgressEventMertensChronosInvitation] || _gameEvents[kEventMertensLastCar] || _gameEvents[kEventMertensLastCarOriginalJacket]) {
+			} else if (!checkCathDir(kCarGreenSleeping, 23) || _globals[kProgressEventMertensChronosInvitation] || _doneNIS[kEventMertensLastCar] || _doneNIS[kEventMertensLastCarOriginalJacket]) {
 				if (!checkCathDir(kCarGreenSleeping, 1) && !checkCathDir(kCarGreenSleeping, 23) || getCharacterParams(kCharacterCond1, 8)[0] || getCharacterParams(kCharacterCond1, 8)[16]) {
-					if (cathInCorridor(kCarGreenSleeping) && getCharacter(kCharacterCond1).characterPosition.position < getCharacter(kCharacterCath).characterPosition.position && (_gameProgress[1] == 1 || getCharacterParams(kCharacterCond1, 8)[6])) {
+					if (cathInCorridor(kCarGreenSleeping) && getCharacter(kCharacterCond1).characterPosition.position < getCharacter(kCharacterCath).characterPosition.position && (_globals[1] == 1 || getCharacterParams(kCharacterCond1, 8)[6])) {
 						getCharacter(kCharacterCond1).inventoryItem = kItemNone;
 						getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 7;
 						Cond1Call(&LogicManager::CONS_Cond1_BathroomTrip, 0, 0, 0, 0);
@@ -3908,7 +3909,7 @@ void LogicManager::HAND_Cond1_Sitting(HAND_PARAMS) {
 		switch (getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8]) {
 		case 1:
 			playNIS(kEventMertensKronosInvitation);
-			_gameProgress[kProgressEventMertensChronosInvitation] = 1;
+			_globals[kProgressEventMertensChronosInvitation] = 1;
 			getCharacterParams(kCharacterCond1, 8)[5] = 0;
 			getCharacterParams(kCharacterCond1, 8)[6] = 0;
 			startSeqOtis(kCharacterCond1, "601A");
@@ -3922,7 +3923,7 @@ void LogicManager::HAND_Cond1_Sitting(HAND_PARAMS) {
 		case 4:
 			startCycOtis(kCharacterCond1, "601B");
 			if (!checkCathDir(kCarGreenSleeping, 1) && !checkCathDir(kCarGreenSleeping, 23) || getCharacterParams(kCharacterCond1, 8)[0] || getCharacterParams(kCharacterCond1, 8)[16]) {
-				if (cathInCorridor(kCarGreenSleeping) && getCharacter(kCharacterCond1).characterPosition.position < getCharacter(kCharacterCath).characterPosition.position && (_gameProgress[1] == 1 || getCharacterParams(kCharacterCond1, 8)[6])) {
+				if (cathInCorridor(kCarGreenSleeping) && getCharacter(kCharacterCond1).characterPosition.position < getCharacter(kCharacterCath).characterPosition.position && (_globals[1] == 1 || getCharacterParams(kCharacterCond1, 8)[6])) {
 					getCharacter(kCharacterCond1).inventoryItem = kItemNone;
 					getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 7;
 					Cond1Call(&LogicManager::CONS_Cond1_BathroomTrip, 0, 0, 0, 0);
@@ -3940,7 +3941,7 @@ void LogicManager::HAND_Cond1_Sitting(HAND_PARAMS) {
 
 			break;
 		case 3:
-			playNIS((kEventMertensLastCarOriginalJacket - (_gameProgress[kProgressJacket] == 2)));
+			playNIS((kEventMertensLastCarOriginalJacket - (_globals[kProgressJacket] == 2)));
 			startSeqOtis(kCharacterCond1, "601A");
 			bumpCath(kCarGreenSleeping, 6, 255);
 			takeItem(kItem7);
@@ -3951,7 +3952,7 @@ void LogicManager::HAND_Cond1_Sitting(HAND_PARAMS) {
 			break;
 		case 5:
 		case 6:
-			if (cathInCorridor(kCarGreenSleeping) && getCharacter(kCharacterCond1).characterPosition.position < getCharacter(kCharacterCath).characterPosition.position && (_gameProgress[1] == 1 || getCharacterParams(kCharacterCond1, 8)[6])) {
+			if (cathInCorridor(kCarGreenSleeping) && getCharacter(kCharacterCond1).characterPosition.position < getCharacter(kCharacterCath).characterPosition.position && (_globals[1] == 1 || getCharacterParams(kCharacterCond1, 8)[6])) {
 				getCharacter(kCharacterCond1).inventoryItem = kItemNone;
 				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 7;
 				Cond1Call(&LogicManager::CONS_Cond1_BathroomTrip, 0, 0, 0, 0);
@@ -3990,7 +3991,7 @@ void LogicManager::HAND_Cond1_Sitting(HAND_PARAMS) {
 			// fall through
 		}
 		case 9:
-			if (_gameProgress[kProgressField14] != 29) {
+			if (_globals[kProgressField14] != 29) {
 				if (getCharacterParams(kCharacterCond1, 8)[13]) {
 					getCharacter(kCharacterCond1).inventoryItem = kItemNone;
 					getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 10;
@@ -4059,7 +4060,7 @@ void LogicManager::HAND_Cond1_Sitting(HAND_PARAMS) {
 
 			if (getCharacterCurrentParams(kCharacterCond1)[0] || !getCharacterParams(kCharacterCond1, 8)[4]) {
 				if (getCharacterParams(kCharacterCond1, 8)[0] &&
-					!whoRunningDialog(kCharacterCond1) && _gameProgress[kProgressField18] != 4) {
+					!whoRunningDialog(kCharacterCond1) && _globals[kProgressField18] != 4) {
 					playDialog(kCharacterCond1, "CON1505", -1, 0);
 				}
 
@@ -4148,7 +4149,7 @@ void LogicManager::HAND_Cond1_Sitting(HAND_PARAMS) {
 		case 18:
 			if (getCharacterCurrentParams(kCharacterCond1)[0] || !getCharacterParams(kCharacterCond1, 8)[4]) {
 				if (getCharacterParams(kCharacterCond1, 8)[0] &&
-					!whoRunningDialog(kCharacterCond1) && _gameProgress[kProgressField18] != 4) {
+					!whoRunningDialog(kCharacterCond1) && _globals[kProgressField18] != 4) {
 					playDialog(kCharacterCond1, "CON1505", -1, 0);
 				}
 			} else {
@@ -4161,7 +4162,7 @@ void LogicManager::HAND_Cond1_Sitting(HAND_PARAMS) {
 		case 19:
 			getCharacterCurrentParams(kCharacterCond1)[0] = 1;
 			if (getCharacterParams(kCharacterCond1, 8)[0] &&
-				!whoRunningDialog(kCharacterCond1) && _gameProgress[kProgressField18] != 4) {
+				!whoRunningDialog(kCharacterCond1) && _globals[kProgressField18] != 4) {
 				playDialog(kCharacterCond1, "CON1505", -1, 0);
 			}
 
@@ -4169,7 +4170,7 @@ void LogicManager::HAND_Cond1_Sitting(HAND_PARAMS) {
 		case 21:
 			playNIS(kEventMertensAskTylerCompartmentD);
 			startSeqOtis(kCharacterCond1, "601A");
-			_gameInventory[kItem7].location = 0;
+			_items[kItem7].floating = 0;
 			bumpCath(kCarGreenSleeping, 25, 255);
 			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 22;
 			Cond1Call(&LogicManager::CONS_Cond1_FinishSeqOtis, 0, 0, 0, 0);
@@ -4456,7 +4457,7 @@ void LogicManager::HAND_Cond1_OnDuty(HAND_PARAMS) {
 			break;
 		}
 
-		if (getCharacterParams(kCharacterCond1, 8)[19] && (_gameEvents[kEventKronosVisit] || _gameTime > 2052000) && _gameTime < 2133000 && cathInCorridor(kCarGreenSleeping)) {
+		if (getCharacterParams(kCharacterCond1, 8)[19] && (_doneNIS[kEventKronosVisit] || _gameTime > 2052000) && _gameTime < 2133000 && cathInCorridor(kCarGreenSleeping)) {
 			getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 6;
 			Cond1Call(&LogicManager::CONS_Cond1_BathroomTrip, 0, 0, 0, 0);
 			break;
@@ -4552,7 +4553,7 @@ void LogicManager::HAND_Cond1_OnDuty(HAND_PARAMS) {
 
 			// fall through
 		case 5:
-			if (getCharacterParams(kCharacterCond1, 8)[19] && (_gameEvents[kEventKronosVisit] || _gameTime > 2052000) && _gameTime < 2133000 && cathInCorridor(kCarGreenSleeping)) {
+			if (getCharacterParams(kCharacterCond1, 8)[19] && (_doneNIS[kEventKronosVisit] || _gameTime > 2052000) && _gameTime < 2133000 && cathInCorridor(kCarGreenSleeping)) {
 				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 6;
 				Cond1Call(&LogicManager::CONS_Cond1_BathroomTrip, 0, 0, 0, 0);
 				break;
@@ -5138,8 +5139,8 @@ void LogicManager::HAND_Cond1_HideOut(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
 		if (getCharacterCurrentParams(kCharacterCond1)[0]) {
-			if (getCharacterCurrentParams(kCharacterCond1)[3] || (getCharacterCurrentParams(kCharacterCond1)[3] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
-				if (getCharacterCurrentParams(kCharacterCond1)[3] >= _currentGameSessionTicks)
+			if (getCharacterCurrentParams(kCharacterCond1)[3] || (getCharacterCurrentParams(kCharacterCond1)[3] = _realTime + 75, _realTime != -75)) {
+				if (getCharacterCurrentParams(kCharacterCond1)[3] >= _realTime)
 					break;
 
 				getCharacterCurrentParams(kCharacterCond1)[3] = 0x7FFFFFFF;
diff --git a/engines/lastexpress/characters/cond2.cpp b/engines/lastexpress/characters/cond2.cpp
index 61629dcab8e..4764d5f4f9f 100644
--- a/engines/lastexpress/characters/cond2.cpp
+++ b/engines/lastexpress/characters/cond2.cpp
@@ -113,7 +113,7 @@ void LogicManager::CONS_Cond2_DoSeqOtis(CONS_PARAMS) {
 void LogicManager::HAND_Cond2_DoSeqOtis(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
-		if (_gameProgress[kProgressJacket] == 1 && nearChar(kCharacterCond2, kCharacterCath, 1000) && !inComp(kCharacterCath) && !whoOutside(kCharacterCath)) {
+		if (_globals[kProgressJacket] == 1 && nearChar(kCharacterCond2, kCharacterCath, 1000) && !inComp(kCharacterCath) && !whoOutside(kCharacterCath)) {
 			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 1;
 			Cond2Call(&LogicManager::CONS_Cond2_SaveGame, 2, kEventMertensBloodJacket, 0, 0);
 		}
@@ -156,7 +156,7 @@ void LogicManager::CONS_Cond2_DoCorrOtis(CONS_PARAMS) {
 void LogicManager::HAND_Cond2_DoCorrOtis(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
-		if (_gameProgress[kProgressJacket] == 1 && nearChar(kCharacterCond2, kCharacterCath, 1000) && !inComp(kCharacterCath) && !whoOutside(kCharacterCath)) {
+		if (_globals[kProgressJacket] == 1 && nearChar(kCharacterCond2, kCharacterCath, 1000) && !inComp(kCharacterCath) && !whoOutside(kCharacterCath)) {
 			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 1;
 			Cond2Call(&LogicManager::CONS_Cond2_SaveGame, 2, kEventMertensBloodJacket, 0, 0);
 		}
@@ -202,7 +202,7 @@ void LogicManager::HAND_Cond2_FinishSeqOtis(HAND_PARAMS) {
 			getCharacter(kCharacterCond2).currentCall--;
 			_engine->getMessageManager()->setMessageHandle(kCharacterCond2, _functionsCond2[getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall]]);
 			fedEx(kCharacterCond2, kCharacterCond2, 18, 0);
-		} else if (_gameProgress[kProgressJacket] == 1 && nearChar(kCharacterCond2, kCharacterCath, 1000) && !inComp(kCharacterCath) && !whoOutside(kCharacterCath)) {
+		} else if (_globals[kProgressJacket] == 1 && nearChar(kCharacterCond2, kCharacterCath, 1000) && !inComp(kCharacterCath) && !whoOutside(kCharacterCath)) {
 			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 1;
 			Cond2Call(&LogicManager::CONS_Cond2_SaveGame, 2, kEventMertensBloodJacket, 0, 0);
 		}
@@ -244,7 +244,7 @@ void LogicManager::CONS_Cond2_DoEnterCorrOtis(CONS_PARAMS) {
 void LogicManager::HAND_Cond2_DoEnterCorrOtis(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
-		if (_gameProgress[kProgressJacket] == 1 && nearChar(kCharacterCond2, kCharacterCath, 1000) && !inComp(kCharacterCath) && !whoOutside(kCharacterCath)) {
+		if (_globals[kProgressJacket] == 1 && nearChar(kCharacterCond2, kCharacterCath, 1000) && !inComp(kCharacterCath) && !whoOutside(kCharacterCath)) {
 			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 1;
 			Cond2Call(&LogicManager::CONS_Cond2_SaveGame, 2, kEventMertensBloodJacket, 0, 0);
 		}
@@ -301,7 +301,7 @@ void LogicManager::CONS_Cond2_DoDialog(CONS_PARAMS) {
 void LogicManager::HAND_Cond2_DoDialog(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
-		if (_gameProgress[kProgressJacket] == 1 && nearChar(kCharacterCond2, kCharacterCath, 1000) && !inComp(kCharacterCath) && !whoOutside(kCharacterCath)) {
+		if (_globals[kProgressJacket] == 1 && nearChar(kCharacterCond2, kCharacterCath, 1000) && !inComp(kCharacterCath) && !whoOutside(kCharacterCath)) {
 			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 1;
 			Cond2Call(&LogicManager::CONS_Cond2_SaveGame, 2, kEventMertensBloodJacket, 0, 0);
 		}
@@ -342,7 +342,7 @@ void LogicManager::CONS_Cond2_DoDialogFullVol(CONS_PARAMS) {
 void LogicManager::HAND_Cond2_DoDialogFullVol(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
-		if (_gameProgress[kProgressJacket] == 1 && nearChar(kCharacterCond2, kCharacterCath, 1000) && !inComp(kCharacterCath) && !whoOutside(kCharacterCath)) {
+		if (_globals[kProgressJacket] == 1 && nearChar(kCharacterCond2, kCharacterCath, 1000) && !inComp(kCharacterCath) && !whoOutside(kCharacterCath)) {
 			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 1;
 			Cond2Call(&LogicManager::CONS_Cond2_SaveGame, 2, kEventMertensBloodJacket, 0, 0);
 		}
@@ -426,7 +426,7 @@ void LogicManager::HAND_Cond2_DoWalk(HAND_PARAMS) {
 			getCharacter(kCharacterCond2).inventoryItem = 0;
 		}
 
-		if (_gameProgress[kProgressJacket] != 1 || !nearChar(kCharacterCond2, kCharacterCath, 1000) || inComp(kCharacterCath) || whoOutside(kCharacterCath)) {
+		if (_globals[kProgressJacket] != 1 || !nearChar(kCharacterCond2, kCharacterCath, 1000) || inComp(kCharacterCath) || whoOutside(kCharacterCath)) {
 			if (walk(kCharacterCond2, getCharacterCurrentParams(kCharacterCond2)[0], getCharacterCurrentParams(kCharacterCond2)[1])) {
 				getCharacter(kCharacterCond2).inventoryItem = 0;
 
@@ -463,7 +463,7 @@ void LogicManager::HAND_Cond2_DoWalk(HAND_PARAMS) {
 
 		break;
 	case 12:
-		if (!_gameProgress[kProgressEventFoundCorpse] && !_gameEvents[kEventCoudertAskTylerCompartment])
+		if (!_globals[kProgressEventFoundCorpse] && !_doneNIS[kEventCoudertAskTylerCompartment])
 			getCharacterCurrentParams(kCharacterCond2)[2] = 128;
 
 		if (walk(kCharacterCond2, getCharacterCurrentParams(kCharacterCond2)[0], getCharacterCurrentParams(kCharacterCond2)[1])) {
@@ -507,7 +507,7 @@ void LogicManager::CONS_Cond2_DoWait(CONS_PARAMS) {
 void LogicManager::HAND_Cond2_DoWait(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
-		if (_gameProgress[kProgressJacket] == 1 && nearChar(kCharacterCond2, kCharacterCath, 1000) && !inComp(kCharacterCath) && !whoOutside(kCharacterCath)) {
+		if (_globals[kProgressJacket] == 1 && nearChar(kCharacterCond2, kCharacterCath, 1000) && !inComp(kCharacterCath) && !whoOutside(kCharacterCath)) {
 			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 1;
 			Cond2Call(&LogicManager::CONS_Cond2_SaveGame, 2, kEventMertensBloodJacket, 0, 0);
 			break;
@@ -552,15 +552,15 @@ void LogicManager::CONS_Cond2_DoWaitReal(CONS_PARAMS) {
 void LogicManager::HAND_Cond2_DoWaitReal(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
-		if (_gameProgress[kProgressJacket] == 1 && nearChar(kCharacterCond2, kCharacterCath, 1000) && !inComp(kCharacterCath) && !whoOutside(kCharacterCath)) {
+		if (_globals[kProgressJacket] == 1 && nearChar(kCharacterCond2, kCharacterCath, 1000) && !inComp(kCharacterCath) && !whoOutside(kCharacterCath)) {
 			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 1;
 			Cond2Call(&LogicManager::CONS_Cond2_SaveGame, 2, kEventMertensBloodJacket, 0, 0);
 			break;
 		}
 
 		if (getCharacterCurrentParams(kCharacterCond2)[1] ||
-			(getCharacterCurrentParams(kCharacterCond2)[1] = _currentGameSessionTicks + getCharacterCurrentParams(kCharacterCond2)[0], _currentGameSessionTicks + getCharacterCurrentParams(kCharacterCond2)[0] != 0)) {
-			if (getCharacterCurrentParams(kCharacterCond2)[1] >= _currentGameSessionTicks)
+			(getCharacterCurrentParams(kCharacterCond2)[1] = _realTime + getCharacterCurrentParams(kCharacterCond2)[0], _realTime + getCharacterCurrentParams(kCharacterCond2)[0] != 0)) {
+			if (getCharacterCurrentParams(kCharacterCond2)[1] >= _realTime)
 				break;
 
 			getCharacterCurrentParams(kCharacterCond2)[1] = 0x7FFFFFFF;
@@ -604,7 +604,7 @@ void LogicManager::HAND_Cond2_StandAsideDialog(HAND_PARAMS) {
 						playDialog(kCharacterCond2, "JAC1112F", -1, 0);
 					else
 						playDialog(kCharacterCond2, "JAC1112C", -1, 0);
-				} else if (getCharacterCurrentParams(kCharacterCond2)[0] || _gameProgress[kProgressField18] != 2) {
+				} else if (getCharacterCurrentParams(kCharacterCond2)[0] || _globals[kProgressField18] != 2) {
 					playDialog(kCharacterCond2, "JAC1112D", -1, 0);
 				} else {
 					switch (rnd(4)) {
@@ -659,7 +659,7 @@ void LogicManager::CONS_Cond2_Passing(CONS_PARAMS) {
 void LogicManager::HAND_Cond2_Passing(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
-		if (_gameProgress[kProgressJacket] == 1 && nearChar(kCharacterCond2, kCharacterCath, 1000) && !inComp(kCharacterCath) && !whoOutside(kCharacterCath)) {
+		if (_globals[kProgressJacket] == 1 && nearChar(kCharacterCond2, kCharacterCath, 1000) && !inComp(kCharacterCath) && !whoOutside(kCharacterCath)) {
 			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 3;
 			Cond2Call(&LogicManager::CONS_Cond2_SaveGame, 2, kEventMertensBloodJacket, 0, 0);
 			break;
@@ -667,8 +667,8 @@ void LogicManager::HAND_Cond2_Passing(HAND_PARAMS) {
 
 		if (!getCharacterCurrentParams(kCharacterCond2)[1] && !getCharacterCurrentParams(kCharacterCond2)[2]) {
 			if (!getCharacterCurrentParams(kCharacterCond2)[3]) {
-				getCharacterCurrentParams(kCharacterCond2)[3] = _currentGameSessionTicks + 75;
-				if (_currentGameSessionTicks == -75) {
+				getCharacterCurrentParams(kCharacterCond2)[3] = _realTime + 75;
+				if (_realTime == -75) {
 					getCharacter(kCharacterCond2).inventoryItem = 0;
 					getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 4;
 					Cond2Call(&LogicManager::CONS_Cond2_SitDownFast, 1, 0, 0, 0);
@@ -676,7 +676,7 @@ void LogicManager::HAND_Cond2_Passing(HAND_PARAMS) {
 				}
 			}
 
-			if (getCharacterCurrentParams(kCharacterCond2)[3] < _currentGameSessionTicks) {
+			if (getCharacterCurrentParams(kCharacterCond2)[3] < _realTime) {
 				getCharacterCurrentParams(kCharacterCond2)[3] = 0x7FFFFFFF;
 
 				getCharacter(kCharacterCond2).inventoryItem = 0;
@@ -687,8 +687,8 @@ void LogicManager::HAND_Cond2_Passing(HAND_PARAMS) {
 		}
 
 		if (getCharacterCurrentParams(kCharacterCond2)[4] ||
-			(getCharacterCurrentParams(kCharacterCond2)[4] = _currentGameSessionTicks + 225, _currentGameSessionTicks != -225)) {
-			if (getCharacterCurrentParams(kCharacterCond2)[4] >= _currentGameSessionTicks) {
+			(getCharacterCurrentParams(kCharacterCond2)[4] = _realTime + 225, _realTime != -225)) {
+			if (getCharacterCurrentParams(kCharacterCond2)[4] >= _realTime) {
 				break;
 			}
 
@@ -740,7 +740,7 @@ void LogicManager::HAND_Cond2_Passing(HAND_PARAMS) {
 			Cond2Call(&LogicManager::CONS_Cond2_GetUpListen, 1, 0, 0, 0);
 			break;
 		case 2:
-			if (_gameProgress[kProgressChapter] == 1 && !_gameProgress[kProgressEventFoundCorpse] && !_gameEvents[kEventCoudertAskTylerCompartment]) {
+			if (_globals[kProgressChapter] == 1 && !_globals[kProgressEventFoundCorpse] && !_doneNIS[kEventCoudertAskTylerCompartment]) {
 				getCharacter(kCharacterCond2).inventoryItem = 0x80;
 			}
 
@@ -757,8 +757,8 @@ void LogicManager::HAND_Cond2_Passing(HAND_PARAMS) {
 
 			if (!getCharacterCurrentParams(kCharacterCond2)[1] && !getCharacterCurrentParams(kCharacterCond2)[2]) {
 				if (!getCharacterCurrentParams(kCharacterCond2)[3]) {
-					getCharacterCurrentParams(kCharacterCond2)[3] = _currentGameSessionTicks + 75;
-					if (_currentGameSessionTicks == -75) {
+					getCharacterCurrentParams(kCharacterCond2)[3] = _realTime + 75;
+					if (_realTime == -75) {
 						getCharacter(kCharacterCond2).inventoryItem = 0;
 						getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 4;
 						Cond2Call(&LogicManager::CONS_Cond2_SitDownFast, 1, 0, 0, 0);
@@ -766,7 +766,7 @@ void LogicManager::HAND_Cond2_Passing(HAND_PARAMS) {
 					}
 				}
 
-				if (getCharacterCurrentParams(kCharacterCond2)[3] < _currentGameSessionTicks) {
+				if (getCharacterCurrentParams(kCharacterCond2)[3] < _realTime) {
 					getCharacterCurrentParams(kCharacterCond2)[3] = 0x7FFFFFFF;
 
 					getCharacter(kCharacterCond2).inventoryItem = 0;
@@ -777,8 +777,8 @@ void LogicManager::HAND_Cond2_Passing(HAND_PARAMS) {
 			}
 
 			if (getCharacterCurrentParams(kCharacterCond2)[4] ||
-				(getCharacterCurrentParams(kCharacterCond2)[4] = _currentGameSessionTicks + 225, _currentGameSessionTicks != -225)) {
-				if (getCharacterCurrentParams(kCharacterCond2)[4] >= _currentGameSessionTicks) {
+				(getCharacterCurrentParams(kCharacterCond2)[4] = _realTime + 225, _realTime != -225)) {
+				if (getCharacterCurrentParams(kCharacterCond2)[4] >= _realTime) {
 					break;
 				}
 
@@ -829,7 +829,7 @@ void LogicManager::CONS_Cond2_Listen(CONS_PARAMS) {
 void LogicManager::HAND_Cond2_Listen(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
-		if (_gameProgress[kProgressJacket] == 1 && nearChar(kCharacterCond2, kCharacterCath, 1000) && !inComp(kCharacterCath) && !whoOutside(kCharacterCath)) {
+		if (_globals[kProgressJacket] == 1 && nearChar(kCharacterCond2, kCharacterCath, 1000) && !inComp(kCharacterCath) && !whoOutside(kCharacterCath)) {
 			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 4;
 			Cond2Call(&LogicManager::CONS_Cond2_SaveGame, 2, 123, 0, 0);
 		}
@@ -923,7 +923,7 @@ void LogicManager::HAND_Cond2_TatianaLockUnlockMyComp(HAND_PARAMS) {
 		case 2:
 			if (getCharacter(kCharacterCond2).callParams[getCharacter(kCharacterCond2).currentCall].parameters[0]) {
 				playDialog(kCharacterCond2, "Tat3163", -1, 0);
-			} else if (_gameProgress[kProgressChapter] == 3 && _gameTime < 1449000) {
+			} else if (_globals[kProgressChapter] == 3 && _gameTime < 1449000) {
 				playDialog(kCharacterCond2, "Tat3161A", -1, 0);
 			} else {
 				playDialog(kCharacterCond2, "Tat3162A", -1, 0);
@@ -1269,16 +1269,16 @@ void LogicManager::HAND_Cond2_MakeBed(HAND_PARAMS) {
 
 		break;
 	case 12:
-		getCharacterCurrentParams(kCharacterCond2)[2] = _gameObjects[getCharacterCurrentParams(kCharacterCond2)[0]].character;
-		getCharacterCurrentParams(kCharacterCond2)[3] = _gameObjects[getCharacterCurrentParams(kCharacterCond2)[0]].door;
-		getCharacterCurrentParams(kCharacterCond2)[4] = _gameObjects[getCharacterCurrentParams(kCharacterCond2)[0]].cursor;
-		getCharacterCurrentParams(kCharacterCond2)[5] = _gameObjects[getCharacterCurrentParams(kCharacterCond2)[0]].cursor2;
+		getCharacterCurrentParams(kCharacterCond2)[2] = _doors[getCharacterCurrentParams(kCharacterCond2)[0]].who;
+		getCharacterCurrentParams(kCharacterCond2)[3] = _doors[getCharacterCurrentParams(kCharacterCond2)[0]].status;
+		getCharacterCurrentParams(kCharacterCond2)[4] = _doors[getCharacterCurrentParams(kCharacterCond2)[0]].windowCursor;
+		getCharacterCurrentParams(kCharacterCond2)[5] = _doors[getCharacterCurrentParams(kCharacterCond2)[0]].handleCursor;
 
 		if (getCharacterCurrentParams(kCharacterCond2)[1]) {
-			getCharacterCurrentParams(kCharacterCond2)[6] = _gameObjects[getCharacterCurrentParams(kCharacterCond2)[1]].character;
-			getCharacterCurrentParams(kCharacterCond2)[7] = _gameObjects[getCharacterCurrentParams(kCharacterCond2)[1]].door;
-			getCharacterCurrentParams(kCharacterCond2)[8] = _gameObjects[getCharacterCurrentParams(kCharacterCond2)[1]].cursor;
-			getCharacterCurrentParams(kCharacterCond2)[9] = _gameObjects[getCharacterCurrentParams(kCharacterCond2)[1]].cursor2;
+			getCharacterCurrentParams(kCharacterCond2)[6] = _doors[getCharacterCurrentParams(kCharacterCond2)[1]].who;
+			getCharacterCurrentParams(kCharacterCond2)[7] = _doors[getCharacterCurrentParams(kCharacterCond2)[1]].status;
+			getCharacterCurrentParams(kCharacterCond2)[8] = _doors[getCharacterCurrentParams(kCharacterCond2)[1]].windowCursor;
+			getCharacterCurrentParams(kCharacterCond2)[9] = _doors[getCharacterCurrentParams(kCharacterCond2)[1]].handleCursor;
 			setDoor(getCharacterCurrentParams(kCharacterCond2)[1], 4, 1, 10, 9);
 		}
 
@@ -1333,8 +1333,8 @@ void LogicManager::HAND_Cond2_MakeBedIvo(HAND_PARAMS) {
 	case 0:
 		if (!getCharacterCurrentParams(kCharacterCond2)[0]) {
 			if (getCharacterCurrentParams(kCharacterCond2)[1] ||
-				(getCharacterCurrentParams(kCharacterCond2)[1] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
-				if (getCharacterCurrentParams(kCharacterCond2)[1] >= _currentGameSessionTicks)
+				(getCharacterCurrentParams(kCharacterCond2)[1] = _realTime + 75, _realTime != -75)) {
+				if (getCharacterCurrentParams(kCharacterCond2)[1] >= _realTime)
 					break;
 
 				getCharacterCurrentParams(kCharacterCond2)[1] = 0x7FFFFFFF;
@@ -1437,8 +1437,8 @@ void LogicManager::HAND_Cond2_MakeBedMilos(HAND_PARAMS) {
 	case 0:
 		if (!getCharacterCurrentParams(kCharacterCond2)[0]) {
 			if (getCharacterCurrentParams(kCharacterCond2)[1] ||
-				(getCharacterCurrentParams(kCharacterCond2)[1] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
-				if (getCharacterCurrentParams(kCharacterCond2)[1] >= _currentGameSessionTicks)
+				(getCharacterCurrentParams(kCharacterCond2)[1] = _realTime + 75, _realTime != -75)) {
+				if (getCharacterCurrentParams(kCharacterCond2)[1] >= _realTime)
 					break;
 
 				getCharacterCurrentParams(kCharacterCond2)[1] = 0x7FFFFFFF;
@@ -1713,8 +1713,8 @@ void LogicManager::HAND_Cond2_MakeBedMadame(HAND_PARAMS) {
 	case 0:
 		if (!getCharacterCurrentParams(kCharacterCond2)[0]) {
 			if (getCharacterCurrentParams(kCharacterCond2)[1] ||
-				(getCharacterCurrentParams(kCharacterCond2)[1] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
-				if (getCharacterCurrentParams(kCharacterCond2)[1] >= _currentGameSessionTicks)
+				(getCharacterCurrentParams(kCharacterCond2)[1] = _realTime + 75, _realTime != -75)) {
+				if (getCharacterCurrentParams(kCharacterCond2)[1] >= _realTime)
 					break;
 
 				getCharacterCurrentParams(kCharacterCond2)[1] = 0x7FFFFFFF;
@@ -1815,8 +1815,8 @@ void LogicManager::HAND_Cond2_MakeBedMonsieur(HAND_PARAMS) {
 	case 0:
 		if (!getCharacterCurrentParams(kCharacterCond2)[0]) {
 			if (getCharacterCurrentParams(kCharacterCond2)[1] ||
-				(getCharacterCurrentParams(kCharacterCond2)[1] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
-				if (getCharacterCurrentParams(kCharacterCond2)[1] >= _currentGameSessionTicks)
+				(getCharacterCurrentParams(kCharacterCond2)[1] = _realTime + 75, _realTime != -75)) {
+				if (getCharacterCurrentParams(kCharacterCond2)[1] >= _realTime)
 					break;
 
 				getCharacterCurrentParams(kCharacterCond2)[1] = 0x7FFFFFFF;
@@ -2782,7 +2782,7 @@ void LogicManager::HAND_Cond2_Sitting(HAND_PARAMS) {
 			getCharacterParams(kCharacterCond2, 8)[18] = 0;
 		}
 
-		if (_gameProgress[kProgressEventFoundCorpse] || _gameEvents[kEventCoudertAskTylerCompartment]) {
+		if (_globals[kProgressEventFoundCorpse] || _doneNIS[kEventCoudertAskTylerCompartment]) {
 			getCharacter(kCharacterCond2).inventoryItem = 0;
 		} else {
 			getCharacter(kCharacterCond2).inventoryItem = 0x80;
@@ -2844,7 +2844,7 @@ void LogicManager::HAND_Cond2_Sitting(HAND_PARAMS) {
 			}
 		}
 
-		if (_gameTime > 1107000 && !getCharacterCurrentParams(kCharacterCond2)[0] && !_gameEvents[84]) {
+		if (_gameTime > 1107000 && !getCharacterCurrentParams(kCharacterCond2)[0] && !_doneNIS[84]) {
 			getCharacter(kCharacterCond2).inventoryItem = 0;
 			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 10;
 			Cond2Call(&LogicManager::CONS_Cond2_MakeAllBeds, 0, 0, 0, 0);
@@ -2912,7 +2912,7 @@ void LogicManager::HAND_Cond2_Sitting(HAND_PARAMS) {
 		if (!getCharacterParams(kCharacterCond2, 8)[16] &&
 			!getCharacterParams(kCharacterCond2, 8)[0] &&
 			(checkCathDir(kCarRedSleeping, 1) || checkCathDir(kCarRedSleeping, 23))) {
-			if (_gameProgress[kProgressJacket] == 1) {
+			if (_globals[kProgressJacket] == 1) {
 				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 1;
 				Cond2Call(&LogicManager::CONS_Cond2_SaveGame, 2, kEventCoudertBloodJacket, 0, 0);
 			} else {
@@ -2992,7 +2992,7 @@ void LogicManager::HAND_Cond2_Sitting(HAND_PARAMS) {
 				}
 			}
 
-			if (_gameTime > 1107000 && !getCharacterCurrentParams(kCharacterCond2)[0] && !_gameEvents[84]) {
+			if (_gameTime > 1107000 && !getCharacterCurrentParams(kCharacterCond2)[0] && !_doneNIS[84]) {
 				getCharacter(kCharacterCond2).inventoryItem = 0;
 				getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 10;
 				Cond2Call(&LogicManager::CONS_Cond2_MakeAllBeds, 0, 0, 0, 0);
@@ -4198,7 +4198,7 @@ void LogicManager::CONS_Cond2_TatianaComeHere(CONS_PARAMS) {
 void LogicManager::HAND_Cond2_TatianaComeHere(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
-		if (_gameTime > 2133000 && !_gameProgress[kProgressField40]) {
+		if (_gameTime > 2133000 && !_globals[kProgressField40]) {
 			softReleaseAtDoor(kCharacterCond2, 33);
 			setDoor(32, kCharacterCath, 0, 10, 9);
 			setDoor(33, kCharacterCath, 1, 10, 9);
@@ -5010,8 +5010,8 @@ void LogicManager::HAND_Cond2_InCompH(HAND_PARAMS) {
 	case 0:
 		if (getCharacterCurrentParams(kCharacterCond2)[0]) {
 			if (getCharacterCurrentParams(kCharacterCond2)[3] ||
-				(getCharacterCurrentParams(kCharacterCond2)[3] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
-				if (getCharacterCurrentParams(kCharacterCond2)[3] >= _currentGameSessionTicks)
+				(getCharacterCurrentParams(kCharacterCond2)[3] = _realTime + 75, _realTime != -75)) {
+				if (getCharacterCurrentParams(kCharacterCond2)[3] >= _realTime)
 					break;
 
 				getCharacterCurrentParams(kCharacterCond2)[3] = 0x7FFFFFFF;
diff --git a/engines/lastexpress/characters/cook.cpp b/engines/lastexpress/characters/cook.cpp
index 661a8bedf11..9494c91944c 100644
--- a/engines/lastexpress/characters/cook.cpp
+++ b/engines/lastexpress/characters/cook.cpp
@@ -128,10 +128,10 @@ void LogicManager::HAND_Cook_UptrainVersion(HAND_PARAMS) {
 		startCycOtis(kCharacterCook, "308A");
 		blockView(kCharacterCook, kCarRestaurant, 75);
 		blockView(kCharacterCook, kCarRestaurant, 78);
-		if (_gameProgress[kProgressChapter] == 1) {
+		if (_globals[kProgressChapter] == 1) {
 			getCharacter(kCharacterCook).callbacks[getCharacter(kCharacterCook).currentCall + 8] = 1;
 			CookCall(&LogicManager::CONS_Cook_DoDialog, "KIT1010", 0, 0, 0);
-		} else if (_gameProgress[kProgressChapter] == 3) {
+		} else if (_globals[kProgressChapter] == 3) {
 			getCharacter(kCharacterCook).callbacks[getCharacter(kCharacterCook).currentCall + 8] = 2;
 			CookCall(&LogicManager::CONS_Cook_DoDialog, "KIT1012", 0, 0, 0);
 		} else {
@@ -218,10 +218,10 @@ void LogicManager::HAND_Cook_DowntrainVersion(HAND_PARAMS) {
 		blockView(kCharacterCook, kCarRestaurant, 75);
 		blockView(kCharacterCook, kCarRestaurant, 78);
 
-		if (_gameProgress[kProgressChapter] == 1) {
+		if (_globals[kProgressChapter] == 1) {
 			getCharacter(kCharacterCook).callbacks[getCharacter(kCharacterCook).currentCall + 8] = 1;
 			CookCall(&LogicManager::CONS_Cook_DoDialog, "KIT1010", 0, 0, 0);
-		} else if (_gameProgress[kProgressChapter] == 3) {
+		} else if (_globals[kProgressChapter] == 3) {
 			getCharacter(kCharacterCook).callbacks[getCharacter(kCharacterCook).currentCall + 8] = 2;
 			CookCall(&LogicManager::CONS_Cook_DoDialog, "KIT1012", 0, 0, 0);
 		} else {
@@ -314,7 +314,7 @@ void LogicManager::HAND_Cook_Birth(HAND_PARAMS) {
 		getCharacter(kCharacterCook).characterPosition.car = kCarRestaurant;
 		getCharacter(kCharacterCook).characterPosition.position = 5900;
 		getCharacter(kCharacterCook).characterPosition.location = 0;
-		_gameProgress[kProgressField4C] = 0;
+		_globals[kProgressField4C] = 0;
 		break;
 	default:
 		break;
@@ -377,7 +377,7 @@ void LogicManager::HAND_Cook_InKitchenDinner(HAND_PARAMS) {
 		CONS_Cook_LockUp(0, 0, 0, 0);
 		break;
 	case 224849280:
-		_gameProgress[kProgressField4C] = 1;
+		_globals[kProgressField4C] = 1;
 		getCharacterCurrentParams(kCharacterCook)[0] = 1;
 		break;
 	default:
@@ -433,7 +433,7 @@ void LogicManager::HAND_Cook_StartPart2(HAND_PARAMS) {
 		getCharacter(kCharacterCook).characterPosition.position = 5900;
 		getCharacter(kCharacterCook).characterPosition.location = 0;
 		getCharacter(kCharacterCook).inventoryItem = kItemNone;
-		_gameProgress[kProgressField4C] = 1;
+		_globals[kProgressField4C] = 1;
 		break;
 	default:
 		break;
@@ -508,7 +508,7 @@ void LogicManager::HAND_Cook_StartPart3(HAND_PARAMS) {
 		endGraphics(kCharacterCook);
 		getCharacter(kCharacterCook).characterPosition.car = kCarRestaurant;
 		getCharacter(kCharacterCook).characterPosition.position = 5900;
-		_gameProgress[kProgressField4C] = 0;
+		_globals[kProgressField4C] = 0;
 		break;
 	default:
 		break;
@@ -581,7 +581,7 @@ void LogicManager::HAND_Cook_InKitchenLunch(HAND_PARAMS) {
 
 		break;
 	case 236976550:
-		_gameProgress[kProgressField4C] = 1;
+		_globals[kProgressField4C] = 1;
 		break;
 	default:
 		break;
@@ -609,7 +609,7 @@ void LogicManager::HAND_Cook_StartPart4(HAND_PARAMS) {
 		getCharacter(kCharacterCook).characterPosition.position = 5900;
 		getCharacter(kCharacterCook).characterPosition.location = 0;
 		getCharacter(kCharacterCook).inventoryItem = kItemNone;
-		_gameProgress[kProgressField4C] = 1;
+		_globals[kProgressField4C] = 1;
 		break;
 	default:
 		break;
diff --git a/engines/lastexpress/characters/demo/demo_anna.cpp b/engines/lastexpress/characters/demo/demo_anna.cpp
index 69432afbd13..7ce9ee1d3f4 100644
--- a/engines/lastexpress/characters/demo/demo_anna.cpp
+++ b/engines/lastexpress/characters/demo/demo_anna.cpp
@@ -298,7 +298,7 @@ void LogicManager::HAND_DemoAnna_GoBagg(HAND_PARAMS) {
 			DemoAnnaCall(&LogicManager::CONS_DemoAnna_FinishSeqOtis, 0, 0, 0, 0);
 			break;
 		case 5:
-			_gameProgress[kProgressField4C] = 1;
+			_globals[kProgressField4C] = 1;
 			endGraphics(kCharacterAnna);
 			CONS_DemoAnna_InBagg(0, 0, 0, 0);
 			break;
@@ -338,7 +338,7 @@ void LogicManager::HAND_DemoAnna_InBagg(HAND_PARAMS) {
 		break;
 	case 12:
 		getCharacter(kCharacterAnna).characterPosition.car = kCarBaggage;
-		_gameProgress[kProgressField54] = 1;
+		_globals[kProgressField54] = 1;
 		break;
 	case 235856512:
 		getCharacterCurrentParams(kCharacterAnna)[0] = 1;
@@ -420,7 +420,7 @@ void LogicManager::HAND_DemoAnna_BaggageFight(HAND_PARAMS) {
 			break;
 		case 3:
 			playNIS(kEventAnnaBagagePart2);
-			_gameProgress[kProgressField54] = 0;
+			_globals[kProgressField54] = 0;
 			forceJump(kCharacterVesna, &LogicManager::CONS_DemoVesna_InComp);
 			winGame();
 			break;
diff --git a/engines/lastexpress/characters/demo/demo_francois.cpp b/engines/lastexpress/characters/demo/demo_francois.cpp
index 16639e99f08..9da3e21132f 100644
--- a/engines/lastexpress/characters/demo/demo_francois.cpp
+++ b/engines/lastexpress/characters/demo/demo_francois.cpp
@@ -131,7 +131,7 @@ void LogicManager::HAND_DemoFrancois_Birth(HAND_PARAMS) {
 	case 0:
 		if (whoRunningDialog(kCharacterFrancois)) {
 			if (whoOnScreen(kCharacterFrancois) && whoFacingCath(kCharacterFrancois)) {
-				if (nearChar(kCharacterFrancois, kCharacterCath, 2500) && !_gameEvents[kEventFrancoisWhistleD])
+				if (nearChar(kCharacterFrancois, kCharacterCath, 2500) && !_doneNIS[kEventFrancoisWhistleD])
 					getCharacter(kCharacterFrancois).inventoryItem = 0x80;
 			} else {
 				getCharacter(kCharacterFrancois).inventoryItem = 0;
@@ -163,11 +163,11 @@ void LogicManager::HAND_DemoFrancois_Birth(HAND_PARAMS) {
 			return;
 		}
 
-		if (getCharacterCurrentParams(kCharacterFrancois)[5] || (getCharacterCurrentParams(kCharacterFrancois)[5] = getCharacterCurrentParams(kCharacterFrancois)[2] + _currentGameSessionTicks,
+		if (getCharacterCurrentParams(kCharacterFrancois)[5] || (getCharacterCurrentParams(kCharacterFrancois)[5] = getCharacterCurrentParams(kCharacterFrancois)[2] + _realTime,
 																 getCharacterCurrentParams(kCharacterFrancois)[5] != 0)) {
-			if (_currentGameSessionTicks <= getCharacterCurrentParams(kCharacterFrancois)[5]) {
+			if (_realTime <= getCharacterCurrentParams(kCharacterFrancois)[5]) {
 				if (whoOnScreen(kCharacterFrancois) && whoFacingCath(kCharacterFrancois)) {
-					if (nearChar(kCharacterFrancois, kCharacterCath, 2500) && !_gameEvents[kEventFrancoisWhistleD])
+					if (nearChar(kCharacterFrancois, kCharacterCath, 2500) && !_doneNIS[kEventFrancoisWhistleD])
 						getCharacter(kCharacterFrancois).inventoryItem = 0x80;
 				} else {
 					getCharacter(kCharacterFrancois).inventoryItem = 0;
@@ -212,7 +212,7 @@ void LogicManager::HAND_DemoFrancois_Birth(HAND_PARAMS) {
 		getCharacterCurrentParams(kCharacterFrancois)[2] = 15 * rnd(7);
 
 		if (whoOnScreen(kCharacterFrancois) && whoFacingCath(kCharacterFrancois)) {
-			if (nearChar(kCharacterFrancois, kCharacterCath, 2500) && !_gameEvents[kEventFrancoisWhistleD])
+			if (nearChar(kCharacterFrancois, kCharacterCath, 2500) && !_doneNIS[kEventFrancoisWhistleD])
 				getCharacter(kCharacterFrancois).inventoryItem = 0x80;
 		} else {
 			getCharacter(kCharacterFrancois).inventoryItem = 0;
diff --git a/engines/lastexpress/characters/demo/demo_madame.cpp b/engines/lastexpress/characters/demo/demo_madame.cpp
index 43f27e8dd45..9f382cd9060 100644
--- a/engines/lastexpress/characters/demo/demo_madame.cpp
+++ b/engines/lastexpress/characters/demo/demo_madame.cpp
@@ -100,10 +100,10 @@ void LogicManager::HAND_DemoMadame_Birth(HAND_PARAMS) {
 	case 0:
 		if (getCharacterCurrentParams(kCharacterMadame)[2]) {
 			if (getCharacterCurrentParams(kCharacterMadame)[3] ||
-				(getCharacterCurrentParams(kCharacterMadame)[3] = _currentGameSessionTicks + 75,
-					_currentGameSessionTicks != -75)) {
+				(getCharacterCurrentParams(kCharacterMadame)[3] = _realTime + 75,
+					_realTime != -75)) {
 
-				if (_currentGameSessionTicks <= getCharacterCurrentParams(kCharacterMadame)[3])
+				if (_realTime <= getCharacterCurrentParams(kCharacterMadame)[3])
 					return;
 
 				getCharacterCurrentParams(kCharacterMadame)[3] = 0x7FFFFFFF;
diff --git a/engines/lastexpress/characters/demo/demo_master.cpp b/engines/lastexpress/characters/demo/demo_master.cpp
index 04b7edab460..ebd7deac4b7 100644
--- a/engines/lastexpress/characters/demo/demo_master.cpp
+++ b/engines/lastexpress/characters/demo/demo_master.cpp
@@ -121,14 +121,14 @@ void LogicManager::HAND_DemoMaster_Birth(HAND_PARAMS) {
 		bool playSndFx = false;
 		bool doBumpCath = false;
 
-		if (_gameProgress[kProgressIsTrainRunning]) {
+		if (_globals[kProgressIsTrainRunning]) {
 			if (!getCharacterCurrentParams(kCharacterMaster)[3]) {
-				getCharacterCurrentParams(kCharacterMaster)[3] = _currentGameSessionTicks + getCharacterCurrentParams(kCharacterMaster)[0];
+				getCharacterCurrentParams(kCharacterMaster)[3] = _realTime + getCharacterCurrentParams(kCharacterMaster)[0];
 				if (!getCharacterCurrentParams(kCharacterMaster)[3])
 					playSndFx = true;
 			}
 
-			if (!playSndFx && _currentGameSessionTicks > getCharacterCurrentParams(kCharacterMaster)[3]) {
+			if (!playSndFx && _realTime > getCharacterCurrentParams(kCharacterMaster)[3]) {
 				getCharacterCurrentParams(kCharacterMaster)[3] = 0x7FFFFFFF;
 				playSndFx = true;
 			}
diff --git a/engines/lastexpress/characters/demo/demo_tatiana.cpp b/engines/lastexpress/characters/demo/demo_tatiana.cpp
index 2144167f3f0..1134a3b643b 100644
--- a/engines/lastexpress/characters/demo/demo_tatiana.cpp
+++ b/engines/lastexpress/characters/demo/demo_tatiana.cpp
@@ -66,8 +66,8 @@ void LogicManager::HAND_DemoTatiana_Birth(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
 		if (!getCharacterCurrentParams(kCharacterTatiana)[1] && !getCharacterCurrentParams(kCharacterTatiana)[3]) {
-			getCharacterCurrentParams(kCharacterTatiana)[0] -= _gameTimeTicksDelta;
-			if (getCharacterCurrentParams(kCharacterTatiana)[0] < _gameTimeTicksDelta) {
+			getCharacterCurrentParams(kCharacterTatiana)[0] -= _timeSpeed;
+			if (getCharacterCurrentParams(kCharacterTatiana)[0] < _timeSpeed) {
 				startCycOtis(kCharacterTatiana, (char *)&getCharacterCurrentParams(kCharacterTatiana)[7]);
 				playDialog(kCharacterTatiana, (char *)&getCharacterCurrentParams(kCharacterTatiana)[4], -1, 0);
 				getCharacterCurrentParams(kCharacterTatiana)[1] = 1;
diff --git a/engines/lastexpress/characters/demo/demo_vesna.cpp b/engines/lastexpress/characters/demo/demo_vesna.cpp
index d28aad51642..641d8bbbd25 100644
--- a/engines/lastexpress/characters/demo/demo_vesna.cpp
+++ b/engines/lastexpress/characters/demo/demo_vesna.cpp
@@ -211,7 +211,7 @@ void LogicManager::CONS_DemoVesna_InComp(CONS_PARAMS) {
 void LogicManager::HAND_DemoVesna_InComp(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
-		if (_gameProgress[kProgressField54] && getCharacterCurrentParams(kCharacterVesna)[0] != 0x7FFFFFFF && _gameTime) {
+		if (_globals[kProgressField54] && getCharacterCurrentParams(kCharacterVesna)[0] != 0x7FFFFFFF && _gameTime) {
 			if (_gameTime <= 2259000) {
 				if (!cathInCorridor(kCarRedSleeping) || !getCharacterCurrentParams(kCharacterVesna)[0]) {
 					getCharacterCurrentParams(kCharacterVesna)[0] = _gameTime;
diff --git a/engines/lastexpress/characters/francois.cpp b/engines/lastexpress/characters/francois.cpp
index 11dab04b1ba..9093fa97e41 100644
--- a/engines/lastexpress/characters/francois.cpp
+++ b/engines/lastexpress/characters/francois.cpp
@@ -322,11 +322,11 @@ void LogicManager::HAND_Francois_DoWalk(HAND_PARAMS) {
 		} else {
 			if (!nearChar(kCharacterFrancois, kCharacterCath, 2000) ||
 				!cathHasItem(kItemFirebird) ||
-				_gameEvents[kEventFrancoisShowEgg] ||
-				_gameEvents[kEventFrancoisShowEggD] ||
-				_gameEvents[kEventFrancoisShowEggNight] ||
-				_gameEvents[kEventFrancoisShowEggNightD]) {
-				getCharacter(kCharacterFrancois).inventoryItem = nearChar(kCharacterFrancois, kCharacterCath, 2000) && _gameInventory[kItemBeetle].location == 1 && !_gameEvents[kEventFrancoisShowBeetle] && !_gameEvents[kEventFrancoisShowBeetleD];
+				_doneNIS[kEventFrancoisShowEgg] ||
+				_doneNIS[kEventFrancoisShowEggD] ||
+				_doneNIS[kEventFrancoisShowEggNight] ||
+				_doneNIS[kEventFrancoisShowEggNightD]) {
+				getCharacter(kCharacterFrancois).inventoryItem = nearChar(kCharacterFrancois, kCharacterCath, 2000) && _items[kItemBeetle].floating == 1 && !_doneNIS[kEventFrancoisShowBeetle] && !_doneNIS[kEventFrancoisShowBeetleD];
 			} else {
 				getCharacter(kCharacterFrancois).inventoryItem = kItemFirebird;
 			}
@@ -390,7 +390,7 @@ void LogicManager::HAND_Francois_DoWalk(HAND_PARAMS) {
 			giveCathItem(kItemWhistle);
 			takeCathItem(kItemMatchBox);
 
-			_gameInventory[kItemBeetle].location = 2;
+			_items[kItemBeetle].floating = 2;
 
 			if (getCharacter(kCharacterFrancois).direction == 1) {
 				bumpCathFx(getCharacter(kCharacterFrancois).characterPosition.car, getCharacter(kCharacterFrancois).characterPosition.position - 750);
@@ -528,13 +528,13 @@ void LogicManager::HAND_Francois_Rampage(HAND_PARAMS) {
 			bool skip = false; // Horrible way to unroll a goto...
 
 			if (!getCharacterCurrentParams(kCharacterFrancois)[8]) {
-				getCharacterCurrentParams(kCharacterFrancois)[8] = _currentGameSessionTicks + getCharacterCurrentParams(kCharacterFrancois)[5];
-				if (_currentGameSessionTicks + getCharacterCurrentParams(kCharacterFrancois)[5] == 0) {
+				getCharacterCurrentParams(kCharacterFrancois)[8] = _realTime + getCharacterCurrentParams(kCharacterFrancois)[5];
+				if (_realTime + getCharacterCurrentParams(kCharacterFrancois)[5] == 0) {
 					skip = true;
 				}
 			}
 
-			if (skip || getCharacterCurrentParams(kCharacterFrancois)[8] < _currentGameSessionTicks) {
+			if (skip || getCharacterCurrentParams(kCharacterFrancois)[8] < _realTime) {
 				if (!skip) {
 					getCharacterCurrentParams(kCharacterFrancois)[8] = 0x7FFFFFFF;
 				}
@@ -577,7 +577,7 @@ void LogicManager::HAND_Francois_Rampage(HAND_PARAMS) {
 			if (getCharacterCurrentParams(kCharacterFrancois)[2] == 540) {
 				getCharacterCurrentParams(kCharacterFrancois)[1] = 4;
 
-				if (_gameProgress[kProgressChapter] != 1)
+				if (_globals[kProgressChapter] != 1)
 					getCharacterCurrentParams(kCharacterFrancois)[1] = 3;
 
 				getCharacterCurrentParams(kCharacterFrancois)[2] = 9460;
@@ -592,7 +592,7 @@ void LogicManager::HAND_Francois_Rampage(HAND_PARAMS) {
 		}
 
 		if (!nearX(kCharacterFrancois, 2000, 500) || getCharacter(kCharacterFrancois).direction != 2) {
-			if (_gameProgress[kProgressChapter] == 1) {
+			if (_globals[kProgressChapter] == 1) {
 				if (checkLoc(kCharacterFrancois, kCarRedSleeping) &&
 					(whoOnScreen(kCharacterFrancois) || getCharacterCurrentParams(kCharacterFrancois)[0] < _gameTime || getCharacterCurrentParams(kCharacterFrancois)[3]) &&
 					!getCharacterCurrentParams(kCharacterFrancois)[4] && getCharacter(kCharacterFrancois).characterPosition.position < getCharacter(kCharacterMadame).characterPosition.position) {
@@ -631,7 +631,7 @@ void LogicManager::HAND_Francois_Rampage(HAND_PARAMS) {
 			getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 3;
 			FrancoisCall(&LogicManager::CONS_Francois_DoSeqOtis, "605A", 0, 0, 0);
 		} else {
-			if (_gameProgress[kProgressChapter] == 1) {
+			if (_globals[kProgressChapter] == 1) {
 				if (checkLoc(kCharacterFrancois, kCarRedSleeping) &&
 					(whoOnScreen(kCharacterFrancois) || getCharacterCurrentParams(kCharacterFrancois)[0] < _gameTime || getCharacterCurrentParams(kCharacterFrancois)[3]) &&
 					!getCharacterCurrentParams(kCharacterFrancois)[4] && getCharacter(kCharacterFrancois).characterPosition.position < getCharacter(kCharacterMadame).characterPosition.position) {
@@ -669,7 +669,7 @@ void LogicManager::HAND_Francois_Rampage(HAND_PARAMS) {
 		FrancoisCall(&LogicManager::CONS_Francois_SaveGame, 2, kEventFrancoisWhistle, 0, 0);
 		break;
 	case 5:
-		if (_gameProgress[kProgressJacket] == 2 && !_gameEvents[kEventFrancoisWhistle] && !_gameEvents[kEventFrancoisWhistleD] && !_gameEvents[kEventFrancoisWhistleNight] && !_gameEvents[kEventFrancoisWhistleNightD]) {
+		if (_globals[kProgressJacket] == 2 && !_doneNIS[kEventFrancoisWhistle] && !_doneNIS[kEventFrancoisWhistleD] && !_doneNIS[kEventFrancoisWhistleNight] && !_doneNIS[kEventFrancoisWhistleNightD]) {
 			getCharacter(kCharacterFrancois).inventoryItem = 0x80;
 		}
 
@@ -700,7 +700,7 @@ void LogicManager::HAND_Francois_Rampage(HAND_PARAMS) {
 			getCharacter(kCharacterFrancois).characterPosition.position = 2088;
 			walk(kCharacterFrancois, getCharacterCurrentParams(kCharacterFrancois)[1], getCharacterCurrentParams(kCharacterFrancois)[2]);
 
-			if (_gameProgress[kProgressChapter] == 1) {
+			if (_globals[kProgressChapter] == 1) {
 				if (checkLoc(kCharacterFrancois, kCarRedSleeping) &&
 					(whoOnScreen(kCharacterFrancois) || getCharacterCurrentParams(kCharacterFrancois)[0] < _gameTime || getCharacterCurrentParams(kCharacterFrancois)[3]) &&
 					!getCharacterCurrentParams(kCharacterFrancois)[4] && getCharacter(kCharacterFrancois).characterPosition.position < getCharacter(kCharacterMadame).characterPosition.position) {
@@ -735,7 +735,7 @@ void LogicManager::HAND_Francois_Rampage(HAND_PARAMS) {
 			fedEx(kCharacterFrancois, kCharacterFrancois, 18, 0);
 			break;
 		case 6:
-			if (_gameProgress[kProgressJacket] == 2) {
+			if (_globals[kProgressJacket] == 2) {
 				if (!isNight()) {
 					if (getCharacter(kCharacterFrancois).characterPosition.position <= getCharacter(kCharacterCath).characterPosition.position) {
 						playNIS(kEventFrancoisWhistleD);
@@ -888,7 +888,7 @@ void LogicManager::HAND_Francois_HaremVisit(HAND_PARAMS) {
 			FrancoisCall(&LogicManager::CONS_Francois_DoWalk, 4, 4840, 0, 0);
 			break;
 		case 7:
-			if (cathHasItem(kItemWhistle) || _gameInventory[kItemWhistle].location == 3) {
+			if (cathHasItem(kItemWhistle) || _items[kItemWhistle].floating == 3) {
 				getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 10;
 				FrancoisCall(&LogicManager::CONS_Francois_DoWalk, 4, 5790, 0, 0);
 				break;
@@ -967,7 +967,7 @@ void LogicManager::HAND_Francois_ChaseBeetle(HAND_PARAMS) {
 			FrancoisCall(&LogicManager::CONS_Francois_DoWalk, 4, getCharacterCurrentParams(kCharacterFrancois)[1], 0, 0);
 			break;
 		case 2:
-			if (_gameInventory[kItemBeetle].location == 3) {
+			if (_items[kItemBeetle].floating == 3) {
 				startCycOtis(kCharacterFrancois, (char *)&getCharacterCurrentParams(kCharacterFrancois)[5]);
 				softBlockAtDoor(kCharacterFrancois, getCharacterCurrentParams(kCharacterFrancois)[0]);
 				getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 3;
@@ -1371,8 +1371,8 @@ void LogicManager::CONS_Francois_WithMama(CONS_PARAMS) {
 void LogicManager::HAND_Francois_WithMama(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
-		if ((_gameEvents[kEventFrancoisShowBeetle] || _gameEvents[kEventFrancoisShowBeetleD]) &&
-			!_gameEvents[kEventFrancoisTradeWhistle] && !_gameEvents[kEventFrancoisTradeWhistleD]) {
+		if ((_doneNIS[kEventFrancoisShowBeetle] || _doneNIS[kEventFrancoisShowBeetleD]) &&
+			!_doneNIS[kEventFrancoisTradeWhistle] && !_doneNIS[kEventFrancoisTradeWhistleD]) {
 			getCharacterParams(kCharacterFrancois, 8)[0] = 1;
 		}
 
@@ -1396,7 +1396,7 @@ void LogicManager::HAND_Francois_WithMama(HAND_PARAMS) {
 			break;
 		}
 
-		if (!cathHasItem(kItemWhistle) && _gameInventory[kItemWhistle].location != 3) {
+		if (!cathHasItem(kItemWhistle) && _items[kItemWhistle].floating != 3) {
 			if (_gameTime > 1768500 && !getCharacterCurrentParams(kCharacterFrancois)[2]) {
 				getCharacterCurrentParams(kCharacterFrancois)[2] = 1;
 				getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 4;
@@ -1412,7 +1412,7 @@ void LogicManager::HAND_Francois_WithMama(HAND_PARAMS) {
 			}
 		}
 
-		if (_gameInventory[kItemBeetle].location != 3) {
+		if (_items[kItemBeetle].floating != 3) {
 			cathHasItem(kItemWhistle);
 			break;
 		}
@@ -1477,7 +1477,7 @@ void LogicManager::HAND_Francois_WithMama(HAND_PARAMS) {
 
 			// fall through
 		case 3:
-			if (!cathHasItem(kItemWhistle) && _gameInventory[kItemWhistle].location != 3) {
+			if (!cathHasItem(kItemWhistle) && _items[kItemWhistle].floating != 3) {
 				if (_gameTime > 1768500 && !getCharacterCurrentParams(kCharacterFrancois)[2]) {
 					getCharacterCurrentParams(kCharacterFrancois)[2] = 1;
 					getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 4;
@@ -1493,7 +1493,7 @@ void LogicManager::HAND_Francois_WithMama(HAND_PARAMS) {
 				}
 			}
 
-			if (_gameInventory[kItemBeetle].location != 3) {
+			if (_items[kItemBeetle].floating != 3) {
 				cathHasItem(kItemWhistle);
 				break;
 			}
@@ -1547,7 +1547,7 @@ void LogicManager::HAND_Francois_WithMama(HAND_PARAMS) {
 
 			// fall through
 		case 5:
-			if (_gameInventory[kItemBeetle].location != 3) {
+			if (_items[kItemBeetle].floating != 3) {
 				cathHasItem(kItemWhistle);
 				break;
 			}
@@ -1580,7 +1580,7 @@ void LogicManager::HAND_Francois_WithMama(HAND_PARAMS) {
 			// fall through
 		case 6:
 			if (getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] == 6) {
-				_gameProgress[kProgressField9C] = 1;
+				_globals[kProgressField9C] = 1;
 			}
 
 			if (_gameTime > 1782000 && !getCharacterCurrentParams(kCharacterFrancois)[5]) {
@@ -1650,7 +1650,7 @@ void LogicManager::CONS_Francois_InPart3(CONS_PARAMS) {
 void LogicManager::HAND_Francois_InPart3(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
-		if ((_gameEvents[kEventFrancoisShowBeetle] || _gameEvents[kEventFrancoisShowBeetleD]) && !_gameEvents[kEventFrancoisTradeWhistle] && !_gameEvents[kEventFrancoisTradeWhistleD]) {
+		if ((_doneNIS[kEventFrancoisShowBeetle] || _doneNIS[kEventFrancoisShowBeetleD]) && !_doneNIS[kEventFrancoisTradeWhistle] && !_doneNIS[kEventFrancoisTradeWhistleD]) {
 			getCharacterParams(kCharacterFrancois, 8)[0] = 1;
 		}
 
@@ -1710,7 +1710,7 @@ void LogicManager::HAND_Francois_InPart3(HAND_PARAMS) {
 				break;
 			}
 
-			if (!cathHasItem(kItemWhistle) && _gameInventory[kItemWhistle].location != 3) {
+			if (!cathHasItem(kItemWhistle) && _items[kItemWhistle].floating != 3) {
 				if (_gameTime > 2011500 && !getCharacterCurrentParams(kCharacterFrancois)[9]) {
 					getCharacterCurrentParams(kCharacterFrancois)[9] = 1;
 					getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 10;
@@ -1726,7 +1726,7 @@ void LogicManager::HAND_Francois_InPart3(HAND_PARAMS) {
 				}
 			}
 
-			if (_gameInventory[kItemBeetle].location == 3) {
+			if (_items[kItemBeetle].floating == 3) {
 				if (getCharacterCurrentParams(kCharacterFrancois)[11] != 0x7FFFFFFF && _gameTime) {
 					if (_gameTime > 15803100) {
 						getCharacterCurrentParams(kCharacterFrancois)[11] = 0x7FFFFFFF;
@@ -1847,7 +1847,7 @@ void LogicManager::HAND_Francois_InPart3(HAND_PARAMS) {
 
 			// fall through
 		case 9:
-			if (!cathHasItem(kItemWhistle) && _gameInventory[kItemWhistle].location != 3) {
+			if (!cathHasItem(kItemWhistle) && _items[kItemWhistle].floating != 3) {
 				if (_gameTime > 2011500 && !getCharacterCurrentParams(kCharacterFrancois)[9]) {
 					getCharacterCurrentParams(kCharacterFrancois)[9] = 1;
 					getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 10;
@@ -1863,7 +1863,7 @@ void LogicManager::HAND_Francois_InPart3(HAND_PARAMS) {
 				}
 			}
 
-			if (_gameInventory[kItemBeetle].location == 3) {
+			if (_items[kItemBeetle].floating == 3) {
 				if (getCharacterCurrentParams(kCharacterFrancois)[11] != 0x7FFFFFFF && _gameTime) {
 					if (_gameTime > 15803100) {
 						getCharacterCurrentParams(kCharacterFrancois)[11] = 0x7FFFFFFF;
@@ -1924,7 +1924,7 @@ void LogicManager::HAND_Francois_InPart3(HAND_PARAMS) {
 
 			// fall through
 		case 11:
-			if (_gameInventory[kItemBeetle].location == 3) {
+			if (_items[kItemBeetle].floating == 3) {
 				if (getCharacterCurrentParams(kCharacterFrancois)[11] != 0x7FFFFFFF && _gameTime) {
 					if (_gameTime > 15803100) {
 						getCharacterCurrentParams(kCharacterFrancois)[11] = 0x7FFFFFFF;
@@ -1977,7 +1977,7 @@ void LogicManager::HAND_Francois_InPart3(HAND_PARAMS) {
 			break;
 		case 12:
 			if (getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] == 12) {
-				_gameProgress[kProgressField9C] = 1;
+				_globals[kProgressField9C] = 1;
 			}
 
 			if (_gameTime > 2040300 && !getCharacterCurrentParams(kCharacterFrancois)[12]) {
@@ -2115,7 +2115,7 @@ void LogicManager::CONS_Francois_Prisoner(CONS_PARAMS) {
 void LogicManager::HAND_Francois_Prisoner(HAND_PARAMS) {
 	switch (msg->action) {
 	case 70549068:
-		if (!cathHasItem(kItemWhistle) && _gameInventory[kItemWhistle].location != 3)
+		if (!cathHasItem(kItemWhistle) && _items[kItemWhistle].floating != 3)
 			dropItem(kItemWhistle, 1);
 
 		CONS_Francois_Hiding(0, 0, 0, 0);
diff --git a/engines/lastexpress/characters/headwait.cpp b/engines/lastexpress/characters/headwait.cpp
index ca0fae90f9b..d0d95386004 100644
--- a/engines/lastexpress/characters/headwait.cpp
+++ b/engines/lastexpress/characters/headwait.cpp
@@ -300,7 +300,7 @@ void LogicManager::HAND_HeadWait_RebeccaHereWeAre(HAND_PARAMS) {
 	case 18:
 		switch (getCharacter(kCharacterHeadWait).callbacks[getCharacter(kCharacterHeadWait).currentCall + 8]) {
 		case 1:
-			switch (_gameProgress[kProgressChapter]) {
+			switch (_globals[kProgressChapter]) {
 			case 1:
 				playDialog(kCharacterHeadWait, "REB1198", -1, 30);
 				break;
@@ -1509,8 +1509,8 @@ void LogicManager::HAND_HeadWait_Hiding(HAND_PARAMS) {
 		}
 
 		if (getCharacterCurrentParams(kCharacterHeadWait)[0]) {
-			if (getCharacterCurrentParams(kCharacterHeadWait)[5] || (getCharacterCurrentParams(kCharacterHeadWait)[5] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
-				if (getCharacterCurrentParams(kCharacterHeadWait)[5] >= _currentGameSessionTicks)
+			if (getCharacterCurrentParams(kCharacterHeadWait)[5] || (getCharacterCurrentParams(kCharacterHeadWait)[5] = _realTime + 75, _realTime != -75)) {
+				if (getCharacterCurrentParams(kCharacterHeadWait)[5] >= _realTime)
 					break;
 
 				getCharacterCurrentParams(kCharacterHeadWait)[5] = 0x7FFFFFFF;
@@ -1562,8 +1562,8 @@ void LogicManager::HAND_HeadWait_Hiding(HAND_PARAMS) {
 			setDoor(38, kCharacterHeadWait, 1, 10, 9);
 
 			if (getCharacterCurrentParams(kCharacterHeadWait)[0]) {
-				if (getCharacterCurrentParams(kCharacterHeadWait)[5] || (getCharacterCurrentParams(kCharacterHeadWait)[5] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
-					if (getCharacterCurrentParams(kCharacterHeadWait)[5] >= _currentGameSessionTicks)
+				if (getCharacterCurrentParams(kCharacterHeadWait)[5] || (getCharacterCurrentParams(kCharacterHeadWait)[5] = _realTime + 75, _realTime != -75)) {
+					if (getCharacterCurrentParams(kCharacterHeadWait)[5] >= _realTime)
 						break;
 
 					getCharacterCurrentParams(kCharacterHeadWait)[5] = 0x7FFFFFFF;
diff --git a/engines/lastexpress/characters/ivo.cpp b/engines/lastexpress/characters/ivo.cpp
index 62a3479caed..7aa23c6bdcd 100644
--- a/engines/lastexpress/characters/ivo.cpp
+++ b/engines/lastexpress/characters/ivo.cpp
@@ -197,9 +197,9 @@ void LogicManager::CONS_Ivo_DoWaitReal(CONS_PARAMS) {
 void LogicManager::HAND_Ivo_DoWaitReal(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
-		if (getCharacterCurrentParams(kCharacterIvo)[1] || (getCharacterCurrentParams(kCharacterIvo)[1] = _currentGameSessionTicks + getCharacterCurrentParams(kCharacterIvo)[0],
-															_currentGameSessionTicks + getCharacterCurrentParams(kCharacterIvo)[0] != 0)) {
-			if (getCharacterCurrentParams(kCharacterIvo)[1] >= _currentGameSessionTicks)
+		if (getCharacterCurrentParams(kCharacterIvo)[1] || (getCharacterCurrentParams(kCharacterIvo)[1] = _realTime + getCharacterCurrentParams(kCharacterIvo)[0],
+															_realTime + getCharacterCurrentParams(kCharacterIvo)[0] != 0)) {
+			if (getCharacterCurrentParams(kCharacterIvo)[1] >= _realTime)
 				break;
 
 			getCharacterCurrentParams(kCharacterIvo)[1] = 0x7FFFFFFF;
diff --git a/engines/lastexpress/characters/kahina.cpp b/engines/lastexpress/characters/kahina.cpp
index 55e984d6e9a..60404cd7b40 100644
--- a/engines/lastexpress/characters/kahina.cpp
+++ b/engines/lastexpress/characters/kahina.cpp
@@ -208,9 +208,9 @@ void LogicManager::CONS_Kahina_DoWaitReal(CONS_PARAMS) {
 void LogicManager::HAND_Kahina_DoWaitReal(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
-		if (getCharacterCurrentParams(kCharacterKahina)[1] || (getCharacterCurrentParams(kCharacterKahina)[1] = _currentGameSessionTicks + getCharacterCurrentParams(kCharacterKahina)[0],
-															   _currentGameSessionTicks + getCharacterCurrentParams(kCharacterKahina)[0] != 0)) {
-			if (getCharacterCurrentParams(kCharacterKahina)[1] >= _currentGameSessionTicks)
+		if (getCharacterCurrentParams(kCharacterKahina)[1] || (getCharacterCurrentParams(kCharacterKahina)[1] = _realTime + getCharacterCurrentParams(kCharacterKahina)[0],
+															   _realTime + getCharacterCurrentParams(kCharacterKahina)[0] != 0)) {
+			if (getCharacterCurrentParams(kCharacterKahina)[1] >= _realTime)
 				break;
 
 			getCharacterCurrentParams(kCharacterKahina)[1] = 0x7FFFFFFF;
@@ -405,7 +405,7 @@ void LogicManager::HAND_Kahina_DoWalk(HAND_PARAMS) {
 
 		break;
 	case 5:
-		if (_gameEvents[kEventKronosConversation] || _gameEvents[kEventKronosConversationFirebird]) {
+		if (_doneNIS[kEventKronosConversation] || _doneNIS[kEventKronosConversationFirebird]) {
 			if (rnd(2) == 0) {
 				playDialog(kCharacterCath, "CAT1019A", -1, 0);
 			} else {
@@ -499,12 +499,12 @@ void LogicManager::CONS_Kahina_InSeclusion(CONS_PARAMS) {
 void LogicManager::HAND_Kahina_InSeclusion(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
-		if (_gameTime > 1107000 && !getCharacterCurrentParams(kCharacterKahina)[0] && _gameProgress[kProgressJacket]) {
+		if (_gameTime > 1107000 && !getCharacterCurrentParams(kCharacterKahina)[0] && _globals[kProgressJacket]) {
 			send(kCharacterKahina, kCharacterCond1, 238732837, 0);
 			getCharacterCurrentParams(kCharacterKahina)[0] = 1;
 		}
 
-		if (_gameProgress[kProgressEventMertensChronosInvitation])
+		if (_globals[kProgressEventMertensChronosInvitation])
 			CONS_Kahina_AwaitingCath(0, 0, 0, 0);
 
 		break;
@@ -537,7 +537,7 @@ void LogicManager::HAND_Kahina_AwaitingCath(HAND_PARAMS) {
 		if (msg->action == 8)
 			playDialog(0, "LIB012", -1, 0);
 
-		if (!_gameEvents[kEventKronosGoingToInvitation]) {
+		if (!_doneNIS[kEventKronosGoingToInvitation]) {
 			getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 1;
 			KahinaCall(&LogicManager::CONS_Kahina_SaveGame, 2, kEventKronosGoingToInvitation, 0, 0);
 			break;
@@ -583,7 +583,7 @@ void LogicManager::CONS_Kahina_CathDone(CONS_PARAMS) {
 void LogicManager::HAND_Kahina_CathDone(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
-		if (!_gameProgress[kProgressField14] && _gameTime < 1201500 && getCharacterCurrentParams(kCharacterKahina)[1] != 0x7FFFFFFF && getCharacterCurrentParams(kCharacterKahina)[0] < _gameTime) {
+		if (!_globals[kProgressField14] && _gameTime < 1201500 && getCharacterCurrentParams(kCharacterKahina)[1] != 0x7FFFFFFF && getCharacterCurrentParams(kCharacterKahina)[0] < _gameTime) {
 			if (_gameTime <= 1197000) {
 				if (!cathInCorridor(kCarGreenSleeping) || !getCharacterCurrentParams(kCharacterKahina)[1]) {
 					getCharacterCurrentParams(kCharacterKahina)[1] = _gameTime;
@@ -682,7 +682,7 @@ void LogicManager::HAND_Kahina_SearchTrain(HAND_PARAMS) {
 
 		break;
 	case 12:
-		_gameProgress[kProgressField14] = 19;
+		_globals[kProgressField14] = 19;
 		getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 1;
 		KahinaCall(&LogicManager::CONS_Kahina_DoWalk, 3, 8200, 0, 0);
 		break;
@@ -691,8 +691,8 @@ void LogicManager::HAND_Kahina_SearchTrain(HAND_PARAMS) {
 		case 1:
 			if (!whoOnScreen(kCharacterKahina)) {
 				if (inComp(kCharacterCath, kCarGreenSleeping, 8200) || cathOutHisWindow() || nearChar(kCharacterKahina, kCharacterCath, 2000)) {
-					if (_gameProgress[kProgressField14] == 19)
-						_gameProgress[kProgressField14] = 0;
+					if (_globals[kProgressField14] == 19)
+						_globals[kProgressField14] = 0;
 
 					getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 8;
 					KahinaCall(&LogicManager::CONS_Kahina_DoWalk, 3, 9460, 0, 0);
@@ -717,8 +717,8 @@ void LogicManager::HAND_Kahina_SearchTrain(HAND_PARAMS) {
 			break;
 		case 4:
 			if (inComp(kCharacterCath, kCarGreenSleeping, 8200) || cathOutHisWindow() || nearChar(kCharacterKahina, kCharacterCath, 2000)) {
-				if (_gameProgress[kProgressField14] == 19)
-					_gameProgress[kProgressField14] = 0;
+				if (_globals[kProgressField14] == 19)
+					_globals[kProgressField14] = 0;
 
 				getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 8;
 				KahinaCall(&LogicManager::CONS_Kahina_DoWalk, 3, 9460, 0, 0);
@@ -745,8 +745,8 @@ void LogicManager::HAND_Kahina_SearchTrain(HAND_PARAMS) {
 		case 7:
 			getCharacter(kCharacterKahina).characterPosition.location = 0;
 
-			if (_gameProgress[kProgressField14] == 19)
-				_gameProgress[kProgressField14] = 0;
+			if (_globals[kProgressField14] == 19)
+				_globals[kProgressField14] = 0;
 
 			getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 8;
 			KahinaCall(&LogicManager::CONS_Kahina_DoWalk, 3, 9460, 0, 0);
@@ -879,8 +879,8 @@ void LogicManager::HAND_Kahina_InSeclusionPart2(HAND_PARAMS) {
 			}
 		}
 
-		if (!_gameEvents[kEventKahinaAskSpeakFirebird] || _gameEvents[kEventKronosConversationFirebird] || !checkLoc(kCharacterCath, kCarKronos)) {
-			if (_gameTime > 1845000 && _gameEvents[kEventKronosConversationFirebird] && inOuterSanctum(kCharacterCath)) {
+		if (!_doneNIS[kEventKahinaAskSpeakFirebird] || _doneNIS[kEventKronosConversationFirebird] || !checkLoc(kCharacterCath, kCarKronos)) {
+			if (_gameTime > 1845000 && _doneNIS[kEventKronosConversationFirebird] && inOuterSanctum(kCharacterCath)) {
 				setDoor(75, kCharacterCath, 1, 10, 9);
 				bumpCath(kCarKronos, 87, 255);
 			}
@@ -904,7 +904,7 @@ void LogicManager::HAND_Kahina_InSeclusionPart2(HAND_PARAMS) {
 			break;
 		}
 
-		if (_gameTime > 1845000 && _gameEvents[kEventKronosConversationFirebird] && inOuterSanctum(kCharacterCath)) {
+		if (_gameTime > 1845000 && _doneNIS[kEventKronosConversationFirebird] && inOuterSanctum(kCharacterCath)) {
 			setDoor(75, kCharacterCath, 1, 10, 9);
 			bumpCath(kCarKronos, 87, 255);
 		}
@@ -912,8 +912,8 @@ void LogicManager::HAND_Kahina_InSeclusionPart2(HAND_PARAMS) {
 		break;
 	case 8:
 	case 9:
-		if (!_gameEvents[kEventKronosConversationFirebird]) {
-			if (_gameEvents[kEventKahinaAskSpeakFirebird]) {
+		if (!_doneNIS[kEventKronosConversationFirebird]) {
+			if (_doneNIS[kEventKahinaAskSpeakFirebird]) {
 				if (whoRunningDialog(kCharacterKahina))
 					fadeDialog(kCharacterKahina);
 
@@ -922,7 +922,7 @@ void LogicManager::HAND_Kahina_InSeclusionPart2(HAND_PARAMS) {
 
 				getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 4;
 				KahinaCall(&LogicManager::CONS_Kahina_SaveGame, 2, kEventKronosConversationFirebird, 0, 0);
-			} else if (_gameEvents[kEventMilosCompartmentVisitAugust] || _gameEvents[kEventTatianaGivePoem] || _gameEvents[kEventTatianaBreakfastGivePoem]) {
+			} else if (_doneNIS[kEventMilosCompartmentVisitAugust] || _doneNIS[kEventTatianaGivePoem] || _doneNIS[kEventTatianaBreakfastGivePoem]) {
 				if (msg->action == 8)
 					playDialog(0, "LIB012", -1, 0);
 
@@ -969,7 +969,7 @@ void LogicManager::HAND_Kahina_InSeclusionPart2(HAND_PARAMS) {
 			KahinaCall(&LogicManager::CONS_Kahina_DoDialog, "KRO3005", 0, 0, 0);
 			break;
 		case 3:
-			if (_gameTime > 1845000 && _gameEvents[kEventKronosConversationFirebird] && inOuterSanctum(kCharacterCath)) {
+			if (_gameTime > 1845000 && _doneNIS[kEventKronosConversationFirebird] && inOuterSanctum(kCharacterCath)) {
 				setDoor(75, kCharacterCath, 1, 10, 9);
 				bumpCath(kCarKronos, 87, 255);
 			}
@@ -1052,7 +1052,7 @@ void LogicManager::CONS_Kahina_DoWalk1033(CONS_PARAMS) {
 void LogicManager::HAND_Kahina_DoWalk1033(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
-		if (_gameEvents[kEventAnnaBaggageArgument])
+		if (_doneNIS[kEventAnnaBaggageArgument])
 			forceJump(kCharacterKahina, &LogicManager::CONS_Kahina_Finished);
 
 		if (walk(kCharacterKahina, getCharacterCurrentParams(kCharacterKahina)[0], getCharacterCurrentParams(kCharacterKahina)[1])) {
@@ -1063,7 +1063,7 @@ void LogicManager::HAND_Kahina_DoWalk1033(HAND_PARAMS) {
 
 		break;
 	case 5:
-		if (_gameEvents[kEventKronosConversation] || _gameEvents[kEventKronosConversationFirebird]) {
+		if (_doneNIS[kEventKronosConversation] || _doneNIS[kEventKronosConversationFirebird]) {
 			if (rnd(2) == 0) {
 				playDialog(kCharacterCath, "CAT1019A", -1, 0);
 			} else {
@@ -1103,7 +1103,7 @@ void LogicManager::CONS_Kahina_BeforeConcert(CONS_PARAMS) {
 void LogicManager::HAND_Kahina_BeforeConcert(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
-		if (_gameEvents[kEventKronosVisit])
+		if (_doneNIS[kEventKronosVisit])
 			setDoor(75, kCharacterCath, 3, 10, 9);
 
 		if (inInnerSanctum(kCharacterCath)) {
@@ -1114,7 +1114,7 @@ void LogicManager::HAND_Kahina_BeforeConcert(HAND_PARAMS) {
 
 		if (_gameTime > 2079000 && !getCharacterCurrentParams(kCharacterKahina)[1]) {
 			getCharacterCurrentParams(kCharacterKahina)[1] = 1;
-			if (_gameEvents[kEventKahinaAskSpeakFirebird] && !_gameEvents[kEventKronosConversationFirebird] && checkLoc(kCharacterCath, kCarKronos)) {
+			if (_doneNIS[kEventKahinaAskSpeakFirebird] && !_doneNIS[kEventKronosConversationFirebird] && checkLoc(kCharacterCath, kCarKronos)) {
 				getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 2;
 				KahinaCall(&LogicManager::CONS_Kahina_SaveGame, 2, kEventKronosConversationFirebird, 0, 0);
 			} else {
@@ -1146,7 +1146,7 @@ void LogicManager::HAND_Kahina_BeforeConcert(HAND_PARAMS) {
 			}
 		}
 
-		if (_gameEvents[kEventKahinaAskSpeakFirebird] && !_gameEvents[kEventKronosConversationFirebird] && checkLoc(kCharacterCath, kCarKronos)) {
+		if (_doneNIS[kEventKahinaAskSpeakFirebird] && !_doneNIS[kEventKronosConversationFirebird] && checkLoc(kCharacterCath, kCarKronos)) {
 			if (getCharacterCurrentParams(kCharacterKahina)[3] || (getCharacterCurrentParams(kCharacterKahina)[3] = _gameTime + 900,
 																   _gameTime != -900)) {
 				if (getCharacterCurrentParams(kCharacterKahina)[3] >= _gameTime)
@@ -1162,14 +1162,14 @@ void LogicManager::HAND_Kahina_BeforeConcert(HAND_PARAMS) {
 		break;
 	case 8:
 	case 9:
-		if (!_gameEvents[kEventKronosConversationFirebird]) {
-			if (_gameEvents[kEventKahinaAskSpeakFirebird]) {
+		if (!_doneNIS[kEventKronosConversationFirebird]) {
+			if (_doneNIS[kEventKahinaAskSpeakFirebird]) {
 				if (msg->action == 8)
 					playDialog(0, "LIB012", -1, 0);
 
 				getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 6;
 				KahinaCall(&LogicManager::CONS_Kahina_SaveGame, 2, kEventKronosConversationFirebird, 0, 0);
-			} else if (_gameEvents[kEventMilosCompartmentVisitAugust] || _gameEvents[kEventTatianaGivePoem] || _gameEvents[kEventTatianaBreakfastGivePoem]) {
+			} else if (_doneNIS[kEventMilosCompartmentVisitAugust] || _doneNIS[kEventTatianaGivePoem] || _doneNIS[kEventTatianaBreakfastGivePoem]) {
 				if (msg->action == 8)
 					playDialog(0, "LIB012", -1, 0);
 
@@ -1199,7 +1199,7 @@ void LogicManager::HAND_Kahina_BeforeConcert(HAND_PARAMS) {
 
 		break;
 	case 12:
-		if (_gameEvents[kEventKronosConversationFirebird]) {
+		if (_doneNIS[kEventKronosConversationFirebird]) {
 			setDoor(75, kCharacterCath, 3, 10, 9);
 		} else {
 			setDoor(75, kCharacterKahina, 1, 10, 9);
@@ -1214,7 +1214,7 @@ void LogicManager::HAND_Kahina_BeforeConcert(HAND_PARAMS) {
 
 			if (_gameTime > 2079000 && !getCharacterCurrentParams(kCharacterKahina)[1]) {
 				getCharacterCurrentParams(kCharacterKahina)[1] = 1;
-				if (_gameEvents[kEventKahinaAskSpeakFirebird] && !_gameEvents[kEventKronosConversationFirebird] && checkLoc(kCharacterCath, kCarKronos)) {
+				if (_doneNIS[kEventKahinaAskSpeakFirebird] && !_doneNIS[kEventKronosConversationFirebird] && checkLoc(kCharacterCath, kCarKronos)) {
 					getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 2;
 					KahinaCall(&LogicManager::CONS_Kahina_SaveGame, 2, kEventKronosConversationFirebird, 0, 0);
 				} else {
@@ -1246,7 +1246,7 @@ void LogicManager::HAND_Kahina_BeforeConcert(HAND_PARAMS) {
 				}
 			}
 
-			if (_gameEvents[kEventKahinaAskSpeakFirebird] && !_gameEvents[kEventKronosConversationFirebird] && checkLoc(kCharacterCath, kCarKronos)) {
+			if (_doneNIS[kEventKahinaAskSpeakFirebird] && !_doneNIS[kEventKronosConversationFirebird] && checkLoc(kCharacterCath, kCarKronos)) {
 				if (getCharacterCurrentParams(kCharacterKahina)[3] || (getCharacterCurrentParams(kCharacterKahina)[3] = _gameTime + 900,
 																	   _gameTime != -900)) {
 					if (getCharacterCurrentParams(kCharacterKahina)[3] >= _gameTime)
@@ -1358,11 +1358,11 @@ void LogicManager::HAND_Kahina_Concert(HAND_PARAMS) {
 		}
 
 		if (!getCharacterCurrentParams(kCharacterKahina)[1]) {
-			if (!_gameProgress[kProgressField44] && _gameTime > 2214000) {
-				if (_gameInventory[kProgressField48].location == 3 || _gameInventory[kProgressField48].location == 7) {
+			if (!_globals[kProgressField44] && _gameTime > 2214000) {
+				if (_items[kProgressField48].floating == 3 || _items[kProgressField48].floating == 7) {
 					getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 3;
 					KahinaCall(&LogicManager::CONS_Kahina_SearchCath, 0, 0, 0, 0);
-				} else if (_gameInventory[kProgressField48].location == 2 || _gameInventory[kProgressField48].location == 1) {
+				} else if (_items[kProgressField48].floating == 2 || _items[kProgressField48].floating == 1) {
 					getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 4;
 					KahinaCall(&LogicManager::CONS_Kahina_SearchTatiana, 0, 0, 0, 0);
 				}
@@ -1375,11 +1375,11 @@ void LogicManager::HAND_Kahina_Concert(HAND_PARAMS) {
 			getCharacterCurrentParams(kCharacterKahina)[3] = _gameTime + 4500;
 
 		if (getCharacterCurrentParams(kCharacterKahina)[5] == 0x7FFFFFFF || !_gameTime) {
-			if (!_gameProgress[kProgressField44] && _gameTime > 2214000) {
-				if (_gameInventory[kProgressField48].location == 3 || _gameInventory[kProgressField48].location == 7) {
+			if (!_globals[kProgressField44] && _gameTime > 2214000) {
+				if (_items[kProgressField48].floating == 3 || _items[kProgressField48].floating == 7) {
 					getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 3;
 					KahinaCall(&LogicManager::CONS_Kahina_SearchCath, 0, 0, 0, 0);
-				} else if (_gameInventory[kProgressField48].location == 2 || _gameInventory[kProgressField48].location == 1) {
+				} else if (_items[kProgressField48].floating == 2 || _items[kProgressField48].floating == 1) {
 					getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 4;
 					KahinaCall(&LogicManager::CONS_Kahina_SearchTatiana, 0, 0, 0, 0);
 				}
@@ -1396,11 +1396,11 @@ void LogicManager::HAND_Kahina_Concert(HAND_PARAMS) {
 					playDialog(0, "LIB015", getVolume(kCharacterKahina), 15);
 					startCycOtis(kCharacterKahina, "202a");
 					getCharacterCurrentParams(kCharacterKahina)[1] = 0;
-					if (!_gameProgress[kProgressField44] && _gameTime > 2214000) {
-						if (_gameInventory[kProgressField48].location == 3 || _gameInventory[kProgressField48].location == 7) {
+					if (!_globals[kProgressField44] && _gameTime > 2214000) {
+						if (_items[kProgressField48].floating == 3 || _items[kProgressField48].floating == 7) {
 							getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 3;
 							KahinaCall(&LogicManager::CONS_Kahina_SearchCath, 0, 0, 0, 0);
-						} else if (_gameInventory[kProgressField48].location == 2 || _gameInventory[kProgressField48].location == 1) {
+						} else if (_items[kProgressField48].floating == 2 || _items[kProgressField48].floating == 1) {
 							getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 4;
 							KahinaCall(&LogicManager::CONS_Kahina_SearchTatiana, 0, 0, 0, 0);
 						}
@@ -1411,11 +1411,11 @@ void LogicManager::HAND_Kahina_Concert(HAND_PARAMS) {
 			}
 
 			if (getCharacterCurrentParams(kCharacterKahina)[5] >= _gameTime) {
-				if (!_gameProgress[kProgressField44] && _gameTime > 2214000) {
-					if (_gameInventory[kProgressField48].location == 3 || _gameInventory[kProgressField48].location == 7) {
+				if (!_globals[kProgressField44] && _gameTime > 2214000) {
+					if (_items[kProgressField48].floating == 3 || _items[kProgressField48].floating == 7) {
 						getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 3;
 						KahinaCall(&LogicManager::CONS_Kahina_SearchCath, 0, 0, 0, 0);
-					} else if (_gameInventory[kProgressField48].location == 2 || _gameInventory[kProgressField48].location == 1) {
+					} else if (_items[kProgressField48].floating == 2 || _items[kProgressField48].floating == 1) {
 						getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 4;
 						KahinaCall(&LogicManager::CONS_Kahina_SearchTatiana, 0, 0, 0, 0);
 					}
@@ -1431,11 +1431,11 @@ void LogicManager::HAND_Kahina_Concert(HAND_PARAMS) {
 		startCycOtis(kCharacterKahina, "202a");
 		getCharacterCurrentParams(kCharacterKahina)[1] = 0;
 
-		if (!_gameProgress[kProgressField44] && _gameTime > 2214000) {
-			if (_gameInventory[kProgressField48].location == 3 || _gameInventory[kProgressField48].location == 7) {
+		if (!_globals[kProgressField44] && _gameTime > 2214000) {
+			if (_items[kProgressField48].floating == 3 || _items[kProgressField48].floating == 7) {
 				getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 3;
 				KahinaCall(&LogicManager::CONS_Kahina_SearchCath, 0, 0, 0, 0);
-			} else if (_gameInventory[kProgressField48].location == 2 || _gameInventory[kProgressField48].location == 1) {
+			} else if (_items[kProgressField48].floating == 2 || _items[kProgressField48].floating == 1) {
 				getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 4;
 				KahinaCall(&LogicManager::CONS_Kahina_SearchTatiana, 0, 0, 0, 0);
 			}
@@ -1459,11 +1459,11 @@ void LogicManager::HAND_Kahina_Concert(HAND_PARAMS) {
 			getCharacterCurrentParams(kCharacterKahina)[0] = 0;
 			getCharacterCurrentParams(kCharacterKahina)[1] = 1;
 			if (!getCharacterCurrentParams(kCharacterKahina)[1]) {
-				if (!_gameProgress[kProgressField44] && _gameTime > 2214000) {
-					if (_gameInventory[kProgressField48].location == 3 || _gameInventory[kProgressField48].location == 7) {
+				if (!_globals[kProgressField44] && _gameTime > 2214000) {
+					if (_items[kProgressField48].floating == 3 || _items[kProgressField48].floating == 7) {
 						getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 3;
 						KahinaCall(&LogicManager::CONS_Kahina_SearchCath, 0, 0, 0, 0);
-					} else if (_gameInventory[kProgressField48].location == 2 || _gameInventory[kProgressField48].location == 1) {
+					} else if (_items[kProgressField48].floating == 2 || _items[kProgressField48].floating == 1) {
 						getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 4;
 						KahinaCall(&LogicManager::CONS_Kahina_SearchTatiana, 0, 0, 0, 0);
 					}
@@ -1476,11 +1476,11 @@ void LogicManager::HAND_Kahina_Concert(HAND_PARAMS) {
 				getCharacterCurrentParams(kCharacterKahina)[3] = _gameTime + 4500;
 
 			if (getCharacterCurrentParams(kCharacterKahina)[5] == 0x7FFFFFFF || !_gameTime) {
-				if (!_gameProgress[kProgressField44] && _gameTime > 2214000) {
-					if (_gameInventory[kProgressField48].location == 3 || _gameInventory[kProgressField48].location == 7) {
+				if (!_globals[kProgressField44] && _gameTime > 2214000) {
+					if (_items[kProgressField48].floating == 3 || _items[kProgressField48].floating == 7) {
 						getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 3;
 						KahinaCall(&LogicManager::CONS_Kahina_SearchCath, 0, 0, 0, 0);
-					} else if (_gameInventory[kProgressField48].location == 2 || _gameInventory[kProgressField48].location == 1) {
+					} else if (_items[kProgressField48].floating == 2 || _items[kProgressField48].floating == 1) {
 						getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 4;
 						KahinaCall(&LogicManager::CONS_Kahina_SearchTatiana, 0, 0, 0, 0);
 					}
@@ -1497,11 +1497,11 @@ void LogicManager::HAND_Kahina_Concert(HAND_PARAMS) {
 						playDialog(0, "LIB015", getVolume(kCharacterKahina), 15);
 						startCycOtis(kCharacterKahina, "202a");
 						getCharacterCurrentParams(kCharacterKahina)[1] = 0;
-						if (!_gameProgress[kProgressField44] && _gameTime > 2214000) {
-							if (_gameInventory[kProgressField48].location == 3 || _gameInventory[kProgressField48].location == 7) {
+						if (!_globals[kProgressField44] && _gameTime > 2214000) {
+							if (_items[kProgressField48].floating == 3 || _items[kProgressField48].floating == 7) {
 								getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 3;
 								KahinaCall(&LogicManager::CONS_Kahina_SearchCath, 0, 0, 0, 0);
-							} else if (_gameInventory[kProgressField48].location == 2 || _gameInventory[kProgressField48].location == 1) {
+							} else if (_items[kProgressField48].floating == 2 || _items[kProgressField48].floating == 1) {
 								getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 4;
 								KahinaCall(&LogicManager::CONS_Kahina_SearchTatiana, 0, 0, 0, 0);
 							}
@@ -1512,11 +1512,11 @@ void LogicManager::HAND_Kahina_Concert(HAND_PARAMS) {
 				}
 
 				if (getCharacterCurrentParams(kCharacterKahina)[5] >= _gameTime) {
-					if (!_gameProgress[kProgressField44] && _gameTime > 2214000) {
-						if (_gameInventory[kProgressField48].location == 3 || _gameInventory[kProgressField48].location == 7) {
+					if (!_globals[kProgressField44] && _gameTime > 2214000) {
+						if (_items[kProgressField48].floating == 3 || _items[kProgressField48].floating == 7) {
 							getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 3;
 							KahinaCall(&LogicManager::CONS_Kahina_SearchCath, 0, 0, 0, 0);
-						} else if (_gameInventory[kProgressField48].location == 2 || _gameInventory[kProgressField48].location == 1) {
+						} else if (_items[kProgressField48].floating == 2 || _items[kProgressField48].floating == 1) {
 							getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 4;
 							KahinaCall(&LogicManager::CONS_Kahina_SearchTatiana, 0, 0, 0, 0);
 						}
@@ -1532,11 +1532,11 @@ void LogicManager::HAND_Kahina_Concert(HAND_PARAMS) {
 			startCycOtis(kCharacterKahina, "202a");
 			getCharacterCurrentParams(kCharacterKahina)[1] = 0;
 
-			if (!_gameProgress[kProgressField44] && _gameTime > 2214000) {
-				if (_gameInventory[kProgressField48].location == 3 || _gameInventory[kProgressField48].location == 7) {
+			if (!_globals[kProgressField44] && _gameTime > 2214000) {
+				if (_items[kProgressField48].floating == 3 || _items[kProgressField48].floating == 7) {
 					getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 3;
 					KahinaCall(&LogicManager::CONS_Kahina_SearchCath, 0, 0, 0, 0);
-				} else if (_gameInventory[kProgressField48].location == 2 || _gameInventory[kProgressField48].location == 1) {
+				} else if (_items[kProgressField48].floating == 2 || _items[kProgressField48].floating == 1) {
 					getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 4;
 					KahinaCall(&LogicManager::CONS_Kahina_SearchTatiana, 0, 0, 0, 0);
 				}
@@ -1554,7 +1554,7 @@ void LogicManager::HAND_Kahina_Concert(HAND_PARAMS) {
 
 		break;
 	case 134611040:
-		if (_gameEvents[kEventConcertLeaveWithBriefcase])
+		if (_doneNIS[kEventConcertLeaveWithBriefcase])
 			CONS_Kahina_SeekCath(0, 0, 0, 0);
 
 		break;
@@ -1584,10 +1584,10 @@ void LogicManager::HAND_Kahina_Finished(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
 		if (getCharacterCurrentParams(kCharacterKahina)[0]) {
-			if (getCharacterParams(kCharacterKahina, 8)[2] || (_gameInventory[kItemFirebird].location == 3) || _gameInventory[kItemFirebird].location == 7) {
+			if (getCharacterParams(kCharacterKahina, 8)[2] || (_items[kItemFirebird].floating == 3) || _items[kItemFirebird].floating == 7) {
 				getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 1;
 				KahinaCall(&LogicManager::CONS_Kahina_SearchCath, 0, 0, 0, 0);
-			} else if (_gameInventory[kItemFirebird].location == 2 || _gameInventory[kItemFirebird].location == 1) {
+			} else if (_items[kItemFirebird].floating == 2 || _items[kItemFirebird].floating == 1) {
 				getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 2;
 				KahinaCall(&LogicManager::CONS_Kahina_SearchTatiana, 0, 0, 0, 0);
 			}
@@ -1735,7 +1735,7 @@ void LogicManager::HAND_Kahina_SeekCath(HAND_PARAMS) {
 				bumpCathRx(getCharacter(kCharacterKahina).characterPosition.car, getCharacter(kCharacterKahina).characterPosition.position + 750);
 				send(kCharacterKahina, kCharacterKronos, 235599361, 0);
 				playDialog(kCharacterKahina, "MUS016", 16, 0);
-				_gameProgress[kProgressField44] = 1;
+				_globals[kProgressField44] = 1;
 				getCharacterCurrentParams(kCharacterKahina)[0] = 1;
 				getCharacterCurrentParams(kCharacterKahina)[1] = 2;
 				getCharacterCurrentParams(kCharacterKahina)[2] = 9270;
@@ -1760,7 +1760,7 @@ void LogicManager::HAND_Kahina_SeekCath(HAND_PARAMS) {
 		if (whoRunningDialog(kCharacterKahina))
 			fadeDialog(kCharacterKahina);
 
-		_gameProgress[kProgressField44] = 0;
+		_globals[kProgressField44] = 0;
 		CONS_Kahina_Finished(0, 0, 0, 0);
 		break;
 	case 137503360:
@@ -1769,7 +1769,7 @@ void LogicManager::HAND_Kahina_SeekCath(HAND_PARAMS) {
 		if (whoRunningDialog(kCharacterKahina))
 			fadeDialog(kCharacterKahina);
 
-		_gameProgress[kProgressField44] = 0;
+		_globals[kProgressField44] = 0;
 		CONS_Kahina_Finished(0, 0, 0, 0);
 		break;
 	default:
@@ -1812,18 +1812,18 @@ void LogicManager::HAND_Kahina_SearchCath(HAND_PARAMS) {
 
 		break;
 	case 12:
-		if (!_gameEvents[kEventAnnaBaggageArgument]) {
+		if (!_doneNIS[kEventAnnaBaggageArgument]) {
 			getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 1;
 			KahinaCall(&LogicManager::CONS_Kahina_DoWalk1033, 3, 8200, 0, 0);
 			break;
 		}
 
-		if (_gameInventory[kItemFirebird].location == 3) {
-			_gameProgress[kProgressField7C] = 1;
+		if (_items[kItemFirebird].floating == 3) {
+			_globals[kProgressField7C] = 1;
 		} else {
-			if (_gameInventory[kItemFirebird].location != 7) {
+			if (_items[kItemFirebird].floating != 7) {
 				dropItem(kItemBriefcase, 2);
-				_gameProgress[kProgressField78] = 1;
+				_globals[kProgressField78] = 1;
 				getCharacterParams(kCharacterKahina, 8)[2] = 0;
 
 				getCharacter(kCharacterKahina).currentCall--;
@@ -1832,14 +1832,14 @@ void LogicManager::HAND_Kahina_SearchCath(HAND_PARAMS) {
 				break;
 			}
 
-			_gameProgress[kProgressField80] = 1;
+			_globals[kProgressField80] = 1;
 		}
 
 		takeItem(kItemFirebird);
-		_gameInventory[kItemFirebird].location = 5;
+		_items[kItemFirebird].floating = 5;
 		send(kCharacterKahina, kCharacterKronos, 138085344, 0);
 		dropItem(kItemBriefcase, 2);
-		_gameProgress[kProgressField78] = 1;
+		_globals[kProgressField78] = 1;
 		getCharacterParams(kCharacterKahina, 8)[2] = 0;
 
 		getCharacter(kCharacterKahina).currentCall--;
@@ -1912,17 +1912,17 @@ void LogicManager::HAND_Kahina_SearchCath(HAND_PARAMS) {
 			setDoor(1, kCharacterCath, 0, 10, 9);
 			setDoor(17, kCharacterCath, 0, 10, 9);
 
-			if (_gameInventory[kItemFirebird].location == 3) {
-				_gameProgress[kProgressField7C] = 1;
+			if (_items[kItemFirebird].floating == 3) {
+				_globals[kProgressField7C] = 1;
 				takeItem(kItemFirebird);
-				_gameInventory[kItemFirebird].location = 5;
+				_items[kItemFirebird].floating = 5;
 				send(kCharacterKahina, kCharacterKronos, 138085344, 0);
 				dropItem(kItemBriefcase, 2);
-				_gameProgress[kProgressFieldC0] = _gameTime;
-				_gameProgress[kProgressField78] = 1;
+				_globals[kProgressFieldC0] = _gameTime;
+				_globals[kProgressField78] = 1;
 				getCharacterParams(kCharacterKahina, 8)[2] = 0;
 
-				if (_gameInventory[kItemFirebird].location != 18) {
+				if (_items[kItemFirebird].floating != 18) {
 					getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 10;
 					KahinaCall(&LogicManager::CONS_Kahina_DoCorrOtis, "616Ba", 1, 0, 0);
 				}
@@ -1930,17 +1930,17 @@ void LogicManager::HAND_Kahina_SearchCath(HAND_PARAMS) {
 				break;
 			}
 
-			if (_gameInventory[kItemFirebird].location == 7) {
-				_gameProgress[kProgressField80] = 1;
+			if (_items[kItemFirebird].floating == 7) {
+				_globals[kProgressField80] = 1;
 				takeItem(kItemFirebird);
-				_gameInventory[kItemFirebird].location = 5;
+				_items[kItemFirebird].floating = 5;
 				send(kCharacterKahina, kCharacterKronos, 138085344, 0);
 				dropItem(kItemBriefcase, 2);
-				_gameProgress[kProgressFieldC0] = _gameTime;
-				_gameProgress[kProgressField78] = 1;
+				_globals[kProgressFieldC0] = _gameTime;
+				_globals[kProgressField78] = 1;
 				getCharacterParams(kCharacterKahina, 8)[2] = 0;
 	
-				if (_gameInventory[kItemFirebird].location != 18) {
+				if (_items[kItemFirebird].floating != 18) {
 					getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 10;
 					KahinaCall(&LogicManager::CONS_Kahina_DoCorrOtis, "616Ba", 1, 0, 0);
 				}
@@ -1950,11 +1950,11 @@ void LogicManager::HAND_Kahina_SearchCath(HAND_PARAMS) {
 
 			if (getCharacterParams(kCharacterKahina, 8)[2]) {
 				dropItem(kItemBriefcase, 2);
-				_gameProgress[kProgressField78] = 1;
+				_globals[kProgressField78] = 1;
 				getCharacterParams(kCharacterKahina, 8)[2] = 0;
 			}
 
-			if (_gameInventory[kItemFirebird].location != 18) {
+			if (_items[kItemFirebird].floating != 18) {
 				getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] = 10;
 				KahinaCall(&LogicManager::CONS_Kahina_DoCorrOtis, "616Ba", 1, 0, 0);
 			}
@@ -1992,12 +1992,12 @@ void LogicManager::CONS_Kahina_SearchTatiana(CONS_PARAMS) {
 void LogicManager::HAND_Kahina_SearchTatiana(HAND_PARAMS) {
 	switch (msg->action) {
 	case 12:
-		if (_gameEvents[kEventAnnaBaggageArgument]) {
+		if (_doneNIS[kEventAnnaBaggageArgument]) {
 			takeItem(kItemFirebird);
-			_gameInventory[kItemFirebird].location = 5;
+			_items[kItemFirebird].floating = 5;
 			send(kCharacterKahina, kCharacterKronos, 138085344, 0);
 			dropItem(kItemBriefcase, 2);
-			_gameProgress[kProgressField78] = 1;
+			_globals[kProgressField78] = 1;
 
 			getCharacter(kCharacterKahina).currentCall--;
 			_engine->getMessageManager()->setMessageHandle(kCharacterKahina, _functionsKahina[getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall]]);
@@ -2059,9 +2059,9 @@ void LogicManager::HAND_Kahina_SearchTatiana(HAND_PARAMS) {
 			setDoor(32, kCharacterCath, checkDoor(32), 10, 9);
 			setDoor(48, kCharacterCath, checkDoor(48), 10, 9);
 
-			if (_gameInventory[kItemFirebird].location == 1 || _gameInventory[kItemFirebird].location == 2) {
+			if (_items[kItemFirebird].floating == 1 || _items[kItemFirebird].floating == 2) {
 				takeItem(kItemFirebird);
-				_gameInventory[kItemFirebird].location = 5;
+				_items[kItemFirebird].floating = 5;
 				send(kCharacterKahina, kCharacterKronos, 138085344, 0);
 				getCharacterParams(kCharacterKahina, 8)[2] = 1;
 			}
@@ -2122,7 +2122,7 @@ void LogicManager::HAND_Kahina_KillCathAnywhere(HAND_PARAMS) {
 
 		break;
 	case 12:
-		_gameTimeTicksDelta = 0;
+		_timeSpeed = 0;
 		break;
 	case 18:
 		if (getCharacter(kCharacterKahina).callbacks[getCharacter(kCharacterKahina).currentCall + 8] == 1) {
diff --git a/engines/lastexpress/characters/kronos.cpp b/engines/lastexpress/characters/kronos.cpp
index befefe724ca..db229992b47 100644
--- a/engines/lastexpress/characters/kronos.cpp
+++ b/engines/lastexpress/characters/kronos.cpp
@@ -224,9 +224,9 @@ void LogicManager::CONS_Kronos_DoWaitReal(CONS_PARAMS) {
 void LogicManager::HAND_Kronos_DoWaitReal(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
-		if (getCharacterCurrentParams(kCharacterKronos)[1] || (getCharacterCurrentParams(kCharacterKronos)[1] = _currentGameSessionTicks + getCharacterCurrentParams(kCharacterKronos)[0],
-															   _currentGameSessionTicks + getCharacterCurrentParams(kCharacterKronos)[0] != 0)) {
-			if (getCharacterCurrentParams(kCharacterKronos)[1] >= _currentGameSessionTicks)
+		if (getCharacterCurrentParams(kCharacterKronos)[1] || (getCharacterCurrentParams(kCharacterKronos)[1] = _realTime + getCharacterCurrentParams(kCharacterKronos)[0],
+															   _realTime + getCharacterCurrentParams(kCharacterKronos)[0] != 0)) {
+			if (getCharacterCurrentParams(kCharacterKronos)[1] >= _realTime)
 				break;
 
 			getCharacterCurrentParams(kCharacterKronos)[1] = 0x7FFFFFFF;
@@ -291,9 +291,9 @@ void LogicManager::HAND_Kronos_AwaitingCath(HAND_PARAMS) {
 		}
 
 		if (getCharacterCurrentParams(kCharacterKronos)[0] && checkLoc(kCharacterCath, kCarKronos)) {
-			if (getCharacterCurrentParams(kCharacterKronos)[2] || (getCharacterCurrentParams(kCharacterKronos)[2] = _currentGameSessionTicks + 150,
-																   _currentGameSessionTicks != -150)) {
-				if (getCharacterCurrentParams(kCharacterKronos)[2] >= _currentGameSessionTicks)
+			if (getCharacterCurrentParams(kCharacterKronos)[2] || (getCharacterCurrentParams(kCharacterKronos)[2] = _realTime + 150,
+																   _realTime != -150)) {
+				if (getCharacterCurrentParams(kCharacterKronos)[2] >= _realTime)
 					break;
 
 				getCharacterCurrentParams(kCharacterKronos)[2] = 0x7FFFFFFF;
@@ -507,14 +507,14 @@ void LogicManager::HAND_Kronos_WBWait(HAND_PARAMS) {
 	case 0:
 		if (getCharacterCurrentParams(kCharacterKronos)[0] && !inSalon(kCharacterMonsieur)) {
 			if (!getCharacterCurrentParams(kCharacterKronos)[1]) {
-				getCharacterCurrentParams(kCharacterKronos)[1] = _currentGameSessionTicks + 75;
-				if (_currentGameSessionTicks == -75) {
+				getCharacterCurrentParams(kCharacterKronos)[1] = _realTime + 75;
+				if (_realTime == -75) {
 					CONS_Kronos_VisitSalon(0, 0, 0, 0);
 					break;
 				}
 			}
 
-			if (getCharacterCurrentParams(kCharacterKronos)[1] < _currentGameSessionTicks) {
+			if (getCharacterCurrentParams(kCharacterKronos)[1] < _realTime) {
 				getCharacterCurrentParams(kCharacterKronos)[1] = 0x7FFFFFFF;
 				CONS_Kronos_VisitSalon(0, 0, 0, 0);
 				break;
@@ -715,7 +715,7 @@ void LogicManager::HAND_Kronos_StartConcert(HAND_PARAMS) {
 		setDoor(75, kCharacterCath, 1, 0, 0);
 		break;
 	case 17:
-		if (checkLoc(kCharacterCath, kCarKronos) && !inInnerSanctum(kCharacterCath) && !cathHasItem(kItemFirebird) && !_gameEvents[kEventConcertStart]) {
+		if (checkLoc(kCharacterCath, kCarKronos) && !inInnerSanctum(kCharacterCath) && !cathHasItem(kItemFirebird) && !_doneNIS[kEventConcertStart]) {
 			startCycOtis(kCharacterKronos, "201a");
 			getCharacter(kCharacterKronos).callbacks[getCharacter(kCharacterKronos).currentCall + 8] = 2;
 			KronosCall(&LogicManager::CONS_Kronos_SaveGame, 2, kEventConcertStart, 0, 0);
@@ -824,9 +824,9 @@ void LogicManager::HAND_Kronos_Concert(HAND_PARAMS) {
 		if (!getCharacterCurrentParams(kCharacterKronos)[0])
 			getCharacterCurrentParams(kCharacterKronos)[1] = getCharacterCurrentParams(kCharacterKronos)[2];
 
-		getCharacterCurrentParams(kCharacterKronos)[1] -= _gameTimeTicksDelta;
+		getCharacterCurrentParams(kCharacterKronos)[1] -= _timeSpeed;
 
-		if (_gameTimeTicksDelta > getCharacterCurrentParams(kCharacterKronos)[1]) {
+		if (_timeSpeed > getCharacterCurrentParams(kCharacterKronos)[1]) {
 			send(kCharacterKronos, kCharacterKahina, 92186062, 0);
 
 			getCharacterCurrentParams(kCharacterKronos)[3]++;
@@ -889,7 +889,7 @@ void LogicManager::HAND_Kronos_Concert(HAND_PARAMS) {
 		break;
 	case 12:
 		_gameTime = 2115000;
-		_gameTimeTicksDelta = 3;
+		_timeSpeed = 3;
 
 		if (checkCathDir(kCarKronos, 88) || checkCathDir(kCarKronos, 84) || checkCathDir(kCarKronos, 85) || checkCathDir(kCarKronos, 86) || checkCathDir(kCarKronos, 83)) {
 			getCharacterCurrentParams(kCharacterKronos)[0] = 1;
@@ -901,7 +901,7 @@ void LogicManager::HAND_Kronos_Concert(HAND_PARAMS) {
 			setDoor(75, kCharacterCath, 0, 10, 9);
 
 		setDoor(76, kCharacterKronos, 0, 10, 9);
-		_gameProgress[kProgressField40] = 1;
+		_globals[kProgressField40] = 1;
 		startCycOtis(kCharacterKronos, "201a");
 		getCharacterCurrentParams(kCharacterKronos)[2] = 2700;
 		getCharacterCurrentParams(kCharacterKronos)[1] = 2700;
@@ -969,11 +969,11 @@ void LogicManager::HAND_Kronos_AfterConcert(HAND_PARAMS) {
 
 		break;
 	case 12:
-		_gameProgress[kProgressField40] = 0;
+		_globals[kProgressField40] = 0;
 		setDoor(75, kCharacterCath, 3, 0, 0);
 		send(kCharacterKronos, kCharacterRebecca, 191668032, 0);
 
-		if (_gameEvents[kEventConcertLeaveWithBriefcase])
+		if (_doneNIS[kEventConcertLeaveWithBriefcase])
 			break;
 
 		CONS_Kronos_AwaitingCath3(0, 0, 0, 0);
@@ -1013,7 +1013,7 @@ void LogicManager::HAND_Kronos_AwaitingCath3(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
 		if (inInnerSanctum(kCharacterCath)) {
-			if (_gameProgress[kProgressField44]) {
+			if (_globals[kProgressField44]) {
 				getCharacter(kCharacterKronos).callbacks[getCharacter(kCharacterKronos).currentCall + 8] = 5;
 				KronosCall(&LogicManager::CONS_Kronos_SaveGame, 2, kEventKahinaPunchBaggageCarEntrance, 0, 0);
 			} else {
@@ -1032,18 +1032,18 @@ void LogicManager::HAND_Kronos_AwaitingCath3(HAND_PARAMS) {
 			playDialog(0, "LIB013", -1, 0);
 		}
 
-		if (_gameEvents[kEventConcertLeaveWithBriefcase])
+		if (_doneNIS[kEventConcertLeaveWithBriefcase])
 			fedEx(kCharacterKronos, kCharacterKahina, 137503360, 0);
 		if (cathHasItem(kItemBriefcase)) {
 			getCharacter(kCharacterKronos).callbacks[getCharacter(kCharacterKronos).currentCall + 8] = 1;
 			KronosCall(&LogicManager::CONS_Kronos_SaveGame, 2, kEventKronosReturnBriefcase, 0, 0);
-		} else if (cathHasItem(kItemFirebird) && _gameEvents[kEventConcertLeaveWithBriefcase]) {
+		} else if (cathHasItem(kItemFirebird) && _doneNIS[kEventConcertLeaveWithBriefcase]) {
 			getCharacter(kCharacterKronos).callbacks[getCharacter(kCharacterKronos).currentCall + 8] = 2;
 			KronosCall(&LogicManager::CONS_Kronos_SaveGame, 2, kEventKronosBringEggCeiling, 0, 0);
 		} else if (cathHasItem(kItemFirebird)) {
 			getCharacter(kCharacterKronos).callbacks[getCharacter(kCharacterKronos).currentCall + 8] = 3;
 			KronosCall(&LogicManager::CONS_Kronos_SaveGame, 2, kEventKronosBringEggCeiling, 0, 0);
-		} else if (_gameEvents[kEventConcertLeaveWithBriefcase]) {
+		} else if (_doneNIS[kEventConcertLeaveWithBriefcase]) {
 			getCharacter(kCharacterKronos).callbacks[getCharacter(kCharacterKronos).currentCall + 8] = 4;
 			KronosCall(&LogicManager::CONS_Kronos_SaveGame, 2, kEventKronosBringNothing, 0, 0);
 		}
@@ -1065,12 +1065,12 @@ void LogicManager::HAND_Kronos_AwaitingCath3(HAND_PARAMS) {
 			playNIS(kEventKronosBringEggCeiling);
 			bumpCath(kCarKronos, 87, 255);
 			takeCathItem(kItemFirebird);
-			_gameInventory[kItemFirebird].location = 5;
+			_items[kItemFirebird].floating = 5;
 			CONS_Kronos_Finished(0, 0, 0, 0);
 			break;
 		case 3:
 			takeCathItem(kItemFirebird);
-			_gameInventory[kItemFirebird].location = 5;
+			_items[kItemFirebird].floating = 5;
 			playNIS(kEventKronosBringEgg);
 			bumpCath(kCarKronos, 87, 255);
 			giveCathItem(kItemBriefcase);
diff --git a/engines/lastexpress/characters/madame.cpp b/engines/lastexpress/characters/madame.cpp
index 706d5ef6a3c..b9cf33a4342 100644
--- a/engines/lastexpress/characters/madame.cpp
+++ b/engines/lastexpress/characters/madame.cpp
@@ -334,10 +334,10 @@ void LogicManager::HAND_Madame_ComplainCond2(HAND_PARAMS) {
 		startCycOtis(kCharacterMadame, "606L");
 		playDialog(kCharacterMadame, (char *)&getCharacterCurrentParams(kCharacterMadame)[0], -1, 0);
 		if (whoOnScreen(kCharacterMadame) || nearChar(kCharacterMadame, kCharacterCath, 2000)) {
-			if (_gameProgress[kProgressChapter] == 1) {
-				_gameProgress[kProgressFieldA8] = 1;
-			} else if (_gameProgress[kProgressChapter] == 3) {
-				_gameProgress[kProgressFieldA4] = 1;
+			if (_globals[kProgressChapter] == 1) {
+				_globals[kProgressFieldA8] = 1;
+			} else if (_globals[kProgressChapter] == 3) {
+				_globals[kProgressFieldA4] = 1;
 			}
 		}
 
@@ -595,7 +595,7 @@ void LogicManager::HAND_Madame_OpenComp1(HAND_PARAMS) {
 		playDialog(kCharacterMadame, "MME1035A", -1, 0);
 
 		if (whoOnScreen(kCharacterMadame) || nearChar(kCharacterMadame, kCharacterCath, 2000))
-			_gameProgress[kProgressFieldAC] = 1;
+			_globals[kProgressFieldAC] = 1;
 
 		getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 2;
 		MadameCall(&LogicManager::CONS_Madame_DoCorrOtis, "606Ed", 35, 0, 0);
@@ -624,7 +624,7 @@ void LogicManager::HAND_Madame_ClosedComp1(HAND_PARAMS) {
 				setDoor(51, kCharacterCath, 1, 0, 0);
 
 				if (nearChar(kCharacterMadame, kCharacterCath, 2000))
-					_gameProgress[kProgressFieldA0] = 1;
+					_globals[kProgressFieldA0] = 1;
 
 				getCharacterCurrentParams(kCharacterMadame)[4] = 1;
 				getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 1;
@@ -639,7 +639,7 @@ void LogicManager::HAND_Madame_ClosedComp1(HAND_PARAMS) {
 					setDoor(51, kCharacterCath, 1, 0, 0);
 
 					if (nearChar(kCharacterMadame, kCharacterCath, 2000))
-						_gameProgress[kProgressFieldA0] = 1;
+						_globals[kProgressFieldA0] = 1;
 
 					getCharacterCurrentParams(kCharacterMadame)[4] = 1;
 					getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 1;
@@ -654,7 +654,7 @@ void LogicManager::HAND_Madame_ClosedComp1(HAND_PARAMS) {
 				setDoor(51, kCharacterCath, 1, 0, 0);
 
 				if (nearChar(kCharacterMadame, kCharacterCath, 2000))
-					_gameProgress[kProgressFieldA0] = 1;
+					_globals[kProgressFieldA0] = 1;
 
 				getCharacterCurrentParams(kCharacterMadame)[4] = 1;
 				getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 1;
@@ -663,7 +663,7 @@ void LogicManager::HAND_Madame_ClosedComp1(HAND_PARAMS) {
 			}
 		}
 
-		if (_gameProgress[kProgressField24] && getCharacterCurrentParams(kCharacterMadame)[6] != 0x7FFFFFFF && _gameTime) {
+		if (_globals[kProgressField24] && getCharacterCurrentParams(kCharacterMadame)[6] != 0x7FFFFFFF && _gameTime) {
 			if (_gameTime > 1093500) {
 				getCharacterCurrentParams(kCharacterMadame)[6] = 0x7FFFFFFF;
 				getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 2;
@@ -695,9 +695,9 @@ void LogicManager::HAND_Madame_ClosedComp1(HAND_PARAMS) {
 		}
 
 		if (getCharacterCurrentParams(kCharacterMadame)[3]) {
-			if (getCharacterCurrentParams(kCharacterMadame)[8] || (getCharacterCurrentParams(kCharacterMadame)[8] = _currentGameSessionTicks + 75,
-																   _currentGameSessionTicks != -75)) {
-				if (getCharacterCurrentParams(kCharacterMadame)[8] >= _currentGameSessionTicks)
+			if (getCharacterCurrentParams(kCharacterMadame)[8] || (getCharacterCurrentParams(kCharacterMadame)[8] = _realTime + 75,
+																   _realTime != -75)) {
+				if (getCharacterCurrentParams(kCharacterMadame)[8] >= _realTime)
 					break;
 
 				getCharacterCurrentParams(kCharacterMadame)[8] = 0x7FFFFFFF;
@@ -768,7 +768,7 @@ void LogicManager::HAND_Madame_ClosedComp1(HAND_PARAMS) {
 			setDoor(35, kCharacterMadame, 1, 10, 9);
 			setDoor(51, kCharacterMadame, 1, 10, 9);
 
-			if (_gameProgress[kProgressField24] && getCharacterCurrentParams(kCharacterMadame)[6] != 0x7FFFFFFF && _gameTime) {
+			if (_globals[kProgressField24] && getCharacterCurrentParams(kCharacterMadame)[6] != 0x7FFFFFFF && _gameTime) {
 				if (_gameTime > 1093500) {
 					getCharacterCurrentParams(kCharacterMadame)[6] = 0x7FFFFFFF;
 					getCharacter(kCharacterMadame).callbacks[getCharacter(kCharacterMadame).currentCall + 8] = 2;
@@ -800,9 +800,9 @@ void LogicManager::HAND_Madame_ClosedComp1(HAND_PARAMS) {
 			}
 
 			if (getCharacterCurrentParams(kCharacterMadame)[3]) {
-				if (getCharacterCurrentParams(kCharacterMadame)[8] || (getCharacterCurrentParams(kCharacterMadame)[8] = _currentGameSessionTicks + 75,
-																	   _currentGameSessionTicks != -75)) {
-					if (getCharacterCurrentParams(kCharacterMadame)[8] >= _currentGameSessionTicks)
+				if (getCharacterCurrentParams(kCharacterMadame)[8] || (getCharacterCurrentParams(kCharacterMadame)[8] = _realTime + 75,
+																	   _realTime != -75)) {
+					if (getCharacterCurrentParams(kCharacterMadame)[8] >= _realTime)
 						break;
 
 					getCharacterCurrentParams(kCharacterMadame)[8] = 0x7FFFFFFF;
@@ -927,9 +927,9 @@ void LogicManager::HAND_Madame_InComp(HAND_PARAMS) {
 		}
 
 		if (getCharacterCurrentParams(kCharacterMadame)[1]) {
-			if (getCharacterCurrentParams(kCharacterMadame)[4] || (getCharacterCurrentParams(kCharacterMadame)[4] = _currentGameSessionTicks + 75,
-																   _currentGameSessionTicks != -75)) {
-				if (getCharacterCurrentParams(kCharacterMadame)[4] >= _currentGameSessionTicks)
+			if (getCharacterCurrentParams(kCharacterMadame)[4] || (getCharacterCurrentParams(kCharacterMadame)[4] = _realTime + 75,
+																   _realTime != -75)) {
+				if (getCharacterCurrentParams(kCharacterMadame)[4] >= _realTime)
 					break;
 
 				getCharacterCurrentParams(kCharacterMadame)[4] = 0x7FFFFFFF;
@@ -1019,9 +1019,9 @@ void LogicManager::HAND_Madame_InComp(HAND_PARAMS) {
 			setDoor(51, kCharacterMadame, 1, 10, 9);
 
 			if (getCharacterCurrentParams(kCharacterMadame)[1]) {
-				if (getCharacterCurrentParams(kCharacterMadame)[4] || (getCharacterCurrentParams(kCharacterMadame)[4] = _currentGameSessionTicks + 75,
-																	   _currentGameSessionTicks != -75)) {
-					if (getCharacterCurrentParams(kCharacterMadame)[4] >= _currentGameSessionTicks)
+				if (getCharacterCurrentParams(kCharacterMadame)[4] || (getCharacterCurrentParams(kCharacterMadame)[4] = _realTime + 75,
+																	   _realTime != -75)) {
+					if (getCharacterCurrentParams(kCharacterMadame)[4] >= _realTime)
 						break;
 
 					getCharacterCurrentParams(kCharacterMadame)[4] = 0x7FFFFFFF;
@@ -1468,9 +1468,9 @@ void LogicManager::HAND_Madame_ClosedComp4(HAND_PARAMS) {
 		}
 
 		if (getCharacterCurrentParams(kCharacterMadame)[1]) {
-			if (getCharacterCurrentParams(kCharacterMadame)[4] || (getCharacterCurrentParams(kCharacterMadame)[4] = _currentGameSessionTicks + 75,
-																   _currentGameSessionTicks != -75)) {
-				if (getCharacterCurrentParams(kCharacterMadame)[4] >= _currentGameSessionTicks)
+			if (getCharacterCurrentParams(kCharacterMadame)[4] || (getCharacterCurrentParams(kCharacterMadame)[4] = _realTime + 75,
+																   _realTime != -75)) {
+				if (getCharacterCurrentParams(kCharacterMadame)[4] >= _realTime)
 					break;
 
 				getCharacterCurrentParams(kCharacterMadame)[4] = 0x7FFFFFFF;
@@ -1665,9 +1665,9 @@ void LogicManager::HAND_Madame_Hiding(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
 		if (getCharacterCurrentParams(kCharacterMadame)[0]) {
-			if (getCharacterCurrentParams(kCharacterMadame)[2] || (getCharacterCurrentParams(kCharacterMadame)[2] = _currentGameSessionTicks + 75,
-																   _currentGameSessionTicks != -75)) {
-				if (getCharacterCurrentParams(kCharacterMadame)[2] >= _currentGameSessionTicks)
+			if (getCharacterCurrentParams(kCharacterMadame)[2] || (getCharacterCurrentParams(kCharacterMadame)[2] = _realTime + 75,
+																   _realTime != -75)) {
+				if (getCharacterCurrentParams(kCharacterMadame)[2] >= _realTime)
 					break;
 
 				getCharacterCurrentParams(kCharacterMadame)[2] = 0x7FFFFFFF;
diff --git a/engines/lastexpress/characters/mahmud.cpp b/engines/lastexpress/characters/mahmud.cpp
index 501a6768b90..853db86124f 100644
--- a/engines/lastexpress/characters/mahmud.cpp
+++ b/engines/lastexpress/characters/mahmud.cpp
@@ -169,8 +169,8 @@ void LogicManager::HAND_Mahmud_DoBumpCorrOtis(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
 		if (getCharacterCurrentParams(kCharacterMahmud)[6] ||
-			(getCharacterCurrentParams(kCharacterMahmud)[6] = _currentGameSessionTicks + getCharacterCurrentParams(kCharacterMahmud)[4], _currentGameSessionTicks + getCharacterCurrentParams(kCharacterMahmud)[4] != 0)) {
-			if (getCharacterCurrentParams(kCharacterMahmud)[6] >= _currentGameSessionTicks)
+			(getCharacterCurrentParams(kCharacterMahmud)[6] = _realTime + getCharacterCurrentParams(kCharacterMahmud)[4], _realTime + getCharacterCurrentParams(kCharacterMahmud)[4] != 0)) {
+			if (getCharacterCurrentParams(kCharacterMahmud)[6] >= _realTime)
 				break;
 
 			getCharacterCurrentParams(kCharacterMahmud)[6] = 0x7FFFFFFF;
@@ -456,7 +456,7 @@ void LogicManager::HAND_Mahmud_CathKnockingHarem(HAND_PARAMS) {
 				getCharacterCurrentParams(kCharacterMahmud)[2] = 0;
 			} else {
 				playDialog(kCharacterClerk, "LIB050", 16, 0);
-				if (_gameProgress[kProgressChapter] == 1)
+				if (_globals[kProgressChapter] == 1)
 					endGame(0, 0, 57, true);
 				else
 					endGame(0, 0, 63, true);
@@ -489,7 +489,7 @@ void LogicManager::HAND_Mahmud_CathKnockingHarem(HAND_PARAMS) {
 			playDialog(kCharacterMahmud, "MAH1170A", -1, 45);
 		}
 		
-		_gameProgress[kProgressFieldC4] = 1;
+		_globals[kProgressFieldC4] = 1;
 		getCharacter(kCharacterMahmud).callbacks[getCharacter(kCharacterMahmud).currentCall + 8] = 1;
 		MahmudCall(&LogicManager::CONS_Mahmud_DoBumpCorrOtis, "614Dd", 4, 30, *getCharacterCurrentParams(kCharacterMahmud));
 		break;
@@ -800,7 +800,7 @@ void LogicManager::HAND_Mahmud_Vigilant(HAND_PARAMS) {
 			getCharacterParams(kCharacterMahmud, 8)[0] = 0;
 		}
 
-		if (!getCharacterCurrentParams(kCharacterMahmud)[1] && _gameProgress[kProgressChapter] == 1) {
+		if (!getCharacterCurrentParams(kCharacterMahmud)[1] && _globals[kProgressChapter] == 1) {
 			if (_gameTime > 1098000 && !getCharacterCurrentParams(kCharacterMahmud)[5]) {
 				getCharacterCurrentParams(kCharacterMahmud)[5] = 1;
 				getCharacter(kCharacterMahmud).callbacks[getCharacter(kCharacterMahmud).currentCall + 8] = 1;
@@ -817,8 +817,8 @@ void LogicManager::HAND_Mahmud_Vigilant(HAND_PARAMS) {
 		}
 
 		if (getCharacterCurrentParams(kCharacterMahmud)[4]) {
-			if (getCharacterCurrentParams(kCharacterMahmud)[7] || (getCharacterCurrentParams(kCharacterMahmud)[7] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
-				if (getCharacterCurrentParams(kCharacterMahmud)[7] >= _currentGameSessionTicks)
+			if (getCharacterCurrentParams(kCharacterMahmud)[7] || (getCharacterCurrentParams(kCharacterMahmud)[7] = _realTime + 75, _realTime != -75)) {
+				if (getCharacterCurrentParams(kCharacterMahmud)[7] >= _realTime)
 					break;
 
 				getCharacterCurrentParams(kCharacterMahmud)[7] = 0x7FFFFFFF;
@@ -837,7 +837,7 @@ void LogicManager::HAND_Mahmud_Vigilant(HAND_PARAMS) {
 	case 9:
 		if (getCharacterCurrentParams(kCharacterMahmud)[4]) {
 			setDoor(4, kCharacterMahmud, 3, 0, 0);
-			if (_gameProgress[kProgressJacket] == 1 || _gameEvents[kEventMahmudWrongDoor] || _gameEvents[kEventMahmudWrongDoorOriginalJacket] || _gameEvents[kEventMahmudWrongDoorDay]) {
+			if (_globals[kProgressJacket] == 1 || _doneNIS[kEventMahmudWrongDoor] || _doneNIS[kEventMahmudWrongDoorOriginalJacket] || _doneNIS[kEventMahmudWrongDoorDay]) {
 				if (cathHasItem(kItemPassengerList)) {
 					getCharacter(kCharacterMahmud).callbacks[getCharacter(kCharacterMahmud).currentCall + 8] = 6;
 
@@ -913,8 +913,8 @@ void LogicManager::HAND_Mahmud_Vigilant(HAND_PARAMS) {
 			}
 
 			if (getCharacterCurrentParams(kCharacterMahmud)[4]) {
-				if (getCharacterCurrentParams(kCharacterMahmud)[7] || (getCharacterCurrentParams(kCharacterMahmud)[7] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
-					if (getCharacterCurrentParams(kCharacterMahmud)[7] >= _currentGameSessionTicks)
+				if (getCharacterCurrentParams(kCharacterMahmud)[7] || (getCharacterCurrentParams(kCharacterMahmud)[7] = _realTime + 75, _realTime != -75)) {
+					if (getCharacterCurrentParams(kCharacterMahmud)[7] >= _realTime)
 						break;
 
 					getCharacterCurrentParams(kCharacterMahmud)[7] = 0x7FFFFFFF;
@@ -935,10 +935,10 @@ void LogicManager::HAND_Mahmud_Vigilant(HAND_PARAMS) {
 			MahmudCall(&LogicManager::CONS_Mahmud_DoDialog, "MAH1175", 0, 0, 0);
 			break;
 		case 5:
-			if (_gameProgress[kProgressJacket] == 1 ||
-				_gameEvents[kEventMahmudWrongDoor] ||
-				_gameEvents[kEventMahmudWrongDoorOriginalJacket] ||
-				_gameEvents[kEventMahmudWrongDoorDay]) {
+			if (_globals[kProgressJacket] == 1 ||
+				_doneNIS[kEventMahmudWrongDoor] ||
+				_doneNIS[kEventMahmudWrongDoorOriginalJacket] ||
+				_doneNIS[kEventMahmudWrongDoorDay]) {
 				setDoor(4, kCharacterMahmud, 1, 14, 0);
 			} else {
 				setDoor(4, kCharacterMahmud, 1, 10, 9);
@@ -956,7 +956,7 @@ void LogicManager::HAND_Mahmud_Vigilant(HAND_PARAMS) {
 			MahmudCall(&LogicManager::CONS_Mahmud_SaveGame, 2, kEventMahmudWrongDoor, 0, 0);
 			break;
 		case 10:
-			if (_gameProgress[kProgressJacket] == 2) {
+			if (_globals[kProgressJacket] == 2) {
 				if (isNight()) {
 					playNIS(kEventMahmudWrongDoor);
 				} else {
diff --git a/engines/lastexpress/characters/master.cpp b/engines/lastexpress/characters/master.cpp
index a8138eb4680..d16de500b78 100644
--- a/engines/lastexpress/characters/master.cpp
+++ b/engines/lastexpress/characters/master.cpp
@@ -155,7 +155,7 @@ void LogicManager::HAND_Master_Arrive(HAND_PARAMS) {
 		playDialog(kCharacterMaster, "ARRIVE", 8, 0);
 		_engine->getSoundManager()->endAmbient();
 
-		_gameProgress[kProgressIsTrainRunning] = 0;
+		_globals[kProgressIsTrainRunning] = 0;
 
 		getCharacterParams(kCharacterMaster, 8)[1] = 1;
 		getCharacterParams(kCharacterMaster, 8)[3] = getCharacterCurrentParams(kCharacterMaster)[3];
@@ -226,7 +226,7 @@ void LogicManager::HAND_Master_Depart(HAND_PARAMS) {
 		setDoor(26, kCharacterCath, 1, 0, 9);
 		setDoor(27, kCharacterCath, 1, 0, 9);
 
-		_gameProgress[kProgressIsTrainRunning] = 1;
+		_globals[kProgressIsTrainRunning] = 1;
 
 		getCharacterParams(kCharacterMaster, 8)[2] = 1;
 
@@ -400,24 +400,24 @@ void LogicManager::HAND_Master_FirstDream(HAND_PARAMS) {
 
 		playDialog(kCharacterCath, "MUS008", 16, 0);
 
-		_inventorySelectedItemIdx = 0;
+		_activeItem = 0;
 		fadeToBlack();
 
 		while (dialogRunning("MUS008"))
 			_engine->getSoundManager()->soundThread();
 
-		_gameProgress[kProgressField84] = 1;
+		_globals[kProgressField84] = 1;
 		bumpCath(kCarLocomotive, 75, 255);
 		restoreIcons();
 
 		_gameTime = 1492200;
-		_gameProgress[kProgressField18] = 4;
-		_gameTimeTicksDelta = 0;
+		_globals[kProgressField18] = 4;
+		_timeSpeed = 0;
 
 		setDoor(63, kCharacterMaster, 0, 0, 9);
 		send(kCharacterMaster, kCharacterClerk, 191350523, 0);
 
-		_gameProgress[kProgressIsTrainRunning] = 0;
+		_globals[kProgressIsTrainRunning] = 0;
 		getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 1;
 
 		MasterCall(&LogicManager::CONS_Master_SaveGame, 1, 0, 0, 0);
@@ -435,12 +435,12 @@ void LogicManager::HAND_Master_FirstDream(HAND_PARAMS) {
 
 			playNIS(kEventCathDream);
 
-			_gameTimeTicksDelta = 3;
-			_gameProgress[kProgressField18] = 1;
+			_timeSpeed = 3;
+			_globals[kProgressField18] = 1;
 
 			setDoor(63, kCharacterCath, 0, 10, 9);
 
-			_gameProgress[kProgressField84] = 0;
+			_globals[kProgressField84] = 0;
 
 			bumpCathTylerComp();
 
@@ -497,15 +497,15 @@ void LogicManager::CONS_Master_StartPart1(CONS_PARAMS) {
 void LogicManager::HAND_Master_StartPart1(HAND_PARAMS) {
 	switch (msg->action) {
 	case 12:
-		_gameProgress[kProgressChapter] = 1;
+		_globals[kProgressChapter] = 1;
 
 		_engine->getSoundManager()->startAmbient();
 
 		_gameTime = 1061100;
-		_gameTimeTicksDelta = 0;
-		_gameProgress[kProgressIsTrainRunning] = 1;
-		_gameProgress[kProgressPortrait] = 32;
-		_gameProgress[kProgressField18] = 1;
+		_timeSpeed = 0;
+		_globals[kProgressIsTrainRunning] = 1;
+		_globals[kProgressPortrait] = 32;
+		_globals[kProgressField18] = 1;
 
 		giveCathItem(kItemTelegram);
 		giveCathItem(kItemArticle);
@@ -522,7 +522,7 @@ void LogicManager::HAND_Master_StartPart1(HAND_PARAMS) {
 		dropItem(kItem22, 1);
 		dropItem(kItemPaper, 1);
 
-		_gameProgress[kProgressField7C] = 1;
+		_globals[kProgressField7C] = 1;
 
 		setDoor(1, kCharacterCath, 0, 10, 9);
 		setDoor(9, kCharacterCath, 0, 255, 255);
@@ -583,16 +583,16 @@ void LogicManager::CONS_Master_MovingNight(CONS_PARAMS) {
 void LogicManager::HAND_Master_MovingNight(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
-		if (_gameProgress[kProgressIsTrainRunning] && _gameTime < 1458000) {
+		if (_globals[kProgressIsTrainRunning] && _gameTime < 1458000) {
 			bool skip = false;
 
 			if (!getCharacterCurrentParams(kCharacterMaster)[5]) {
-				getCharacterCurrentParams(kCharacterMaster)[5] = _currentGameSessionTicks + getCharacterCurrentParams(kCharacterMaster)[1];
+				getCharacterCurrentParams(kCharacterMaster)[5] = _realTime + getCharacterCurrentParams(kCharacterMaster)[1];
 				if (getCharacterCurrentParams(kCharacterMaster)[5] == 0) {
 					skip = true;
 				}
 			}
-			if (skip || getCharacterCurrentParams(kCharacterMaster)[5] < _currentGameSessionTicks) {
+			if (skip || getCharacterCurrentParams(kCharacterMaster)[5] < _realTime) {
 				if (!skip) {
 					getCharacterCurrentParams(kCharacterMaster)[5] = 0x7FFFFFFF;
 				}
@@ -652,7 +652,7 @@ void LogicManager::HAND_Master_MovingNight(HAND_PARAMS) {
 
 		if (_gameTime > 1170000 && !getCharacterCurrentParams(kCharacterMaster)[9]) {
 			getCharacterCurrentParams(kCharacterMaster)[9] = 1;
-			_gameProgress[kProgressField18] = 2;
+			_globals[kProgressField18] = 2;
 		}
 
 		if (!getCharacterCurrentParams(kCharacterMaster)[0]) {
@@ -686,7 +686,7 @@ void LogicManager::HAND_Master_MovingNight(HAND_PARAMS) {
 
 			if (_gameTime > 1260000 && !getCharacterCurrentParams(kCharacterMaster)[14]) {
 				getCharacterCurrentParams(kCharacterMaster)[14] = 1;
-				_gameTimeTicksDelta = 1;
+				_timeSpeed = 1;
 			}
 			if (_gameTime > 1303200 && !getCharacterCurrentParams(kCharacterMaster)[15]) {
 				getCharacterCurrentParams(kCharacterMaster)[15] = 1;
@@ -829,7 +829,7 @@ void LogicManager::HAND_Master_MovingNight(HAND_PARAMS) {
 			_engine->getSoundManager()->startAmbient();
 			getCharacterParams(kCharacterMaster, 8)[2] = 0;
 			if (getCharacterCurrentParams(kCharacterMaster)[3]) {
-				if (_gameProgress[kProgressField24])
+				if (_globals[kProgressField24])
 					send(kCharacterMaster, kCharacterTrainM, 168187490, 0);
 				else
 					send(kCharacterMaster, kCharacterCond1, 224122407, 0);
@@ -840,7 +840,7 @@ void LogicManager::HAND_Master_MovingNight(HAND_PARAMS) {
 
 		break;
 	case 190346110:
-		_gameProgress[kProgressField18] = 3;
+		_globals[kProgressField18] = 3;
 		if (_gameTime >= 1494000) {
 			CONS_Master_SecondSleep(0, 0, 0, 0);
 		} else {
@@ -859,7 +859,7 @@ void LogicManager::HAND_Master_MovingNight(HAND_PARAMS) {
 	case 17:
 		if (!getCharacterCurrentParams(kCharacterMaster)[2] && checkCathDir(kCarGreenSleeping, 1)) {
 			_gameTime = 1062000;
-			_gameTimeTicksDelta = 3;
+			_timeSpeed = 3;
 			getCharacterCurrentParams(kCharacterMaster)[2] = 1;
 		}
 		break;
@@ -899,7 +899,7 @@ void LogicManager::HAND_Master_MovingNight(HAND_PARAMS) {
 
 			if (_gameTime > 1170000 && !getCharacterCurrentParams(kCharacterMaster)[9]) {
 				getCharacterCurrentParams(kCharacterMaster)[9] = 1;
-				_gameProgress[kProgressField18] = 2;
+				_globals[kProgressField18] = 2;
 			}
 
 			if (!getCharacterCurrentParams(kCharacterMaster)[0]) {
@@ -933,7 +933,7 @@ void LogicManager::HAND_Master_MovingNight(HAND_PARAMS) {
 
 				if (_gameTime > 1260000 && !getCharacterCurrentParams(kCharacterMaster)[14]) {
 					getCharacterCurrentParams(kCharacterMaster)[14] = 1;
-					_gameTimeTicksDelta = 1;
+					_timeSpeed = 1;
 				}
 				if (_gameTime > 1303200 && !getCharacterCurrentParams(kCharacterMaster)[15]) {
 					getCharacterCurrentParams(kCharacterMaster)[15] = 1;
@@ -1056,7 +1056,7 @@ void LogicManager::HAND_Master_MovingNight(HAND_PARAMS) {
 		case 8:
 			if (_gameTime > 1260000 && !getCharacterCurrentParams(kCharacterMaster)[14]) {
 				getCharacterCurrentParams(kCharacterMaster)[14] = 1;
-				_gameTimeTicksDelta = 1;
+				_timeSpeed = 1;
 			}
 
 			if (_gameTime > 1303200 && !getCharacterCurrentParams(kCharacterMaster)[15]) {
@@ -1145,7 +1145,7 @@ void LogicManager::HAND_Master_MovingNight(HAND_PARAMS) {
 			// fall through
 		case 17:
 			if (getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] == 17) {
-				_gameProgress[kProgressField18] = 1;
+				_globals[kProgressField18] = 1;
 				getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 18;
 				MasterCall(&LogicManager::CONS_Master_Arrive, "Strasbou", 7, 0, 0);
 			}
@@ -1162,7 +1162,7 @@ void LogicManager::HAND_Master_MovingNight(HAND_PARAMS) {
 			// fall through
 		case 19:
 			if (getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] == 19) {
-				_gameTimeTicksDelta = 1;
+				_timeSpeed = 1;
 			}
 
 			if (_gameTime > 1539000 && !getCharacterCurrentParams(kCharacterMaster)[25]) {
@@ -1224,7 +1224,7 @@ void LogicManager::HAND_Master_SecondSleep(HAND_PARAMS) {
 
 		playDialog(kCharacterCath, "MUS008", 16, 0);
 
-		_inventorySelectedItemIdx = 0;
+		_activeItem = 0;
 		fadeToBlack();
 
 		while (dialogRunning("MUS008")) {
@@ -1251,13 +1251,13 @@ void LogicManager::CONS_Master_StartPart2(CONS_PARAMS) {
 void LogicManager::HAND_Master_StartPart2(HAND_PARAMS) {
 	switch (msg->action) {
 	case 12:
-		if (_gameProgress[kProgressChapter] != 2) {
-			_gameProgress[kProgressChapter] = 2;
+		if (_globals[kProgressChapter] != 2) {
+			_globals[kProgressChapter] = 2;
 			makeAllJump(2);
 		}
 
 		_gameTime = 1750500;
-		_gameTimeTicksDelta = 5;
+		_timeSpeed = 5;
 
 		getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 1;
 
@@ -1292,18 +1292,18 @@ void LogicManager::CONS_Master_InitPart2(CONS_PARAMS) {
 void LogicManager::HAND_Master_InitPart2(HAND_PARAMS) {
 	switch (msg->action) {
 	case 12:
-		_gameProgress[kProgressIsTrainRunning] = 1;
+		_globals[kProgressIsTrainRunning] = 1;
 		setDoor(26, kCharacterCath, 1, 0, 9);
 		setDoor(27, kCharacterCath, 1, 0, 9);
-		_gameProgress[kProgressField18] = 1;
+		_globals[kProgressField18] = 1;
 		giveCathItem(kItemGreenJacket);
 
-		_gameInventory[kItemCorpse].location = 0;
-		_gameInventory[kItemCorpse].isPresent = 0;
-		_gameProgress[kProgressJacket] = 2;
-		_gameProgress[kProgressPortrait] = 34;
-		_gameProgress[kProgressEventCorpseMovedFromFloor] = 1;
-		_gameProgress[kProgressEventFoundCorpse] = 1;
+		_items[kItemCorpse].floating = 0;
+		_items[kItemCorpse].haveIt = 0;
+		_globals[kProgressJacket] = 2;
+		_globals[kProgressPortrait] = 34;
+		_globals[kProgressEventCorpseMovedFromFloor] = 1;
+		_globals[kProgressEventFoundCorpse] = 1;
 		dropItem(kItemBeetle, 3);
 		dropItem(kItem3, 1);
 
@@ -1362,11 +1362,11 @@ void LogicManager::CONS_Master_MovingDay(CONS_PARAMS) {
 void LogicManager::HAND_Master_MovingDay(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
-		if (_gameProgress[kProgressIsTrainRunning]) {
+		if (_globals[kProgressIsTrainRunning]) {
 			if (getCharacterCurrentParams(kCharacterMaster)[1] ||
-				(getCharacterCurrentParams(kCharacterMaster)[1] = _currentGameSessionTicks + getCharacterCurrentParams(kCharacterMaster)[0],
-				 _currentGameSessionTicks + getCharacterCurrentParams(kCharacterMaster)[0] != 0)) {
-				if (getCharacterCurrentParams(kCharacterMaster)[1] >= _currentGameSessionTicks)
+				(getCharacterCurrentParams(kCharacterMaster)[1] = _realTime + getCharacterCurrentParams(kCharacterMaster)[0],
+				 _realTime + getCharacterCurrentParams(kCharacterMaster)[0] != 0)) {
+				if (getCharacterCurrentParams(kCharacterMaster)[1] >= _realTime)
 					break;
 
 				getCharacterCurrentParams(kCharacterMaster)[1] = 0x7FFFFFFF;
@@ -1421,13 +1421,13 @@ void LogicManager::CONS_Master_StartPart3(CONS_PARAMS) {
 void LogicManager::HAND_Master_StartPart3(HAND_PARAMS) {
 	switch (msg->action) {
 	case 12:
-		if (_gameProgress[kProgressChapter] != 3) {
-			_gameProgress[kProgressChapter] = 3;
+		if (_globals[kProgressChapter] != 3) {
+			_globals[kProgressChapter] = 3;
 			makeAllJump(3);
 		}
 
 		_gameTime = 1944000;
-		_gameTimeTicksDelta = 5;
+		_timeSpeed = 5;
 
 		CONS_Master_InitPart3(0, 0, 0, 0);
 		break;
@@ -1456,7 +1456,7 @@ void LogicManager::HAND_Master_InitPart3(HAND_PARAMS) {
 		send(kCharacterMaster, kCharacterTableE, 103798704, 0);
 		send(kCharacterMaster, kCharacterTableF, 103798704, 0);
 
-		_gameProgress[kProgressIsTrainRunning] = 1;
+		_globals[kProgressIsTrainRunning] = 1;
 
 		setDoor(26, kCharacterCath, 1, 0, 9);
 		setDoor(27, kCharacterCath, 1, 0, 9);
@@ -1504,17 +1504,17 @@ void LogicManager::HAND_Master_MovingAfternoon(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
 	{
-		if (_gameProgress[kProgressIsTrainRunning]) {
+		if (_globals[kProgressIsTrainRunning]) {
 			bool skip1 = false;
 
 			if (!getCharacterCurrentParams(kCharacterMaster)[3]) {
-				getCharacterCurrentParams(kCharacterMaster)[3] = _currentGameSessionTicks + getCharacterCurrentParams(kCharacterMaster)[0];
+				getCharacterCurrentParams(kCharacterMaster)[3] = _realTime + getCharacterCurrentParams(kCharacterMaster)[0];
 				if (getCharacterCurrentParams(kCharacterMaster)[3] == 0) {
 					skip1 = true;
 				}
 			}
 
-			if (skip1 || getCharacterCurrentParams(kCharacterMaster)[3] < _currentGameSessionTicks) {
+			if (skip1 || getCharacterCurrentParams(kCharacterMaster)[3] < _realTime) {
 				if (!skip1) {
 					getCharacterCurrentParams(kCharacterMaster)[3] = 0x7FFFFFFF;
 				}
@@ -1547,13 +1547,13 @@ void LogicManager::HAND_Master_MovingAfternoon(HAND_PARAMS) {
 		bool skip2 = false;
 
 		if (!getCharacterCurrentParams(kCharacterMaster)[4]) {
-			getCharacterCurrentParams(kCharacterMaster)[4] = _currentGameSessionTicks + getCharacterCurrentParams(kCharacterMaster)[1];
+			getCharacterCurrentParams(kCharacterMaster)[4] = _realTime + getCharacterCurrentParams(kCharacterMaster)[1];
 			if (getCharacterCurrentParams(kCharacterMaster)[4] == 0) {
 				skip2 = true;
 			}
 		}
 
-		if (skip2 || getCharacterCurrentParams(kCharacterMaster)[4] < _currentGameSessionTicks) {
+		if (skip2 || getCharacterCurrentParams(kCharacterMaster)[4] < _realTime) {
 			if (!skip2) {
 				getCharacterCurrentParams(kCharacterMaster)[4] = 0x7FFFFFFF;
 			}
@@ -1630,7 +1630,7 @@ void LogicManager::HAND_Master_MovingAfternoon(HAND_PARAMS) {
 
 		if (_gameTime > 2187000 && !getCharacterCurrentParams(kCharacterMaster)[13]) {
 			getCharacterCurrentParams(kCharacterMaster)[13] = 1;
-			_gameTimeTicksDelta = 5;
+			_timeSpeed = 5;
 		}
 
 		if (_gameTime > 2268000 && !getCharacterCurrentParams(kCharacterMaster)[14]) {
@@ -1766,7 +1766,7 @@ void LogicManager::HAND_Master_MovingAfternoon(HAND_PARAMS) {
 		case 8:
 			if (_gameTime > 2187000 && !getCharacterCurrentParams(kCharacterMaster)[13]) {
 				getCharacterCurrentParams(kCharacterMaster)[13] = 1;
-				_gameTimeTicksDelta = 5;
+				_timeSpeed = 5;
 			}
 
 			if (_gameTime > 2268000 && !getCharacterCurrentParams(kCharacterMaster)[14]) {
@@ -1803,8 +1803,8 @@ void LogicManager::HAND_Master_EndVienna(HAND_PARAMS) {
 	switch (msg->action) {
 	case 12:
 		getCharacter(kCharacterCath).characterPosition.car = kCarLocomotive;
-		if (_gameEvents[kEventAugustBringBriefcase]) {
-			if (_gameInventory[kItemFirebird].location == 5) {
+		if (_doneNIS[kEventAugustBringBriefcase]) {
+			if (_items[kItemFirebird].floating == 5) {
 				getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 2;
 				MasterCall(&LogicManager::CONS_Master_SaveGame, 2, kEventViennaKronosFirebird, 0, 0);
 			} else if (getCharacterParams(kCharacterMaster, 8)[0]) {
@@ -1825,10 +1825,10 @@ void LogicManager::HAND_Master_EndVienna(HAND_PARAMS) {
 		case 1:
 			playNIS(kEventViennaAugustUnloadGuns);
 
-			if (_gameEvents[kEventConcertLeaveWithBriefcase]) {
+			if (_doneNIS[kEventConcertLeaveWithBriefcase]) {
 				endGame(1, 2187000, 0, true);
 			} else {
-				if (!_gameEvents[kEventCathJumpDownCeiling]) {
+				if (!_doneNIS[kEventCathJumpDownCeiling]) {
 					endGame(1, 2155500, 0, true);
 				} else {
 					endGame(2, 253, 0, true);
@@ -1839,20 +1839,20 @@ void LogicManager::HAND_Master_EndVienna(HAND_PARAMS) {
 		case 2:
 			playNIS(kEventViennaKronosFirebird);
 
-			if (_gameEvents[kEventKronosBringEggCeiling]) {
+			if (_doneNIS[kEventKronosBringEggCeiling]) {
 				endGame(3, 58, 60, true);
-			} else if (_gameEvents[kEventKronosBringEgg]) {
+			} else if (_doneNIS[kEventKronosBringEgg]) {
 				endGame(1, 2155500, 60, true);
 			} else {
-				if (_gameProgress[kProgressFieldC0]) {
-					if (_gameEvents[kEventKronosReturnBriefcase]) {
+				if (_globals[kProgressFieldC0]) {
+					if (_doneNIS[kEventKronosReturnBriefcase]) {
 						endGame(1, 61, 61, true);
 						return;
 					} else {
 						endGame(1, 2155500, 59, true);
 					}
 				} else {
-					if (_gameEvents[kEventKronosReturnBriefcase]) {
+					if (_doneNIS[kEventKronosReturnBriefcase]) {
 						endGame(2, 61, 59, true);
 						return;
 					} else {
@@ -1893,13 +1893,13 @@ void LogicManager::CONS_Master_StartPart4(CONS_PARAMS) {
 void LogicManager::HAND_Master_StartPart4(HAND_PARAMS) {
 	switch (msg->action) {
 	case 12:
-		if (_gameProgress[kProgressChapter] != 4) {
-			_gameProgress[kProgressChapter] = 4;
+		if (_globals[kProgressChapter] != 4) {
+			_globals[kProgressChapter] = 4;
 			makeAllJump(4);
 		}
 
 		_gameTime = 2353500;
-		_gameTimeTicksDelta = 5;
+		_timeSpeed = 5;
 
 		getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 1;
 
@@ -1937,7 +1937,7 @@ void LogicManager::HAND_Master_InitPart4(HAND_PARAMS) {
 		_engine->getSoundManager()->endAmbient();
 		_engine->getSoundManager()->startAmbient();
 
-		_gameProgress[kProgressIsTrainRunning] = 1;
+		_globals[kProgressIsTrainRunning] = 1;
 
 		setDoor(26, kCharacterCath, 1, 0, 9);
 		setDoor(27, kCharacterCath, 1, 0, 9);
@@ -1953,7 +1953,7 @@ void LogicManager::HAND_Master_InitPart4(HAND_PARAMS) {
 		takeItem(kItem3);
 		dropItem(kItemBomb, 1);
 
-		if (_gameInventory[kItemBeetle].location == 3)
+		if (_items[kItemBeetle].floating == 3)
 			takeItem(kItemBeetle);
 
 		setModel(25, 2);
@@ -1997,10 +1997,10 @@ void LogicManager::HAND_Master_MovingSecondNight(HAND_PARAMS) {
 	case 0:
 	{
 		bool skip = false;
-		if (_gameProgress[kProgressIsTrainRunning]) {
+		if (_globals[kProgressIsTrainRunning]) {
 			if (getCharacterCurrentParams(kCharacterMaster)[5] ||
-				(getCharacterCurrentParams(kCharacterMaster)[5] = _currentGameSessionTicks + getCharacterCurrentParams(kCharacterMaster)[3], _currentGameSessionTicks + getCharacterCurrentParams(kCharacterMaster)[3] != 0)) {
-				if (getCharacterCurrentParams(kCharacterMaster)[5] >= _currentGameSessionTicks) {
+				(getCharacterCurrentParams(kCharacterMaster)[5] = _realTime + getCharacterCurrentParams(kCharacterMaster)[3], _realTime + getCharacterCurrentParams(kCharacterMaster)[3] != 0)) {
+				if (getCharacterCurrentParams(kCharacterMaster)[5] >= _realTime) {
 					skip = true;
 				}
 
@@ -2036,8 +2036,8 @@ void LogicManager::HAND_Master_MovingSecondNight(HAND_PARAMS) {
 		}
 
 		if (getCharacterCurrentParams(kCharacterMaster)[6] ||
-			(getCharacterCurrentParams(kCharacterMaster)[6] = _currentGameSessionTicks + getCharacterCurrentParams(kCharacterMaster)[4], _currentGameSessionTicks + getCharacterCurrentParams(kCharacterMaster)[4] != 0)) {
-			if (getCharacterCurrentParams(kCharacterMaster)[6] >= _currentGameSessionTicks) {
+			(getCharacterCurrentParams(kCharacterMaster)[6] = _realTime + getCharacterCurrentParams(kCharacterMaster)[4], _realTime + getCharacterCurrentParams(kCharacterMaster)[4] != 0)) {
+			if (getCharacterCurrentParams(kCharacterMaster)[6] >= _realTime) {
 				if (_gameTime > 2381400 && !getCharacterCurrentParams(kCharacterMaster)[7]) {
 					getCharacterCurrentParams(kCharacterMaster)[7] = 1;
 					getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 1;
@@ -2054,7 +2054,7 @@ void LogicManager::HAND_Master_MovingSecondNight(HAND_PARAMS) {
 	
 				if (getModel(1) == 1 && _gameTime > 2403000 && !getCharacterCurrentParams(kCharacterMaster)[9]) {
 					getCharacterCurrentParams(kCharacterMaster)[9] = 1;
-					_gameProgress[kProgressField18] = 2;
+					_globals[kProgressField18] = 2;
 				}
 
 				if (!getCharacterCurrentParams(kCharacterMaster)[0]) {
@@ -2075,14 +2075,14 @@ void LogicManager::HAND_Master_MovingSecondNight(HAND_PARAMS) {
 
 				if (_gameTime > 2470500 && !getCharacterCurrentParams(kCharacterMaster)[12]) {
 					getCharacterCurrentParams(kCharacterMaster)[12] = 1;
-					if (_gameProgress[kProgressField18] == 2)
-						_gameTimeTicksDelta = 1;
+					if (_globals[kProgressField18] == 2)
+						_timeSpeed = 1;
 				}
 
 				if (_gameTime > 2506500 && !getCharacterCurrentParams(kCharacterMaster)[13]) {
 					getCharacterCurrentParams(kCharacterMaster)[13] = 1;
-					if (_gameProgress[kProgressField18] == 2)
-						_gameProgress[kProgressField18] = 1;
+					if (_globals[kProgressField18] == 2)
+						_globals[kProgressField18] = 1;
 				}
 
 				if (_gameTime > 2520000 && !getCharacterCurrentParams(kCharacterMaster)[14]) {
@@ -2128,7 +2128,7 @@ void LogicManager::HAND_Master_MovingSecondNight(HAND_PARAMS) {
 
 		if (getModel(1) == 1 && _gameTime > 2403000 && !getCharacterCurrentParams(kCharacterMaster)[9]) {
 			getCharacterCurrentParams(kCharacterMaster)[9] = 1;
-			_gameProgress[kProgressField18] = 2;
+			_globals[kProgressField18] = 2;
 		}
 
 		if (!getCharacterCurrentParams(kCharacterMaster)[0]) {
@@ -2149,14 +2149,14 @@ void LogicManager::HAND_Master_MovingSecondNight(HAND_PARAMS) {
 
 		if (_gameTime > 2470500 && !getCharacterCurrentParams(kCharacterMaster)[12]) {
 			getCharacterCurrentParams(kCharacterMaster)[12] = 1;
-			if (_gameProgress[kProgressField18] == 2)
-				_gameTimeTicksDelta = 1;
+			if (_globals[kProgressField18] == 2)
+				_timeSpeed = 1;
 		}
 
 		if (_gameTime > 2506500 && !getCharacterCurrentParams(kCharacterMaster)[13]) {
 			getCharacterCurrentParams(kCharacterMaster)[13] = 1;
-			if (_gameProgress[kProgressField18] == 2)
-				_gameProgress[kProgressField18] = 1;
+			if (_globals[kProgressField18] == 2)
+				_globals[kProgressField18] = 1;
 		}
 
 		if (_gameTime > 2520000 && !getCharacterCurrentParams(kCharacterMaster)[14]) {
@@ -2246,20 +2246,20 @@ void LogicManager::HAND_Master_MovingSecondNight(HAND_PARAMS) {
 		case 2:
 			if (getModel(1) == 1 && _gameTime > 2403000 && !getCharacterCurrentParams(kCharacterMaster)[9]) {
 				getCharacterCurrentParams(kCharacterMaster)[9] = 1;
-				_gameProgress[kProgressField18] = 2;
+				_globals[kProgressField18] = 2;
 			}
 
 			if (getCharacterCurrentParams(kCharacterMaster)[0]) {
 				if (_gameTime > 2470500 && !getCharacterCurrentParams(kCharacterMaster)[12]) {
 					getCharacterCurrentParams(kCharacterMaster)[12] = 1;
-					if (_gameProgress[kProgressField18] == 2)
-						_gameTimeTicksDelta = 1;
+					if (_globals[kProgressField18] == 2)
+						_timeSpeed = 1;
 				}
 
 				if (_gameTime > 2506500 && !getCharacterCurrentParams(kCharacterMaster)[13]) {
 					getCharacterCurrentParams(kCharacterMaster)[13] = 1;
-					if (_gameProgress[kProgressField18] == 2)
-						_gameProgress[kProgressField18] = 1;
+					if (_globals[kProgressField18] == 2)
+						_globals[kProgressField18] = 1;
 				}
 
 				if (_gameTime > 2520000 && !getCharacterCurrentParams(kCharacterMaster)[14]) {
@@ -2293,14 +2293,14 @@ void LogicManager::HAND_Master_MovingSecondNight(HAND_PARAMS) {
 		case 4:
 			if (_gameTime > 2470500 && !getCharacterCurrentParams(kCharacterMaster)[12]) {
 				getCharacterCurrentParams(kCharacterMaster)[12] = 1;
-				if (_gameProgress[kProgressField18] == 2)
-					_gameTimeTicksDelta = 1;
+				if (_globals[kProgressField18] == 2)
+					_timeSpeed = 1;
 			}
 
 			if (_gameTime > 2506500 && !getCharacterCurrentParams(kCharacterMaster)[13]) {
 				getCharacterCurrentParams(kCharacterMaster)[13] = 1;
-				if (_gameProgress[kProgressField18] == 2)
-					_gameProgress[kProgressField18] = 1;
+				if (_globals[kProgressField18] == 2)
+					_globals[kProgressField18] = 1;
 			}
 
 			if (_gameTime > 2520000 && !getCharacterCurrentParams(kCharacterMaster)[14]) {
@@ -2323,10 +2323,10 @@ void LogicManager::HAND_Master_MovingSecondNight(HAND_PARAMS) {
 			_engine->getSoundManager()->endAmbient();
 			playNIS(kEventTylerCastleDream);
 			_engine->getSoundManager()->startAmbient();
-			_gameProgress[kProgressField18] = 1;
+			_globals[kProgressField18] = 1;
 			bumpCathTylerComp();
 			send(kCharacterMaster, kCharacterTatiana, 169360385, 0);
-			_gameTimeTicksDelta = 1;
+			_timeSpeed = 1;
 			_gameTime = 2511900;
 			dropItem(kItem2, 1);
 			takeItem(kItem22);
@@ -2355,7 +2355,7 @@ void LogicManager::HAND_Master_MovingSecondNight(HAND_PARAMS) {
 			send(kCharacterMaster, kCharacterAnna, 191001984, 0);
 			send(kCharacterMaster, kCharacterCond2, 191001984, 0);
 			takeItem(kItem2);
-			_gameInventory[kItem2].location = 0;
+			_items[kItem2].floating = 0;
 			getCharacterCurrentParams(kCharacterMaster)[1] = 1;
 			bumpCath(kCarRedSleeping, 2, 255);
 			break;
@@ -2376,7 +2376,7 @@ void LogicManager::HAND_Master_MovingSecondNight(HAND_PARAMS) {
 		send(kCharacterMaster, kCharacterTatiana, 169360385, 0);
 		send(kCharacterMaster, kCharacterCond2, 201431954, 0);
 		send(kCharacterMaster, kCharacterTrainM, 201431954, 0);
-		_gameTimeTicksDelta = 1;
+		_timeSpeed = 1;
 		_gameTime = 2511900;
 		dropItem(kItem2, 1);
 		getCharacter(kCharacterMaster).characterPosition.car = 4;
@@ -2396,7 +2396,7 @@ void LogicManager::HAND_Master_MovingSecondNight(HAND_PARAMS) {
 		startSeqOtis(kCharacterMaster, "BOMB");
 		break;
 	case 190346110:
-		_gameProgress[kProgressField18] = 3;
+		_globals[kProgressField18] = 3;
 		getCharacterCurrentParams(kCharacterMaster)[0] = 1;
 		if (getCharacterParams(kCharacterMaster, 8)[1] || getCharacterParams(kCharacterMaster, 8)[2]) {
 			endDialog(kCharacterMaster);
@@ -2406,7 +2406,7 @@ void LogicManager::HAND_Master_MovingSecondNight(HAND_PARAMS) {
 
 		fadeToBlack();
 		playDialog(0, "MUS008", 16, 0);
-		_inventorySelectedItemIdx = 0;
+		_activeItem = 0;
 		fadeToBlack();
 
 		while (dialogRunning("MUS008"))
@@ -2462,7 +2462,7 @@ void LogicManager::HAND_Master_MovingSecondNight(HAND_PARAMS) {
 
 		endGraphics(kCharacterMaster);
 		takeCathItem(kItemTelegram);
-		_gameTimeTicksDelta = 5;
+		_timeSpeed = 5;
 		getCharacter(kCharacterMaster).callbacks[getCharacter(kCharacterMaster).currentCall + 8] = 10;
 		MasterCall(&LogicManager::CONS_Master_SaveGame, 2, kEventDefuseBomb, 0, 0);
 		break;
@@ -2495,13 +2495,13 @@ void LogicManager::CONS_Master_StartPart5(CONS_PARAMS) {
 void LogicManager::HAND_Master_StartPart5(HAND_PARAMS) {
 	switch (msg->action) {
 	case 12:
-		if (_gameProgress[kProgressChapter] != 5) {
-			_gameProgress[kProgressChapter] = 5;
+		if (_globals[kProgressChapter] != 5) {
+			_globals[kProgressChapter] = 5;
 			makeAllJump(5);
 		}
 
 		_gameTime = 2844000;
-		_gameTimeTicksDelta = 2;
+		_timeSpeed = 2;
 
 		CONS_Master_InitPart5(0, 0, 0, 0);
 		break;
@@ -2530,7 +2530,7 @@ void LogicManager::HAND_Master_InitPart5(HAND_PARAMS) {
 		endGraphics(kCharacterTableE);
 		endGraphics(kCharacterTableF);
 
-		_gameProgress[kProgressIsTrainRunning] = 1;
+		_globals[kProgressIsTrainRunning] = 1;
 
 		setDoor(26, kCharacterCath, 1, 0, 9);
 		setDoor(27, kCharacterCath, 1, 0, 9);
@@ -2565,10 +2565,10 @@ void LogicManager::HAND_Master_InitPart5(HAND_PARAMS) {
 		setDoor(26, kCharacterCath, 0, 10, 9);
 		setDoor(27, kCharacterCath, 0, 10, 9);
 
-		_gameProgress[kProgressField18] = 1;
-		_inventorySelectedItemIdx = 0;
-		_gameProgress[kProgressField84] = 1;
-		_gameProgress[kProgressPortrait] = 36;
+		_globals[kProgressField18] = 1;
+		_activeItem = 0;
+		_globals[kProgressField84] = 1;
+		_globals[kProgressPortrait] = 36;
 
 		takeCathItem(kItemKey);
 		takeCathItem(kItemBomb);
@@ -2630,7 +2630,7 @@ void LogicManager::HAND_Master_MovingPart5(HAND_PARAMS) {
 	case 0:
 		if (_gameTime > 2907000 && !getCharacterCurrentParams(kCharacterMaster)[1]) {
 			getCharacterCurrentParams(kCharacterMaster)[1] = 1;
-			if (!_gameProgress[kProgressIsDayTime]) {
+			if (!_globals[kProgressIsDayTime]) {
 				playDialog(kCharacterMaster, "ARRIVE", 8, 0);
 				_engine->getSoundManager()->endAmbient();
 			}
@@ -2638,7 +2638,7 @@ void LogicManager::HAND_Master_MovingPart5(HAND_PARAMS) {
 
 		if (_gameTime > 2943000 && !getCharacterCurrentParams(kCharacterMaster)[2]) {
 			getCharacterCurrentParams(kCharacterMaster)[2] = 1;
-			if (!_gameEvents[kEventLocomotiveMilosDay] && !_gameEvents[kEventLocomotiveMilosNight]) {
+			if (!_doneNIS[kEventLocomotiveMilosDay] && !_doneNIS[kEventLocomotiveMilosNight]) {
 				playDialog(kCharacterMaster, "ARRIVE", 8, 0);
 				_engine->getSoundManager()->endAmbient();
 			}
@@ -2665,7 +2665,7 @@ void LogicManager::HAND_Master_MovingPart5(HAND_PARAMS) {
 
 		break;
 	case 135800432:
-		_gameProgress[kProgressIsDayTime] = 1;
+		_globals[kProgressIsDayTime] = 1;
 		_gameTime = 2916000;
 
 		if (whoRunningDialog(kCharacterMaster))
diff --git a/engines/lastexpress/characters/max.cpp b/engines/lastexpress/characters/max.cpp
index 122c00f8286..4cdba076646 100644
--- a/engines/lastexpress/characters/max.cpp
+++ b/engines/lastexpress/characters/max.cpp
@@ -447,9 +447,9 @@ void LogicManager::HAND_Max_Escaped(HAND_PARAMS) {
 				if (!whoOnScreen(kCharacterMax) || !getCharacterCurrentParams(kCharacterMax)[1]) {
 					getCharacterCurrentParams(kCharacterMax)[1] = _gameTime;
 					if (!_gameTime) {
-						if (_gameProgress[kProgressChapter] == 3) {
+						if (_globals[kProgressChapter] == 3) {
 							CONS_Max_LetMeIn3(0, 0, 0, 0);
-						} else if (_gameProgress[kProgressChapter] == 4) {
+						} else if (_globals[kProgressChapter] == 4) {
 							CONS_Max_LetMeIn4(0, 0, 0, 0);
 						}
 					}
@@ -460,9 +460,9 @@ void LogicManager::HAND_Max_Escaped(HAND_PARAMS) {
 			}
 
 			getCharacterCurrentParams(kCharacterMax)[1] = 0x7FFFFFFF;
-			if (_gameProgress[kProgressChapter] == 3) {
+			if (_globals[kProgressChapter] == 3) {
 				CONS_Max_LetMeIn3(0, 0, 0, 0);
-			} else if (_gameProgress[kProgressChapter] == 4) {
+			} else if (_globals[kProgressChapter] == 4) {
 				CONS_Max_LetMeIn4(0, 0, 0, 0);
 			}
 		}
@@ -640,8 +640,8 @@ void LogicManager::HAND_Max_InCageMad(HAND_PARAMS) {
 		playDialog(kCharacterMax, "Max1122", -1, 0);
 		break;
 	case 9:
-		if (_gameEvents[kEventCathMaxCage]) {
-			if (!_gameEvents[kEventCathMaxFree]) {
+		if (_doneNIS[kEventCathMaxCage]) {
+			if (!_doneNIS[kEventCathMaxFree]) {
 				getCharacter(kCharacterMax).callbacks[getCharacter(kCharacterMax).currentCall + 8] = 2;
 				MaxCall(&LogicManager::CONS_Max_SaveGame, 2, kEventCathMaxFree, 0, 0);
 			}
diff --git a/engines/lastexpress/characters/milos.cpp b/engines/lastexpress/characters/milos.cpp
index 7ab065a304d..69f2775b6de 100644
--- a/engines/lastexpress/characters/milos.cpp
+++ b/engines/lastexpress/characters/milos.cpp
@@ -360,7 +360,7 @@ void LogicManager::HAND_Milos_DoWalk(HAND_PARAMS) {
 		break;
 	case 5:
 	case 6:
-		if (_gameEvents[kEventMilosTylerCompartmentDefeat]) {
+		if (_doneNIS[kEventMilosTylerCompartmentDefeat]) {
 			switch (rnd(3)) {
 			case 0:
 				playDialog(kCharacterCath, "CAT1014", -1, 0);
@@ -415,8 +415,8 @@ void LogicManager::HAND_Milos_CompLogic(HAND_PARAMS) {
 		}
 
 		if (!skip1 && !getCharacterCurrentParams(kCharacterMilos)[7]) {
-			getCharacterCurrentParams(kCharacterMilos)[7] = _currentGameSessionTicks + 75;
-			if (_currentGameSessionTicks == -75) {
+			getCharacterCurrentParams(kCharacterMilos)[7] = _realTime + 75;
+			if (_realTime == -75) {
 				getCharacterCurrentParams(kCharacterMilos)[1] = 0;
 				getCharacterCurrentParams(kCharacterMilos)[2] = 1;
 				setDoor(38, kCharacterMilos, 1, 0, 0);
@@ -425,7 +425,7 @@ void LogicManager::HAND_Milos_CompLogic(HAND_PARAMS) {
 			}
 		}
 
-		if (!skip1 && getCharacterCurrentParams(kCharacterMilos)[7] < _currentGameSessionTicks) {
+		if (!skip1 && getCharacterCurrentParams(kCharacterMilos)[7] < _realTime) {
 			getCharacterCurrentParams(kCharacterMilos)[7] = 0x7FFFFFFF;
 			getCharacterCurrentParams(kCharacterMilos)[1] = 0;
 			getCharacterCurrentParams(kCharacterMilos)[2] = 1;
@@ -433,7 +433,7 @@ void LogicManager::HAND_Milos_CompLogic(HAND_PARAMS) {
 			getCharacterCurrentParams(kCharacterMilos)[7] = 0;
 		}
 
-		if (_gameProgress[kProgressChapter] == 1 && !getCharacterCurrentParams(kCharacterMilos)[4]) {
+		if (_globals[kProgressChapter] == 1 && !getCharacterCurrentParams(kCharacterMilos)[4]) {
 			bool skip2 = false;
 
 			if (getCharacterCurrentParams(kCharacterMilos)[5]) {
@@ -453,9 +453,9 @@ void LogicManager::HAND_Milos_CompLogic(HAND_PARAMS) {
 				}
 			}
 
-			if (!_gameProgress[kProgressFieldCC]) {
-				if (getCharacterParams(kCharacterMilos, 8)[2] && !_gameProgress[kProgressField14] && !getCharacterCurrentParams(kCharacterMilos)[5]) {
-					_gameProgress[kProgressField14] = 14;
+			if (!_globals[kProgressFieldCC]) {
+				if (getCharacterParams(kCharacterMilos, 8)[2] && !_globals[kProgressField14] && !getCharacterCurrentParams(kCharacterMilos)[5]) {
+					_globals[kProgressField14] = 14;
 					send(kCharacterMilos, kCharacterVesna, 190412928, 0);
 					getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 1;
 					MilosCall(&LogicManager::CONS_Milos_DoCorrOtis, "609Cg", 38, 0, 0);
@@ -473,7 +473,7 @@ void LogicManager::HAND_Milos_CompLogic(HAND_PARAMS) {
 						getCharacterCurrentParams(kCharacterMilos)[9] = _gameTime + 150;
 						if (_gameTime == -150) {
 							if (nearChar(kCharacterCath, kCharacterMilos, 2000))
-								_gameProgress[kProgressField98] = 1;
+								_globals[kProgressField98] = 1;
 
 							setDoor(38, kCharacterMilos, 3, 0, 0);
 							getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 6;
@@ -488,7 +488,7 @@ void LogicManager::HAND_Milos_CompLogic(HAND_PARAMS) {
 
 				getCharacterCurrentParams(kCharacterMilos)[9] = 0x7FFFFFFF;
 				if (nearChar(kCharacterCath, kCharacterMilos, 2000))
-					_gameProgress[kProgressField98] = 1;
+					_globals[kProgressField98] = 1;
 
 				setDoor(38, kCharacterMilos, 3, 0, 0);
 				getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 6;
@@ -550,8 +550,8 @@ void LogicManager::HAND_Milos_CompLogic(HAND_PARAMS) {
 			MilosCall(&LogicManager::CONS_Milos_KnockTyler, 0, 0, 0, 0);
 			break;
 		case 3:
-			if (_gameProgress[kProgressField14] == 14)
-				_gameProgress[kProgressField14] = 0;
+			if (_globals[kProgressField14] == 14)
+				_globals[kProgressField14] = 0;
 
 			getCharacterCurrentParams(kCharacterMilos)[5] = 1;
 			getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 4;
@@ -702,7 +702,7 @@ void LogicManager::HAND_Milos_KnockTyler(HAND_PARAMS) {
 
 	switch (msg->action) {
 	case 0:
-		if (_gameProgress[kProgressField14] == 29 || _gameProgress[kProgressField14] == 3) {
+		if (_globals[kProgressField14] == 29 || _globals[kProgressField14] == 3) {
 			if (getCharacterCurrentParams(kCharacterMilos)[1]) {
 				getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 1;
 				MilosCall(&LogicManager::CONS_Milos_DoCorrOtis, "609Ca", 1, 0, 0);
@@ -715,10 +715,10 @@ void LogicManager::HAND_Milos_KnockTyler(HAND_PARAMS) {
 				fedEx(kCharacterMilos, kCharacterMilos, 18, 0);
 			}
 		} else if (getCharacterCurrentParams(kCharacterMilos)[0]) {
-			if (!getCharacterCurrentParams(kCharacterMilos)[8] && (getCharacterCurrentParams(kCharacterMilos)[8] = _currentGameSessionTicks + 45, _currentGameSessionTicks == -45) || getCharacterCurrentParams(kCharacterMilos)[8] < _currentGameSessionTicks) {
+			if (!getCharacterCurrentParams(kCharacterMilos)[8] && (getCharacterCurrentParams(kCharacterMilos)[8] = _realTime + 45, _realTime == -45) || getCharacterCurrentParams(kCharacterMilos)[8] < _realTime) {
 				if (checkDoor(1) == 1) {
-					if (getCharacterCurrentParams(kCharacterMilos)[9] || (getCharacterCurrentParams(kCharacterMilos)[9] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
-						if (getCharacterCurrentParams(kCharacterMilos)[9] >= _currentGameSessionTicks)
+					if (getCharacterCurrentParams(kCharacterMilos)[9] || (getCharacterCurrentParams(kCharacterMilos)[9] = _realTime + 75, _realTime != -75)) {
+						if (getCharacterCurrentParams(kCharacterMilos)[9] >= _realTime)
 							break;
 						getCharacterCurrentParams(kCharacterMilos)[9] = 0x7FFFFFFF;
 					}
@@ -759,7 +759,7 @@ void LogicManager::HAND_Milos_KnockTyler(HAND_PARAMS) {
 						getCharacterCurrentParams(kCharacterMilos)[9] = 0;
 						break;
 					}
-				} else if (!_gameProgress[kProgressEventCorpseMovedFromFloor] || _gameProgress[kProgressJacket] == 1) {
+				} else if (!_globals[kProgressEventCorpseMovedFromFloor] || _globals[kProgressJacket] == 1) {
 					setDoor(9, kCharacterCath, 0, 255, 255);
 					getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 2;
 					MilosCall(&LogicManager::CONS_Milos_SaveGame, 2, kEventMilosCorpseFloor, 0, 0);
@@ -773,15 +773,15 @@ void LogicManager::HAND_Milos_KnockTyler(HAND_PARAMS) {
 					MilosCall(&LogicManager::CONS_Milos_SaveGame, 2, kEventMilosTylerCompartmentVisit, 0, 0);
 				}
 			}
-		} else if (!getCharacterCurrentParams(kCharacterMilos)[10] && (getCharacterCurrentParams(kCharacterMilos)[10] = _currentGameSessionTicks + 75, _currentGameSessionTicks == -75) || getCharacterCurrentParams(kCharacterMilos)[10] < _currentGameSessionTicks) {
+		} else if (!getCharacterCurrentParams(kCharacterMilos)[10] && (getCharacterCurrentParams(kCharacterMilos)[10] = _realTime + 75, _realTime == -75) || getCharacterCurrentParams(kCharacterMilos)[10] < _realTime) {
 			if (!getCharacterCurrentParams(kCharacterMilos)[3]) {
 				getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 12;
 				MilosCall(&LogicManager::CONS_Milos_DoDialog, "MIL1030C", 0, 0, 0);
 				break;
 			}
 
-			if (getCharacterCurrentParams(kCharacterMilos)[11] || (getCharacterCurrentParams(kCharacterMilos)[11] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
-				if (getCharacterCurrentParams(kCharacterMilos)[11] >= _currentGameSessionTicks)
+			if (getCharacterCurrentParams(kCharacterMilos)[11] || (getCharacterCurrentParams(kCharacterMilos)[11] = _realTime + 75, _realTime != -75)) {
+				if (getCharacterCurrentParams(kCharacterMilos)[11] >= _realTime)
 					break;
 
 				getCharacterCurrentParams(kCharacterMilos)[11] = 0x7FFFFFFF;
@@ -789,7 +789,7 @@ void LogicManager::HAND_Milos_KnockTyler(HAND_PARAMS) {
 
 			softReleaseAtDoor(kCharacterMilos, 1);
 
-			if (_gameProgress[kProgressEventCorpseMovedFromFloor]) {
+			if (_globals[kProgressEventCorpseMovedFromFloor]) {
 				getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 13;
 				MilosCall(&LogicManager::CONS_Milos_DoCorrOtis, "609Ba", 1, 0, 0);
 			} else if (checkLoc(kCharacterCath, kCarGreenSleeping)) {
@@ -817,7 +817,7 @@ void LogicManager::HAND_Milos_KnockTyler(HAND_PARAMS) {
 
 		break;
 	case 9:
-		if (!_gameProgress[kProgressEventCorpseMovedFromFloor] || _gameProgress[kProgressJacket] == 1) {
+		if (!_globals[kProgressEventCorpseMovedFromFloor] || _globals[kProgressJacket] == 1) {
 			setDoor(9, kCharacterCath, 0, 255, 255);
 			getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 16;
 			MilosCall(&LogicManager::CONS_Milos_SaveGame, 2, kEventMilosCorpseFloor, 0, 0);
@@ -870,7 +870,7 @@ void LogicManager::HAND_Milos_KnockTyler(HAND_PARAMS) {
 		case 2:
 			playDialog(0, "LIB014", -1, 0);
 			playNIS(kEventMilosCorpseFloor);
-			endGame(0, 1, _gameProgress[kProgressEventCorpseMovedFromFloor] == kProgressField0 ? 57 : 55, 1);
+			endGame(0, 1, _globals[kProgressEventCorpseMovedFromFloor] == kProgressField0 ? 57 : 55, 1);
 			break;
 		case 3:
 			setDoor(1, kCharacterCath, 0, 10, 9);
@@ -890,7 +890,7 @@ void LogicManager::HAND_Milos_KnockTyler(HAND_PARAMS) {
 			}
 
 			_gameTime += 1800;
-			_gameProgress[kProgressFieldCC] = 1;
+			_globals[kProgressFieldCC] = 1;
 			getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 5;
 			MilosCall(&LogicManager::CONS_Milos_SaveGame, 2, kEventMilosTylerCompartmentDefeat, 0, 0);
 			break;
@@ -926,15 +926,15 @@ void LogicManager::HAND_Milos_KnockTyler(HAND_PARAMS) {
 		case 12:
 			getCharacterCurrentParams(kCharacterMilos)[3] = 1;
 
-			if (getCharacterCurrentParams(kCharacterMilos)[11] || (getCharacterCurrentParams(kCharacterMilos)[11] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
-				if (getCharacterCurrentParams(kCharacterMilos)[11] >= _currentGameSessionTicks)
+			if (getCharacterCurrentParams(kCharacterMilos)[11] || (getCharacterCurrentParams(kCharacterMilos)[11] = _realTime + 75, _realTime != -75)) {
+				if (getCharacterCurrentParams(kCharacterMilos)[11] >= _realTime)
 					break;
 
 				getCharacterCurrentParams(kCharacterMilos)[11] = 0x7FFFFFFF;
 			}
 
 			softReleaseAtDoor(kCharacterMilos, 1);
-			if (_gameProgress[kProgressEventCorpseMovedFromFloor]) {
+			if (_globals[kProgressEventCorpseMovedFromFloor]) {
 				getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 13;
 				MilosCall(&LogicManager::CONS_Milos_DoCorrOtis, "609Ba", 1, 0, 0);
 			} else if (checkLoc(kCharacterCath, kCarGreenSleeping)) {
@@ -971,7 +971,7 @@ void LogicManager::HAND_Milos_KnockTyler(HAND_PARAMS) {
 			}
 			
 			playNIS(kEventMilosCorpseFloor);
-			endGame(0, 1, _gameProgress[kProgressEventCorpseMovedFromFloor] == 0 ? 57 : 55, true);
+			endGame(0, 1, _globals[kProgressEventCorpseMovedFromFloor] == 0 ? 57 : 55, true);
 			break;
 		case 17:
 			if (checkDoor(1) != 1) {
@@ -993,7 +993,7 @@ void LogicManager::HAND_Milos_KnockTyler(HAND_PARAMS) {
 				endGame(0, 0, 0, fightOutcome == 1);
 			} else {
 				_gameTime += 1800;
-				_gameProgress[kProgressFieldCC] = 1;
+				_globals[kProgressFieldCC] = 1;
 				getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 19;
 				MilosCall(&LogicManager::CONS_Milos_SaveGame, 2, kEventMilosTylerCompartmentDefeat, 0, 0);
 			}
@@ -1044,13 +1044,13 @@ void LogicManager::HAND_Milos_AtDinner(HAND_PARAMS) {
 		}
 
 		if (checkCathDir(kCarRestaurant, 61) && !getCharacterCurrentParams(kCharacterMilos)[0]) {
-			if (getCharacterCurrentParams(kCharacterMilos)[3] || (getCharacterCurrentParams(kCharacterMilos)[3] = _currentGameSessionTicks + 45,
-																  _currentGameSessionTicks != -45)) {
-				if (getCharacterCurrentParams(kCharacterMilos)[3] >= _currentGameSessionTicks) {
+			if (getCharacterCurrentParams(kCharacterMilos)[3] || (getCharacterCurrentParams(kCharacterMilos)[3] = _realTime + 45,
+																  _realTime != -45)) {
+				if (getCharacterCurrentParams(kCharacterMilos)[3] >= _realTime) {
 					if (checkCathDir(kCarRestaurant, 70) && !getCharacterCurrentParams(kCharacterMilos)[1]) {
-						if (getCharacterCurrentParams(kCharacterMilos)[4] || (getCharacterCurrentParams(kCharacterMilos)[4] = _currentGameSessionTicks + 45,
-																			  _currentGameSessionTicks != -45)) {
-							if (getCharacterCurrentParams(kCharacterMilos)[4] >= _currentGameSessionTicks)
+						if (getCharacterCurrentParams(kCharacterMilos)[4] || (getCharacterCurrentParams(kCharacterMilos)[4] = _realTime + 45,
+																			  _realTime != -45)) {
+							if (getCharacterCurrentParams(kCharacterMilos)[4] >= _realTime)
 								break;
 
 							getCharacterCurrentParams(kCharacterMilos)[4] = 0x7FFFFFFF;
@@ -1071,9 +1071,9 @@ void LogicManager::HAND_Milos_AtDinner(HAND_PARAMS) {
 		}
 
 		if (checkCathDir(kCarRestaurant, 70) && !getCharacterCurrentParams(kCharacterMilos)[1]) {
-			if (getCharacterCurrentParams(kCharacterMilos)[4] || (getCharacterCurrentParams(kCharacterMilos)[4] = _currentGameSessionTicks + 45,
-																  _currentGameSessionTicks != -45)) {
-				if (getCharacterCurrentParams(kCharacterMilos)[4] >= _currentGameSessionTicks)
+			if (getCharacterCurrentParams(kCharacterMilos)[4] || (getCharacterCurrentParams(kCharacterMilos)[4] = _realTime + 45,
+																  _realTime != -45)) {
+				if (getCharacterCurrentParams(kCharacterMilos)[4] >= _realTime)
 					break;
 
 				getCharacterCurrentParams(kCharacterMilos)[4] = 0x7FFFFFFF;
@@ -1101,9 +1101,9 @@ void LogicManager::HAND_Milos_AtDinner(HAND_PARAMS) {
 		getCharacterCurrentParams(kCharacterMilos)[0] = 1;
 
 		if (checkCathDir(kCarRestaurant, 70) && !getCharacterCurrentParams(kCharacterMilos)[1]) {
-			if (getCharacterCurrentParams(kCharacterMilos)[4] || (getCharacterCurrentParams(kCharacterMilos)[4] = _currentGameSessionTicks + 45,
-																  _currentGameSessionTicks != -45)) {
-				if (getCharacterCurrentParams(kCharacterMilos)[4] >= _currentGameSessionTicks)
+			if (getCharacterCurrentParams(kCharacterMilos)[4] || (getCharacterCurrentParams(kCharacterMilos)[4] = _realTime + 45,
+																  _realTime != -45)) {
+				if (getCharacterCurrentParams(kCharacterMilos)[4] >= _realTime)
 					break;
 
 				getCharacterCurrentParams(kCharacterMilos)[4] = 0x7FFFFFFF;
@@ -1358,7 +1358,7 @@ void LogicManager::HAND_Milos_InPart2(HAND_PARAMS) {
 		setDoor(38, kCharacterMilos, 3, 10, 9);
 		break;
 	case 17:
-		if (!_gameEvents[kEventMilosCompartmentVisitAugust] && !checkLoc(kCharacterCath, kCarRedSleeping) && getCharacterCurrentParams(kCharacterMilos)[0]) {
+		if (!_doneNIS[kEventMilosCompartmentVisitAugust] && !checkLoc(kCharacterCath, kCarRedSleeping) && getCharacterCurrentParams(kCharacterMilos)[0]) {
 			CONS_Milos_OnRearPlat(0, 0, 0, 0);
 		}
 
@@ -1402,7 +1402,7 @@ void LogicManager::CONS_Milos_StartPart3(CONS_PARAMS) {
 void LogicManager::HAND_Milos_StartPart3(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
-		if (_gameEvents[kEventMilosCompartmentVisitAugust]) {
+		if (_doneNIS[kEventMilosCompartmentVisitAugust]) {
 			CONS_Milos_Unfriendly(0, 0, 0, 0);
 		} else {
 			CONS_Milos_OnRearPlat3(0, 0, 0, 0);
@@ -1518,9 +1518,9 @@ void LogicManager::HAND_Milos_Unfriendly(HAND_PARAMS) {
 		}
 
 		if (getCharacterCurrentParams(kCharacterMilos)[0]) {
-			if (getCharacterCurrentParams(kCharacterMilos)[4] || (getCharacterCurrentParams(kCharacterMilos)[4] = _currentGameSessionTicks + 75,
-																  _currentGameSessionTicks != -75)) {
-				if (getCharacterCurrentParams(kCharacterMilos)[4] >= _currentGameSessionTicks)
+			if (getCharacterCurrentParams(kCharacterMilos)[4] || (getCharacterCurrentParams(kCharacterMilos)[4] = _realTime + 75,
+																  _realTime != -75)) {
+				if (getCharacterCurrentParams(kCharacterMilos)[4] >= _realTime)
 					break;
 
 				getCharacterCurrentParams(kCharacterMilos)[4] = 0x7FFFFFFF;
@@ -1560,7 +1560,7 @@ void LogicManager::HAND_Milos_Unfriendly(HAND_PARAMS) {
 		break;
 	case 9:
 		setDoor(38, kCharacterMilos, 3, 0, 0);
-		if (_gameEvents[kEventMilosCompartmentVisitAugust] || _gameTime >= 2106000) {
+		if (_doneNIS[kEventMilosCompartmentVisitAugust] || _gameTime >= 2106000) {
 			getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 12;
 			MilosCall(&LogicManager::CONS_Milos_DoDialog, "LIB013", 0, 0, 0);
 		} else {
@@ -1577,7 +1577,7 @@ void LogicManager::HAND_Milos_Unfriendly(HAND_PARAMS) {
 		setDoor(38, kCharacterMilos, 3, 10, 9);
 		break;
 	case 17:
-		if (_gameEvents[kEventMilosCompartmentVisitAugust] || checkLoc(kCharacterCath, kCarRedSleeping) || !getCharacterCurrentParams(kCharacterMilos)[2] || _gameTime >= 2106000) {
+		if (_doneNIS[kEventMilosCompartmentVisitAugust] || checkLoc(kCharacterCath, kCarRedSleeping) || !getCharacterCurrentParams(kCharacterMilos)[2] || _gameTime >= 2106000) {
 			if (getCharacterCurrentParams(kCharacterMilos)[1] || getCharacterCurrentParams(kCharacterMilos)[0]) {
 				setDoor(38, kCharacterMilos, 3, 10, 9);
 				getCharacterCurrentParams(kCharacterMilos)[1] = 0;
@@ -1639,7 +1639,7 @@ void LogicManager::HAND_Milos_Unfriendly(HAND_PARAMS) {
 			CONS_Milos_Friendly(0, 0, 0, 0);
 			break;
 		case 6:
-			if (_gameEvents[kEventMilosCompartmentVisitAugust] || _gameTime >= 2106000) {
+			if (_doneNIS[kEventMilosCompartmentVisitAugust] || _gameTime >= 2106000) {
 				getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 8;
 				MilosCall(&LogicManager::CONS_Milos_DoDialog, "Mil1117A", 0, 0, 0);
 			} else {
@@ -1694,7 +1694,7 @@ void LogicManager::CONS_Milos_Friendly(CONS_PARAMS) {
 void LogicManager::HAND_Milos_Friendly(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
-		if (!_gameEvents[kEventMilosCompartmentVisitTyler] && !_gameProgress[kProgressField54] && !getCharacterParams(kCharacterMilos, 8)[3]) {
+		if (!_doneNIS[kEventMilosCompartmentVisitTyler] && !_globals[kProgressField54] && !getCharacterParams(kCharacterMilos, 8)[3]) {
 			bool skip = false;
 
 			if (!getCharacterCurrentParams(kCharacterMilos)[2]) {
@@ -1714,9 +1714,9 @@ void LogicManager::HAND_Milos_Friendly(HAND_PARAMS) {
 		}
 
 		if (getCharacterCurrentParams(kCharacterMilos)[0]) {
-			if (getCharacterCurrentParams(kCharacterMilos)[3] || (getCharacterCurrentParams(kCharacterMilos)[3] = _currentGameSessionTicks + 75,
-																	_currentGameSessionTicks != -75)) {
-				if (getCharacterCurrentParams(kCharacterMilos)[3] >= _currentGameSessionTicks)
+			if (getCharacterCurrentParams(kCharacterMilos)[3] || (getCharacterCurrentParams(kCharacterMilos)[3] = _realTime + 75,
+																	_realTime != -75)) {
+				if (getCharacterCurrentParams(kCharacterMilos)[3] >= _realTime)
 					break;
 
 				getCharacterCurrentParams(kCharacterMilos)[3] = 0x7FFFFFFF;
@@ -1756,7 +1756,7 @@ void LogicManager::HAND_Milos_Friendly(HAND_PARAMS) {
 		break;
 	case 12:
 		setDoor(38, kCharacterMilos, 3, 10, 9);
-		if (!_gameEvents[kEventMilosCompartmentVisitTyler] && !_gameProgress[kProgressField54] && !getCharacterParams(kCharacterMilos, 8)[3]) {
+		if (!_doneNIS[kEventMilosCompartmentVisitTyler] && !_globals[kProgressField54] && !getCharacterParams(kCharacterMilos, 8)[3]) {
 			send(kCharacterMilos, kCharacterVesna, 155913424, 0);
 		}
 
@@ -1777,7 +1777,7 @@ void LogicManager::HAND_Milos_Friendly(HAND_PARAMS) {
 				getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 3;
 				MilosCall(&LogicManager::CONS_Milos_DoDialog, "VES1015A", 0, 0, 0);
 			} else {
-				if (_gameEvents[kEventMilosCompartmentVisitTyler] || getCharacterParams(kCharacterMilos, 8)[3]) {
+				if (_doneNIS[kEventMilosCompartmentVisitTyler] || getCharacterParams(kCharacterMilos, 8)[3]) {
 					setDoor(38, kCharacterMilos, 1, 10, 9);
 					break;
 				}
@@ -1993,21 +1993,21 @@ void LogicManager::HAND_Milos_Conspiring(HAND_PARAMS) {
 					getCharacterCurrentParams(kCharacterMilos)[2] = 1;
 					playDialog(kCharacterMilos, "Mil4013", -1, 0);
 					if (nearChar(kCharacterMilos, kCharacterCath, 2000))
-						_gameProgress[kProgressField94] = 1;
+						_globals[kProgressField94] = 1;
 				}
 
 				if (_gameTime > 2360700 && !getCharacterCurrentParams(kCharacterMilos)[3]) {
 					getCharacterCurrentParams(kCharacterMilos)[3] = 1;
 					playDialog(kCharacterMilos, "Mil4014", -1, 0);
 					if (nearChar(kCharacterMilos, kCharacterCath, 2000))
-						_gameProgress[kProgressField94] = 1;
+						_globals[kProgressField94] = 1;
 				}
 
 				if (_gameTime > 2370600 && !getCharacterCurrentParams(kCharacterMilos)[4]) {
 					getCharacterCurrentParams(kCharacterMilos)[4] = 1;
 					playDialog(kCharacterMilos, "Mil4015", -1, 0);
 					if (nearChar(kCharacterMilos, kCharacterCath, 2000))
-						_gameProgress[kProgressField94] = 1;
+						_globals[kProgressField94] = 1;
 				}
 
 				if (_gameTime > 2407500 && !getCharacterCurrentParams(kCharacterMilos)[5]) {
@@ -2193,7 +2193,7 @@ void LogicManager::CONS_Milos_RunningTrain(CONS_PARAMS) {
 void LogicManager::HAND_Milos_RunningTrain(HAND_PARAMS) {
 	switch (msg->action) {
 	case 2:
-		if (_gameProgress[kProgressIsDayTime]) {
+		if (_globals[kProgressIsDayTime]) {
 			endGame(0, 0, 52, true);
 		} else {
 			getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 6;
@@ -2204,7 +2204,7 @@ void LogicManager::HAND_Milos_RunningTrain(HAND_PARAMS) {
 	case 18:
 		switch (getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8]) {
 		case 1:
-			playNIS(((_gameProgress[kProgressIsDayTime] == kProgressField0) + kEventLocomotiveMilosShovelingDay));
+			playNIS(((_globals[kProgressIsDayTime] == kProgressField0) + kEventLocomotiveMilosShovelingDay));
 			cleanNIS();
 			break;
 		case 2:
@@ -2215,7 +2215,7 @@ void LogicManager::HAND_Milos_RunningTrain(HAND_PARAMS) {
 				endDialog("ARRIVE");
 
 			_engine->getSoundManager()->endAmbient();
-			playNIS(((_gameProgress[kProgressIsDayTime] == kProgressField0) + kEventLocomotiveMilosDay));
+			playNIS(((_globals[kProgressIsDayTime] == kProgressField0) + kEventLocomotiveMilosDay));
 			claimNISLink(kCharacterMilos);
 			bumpCath(kCarCoalTender, 1, 255);
 			break;
@@ -2246,9 +2246,9 @@ void LogicManager::HAND_Milos_RunningTrain(HAND_PARAMS) {
 
 		break;
 	case 168646401:
-		if (_gameEvents[kEventLocomotiveMilosShovelingDay] || _gameEvents[kEventLocomotiveMilosShovelingNight]) {
-			if (!_gameEvents[kEventLocomotiveMilosDay] && !_gameEvents[kEventLocomotiveMilosNight]) {
-				if (_gameProgress[kProgressIsDayTime] && _gameTime < 2943000)
+		if (_doneNIS[kEventLocomotiveMilosShovelingDay] || _doneNIS[kEventLocomotiveMilosShovelingNight]) {
+			if (!_doneNIS[kEventLocomotiveMilosDay] && !_doneNIS[kEventLocomotiveMilosNight]) {
+				if (_globals[kProgressIsDayTime] && _gameTime < 2943000)
 					_gameTime = 2943000;
 				getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 2;
 				MilosCall(&LogicManager::CONS_Milos_SaveGame, 2, kEventLocomotiveMilosDay, 0, 0);
@@ -2260,7 +2260,7 @@ void LogicManager::HAND_Milos_RunningTrain(HAND_PARAMS) {
 
 		break;
 	case 169773228:
-		if (_gameProgress[kProgressIsDayTime]) {
+		if (_globals[kProgressIsDayTime]) {
 			fadeDialog(kCharacterMilos);
 			if (_gameTime < 2949300)
 				_gameTime = 2949300;
diff --git a/engines/lastexpress/characters/monsieur.cpp b/engines/lastexpress/characters/monsieur.cpp
index fbafb29faf4..53dbe4f235a 100644
--- a/engines/lastexpress/characters/monsieur.cpp
+++ b/engines/lastexpress/characters/monsieur.cpp
@@ -403,7 +403,7 @@ void LogicManager::HAND_Monsieur_GoDining(HAND_PARAMS) {
 		break;
 	case 12:
 		if (getCharacterCurrentParams(kCharacterMonsieur)[0]) {
-			if (_gameProgress[kProgressChapter] == 4) {
+			if (_globals[kProgressChapter] == 4) {
 				setDoor(34, kCharacterCath, 0, 10, 9);
 				getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8] = 1;
 				MonsieurCall(&LogicManager::CONS_Monsieur_DoCorrOtis, "607Hc", 34, 0, 0);
@@ -445,9 +445,9 @@ void LogicManager::HAND_Monsieur_GoDining(HAND_PARAMS) {
 			MonsieurCall(&LogicManager::CONS_Monsieur_DoSeqOtis, "812US", 0, 0, 0);
 			break;
 		case 6:
-			if (_gameProgress[kProgressChapter] == 1) {
+			if (_globals[kProgressChapter] == 1) {
 				playDialog(kCharacterMonsieur, "MRB1075", -1, 60);
-			} else if (_gameProgress[kProgressChapter] == 3) {
+			} else if (_globals[kProgressChapter] == 3) {
 				playDialog(kCharacterMonsieur, "MRB3101", -1, 0);
 			}
 
@@ -773,8 +773,8 @@ void LogicManager::HAND_Monsieur_InSalon(HAND_PARAMS) {
 			fedEx(kCharacterMonsieur, kCharacterMonsieur, 18, 0);
 		} else {
 			if (getCharacterCurrentParams(kCharacterMonsieur)[4]) {
-				if (getCharacterCurrentParams(kCharacterMonsieur)[6] || (getCharacterCurrentParams(kCharacterMonsieur)[6] = _currentGameSessionTicks + 90, _currentGameSessionTicks != -90)) {
-					if (getCharacterCurrentParams(kCharacterMonsieur)[6] >= _currentGameSessionTicks)
+				if (getCharacterCurrentParams(kCharacterMonsieur)[6] || (getCharacterCurrentParams(kCharacterMonsieur)[6] = _realTime + 90, _realTime != -90)) {
+					if (getCharacterCurrentParams(kCharacterMonsieur)[6] >= _realTime)
 						break;
 
 					getCharacterCurrentParams(kCharacterMonsieur)[6] = 0x7FFFFFFF;
@@ -823,8 +823,8 @@ void LogicManager::HAND_Monsieur_CompLogic(HAND_PARAMS) {
 			fedEx(kCharacterMonsieur, kCharacterMonsieur, 18, 0);
 		} else {
 			if (getCharacterCurrentParams(kCharacterMonsieur)[1]) {
-				if (getCharacterCurrentParams(kCharacterMonsieur)[4] || (getCharacterCurrentParams(kCharacterMonsieur)[4] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
-					if (getCharacterCurrentParams(kCharacterMonsieur)[4] >= _currentGameSessionTicks)
+				if (getCharacterCurrentParams(kCharacterMonsieur)[4] || (getCharacterCurrentParams(kCharacterMonsieur)[4] = _realTime + 75, _realTime != -75)) {
+					if (getCharacterCurrentParams(kCharacterMonsieur)[4] >= _realTime)
 						break;
 
 					getCharacterCurrentParams(kCharacterMonsieur)[4] = 0x7FFFFFFF;
@@ -1604,7 +1604,7 @@ void LogicManager::HAND_Monsieur_ReturnComp4(HAND_PARAMS) {
 	case 0:
 		if (_gameTime <= 2470500 || getCharacterCurrentParams(kCharacterMonsieur)[0]) {
 			if (_gameTime > 2457000) {
-				if (_gameEvents[kEventAugustDrink]) {
+				if (_doneNIS[kEventAugustDrink]) {
 					send(kCharacterMonsieur, kCharacterAbbot, 159003408, 0);
 					getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8] = 1;
 					MonsieurCall(&LogicManager::CONS_Monsieur_GoSalon, 0, "102A", 0, 0);
@@ -1637,7 +1637,7 @@ void LogicManager::HAND_Monsieur_ReturnComp4(HAND_PARAMS) {
 		case 8:
 			if (_gameTime >= 2470500) {
 				CONS_Monsieur_Asleep4(0, 0, 0, 0);
-			} else if (_gameEvents[kEventAugustDrink]) {
+			} else if (_doneNIS[kEventAugustDrink]) {
 				getCharacter(kCharacterMonsieur).callbacks[getCharacter(kCharacterMonsieur).currentCall + 8] = 5;
 				MonsieurCall(&LogicManager::CONS_Monsieur_GoSalon, 0, "102A", 0, 0);
 			} else {
diff --git a/engines/lastexpress/characters/police.cpp b/engines/lastexpress/characters/police.cpp
index 9121e62f8ac..144ec32df32 100644
--- a/engines/lastexpress/characters/police.cpp
+++ b/engines/lastexpress/characters/police.cpp
@@ -569,8 +569,8 @@ void LogicManager::HAND_Police_TrappedCath(HAND_PARAMS) {
 	case 0:
 	{
 		if (!getCharacterCurrentParams(kCharacterPolice)[4] &&
-				(getCharacterCurrentParams(kCharacterPolice)[4] = _currentGameSessionTicks + 75, _currentGameSessionTicks == -75) ||
-			getCharacterCurrentParams(kCharacterPolice)[4] < _currentGameSessionTicks) {
+				(getCharacterCurrentParams(kCharacterPolice)[4] = _realTime + 75, _realTime == -75) ||
+			getCharacterCurrentParams(kCharacterPolice)[4] < _realTime) {
 			if (!cathOutHisWindow() && checkDoor(getCharacterCurrentParams(kCharacterPolice)[2]) != 1) {
 				getCharacter(kCharacterPolice).callbacks[getCharacter(kCharacterPolice).currentCall + 8] = 2;
 				PoliceCall(&LogicManager::CONS_Police_SaveGame, 2, kEventGendarmesArrestation, 0, 0);
@@ -581,20 +581,20 @@ void LogicManager::HAND_Police_TrappedCath(HAND_PARAMS) {
 		bool skip = false; // Horrible way to unroll a goto...
 
 		if (!getCharacterCurrentParams(kCharacterPolice)[5]) {
-			getCharacterCurrentParams(kCharacterPolice)[5] = _currentGameSessionTicks + 150;
-			if (_currentGameSessionTicks == -150) {
+			getCharacterCurrentParams(kCharacterPolice)[5] = _realTime + 150;
+			if (_realTime == -150) {
 				skip = true;
 				playDialog(kCharacterPolice, "POL1046A", 16, 0);
 			}
 		}
 
-		if (!skip && getCharacterCurrentParams(kCharacterPolice)[5] < _currentGameSessionTicks) {
+		if (!skip && getCharacterCurrentParams(kCharacterPolice)[5] < _realTime) {
 			getCharacterCurrentParams(kCharacterPolice)[5] = 0x7FFFFFFF;
 			playDialog(kCharacterPolice, "POL1046A", 16, 0);
 		}
 
-		if (getCharacterCurrentParams(kCharacterPolice)[6] || (getCharacterCurrentParams(kCharacterPolice)[6] = _currentGameSessionTicks + 300, _currentGameSessionTicks != -300)) {
-			if (getCharacterCurrentParams(kCharacterPolice)[6] >= _currentGameSessionTicks)
+		if (getCharacterCurrentParams(kCharacterPolice)[6] || (getCharacterCurrentParams(kCharacterPolice)[6] = _realTime + 300, _realTime != -300)) {
+			if (getCharacterCurrentParams(kCharacterPolice)[6] >= _realTime)
 				break;
 
 			getCharacterCurrentParams(kCharacterPolice)[6] = 0x7FFFFFFF;
@@ -610,7 +610,7 @@ void LogicManager::HAND_Police_TrappedCath(HAND_PARAMS) {
 			if (cathOutHisWindow())
 				bumpCath(kCarGreenSleeping, 49, 255);
 			playDialog(kCharacterPolice, "LIB017", 16, 0);
-			if (_gameProgress[kProgressJacket] == 1) {
+			if (_globals[kProgressJacket] == 1) {
 				getCharacter(kCharacterPolice).callbacks[getCharacter(kCharacterPolice).currentCall + 8] = 3;
 				PoliceCall(&LogicManager::CONS_Police_SaveGame, 2, kEventMertensBloodJacket, 0, 0);
 			} else {
@@ -715,7 +715,7 @@ void LogicManager::HAND_Police_SearchTrain(HAND_PARAMS) {
 		getCharacter(kCharacterPolice).characterPosition.car = kCarGreenSleeping;
 		getCharacter(kCharacterPolice).characterPosition.location = 0;
 		getCharacter(kCharacterPolice).characterPosition.position = 540;
-		_gameProgress[kProgressField14] = 29;
+		_globals[kProgressField14] = 29;
 		getCharacter(kCharacterPolice).callbacks[getCharacter(kCharacterPolice).currentCall + 8] = 1;
 		PoliceCall(&LogicManager::CONS_Police_DoWalk, 3, 5540, 0, 0);
 		break;
@@ -755,7 +755,7 @@ void LogicManager::HAND_Police_SearchTrain(HAND_PARAMS) {
 			break;
 		case 9:
 			if (getCharacter(kCharacterCath).characterPosition.car == 3) {
-				_gameProgress[kProgressField14] = 0;
+				_globals[kProgressField14] = 0;
 				endGraphics(kCharacterPolice);
 				send(kCharacterPolice, kCharacterTrainM, 168710784, 0);
 				CONS_Police_SearchDone(0, 0, 0, 0);
@@ -822,7 +822,7 @@ void LogicManager::HAND_Police_SearchTrain(HAND_PARAMS) {
 			PoliceCall(&LogicManager::CONS_Police_DoWalk, 4, 9460, 0, 0);
 			break;
 		case 24:
-			_gameProgress[kProgressField14] = 0;
+			_globals[kProgressField14] = 0;
 			endGraphics(kCharacterPolice);
 			send(kCharacterPolice, kCharacterTrainM, 168710784, 0);
 			CONS_Police_SearchDone(0, 0, 0, 0);
diff --git a/engines/lastexpress/characters/rebecca.cpp b/engines/lastexpress/characters/rebecca.cpp
index 437675dc794..4d6b7ff801c 100644
--- a/engines/lastexpress/characters/rebecca.cpp
+++ b/engines/lastexpress/characters/rebecca.cpp
@@ -605,7 +605,7 @@ void LogicManager::HAND_Rebecca_GotoDinner(HAND_PARAMS) {
 		case 5:
 			startCycOtis(kCharacterRebecca, "012A");
 
-			if (_gameProgress[kProgressChapter] == 3)
+			if (_globals[kProgressChapter] == 3)
 				playDialog(kCharacterRebecca, "REB3000", -1, 0);
 
 			send(kCharacterRebecca, kCharacterHeadWait, 269479296, 0);
@@ -676,7 +676,7 @@ void LogicManager::HAND_Rebecca_GotoSalon(HAND_PARAMS) {
 			getCharacter(kCharacterRebecca).characterPosition.position = 1540;
 			getCharacter(kCharacterRebecca).characterPosition.location = 0;
 
-			if (_gameProgress[kProgressChapter] == 3)
+			if (_globals[kProgressChapter] == 3)
 				playDialog(kCharacterRebecca, "Reb3005", -1, 75);
 
 			if (getCharacterCurrentParams(kCharacterRebecca)[0]) {
@@ -873,8 +873,8 @@ void LogicManager::HAND_Rebecca_CompLogic(HAND_PARAMS) {
 		bool skip = false;
 
 		if (getCharacterCurrentParams(kCharacterRebecca)[1]) {
-			if (getCharacterCurrentParams(kCharacterRebecca)[5] || (getCharacterCurrentParams(kCharacterRebecca)[5] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
-				if (getCharacterCurrentParams(kCharacterRebecca)[5] >= _currentGameSessionTicks) {
+			if (getCharacterCurrentParams(kCharacterRebecca)[5] || (getCharacterCurrentParams(kCharacterRebecca)[5] = _realTime + 75, _realTime != -75)) {
+				if (getCharacterCurrentParams(kCharacterRebecca)[5] >= _realTime) {
 					skip = true;
 				}
 
@@ -895,7 +895,7 @@ void LogicManager::HAND_Rebecca_CompLogic(HAND_PARAMS) {
 			getCharacterCurrentParams(kCharacterRebecca)[5] = 0;
 		}
 
-		if (_gameProgress[kProgressChapter] == 1 && !getCharacterParams(kCharacterRebecca, 8)[2]) {
+		if (_globals[kProgressChapter] == 1 && !getCharacterParams(kCharacterRebecca, 8)[2]) {
 			if (getCharacterCurrentParams(kCharacterRebecca)[6] != 0x7FFFFFFF && _gameTime > 1174500) {
 				if (_gameTime > 1183500) {
 					getCharacterCurrentParams(kCharacterRebecca)[6] = 0x7FFFFFFF;
@@ -929,7 +929,7 @@ void LogicManager::HAND_Rebecca_CompLogic(HAND_PARAMS) {
 					break;
 				}
 			}
-		} else if (_gameProgress[kProgressChapter] == 3 && !getCharacterParams(kCharacterRebecca, 8)[3] && getCharacterCurrentParams(kCharacterRebecca)[7] != 0x7FFFFFFF && _gameTime > 2097000) {
+		} else if (_globals[kProgressChapter] == 3 && !getCharacterParams(kCharacterRebecca, 8)[3] && getCharacterCurrentParams(kCharacterRebecca)[7] != 0x7FFFFFFF && _gameTime > 2097000) {
 			if (_gameTime > 2106000) {
 				getCharacterCurrentParams(kCharacterRebecca)[7] = 0x7FFFFFFF;
 				getCharacterParams(kCharacterRebecca, 8)[3] = 1;
@@ -1198,7 +1198,7 @@ void LogicManager::HAND_Rebecca_InSalon1A(HAND_PARAMS) {
 			if (_gameTime > 1080000) {
 				getCharacterCurrentParams(kCharacterRebecca)[3] = 0x7FFFFFFF;
 				if (inSalon(kCharacterCath))
-					_gameProgress[kProgressFieldB8] = 1;
+					_globals[kProgressFieldB8] = 1;
 
 				getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 4;
 				RebeccaCall(&LogicManager::CONS_Rebecca_DoDialog, "REB1012", 0, 0, 0);
@@ -1209,7 +1209,7 @@ void LogicManager::HAND_Rebecca_InSalon1A(HAND_PARAMS) {
 				getCharacterCurrentParams(kCharacterRebecca)[3] = _gameTime + 150;
 				if (_gameTime == -150) {
 					if (inSalon(kCharacterCath))
-						_gameProgress[kProgressFieldB8] = 1;
+						_globals[kProgressFieldB8] = 1;
 
 					getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 4;
 					RebeccaCall(&LogicManager::CONS_Rebecca_DoDialog, "REB1012", 0, 0, 0);
@@ -1230,8 +1230,8 @@ void LogicManager::HAND_Rebecca_InSalon1A(HAND_PARAMS) {
 			}
 
 			if (getCharacterCurrentParams(kCharacterRebecca)[1]) {
-				if (getCharacterCurrentParams(kCharacterRebecca)[5] || (getCharacterCurrentParams(kCharacterRebecca)[5] = _currentGameSessionTicks + 90, _currentGameSessionTicks != -90)) {
-					if (getCharacterCurrentParams(kCharacterRebecca)[5] >= _currentGameSessionTicks)
+				if (getCharacterCurrentParams(kCharacterRebecca)[5] || (getCharacterCurrentParams(kCharacterRebecca)[5] = _realTime + 90, _realTime != -90)) {
+					if (getCharacterCurrentParams(kCharacterRebecca)[5] >= _realTime)
 						break;
 
 					getCharacterCurrentParams(kCharacterRebecca)[5] = 0x7FFFFFFF;
@@ -1245,7 +1245,7 @@ void LogicManager::HAND_Rebecca_InSalon1A(HAND_PARAMS) {
 			getCharacterCurrentParams(kCharacterRebecca)[3] = 0x7FFFFFFF;
 
 			if (inSalon(kCharacterCath))
-				_gameProgress[kProgressFieldB8] = 1;
+				_globals[kProgressFieldB8] = 1;
 
 			getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 4;
 			RebeccaCall(&LogicManager::CONS_Rebecca_DoDialog, "REB1012", 0, 0, 0);
@@ -1285,8 +1285,8 @@ void LogicManager::HAND_Rebecca_InSalon1A(HAND_PARAMS) {
 			}
 
 			if (getCharacterCurrentParams(kCharacterRebecca)[1]) {
-				if (getCharacterCurrentParams(kCharacterRebecca)[5] || (getCharacterCurrentParams(kCharacterRebecca)[5] = _currentGameSessionTicks + 90, _currentGameSessionTicks != -90)) {
-					if (getCharacterCurrentParams(kCharacterRebecca)[5] >= _currentGameSessionTicks)
+				if (getCharacterCurrentParams(kCharacterRebecca)[5] || (getCharacterCurrentParams(kCharacterRebecca)[5] = _realTime + 90, _realTime != -90)) {
+					if (getCharacterCurrentParams(kCharacterRebecca)[5] >= _realTime)
 						break;
 
 					getCharacterCurrentParams(kCharacterRebecca)[5] = 0x7FFFFFFF;
@@ -1299,12 +1299,12 @@ void LogicManager::HAND_Rebecca_InSalon1A(HAND_PARAMS) {
 
 			break;
 		case 5:
-			_gameProgress[kProgressFieldB4] = 1;
+			_globals[kProgressFieldB4] = 1;
 			getCharacterCurrentParams(kCharacterRebecca)[0] = 0;
 
 			if (getCharacterCurrentParams(kCharacterRebecca)[1]) {
-				if (getCharacterCurrentParams(kCharacterRebecca)[5] || (getCharacterCurrentParams(kCharacterRebecca)[5] = _currentGameSessionTicks + 90, _currentGameSessionTicks != -90)) {
-					if (getCharacterCurrentParams(kCharacterRebecca)[5] >= _currentGameSessionTicks)
+				if (getCharacterCurrentParams(kCharacterRebecca)[5] || (getCharacterCurrentParams(kCharacterRebecca)[5] = _realTime + 90, _realTime != -90)) {
+					if (getCharacterCurrentParams(kCharacterRebecca)[5] >= _realTime)
 						break;
 
 					getCharacterCurrentParams(kCharacterRebecca)[5] = 0x7FFFFFFF;
@@ -1483,7 +1483,7 @@ void LogicManager::HAND_Rebecca_GoDinner(HAND_PARAMS) {
 
 			break;
 		case 3:
-			_gameProgress[kProgressFieldBC] = 1;
+			_globals[kProgressFieldBC] = 1;
 
 			if (!inDiningRoom(kCharacterAnna)) {
 				getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 5;
@@ -1573,8 +1573,8 @@ void LogicManager::HAND_Rebecca_InSalon1B(HAND_PARAMS) {
 		}
 
 		if (getCharacterCurrentParams(kCharacterRebecca)[0]) {
-			if (getCharacterCurrentParams(kCharacterRebecca)[2] || (getCharacterCurrentParams(kCharacterRebecca)[2] = _currentGameSessionTicks + 90, _currentGameSessionTicks != -90)) {
-				if (getCharacterCurrentParams(kCharacterRebecca)[2] >= _currentGameSessionTicks)
+			if (getCharacterCurrentParams(kCharacterRebecca)[2] || (getCharacterCurrentParams(kCharacterRebecca)[2] = _realTime + 90, _realTime != -90)) {
+				if (getCharacterCurrentParams(kCharacterRebecca)[2] >= _realTime)
 					break;
 
 				getCharacterCurrentParams(kCharacterRebecca)[2] = 0x7FFFFFFF;
@@ -1715,7 +1715,7 @@ void LogicManager::HAND_Rebecca_InSalon2(HAND_PARAMS) {
 			if (_gameTime > 15803100) {
 				getCharacterCurrentParams(kCharacterRebecca)[3] = 0x7FFFFFFF;
 				playDialog(kCharacterRebecca, "Reb2001", -1, 0);
-				_gameProgress[kProgressFieldB0] = 1;
+				_globals[kProgressFieldB0] = 1;
 				getCharacterCurrentParams(kCharacterRebecca)[1] = 1;
 				skip = true;
 			}
@@ -1726,7 +1726,7 @@ void LogicManager::HAND_Rebecca_InSalon2(HAND_PARAMS) {
 					if (_gameTime == -450) {
 						skip = true;
 						playDialog(kCharacterRebecca, "Reb2001", -1, 0);
-						_gameProgress[kProgressFieldB0] = 1;
+						_globals[kProgressFieldB0] = 1;
 						getCharacterCurrentParams(kCharacterRebecca)[1] = 1;
 					}
 				}
@@ -1734,7 +1734,7 @@ void LogicManager::HAND_Rebecca_InSalon2(HAND_PARAMS) {
 				if (!skip && getCharacterCurrentParams(kCharacterRebecca)[3] < _gameTime) {
 					getCharacterCurrentParams(kCharacterRebecca)[3] = 0x7FFFFFFF;
 					playDialog(kCharacterRebecca, "Reb2001", -1, 0);
-					_gameProgress[kProgressFieldB0] = 1;
+					_globals[kProgressFieldB0] = 1;
 					getCharacterCurrentParams(kCharacterRebecca)[1] = 1;
 				}
 			}
@@ -2666,8 +2666,8 @@ void LogicManager::HAND_Rebecca_Hiding(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
 		if (getCharacterCurrentParams(kCharacterRebecca)[0]) {
-			if (getCharacterCurrentParams(kCharacterRebecca)[2] || (getCharacterCurrentParams(kCharacterRebecca)[2] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
-				if (getCharacterCurrentParams(kCharacterRebecca)[2] >= _currentGameSessionTicks)
+			if (getCharacterCurrentParams(kCharacterRebecca)[2] || (getCharacterCurrentParams(kCharacterRebecca)[2] = _realTime + 75, _realTime != -75)) {
+				if (getCharacterCurrentParams(kCharacterRebecca)[2] >= _realTime)
 					break;
 
 				getCharacterCurrentParams(kCharacterRebecca)[2] = 0x7FFFFFFF;
diff --git a/engines/lastexpress/characters/tablec.cpp b/engines/lastexpress/characters/tablec.cpp
index 5eccf09ac28..3019da301ad 100644
--- a/engines/lastexpress/characters/tablec.cpp
+++ b/engines/lastexpress/characters/tablec.cpp
@@ -173,17 +173,17 @@ void LogicManager::HAND_TableC_Idling(HAND_PARAMS) {
 	getCharacterCurrentParams(kCharacterTableC);
 	switch (msg->action) {
 	case 0:
-		if (_gameProgress[kProgressChapter] == 1) {
+		if (_globals[kProgressChapter] == 1) {
 			if (_gameTime > 1165500 && !getCharacterCurrentParams(kCharacterTableC)[0]) {
 				getCharacterCurrentParams(kCharacterTableC)[0] = 1;
 				fadeDialog(kCharacterTableC);
 			}
-		} else if (_gameProgress[kProgressChapter] == 3) {
+		} else if (_globals[kProgressChapter] == 3) {
 			if (_gameTime > 2052000 && !getCharacterCurrentParams(kCharacterTableC)[1]) {
 				getCharacterCurrentParams(kCharacterTableC)[1] = 1;
 				fadeDialog(kCharacterTableC);
 			}
-		} else if (_gameProgress[kProgressChapter] == 4 && _gameTime > 2488500 && !getCharacterCurrentParams(kCharacterTableC)[2]) {
+		} else if (_globals[kProgressChapter] == 4 && _gameTime > 2488500 && !getCharacterCurrentParams(kCharacterTableC)[2]) {
 			getCharacterCurrentParams(kCharacterTableC)[2] = 1;
 			fadeDialog(kCharacterTableC);
 		}
diff --git a/engines/lastexpress/characters/tatiana.cpp b/engines/lastexpress/characters/tatiana.cpp
index 7652f8a8302..9c69c10b0f0 100644
--- a/engines/lastexpress/characters/tatiana.cpp
+++ b/engines/lastexpress/characters/tatiana.cpp
@@ -345,9 +345,9 @@ void LogicManager::CONS_Tatiana_DoWaitRealTime(CONS_PARAMS) {
 void LogicManager::HAND_Tatiana_DoWaitRealTime(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
-		if (getCharacterCurrentParams(kCharacterTatiana)[1] || (getCharacterCurrentParams(kCharacterTatiana)[1] = _currentGameSessionTicks + getCharacterCurrentParams(kCharacterTatiana)[0],
-																_currentGameSessionTicks + getCharacterCurrentParams(kCharacterTatiana)[0] != 0)) {
-			if (getCharacterCurrentParams(kCharacterTatiana)[1] >= _currentGameSessionTicks)
+		if (getCharacterCurrentParams(kCharacterTatiana)[1] || (getCharacterCurrentParams(kCharacterTatiana)[1] = _realTime + getCharacterCurrentParams(kCharacterTatiana)[0],
+																_realTime + getCharacterCurrentParams(kCharacterTatiana)[0] != 0)) {
+			if (getCharacterCurrentParams(kCharacterTatiana)[1] >= _realTime)
 				break;
 
 			getCharacterCurrentParams(kCharacterTatiana)[1] = 0x7FFFFFFF;
@@ -481,7 +481,7 @@ void LogicManager::HAND_Tatiana_DoWalk(HAND_PARAMS) {
 
 		break;
 	case 5:
-		if (_gameEvents[kEventTatianaAskMatchSpeakRussian] || _gameEvents[kEventTatianaAskMatch] || _gameEvents[kEventVassiliSeizure]) {
+		if (_doneNIS[kEventTatianaAskMatchSpeakRussian] || _doneNIS[kEventTatianaAskMatch] || _doneNIS[kEventVassiliSeizure]) {
 			if (rnd(2) == 0) {
 				playDialog(kCharacterCath, "CAT1010A", -1, 0);
 			} else {
@@ -515,7 +515,7 @@ void LogicManager::HAND_Tatiana_EnterComp(HAND_PARAMS) {
 	case 12:
 		send(kCharacterTatiana, kCharacterCond2, 326348944, 0);
 
-		if (_gameProgress[kProgressChapter] != 1) {
+		if (_globals[kProgressChapter] != 1) {
 			startCycOtis(kCharacterTatiana, "673Fb");
 		} else {
 			startCycOtis(kCharacterTatiana, "603Fb");
@@ -537,7 +537,7 @@ void LogicManager::HAND_Tatiana_EnterComp(HAND_PARAMS) {
 
 		break;
 	case 69239528:
-		if (_gameProgress[kProgressChapter] == 1) {
+		if (_globals[kProgressChapter] == 1) {
 			getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 1;
 			TatianaCall(&LogicManager::CONS_Tatiana_DoEnterCorrOtis, "603Db", 33, 0, 0);
 		} else {
@@ -564,7 +564,7 @@ void LogicManager::CONS_Tatiana_ExitComp(CONS_PARAMS) {
 void LogicManager::HAND_Tatiana_ExitComp(HAND_PARAMS) {
 	switch (msg->action) {
 	case 12:
-		if (_gameProgress[kProgressChapter] == 1) {
+		if (_globals[kProgressChapter] == 1) {
 			getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 1;
 			TatianaCall(&LogicManager::CONS_Tatiana_DoCorrOtis, "603Bb", 33, 0, 0);
 		} else {
@@ -579,7 +579,7 @@ void LogicManager::HAND_Tatiana_ExitComp(HAND_PARAMS) {
 			getCharacter(kCharacterTatiana).characterPosition.location = 0;
 			send(kCharacterTatiana, kCharacterCond2, 292048641, 0);
 
-			if (_gameProgress[kProgressChapter] != 1) {
+			if (_globals[kProgressChapter] != 1) {
 				startCycOtis(kCharacterTatiana, "673Fb");
 			} else {
 				startCycOtis(kCharacterTatiana, "603Fb");
@@ -629,8 +629,8 @@ void LogicManager::HAND_Tatiana_CompLogic(HAND_PARAMS) {
 		}
 
 		if (getCharacterCurrentParams(kCharacterTatiana)[1]) {
-			if (getCharacterCurrentParams(kCharacterTatiana)[4] || (getCharacterCurrentParams(kCharacterTatiana)[4] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
-				if (getCharacterCurrentParams(kCharacterTatiana)[4] >= _currentGameSessionTicks)
+			if (getCharacterCurrentParams(kCharacterTatiana)[4] || (getCharacterCurrentParams(kCharacterTatiana)[4] = _realTime + 75, _realTime != -75)) {
+				if (getCharacterCurrentParams(kCharacterTatiana)[4] >= _realTime)
 					break;
 
 				getCharacterCurrentParams(kCharacterTatiana)[4] = 0x7FFFFFFF;
@@ -855,8 +855,8 @@ void LogicManager::HAND_Tatiana_AtDinner(HAND_PARAMS) {
 		if (!whoRunningDialog(kCharacterTatiana) && getCharacterCurrentParams(kCharacterTatiana)[3] && getCharacterCurrentParams(kCharacterTatiana)[2] < 2 && !dialogRunning("TAT1066")) {
 			bool skip1 = false;
 
-			if (getCharacterCurrentParams(kCharacterTatiana)[4] || (getCharacterCurrentParams(kCharacterTatiana)[4] = _currentGameSessionTicks + 450, _currentGameSessionTicks != -450)) {
-				if (getCharacterCurrentParams(kCharacterTatiana)[4] >= _currentGameSessionTicks) {
+			if (getCharacterCurrentParams(kCharacterTatiana)[4] || (getCharacterCurrentParams(kCharacterTatiana)[4] = _realTime + 450, _realTime != -450)) {
+				if (getCharacterCurrentParams(kCharacterTatiana)[4] >= _realTime) {
 					skip1 = true;
 				}
 
@@ -872,7 +872,7 @@ void LogicManager::HAND_Tatiana_AtDinner(HAND_PARAMS) {
 					playDialog(kCharacterTatiana, "TAT1069B", -1, 0);
 				}
 
-				_gameProgress[kProgressField64] = 1;
+				_globals[kProgressField64] = 1;
 				getCharacterCurrentParams(kCharacterTatiana)[2]++;
 				getCharacterCurrentParams(kCharacterTatiana)[4] = 0;
 			}
@@ -880,8 +880,8 @@ void LogicManager::HAND_Tatiana_AtDinner(HAND_PARAMS) {
 			bool skip2 = false;
 
 			if (checkCathDir(kCarRestaurant, 71)) {
-				if (getCharacterCurrentParams(kCharacterTatiana)[5] || (getCharacterCurrentParams(kCharacterTatiana)[5] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
-					if (getCharacterCurrentParams(kCharacterTatiana)[5] >= _currentGameSessionTicks) {
+				if (getCharacterCurrentParams(kCharacterTatiana)[5] || (getCharacterCurrentParams(kCharacterTatiana)[5] = _realTime + 75, _realTime != -75)) {
+					if (getCharacterCurrentParams(kCharacterTatiana)[5] >= _realTime) {
 						skip2 = true;
 					}
 
@@ -897,7 +897,7 @@ void LogicManager::HAND_Tatiana_AtDinner(HAND_PARAMS) {
 						playDialog(kCharacterTatiana, "TAT1069B", -1, 0);
 					}
 
-					_gameProgress[kProgressField64] = 1;
+					_globals[kProgressField64] = 1;
 					getCharacterCurrentParams(kCharacterTatiana)[2]++;
 					getCharacterCurrentParams(kCharacterTatiana)[5] = 0;
 				}
@@ -910,8 +910,8 @@ void LogicManager::HAND_Tatiana_AtDinner(HAND_PARAMS) {
 		}
 
 		if (getCharacterCurrentParams(kCharacterTatiana)[0]) {
-			if (getCharacterCurrentParams(kCharacterTatiana)[7] || (getCharacterCurrentParams(kCharacterTatiana)[7] = _currentGameSessionTicks + 90, _currentGameSessionTicks != -90)) {
-				if (getCharacterCurrentParams(kCharacterTatiana)[7] >= _currentGameSessionTicks)
+			if (getCharacterCurrentParams(kCharacterTatiana)[7] || (getCharacterCurrentParams(kCharacterTatiana)[7] = _realTime + 90, _realTime != -90)) {
+				if (getCharacterCurrentParams(kCharacterTatiana)[7] >= _realTime)
 					break;
 
 				getCharacterCurrentParams(kCharacterTatiana)[7] = 0x7FFFFFFF;
@@ -1058,7 +1058,7 @@ void LogicManager::HAND_Tatiana_ReturnToComp(HAND_PARAMS) {
 			break;
 		case 5:
 		case 6:
-			if (_gameProgress[kProgressField14] == 29) {
+			if (_globals[kProgressField14] == 29) {
 				getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 6;
 				TatianaCall(&LogicManager::CONS_Tatiana_CompLogic, _gameTime + 900, 0, 0, 0);
 			} else {
@@ -1091,7 +1091,7 @@ void LogicManager::HAND_Tatiana_GetSomeAir(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
 		if (getCharacterCurrentParams(kCharacterTatiana)[0] == 0x7FFFFFFF || _gameTime <= 1179000) {
-			if (!_gameEvents[kEventTatianaAskMatchSpeakRussian] && !_gameEvents[kEventTatianaAskMatch] && cathHasItem(kItemMatchBox) && onLowPlatform(kCharacterCath)) {
+			if (!_doneNIS[kEventTatianaAskMatchSpeakRussian] && !_doneNIS[kEventTatianaAskMatch] && cathHasItem(kItemMatchBox) && onLowPlatform(kCharacterCath)) {
 				setDoor(25, kCharacterTatiana, 1, 0, 1);
 				setDoor(23, kCharacterTatiana, 1, 0, 1);
 			}
@@ -1117,7 +1117,7 @@ void LogicManager::HAND_Tatiana_GetSomeAir(HAND_PARAMS) {
 			break;
 		}
 
-		if (!_gameEvents[kEventTatianaAskMatchSpeakRussian] && !_gameEvents[kEventTatianaAskMatch] || onLowPlatform(kCharacterCath) || !getCharacterCurrentParams(kCharacterTatiana)[0]) {
+		if (!_doneNIS[kEventTatianaAskMatchSpeakRussian] && !_doneNIS[kEventTatianaAskMatch] || onLowPlatform(kCharacterCath) || !getCharacterCurrentParams(kCharacterTatiana)[0]) {
 			getCharacterCurrentParams(kCharacterTatiana)[0] = _gameTime;
 			if (!_gameTime) {
 				setDoor(25, kCharacterCath, 0, 255, 255);
@@ -1138,7 +1138,7 @@ void LogicManager::HAND_Tatiana_GetSomeAir(HAND_PARAMS) {
 		}
 
 		if (getCharacterCurrentParams(kCharacterTatiana)[0] >= _gameTime) {
-			if (!_gameEvents[kEventTatianaAskMatchSpeakRussian] && !_gameEvents[kEventTatianaAskMatch] && cathHasItem(kItemMatchBox) && onLowPlatform(kCharacterCath)) {
+			if (!_doneNIS[kEventTatianaAskMatchSpeakRussian] && !_doneNIS[kEventTatianaAskMatch] && cathHasItem(kItemMatchBox) && onLowPlatform(kCharacterCath)) {
 				setDoor(25, kCharacterTatiana, 1, 0, 1);
 				setDoor(23, kCharacterTatiana, 1, 0, 1);
 			}
@@ -1192,7 +1192,7 @@ void LogicManager::HAND_Tatiana_GetSomeAir(HAND_PARAMS) {
 			blockView(kCharacterTatiana, kCarGreenSleeping, 71);
 			break;
 		case 3:
-			playNIS(((_gameEvents[kEventAlexeiSalonVassili] == 0) + kEventTatianaAskMatchSpeakRussian));
+			playNIS(((_doneNIS[kEventAlexeiSalonVassili] == 0) + kEventTatianaAskMatchSpeakRussian));
 			bumpCath(kCarGreenSleeping, 62, 255);
 			getCharacter(kCharacterTatiana).inventoryItem = 10;
 			setDoor(25, kCharacterCath, 0, 255, 255);
@@ -1359,7 +1359,7 @@ void LogicManager::CONS_Tatiana_BreakfastClick(CONS_PARAMS) {
 void LogicManager::HAND_Tatiana_BreakfastClick(HAND_PARAMS) {
 	switch (msg->action) {
 	case 12:
-		if (_gameEvents[kEventTatianaGivePoem]) {
+		if (_doneNIS[kEventTatianaGivePoem]) {
 			getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 1;
 			TatianaCall(&LogicManager::CONS_Tatiana_SaveGame, 2, kEventTatianaBreakfastAlexei, 0, 0);
 		} else {
@@ -1416,7 +1416,7 @@ void LogicManager::HAND_Tatiana_JoinAlexei(HAND_PARAMS) {
 		getCharacter(kCharacterTatiana).inventoryItem = 0;
 		getCharacter(kCharacterTatiana).characterPosition.location = 0;
 		send(kCharacterTatiana, kCharacterTableF, 103798704, "024D");
-		if (_gameEvents[kEventTatianaBreakfastAlexei] || _gameEvents[kEventTatianaBreakfast]) {
+		if (_doneNIS[kEventTatianaBreakfastAlexei] || _doneNIS[kEventTatianaBreakfast]) {
 			send(kCharacterTatiana, kCharacterAlexei, 236053296, 69);
 		} else {
 			send(kCharacterTatiana, kCharacterAlexei, 236053296, 0);
@@ -1540,10 +1540,10 @@ void LogicManager::HAND_Tatiana_StartPart3(HAND_PARAMS) {
 		getCharacter(kCharacterTatiana).clothes = 2;
 		setDoor(33, kCharacterCath, 1, 10, 9);
 		setDoor(49, kCharacterCath, 1, 10, 9);
-		_gameInventory[kItemFirebird].location = 2;
+		_items[kItemFirebird].floating = 2;
 
-		if (_gameEvents[kEventTatianaBreakfastGivePoem] || _gameEvents[kEventTatianaGivePoem] && !_gameEvents[kEventTatianaBreakfastAlexei]) {
-			_gameInventory[kItemParchemin].location = 2;
+		if (_doneNIS[kEventTatianaBreakfastGivePoem] || _doneNIS[kEventTatianaGivePoem] && !_doneNIS[kEventTatianaBreakfastAlexei]) {
+			_items[kItemParchemin].floating = 2;
 		}
 
 		break;
@@ -1566,13 +1566,13 @@ void LogicManager::HAND_Tatiana_PlayChess(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
 		if (!getCharacterCurrentParams(kCharacterTatiana)[1] && !getCharacterCurrentParams(kCharacterTatiana)[4]) {
-			getCharacterCurrentParams(kCharacterTatiana)[0] -= _gameTimeTicksDelta;
-			if (_gameTimeTicksDelta > getCharacterCurrentParams(kCharacterTatiana)[0]) {
+			getCharacterCurrentParams(kCharacterTatiana)[0] -= _timeSpeed;
+			if (_timeSpeed > getCharacterCurrentParams(kCharacterTatiana)[0]) {
 				startCycOtis(kCharacterTatiana, (char *)&getCharacterCurrentParams(kCharacterTatiana)[8]);
 				playDialog(kCharacterTatiana, (char *)&getCharacterCurrentParams(kCharacterTatiana)[5], -1, 0);
 
 				if (getCharacterCurrentParams(kCharacterTatiana)[2] == 4 && inSalon(kCharacterCath))
-					_gameProgress[kProgressField90] = 1;
+					_globals[kProgressField90] = 1;
 
 				getCharacterCurrentParams(kCharacterTatiana)[1] = 1;
 			}
@@ -1715,7 +1715,7 @@ void LogicManager::HAND_Tatiana_BeforeConcert(HAND_PARAMS) {
 	case 18:
 		switch (getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8]) {
 		case 1:
-			_gameInventory[kItemFirebird].location = 1;
+			_items[kItemFirebird].floating = 1;
 
 			if (inSuite(kCharacterCath, kCarRedSleeping, 7850))
 				bumpCathRDoor(33);
@@ -1755,7 +1755,7 @@ void LogicManager::CONS_Tatiana_Concert(CONS_PARAMS) {
 void LogicManager::HAND_Tatiana_Concert(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
-		if (!getCharacterCurrentParams(kCharacterTatiana)[0] && cathHasItem(kItemFirebird) && inSuite(kCharacterCath, kCarRedSleeping, 7850) && (_gameTime < 2133000 || _gameProgress[16])) {
+		if (!getCharacterCurrentParams(kCharacterTatiana)[0] && cathHasItem(kItemFirebird) && inSuite(kCharacterCath, kCarRedSleeping, 7850) && (_gameTime < 2133000 || _globals[16])) {
 			getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 1;
 			TatianaCall(&LogicManager::CONS_Tatiana_TrapCath, 0, 0, 0, 0);
 			break;
@@ -1829,7 +1829,7 @@ void LogicManager::HAND_Tatiana_LeaveConcert(HAND_PARAMS) {
 			if (cathHasItem(kItemFirebird)) {
 				playNIS(kEventTatianaCompartmentStealEgg);
 				takeCathItem(kItemFirebird);
-				_gameInventory[kItemFirebird].location = 2;
+				_items[kItemFirebird].floating = 2;
 			} else {
 				playNIS(kEventTatianaCompartment);
 			}
@@ -1858,14 +1858,14 @@ void LogicManager::CONS_Tatiana_AfterConcert(CONS_PARAMS) {
 void LogicManager::HAND_Tatiana_AfterConcert(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
-		if (_gameInventory[kItemFirebird].location != 1 && _gameInventory[kItemFirebird].location != 2) {
+		if (_items[kItemFirebird].floating != 1 && _items[kItemFirebird].floating != 2) {
 			if (!getCharacterCurrentParams(kCharacterTatiana)[2])
 				getCharacterCurrentParams(kCharacterTatiana)[2] = _gameTime + 900;
 
 			if (getCharacterCurrentParams(kCharacterTatiana)[3] != 0x7FFFFFFF && getCharacterCurrentParams(kCharacterTatiana)[2] < _gameTime) {
 				if (_gameTime > 2227500) {
 					getCharacterCurrentParams(kCharacterTatiana)[3] = 0x7FFFFFFF;
-					_gameProgress[kProgressField5C] = 1;
+					_globals[kProgressField5C] = 1;
 
 					if (inComp(kCharacterAnna, kCarRedSleeping, 4070)) {
 						CONS_Tatiana_CryAnna(0, 0, 0, 0);
@@ -1878,7 +1878,7 @@ void LogicManager::HAND_Tatiana_AfterConcert(HAND_PARAMS) {
 						if (_gameTime == -450) {
 							skip = true;
 
-							_gameProgress[kProgressField5C] = 1;
+							_globals[kProgressField5C] = 1;
 							if (inComp(kCharacterAnna, kCarRedSleeping, 4070)) {
 								CONS_Tatiana_CryAnna(0, 0, 0, 0);
 								break;
@@ -1888,7 +1888,7 @@ void LogicManager::HAND_Tatiana_AfterConcert(HAND_PARAMS) {
 
 					if (!skip && getCharacterCurrentParams(kCharacterTatiana)[3] < _gameTime) {
 						getCharacterCurrentParams(kCharacterTatiana)[3] = 0x7FFFFFFF;
-						_gameProgress[kProgressField5C] = 1;
+						_globals[kProgressField5C] = 1;
 						if (inComp(kCharacterAnna, kCarRedSleeping, 4070)) {
 							CONS_Tatiana_CryAnna(0, 0, 0, 0);
 							break;
@@ -1899,8 +1899,8 @@ void LogicManager::HAND_Tatiana_AfterConcert(HAND_PARAMS) {
 		}
 
 		if (getCharacterCurrentParams(kCharacterTatiana)[0]) {
-			if (getCharacterCurrentParams(kCharacterTatiana)[4] || (getCharacterCurrentParams(kCharacterTatiana)[4] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
-				if (getCharacterCurrentParams(kCharacterTatiana)[4] >= _currentGameSessionTicks)
+			if (getCharacterCurrentParams(kCharacterTatiana)[4] || (getCharacterCurrentParams(kCharacterTatiana)[4] = _realTime + 75, _realTime != -75)) {
+				if (getCharacterCurrentParams(kCharacterTatiana)[4] >= _realTime)
 					break;
 
 				getCharacterCurrentParams(kCharacterTatiana)[4] = 0x7FFFFFFF;
@@ -1941,7 +1941,7 @@ void LogicManager::HAND_Tatiana_AfterConcert(HAND_PARAMS) {
 			if (cathHasItem(kItemFirebird)) {
 				playNIS(kEventTatianaCompartmentStealEgg);
 				takeCathItem(kItemFirebird);
-				_gameInventory[kItemFirebird].location = 2;
+				_items[kItemFirebird].floating = 2;
 			} else {
 				playNIS(kEventTatianaCompartment);
 			}
@@ -2154,7 +2154,7 @@ void LogicManager::HAND_Tatiana_DoConcertWalk(HAND_PARAMS) {
 
 		break;
 	case 6:
-		if (_gameEvents[kEventTatianaAskMatchSpeakRussian] || _gameEvents[kEventTatianaAskMatch] || _gameEvents[kEventVassiliSeizure]) {
+		if (_doneNIS[kEventTatianaAskMatchSpeakRussian] || _doneNIS[kEventTatianaAskMatch] || _doneNIS[kEventVassiliSeizure]) {
 			if (rnd(2) == 0) {
 				playDialog(kCharacterCath, "CAT1010A", -1, 0);
 			} else {
@@ -2192,7 +2192,7 @@ void LogicManager::HAND_Tatiana_TrapCath(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
 		if (getCharacterCurrentParams(kCharacterTatiana)[0]) {
-			if (inSuite(kCharacterCath, kCarRedSleeping, 7850) && !_gameEvents[kEventVassiliCompartmentStealEgg] && (_gameTime <= 2133000 || _gameProgress[kProgressField40])) {
+			if (inSuite(kCharacterCath, kCarRedSleeping, 7850) && !_doneNIS[kEventVassiliCompartmentStealEgg] && (_gameTime <= 2133000 || _globals[kProgressField40])) {
 				if (inComp(kCharacterCath, kCarRedSleeping, 7500)) {
 					send(kCharacterTatiana, kCharacterCond2, 235061888, 0);
 					endGraphics(kCharacterTatiana);
@@ -2202,7 +2202,7 @@ void LogicManager::HAND_Tatiana_TrapCath(HAND_PARAMS) {
 					if (cathHasItem(kItemFirebird)) {
 						playNIS(kEventTatianaCompartmentStealEgg);
 						takeCathItem(kItemFirebird);
-						_gameInventory[kItemFirebird].location = 2;
+						_items[kItemFirebird].floating = 2;
 					} else {
 						playNIS(kEventTatianaCompartment);
 					}
@@ -2213,7 +2213,7 @@ void LogicManager::HAND_Tatiana_TrapCath(HAND_PARAMS) {
 				}
 			} else {
 				softReleaseAtDoor(kCharacterTatiana, 33);
-				if (_gameTime < 2133000 || _gameProgress[16]) {
+				if (_gameTime < 2133000 || _globals[16]) {
 					getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 3;
 					TatianaCall(&LogicManager::CONS_Tatiana_DoConcertWalk, 0, 0, 0, 0);
 				} else {
@@ -2422,13 +2422,13 @@ void LogicManager::HAND_Tatiana_WithAlexei(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
 		if (!getCharacterCurrentParams(kCharacterTatiana)[1] && !getCharacterCurrentParams(kCharacterTatiana)[2]) {
-			getCharacterCurrentParams(kCharacterTatiana)[0] -= _gameTimeTicksDelta;
-			if (_gameTimeTicksDelta > getCharacterCurrentParams(kCharacterTatiana)[0]) {
+			getCharacterCurrentParams(kCharacterTatiana)[0] -= _timeSpeed;
+			if (_timeSpeed > getCharacterCurrentParams(kCharacterTatiana)[0]) {
 				playDialog(kCharacterTatiana, (char *)&getCharacterCurrentParams(kCharacterTatiana)[5], -1, 0);
 				if (getCharacterCurrentParams(kCharacterTatiana)[3] == 4 && nearChar(kCharacterTatiana, kCharacterCath, 2000)) {
-					_gameProgress[kProgressField8C] = 1;
+					_globals[kProgressField8C] = 1;
 				} else if (getCharacterCurrentParams(kCharacterTatiana)[3] == 7 && nearChar(kCharacterTatiana, kCharacterCath, 2000)) {
-					_gameProgress[kProgressField88] = 1;
+					_globals[kProgressField88] = 1;
 				}
 
 				getCharacterCurrentParams(kCharacterTatiana)[1] = 1;
@@ -2595,18 +2595,18 @@ void LogicManager::HAND_Tatiana_SeekCath(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
 		if (!getCharacterCurrentParams(kCharacterTatiana)[0]) {
-			if (!_gameEvents[kEventTatianaTylerCompartment] && inComp(kCharacterCath, kCarGreenSleeping, 8200)) {
+			if (!_doneNIS[kEventTatianaTylerCompartment] && inComp(kCharacterCath, kCarGreenSleeping, 8200)) {
 				getCharacterCurrentParams(kCharacterTatiana)[0] = 1;
-				_gameProgress[kProgressFieldE4] = 1;
+				_globals[kProgressFieldE4] = 1;
 				setDoor(1, kCharacterTatiana, checkDoor(1), 0, 9);
 			}
 
 			if (!getCharacterCurrentParams(kCharacterTatiana)[0]) {
-				if (_gameEvents[kEventTatianaTylerCompartment] || _gameTime > 2475000) {
+				if (_doneNIS[kEventTatianaTylerCompartment] || _gameTime > 2475000) {
 					if (getCharacterCurrentParams(kCharacterTatiana)[0]) {
 						setDoor(1, 0, checkDoor(1), 10, 9);
 					}
-					_gameProgress[kProgressFieldE4] = 0;
+					_globals[kProgressFieldE4] = 0;
 					softReleaseAtDoor(kCharacterTatiana, 2);
 					getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 3;
 					TatianaCall(&LogicManager::CONS_Tatiana_DoWalk, 4, 7500, 0, 0);
@@ -2623,14 +2623,14 @@ void LogicManager::HAND_Tatiana_SeekCath(HAND_PARAMS) {
 
 		if (getCharacterCurrentParams(kCharacterTatiana)[0] && !whoRunningDialog(kCharacterTatiana)) {
 			rndNum = 5 * (3 * rnd(5) + 30);
-			if (getCharacterCurrentParams(kCharacterTatiana)[1] || (getCharacterCurrentParams(kCharacterTatiana)[1] = _currentGameSessionTicks + rndNum,
-																	_currentGameSessionTicks + rndNum != 0)) {
-				if (getCharacterCurrentParams(kCharacterTatiana)[1] >= _currentGameSessionTicks) {
-					if (_gameEvents[kEventTatianaTylerCompartment] || _gameTime > 2475000) {
+			if (getCharacterCurrentParams(kCharacterTatiana)[1] || (getCharacterCurrentParams(kCharacterTatiana)[1] = _realTime + rndNum,
+																	_realTime + rndNum != 0)) {
+				if (getCharacterCurrentParams(kCharacterTatiana)[1] >= _realTime) {
+					if (_doneNIS[kEventTatianaTylerCompartment] || _gameTime > 2475000) {
 						if (getCharacterCurrentParams(kCharacterTatiana)[0]) {
 							setDoor(1, 0, checkDoor(1), 10, 9);
 						}
-						_gameProgress[kProgressFieldE4] = 0;
+						_globals[kProgressFieldE4] = 0;
 						softReleaseAtDoor(kCharacterTatiana, 2);
 						getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 3;
 						TatianaCall(&LogicManager::CONS_Tatiana_DoWalk, 4, 7500, 0, 0);
@@ -2646,11 +2646,11 @@ void LogicManager::HAND_Tatiana_SeekCath(HAND_PARAMS) {
 			getCharacterCurrentParams(kCharacterTatiana)[1] = 0;
 		}
 
-		if (_gameEvents[kEventTatianaTylerCompartment] || _gameTime > 2475000) {
+		if (_doneNIS[kEventTatianaTylerCompartment] || _gameTime > 2475000) {
 			if (getCharacterCurrentParams(kCharacterTatiana)[0]) {
 				setDoor(1, 0, checkDoor(1), 10, 9);
 			}
-			_gameProgress[kProgressFieldE4] = 0;
+			_globals[kProgressFieldE4] = 0;
 			softReleaseAtDoor(kCharacterTatiana, 2);
 			getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 3;
 			TatianaCall(&LogicManager::CONS_Tatiana_DoWalk, 4, 7500, 0, 0);
@@ -2914,8 +2914,8 @@ void LogicManager::HAND_Tatiana_Autistic(HAND_PARAMS) {
 		}
 
 		if (getCharacterCurrentParams(kCharacterTatiana)[0] > 3) {
-			if (getCharacterCurrentParams(kCharacterTatiana)[2] || (getCharacterCurrentParams(kCharacterTatiana)[2] = _currentGameSessionTicks + 225, _currentGameSessionTicks != -225)) {
-				if (getCharacterCurrentParams(kCharacterTatiana)[2] >= _currentGameSessionTicks)
+			if (getCharacterCurrentParams(kCharacterTatiana)[2] || (getCharacterCurrentParams(kCharacterTatiana)[2] = _realTime + 225, _realTime != -225)) {
+				if (getCharacterCurrentParams(kCharacterTatiana)[2] >= _realTime)
 					break;
 
 				getCharacterCurrentParams(kCharacterTatiana)[2] = 0x7FFFFFFF;
diff --git a/engines/lastexpress/characters/trainm.cpp b/engines/lastexpress/characters/trainm.cpp
index e700e9060c9..3c052395108 100644
--- a/engines/lastexpress/characters/trainm.cpp
+++ b/engines/lastexpress/characters/trainm.cpp
@@ -447,8 +447,8 @@ void LogicManager::HAND_TrainM_DoAnnounceWalk(HAND_PARAMS) {
 		}
 
 		if (getCharacterCurrentParams(kCharacterTrainM)[5]) {
-			if (getCharacterCurrentParams(kCharacterTrainM)[7] || (getCharacterCurrentParams(kCharacterTrainM)[7] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
-				if (getCharacterCurrentParams(kCharacterTrainM)[7] >= _currentGameSessionTicks)
+			if (getCharacterCurrentParams(kCharacterTrainM)[7] || (getCharacterCurrentParams(kCharacterTrainM)[7] = _realTime + 75, _realTime != -75)) {
+				if (getCharacterCurrentParams(kCharacterTrainM)[7] >= _realTime)
 					break;
 
 				getCharacterCurrentParams(kCharacterTrainM)[7] = 0x7FFFFFFF;
@@ -658,11 +658,11 @@ void LogicManager::HAND_TrainM_KickCathOut(HAND_PARAMS) {
 		break;
 	case 18:
 		if (getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] == 1) {
-			if (_gameEvents[kEventVergesSuitcase] || _gameEvents[kEventVergesSuitcaseNight] || _gameEvents[kEventVergesSuitcaseOtherEntry] || _gameEvents[kEventVergesSuitcaseNightOtherEntry]) {
+			if (_doneNIS[kEventVergesSuitcase] || _doneNIS[kEventVergesSuitcaseNight] || _doneNIS[kEventVergesSuitcaseOtherEntry] || _doneNIS[kEventVergesSuitcaseNightOtherEntry]) {
 				getCharacterCurrentParams(kCharacterTrainM)[1] = 1;
 			}
 
-			if (isNight() && _gameProgress[kProgressChapter] != 1)
+			if (isNight() && _globals[kProgressChapter] != 1)
 				getCharacterCurrentParams(kCharacterTrainM)[1] = 1;
 
 			if (getCharacterCurrentParams(kCharacterTrainM)[0]) {
@@ -757,7 +757,7 @@ void LogicManager::HAND_TrainM_DoCond(HAND_PARAMS) {
 	case 0:
 		if (getCharacterCurrentParams(kCharacterTrainM)[4] && getCharacterCurrentParams(kCharacterTrainM)[5]) {
 			send(kCharacterTrainM, getCharacterCurrentParams(kCharacterTrainM)[0], 125499160, 0);
-			if (!checkCathDir(3, 2) && !checkCathDir(4, 2))
+			if (!checkCathDir(kCarGreenSleeping, 2) && !checkCathDir(kCarRedSleeping, 2))
 				getCharacter(kCharacterTrainM).characterPosition.position = 2088;
 
 			getCharacter(kCharacterTrainM).currentCall--;
@@ -805,7 +805,7 @@ void LogicManager::HAND_TrainM_DoCondDoubl(HAND_PARAMS) {
 	case 0:
 		if (getCharacterCurrentParams(kCharacterTrainM)[8] >= 2 && getCharacterCurrentParams(kCharacterTrainM)[7]) {
 			send(kCharacterTrainM, getCharacterCurrentParams(kCharacterTrainM)[0], 125499160, 0);
-			if (!checkCathDir(kCarGreenSleeping, 2) && !checkCathDir(4, 2))
+			if (!checkCathDir(kCarGreenSleeping, 2) && !checkCathDir(kCarRedSleeping, 2))
 				getCharacter(kCharacterTrainM).characterPosition.position = 2088;
 
 			getCharacter(kCharacterTrainM).currentCall--;
@@ -1105,7 +1105,7 @@ void LogicManager::HAND_TrainM_DoHWMessage(HAND_PARAMS) {
 			TrainMCall(&LogicManager::CONS_TrainM_DoWalk, 3, 2000, 0, 0);
 			break;
 		case 2:
-			if (_gameEvents[kEventMertensAskTylerCompartment] || _gameEvents[kEventMertensAskTylerCompartmentD] || _gameEvents[kEventMertensAugustWaiting]) {
+			if (_doneNIS[kEventMertensAskTylerCompartment] || _doneNIS[kEventMertensAskTylerCompartmentD] || _doneNIS[kEventMertensAugustWaiting]) {
 				getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 3;
 				TrainMCall(&LogicManager::CONS_TrainM_DoCondDoubl, 3, "TRA1200", "TRA1201", 0);
 			} else {
@@ -1225,12 +1225,12 @@ void LogicManager::HAND_TrainM_BoardPolice(HAND_PARAMS) {
 		case 1:
 			takeItem(kCharacterTrainM);
 			if (inOuterSanctum(kCharacterCath)) {
-				if (_gameEvents[kProgressFieldCC]) {
-					_gameProgress[kProgressField3C] = 1;
+				if (_doneNIS[kProgressFieldCC]) {
+					_globals[kProgressField3C] = 1;
 					getCharacter(kCharacterTrainM).characterPosition.car = kCarGreenSleeping;
 					getCharacter(kCharacterTrainM).characterPosition.position = 540;
 					getCharacter(kCharacterTrainM).characterPosition.location = 0;
-					_gameTimeTicksDelta = 3;
+					_timeSpeed = 3;
 					send(kCharacterTrainM, kCharacterMaster, 169629818, 0);
 					getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 3;
 					TrainMCall(&LogicManager::CONS_TrainM_DoPoliceDoneDialog, 0, 0, 0, 0);
@@ -1276,8 +1276,8 @@ void LogicManager::HAND_TrainM_BoardPolice(HAND_PARAMS) {
 			}
 
 			send(kCharacterTrainM, kCharacterPolice, 169499649, 0);
-			_gameProgress[kProgressField3C] = 1;
-			_gameTimeTicksDelta = 1;
+			_globals[kProgressField3C] = 1;
+			_timeSpeed = 1;
 			if (getCharacter(kCharacterTrainM).characterPosition.car == kCarRedSleeping) {
 				getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 6;
 				TrainMCall(&LogicManager::CONS_TrainM_DoAnnounceWalk, 3, 540, "TRA1005", 0);
@@ -1288,12 +1288,12 @@ void LogicManager::HAND_TrainM_BoardPolice(HAND_PARAMS) {
 
 			break;
 		case 2:
-			if (_gameEvents[kProgressFieldCC]) {
-				_gameProgress[kProgressField3C] = 1;
+			if (_doneNIS[kProgressFieldCC]) {
+				_globals[kProgressField3C] = 1;
 				getCharacter(kCharacterTrainM).characterPosition.car = kCarGreenSleeping;
 				getCharacter(kCharacterTrainM).characterPosition.position = 540;
 				getCharacter(kCharacterTrainM).characterPosition.location = 0;
-				_gameTimeTicksDelta = 3;
+				_timeSpeed = 3;
 				send(kCharacterTrainM, kCharacterMaster, 169629818, 0);
 				getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 3;
 				TrainMCall(&LogicManager::CONS_TrainM_DoPoliceDoneDialog, 0, 0, 0, 0);
@@ -1354,7 +1354,7 @@ void LogicManager::HAND_TrainM_BoardPolice(HAND_PARAMS) {
 		getCharacter(kCharacterTrainM).characterPosition.position = 8200;
 		getCharacter(kCharacterTrainM).characterPosition.location = 0;
 
-		_gameTimeTicksDelta = 3;
+		_timeSpeed = 3;
 
 		getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 8;
 		TrainMCall(&LogicManager::CONS_TrainM_SaveGame, 1, 0, 0, 0);
@@ -1962,7 +1962,7 @@ void LogicManager::HAND_TrainM_DoDogProblem(HAND_PARAMS) {
 			TrainMCall(&LogicManager::CONS_TrainM_WalkBackToOffice, 0, 0, 0, 0);
 			break;
 		case 4:
-			_gameProgress[kItemFirebird] = 1;
+			_globals[kProgressField48] = 1;
 			getCharacterParams(kCharacterTrainM, 8)[3] = 0;
 
 			getCharacter(kCharacterTrainM).currentCall--;
@@ -2110,7 +2110,7 @@ void LogicManager::HAND_TrainM_OnRearPlatform(HAND_PARAMS) {
 			getCharacter(kCharacterTrainM).characterPosition.location = 1;
 			getCharacter(kCharacterTrainM).characterPosition.position = 5799;
 
-			if (!_gameProgress[kProgressField3C]) {
+			if (!_globals[kProgressField3C]) {
 				getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 5;
 				TrainMCall(&LogicManager::CONS_TrainM_DoDialog, "Abb3035", 0, 0, 0);
 			} else {
diff --git a/engines/lastexpress/characters/vassili.cpp b/engines/lastexpress/characters/vassili.cpp
index 1246d0978a8..cfa32e2ddf0 100644
--- a/engines/lastexpress/characters/vassili.cpp
+++ b/engines/lastexpress/characters/vassili.cpp
@@ -239,10 +239,10 @@ void LogicManager::HAND_Vassili_InBed(HAND_PARAMS) {
 	case 0:
 		if (inComp(kCharacterCath, kCarRedSleeping, 8200)) {
 			if (getCharacterCurrentParams(kCharacterVassili)[2] ||
-				((getCharacterCurrentParams(kCharacterVassili)[2] = _currentGameSessionTicks + getCharacterCurrentParams(kCharacterVassili)[0]),
-				 _currentGameSessionTicks + getCharacterCurrentParams(kCharacterVassili)[0] != 0)) {
+				((getCharacterCurrentParams(kCharacterVassili)[2] = _realTime + getCharacterCurrentParams(kCharacterVassili)[0]),
+				 _realTime + getCharacterCurrentParams(kCharacterVassili)[0] != 0)) {
 
-				if (getCharacterCurrentParams(kCharacterVassili)[2] < _currentGameSessionTicks) {
+				if (getCharacterCurrentParams(kCharacterVassili)[2] < _realTime) {
 					getCharacterCurrentParams(kCharacterVassili)[2] = 0x7FFFFFFF;
 					getCharacter(kCharacterVassili).callbacks[getCharacter(kCharacterVassili).currentCall + 8] = 1;
 					VassiliCall(&LogicManager::CONS_Vassili_DoSeqOtis, "303B", 0, 0, 0);
@@ -447,9 +447,9 @@ void LogicManager::CONS_Vassili_CathArrives(CONS_PARAMS) {
 void LogicManager::HAND_Vassili_CathArrives(HAND_PARAMS) {
 	switch (msg->action) {
 	case 12:
-		if (_gameProgress[kProgressEventCorpseMovedFromFloor]) {
-			if (_gameProgress[kProgressEventCorpseThrown]) {
-				if (_gameProgress[kProgressJacket] == 1) {
+		if (_globals[kProgressEventCorpseMovedFromFloor]) {
+			if (_globals[kProgressEventCorpseThrown]) {
+				if (_globals[kProgressJacket] == 1) {
 					playNIS(kEventMertensBloodJacket);
 					endGame(0, 0, 0, true);
 				} else {
@@ -474,7 +474,7 @@ void LogicManager::HAND_Vassili_CathArrives(HAND_PARAMS) {
 			playNIS(kEventVassiliSeizure);
 			setDoor(32, kCharacterCath, 0, 10, 9);
 			setDoor(1, kCharacterCath, 0, 10, 9);
-			_gameProgress[kProgressField18] = 2;
+			_globals[kProgressField18] = 2;
 			send(kCharacterVassili, kCharacterAnna, 191477936, 0);
 			send(kCharacterVassili, kCharacterTrainM, 191477936, 0);
 			send(kCharacterVassili, kCharacterCond2, 191477936, 0);
@@ -553,9 +553,9 @@ void LogicManager::HAND_Vassili_InPart2(HAND_PARAMS) {
 	case 0:
 		if (inComp(kCharacterCath, kCarRedSleeping, 8200)) {
 			if (getCharacterCurrentParams(kCharacterVassili)[2] ||
-				(getCharacterCurrentParams(kCharacterVassili)[2] = _currentGameSessionTicks + getCharacterCurrentParams(kCharacterVassili)[0],
-				 _currentGameSessionTicks + getCharacterCurrentParams(kCharacterVassili)[0] != 0)) {
-				if (getCharacterCurrentParams(kCharacterVassili)[2] >= _currentGameSessionTicks)
+				(getCharacterCurrentParams(kCharacterVassili)[2] = _realTime + getCharacterCurrentParams(kCharacterVassili)[0],
+				 _realTime + getCharacterCurrentParams(kCharacterVassili)[0] != 0)) {
+				if (getCharacterCurrentParams(kCharacterVassili)[2] >= _realTime)
 					return;
 				getCharacterCurrentParams(kCharacterVassili)[2] = 0x7FFFFFFF;
 			}
@@ -629,10 +629,10 @@ void LogicManager::HAND_Vassili_Asleep(HAND_PARAMS) {
 	case 0:
 		if (inComp(kCharacterCath, kCarRedSleeping, 8200)) {
 			if (getCharacterCurrentParams(kCharacterVassili)[2] ||
-				(getCharacterCurrentParams(kCharacterVassili)[2] = _currentGameSessionTicks + getCharacterCurrentParams(kCharacterVassili)[0],
-				 _currentGameSessionTicks + getCharacterCurrentParams(kCharacterVassili)[0] != 0)) {
+				(getCharacterCurrentParams(kCharacterVassili)[2] = _realTime + getCharacterCurrentParams(kCharacterVassili)[0],
+				 _realTime + getCharacterCurrentParams(kCharacterVassili)[0] != 0)) {
 
-				if (getCharacterCurrentParams(kCharacterVassili)[2] >= _currentGameSessionTicks)
+				if (getCharacterCurrentParams(kCharacterVassili)[2] >= _realTime)
 					break;
 
 				getCharacterCurrentParams(kCharacterVassili)[2] = 0x7FFFFFFF;
@@ -656,7 +656,7 @@ void LogicManager::HAND_Vassili_Asleep(HAND_PARAMS) {
 		startCycOtis(kCharacterVassili, "303A");
 		break;
 	case 17:
-		if (inComp(kCharacterCath, kCarRedSleeping, 7850) && cathHasItem(kItemFirebird) && !_gameEvents[kEventVassiliCompartmentStealEgg]) {
+		if (inComp(kCharacterCath, kCarRedSleeping, 7850) && cathHasItem(kItemFirebird) && !_doneNIS[kEventVassiliCompartmentStealEgg]) {
 			setDoor(48, kCharacterVassili, 0, 0, 9);
 		} else {
 			setDoor(48, kCharacterCath, 0, 0, 9);
@@ -724,9 +724,9 @@ void LogicManager::HAND_Vassili_InPart4(HAND_PARAMS) {
 	case 0:
 		if (inComp(kCharacterCath, kCarRedSleeping, 8200)) {
 			if (getCharacterCurrentParams(kCharacterVassili)[2] ||
-				(getCharacterCurrentParams(kCharacterVassili)[2] = _currentGameSessionTicks + getCharacterCurrentParams(kCharacterVassili)[0],
-				 _currentGameSessionTicks + getCharacterCurrentParams(kCharacterVassili)[0] != 0)) {
-				if (getCharacterCurrentParams(kCharacterVassili)[2] >= _currentGameSessionTicks)
+				(getCharacterCurrentParams(kCharacterVassili)[2] = _realTime + getCharacterCurrentParams(kCharacterVassili)[0],
+				 _realTime + getCharacterCurrentParams(kCharacterVassili)[0] != 0)) {
+				if (getCharacterCurrentParams(kCharacterVassili)[2] >= _realTime)
 					break;
 
 				getCharacterCurrentParams(kCharacterVassili)[2] = 0x7FFFFFFF;
diff --git a/engines/lastexpress/characters/vesna.cpp b/engines/lastexpress/characters/vesna.cpp
index 682d98b65fe..5d34eb8772c 100644
--- a/engines/lastexpress/characters/vesna.cpp
+++ b/engines/lastexpress/characters/vesna.cpp
@@ -402,8 +402,8 @@ void LogicManager::HAND_Vesna_HomeAlone(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
 		if (getCharacterCurrentParams(kCharacterVesna)[2]) {
-			if (getCharacterCurrentParams(kCharacterVesna)[6] || (getCharacterCurrentParams(kCharacterVesna)[6] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
-				if (getCharacterCurrentParams(kCharacterVesna)[6] >= _currentGameSessionTicks)
+			if (getCharacterCurrentParams(kCharacterVesna)[6] || (getCharacterCurrentParams(kCharacterVesna)[6] = _realTime + 75, _realTime != -75)) {
+				if (getCharacterCurrentParams(kCharacterVesna)[6] >= _realTime)
 					break;
 
 				getCharacterCurrentParams(kCharacterVesna)[6] = 0x7FFFFFFF;
@@ -793,7 +793,7 @@ void LogicManager::CONS_Vesna_InComp(CONS_PARAMS) {
 void LogicManager::HAND_Vesna_InComp(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
-		if (_gameProgress[kProgressField54] && getCharacterCurrentParams(kCharacterVesna)[6] != 0x7FFFFFFF && _gameTime) {
+		if (_globals[kProgressField54] && getCharacterCurrentParams(kCharacterVesna)[6] != 0x7FFFFFFF && _gameTime) {
 			if (_gameTime > 2250000) {
 				getCharacterCurrentParams(kCharacterVesna)[6] = 0x7FFFFFFF;
 				CONS_Vesna_KillAnna(0, 0, 0, 0);
@@ -816,8 +816,8 @@ void LogicManager::HAND_Vesna_InComp(HAND_PARAMS) {
 		}
 
 		if (getCharacterCurrentParams(kCharacterVesna)[1]) {
-			if (getCharacterCurrentParams(kCharacterVesna)[7] || (getCharacterCurrentParams(kCharacterVesna)[7] = _currentGameSessionTicks + 75, _currentGameSessionTicks != -75)) {
-				if (getCharacterCurrentParams(kCharacterVesna)[7] >= _currentGameSessionTicks)
+			if (getCharacterCurrentParams(kCharacterVesna)[7] || (getCharacterCurrentParams(kCharacterVesna)[7] = _realTime + 75, _realTime != -75)) {
+				if (getCharacterCurrentParams(kCharacterVesna)[7] >= _realTime)
 					break;
 
 				getCharacterCurrentParams(kCharacterVesna)[7] = 0x7FFFFFFF;
@@ -1423,8 +1423,8 @@ void LogicManager::HAND_Vesna_Climbing(HAND_PARAMS) {
 		bool skip = false;
 
 		if (!getCharacterCurrentParams(kCharacterVesna)[0]) {
-			if (getCharacterCurrentParams(kCharacterVesna)[2] || (getCharacterCurrentParams(kCharacterVesna)[2] = _currentGameSessionTicks + 120, _currentGameSessionTicks != -120)) {
-				if (getCharacterCurrentParams(kCharacterVesna)[2] >= _currentGameSessionTicks) {
+			if (getCharacterCurrentParams(kCharacterVesna)[2] || (getCharacterCurrentParams(kCharacterVesna)[2] = _realTime + 120, _realTime != -120)) {
+				if (getCharacterCurrentParams(kCharacterVesna)[2] >= _realTime) {
 					skip = true;
 				}
 
@@ -1439,8 +1439,8 @@ void LogicManager::HAND_Vesna_Climbing(HAND_PARAMS) {
 			}
 		}
 
-		if (getCharacterCurrentParams(kCharacterVesna)[3] || (getCharacterCurrentParams(kCharacterVesna)[3] = _currentGameSessionTicks + 180, _currentGameSessionTicks != -180)) {
-			if (getCharacterCurrentParams(kCharacterVesna)[3] >= _currentGameSessionTicks)
+		if (getCharacterCurrentParams(kCharacterVesna)[3] || (getCharacterCurrentParams(kCharacterVesna)[3] = _realTime + 180, _realTime != -180)) {
+			if (getCharacterCurrentParams(kCharacterVesna)[3] >= _realTime)
 				break;
 
 			getCharacterCurrentParams(kCharacterVesna)[3] = 0x7FFFFFFF;
diff --git a/engines/lastexpress/characters/waiter1.cpp b/engines/lastexpress/characters/waiter1.cpp
index 089a1eaf116..abbe74961c3 100644
--- a/engines/lastexpress/characters/waiter1.cpp
+++ b/engines/lastexpress/characters/waiter1.cpp
@@ -389,7 +389,7 @@ void LogicManager::HAND_Waiter1_AbbotCheckMe(HAND_PARAMS) {
 			startCycOtis(kCharacterWaiter1, "029D");
 			getCharacter(kCharacterWaiter1).callbacks[getCharacter(kCharacterWaiter1).currentCall + 8] = 2;
 
-			if (_gameProgress[kProgressChapter] != 3) {
+			if (_globals[kProgressChapter] != 3) {
 				Waiter1Call(&LogicManager::CONS_Waiter1_DoDialog, "Abb4001", 0, 0, 0);
 			} else {
 				Waiter1Call(&LogicManager::CONS_Waiter1_DoDialog, "Abb3016", 0, 0, 0);
diff --git a/engines/lastexpress/characters/yasmin.cpp b/engines/lastexpress/characters/yasmin.cpp
index 989737e6df5..80d5a0cfea4 100644
--- a/engines/lastexpress/characters/yasmin.cpp
+++ b/engines/lastexpress/characters/yasmin.cpp
@@ -817,8 +817,8 @@ void LogicManager::HAND_Yasmin_Hiding(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
 		if (!whoRunningDialog(kCharacterYasmin)) {
-			if (getCharacterCurrentParams(kCharacterYasmin)[0] || (getCharacterCurrentParams(kCharacterYasmin)[0] = _currentGameSessionTicks + 450, _currentGameSessionTicks != -450)) {
-				if (getCharacterCurrentParams(kCharacterYasmin)[0] >= _currentGameSessionTicks)
+			if (getCharacterCurrentParams(kCharacterYasmin)[0] || (getCharacterCurrentParams(kCharacterYasmin)[0] = _realTime + 450, _realTime != -450)) {
+				if (getCharacterCurrentParams(kCharacterYasmin)[0] >= _realTime)
 					return;
 
 				getCharacterCurrentParams(kCharacterYasmin)[0] = 0x7FFFFFFF;
diff --git a/engines/lastexpress/data/archive.cpp b/engines/lastexpress/data/archive.cpp
index 7d318e8b0fb..f45f6831bb1 100644
--- a/engines/lastexpress/data/archive.cpp
+++ b/engines/lastexpress/data/archive.cpp
@@ -320,7 +320,7 @@ int ArchiveManager::loadBG(const char *filename) {
 
 	if (_engine->getLogicManager()->_doubleClickFlag &&
 		(_engine->mouseHasLeftClicked() || _engine->mouseHasRightClicked()) &&
-		_engine->getLogicManager()->_trainData[_engine->getLogicManager()->_trainNodeIndex].car != 128) {
+		_engine->getLogicManager()->_trainData[_engine->getLogicManager()->_activeNode].property != kNodeAutoWalk) {
 		return -1;
 	}
 
@@ -348,7 +348,7 @@ int ArchiveManager::loadBG(const char *filename) {
 			keepGoing = _engine->getGraphicsManager()->decomp16(_engine->getGraphicsManager()->_backgroundCompBuffer, 0x4000);
 			keepGoing &= (!_engine->getLogicManager()->_doubleClickFlag ||
 						 (!_engine->mouseHasLeftClicked() && !_engine->mouseHasRightClicked()) ||
-						 _engine->getLogicManager()->_trainData[_engine->getLogicManager()->_trainNodeIndex].car == 0x80);
+						  _engine->getLogicManager()->_trainData[_engine->getLogicManager()->_activeNode].property == kNodeAutoWalk);
 		} while (keepGoing);
 
 		_engine->getGraphicsManager()->modifyPalette(bgSurface, 640 * 480);
@@ -356,7 +356,7 @@ int ArchiveManager::loadBG(const char *filename) {
 
 		if (_engine->getLogicManager()->_doubleClickFlag &&
 			(_engine->mouseHasLeftClicked() || _engine->mouseHasRightClicked()) &&
-			_engine->getLogicManager()->_trainData[_engine->getLogicManager()->_trainNodeIndex].car != 128) {
+			_engine->getLogicManager()->_trainData[_engine->getLogicManager()->_activeNode].property != kNodeAutoWalk) {
 			return -1;
 		} else {
 			for (int32 i = _engine->getGraphicsManager()->_renderBox1.y - 1 + _engine->getGraphicsManager()->_renderBox1.height; i >= _engine->getGraphicsManager()->_renderBox1.y; i--) {
@@ -385,7 +385,7 @@ int ArchiveManager::loadBG(const char *filename) {
 
 			if (_engine->getLogicManager()->_doubleClickFlag &&
 				(_engine->mouseHasLeftClicked() || _engine->mouseHasRightClicked()) &&
-				_engine->getLogicManager()->_trainData[_engine->getLogicManager()->_trainNodeIndex].car != 128) {
+				_engine->getLogicManager()->_trainData[_engine->getLogicManager()->_activeNode].property != kNodeAutoWalk) {
 				return -1;
 
 			} else {
diff --git a/engines/lastexpress/data/cvcrfile.h b/engines/lastexpress/data/cvcrfile.h
index 324545ffb3f..3e841da13a7 100644
--- a/engines/lastexpress/data/cvcrfile.h
+++ b/engines/lastexpress/data/cvcrfile.h
@@ -37,22 +37,22 @@ namespace LastExpress {
 #define CVCRMODE_RWB  2
 
 struct SVCRFileHeader {
-	int32 signature;
-	int32 numSavePoints;
-	int32 offset;
-	int32 savePointsOffset;
-	int32 skipSoundLoading;
-	int32 gammaLevel;
+	int32 magicNumber;
+	int32 numVCRGames;
+	int32 nextWritePos;
+	int32 realWritePos;
+	int32 lastIsTemporary;
+	int32 brightness;
 	int32 volume;
 	int32 saveVersion;
 };
 
 struct SVCRSavePointHeader {
-	int32 signature;
-	int32 saveType;
-	int32 gameTime;
-	int32 headerSize;
-	int32 chapter;
+	int32 magicNumber;
+	int32 type;
+	int32 time;
+	int32 size;
+	int32 partNumber;
 	int32 latestGameEvent;
 	int32 emptyField1;
 	int32 emptyField2;
diff --git a/engines/lastexpress/data/gold_archive.cpp b/engines/lastexpress/data/gold_archive.cpp
index 0f74f8e5180..8ccb94b41fa 100644
--- a/engines/lastexpress/data/gold_archive.cpp
+++ b/engines/lastexpress/data/gold_archive.cpp
@@ -171,7 +171,7 @@ int GoldArchiveManager::loadBG(const char *filename) {
 
 	if (_engine->getLogicManager()->_doubleClickFlag &&
 		(_engine->mouseHasLeftClicked() || _engine->mouseHasRightClicked()) &&
-		_engine->getLogicManager()->_trainData[_engine->getLogicManager()->_trainNodeIndex].car != 128) {
+		_engine->getLogicManager()->_trainData[_engine->getLogicManager()->_activeNode].property != kNodeAutoWalk) {
 		return -1;
 	}
 
@@ -217,7 +217,7 @@ int GoldArchiveManager::loadBG(const char *filename) {
 
 		if (_engine->getLogicManager()->_doubleClickFlag &&
 			(_engine->mouseHasLeftClicked() || _engine->mouseHasRightClicked()) &&
-			_engine->getLogicManager()->_trainData[_engine->getLogicManager()->_trainNodeIndex].car != 128) {
+			_engine->getLogicManager()->_trainData[_engine->getLogicManager()->_activeNode].property != kNodeAutoWalk) {
 			return -1;
 		} else {
 			for (int32 i = _engine->getGraphicsManager()->_renderBox1.y - 1 + _engine->getGraphicsManager()->_renderBox1.height; i >= _engine->getGraphicsManager()->_renderBox1.y; i--) {
@@ -246,7 +246,7 @@ int GoldArchiveManager::loadBG(const char *filename) {
 
 			if (_engine->getLogicManager()->_doubleClickFlag &&
 				(_engine->mouseHasLeftClicked() || _engine->mouseHasRightClicked()) &&
-				_engine->getLogicManager()->_trainData[_engine->getLogicManager()->_trainNodeIndex].car != 128) {
+				_engine->getLogicManager()->_trainData[_engine->getLogicManager()->_activeNode].property != kNodeAutoWalk) {
 				return -1;
 
 			} else {
diff --git a/engines/lastexpress/debug.cpp b/engines/lastexpress/debug.cpp
index 3048b0f9c3a..156b67d9167 100644
--- a/engines/lastexpress/debug.cpp
+++ b/engines/lastexpress/debug.cpp
@@ -49,6 +49,10 @@ typedef struct ImGuiState {
 	int _currentTab = 0;
 	int _selectedCharacter = -1;
 	bool _forceReturnToListView = false;
+	float _rightPanelWidth = 0.0f;
+	float _bottomPanelHeight = 0.0f;
+	float _rightTopPanelHeight = 0.0f;
+	int _ticksToAdvance = 0;
 } ImGuiState;
 
 ImGuiState *_state = nullptr;
@@ -70,14 +74,12 @@ void onImGuiRender() {
 
 	ImGui::GetIO().ConfigFlags &= ~(ImGuiConfigFlags_NoMouseCursorChange | ImGuiConfigFlags_NoMouse);
 
-	// Create a single debug window
-	ImGui::SetNextWindowSize(ImVec2(1400, 900), ImGuiCond_FirstUseEver);
+	ImGui::SetNextWindowSize(ImVec2(1400, 1000), ImGuiCond_FirstUseEver);
 	ImGui::SetNextWindowPos(ImVec2(30, 30), ImGuiCond_FirstUseEver);
 
-	// Static variables to track layout sizes
-	static float rightPanelWidth = 300.0f;
-	static float bottomPanelHeight = 280.0f;
-	static float rightTopPanelHeight = 200.0f;
+	_state->_rightPanelWidth = 300.0f;
+	_state->_bottomPanelHeight = 280.0f;
+	_state->_rightTopPanelHeight = 200.0f;
 
 	// Disable the debugger when the NIS engine is running...
 	if (_state->_engine->getNISManager()->getNISFlag() & kNisFlagPlaying)
@@ -88,28 +90,26 @@ void onImGuiRender() {
 		return;
 
 	if (ImGui::Begin("Last Express Debugger")) {
-		// Get available content area
 		ImVec2 windowSize = ImGui::GetContentRegionAvail();
 
-		// Right panel splitter
+		// Right panel splitter...
 		{
-			ImGui::SameLine(windowSize.x - rightPanelWidth - 8);
+			ImGui::SameLine(windowSize.x - _state->_rightPanelWidth - 8);
 			ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(0.5f, 0.5f, 0.5f, 0.3f));
 			ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding, 0.0f);
-			ImGui::Button("##vsplitter", ImVec2(8, windowSize.y - bottomPanelHeight));
+			ImGui::Button("##vsplitter", ImVec2(8, windowSize.y - _state->_bottomPanelHeight));
 			ImGui::PopStyleVar();
 			ImGui::PopStyleColor();
 
 			if (ImGui::IsItemActive())
-				rightPanelWidth += ImGui::GetIO().MouseDelta.x * -1.0f;
+				_state->_rightPanelWidth += ImGui::GetIO().MouseDelta.x * -1.0f;
 
-			// Clamp to reasonable values
-			rightPanelWidth = CLIP<float>(rightPanelWidth, 150.0f, windowSize.x * 0.7f);
+			_state->_rightPanelWidth = CLIP<float>(_state->_rightPanelWidth, 150.0f, windowSize.x * 0.7f);
 		}
 
-		// Bottom panel splitter
+		// Bottom panel splitter...
 		{
-			float splitterY = windowSize.y - bottomPanelHeight - 8;
+			float splitterY = windowSize.y - _state->_bottomPanelHeight - 8;
 			ImGui::SetCursorPosY(splitterY);
 			ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(0.5f, 0.5f, 0.5f, 0.3f));
 			ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding, 0.0f);
@@ -118,40 +118,36 @@ void onImGuiRender() {
 			ImGui::PopStyleColor();
 
 			if (ImGui::IsItemActive())
-				bottomPanelHeight += ImGui::GetIO().MouseDelta.y * -1.0f;
+				_state->_bottomPanelHeight += ImGui::GetIO().MouseDelta.y * -1.0f;
 
-			// Clamp to reasonable values
-			bottomPanelHeight = CLIP<float>(bottomPanelHeight, 150.0f, windowSize.y * 0.7f);
+			_state->_bottomPanelHeight = CLIP<float>(_state->_bottomPanelHeight, 150.0f, windowSize.y * 0.7f);
 		}
 
-		// Right panel splitter (between top and bottom sections)
+		// Right panel splitter (between top and bottom sections)...
 		{
-			ImGui::SetCursorPos(ImVec2(windowSize.x - rightPanelWidth, rightTopPanelHeight));
+			ImGui::SetCursorPos(ImVec2(windowSize.x - _state->_rightPanelWidth, _state->_rightTopPanelHeight));
 			ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(0.5f, 0.5f, 0.5f, 0.3f));
 			ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding, 0.0f);
-			ImGui::Button("##rightsplitter", ImVec2(rightPanelWidth, 8));
+			ImGui::Button("##rightsplitter", ImVec2(_state->_rightPanelWidth, 8));
 			ImGui::PopStyleVar();
 			ImGui::PopStyleColor();
 
 			if (ImGui::IsItemActive())
-				rightTopPanelHeight += ImGui::GetIO().MouseDelta.y;
+				_state->_rightTopPanelHeight += ImGui::GetIO().MouseDelta.y;
 
-			// Clamp to reasonable values
-			rightTopPanelHeight = CLIP<float>(rightTopPanelHeight, 100.0f, windowSize.y - bottomPanelHeight - 100.0f);
+			_state->_rightTopPanelHeight = CLIP<float>(_state->_rightTopPanelHeight, 100.0f, windowSize.y - _state->_bottomPanelHeight - 100.0f);
 		}
 
-		// Main area dimensions (left of right panel, above bottom panel)
-		float mainAreaWidth = windowSize.x - rightPanelWidth - 8;
-		float mainAreaHeight = windowSize.y - bottomPanelHeight - 8;
+		float mainAreaWidth = windowSize.x - _state->_rightPanelWidth - 8;
+		float mainAreaHeight = windowSize.y - _state->_bottomPanelHeight - 8;
 
 		// Top-left: Character Debugger
 		ImGui::SetCursorPos(ImVec2(0, 16));
 		ImGui::BeginChild("CharacterDebugger", ImVec2(mainAreaWidth, mainAreaHeight), true);
 		{
-			// Tab bar and all character debugger content
 			ImGuiTabItemFlags flags = 0;
 
-			// Tab bar for different views
+			// Tab bar for different views...
 			if (ImGui::BeginTabBar("CharacterViews")) {
 				if (_state->_forceReturnToListView) {
 					_state->_forceReturnToListView = false;
@@ -176,14 +172,14 @@ void onImGuiRender() {
 				ImGui::EndTabBar();
 			}
 
-			// Filter for character names
+			// Update the character filter...
 			_state->_filter.Draw("Filter Characters", 180);
 			ImGui::SameLine();
 			if (ImGui::Button("Clear")) {
 				_state->_filter.Clear();
 			}
 
-			// Show corresponding view based on selected tab
+			// Show corresponding view based on selected tab...
 			switch (_state->_currentTab) {
 			case 0: // List View
 				_state->_engine->getLogicManager()->renderCharacterList(_state->_selectedCharacter);
@@ -201,15 +197,15 @@ void onImGuiRender() {
 		// Top-right panels
 		// Top-right is Clock
 		ImGui::SetCursorPos(ImVec2(mainAreaWidth + 8, 16));
-		ImGui::BeginChild("Clock", ImVec2(rightPanelWidth, rightTopPanelHeight), true);
+		ImGui::BeginChild("Clock", ImVec2(_state->_rightPanelWidth, _state->_rightTopPanelHeight), true);
 		{
 			_state->_engine->getClock()->showCurrentTime();
 		}
 		ImGui::EndChild();
 
 		// Bottom-right is Where's Cath?
-		ImGui::SetCursorPos(ImVec2(mainAreaWidth + 8, rightTopPanelHeight + 8));
-		ImGui::BeginChild("CathInfo", ImVec2(rightPanelWidth, mainAreaHeight - rightTopPanelHeight - 8), true);
+		ImGui::SetCursorPos(ImVec2(mainAreaWidth + 8, _state->_rightTopPanelHeight + 8));
+		ImGui::BeginChild("CathInfo", ImVec2(_state->_rightPanelWidth, mainAreaHeight - _state->_rightTopPanelHeight - 8), true);
 		{
 			ImGui::Text("Where's Cath?");
 			ImGui::Separator();
@@ -218,8 +214,8 @@ void onImGuiRender() {
 		ImGui::EndChild();
 
 		// Bottom-right is Where's Cath?
-		ImGui::SetCursorPos(ImVec2(mainAreaWidth + 8, rightTopPanelHeight * 2 - 16));
-		ImGui::BeginChild("EngineInfo", ImVec2(rightPanelWidth, mainAreaHeight - (rightTopPanelHeight * 2 - 16)), true);
+		ImGui::SetCursorPos(ImVec2(mainAreaWidth + 8, _state->_rightTopPanelHeight * 2 - 16));
+		ImGui::BeginChild("EngineInfo", ImVec2(_state->_rightPanelWidth, mainAreaHeight - (_state->_rightTopPanelHeight * 2 - 16)), true);
 		{
 			ImGui::Text("Engine Info");
 			ImGui::Separator();
@@ -228,11 +224,10 @@ void onImGuiRender() {
 		ImGui::EndChild();
 
 
-		// Bottom panel: Train Map (full width)
-		ImGui::SetCursorPos(ImVec2(0, windowSize.y - bottomPanelHeight));
-		ImGui::BeginChild("TrainMap", ImVec2(windowSize.x, bottomPanelHeight), true);
+		// Bottom panel: Train Map
+		ImGui::SetCursorPos(ImVec2(0, windowSize.y - _state->_bottomPanelHeight));
+		ImGui::BeginChild("TrainMap", ImVec2(windowSize.x, _state->_bottomPanelHeight), true);
 		{
-			// Draw train map without the window decorations
 			_state->_engine->getLogicManager()->showTrainMapWindow();
 		}
 		ImGui::EndChild();
@@ -246,7 +241,7 @@ void onImGuiCleanup() {
 }
 
 void Clock::showCurrentTime() {
-	int timeSource = (int)_engine->getLogicManager()->getGameTime();
+	int timeSource = _engine->getMenu()->isShowingMenu() ? _engine->getClock()->getTimeShowing() : (int)_engine->getLogicManager()->getGameTime();
 
 	int hours = timeSource % 1296000 / 54000;
 	int minutes = timeSource % 54000 / 900 % 60 % 60;
@@ -272,7 +267,7 @@ void Clock::showCurrentTime() {
 
 	char dayText[32];
 	int dayOffset = timeSource / 1296000;
-	Common::sprintf_s(dayText, "July %d, 1914", 24 + dayOffset); // Calculate date based on days since start
+	Common::sprintf_s(dayText, "July %d, 1914", 24 + dayOffset); // The game starts in July 24, 1914...
 
 	drawList->AddText(
 		ImGui::GetFont(),
@@ -284,28 +279,55 @@ void Clock::showCurrentTime() {
 
 
 	ImGui::Text("Game time: %d", _engine->getLogicManager()->getGameTime());
-	ImGui::Text("Game time ticks: %d", _engine->getLogicManager()->getGameTimeTicks());
-	ImGui::Text("Game time ticks delta: %d", _engine->getLogicManager()->getGameTimeTicksDelta());
+	ImGui::Text("Real time: %d", _engine->getLogicManager()->getRealTime());
+	ImGui::Text("Time speed: %d", _engine->getLogicManager()->getTimeSpeed());
 	ImGui::Text("Grace timer: %d", _engine->_gracePeriodTimer);
 	ImGui::Separator();
 }
 
+Common::String LogicManager::translateNodeProperty(int property) {
+	Common::StringArray properties = {
+		"No Property",
+		"Has Door",
+		"Has Item",
+		"Has 2 Items",
+		"Has Door Item",
+		"Has 3 Items",
+		"Model Pad",
+		"Soft Point",
+		"Soft Point Item",
+		"Auto Walk",
+		"Sleeping On Bed",
+		"Beetle Area",
+		"Pulling Emergency Stop",
+		"Rebecca's Diary",
+		"Stops Fast Walk"
+	};
+
+	if (property >= 0 && property <= 9) {
+		return properties[property];
+	} else if (property >= 128 && property <= 133) {
+		return properties[property - 128 + 9];
+	} else {
+		return "Unknown property " + Common::String(property);
+	}
+}
+
 void LogicManager::showCurrentTrainNode() {
-	ImGui::Text("Flags: %u", _trainData[_trainNodeIndex].car);
-	ImGui::Text("Direction: %u", _trainData[_trainNodeIndex].cathDir);
+	ImGui::Text("Node property: %s", translateNodeProperty(_trainData[_activeNode].property).c_str());
+	ImGui::Text("Direction: %u", _trainData[_activeNode].cathDir);
 	ImGui::Text("Node position:");
-	ImGui::BulletText("Car %u", _trainData[_trainNodeIndex].nodePosition.car);
-	ImGui::BulletText("Location %u", _trainData[_trainNodeIndex].nodePosition.location);
-	ImGui::BulletText("Position %u", _trainData[_trainNodeIndex].nodePosition.position);
+	ImGui::BulletText("Car %u", _trainData[_activeNode].nodePosition.car);
+	ImGui::BulletText("Location %u", _trainData[_activeNode].nodePosition.location);
+	ImGui::BulletText("Position %u", _trainData[_activeNode].nodePosition.position);
 
-	ImGui::Text("Parameters: %u %u %u", _trainData[_trainNodeIndex].parameter1, _trainData[_trainNodeIndex].parameter2, _trainData[_trainNodeIndex].parameter3);
-	ImGui::Text("Scene filename: %s", _trainData[_trainNodeIndex].sceneFilename);
+	ImGui::Text("Parameters: %u %u %u", _trainData[_activeNode].parameter1, _trainData[_activeNode].parameter2, _trainData[_activeNode].parameter3);
+	ImGui::Text("Scene filename: %s", _trainData[_activeNode].sceneFilename);
 }
 
 void LogicManager::showCharacterDebugger() {
 	ImGuiTabItemFlags flags = 0;
 
-	// Tab bar for different views
 	if (ImGui::BeginTabBar("CharacterViews")) {
 		if (_state->_forceReturnToListView) {
 			_state->_forceReturnToListView = false;
@@ -330,51 +352,43 @@ void LogicManager::showCharacterDebugger() {
 		ImGui::EndTabBar();
 	}
 
-	// Filter for character names
 	_state->_filter.Draw("Filter Characters", 180);
 	ImGui::SameLine();
 	if (ImGui::Button("Clear")) {
 		_state->_filter.Clear();
 	}
 
-	// Show corresponding view based on selected tab
 	switch (_state->_currentTab) {
 	case 0: // List View
 		renderCharacterList(_state->_selectedCharacter);
 		break;
-	case 1:                         // Grid View
-		renderCharacterGrid(false, _state->_selectedCharacter); // Show all characters
+	case 1:  // Grid View
+		renderCharacterGrid(false, _state->_selectedCharacter);
 		break;
-	case 2:                        // Pinned Characters
-		renderCharacterGrid(true, _state->_selectedCharacter); // Show only pinned characters
+	case 2: // Pinned Characters
+		renderCharacterGrid(true, _state->_selectedCharacter);
 		break;
 	}
 }
 
-// List view with details panel
 void LogicManager::renderCharacterList(int &selectedCharacter) {
-	// Left panel: Character list
 	ImGui::BeginChild("CharacterList", ImVec2(200, 0), true);
 
 	for (int i = 0; i < 40; i++) {
-		// Get character and skip if it doesn't match filter
 		Character *character = &getCharacter(i);
 		if (!character)
 			continue;
 
-		// Format display string and filter
 		char buffer[64];
 		Common::sprintf_s(buffer, "%s (%d)", getCharacterName(i), i);
 		if (!_state->_filter.PassFilter(buffer))
 			continue;
 
-		// Check if character is pinned
 		bool isPinned = isCharacterPinned(i);
 		if (isPinned) {
-			ImGui::PushStyleColor(ImGuiCol_Text, IM_COL32(255, 220, 0, 255)); // Yellow for pinned
+			ImGui::PushStyleColor(ImGuiCol_Text, IM_COL32(255, 220, 0, 255)); // Yellow for pinned...
 		}
 
-		// Make the character selectable
 		if (ImGui::Selectable(buffer, selectedCharacter == i)) {
 			selectedCharacter = i;
 		}
@@ -383,7 +397,6 @@ void LogicManager::renderCharacterList(int &selectedCharacter) {
 			ImGui::PopStyleColor();
 		}
 
-		// Right-click menu for pinning/unpinning
 		if (ImGui::BeginPopupContextItem()) {
 			if (ImGui::MenuItem(isPinned ? "Unpin Character" : "Pin Character")) {
 				toggleCharacterPin(i);
@@ -416,17 +429,16 @@ Common::StringArray LogicManager::getCharacterFunctionNames(int character) {
 }
 
 void LogicManager::showTrainMapWindow() {
-	// Colors for different cars
-	ImVec4 restaurantColor = ImVec4(0.95f, 0.6f, 0.6f, 1.0f);    // Pink/red for restaurant
-	ImVec4 loungeColor = ImVec4(0.8f, 0.6f, 0.8f, 1.0f);         // Violet for lounge
-	ImVec4 redSleepingColor = ImVec4(0.95f, 0.7f, 0.7f, 1.0f);   // Light red for red sleeping car
-	ImVec4 greenSleepingColor = ImVec4(0.7f, 0.95f, 0.7f, 1.0f); // Light green for green sleeping car
-	ImVec4 vestibuleColor = ImVec4(0.8f, 0.7f, 0.6f, 1.0f);      // Brown for vestibule
-	ImVec4 kronosColor = ImVec4(0.95f, 0.9f, 0.6f, 1.0f);        // Yellow for Kronos car
-	ImVec4 characterColor = ImVec4(1.0f, 0.8f, 0.0f, 1.0f);      // Yellow for characters
-	ImVec4 cathColor = ImVec4(1.0f, 0.0f, 0.0f, 1.0f);           // Red for Cath
-	ImVec4 voidColor = ImVec4(0.2f, 0.2f, 0.3f, 1.0f);           // Dark blue/purple for void
-	ImVec4 corridorColor = ImVec4(0.4f, 0.4f, 0.4f, 0.5f);       // Gray for corridors
+	ImVec4 restaurantColor = ImVec4(0.95f, 0.6f, 0.6f, 1.0f);    // Pink/red
+	ImVec4 loungeColor = ImVec4(0.8f, 0.6f, 0.8f, 1.0f);         // Violet
+	ImVec4 redSleepingColor = ImVec4(0.95f, 0.7f, 0.7f, 1.0f);   // Light red
+	ImVec4 greenSleepingColor = ImVec4(0.7f, 0.95f, 0.7f, 1.0f); // Light green
+	ImVec4 vestibuleColor = ImVec4(0.8f, 0.7f, 0.6f, 1.0f);      // Brown
+	ImVec4 kronosColor = ImVec4(0.95f, 0.9f, 0.6f, 1.0f);        // Yellow
+	ImVec4 characterColor = ImVec4(1.0f, 0.8f, 0.0f, 1.0f);      // Yellow
+	ImVec4 cathColor = ImVec4(1.0f, 0.0f, 0.0f, 1.0f);           // Red
+	ImVec4 voidColor = ImVec4(0.2f, 0.2f, 0.3f, 1.0f);           // Dark blue/purple
+	ImVec4 corridorColor = ImVec4(0.4f, 0.4f, 0.4f, 0.5f);       // Gray
 
 	Common::HashMap<int, int> compartmentsPositions;
 	compartmentsPositions[2740] = 7;
@@ -440,24 +452,25 @@ void LogicManager::showTrainMapWindow() {
 
 	// Train layout
 	struct CarInfo {
-		int id;           // Car ID number
-		const char *name; // Car name
-		ImVec4 color;     // Car color
-		float width;      // Relative width (1.0 = standard)
-		int compartments; // Number of compartments
-		bool isSleeper;   // Is it a sleeping car?
+		int id;
+		const char *name;
+		ImVec4 color;
+		float width;
+		int compartments;
+		bool isSleeper;
 	};
 
 	CarInfo cars[] = {
-		{kCarRestaurant, "Restaurant Car", restaurantColor, 1.6f, 6, false},
-		{kCarRedSleeping, "Red Sleeping Car", redSleepingColor, 1.2f, 8, true},
-		{kCarGreenSleeping, "Green Sleeping Car", greenSleepingColor, 1.2f, 8, true},
-		{kCarVestibule, "Vestibule", vestibuleColor, 0.3f, 1, false},
-		{kCarKronos, "Kronos Car", kronosColor, 1.0f, 3, false}};
+		{ kCarRestaurant,    "Restaurant Car",     restaurantColor,    1.6f, 6, false},
+		{ kCarRedSleeping,   "Red Sleeping Car",   redSleepingColor,   1.2f, 8, true },
+		{ kCarGreenSleeping, "Green Sleeping Car", greenSleepingColor, 1.2f, 8, true },
+		{ kCarVestibule,     "Vestibule",          vestibuleColor,     0.3f, 1, false},
+		{ kCarKronos,        "Kronos Car",         kronosColor,        1.0f, 3, false}
+	};
 
 	const int carCount = sizeof(cars) / sizeof(cars[0]);
 
-	// Calculate total relative width to scale properly
+	// Calculate total relative width to scale properly...
 	float totalRelativeWidth = 0;
 	for (int i = 0; i < carCount; i++) {
 		totalRelativeWidth += cars[i].width;
@@ -468,19 +481,21 @@ void LogicManager::showTrainMapWindow() {
 	const float carHeight = 140;
 	const float corridorHeight = 50;
 
-	// Character position mapping
+	// Character position mapping...
 	struct CharPos {
 		int car;
 		int compartment;
 		bool inCorridor;
-		int charIndex; // Store the character index
+		int charIndex;
 		int position;
 	};
+
 	Common::Array<CharPos> charPositions;
-	Common::Array<CharPos> voidCharPositions; // For characters in the void (car 0)
+	Common::Array<CharPos> voidCharPositions;
 
-	// Collect character positions
+	// Collect character positions...
 	for (int i = 0; i < 40; i++) {
+		// These are basically invisible entities, not real characters...
 		if (i == kCharacterClerk || i == kCharacterMaster || i == kCharacterMitchell)
 			continue;
 
@@ -502,14 +517,14 @@ void LogicManager::showTrainMapWindow() {
 		}
 	}
 
-	// Draw train cars
-	float carX = 10; // Starting position
+	// Draw train cars...
+	float carX = 10; // Starting position!
 
 	for (int c = 0; c < carCount; c++) {
 		CarInfo &car = cars[c];
 		float carWidth = unitWidth * car.width;
 
-		// Draw car outline
+		// Draw car outline...
 		ImDrawList *drawList = ImGui::GetWindowDrawList();
 		ImVec2 carMin;
 		carMin.x = ImGui::GetWindowPos().x + carX;
@@ -518,34 +533,35 @@ void LogicManager::showTrainMapWindow() {
 		carMax.x = carMin.x + carWidth;
 		carMax.y = carMin.y + carHeight;
 
-		// Draw car body
+		// Draw car body...
 		drawList->AddRectFilled(
 			carMin,
 			carMax,
 			ImGui::ColorConvertFloat4ToU32(car.color),
 			5.0f);
 
-		// Corridor position - default is center for non-sleeper cars
+		// Corridor position - default is center for non-sleeper cars...
 		float corridorY = carMin.y + (carHeight - corridorHeight) / 2;
 
-		// For sleeper cars, special layout
+		// For sleeper cars, special layout...
 		if (car.isSleeper) {
-			// Sleeping car with 8 compartments with specific positioning
-			// Position 8600 (left) to 2000 (right) for compartments
+			// Sleeping car with 8 compartments;
+			// position 8600 (left) to 2000 (right) mark the start and
+			// the end (empirical values ;-) )...
 
-			// Calculate the actual start and end points for compartments
+			// Calculate the actual start and end points for compartments...
 			float leftmostPos = 8600.0f;
 			float rightmostPos = 2000.0f;
 
-			// Calculate what percentage of the car width the compartments occupy
+			// Calculate what percentage of the car width the compartments occupy...
 			float leftEdgeRatio = 1.0f - (leftmostPos / 10000.0f);
 			float rightEdgeRatio = 1.0f - (rightmostPos / 10000.0f);
 
-			// Calculate the actual pixel positions
+			// Calculate the actual pixel positions...
 			float compartmentLeftEdge = carMin.x + (carWidth * leftEdgeRatio);
 			float compartmentRightEdge = carMin.x + (carWidth * rightEdgeRatio);
 
-			// Draw corridor at the bottom (full width of car)
+			// Draw corridor at the bottom (full width of car)...
 			corridorY = carMin.y + carHeight - corridorHeight;
 			drawList->AddRectFilled(
 				ImVec2(carMin.x, corridorY),
@@ -554,6 +570,8 @@ void LogicManager::showTrainMapWindow() {
 				0.0f);
 
 			// Draw corridor-colored areas on both sides of the compartments
+			// (where the compartements rooms end and the door to the next one is nearby)
+
 			// Left side (beyond compartments)
 			drawList->AddRectFilled(
 				ImVec2(carMin.x, carMin.y),
@@ -568,14 +586,14 @@ void LogicManager::showTrainMapWindow() {
 				ImGui::ColorConvertFloat4ToU32(corridorColor),
 				0.0f);
 
-			// Calculate width of each compartment
+			// Calculate width of each compartment...
 			float compartmentWidth = (compartmentRightEdge - compartmentLeftEdge) / 8;
 
-			// Draw the 8 compartments between the calculated edges
+			// Draw the 8 compartments between the calculated edges...
 			for (int i = 0; i <= 8; i++) {
 				float x = compartmentLeftEdge + (i * compartmentWidth);
 
-				// Draw compartment divisions
+				// Draw compartment vertical walls...
 				drawList->AddLine(
 					ImVec2(x, carMin.y),
 					ImVec2(x, corridorY),
@@ -586,66 +604,70 @@ void LogicManager::showTrainMapWindow() {
 			// Restaurant car with two sections: lounge and restaurant
 			// Position 0-3749 = lounge (right side), 3750-10000 = restaurant (left side)
 
-			// Calculate boundaries
+			// Calculate bounds...
 			float loungeRatio = 3750.0f / 10000.0f;
 			float loungeWidth = carWidth * loungeRatio;
 			float restaurantWidth = carWidth - loungeWidth;
 
-			// Draw lounge section (right side)
+			// Draw lounge section (right side)...
 			drawList->AddRectFilled(
 				ImVec2(carMin.x + restaurantWidth, carMin.y),
 				ImVec2(carMax.x, carMax.y),
 				ImGui::ColorConvertFloat4ToU32(loungeColor),
-				0.0f);
+				0.0f
+			);
 
-			// Dividing line between lounge and restaurant
+			// Dividing wall between lounge and restaurant...
 			drawList->AddLine(
 				ImVec2(carMin.x + restaurantWidth, carMin.y),
 				ImVec2(carMin.x + restaurantWidth, carMax.y),
 				IM_COL32(0, 0, 0, 255),
-				2.0f);
+				2.0f
+			);
 
-			// Center corridor for the entire car
+			// Center corridor for the entire car...
 			corridorY = carMin.y + (carHeight - corridorHeight) / 2;
 
-			// Draw corridor through both sections
+			// Draw corridor through both sections...
 			drawList->AddRectFilled(
 				ImVec2(carMin.x, corridorY),
 				ImVec2(carMax.x, corridorY + corridorHeight),
 				ImGui::ColorConvertFloat4ToU32(corridorColor),
 				0.0f);
 
-			// Draw restaurant tables (in the restaurant section only)
+			// Draw restaurant tables...
 			float tableWidth = restaurantWidth / 3;
 
 			for (int i = 0; i < 3; i++) {
-				// Draw table divisions
 				float tableX = carMin.x + i * tableWidth;
 
 				drawList->AddLine(
 					ImVec2(tableX, carMin.y),
 					ImVec2(tableX, corridorY),
 					IM_COL32(0, 0, 0, 255),
-					1.0f);
+					1.0f
+				);
 
 				drawList->AddLine(
 					ImVec2(tableX, corridorY + corridorHeight),
 					ImVec2(tableX, carMax.y),
 					IM_COL32(0, 0, 0, 255),
-					1.0f);
+					1.0f
+				);
 
-				// Draw tables as white rectangles
 				drawList->AddRectFilled(
 					ImVec2(tableX + 5, carMin.y + 5),
 					ImVec2(tableX + tableWidth - 5, corridorY - 5),
 					IM_COL32(255, 255, 255, 255),
-					3.0f);
+					3.0f
+				);
 
 				drawList->AddRectFilled(
 					ImVec2(tableX + 5, corridorY + corridorHeight + 5),
 					ImVec2(tableX + tableWidth - 5, carMax.y - 5),
 					IM_COL32(255, 255, 255, 255),
-					3.0f);
+					3.0f
+				);
 			}
 		} else if (car.id == kCarKronos) {
 			// Kronos car with 3 sections
@@ -656,25 +678,28 @@ void LogicManager::showTrainMapWindow() {
 				ImVec2(carMin.x, corridorY),
 				ImVec2(carMax.x, corridorY + corridorHeight),
 				ImGui::ColorConvertFloat4ToU32(corridorColor),
-				0.0f);
+				0.0f
+			);
 
 			for (int i = 0; i < 2; i++) {
 				drawList->AddLine(
 					ImVec2(carMin.x + (i + 1) * sectionWidth, carMin.y),
 					ImVec2(carMin.x + (i + 1) * sectionWidth, carMax.y),
 					IM_COL32(0, 0, 0, 255),
-					1.0f);
+					1.0f
+				);
 			}
 		} else {
-			// Default corridor for other cars
+			// Default corridor for other cars...
 			drawList->AddRectFilled(
 				ImVec2(carMin.x, corridorY),
 				ImVec2(carMax.x, corridorY + corridorHeight),
 				ImGui::ColorConvertFloat4ToU32(corridorColor),
-				0.0f);
+				0.0f
+			);
 		}
 
-		// Draw car name and ID
+		// Draw car name and ID...
 		char carName[32];
 		Common::sprintf_s(carName, "%s (%d)", car.name, car.id);
 		ImVec2 textSize = ImGui::CalcTextSize(carName);
@@ -683,39 +708,37 @@ void LogicManager::showTrainMapWindow() {
 			IM_COL32(255, 255, 255, 255),
 			carName);
 
-		// Draw characters in this car
+		// Draw characters in this car...
 		for (int i = 0; i < charPositions.size(); i++) {
 			if (charPositions[i].car == car.id) {
-				// Determine character position
 				float charX, charY;
 
-				// If in corridor, position based on position value (0-10000)
 				if (charPositions[i].inCorridor) {
 					// Calculate position along the car based on the 0-10000 range
-					// where 0 = rightmost edge and 10000 = leftmost edge
+					// where 0 = rightmost edge and 10000 = leftmost edge...
 					float positionRatio = (float)charPositions[i].position / 10000.0f;
 
-					// Flip the ratio since 0 is right and 10000 is left
+					// Flip the ratio since 0 is right and 10000 is left...
 					positionRatio = 1.0f - positionRatio;
 
-					// Set horizontal position based on the ratio
+					// Set horizontal position based on the ratio...
 					charX = carMin.x + (carWidth * positionRatio);
 
-					// Set vertical position in the corridor
+					// Set vertical position in the corridor...
 					charY = corridorY + corridorHeight / 2;
 
+					// Let's see the player marker a little better, shall we? :-)
 					if (charPositions[i].charIndex == kCharacterCath) {
 						charY -= 10;
 					} else {
 						charY += 10;
 					}
 				} else {
-					// For characters not in corridor, position in compartment
+					// For characters not in corridor...
 					int compartment = charPositions[i].compartment;
 
-					// Position adapts to car type
 					if (car.isSleeper) {
-						// Calculate compartment positions based on 8600-2000 range
+						// Calculate compartment positions based on the 8600-2000 range...
 						float leftmostPos = 8600.0f;
 						float rightmostPos = 2000.0f;
 						float leftEdgeRatio = 1.0f - (leftmostPos / 10000.0f);
@@ -724,33 +747,31 @@ void LogicManager::showTrainMapWindow() {
 						float compartmentRightEdge = carMin.x + (carWidth * rightEdgeRatio);
 						float compartmentWidth = (compartmentRightEdge - compartmentLeftEdge) / 8;
 
-						// Ensure compartment is in valid range for this car type
-						compartment = compartment % 8;
+						compartment = compartment % 8; // All 16 compartments are consecutive, so we mod by 8
 
 						// Calculate character position based on compartment
 						charX = compartmentLeftEdge + (compartment * compartmentWidth) + (compartmentWidth / 2);
 						charY = carMin.y + (corridorY - carMin.y) / 2;
 					} else if (car.id == kCarRestaurant) {
-						// Restaurant car with lounge (0-3749) and restaurant (3750-10000) sections
+						// Restaurant car with lounge (0-3749) and restaurant (3750-10000) sections...
 						float loungeRatio = 3750.0f / 10000.0f;
 						float loungeWidth = carWidth * loungeRatio;
 						float restaurantWidth = carWidth - loungeWidth;
 
-						// Center corridor for restaurant car
+						// Center corridor for restaurant car...
 						float restCorridorY = carMin.y + (carHeight - corridorHeight) / 2;
 
-						// Check if character is in lounge or restaurant section based on position
+						// Check if character is in lounge or restaurant section based on position...
 						bool inLounge = (charPositions[i].position < 3750);
 
 						if (inLounge) {
-							// Lounge area (right side of car)
+							// Lounge area (right side of car)...
 							charX = carMin.x + restaurantWidth + (loungeWidth / 2);
 							charY = restCorridorY + (compartment % 2 == 0 ? -restCorridorY / 2 : corridorHeight + restCorridorY / 2);
 						} else {
-							// Restaurant area (left side of car)
+							// Restaurant area (left side of car)...
 							float tableWidth = restaurantWidth / 3;
 
-							// Ensure compartment is in valid range for this car type
 							compartment = compartment % 6;
 
 							if (compartment < 3) { // Top side
@@ -762,29 +783,26 @@ void LogicManager::showTrainMapWindow() {
 							}
 						}
 					} else if (car.id == kCarKronos) {
-						// Kronos car layout (3 sections)
 						float sectionWidth = carWidth / 3;
 
-						// Ensure compartment is in valid range for this car type
 						compartment = compartment % 3;
 
 						charX = carMin.x + compartment * sectionWidth + sectionWidth / 2;
 						charY = carMin.y + carHeight / 2;
 					} else {
-						// Default positioning for vestibule car
+						// Vestibule car or whatever else...
 						charX = carMin.x + carWidth / 2;
 						charY = carMin.y + carHeight / 2;
 					}
 				}
 
-				// Draw character marker (circle)
+				// Draw character marker...
 				drawList->AddCircleFilled(
 					ImVec2(charX, charY),
 					8.0f,
 					ImGui::ColorConvertFloat4ToU32(charPositions[i].charIndex == kCharacterCath ? cathColor : characterColor),
 					12);
 
-				// Character ID
 				char charId[8];
 				Common::sprintf_s(charId, "%d", charPositions[i].charIndex);
 				drawList->AddText(
@@ -792,7 +810,7 @@ void LogicManager::showTrainMapWindow() {
 					charPositions[i].charIndex == kCharacterCath ? IM_COL32(255, 255, 255, 255) : IM_COL32(0, 0, 0, 255),
 					charId);
 
-				// Tooltip for character when hovered
+				// Tooltip!
 				ImGui::SetCursorScreenPos(ImVec2(charX - 8, charY - 8));
 				ImGui::InvisibleButton(charId, ImVec2(16, 16));
 				if (ImGui::IsItemHovered()) {
@@ -807,15 +825,15 @@ void LogicManager::showTrainMapWindow() {
 			}
 		}
 
-		// Move to next car
+		// Move to next car...
 		carX += carWidth + 5;
 	}
 
-	// Draw "The Void" section at the bottom
+	// Draw "The Void" section at the bottom...
 	if (voidCharPositions.size() > 0) {
 		ImDrawList *drawList = ImGui::GetWindowDrawList();
 
-		// Draw void area
+		// Area...
 		ImVec2 voidMin;
 		voidMin.x = ImGui::GetWindowPos().x + 10;
 		voidMin.y = ImGui::GetWindowPos().y + 205; // Below the train cars
@@ -823,14 +841,15 @@ void LogicManager::showTrainMapWindow() {
 		voidMax.x = ImGui::GetWindowPos().x + ImGui::GetContentRegionAvail().x - 10;
 		voidMax.y = voidMin.y + 60;
 
-		// Draw void rectangle
+		// Rectangle...
 		drawList->AddRectFilled(
 			voidMin,
 			voidMax,
 			ImGui::ColorConvertFloat4ToU32(voidColor),
-			5.0f);
+			5.0f
+		);
 
-		// Draw void label
+		// Label...
 		const char *voidLabel = "THE VOID (id: 0)";
 		ImVec2 textSize = ImGui::CalcTextSize(voidLabel);
 		drawList->AddText(
@@ -838,20 +857,18 @@ void LogicManager::showTrainMapWindow() {
 			IM_COL32(255, 255, 255, 255),
 			voidLabel);
 
-		// Draw characters in the void
+		// Character markers...
 		float charSpacing = (voidMax.x - voidMin.x - 20) / (voidCharPositions.size() + 1);
 		for (int i = 0; i < voidCharPositions.size(); i++) {
 			float charX = voidMin.x + 10 + charSpacing * (i + 1);
 			float charY = voidMin.y + 35;
 
-			// Draw character marker (circle)
 			drawList->AddCircleFilled(
 				ImVec2(charX, charY),
 				8.0f,
 				ImGui::ColorConvertFloat4ToU32(characterColor),
 				12);
 
-			// Character ID
 			char charId[16];
 			Common::sprintf_s(charId, "%d", voidCharPositions[i].charIndex);
 			drawList->AddText(
@@ -859,7 +876,7 @@ void LogicManager::showTrainMapWindow() {
 				IM_COL32(0, 0, 0, 255),
 				charId);
 
-			// Tooltip for character when hovered
+			// Tooltip! :-)
 			ImGui::SetCursorScreenPos(ImVec2(charX - 8, charY - 8));
 			ImGui::InvisibleButton(charId, ImVec2(16, 16));
 			if (ImGui::IsItemHovered()) {
@@ -872,36 +889,29 @@ void LogicManager::showTrainMapWindow() {
 			}
 		}
 	}
-
 }
 
-// Grid view showing multiple characters at once
 void LogicManager::renderCharacterGrid(bool onlyPinned, int &selectedCharacter) {
-	// Number of characters to display per row
 	const int charsPerRow = 3;
 	int displayed = 0;
 
-	// Calculate fixed width for each card (subtract some padding)
 	float windowWidth = ImGui::GetContentRegionAvail().x + ImGui::GetCursorScreenPos().x - ImGui::GetWindowPos().x;
 	float cardWidth = (windowWidth / charsPerRow) - 8;
 
 	for (int i = 0; i < 40; i++) {
-		// Get character
+		// Get (and filter) character...
 		Character *character = &getCharacter(i);
 		if (!character)
 			continue;
 
-		// Skip if filtering by pin status
 		if (onlyPinned && !isCharacterPinned(i))
 			continue;
 
-		// Skip if doesn't match text filter
 		char buffer[64];
 		Common::sprintf_s(buffer, "%s (%d)", getCharacterName(i), i);
 		if (!_state->_filter.PassFilter(buffer))
 			continue;
 
-		// Start a new row if needed
 		if (displayed > 0 && displayed % charsPerRow == 0) {
 			ImGui::NewLine();
 		} else if (displayed > 0) {
@@ -910,11 +920,10 @@ void LogicManager::renderCharacterGrid(bool onlyPinned, int &selectedCharacter)
 
 		displayed++;
 
-		// Create a card for the character with fixed width
+		// Create a card for the character...
 		ImGui::PushID(i);
 		ImGui::BeginChild(ImGui::GetID((void *)(intptr_t)i), ImVec2(cardWidth, 180), true);
 
-		// Character name with pin status
 		if (isCharacterPinned(i)) {
 			ImGui::TextColored(ImVec4(1.0f, 0.85f, 0.0f, 1.0f), "%s (%d)", getCharacterName(i), i);
 			ImGui::SameLine(ImGui::GetWindowWidth() - 50);
@@ -944,7 +953,6 @@ void LogicManager::renderCharacterGrid(bool onlyPinned, int &selectedCharacter)
 
 		ImGui::Separator();
 
-		// Key information
 		ImGui::Text("Position: Car %u, Loc %u, Pos %u",
 					character->characterPosition.car,
 					character->characterPosition.location,
@@ -955,10 +963,8 @@ void LogicManager::renderCharacterGrid(bool onlyPinned, int &selectedCharacter)
 		ImGui::Text("Direction: %d", character->direction);
 		ImGui::Text("Current Frame: Seq1 %d / Seq2 %d", character->currentFrameSeq1, character->currentFrameSeq2);
 
-		// Link to details view
 		if (ImGui::Button("View Details")) {
-			// Switch to list view and select this character
-			_state->_selectedCharacter = i; // Store the selected character index
+			_state->_selectedCharacter = i;
 			_state->_forceReturnToListView = true;
 		}
 
@@ -972,12 +978,9 @@ void LogicManager::renderCharacterGrid(bool onlyPinned, int &selectedCharacter)
 	}
 }
 
-// Detailed view for a single character
 void LogicManager::renderCharacterDetails(Character *character, int index) {
-	// Title and header
 	ImGui::Text("%s (Character ID: %d)", getCharacterName(index), index);
 
-	// Pin/unpin button
 	ImGui::SameLine(ImGui::GetWindowWidth() - 100);
 	if (ImGui::Button(isCharacterPinned(index) ? "Unpin Character" : "Pin Character")) {
 		toggleCharacterPin(index);
@@ -985,7 +988,6 @@ void LogicManager::renderCharacterDetails(Character *character, int index) {
 
 	ImGui::Separator();
 
-	// Always visible basic info section
 	ImGui::Text("Position: Car %u, Location %u, Position %u",
 				character->characterPosition.car,
 				character->characterPosition.location,
@@ -1002,9 +1004,8 @@ void LogicManager::renderCharacterDetails(Character *character, int index) {
 		ImGui::Text("Current logic function: %s (%d)", funcCurrName.c_str(), character->callbacks[character->currentCall]);
 	}
 
-	// Group related data in collapsing sections
 	if (ImGui::CollapsingHeader("Logic call stack", ImGuiTreeNodeFlags_DefaultOpen)) {
-		// Start with the current call
+		// Start with the current call...
 		int currentDepth = character->currentCall;
 
 		if (currentDepth < 0 || character->callbacks[currentDepth] == 0) {
@@ -1012,31 +1013,27 @@ void LogicManager::renderCharacterDetails(Character *character, int index) {
 		} else {
 			ImGui::Text("Call stack depth: %d", currentDepth + 1);
 
-			// Display the call stack with proper indentation
+			// Display the call stack...
 			for (int i = currentDepth; i >= 0; i--) {
-				// Get the function number at this stack level
 				int functionId = character->callbacks[i];
 
-				// Calculate indent amount - ensure it's never zero (use 0.1f as minimum)
 				float indentAmount = (currentDepth - i) * 20.0f;
 				indentAmount = indentAmount > 0.0f ? indentAmount : 0.1f;
 
-				// Apply indent
 				ImGui::Indent(indentAmount);
 
-				// Display function with a bullet point
+
 				ImGui::BulletText("Level %d: %s (#%d)",
 								  currentDepth - i,
 								  funcNames[functionId - 1].c_str(),
 								  functionId);
 
-				// Remove indent
 				ImGui::Unindent(indentAmount);
 			}
 		}
 	}
 
-	// Group related data in collapsing sections
+
 	if (ImGui::CollapsingHeader("Animation State", ImGuiTreeNodeFlags_DefaultOpen)) {
 		ImGui::Text("Sequence: %s", character->sequenceName);
 		ImGui::Text("Sequence 2: %s", character->sequenceName2);
@@ -1060,8 +1057,8 @@ void LogicManager::renderCharacterDetails(Character *character, int index) {
 		ImGui::Text("Clothes: %d", character->clothes);
 		ImGui::Text("Attached Conductor: %d", character->attachedConductor);
 		ImGui::Text("Process Entity: %d", character->doProcessEntity);
-		ImGui::Text("Car2: %d", character->car2);
-		ImGui::Text("Position2: %d", character->position2);
+		ImGui::Text("Previous Car: %d", character->car2);
+		ImGui::Text("Previous Position: %d", character->position2);
 		ImGui::Text("Field_4A9: %d", character->field_4A9);
 		ImGui::Text("Field_4AA: %d", character->field_4AA);
 	}
@@ -1071,7 +1068,7 @@ void LogicManager::renderCharacterDetails(Character *character, int index) {
 			char label[32];
 			Common::sprintf_s(label, "Call %d", call);
 
-			// Skip calls with all zero parameters
+			// Skip calls with all zero parameters...
 			bool hasNonZeroParams = false;
 			for (int param = 0; param < 32; param++) {
 				if (character->callParams[call].parameters[param] != 0) {
@@ -1091,6 +1088,7 @@ void LogicManager::renderCharacterDetails(Character *character, int index) {
 									character->callParams[call].parameters[param]);
 					}
 				}
+
 				ImGui::TreePop();
 			}
 		}
@@ -1116,6 +1114,7 @@ const char *LogicManager::getCharacterName(int index) const {
 	if (index < 0 || index >= 40) {
 		return "Unknown";
 	}
+
 	return _characterNames[index];
 }
 
@@ -1134,9 +1133,30 @@ void LogicManager::toggleCharacterPin(int index) {
 
 void LastExpressEngine::showEngineInfo() {
 	ImGui::Text("Mouse status:");
-	ImGui::BulletText("Is drawn: %s", _state->_engine->getGraphicsManager()->canDrawMouse() ? "yes" : "no");
-	ImGui::BulletText("Has left clicked: %s", _state->_engine->mouseHasLeftClicked() ? "yes" : "no");
-	ImGui::BulletText("Has right clicked: %s", _state->_engine->mouseHasRightClicked() ? "yes" : "no");
+	ImGui::BulletText("Is drawn: %s", getGraphicsManager()->canDrawMouse() ? "yes" : "no");
+	ImGui::BulletText("Has left clicked: %s", mouseHasLeftClicked() ? "yes" : "no");
+	ImGui::BulletText("Has right clicked: %s", mouseHasRightClicked() ? "yes" : "no");
+	ImGui::BulletText("Fast walk active: %s", getLogicManager()->_doubleClickFlag ? "yes" : "no");
+
+	if (!getMenu()->isShowingMenu()) {
+		ImGui::Separator();
+
+		ImGui::Text("Utilities (careful!):");
+		ImGui::Checkbox("Lock grace period", &_lockGracePeriod);
+
+		ImGui::NewLine();
+
+		ImGui::Text("Advance time by:");
+
+		ImGui::InputInt("ticks", &_state->_ticksToAdvance, 100, 1000);
+		ImGui::SameLine();
+		bool shouldAdvance = ImGui::Button("Go");
+		if (shouldAdvance) {
+			getLogicManager()->_gameTime += _state->_ticksToAdvance;
+			getLogicManager()->_realTime += _state->_ticksToAdvance;
+			_state->_ticksToAdvance = 0;
+		}
+	}
 }
 
 #endif
diff --git a/engines/lastexpress/fight/fight.cpp b/engines/lastexpress/fight/fight.cpp
index a225275a2cd..84929b1faac 100644
--- a/engines/lastexpress/fight/fight.cpp
+++ b/engines/lastexpress/fight/fight.cpp
@@ -83,7 +83,7 @@ int LastExpressEngine::doFight(int fightId) {
 		tbm = &getGraphicsManager()->_renderBox2;
 	}
 
-	getLogicManager()->_trainNodeIndex = fightNode;
+	getLogicManager()->_activeNode = fightNode;
 
 	(_characters->characters[kCharacterCath]).characterPosition = getLogicManager()->_trainData[fightNode].nodePosition;
 	getSoundManager()->_scanAnySoundLoopingSection = true;
@@ -230,12 +230,13 @@ void CFight::timer(Event *event, bool isProcessing) {
 	_engine->setEventTickInternal(false);
 
 	if (_engine->_gracePeriodTimer) {
-		if ((_engine->getLogicManager()->_gameProgress[kProgressJacket] < 2 ? 225 : 450) == _engine->_gracePeriodTimer || _engine->_gracePeriodTimer == 900) {
+		if ((_engine->getLogicManager()->_globals[kProgressJacket] < 2 ? 225 : 450) == _engine->_gracePeriodTimer || _engine->_gracePeriodTimer == 900) {
 			_eggIconBrightness = 0;
 			_eggIconBrightnessStep = 1;
 		}
 
-		_engine->_gracePeriodTimer--;
+		if (!_engine->_lockGracePeriod) // Gets set to true only by the debugger only...
+			_engine->_gracePeriodTimer--;
 
 		if (_engine->_gracePeriodTimer <= 500 ||
 			!(_engine->_gracePeriodTimer % 5)) {
@@ -279,7 +280,7 @@ void CFight::timer(Event *event, bool isProcessing) {
 		Link *link = nullptr;
 		uint8 location = 0;
 
-		for (Link *i = _engine->getLogicManager()->_trainData[_engine->getLogicManager()->_trainNodeIndex].link; i; i = i->next) {
+		for (Link *i = _engine->getLogicManager()->_trainData[_engine->getLogicManager()->_activeNode].link; i; i = i->next) {
 			if (_engine->getLogicManager()->pointIn(_engine->_cursorX, _engine->_cursorY, i) && location <= i->location) {
 				location = i->location;
 				link = i;
@@ -344,7 +345,7 @@ void CFight::mouse(Event *event) {
 			uint8 location = 0;
 			Link *link = nullptr;
 
-			for (Link *i = _engine->getLogicManager()->_trainData[_engine->getLogicManager()->_trainNodeIndex].link; i; i = i->next) {
+			for (Link *i = _engine->getLogicManager()->_trainData[_engine->getLogicManager()->_activeNode].link; i; i = i->next) {
 				if (_engine->getLogicManager()->pointIn(_engine->_cursorX, _engine->_cursorY, i) && location <= i->location) {
 					location = i->location;
 					link = i;
diff --git a/engines/lastexpress/game/action.cpp b/engines/lastexpress/game/action.cpp
index 82b21acbb92..d539ac7d2a3 100644
--- a/engines/lastexpress/game/action.cpp
+++ b/engines/lastexpress/game/action.cpp
@@ -30,98 +30,98 @@ int LogicManager::findCursor(Link *link) {
 		return link->cursor;
 
 	switch (link->action) {
-	case 1:
-		if (!_lastSavedNodeIndex && (_gameEvents[kEventKronosBringFirebird] || _gameProgress[kEventAugustBringEgg])) {
+	case kActionInventory:
+		if (!_nodeReturn2 && (_doneNIS[kEventKronosBringFirebird] || _globals[kEventAugustBringEgg])) {
 			result = kCursorNormal;
 		} else {
 			result = kCursorBackward;
 		}
 
 		break;
-	case 5:
+	case kActionKnock:
 		if (link->param1 >= 128) {
 			result = kCursorNormal;
 		} else {
-			result = _gameObjects[link->param1].cursor;
+			result = _doors[link->param1].windowCursor;
 		}
 
 		break;
-	case 6:
-	case 31:
+	case kActionCompartment:
+	case kActionExitCompartment:
 		if (link->param1 >= 128) {
 			result = kCursorNormal;
-		} else if (_inventorySelectedItemIdx != kItemKey || (_gameObjects[link->param1].character) || _gameObjects[link->param1].door != 1 || !_gameObjects[link->param1].cursor2 || inComp(kCharacterCath) || preventEnterComp(link->param1)) {
-			result = _gameObjects[link->param1].cursor2;
+		} else if (_activeItem != kItemKey || (_doors[link->param1].who) || _doors[link->param1].status != 1 || !_doors[link->param1].handleCursor || inComp(kCharacterCath) || preventEnterComp(link->param1)) {
+			result = _doors[link->param1].handleCursor;
 		} else {
-			result = _gameInventory[kItemKey].cursor;
+			result = _items[kItemKey].mnum;
 		}
 
 		break;
-	case 12:
+	case kActionKnockInside:
 		if (link->param1 >= 128) {
 			result = kCursorNormal;
 		} else {
-			if (_gameObjects[link->param1].character)
-				result = _gameObjects[link->param1].cursor;
+			if (_doors[link->param1].who)
+				result = _doors[link->param1].windowCursor;
 			else
 				result = kCursorNormal;
 		}
 
 		break;
-	case 13:
+	case kActionTakeItem:
 		if (link->param1 >= 32) {
 			result = kCursorNormal;
-		} else if ((!_inventorySelectedItemIdx || _gameInventory[_inventorySelectedItemIdx].manualSelect) && (link->param1 != 21 || _gameProgress[kProgressEventCorpseMovedFromFloor] == 1)) {
+		} else if ((!_activeItem || _items[_activeItem].inPocket) && (link->param1 != 21 || _globals[kProgressEventCorpseMovedFromFloor] == 1)) {
 			result = kCursorHand;
 		} else {
 			result = kCursorNormal;
 		}
 
 		break;
-	case 14:
+	case kActionDropItem:
 		if (link->param1 >= 32) {
 			result = kCursorNormal;
-		} else if (link->param1 != _inventorySelectedItemIdx || link->param1 == 20 && !_gameProgress[kProgressIsTrainRunning] && link->param2 == 4 || link->param1 == 18 && link->param2 == 1 && _gameProgress[kProgressField5C]) {
+		} else if (link->param1 != _activeItem || link->param1 == 20 && !_globals[kProgressIsTrainRunning] && link->param2 == 4 || link->param1 == 18 && link->param2 == 1 && _globals[kProgressField5C]) {
 			result = kCursorNormal;
 		} else {
-			result = _gameInventory[_inventorySelectedItemIdx].cursor;
+			result = _items[_activeItem].mnum;
 		}
 
 		break;
-	case 15:
+	case kActionLinkOnGlobal:
 		if (link->param1 >= 128) {
 			result = kCursorNormal;
-		} else if (_gameProgress[link->param1] == link->param2) {
+		} else if (_globals[link->param1] == link->param2) {
 			result = link->param3;
 		} else {
 			result = kCursorNormal;
 		}
 
 		break;
-	case 16:
-		if (_inventorySelectedItemIdx == kItemKey && !_gameObjects[kItemMatchBox].door || _gameObjects[kItemMatchBox].door == 1 && cathHasItem(kItemKey) && (_inventorySelectedItemIdx == kItemBriefcase || _inventorySelectedItemIdx == kItemFirebird)) {
-			result = _gameInventory[kItemKey].cursor;
+	case kActionRattle:
+		if (_activeItem == kItemKey && !_doors[kItemMatchBox].status || _doors[kItemMatchBox].status == 1 && cathHasItem(kItemKey) && (_activeItem == kItemBriefcase || _activeItem == kItemFirebird)) {
+			result = _items[kItemKey].mnum;
 		} else {
 			if (link->param1 >= 128) {
 				result = 0;
-			} else if (_inventorySelectedItemIdx != kItemKey ||
-				_gameObjects[link->param1].character ||
-				_gameObjects[link->param1].door != 1 ||
-				!_gameObjects[link->param1].cursor2 ||
+			} else if (_activeItem != kItemKey ||
+				_doors[link->param1].who ||
+				_doors[link->param1].status != 1 ||
+				!_doors[link->param1].handleCursor ||
 				inComp(kCharacterCath) || preventEnterComp(link->param1)) {
-				result = _gameObjects[link->param1].cursor2;
+				result = _doors[link->param1].handleCursor;
 			} else {
-				result = _gameInventory[kItemKey].cursor;
+				result = _items[kItemKey].mnum;
 			}
 		}
 
 		break;
-	case 18:
-		if (_gameProgress[kProgressJacket] == 2) {
-			if ((_gameEvents[kEventCathLookOutsideWindowDay] || _gameEvents[kEventCathLookOutsideWindowNight] || getModel(1) == 1) &&
-				_gameProgress[kProgressIsTrainRunning] &&
-				(link->param1 != 45 || !inComp(kCharacterRebecca, kCarRedSleeping, 4840) && _gameObjects[kObjectOutsideBetweenCompartments].door == 2) &&
-				_inventorySelectedItemIdx != kItemBriefcase && _inventorySelectedItemIdx != kItemFirebird) {
+	case kActionLeanOutWindow:
+		if (_globals[kProgressJacket] == 2) {
+			if ((_doneNIS[kEventCathLookOutsideWindowDay] || _doneNIS[kEventCathLookOutsideWindowNight] || getModel(1) == 1) &&
+				_globals[kProgressIsTrainRunning] &&
+				(link->param1 != 45 || !inComp(kCharacterRebecca, kCarRedSleeping, 4840) && _doors[kObjectOutsideBetweenCompartments].status == 2) &&
+				_activeItem != kItemBriefcase && _activeItem != kItemFirebird) {
 				result = kCursorForward;
 			} else {
 				result = getModel(1) == 1 ? kCursorNormal : kCursorMagnifier;
@@ -131,19 +131,19 @@ int LogicManager::findCursor(Link *link) {
 		}
 
 		break;
-	case 19:
-		result = _gameProgress[kProgressFieldC8] == 0 ? kCursorNormal : kCursorLeft;
+	case kActionAlmostFall:
+		result = _globals[kProgressFieldC8] == 0 ? kCursorNormal : kCursorLeft;
 		break;
-	case 21:
-		if (_gameProgress[kProgressIsTrainRunning] && _inventorySelectedItemIdx != kItemBriefcase && _inventorySelectedItemIdx != kItemFirebird &&
-			(_gameProgress[kProgressChapter] == 2 || _gameProgress[kProgressChapter] == 3 || _gameProgress[kProgressChapter] == 5)) {
+	case kActionClimbLadder:
+		if (_globals[kProgressIsTrainRunning] && _activeItem != kItemBriefcase && _activeItem != kItemFirebird &&
+			(_globals[kProgressChapter] == 2 || _globals[kProgressChapter] == 3 || _globals[kProgressChapter] == 5)) {
 			result = kCursorUp;
 		} else {
 			result = kCursorNormal;
 		}
 
 		break;
-	case 23:
+	case kActionKronosSanctum:
 		if (link->param1 == 1) {
 			result = checkDoor(73) == 0 ? kCursorHand : kCursorNormal;
 		} else {
@@ -151,9 +151,9 @@ int LogicManager::findCursor(Link *link) {
 		}
 
 		break;
-	case 24:
+	case kActionEscapeBaggage:
 		if (link->param1 == 2) {
-			if (!_gameEvents[kEventCathStruggleWithBonds2] || _gameEvents[kEventCathBurnRope])
+			if (!_doneNIS[kEventCathStruggleWithBonds2] || _doneNIS[kEventCathBurnRope])
 				result = kCursorNormal;
 			else
 				result = kCursorHand;
@@ -162,11 +162,11 @@ int LogicManager::findCursor(Link *link) {
 		}
 
 		break;
-	case 30:
+	case kActionCatchBeetle:
 		if (_engine->_beetle) {
 			if (_engine->_beetle->onTable()) {
-				if (_inventorySelectedItemIdx == kItemMatchBox && cathHasItem(kItemMatch))
-					result = _gameInventory[kItemMatchBox].cursor;
+				if (_activeItem == kItemMatchBox && cathHasItem(kItemMatch))
+					result = _items[kItemMatchBox].mnum;
 				else
 					result = kCursorHandPointer;
 			} else {
@@ -177,10 +177,10 @@ int LogicManager::findCursor(Link *link) {
 		}
 
 		break;
-	case 33:
+	case kActionFirebirdPuzzle:
 		if (link->param1 == 3) {
-			if (_inventorySelectedItemIdx == kItemWhistle)
-				result = _gameInventory[kItemWhistle].cursor;
+			if (_activeItem == kItemWhistle)
+				result = _items[kItemWhistle].mnum;
 			else
 				result = kCursorNormal;
 		} else {
@@ -188,14 +188,14 @@ int LogicManager::findCursor(Link *link) {
 		}
 
 		break;
-	case 35:
-		result = _gameProgress[kProgressChapter] == 1 ? kCursorHand : kCursorNormal;
+	case kActionOpenBed:
+		result = _globals[kProgressChapter] == 1 ? kCursorHand : kCursorNormal;
 		break;
-	case 37:
+	case kActionHintDialog:
 		result = getHintDialog(link->param1) == 0 ? kCursorNormal : kCursorHandPointer;
 		break;
-	case 40:
-		if (_gameProgress[kProgressField18] == 2 && !_gameProgress[kProgressFieldE4] && (_gameTime > 1404000 || _gameProgress[kProgressEventMetAugust] && _gameProgress[kProgressFieldCC] && (!_gameProgress[kProgressField24] || _gameProgress[kProgressField3C]))) {
+	case kActionBed:
+		if (_globals[kProgressField18] == 2 && !_globals[kProgressFieldE4] && (_gameTime > 1404000 || _globals[kProgressEventMetAugust] && _globals[kProgressFieldCC] && (!_globals[kProgressField24] || _globals[kProgressField3C]))) {
 			result = kCursorSleep;
 		} else {
 			result = kCursorNormal;
@@ -211,41 +211,41 @@ int LogicManager::findCursor(Link *link) {
 }
 
 bool LogicManager::nodeHasItem(int item) {
-	switch (_trainData[_trainNodeIndex].car) {
-	case kCarKronos:
-		if (_trainData[_trainNodeIndex].parameter1 != item) {
+	switch (_trainData[_activeNode].property) {
+	case kNodeHasItem:
+		if (_trainData[_activeNode].parameter1 != item) {
 			return false;
 		} else {
 			return true;
 		}
 
 		break;
-	case kCarGreenSleeping:
-		if (_trainData[_trainNodeIndex].parameter1 != item && _trainData[_trainNodeIndex].parameter2 != item) {
+	case kNodeHas2Items:
+		if (_trainData[_activeNode].parameter1 != item && _trainData[_activeNode].parameter2 != item) {
 			return false;
 		} else {
 			return true;
 		}
 
 		break;
-	case kCarRedSleeping:
-		if (_trainData[_trainNodeIndex].parameter2 != item) {
+	case kNodeHasDoorItem:
+		if (_trainData[_activeNode].parameter2 != item) {
 			return false;
 		} else {
 			return true;
 		}
 
 		break;
-	case kCarRestaurant:
-		if (_trainData[_trainNodeIndex].parameter1 != item && _trainData[_trainNodeIndex].parameter2 != item && _trainData[_trainNodeIndex].parameter3 != item) {
+	case kNodeHas3Items:
+		if (_trainData[_activeNode].parameter1 != item && _trainData[_activeNode].parameter2 != item && _trainData[_activeNode].parameter3 != item) {
 			return false;
 		} else {
 			return true;
 		}
 
 		break;
-	case kCarLocomotive:
-		if (_trainData[_trainNodeIndex].parameter2 != item) {
+	case kNodeSoftPointItem:
+		if (_trainData[_activeNode].parameter2 != item) {
 			return false;
 		} else {
 			return true;
@@ -268,13 +268,13 @@ void LogicManager::doPreFunction(int *sceneOut) {
 	if (!*sceneOut || *sceneOut > 2500)
 		*sceneOut = 1;
 
-	switch (_trainData[*sceneOut].car) {
-	case kCarBaggageRear:
+	switch (_trainData[*sceneOut].property) {
+	case kNodeHasDoor:
 		if (_trainData[*sceneOut].parameter1 < 128) {
-			if (_gameObjects[_trainData[*sceneOut].parameter1].door) {
+			if (_doors[_trainData[*sceneOut].parameter1].status) {
 				link = _trainData[*sceneOut].link;
 				for (bool found = false; link && !found; link = link->next) {
-					if (_gameObjects[_trainData[*sceneOut].parameter1].door == link->location) {
+					if (_doors[_trainData[*sceneOut].parameter1].status == link->location) {
 						tmp.copyFrom(link);
 						doAction(&tmp);
 
@@ -290,12 +290,12 @@ void LogicManager::doPreFunction(int *sceneOut) {
 		}
 
 		break;
-	case kCarKronos:
+	case kNodeHasItem:
 		if (_trainData[*sceneOut].parameter1 < 32) {
-			if (_gameInventory[_trainData[*sceneOut].parameter1].location) {
+			if (_items[_trainData[*sceneOut].parameter1].floating) {
 				link = _trainData[*sceneOut].link;
 				for (bool found = false; link && !found; link = link->next) {
-					if (_gameInventory[_trainData[*sceneOut].parameter1].location == link->location) {
+					if (_items[_trainData[*sceneOut].parameter1].floating == link->location) {
 						tmp.copyFrom(link);
 						doAction(&tmp);
 
@@ -311,19 +311,19 @@ void LogicManager::doPreFunction(int *sceneOut) {
 		}
 
 		break;
-	case kCarGreenSleeping:
+	case kNodeHas2Items:
 		if (_trainData[*sceneOut].parameter1 < 32) {
 			if (_trainData[*sceneOut].parameter2 < 32) {
-				int locFlag = (_gameInventory[_trainData[*sceneOut].parameter1].location != 0) ? 1 : 0;
+				int locFlag = (_items[_trainData[*sceneOut].parameter1].floating != 0) ? 1 : 0;
 
-				if (_gameInventory[_trainData[*sceneOut].parameter2].location)
+				if (_items[_trainData[*sceneOut].parameter2].floating)
 					locFlag |= 2;
 
 				if (locFlag != 0) {
 					link = _trainData[*sceneOut].link;
 					for (bool found = false; link && !found; link = link->next) {
 						if (link->location == locFlag) {
-							if (_gameInventory[_trainData[*sceneOut].parameter1].location == link->param1 && _gameInventory[_trainData[*sceneOut].parameter2].location == link->param2) {
+							if (_items[_trainData[*sceneOut].parameter1].floating == link->param1 && _items[_trainData[*sceneOut].parameter2].floating == link->param2) {
 								tmp.copyFrom(link);
 								doAction(&tmp);
 
@@ -341,19 +341,19 @@ void LogicManager::doPreFunction(int *sceneOut) {
 		}
 
 		break;
-	case kCarRedSleeping:
+	case kNodeHasDoorItem:
 		if (_trainData[*sceneOut].parameter1 < 128) {
 			if (_trainData[*sceneOut].parameter2 < 32) {
-				int locFlag = (_gameObjects[_trainData[*sceneOut].parameter1].door == 2) ? 1 : 0;
+				int locFlag = (_doors[_trainData[*sceneOut].parameter1].status == 2) ? 1 : 0;
 
-				if (_gameInventory[_trainData[*sceneOut].parameter2].location)
+				if (_items[_trainData[*sceneOut].parameter2].floating)
 					locFlag |= 2;
 
 				if (locFlag != 0) {
 					link = _trainData[*sceneOut].link;
 					for (bool found = false; link && !found; link = link->next) {
 						if (link->location == locFlag) {
-							if (_gameObjects[_trainData[*sceneOut].parameter1].door == link->param1 && _gameInventory[_trainData[*sceneOut].parameter2].location == link->param2) {
+							if (_doors[_trainData[*sceneOut].parameter1].status == link->param1 && _items[_trainData[*sceneOut].parameter2].floating == link->param2) {
 								tmp.copyFrom(link);
 								doAction(&tmp);
 
@@ -371,22 +371,22 @@ void LogicManager::doPreFunction(int *sceneOut) {
 		}
 
 		break;
-	case kCarRestaurant:
+	case kNodeHas3Items:
 		if (_trainData[*sceneOut].parameter1 < 32 && _trainData[*sceneOut].parameter2 < 32) {
 			if (_trainData[*sceneOut].parameter3 < 32) {
-				int locFlag = (_gameInventory[_trainData[*sceneOut].parameter1].location != 0) ? 1 : 0;
+				int locFlag = (_items[_trainData[*sceneOut].parameter1].floating != 0) ? 1 : 0;
 
-				if (_gameInventory[_trainData[*sceneOut].parameter2].location)
+				if (_items[_trainData[*sceneOut].parameter2].floating)
 					locFlag |= 2;
 
-				if (_gameInventory[_trainData[*sceneOut].parameter3].location)
+				if (_items[_trainData[*sceneOut].parameter3].floating)
 					locFlag |= 4;
 
 				if (locFlag != 0) {
 					link = _trainData[*sceneOut].link;
 					for (bool found = false; link && !found; link = link->next) {
 						if (link->location == locFlag) {
-							if (_gameInventory[_trainData[*sceneOut].parameter1].location == link->param1 && _gameInventory[_trainData[*sceneOut].parameter2].location == link->param2 && _gameInventory[_trainData[*sceneOut].parameter3].location == link->param3) {
+							if (_items[_trainData[*sceneOut].parameter1].floating == link->param1 && _items[_trainData[*sceneOut].parameter2].floating == link->param2 && _items[_trainData[*sceneOut].parameter3].floating == link->param3) {
 								tmp.copyFrom(link);
 								doAction(&tmp);
 
@@ -404,13 +404,13 @@ void LogicManager::doPreFunction(int *sceneOut) {
 		}
 
 		break;
-	case kCarBaggage:
+	case kNodeModelPad:
 		if (_trainData[*sceneOut].parameter1 < 128) {
 			link = _trainData[*sceneOut].link;
 			bool found = false;
 			if (link) {
 				while (!found) {
-					if (_gameObjects[_trainData[*sceneOut].parameter1].model == link->location) {
+					if (_doors[_trainData[*sceneOut].parameter1].model == link->location) {
 						tmp.copyFrom(link);
 						doAction(&tmp);
 
@@ -453,11 +453,11 @@ void LogicManager::doPreFunction(int *sceneOut) {
 		}
 
 		break;
-	case kCarCoalTender:
+	case kNodeSoftPoint:
 		if (_trainData[*sceneOut].parameter1 < 16 &&
-			(_softBlockedEntitiesBits[_trainData[*sceneOut].parameter1] || _blockedEntitiesBits[_trainData[*sceneOut].parameter1])) {
-			if ((!_engine->getOtisManager()->fDirection(_trainNodeIndex) || !_engine->getOtisManager()->fDirection(*sceneOut) || _trainData[_trainNodeIndex].nodePosition.position >= _trainData[*sceneOut].nodePosition.position) &&
-				(!_engine->getOtisManager()->rDirection(_trainNodeIndex) || !_engine->getOtisManager()->rDirection(*sceneOut) || _trainData[_trainNodeIndex].nodePosition.position <= _trainData[*sceneOut].nodePosition.position)) {
+			(_softBlockedX[_trainData[*sceneOut].parameter1] || _blockedX[_trainData[*sceneOut].parameter1])) {
+			if ((!_engine->getOtisManager()->fDirection(_activeNode) || !_engine->getOtisManager()->fDirection(*sceneOut) || _trainData[_activeNode].nodePosition.position >= _trainData[*sceneOut].nodePosition.position) &&
+				(!_engine->getOtisManager()->rDirection(_activeNode) || !_engine->getOtisManager()->rDirection(*sceneOut) || _trainData[_activeNode].nodePosition.position <= _trainData[*sceneOut].nodePosition.position)) {
 				next = _trainData[*sceneOut].link->next;
 				scene = next->scene;
 				*sceneOut = (int)scene;
@@ -466,8 +466,8 @@ void LogicManager::doPreFunction(int *sceneOut) {
 				break;
 			}
 
-			if (whoseBit(_softBlockedEntitiesBits[_trainData[*sceneOut].parameter1]) != 30 &&
-				whoseBit(_blockedEntitiesBits[_trainData[*sceneOut].parameter1]) != 30) {
+			if (whoseBit(_softBlockedX[_trainData[*sceneOut].parameter1]) != 30 &&
+				whoseBit(_blockedX[_trainData[*sceneOut].parameter1]) != 30) {
 				playDialog(kCharacterCath, "CAT1126A", -1, 0);
 			}
 
@@ -477,17 +477,17 @@ void LogicManager::doPreFunction(int *sceneOut) {
 		}
 
 		break;
-	case kCarLocomotive:
+	case kNodeSoftPointItem:
 		if (_trainData[*sceneOut].parameter1 < (_engine->isDemo() ? 16 : 32)) {
-			if (_softBlockedEntitiesBits[_trainData[*sceneOut].parameter1] || _blockedEntitiesBits[_trainData[*sceneOut].parameter1]) {
-				if (_engine->getOtisManager()->fDirection(_trainNodeIndex) &&
+			if (_softBlockedX[_trainData[*sceneOut].parameter1] || _blockedX[_trainData[*sceneOut].parameter1]) {
+				if (_engine->getOtisManager()->fDirection(_activeNode) &&
 					_engine->getOtisManager()->fDirection(*sceneOut) &&
-					_trainData[_trainNodeIndex].nodePosition.position < _trainData[*sceneOut].nodePosition.position ||
-					_engine->getOtisManager()->rDirection(_trainNodeIndex) &&
+					_trainData[_activeNode].nodePosition.position < _trainData[*sceneOut].nodePosition.position ||
+					_engine->getOtisManager()->rDirection(_activeNode) &&
 					_engine->getOtisManager()->rDirection(*sceneOut) &&
-					_trainData[_trainNodeIndex].nodePosition.position > _trainData[*sceneOut].nodePosition.position) {
+					_trainData[_activeNode].nodePosition.position > _trainData[*sceneOut].nodePosition.position) {
 
-					if (whoseBit(_softBlockedEntitiesBits[_trainData[*sceneOut].parameter1]) != 30 && whoseBit(_blockedEntitiesBits[_trainData[*sceneOut].parameter1]) != 30) {
+					if (whoseBit(_softBlockedX[_trainData[*sceneOut].parameter1]) != 30 && whoseBit(_blockedX[_trainData[*sceneOut].parameter1]) != 30) {
 						playDialog(kCharacterCath, "CAT1126A", -1, 0);
 					}
 
@@ -501,10 +501,10 @@ void LogicManager::doPreFunction(int *sceneOut) {
 				doPreFunction(sceneOut);
 			} else {
 				if (_trainData[*sceneOut].parameter2 < 32) {
-					if (_gameInventory[_trainData[*sceneOut].parameter2].location) {
+					if (_items[_trainData[*sceneOut].parameter2].floating) {
 						link = _trainData[*sceneOut].link;
 						for (bool found = false; link && !found; link = link->next) {
-							if (_gameInventory[_trainData[*sceneOut].parameter2].location == link->location) {
+							if (_items[_trainData[*sceneOut].parameter2].floating == link->location) {
 								tmp.copyFrom(link);
 								doAction(&tmp);
 
@@ -527,12 +527,12 @@ void LogicManager::doPreFunction(int *sceneOut) {
 	}
 
 	if (whoRunningDialog(kCharacterTableE)) {
-		if (_trainData[*sceneOut].car != 132 || _trainData[*sceneOut].parameter1)
+		if (_trainData[*sceneOut].property != kNodeRebeccaDiary || _trainData[*sceneOut].parameter1)
 			fadeDialog(kCharacterTableE);
 	}
 
 	if (!_engine->isDemo() && _engine->_beetle) {
-		if (_trainData[*sceneOut].car != 130)
+		if (_trainData[*sceneOut].property != kNodeBeetle)
 			_engine->endBeetle();
 	}
 }
@@ -540,13 +540,13 @@ void LogicManager::doPreFunction(int *sceneOut) {
 void LogicManager::doPostFunction() {
 	Link tmp;
 
-	switch (_trainData[_trainNodeIndex].car) {
-	case 128:
+	switch (_trainData[_activeNode].property) {
+	case kNodeAutoWalk:
 	{
-		int32 delta = _trainData[_trainNodeIndex].parameter1 + 10;
-		_gameTime += delta * _gameTimeTicksDelta;
-		_currentGameSessionTicks += delta;
-		int32 delayedTicks = _engine->getSoundFrameCounter() + 4 * _trainData[_trainNodeIndex].parameter1;
+		int32 delta = _trainData[_activeNode].parameter1 + 10;
+		_gameTime += delta * _timeSpeed;
+		_realTime += delta;
+		int32 delayedTicks = _engine->getSoundFrameCounter() + 4 * _trainData[_activeNode].parameter1;
 
 		if (!_engine->mouseHasRightClicked() && delayedTicks > _engine->getSoundFrameCounter()) {
 			do {
@@ -557,17 +557,17 @@ void LogicManager::doPostFunction() {
 			} while (delayedTicks > _engine->getSoundFrameCounter());
 		}
 
-		tmp.copyFrom(_trainData[_trainNodeIndex].link);
+		tmp.copyFrom(_trainData[_activeNode].link);
 		doAction(&tmp);
 
-		if (_engine->mouseHasRightClicked() && _trainData[tmp.scene].car == 128) {
+		if (_engine->mouseHasRightClicked() && _trainData[tmp.scene].property == kNodeAutoWalk) {
 			do {
 				tmp.copyFrom(_trainData[tmp.scene].link);
 				doAction(&tmp);
-			} while (_trainData[tmp.scene].car == 128);
+			} while (_trainData[tmp.scene].property == kNodeAutoWalk);
 		}
 
-		if (getCharacter(kCharacterCath).characterPosition.car == 9 &&
+		if (getCharacter(kCharacterCath).characterPosition.car == kCarVestibule &&
 			(getCharacter(kCharacterCath).characterPosition.position == 4 ||
 			 getCharacter(kCharacterCath).characterPosition.position == 3)) {
 
@@ -578,11 +578,11 @@ void LogicManager::doPostFunction() {
 
 			for (int j = 1; j < 40; j++) {
 				if (getCharacter(kCharacterCath).characterPosition.position == 4) {
-					if (getCharacter(j).characterPosition.car == 4 && getCharacter(j).characterPosition.position > 9270 || getCharacter(j).characterPosition.car == 5 && getCharacter(j).characterPosition.position < 1540) {
+					if (getCharacter(j).characterPosition.car == kCarRedSleeping && getCharacter(j).characterPosition.position > 9270 || getCharacter(j).characterPosition.car == kCarRestaurant && getCharacter(j).characterPosition.position < 1540) {
 						charactersRndArray[characterIdx] = j;
 						characterIdx++;
 					}
-				} else if (getCharacter(j).characterPosition.car == 3 && getCharacter(j).characterPosition.position > 9270 || getCharacter(j).characterPosition.car == 4 && getCharacter(j).characterPosition.position < 850) {
+				} else if (getCharacter(j).characterPosition.car == kCarGreenSleeping && getCharacter(j).characterPosition.position > 9270 || getCharacter(j).characterPosition.car == kCarRedSleeping && getCharacter(j).characterPosition.position < 850) {
 					charactersRndArray[characterIdx] = j;
 					characterIdx++;
 				}
@@ -602,23 +602,23 @@ void LogicManager::doPostFunction() {
 
 		return;
 	}
-	case 129:
+	case kNodeSleepingOnBed:
 		if (_engine->isDemo())
 			break;
 
-		if (_gameProgress[kProgressField18] == 2)
+		if (_globals[kProgressField18] == 2)
 			send(kCharacterCath, kCharacterMaster, 190346110, 0);
 
 		return;
-	case 130:
+	case kNodeBeetle:
 		if (_engine->isDemo())
 			break;
 
 		_engine->doBeetle();
 		return;
-	case 131:
+	case kNodePullingStop:
 	{
-		if (_gameTime < 2418300 && _gameProgress[kProgressField18] != 4) {
+		if (_gameTime < 2418300 && _globals[kProgressField18] != 4) {
 			Slot *slot = _engine->getSoundManager()->_soundCache;
 			if (slot) {
 				do {
@@ -634,9 +634,9 @@ void LogicManager::doPostFunction() {
 
 			playDialog(kCharacterClerk, "LIB050", 16, 0);
 
-			if (_gameProgress[kProgressChapter] == 1) {
+			if (_globals[kProgressChapter] == 1) {
 				endGame(0, 0, 62, true);
-			} else if (_gameProgress[kProgressChapter] == 4) {
+			} else if (_globals[kProgressChapter] == 4) {
 				endGame(0, 0, 64, true);
 			} else {
 				endGame(0, 0, 63, true);
@@ -645,9 +645,9 @@ void LogicManager::doPostFunction() {
 
 		return;
 	}
-	case 132:
+	case kNodeRebeccaDiary:
 		if (!whoRunningDialog(kCharacterTableE)) {
-			switch (_trainData[_trainNodeIndex].parameter1) {
+			switch (_trainData[_activeNode].parameter1) {
 			case 1:
 				if (dialogRunning("TXT1001"))
 					endDialog("TXT1001");
@@ -747,7 +747,7 @@ void LogicManager::doPostFunction() {
 		}
 
 		return;
-	case 133:
+	case kNodeExitFastWalk:
 		if (_doubleClickFlag) {
 			_doubleClickFlag = false;
 			_engine->getGraphicsManager()->setMouseDrawable(true);
@@ -769,27 +769,27 @@ void LogicManager::doAction(Link *link) {
 	switch (link->action) {
 	case kActionInventory:
 	{
-		if (_useLastSavedNodeIndex) {
+		if (_closeUp) {
 			int bumpScene = 0;
-			if (_lastSavedNodeIndex) {
-				bumpScene = _lastSavedNodeIndex;
-				_lastSavedNodeIndex = 0;
+			if (_nodeReturn2) {
+				bumpScene = _nodeReturn2;
+				_nodeReturn2 = 0;
 				bumpCathNode(bumpScene);
 			} else {
-				_useLastSavedNodeIndex = 0;
+				_closeUp = 0;
 
-				if (_positions[100 * _trainData[_lastNodeIndex].nodePosition.car + _trainData[_lastNodeIndex].cathDir]) {
-					bumpCathNode(getSmartBumpNode(_lastNodeIndex));
+				if (_blockedViews[100 * _trainData[_nodeReturn].nodePosition.car + _trainData[_nodeReturn].cathDir]) {
+					bumpCathNode(getSmartBumpNode(_nodeReturn));
 				} else {
-					bumpCathNode(_lastNodeIndex);
+					bumpCathNode(_nodeReturn);
 				}
 			}
 
-			if (_inventorySelectedItemIdx && (!_gameInventory[_inventorySelectedItemIdx].isSelectable || (bumpScene == 0 && findLargeItem()))) {
-				_inventorySelectedItemIdx = findLargeItem();
+			if (_activeItem && (!_items[_activeItem].useable || (bumpScene == 0 && findLargeItem()))) {
+				_activeItem = findLargeItem();
 
-				if (_inventorySelectedItemIdx) {
-					_engine->getGraphicsManager()->drawItem(_gameInventory[_inventorySelectedItemIdx].cursor, 44, 0);
+				if (_activeItem) {
+					_engine->getGraphicsManager()->drawItem(_items[_activeItem].mnum, 44, 0);
 				} else if (_engine->getGraphicsManager()->acquireSurface()) {
 					_engine->getGraphicsManager()->clear(_engine->getGraphicsManager()->_screenSurface, 44, 0, 32, 32);
 					_engine->getGraphicsManager()->unlockSurface();
@@ -813,14 +813,14 @@ void LogicManager::doAction(Link *link) {
 		break;
 	case kActionPlayMusic:
 		Common::sprintf_s(filename, "MUS%03d", link->param1);
-		if (!dialogRunning(filename) && (link->param1 != 50 || _gameProgress[kProgressChapter] == 5))
+		if (!dialogRunning(filename) && (link->param1 != 50 || _globals[kProgressChapter] == 5))
 			playDialog(kCharacterCath, filename, 16, link->param2);
 
 		break;
 	case kActionKnock:
 		if (link->param1 < 128) {
-			if (_gameObjects[link->param1].character) {
-				send(kCharacterCath, _gameObjects[link->param1].character, 8, link->param1);
+			if (_doors[link->param1].who) {
+				send(kCharacterCath, _doors[link->param1].who, 8, link->param1);
 				return;
 			}
 
@@ -835,7 +835,7 @@ void LogicManager::doAction(Link *link) {
 
 		break;
 	case kActionPlayAnimation:
-		if (!_gameEvents[link->param1]) {
+		if (!_doneNIS[link->param1]) {
 			playNIS(link->param1);
 
 			if (!link->scene)
@@ -843,11 +843,11 @@ void LogicManager::doAction(Link *link) {
 		}
 
 		break;
-	case kActionOpenCloseObject:
+	case kActionSetDoor:
 		if (link->param1 >= 128)
 			return;
 
-		setDoor(link->param1, _gameObjects[link->param1].character, link->param2, 255, 255);
+		setDoor(link->param1, _doors[link->param1].who, link->param2, 255, 255);
 		if ((link->param1 < 9 || link->param1 > 16) && (link->param1 < 40 || link->param1 > 47)) {
 			if (link->param2) {
 				if (link->param2 == 1) {
@@ -888,39 +888,39 @@ void LogicManager::doAction(Link *link) {
 			break;
 
 		if (link->param1 < 32) {
-			if (!_gameInventory[link->param1].isPresent) {
-				_gameInventory[link->param1].location = link->param2;
+			if (!_items[link->param1].haveIt) {
+				_items[link->param1].floating = link->param2;
 
 				if (link->param1 == kItemCorpse) {
-					_gameProgress[kProgressEventCorpseMovedFromFloor] = (_gameInventory[kItemCorpse].location == 3 || _gameInventory[kItemCorpse].location == 4) ? 1 : 0;
+					_globals[kProgressEventCorpseMovedFromFloor] = (_items[kItemCorpse].floating == 3 || _items[kItemCorpse].floating == 4) ? 1 : 0;
 				}
 			}
 		}
 
 		break;
-	case kActionPickItem:
+	case kActionTakeItem:
 		if (_engine->isDemo())
 			break;
 
 		if (link->param1 >= 32)
 			return;
 
-		if (!_gameInventory[link->param1].location)
+		if (!_items[link->param1].floating)
 			return;
 
 		if (link->param1 == kItemCorpse) {
 			takeTyler(link->scene == 0, link->param2);
 
 			if (link->param2 != 4) {
-				_gameInventory[kItemCorpse].isPresent = 1;
-				_gameInventory[kItemCorpse].location = 0;
-				_inventorySelectedItemIdx = kItemCorpse;
-				_engine->getGraphicsManager()->drawItem(_gameInventory[kItemCorpse].cursor, 44, 0);
+				_items[kItemCorpse].haveIt = 1;
+				_items[kItemCorpse].floating = 0;
+				_activeItem = kItemCorpse;
+				_engine->getGraphicsManager()->drawItem(_items[kItemCorpse].mnum, 44, 0);
 				_engine->getGraphicsManager()->burstBox(44u, 0, 32, 32);
 			}
 		} else {
-			_gameInventory[link->param1].isPresent = 1;
-			_gameInventory[link->param1].location = 0;
+			_items[link->param1].haveIt = 1;
+			_items[link->param1].floating = 0;
 
 			if (link->param1 == kItemGreenJacket) {
 				takeJacket(link->scene == 0);
@@ -931,9 +931,9 @@ void LogicManager::doAction(Link *link) {
 				}
 
 				if (link->param1 == kItemParchemin && link->param2 == 2) {
-					_gameInventory[kItemParchemin].isPresent = 1;
-					_gameInventory[kItemParchemin].location = 0;
-					_gameInventory[kItem11].location = 1;
+					_items[kItemParchemin].haveIt = 1;
+					_items[kItemParchemin].floating = 0;
+					_items[kItem11].floating = 1;
 					queueSFX(kCharacterCath, 9, 0);
 				} else if (link->param1 == kItemBomb) {
 					forceJump(kCharacterAbbot, &LogicManager::CONS_Abbot_CatchCath);
@@ -942,22 +942,22 @@ void LogicManager::doAction(Link *link) {
 				}
 			}
 
-			if (_gameInventory[link->param1].scene) {
-				if (!_useLastSavedNodeIndex) {
+			if (_items[link->param1].closeUp) {
+				if (!_closeUp) {
 					if (!link->scene)
-						link->scene = _trainNodeIndex;
+						link->scene = _activeNode;
 
-					_useLastSavedNodeIndex = 1;
-					_lastNodeIndex = link->scene;
+					_closeUp = 1;
+					_nodeReturn = link->scene;
 				}
 
-				bumpCathNode(_gameInventory[link->param1].scene);
+				bumpCathNode(_items[link->param1].closeUp);
 				link->scene = kSceneNone;
 			}
 
-			if (_gameInventory[link->param1].isSelectable) {
-				_inventorySelectedItemIdx = link->param1;
-				_engine->getGraphicsManager()->drawItem(_gameInventory[link->param1].cursor, 44, 0);
+			if (_items[link->param1].useable) {
+				_activeItem = link->param1;
+				_engine->getGraphicsManager()->drawItem(_items[link->param1].mnum, 44, 0);
 				_engine->getGraphicsManager()->burstBox(44, 0, 32, 32);
 			}
 		}
@@ -967,33 +967,33 @@ void LogicManager::doAction(Link *link) {
 		if (_engine->isDemo())
 			break;
 
-		if (link->param1 >= 32 || !_gameInventory[link->param1].isPresent || !link->param2)
+		if (link->param1 >= 32 || !_items[link->param1].haveIt || !link->param2)
 			return;
 
 		if (link->param1 == kItemBriefcase) {
 			queueSFX(kCharacterCath, 82, 0);
 
 			if (link->param2 == 2) {
-				if (!_gameProgress[kProgressField58]) {
+				if (!_globals[kProgressField58]) {
 					_engine->getVCR()->writeSavePoint(1, 0, 0);
-					_gameProgress[kProgressField58] = 1;
+					_globals[kProgressField58] = 1;
 				}
 
-				if (_gameInventory[kItemParchemin].location == 2) {
-					_gameInventory[kItemParchemin].isPresent = 1;
-					_gameInventory[kItemParchemin].location = 0;
-					_gameInventory[kItem11].location = 1;
+				if (_items[kItemParchemin].floating == 2) {
+					_items[kItemParchemin].haveIt = 1;
+					_items[kItemParchemin].floating = 0;
+					_items[kItem11].floating = 1;
 					queueSFX(kCharacterCath, 9, 0);
 				}
 			}
 		}
 
-		_gameInventory[link->param1].isPresent = 0;
-		_gameInventory[link->param1].location = link->param2;
+		_items[link->param1].haveIt = 0;
+		_items[link->param1].floating = link->param2;
 		if (link->param1 == 20)
 			dropTyler(link->scene == 0);
 
-		_inventorySelectedItemIdx = 0;
+		_activeItem = 0;
 
 		if (_engine->getGraphicsManager()->acquireSurface()) {
 			_engine->getGraphicsManager()->clear(_engine->getGraphicsManager()->_screenSurface, 44, 0, 32, 32);
@@ -1007,7 +1007,7 @@ void LogicManager::doAction(Link *link) {
 		if (_engine->isDemo())
 			break;
 
-		if (!_gameEvents[kEventCathLookOutsideWindowDay] && !_gameEvents[kEventCathLookOutsideWindowNight] && getModel(1) != 1 || !_gameProgress[kProgressIsTrainRunning] || link->param1 == 45 && (inComp(kCharacterRebecca, kCarRedSleeping, 4840) || _gameObjects[kObjectOutsideBetweenCompartments].door != 2) || _inventorySelectedItemIdx == kItemBriefcase || _inventorySelectedItemIdx == kItemFirebird) {
+		if (!_doneNIS[kEventCathLookOutsideWindowDay] && !_doneNIS[kEventCathLookOutsideWindowNight] && getModel(1) != 1 || !_globals[kProgressIsTrainRunning] || link->param1 == 45 && (inComp(kCharacterRebecca, kCarRedSleeping, 4840) || _doors[kObjectOutsideBetweenCompartments].status != 2) || _activeItem == kItemBriefcase || _activeItem == kItemFirebird) {
 			if (link->param1 == 9 || link->param1 >= 44 && link->param1 <= 45) {
 				if (isNight()) {
 					playNIS(kEventCathLookOutsideWindowNight);
@@ -1023,7 +1023,7 @@ void LogicManager::doAction(Link *link) {
 
 		switch (link->param1) {
 		case 9:
-			_gameEvents[kEventCathLookOutsideWindowDay] = 1;
+			_doneNIS[kEventCathLookOutsideWindowDay] = 1;
 
 			if (isNight()) {
 				playNIS(kEventCathGoOutsideTylerCompartmentNight);
@@ -1031,10 +1031,10 @@ void LogicManager::doAction(Link *link) {
 				playNIS(kEventCathGoOutsideTylerCompartmentDay);
 			}
 
-			_gameProgress[kProgressFieldC8] = 1;
+			_globals[kProgressFieldC8] = 1;
 			break;
 		case 44:
-			_gameEvents[kEventCathLookOutsideWindowDay] = 1;
+			_doneNIS[kEventCathLookOutsideWindowDay] = 1;
 
 			if (isNight()) {
 				playNIS(kEventCathGoOutsideNight);
@@ -1042,10 +1042,10 @@ void LogicManager::doAction(Link *link) {
 				playNIS(kEventCathGoOutsideDay);
 			}
 
-			_gameProgress[kProgressFieldC8] = 1;
+			_globals[kProgressFieldC8] = 1;
 			break;
 		case 45:
-			_gameEvents[kEventCathLookOutsideWindowDay] = 1;
+			_doneNIS[kEventCathLookOutsideWindowDay] = 1;
 
 			if (isNight()) {
 				playNIS(kEventCathGetInsideNight);
@@ -1071,7 +1071,7 @@ void LogicManager::doAction(Link *link) {
 				playNIS(kEventCathSlipTylerCompartmentDay);
 			}
 
-			_gameProgress[kProgressFieldC8] = 0;
+			_globals[kProgressFieldC8] = 0;
 
 			if (link->scene)
 				return;
@@ -1085,7 +1085,7 @@ void LogicManager::doAction(Link *link) {
 				playNIS(kEventCathSlipDay);
 			}
 
-			_gameProgress[kProgressFieldC8] = 0;
+			_globals[kProgressFieldC8] = 0;
 
 			if (link->scene)
 				return;
@@ -1138,10 +1138,10 @@ void LogicManager::doAction(Link *link) {
 			break;
 
 		if (link->param1 == 1) {
-			if (_gameProgress[kProgressChapter] == 2 || _gameProgress[kProgressChapter] == 3) {
+			if (_globals[kProgressChapter] == 2 || _globals[kProgressChapter] == 3) {
 				playNIS(kEventCathTopTrainGreenJacket);
-			} else if (_gameProgress[kProgressChapter] == 5) {
-				playNIS(kEventCathTopTrainNoJacketDay - (_gameProgress[kProgressIsDayTime] == kProgressField0));
+			} else if (_globals[kProgressChapter] == 5) {
+				playNIS(kEventCathTopTrainNoJacketDay - (_globals[kProgressIsDayTime] == kProgressField0));
 			}
 
 			if (link->scene)
@@ -1150,12 +1150,12 @@ void LogicManager::doAction(Link *link) {
 			if (link->param1 != 2)
 				return;
 
-			if (_gameProgress[kProgressChapter] == 2 || _gameProgress[kProgressChapter] == 3) {
+			if (_globals[kProgressChapter] == 2 || _globals[kProgressChapter] == 3) {
 				playNIS(kEventCathClimbUpTrainGreenJacket);
 				playNIS(kEventCathTopTrainGreenJacket);
-			} else if (_gameProgress[kProgressChapter] == 5) {
-				playNIS(kEventCathClimbUpTrainNoJacketDay - (_gameProgress[kProgressIsDayTime] == 0));
-				playNIS(kEventCathTopTrainNoJacketDay - (_gameProgress[kProgressIsDayTime] == 0));
+			} else if (_globals[kProgressChapter] == 5) {
+				playNIS(kEventCathClimbUpTrainNoJacketDay - (_globals[kProgressIsDayTime] == 0));
+				playNIS(kEventCathTopTrainNoJacketDay - (_globals[kProgressIsDayTime] == 0));
 			}
 
 			if (link->scene)
@@ -1168,10 +1168,10 @@ void LogicManager::doAction(Link *link) {
 		if (_engine->isDemo())
 			break;
 
-		if (_gameProgress[kProgressChapter] == 2 || _gameProgress[kProgressChapter] == 3) {
+		if (_globals[kProgressChapter] == 2 || _globals[kProgressChapter] == 3) {
 			nisId = kEventCathClimbDownTrainGreenJacket;
-		} else if (_gameProgress[kProgressChapter] == 5) {
-			if (_gameProgress[kProgressIsDayTime] == 0) {
+		} else if (_globals[kProgressChapter] == 5) {
+			if (_globals[kProgressIsDayTime] == 0) {
 				nisId = kEventCathClimbDownTrainNoJacketNight;
 			} else {
 				nisId = kEventCathClimbDownTrainNoJacketDay;
@@ -1201,11 +1201,11 @@ void LogicManager::doAction(Link *link) {
 			send(kCharacterCath, 32, 338494260, 0);
 			break;
 		case 3:
-			if (_inventorySelectedItemIdx == kItemBriefcase) {
-				_gameInventory[kItemBriefcase].location = 3;
-				_gameInventory[kItemBriefcase].isPresent = 0;
+			if (_activeItem == kItemBriefcase) {
+				_items[kItemBriefcase].floating = 3;
+				_items[kItemBriefcase].haveIt = 0;
 				queueSFX(kCharacterCath, 82, 0);
-				_inventorySelectedItemIdx = 0;
+				_activeItem = 0;
 				if (_engine->getGraphicsManager()->acquireSurface()) {
 					_engine->getGraphicsManager()->clear(_engine->getGraphicsManager()->_screenSurface, 44, 0, 32, 32);
 					_engine->getGraphicsManager()->unlockSurface();
@@ -1213,7 +1213,7 @@ void LogicManager::doAction(Link *link) {
 				_engine->getGraphicsManager()->burstBox(44, 0, 32, 32);
 			}
 
-			if (_gameInventory[kItemBriefcase].location == 3) {
+			if (_items[kItemBriefcase].floating == 3) {
 				nisId = kEventCathJumpUpCeiling;
 			} else {
 				nisId = kEventCathJumpUpCeilingBriefcase;
@@ -1221,7 +1221,7 @@ void LogicManager::doAction(Link *link) {
 
 			break;
 		case 4:
-			if (_gameProgress[kProgressChapter] == 1)
+			if (_globals[kProgressChapter] == 1)
 				send(kCharacterCath, kCharacterKronos, 202621266, 0);
 			break;
 		default:
@@ -1248,16 +1248,16 @@ void LogicManager::doAction(Link *link) {
 			nisId = kEventCathBurnRope;
 			break;
 		case 3:
-			if (_gameEvents[kEventCathBurnRope]) {
+			if (_doneNIS[kEventCathBurnRope]) {
 				playNIS(kEventCathRemoveBonds);
-				_gameProgress[kProgressField84] = 0;
+				_globals[kProgressField84] = 0;
 				bumpCath(kCarBaggageRear, 89, 255);
 				link->scene = kSceneNone;
 			}
 
 			break;
 		case 4:
-			if (!_gameEvents[kEventCathStruggleWithBonds2]) {
+			if (!_doneNIS[kEventCathStruggleWithBonds2]) {
 				playNIS(kEventCathStruggleWithBonds2);
 				queueSFX(kCharacterCath, 101, 0);
 				dropItem(kItemMatch, 2);
@@ -1297,7 +1297,7 @@ void LogicManager::doAction(Link *link) {
 				link->scene = kSceneNone;
 			} else {
 				if (cathHasItem(kItemKey)) {
-					if (!_gameEvents[kEventAnnaBaggageArgument]) {
+					if (!_doneNIS[kEventAnnaBaggageArgument]) {
 						forceJump(kCharacterAnna, &LogicManager::CONS_Anna_BaggageFight);
 						link->scene = kSceneNone;
 					}
@@ -1318,7 +1318,7 @@ void LogicManager::doAction(Link *link) {
 			break;
 		case 2:
 			send(kCharacterCath, kCharacterMaster, 225367984, 0);
-			_inventorySelectedItemIdx = 0;
+			_activeItem = 0;
 
 			if (_engine->getGraphicsManager()->acquireSurface()) {
 				_engine->getGraphicsManager()->clear(_engine->getGraphicsManager()->_screenSurface, 44, 0, 32, 32);
@@ -1380,7 +1380,7 @@ void LogicManager::doAction(Link *link) {
 		if (_engine->isDemo())
 			break;
 
-		_gameProgress[kProgressFieldC] = 1;
+		_globals[kProgressFieldC] = 1;
 		queueSFX(kCharacterCath, link->param1, link->param2);
 		Common::sprintf_s(filename, "MUS%03d", link->param3);
 		if (!dialogRunning(filename))
@@ -1393,7 +1393,7 @@ void LogicManager::doAction(Link *link) {
 
 		if (_engine->_beetle && _engine->_beetle->click()) {
 			_engine->endBeetle();
-			_gameInventory[kItemBeetle].location = 1;
+			_items[kItemBeetle].floating = 1;
 			send(kCharacterCath, kCharacterClerk, 202613084, 0);
 		}
 
@@ -1401,28 +1401,28 @@ void LogicManager::doAction(Link *link) {
 
 	case kActionCompartment:
 	case kActionExitCompartment:
-	case kActionEnterCompartment:
+	case kActionRattle:
 	{
 		bool skipFlag = false;
 
 		if (link->action != kActionCompartment) {
 			if (!_engine->isDemo()) {
 				if (link->action == kActionExitCompartment) {
-					if (!_gameProgress[kProgressField30] && _gameProgress[kProgressJacket]) {
+					if (!_globals[kProgressField30] && _globals[kProgressJacket]) {
 						_engine->getVCR()->writeSavePoint(1, kCharacterCath, 0);
-						_gameProgress[kProgressField30] = 1;
+						_globals[kProgressField30] = 1;
 					}
 
 					setModel(1, link->param2);
 				}
 
-				if (_gameObjects[kItemMatchBox].door != 1 && _gameObjects[kItemMatchBox].door != 3 && _inventorySelectedItemIdx != kItemKey) {
-					if (!_gameProgress[kProgressEventFoundCorpse]) {
+				if (_doors[kItemMatchBox].status != 1 && _doors[kItemMatchBox].status != 3 && _activeItem != kItemKey) {
+					if (!_globals[kProgressEventFoundCorpse]) {
 						_engine->getVCR()->writeSavePoint(1, kCharacterCath, 0);
 						playDialog(kCharacterCath, "LIB014", -1, 0);
 						playNIS(kEventCathFindCorpse);
 						playDialog(kCharacterCath, "LIB015", -1, 0);
-						_gameProgress[kProgressEventFoundCorpse] = 1;
+						_globals[kProgressEventFoundCorpse] = 1;
 						link->scene = kSceneCompartmentCorpse;
 
 						return;
@@ -1435,12 +1435,12 @@ void LogicManager::doAction(Link *link) {
 			}
 		}
 
-		if (skipFlag || link->action == kActionCompartment || (link->action != kActionEnterCompartment || _gameInventory[kItemBriefcase].location != 2)) {
+		if (skipFlag || link->action == kActionCompartment || (link->action != kActionRattle || _items[kItemBriefcase].floating != 2)) {
 			if (link->param1 >= 128)
 				return;
 
-			if (_gameObjects[link->param1].character) {
-				send(kCharacterCath, _gameObjects[link->param1].character, 9, link->param1);
+			if (_doors[link->param1].who) {
+				send(kCharacterCath, _doors[link->param1].who, 9, link->param1);
 				link->scene = kSceneNone;
 				return;
 			}
@@ -1452,8 +1452,8 @@ void LogicManager::doAction(Link *link) {
 				}
 			}
 
-			if (_gameObjects[link->param1].door == 1 || _gameObjects[link->param1].door == 3 || preventEnterComp(link->param1)) {
-				if (_gameObjects[link->param1].door != 1 || preventEnterComp(link->param1) || _inventorySelectedItemIdx != 15 && (link->param1 != 1 || !cathHasItem(kItemKey) || _inventorySelectedItemIdx != kItemBriefcase && _inventorySelectedItemIdx != kItemFirebird)) {
+			if (_doors[link->param1].status == 1 || _doors[link->param1].status == 3 || preventEnterComp(link->param1)) {
+				if (_doors[link->param1].status != 1 || preventEnterComp(link->param1) || _activeItem != 15 && (link->param1 != 1 || !cathHasItem(kItemKey) || _activeItem != kItemBriefcase && _activeItem != kItemFirebird)) {
 					if (!cathRunningDialog("LIB013"))
 						queueSFX(kCharacterCath, 13, 0);
 
@@ -1467,13 +1467,13 @@ void LogicManager::doAction(Link *link) {
 					setDoor(link->param1, kCharacterCath, 0, 10, 9);
 
 				queueSFX(kCharacterCath, 15, 22);
-				_inventorySelectedItemIdx = 0;
+				_activeItem = 0;
 				if (_engine->getGraphicsManager()->acquireSurface()) {
 					_engine->getGraphicsManager()->clear(_engine->getGraphicsManager()->_screenSurface, 44, 0, 32, 32);
 					_engine->getGraphicsManager()->unlockSurface();
 				}
 			} else {
-				if (link->action != 16 || _inventorySelectedItemIdx != kItemKey) {
+				if (link->action != 16 || _activeItem != kItemKey) {
 					if (link->param1 == 109) {
 						queueSFX(kCharacterCath, 26, 0);
 					} else {
@@ -1486,7 +1486,7 @@ void LogicManager::doAction(Link *link) {
 
 				setDoor(1, kCharacterCath, 1, 10, 9);
 				queueSFX(kCharacterCath, 16, 0);
-				_inventorySelectedItemIdx = 0;
+				_activeItem = 0;
 				link->scene = kSceneNone;
 
 				if (_engine->getGraphicsManager()->acquireSurface()) {
@@ -1503,9 +1503,9 @@ void LogicManager::doAction(Link *link) {
 			queueSFX(kCharacterCath, 14, 0);
 			queueSFX(kCharacterCath, 15, 22);
 
-			if (_gameProgress[kProgressField78] && !dialogRunning("MUS003")) {
+			if (_globals[kProgressField78] && !dialogRunning("MUS003")) {
 				playDialog(kCharacterCath, "MUS003", 16, 0);
-				_gameProgress[kProgressField78] = 0;
+				_globals[kProgressField78] = 0;
 			}
 
 			bumpCath(kCarGreenSleeping, 77, 255);
@@ -1527,7 +1527,7 @@ void LogicManager::doAction(Link *link) {
 			send(kCharacterCath, kCharacterVesna, 202884544, 0);
 			break;
 		case 3:
-			if (_gameProgress[kProgressChapter] == 5) {
+			if (_globals[kProgressChapter] == 5) {
 				send(kCharacterCath, kCharacterAbbot, 168646401, 0);
 				send(kCharacterCath, kCharacterMilos, 168646401, 0);
 			} else {
@@ -1554,7 +1554,7 @@ void LogicManager::doAction(Link *link) {
 		if (_engine->isDemo())
 			break;
 
-		if (_gameEvents[kEventKronosBringFirebird]) {
+		if (_doneNIS[kEventKronosBringFirebird]) {
 			switch (link->param1) {
 			case 1:
 				send(kCharacterCath, kCharacterAnna, 205294778, 0);
@@ -1579,7 +1579,7 @@ void LogicManager::doAction(Link *link) {
 					nisId = kEventCathOpenEggNoBackground;
 				}
 
-				_gameProgress[kProgressIsEggOpen] = 1;
+				_globals[kProgressIsEggOpen] = 1;
 				break;
 			}
 			case 2:
@@ -1589,7 +1589,7 @@ void LogicManager::doAction(Link *link) {
 					nisId = kEventCathCloseEgg;
 				}
 
-				_gameProgress[kProgressIsEggOpen] = 0;
+				_globals[kProgressIsEggOpen] = 0;
 				break;
 			case 3:
 				if (!inComp(kCharacterCath, kCarGreenSleeping, 8200)) {
@@ -1614,9 +1614,9 @@ void LogicManager::doAction(Link *link) {
 		if (_engine->isDemo())
 			break;
 
-		if (_gameInventory[kItemMatch].location && !_gameInventory[kItemMatch].isPresent) {
-			_gameInventory[kItemMatch].isPresent = 1;
-			_gameInventory[kItemMatch].location = 0;
+		if (_items[kItemMatch].floating && !_items[kItemMatch].haveIt) {
+			_items[kItemMatch].haveIt = 1;
+			_items[kItemMatch].floating = 0;
 			queueSFX(kCharacterCath, 102, 0);
 		}
 
@@ -1640,9 +1640,9 @@ void LogicManager::doAction(Link *link) {
 			break;
 
 		queueSFX(kCharacterCath, 43, 0);
-		if (_gameProgress[kProgressField7C] && !dialogRunning("MUS003")) {
+		if (_globals[kProgressField7C] && !dialogRunning("MUS003")) {
 			playDialog(kCharacterCath, "MUS003", 16, 0);
-			_gameProgress[kProgressField7C] = 0;
+			_globals[kProgressField7C] = 0;
 		}
 
 		break;
@@ -1651,9 +1651,9 @@ void LogicManager::doAction(Link *link) {
 			break;
 
 		queueSFX(kCharacterCath, 24, 0);
-		if (_gameProgress[kProgressField80] && !dialogRunning("MUS003")) {
+		if (_globals[kProgressField80] && !dialogRunning("MUS003")) {
 			playDialog(kCharacterCath, "MUS003", 16, 0);
-			_gameProgress[kProgressField80] = 0;
+			_globals[kProgressField80] = 0;
 		}
 
 		break;
@@ -1667,13 +1667,13 @@ void LogicManager::doAction(Link *link) {
 		}
 
 		if (link->param1 < 128) {
-			if (_gameObjects[link->param1].character)
-				send(kCharacterCath, _gameObjects[link->param1].character, 8, link->param1);
+			if (_doors[link->param1].who)
+				send(kCharacterCath, _doors[link->param1].who, 8, link->param1);
 		}
 
 		return;
 	case kActionPlayMusicChapter:
-		switch (_gameProgress[kProgressChapter]) {
+		switch (_globals[kProgressChapter]) {
 		case 1:
 			musId = link->param1;
 			break;
@@ -1698,7 +1698,7 @@ void LogicManager::doAction(Link *link) {
 		if (_engine->isDemo())
 			break;
 
-		switch (_gameProgress[kProgressChapter]) {
+		switch (_globals[kProgressChapter]) {
 		case 1:
 			musId = 1;
 			break;
@@ -1739,22 +1739,22 @@ void LogicManager::doAction(Link *link) {
 }
 
 void LogicManager::takeTyler(bool doCleanNIS, int8 bedPosition) {
-	if (!_gameProgress[kProgressJacket])
-		_gameProgress[kProgressJacket] = 1;
+	if (!_globals[kProgressJacket])
+		_globals[kProgressJacket] = 1;
 
-	if (_gameInventory[kItemCorpse].location == 1) {
+	if (_items[kItemCorpse].floating == 1) {
 		if (bedPosition == 4) {
-			if (_gameProgress[kProgressJacket])
+			if (_globals[kProgressJacket])
 				playNIS(kEventCorpsePickFloorOpenedBedOriginal);
 
-			_gameInventory[kItemCorpse].location = 5;
-		} else if (_gameProgress[kProgressJacket] == 2) {
+			_items[kItemCorpse].floating = 5;
+		} else if (_globals[kProgressJacket] == 2) {
 			playNIS(kEventCorpsePickFloorGreen);
 		} else {
 			playNIS(kEventCorpsePickFloorOriginal);
 		}
-	} else if (_gameInventory[kItemCorpse].location == 2) {
-		if (_gameProgress[kProgressJacket] == 2) {
+	} else if (_items[kItemCorpse].floating == 2) {
+		if (_globals[kProgressJacket] == 2) {
 			playNIS(kEventCorpsePickBedGreen);
 		} else {
 			playNIS(kEventCorpsePickBedOriginal);
@@ -1766,9 +1766,9 @@ void LogicManager::takeTyler(bool doCleanNIS, int8 bedPosition) {
 }
 
 void LogicManager::dropTyler(bool doCleanNIS) {
-	switch (_gameInventory[kItemCorpse].location) {
+	switch (_items[kItemCorpse].floating) {
 	case 1:
-		if (_gameProgress[kProgressJacket] == 2) {
+		if (_globals[kProgressJacket] == 2) {
 			playNIS(kEventCorpseDropFloorGreen);
 		} else {
 			playNIS(kEventCorpseDropFloorOriginal);
@@ -1776,7 +1776,7 @@ void LogicManager::dropTyler(bool doCleanNIS) {
 
 		break;
 	case 2:
-		if (_gameProgress[kProgressJacket] == 2) {
+		if (_globals[kProgressJacket] == 2) {
 			playNIS(kEventCorpseDropBedGreen);
 		} else {
 			playNIS(kEventCorpseDropBedOriginal);
@@ -1784,22 +1784,22 @@ void LogicManager::dropTyler(bool doCleanNIS) {
 
 		break;
 	case 4:
-		_gameInventory[kItemCorpse].location = 0;
-		_gameProgress[kProgressEventCorpseThrown] = 1;
+		_items[kItemCorpse].floating = 0;
+		_globals[kProgressEventCorpseThrown] = 1;
 
 		if (_gameTime <= 1138500) {
-			if (_gameProgress[kProgressJacket] == 2) {
+			if (_globals[kProgressJacket] == 2) {
 				playNIS(kEventCorpseDropWindowGreen);
 			} else {
 				playNIS(kEventCorpseDropWindowOriginal);
 			}
 
-			_gameProgress[kProgressField24] = 1;
+			_globals[kProgressField24] = 1;
 		} else {
 			playNIS(kEventCorpseDropBridge);
 		}
 
-		_gameProgress[kProgressEventCorpseMovedFromFloor] = 1;
+		_globals[kProgressEventCorpseMovedFromFloor] = 1;
 
 		break;
 	}
@@ -1809,13 +1809,13 @@ void LogicManager::dropTyler(bool doCleanNIS) {
 }
 
 void LogicManager::takeJacket(bool doCleanNIS) {
-	_gameProgress[kProgressJacket] = 2;
-	_gameInventory[kItemMatchBox].isPresent = 1;
-	_gameInventory[kItemMatchBox].location = 0;
+	_globals[kProgressJacket] = 2;
+	_items[kItemMatchBox].haveIt = 1;
+	_items[kItemMatchBox].floating = 0;
 	setDoor(9, kCharacterCath, 2, 255, 255);
 	playNIS(kEventPickGreenJacket);
-	_gameProgress[kProgressPortrait] = 34;
-	_engine->getGraphicsManager()->drawItemDim(_gameProgress[kProgressPortrait], 0, 0, 1);
+	_globals[kProgressPortrait] = 34;
+	_engine->getGraphicsManager()->drawItemDim(_globals[kProgressPortrait], 0, 0, 1);
 	_engine->getGraphicsManager()->burstBox(0, 0, 32, 32);
 
 	if (doCleanNIS)
@@ -1823,7 +1823,7 @@ void LogicManager::takeJacket(bool doCleanNIS) {
 }
 
 void LogicManager::takeScarf(bool doCleanNIS) {
-	if (_gameProgress[kProgressJacket] == 2) {
+	if (_globals[kProgressJacket] == 2) {
 		playNIS(kEventPickScarfGreen);
 	} else {
 		playNIS(kEventPickScarfOriginal);
@@ -1839,195 +1839,195 @@ const char *LogicManager::getHintDialog(int character) {
 
 	switch (character) {
 	case kCharacterAnna:
-		if (_gameEvents[kEventAnnaDialogGoToJerusalem]) {
+		if (_doneNIS[kEventAnnaDialogGoToJerusalem]) {
 			return "XANN12";
-		} else if (_gameEvents[kEventLocomotiveRestartTrain]) {
+		} else if (_doneNIS[kEventLocomotiveRestartTrain]) {
 			return "XANN11";
-		} else if (_gameEvents[kEventAnnaBaggageTies] ||
-				   _gameEvents[kEventAnnaBaggageTies2] ||
-				   _gameEvents[kEventAnnaBaggageTies3] ||
-				   _gameEvents[kEventAnnaBaggageTies4]) {
+		} else if (_doneNIS[kEventAnnaBaggageTies] ||
+				   _doneNIS[kEventAnnaBaggageTies2] ||
+				   _doneNIS[kEventAnnaBaggageTies3] ||
+				   _doneNIS[kEventAnnaBaggageTies4]) {
 			return "XANN10";
-		} else if (_gameEvents[kEventAnnaTired] ||
-				   _gameEvents[kEventAnnaTiredKiss]) {
+		} else if (_doneNIS[kEventAnnaTired] ||
+				   _doneNIS[kEventAnnaTiredKiss]) {
 			return "XANN9";
-		} else if (_gameEvents[kEventAnnaBaggageArgument]) {
+		} else if (_doneNIS[kEventAnnaBaggageArgument]) {
 			return "XANN8";
-		} else if (_gameEvents[kEventKronosVisit]) {
+		} else if (_doneNIS[kEventKronosVisit]) {
 			return "XANN7";
-		} else if (_gameEvents[kEventAbbotIntroduction]) {
+		} else if (_doneNIS[kEventAbbotIntroduction]) {
 			return "XANN6A";
-		} else if (_gameEvents[kEventVassiliSeizure]) {
+		} else if (_doneNIS[kEventVassiliSeizure]) {
 			return "XANN6";
-		} else if (_gameEvents[kEventAugustPresentAnna] ||
-				   _gameEvents[kEventAugustPresentAnnaFirstIntroduction]) {
+		} else if (_doneNIS[kEventAugustPresentAnna] ||
+				   _doneNIS[kEventAugustPresentAnnaFirstIntroduction]) {
 			return "XANN5";
-		} else if (_gameProgress[kProgressField60]) {
+		} else if (_globals[kProgressField60]) {
 			return "XANN4";
-		} else if (_gameEvents[kEventAnnaGiveScarf] ||
-				   _gameEvents[kEventAnnaGiveScarfDiner] ||
-				   _gameEvents[kEventAnnaGiveScarfSalon] ||
-				   _gameEvents[kEventAnnaGiveScarfMonogram] ||
-				   _gameEvents[kEventAnnaGiveScarfDinerMonogram] ||
-				   _gameEvents[kEventAnnaGiveScarfSalonMonogram]) {
+		} else if (_doneNIS[kEventAnnaGiveScarf] ||
+				   _doneNIS[kEventAnnaGiveScarfDiner] ||
+				   _doneNIS[kEventAnnaGiveScarfSalon] ||
+				   _doneNIS[kEventAnnaGiveScarfMonogram] ||
+				   _doneNIS[kEventAnnaGiveScarfDinerMonogram] ||
+				   _doneNIS[kEventAnnaGiveScarfSalonMonogram]) {
 			return "XANN3";
-		} else if (_gameEvents[kEventDinerMindJoin]) {
+		} else if (_doneNIS[kEventDinerMindJoin]) {
 			return "XANN2";
-		} else if (_gameEvents[kEventGotALight] ||
-				   _gameEvents[kEventGotALightD]) {
+		} else if (_doneNIS[kEventGotALight] ||
+				   _doneNIS[kEventGotALightD]) {
 			return "XANN1";
 		}
 
 		break;
 	case kCharacterAugust:
-		if (_gameEvents[kEventAugustTalkCigar]) {
+		if (_doneNIS[kEventAugustTalkCigar]) {
 			return "XAUG6";
-		} else if (_gameEvents[kEventAugustBringBriefcase]) {
+		} else if (_doneNIS[kEventAugustBringBriefcase]) {
 			return "XAUG5";
-		} else if (_gameEvents[kEventAugustMerchandise]) {
+		} else if (_doneNIS[kEventAugustMerchandise]) {
 			if (_gameTime <= 2200500) {
 				return "XAUG4";
 			} else {
 				return "XAUG4A";
 			}
-		} else if (_gameEvents[kEventDinerAugust] ||
-				   _gameEvents[kEventDinerAugustAlexeiBackground] ||
-				   _gameEvents[kEventMeetAugustTylerCompartment] ||
-				   _gameEvents[kEventMeetAugustHisCompartment] ||
-				   _gameEvents[kEventMeetAugustTylerCompartmentBed] ||
-				   _gameEvents[kEventMeetAugustHisCompartmentBed]) {
+		} else if (_doneNIS[kEventDinerAugust] ||
+				   _doneNIS[kEventDinerAugustAlexeiBackground] ||
+				   _doneNIS[kEventMeetAugustTylerCompartment] ||
+				   _doneNIS[kEventMeetAugustHisCompartment] ||
+				   _doneNIS[kEventMeetAugustTylerCompartmentBed] ||
+				   _doneNIS[kEventMeetAugustHisCompartmentBed]) {
 			return "XAUG3";
-		} else if (_gameEvents[kEventAugustPresentAnnaFirstIntroduction]) {
+		} else if (_doneNIS[kEventAugustPresentAnnaFirstIntroduction]) {
 			return "XAUG2";
-		} else if (_gameProgress[kProgressEventMertensAugustWaiting]) {
+		} else if (_globals[kProgressEventMertensAugustWaiting]) {
 			return "XAUG1";
 		}
 
 		break;
 	case kCharacterTatiana:
-		if (_gameEvents[kEventTatianaTylerCompartment]) {
+		if (_doneNIS[kEventTatianaTylerCompartment]) {
 			return "XTAT6";
-		} else if (_gameEvents[kEventTatianaCompartmentStealEgg]) {
+		} else if (_doneNIS[kEventTatianaCompartmentStealEgg]) {
 			return "XTAT5";
-		} else if (_gameEvents[kEventTatianaGivePoem]) {
+		} else if (_doneNIS[kEventTatianaGivePoem]) {
 			return "XTAT3";
-		} else if (_gameProgress[kProgressField64]) {
+		} else if (_globals[kProgressField64]) {
 			return "XTAT1";
 		}
 
 		break;
 	case kCharacterVassili:
-		if (_gameEvents[kEventCathFreePassengers]) {
+		if (_doneNIS[kEventCathFreePassengers]) {
 			return "XVAS4";
-		} else if (_gameEvents[kEventVassiliCompartmentStealEgg]) {
+		} else if (_doneNIS[kEventVassiliCompartmentStealEgg]) {
 			return "XVAS3";
-		} else if (_gameEvents[kEventAbbotIntroduction]) {
+		} else if (_doneNIS[kEventAbbotIntroduction]) {
 			return "XVAS2";
-		} else if (_gameEvents[kEventVassiliSeizure]) {
+		} else if (_doneNIS[kEventVassiliSeizure]) {
 			return "XVAS1A";
-		} else if (_gameProgress[kProgressField64]) {
+		} else if (_globals[kProgressField64]) {
 			return "XVAS1";
 		}
 
 		break;
 	case kCharacterAlexei:
-		if (_gameProgress[kProgressField88]) {
+		if (_globals[kProgressField88]) {
 			return "XALX6";
-		} else if (_gameProgress[kProgressField8C]) {
+		} else if (_globals[kProgressField8C]) {
 			return "XALX5";
-		} else if (_gameProgress[kProgressField90]) {
+		} else if (_globals[kProgressField90]) {
 			return "XALX4A";
-		} else if (_gameProgress[kProgressField68]) {
+		} else if (_globals[kProgressField68]) {
 			return "XALX4";
-		} else if (_gameEvents[kEventAlexeiSalonPoem]) {
+		} else if (_doneNIS[kEventAlexeiSalonPoem]) {
 			return "XALX3";
-		} else if (_gameEvents[kEventAlexeiSalonVassili]) {
+		} else if (_doneNIS[kEventAlexeiSalonVassili]) {
 			return "XALX2";
-		} else if (_gameEvents[kEventAlexeiDiner] ||
-				   _gameEvents[kEventAlexeiDinerOriginalJacket]) {
+		} else if (_doneNIS[kEventAlexeiDiner] ||
+				   _doneNIS[kEventAlexeiDinerOriginalJacket]) {
 			return "XALX1";
 		}
 
 		break;
 	case kCharacterAbbot:
-		if (_gameEvents[kEventAbbotDrinkDefuse]) {
+		if (_doneNIS[kEventAbbotDrinkDefuse]) {
 			return "XABB4";
-		} else if (_gameEvents[kEventAbbotInvitationDrink] ||
-				   _gameEvents[kEventDefuseBomb]) {
+		} else if (_doneNIS[kEventAbbotInvitationDrink] ||
+				   _doneNIS[kEventDefuseBomb]) {
 			return "XABB3";
-		} else if (_gameEvents[kEventAbbotWrongCompartment] ||
-				   _gameEvents[kEventAbbotWrongCompartmentBed]) {
+		} else if (_doneNIS[kEventAbbotWrongCompartment] ||
+				   _doneNIS[kEventAbbotWrongCompartmentBed]) {
 			return "XABB2";
-		} else if (_gameEvents[kEventAbbotIntroduction]) {
+		} else if (_doneNIS[kEventAbbotIntroduction]) {
 			return "XABB1";
 		}
 
 		break;
 	case kCharacterMilos:
-		if (_gameEvents[kEventLocomotiveMilosDay] || _gameEvents[kEventLocomotiveMilosNight]) {
+		if (_doneNIS[kEventLocomotiveMilosDay] || _doneNIS[kEventLocomotiveMilosNight]) {
 			return "XMIL5";
-		} else if (_gameEvents[kEventMilosCompartmentVisitTyler] &&
-				  (_gameProgress[kProgressChapter] == 3 ||
-				   _gameProgress[kProgressChapter] == 4)) {
+		} else if (_doneNIS[kEventMilosCompartmentVisitTyler] &&
+				  (_globals[kProgressChapter] == 3 ||
+				   _globals[kProgressChapter] == 4)) {
 			return "XMIL4";
-		} else if (_gameEvents[kEventMilosCorridorThanks] ||
-				   _gameProgress[kProgressChapter] == 5) {
+		} else if (_doneNIS[kEventMilosCorridorThanks] ||
+				   _globals[kProgressChapter] == 5) {
 			return "XMIL3";
-		} else if (_gameEvents[kEventMilosCompartmentVisitAugust]) {
+		} else if (_doneNIS[kEventMilosCompartmentVisitAugust]) {
 			return "XMIL2";
-		} else if (_gameEvents[kEventMilosTylerCompartmentDefeat]) {
+		} else if (_doneNIS[kEventMilosTylerCompartmentDefeat]) {
 			return "XMIL1";
 		}
 
 		break;
 	case kCharacterVesna:
-		if (_gameProgress[kProgressField94]) {
+		if (_globals[kProgressField94]) {
 			return "XVES2";
-		} else if (_gameProgress[kProgressField98]) {
+		} else if (_globals[kProgressField98]) {
 			return "XVES1";
 		}
 
 		break;
 	case kCharacterKronos:
-		if (_gameEvents[kEventKronosReturnBriefcase])
+		if (_doneNIS[kEventKronosReturnBriefcase])
 			return "XKRO6";
-		if (_gameEvents[kEventKronosBringEggCeiling] ||
-			_gameEvents[kEventKronosBringEgg]) {
+		if (_doneNIS[kEventKronosBringEggCeiling] ||
+			_doneNIS[kEventKronosBringEgg]) {
 			return "XKRO5";
 		} else {
-			if (_gameEvents[kEventKronosConversation] ||
-				_gameEvents[kEventKronosConversationFirebird]) {
-				if (_gameInventory[kItemFirebird].location != 6 &&
-					_gameInventory[kItemFirebird].location != 5 &&
-					_gameInventory[kItemFirebird].location != 2 &&
-					_gameInventory[kItemFirebird].location != 1)
+			if (_doneNIS[kEventKronosConversation] ||
+				_doneNIS[kEventKronosConversationFirebird]) {
+				if (_items[kItemFirebird].floating != 6 &&
+					_items[kItemFirebird].floating != 5 &&
+					_items[kItemFirebird].floating != 2 &&
+					_items[kItemFirebird].floating != 1)
 					return "XKRO4A";
 			}
 
-			if (_gameEvents[kEventKronosConversationFirebird])
+			if (_doneNIS[kEventKronosConversationFirebird])
 				return "XKRO4";
 
-			if (_gameEvents[kEventMilosCompartmentVisitAugust]) {
-				if (_gameEvents[kEventKronosConversation])
+			if (_doneNIS[kEventMilosCompartmentVisitAugust]) {
+				if (_doneNIS[kEventKronosConversation])
 					return "XKRO3";
-			} else if (_gameEvents[kEventKronosConversation]) {
+			} else if (_doneNIS[kEventKronosConversation]) {
 				return "XKRO2";
 			}
 
-			if (_gameProgress[kProgressEventMertensChronosInvitation]) {
+			if (_globals[kProgressEventMertensChronosInvitation]) {
 				return "XKRO1";
 			}
 		}
 
 		break;
 	case kCharacterFrancois:
-		if (_gameProgress[kProgressField9C]) {
+		if (_globals[kProgressField9C]) {
 			return "XFRA3";
-		} else if (_gameProgress[kProgressFieldA0] ||
-				   _gameEvents[kEventFrancoisWhistle] ||
-				   _gameEvents[kEventFrancoisWhistleD] ||
-				   _gameEvents[kEventFrancoisWhistleNight] ||
-				   _gameEvents[kEventFrancoisWhistleNightD]) {
+		} else if (_globals[kProgressFieldA0] ||
+				   _doneNIS[kEventFrancoisWhistle] ||
+				   _doneNIS[kEventFrancoisWhistleD] ||
+				   _doneNIS[kEventFrancoisWhistleNight] ||
+				   _doneNIS[kEventFrancoisWhistleNightD]) {
 			return "XFRA2";
 		} else if (_gameTime <= 1075500) {
 			return "XFRA1";
@@ -2035,75 +2035,75 @@ const char *LogicManager::getHintDialog(int character) {
 
 		break;
 	case kCharacterMadame:
-		if (_gameProgress[kProgressFieldA4]) {
+		if (_globals[kProgressFieldA4]) {
 			return "XMME4";
-		} else if (_gameProgress[kProgressFieldA8]) {
+		} else if (_globals[kProgressFieldA8]) {
 			return "XMME3";
-		} else if (_gameProgress[kProgressFieldA0]) {
+		} else if (_globals[kProgressFieldA0]) {
 			return "XMME2";
-		} else  if (_gameProgress[kProgressFieldAC]) {
+		} else  if (_globals[kProgressFieldAC]) {
 			return "XMME1";
 		}
 
 		break;
 	case kCharacterMonsieur:
-		if (_gameProgress[kProgressEventMetBoutarel]) {
+		if (_globals[kProgressEventMetBoutarel]) {
 			return "XMRB1";
 		}
 
 		break;
 	case kCharacterRebecca:
-		if (_gameProgress[kProgressFieldB4]) {
+		if (_globals[kProgressFieldB4]) {
 			return "XREB1A";
-		} else if (_gameProgress[kProgressFieldB8]) {
+		} else if (_globals[kProgressFieldB8]) {
 			return "XREB1";
 		}
 
 		break;
 	case kCharacterSophie:
-		if (_gameProgress[kProgressFieldB0]) {
+		if (_globals[kProgressFieldB0]) {
 			return "XSOP2";
-		} else if (_gameProgress[kProgressFieldBC]) {
+		} else if (_globals[kProgressFieldBC]) {
 			return "XSOP1B";
-		} else if (_gameProgress[kProgressFieldB4]) {
+		} else if (_globals[kProgressFieldB4]) {
 			return "XSOP1A";
-		} else if (!_gameProgress[kProgressFieldB8]) {
+		} else if (!_globals[kProgressFieldB8]) {
 			return "XSOP1";
 		}
 
 		break;
 	case kCharacterMahmud:
-		if (_gameProgress[kProgressFieldC4]) {
+		if (_globals[kProgressFieldC4]) {
 			return "XMAH1";
 		}
 
 		break;
 	case kCharacterYasmin:
-		if (_gameProgress[kProgressEventMetYasmin]) {
+		if (_globals[kProgressEventMetYasmin]) {
 			return "XHAR2";
 		}
 
 		break;
 	case kCharacterHadija:
-		if (_gameProgress[kProgressEventMetHadija]) {
+		if (_globals[kProgressEventMetHadija]) {
 			return "XHAR1";
 		}
 
 		break;
 	case kCharacterAlouan:
-		if (_gameProgress[kProgressFieldDC]) {
+		if (_globals[kProgressFieldDC]) {
 			return "XHAR3";
 		}
 
 		break;
 	case kCharacterPolice:
-		if (_gameProgress[kProgressFieldE0]) {
+		if (_globals[kProgressFieldE0]) {
 			return "XHAR4";
 		}
 
 		break;
 	case kCharacterMaster:
-		if (_gameEvents[kEventCathDream] || _gameEvents[kEventCathWakingUp]) {
+		if (_doneNIS[kEventCathDream] || _doneNIS[kEventCathWakingUp]) {
 			return "XTYL3";
 		} else {
 			return "XTYL1";
diff --git a/engines/lastexpress/game/beetle.cpp b/engines/lastexpress/game/beetle.cpp
index 4f53bfb282d..cd9f142233f 100644
--- a/engines/lastexpress/game/beetle.cpp
+++ b/engines/lastexpress/game/beetle.cpp
@@ -113,7 +113,7 @@ void CBeetle::tick() {
 		_mouseCooldown--;
 
 	if (!_currentSequence || _directions[_currentDirectionIndex] == 29) {
-		if (_engine->getLogicManager()->_gameInventory[kItemBeetle].location != 3 ||
+		if (_engine->getLogicManager()->_items[kItemBeetle].floating != 3 ||
 			((_spawnCounter || rnd(10)) && (_spawnCounter >= 3 || rnd(30)) && rnd(100))) {
 			return;
 		}
@@ -407,7 +407,7 @@ bool CBeetle::onTable() {
 }
 
 bool CBeetle::click() {
-	if (_engine->getLogicManager()->_inventorySelectedItemIdx == kItemMatchBox &&
+	if (_engine->getLogicManager()->_activeItem == kItemMatchBox &&
 		_engine->getLogicManager()->cathHasItem(12) &&
 		ABS<int16>(_engine->_cursorX - _coords.x) < 10 &&
 		ABS<int16>(_engine->_cursorY - _coords.y) < 10) {
@@ -421,8 +421,8 @@ bool CBeetle::click() {
 }
 
 void LastExpressEngine::doBeetle() {
-	int32 chapter = getLogicManager()->_gameProgress[11];
-	if (chapter >= 2 && chapter <= 3 && !_beetle && getLogicManager()->_gameInventory[kItemBeetle].location == 3) {
+	int32 chapter = getLogicManager()->_globals[11];
+	if (chapter >= 2 && chapter <= 3 && !_beetle && getLogicManager()->_items[kItemBeetle].floating == 3) {
 		_beetle = new CBeetle(this);
 	}
 }
diff --git a/engines/lastexpress/game/logic.cpp b/engines/lastexpress/game/logic.cpp
index 7f5cb68357e..de5fce0617f 100644
--- a/engines/lastexpress/game/logic.cpp
+++ b/engines/lastexpress/game/logic.cpp
@@ -217,11 +217,11 @@ void LogicManager::fadeToWhite() {
 }
 
 void LogicManager::restoreIcons() {
-	_engine->getGraphicsManager()->drawItemDim(_gameProgress[kProgressPortrait], 0, 0, 1);
+	_engine->getGraphicsManager()->drawItemDim(_globals[kProgressPortrait], 0, 0, 1);
 	_engine->getGraphicsManager()->drawItemDim(_engine->_currentGameFileColorId + 39, 608, 448, 1);
 
-	if (_inventorySelectedItemIdx) {
-		_engine->getGraphicsManager()->drawItem(_gameInventory[_inventorySelectedItemIdx].cursor, 44, 0);
+	if (_activeItem) {
+		_engine->getGraphicsManager()->drawItem(_items[_activeItem].mnum, 44, 0);
 		_engine->getGraphicsManager()->burstBox(44, 0, 32, 32);
 	}
 
@@ -231,8 +231,8 @@ void LogicManager::restoreIcons() {
 
 void LogicManager::dropItem(int item, int outLocation) {
 	if (item < 32) {
-		if (_gameInventory[item].location != outLocation) {
-			_gameInventory[item].location = outLocation;
+		if (_items[item].floating != outLocation) {
+			_items[item].floating = outLocation;
 			if (nodeHasItem(item)) {
 				if (!_doubleClickFlag)
 					cleanNIS();
@@ -245,48 +245,48 @@ void LogicManager::takeItem(int item) {
 	int cathDir;
 
 	if (item < 32) {
-		if (_gameInventory[item].location) {
-			_gameInventory[item].location = 0;
+		if (_items[item].floating) {
+			_items[item].floating = 0;
 
 			if (item == kItem3) {
 				if (checkLoc(kCharacterCath, kCarRestaurant)) {
 					cathDir = checkCathDir();
-					if (_useLastSavedNodeIndex)
-						cathDir = _trainData[_lastNodeIndex].cathDir;
+					if (_closeUp)
+						cathDir = _trainData[_nodeReturn].cathDir;
 
 					if (cathDir == 56) {
-						if (!_useLastSavedNodeIndex) {
+						if (!_closeUp) {
 							bumpCath(kCarRestaurant, 56, 255);
 							return;
 						}
 
-						_lastNodeIndex = getBumpNode(kCarRestaurant, 56, 255);
+						_nodeReturn = getBumpNode(kCarRestaurant, 56, 255);
 						return;
 					}
 				}
 			} else if (item == 5) {
 				if (checkLoc(kCharacterCath, kCarRedSleeping) && !_doubleClickFlag) {
 					cathDir = checkCathDir();
-					if (_useLastSavedNodeIndex)
-						cathDir = _trainData[_lastNodeIndex].cathDir;
+					if (_closeUp)
+						cathDir = _trainData[_nodeReturn].cathDir;
 					if (cathDir >= 23 && cathDir <= 32) {
-						if (!_useLastSavedNodeIndex) {
+						if (!_closeUp) {
 							bumpCath(kCarRedSleeping, cathDir, 255);
 							return;
 						}
 
-						_lastNodeIndex = getBumpNode(kCarRedSleeping, cathDir, 255);
+						_nodeReturn = getBumpNode(kCarRedSleeping, cathDir, 255);
 						return;
 					}
 				}
 			} else if (item == 7 && checkLoc(kCharacterCath, kCarGreenSleeping) && !_doubleClickFlag) {
 				cathDir = checkCathDir();
-				if (_useLastSavedNodeIndex)
-					cathDir = _trainData[_lastNodeIndex].cathDir;
+				if (_closeUp)
+					cathDir = _trainData[_nodeReturn].cathDir;
 
 				if (cathDir == 1 || cathDir >= 22 && cathDir <= 33) {
-					if (_useLastSavedNodeIndex) {
-						_lastNodeIndex = getBumpNode(kCarGreenSleeping, cathDir, 255);
+					if (_closeUp) {
+						_nodeReturn = getBumpNode(kCarGreenSleeping, cathDir, 255);
 						return;
 					}
 
@@ -299,13 +299,13 @@ void LogicManager::takeItem(int item) {
 
 void LogicManager::giveCathItem(int item) {
 	if (item < 32) {
-		_gameInventory[item].location = 0;
-		_gameInventory[item].isPresent = 1;
+		_items[item].floating = 0;
+		_items[item].haveIt = 1;
 
-		if (_gameInventory[item].cursor) {
-			if (!_gameInventory[item].manualSelect) {
-				_inventorySelectedItemIdx = item;
-				_engine->getGraphicsManager()->drawItem(_gameInventory[item].cursor, 44, 0);
+		if (_items[item].mnum) {
+			if (!_items[item].inPocket) {
+				_activeItem = item;
+				_engine->getGraphicsManager()->drawItem(_items[item].mnum, 44, 0);
 				_engine->getGraphicsManager()->burstBox(44, 0, 32, 32);
 			}
 		}
@@ -314,11 +314,11 @@ void LogicManager::giveCathItem(int item) {
 
 void LogicManager::takeCathItem(int item) {
 	if (item < 32) {
-		_gameInventory[item].location = 0;
-		_gameInventory[item].isPresent = 0;
+		_items[item].floating = 0;
+		_items[item].haveIt = 0;
 
-		if (item == _inventorySelectedItemIdx) {
-			_inventorySelectedItemIdx = 0;
+		if (item == _activeItem) {
+			_activeItem = 0;
 			if (_engine->getGraphicsManager()->acquireSurface()) {
 				_engine->getGraphicsManager()->clear(_engine->getGraphicsManager()->_screenSurface, 44, 0, 32, 32);
 				_engine->getGraphicsManager()->unlockSurface();
@@ -331,18 +331,18 @@ void LogicManager::takeCathItem(int item) {
 
 bool LogicManager::cathHasItem(int item) {
 	if (item && item < 32)
-		return _gameInventory[item].isPresent == 1;
+		return _items[item].haveIt == 1;
 	else
 		return false;
 }
 
 int LogicManager::findLargeItem() {
-	Item *inventory = _gameInventory;
+	Item *inventory = _items;
 
 	for (int i = kItemMatchBox; i < 32; i++) {
 		Item *item = &inventory[i];
 
-		if (item->isPresent && inventory[i - 1].isPresent && !item->manualSelect) {
+		if (item->haveIt && inventory[i - 1].haveIt && !item->inPocket) {
 			return i;
 		}
 	}
@@ -351,12 +351,12 @@ int LogicManager::findLargeItem() {
 }
 
 int LogicManager::checkCathDir() {
-	return _trainData[_trainNodeIndex].cathDir;
+	return _trainData[_activeNode].cathDir;
 }
 
 bool LogicManager::checkCathDir(int car, int position) {
 	return getCharacter(kCharacterCath).characterPosition.car == car &&
-		   _trainData[_trainNodeIndex].cathDir == position;
+		   _trainData[_activeNode].cathDir == position;
 }
 
 bool LogicManager::isFemale(int character) {
@@ -379,8 +379,8 @@ bool LogicManager::isSingleFemale(int character) {
 }
 
 bool LogicManager::isNight() {
-	int chapter = _gameProgress[kProgressChapter];
-	return chapter == 1 || chapter == 4 || chapter == 5 && !_gameProgress[kProgressIsDayTime];
+	int chapter = _globals[kProgressChapter];
+	return chapter == 1 || chapter == 4 || chapter == 5 && !_globals[kProgressIsDayTime];
 }
 
 bool LogicManager::whoOutside(int character) {
@@ -586,7 +586,7 @@ bool LogicManager::whoWalking(int character) {
 
 int LogicManager::checkDoor(int object) {
 	if (object < 128) {
-		return _gameObjects[object].door;
+		return _doors[object].status;
 	} else {
 		return 0;
 	}
@@ -630,37 +630,37 @@ bool LogicManager::preventEnterComp(int object) {
 	return false;	
 }
 
-void LogicManager::setDoor(int object, int character, int door, int cursor, int cursor2) {
+void LogicManager::setDoor(int object, int character, int status, int cursor, int handleCursor) {
 	if (object < 128) {
-		int oldDoor = _gameObjects[object].door;
-		_gameObjects[object].character = character;
-		_gameObjects[object].door = door;
+		int oldDoor = _doors[object].status;
+		_doors[object].who = character;
+		_doors[object].status = status;
 
-		if (cursor != 255 || cursor2 != 255) {
+		if (cursor != 255 || handleCursor != 255) {
 			if (cursor != 255)
-				_gameObjects[object].cursor = cursor;
+				_doors[object].windowCursor = cursor;
 
-			if (cursor2 != 255)
-				_gameObjects[object].cursor2 = cursor2;
+			if (handleCursor != 255)
+				_doors[object].handleCursor = handleCursor;
 
 			mouseStatus();
 		}
 
 		_engine->getSoundManager()->_scanAnySoundLoopingSection = true;
 
-		if (oldDoor != door && (oldDoor == 2 || door == 2) && (object && object <= 8 || object >= 32 && object <= 39))
+		if (oldDoor != status && (oldDoor == 2 || status == 2) && (object && object <= 8 || object >= 32 && object <= 39))
 			_engine->getOtisManager()->drawLooseSprites();
 	}
 }
 
 void LogicManager::setModel(int object, int8 model) {
 	if (object < 128)
-		_gameObjects[object].model = model;
+		_doors[object].model = model;
 }
 
 int LogicManager::getModel(int object) {
 	if (object < 128) {
-		return _gameObjects[object].model;
+		return _doors[object].model;
 	} else {
 		return 0;
 	}
@@ -671,7 +671,7 @@ void LogicManager::blockView(int character, int car, int position) {
 		character = kCharacterCath;
 
 	if (character <= 31) {
-		_positions[100 * car + position] |= 1 << character;
+		_blockedViews[100 * car + position] |= 1 << character;
 		if (checkCathDir(car, position) || (car == kCarRestaurant && position == 57 && checkCathDir(kCarRestaurant, 50))) {
 			playChrExcuseMe(character, kCharacterCath, 0);
 			smartBumpCath();
@@ -687,7 +687,7 @@ void LogicManager::releaseView(int character, int car, int position) {
 		character = kCharacterCath;
 
 	if (character <= 31) {
-		_positions[100 * car + position] &= ~(1 << character);
+		_blockedViews[100 * car + position] &= ~(1 << character);
 		mouseStatus();
 	}
 }
@@ -698,11 +698,11 @@ void LogicManager::releaseEverything(int character) {
 
 	if (character <= 31) {
 		for (int i = 0; i < 1000; i++) {
-			_positions[i] &= ~(1 << character);
+			_blockedViews[i] &= ~(1 << character);
 		}
 
-		for (int i = 0; i < 16; _softBlockedEntitiesBits[i - 1] &= ~(1 << character)) {
-			_blockedEntitiesBits[i++] &= ~(1 << character);
+		for (int i = 0; i < 16; _softBlockedX[i - 1] &= ~(1 << character)) {
+			_blockedX[i++] &= ~(1 << character);
 		}
 
 		mouseStatus();
@@ -714,8 +714,8 @@ void LogicManager::release2Views(int character, int car, int pos1, int pos2) {
 		character = kCharacterCath;
 
 	if (character <= 31) {
-		_positions[100 * car + pos1] &= ~(1 << character);
-		_positions[100 * car + pos2] &= ~(1 << character);
+		_blockedViews[100 * car + pos1] &= ~(1 << character);
+		_blockedViews[100 * car + pos2] &= ~(1 << character);
 		mouseStatus();
 	}
 }
@@ -725,8 +725,8 @@ void LogicManager::block2ViewsBump4(int character, int car, int pos1, int pos2,
 		character = kCharacterCath;
 
 	if (character <= 31) {
-		_positions[100 * car + pos1] |= 1 << character;
-		_positions[100 * car + pos2] |= 1 << character;
+		_blockedViews[100 * car + pos1] |= 1 << character;
+		_blockedViews[100 * car + pos2] |= 1 << character;
 
 		if ((checkCathDir(car, pos1) || checkCathDir(car, pos2) || checkCathDir(car, pos3) || checkCathDir(car, pos4))) {
 			playChrExcuseMe(character, kCharacterCath, 0);
@@ -738,72 +738,72 @@ void LogicManager::block2ViewsBump4(int character, int car, int pos1, int pos2,
 	}
 }
 
-void LogicManager::blockAtDoor(int character, int door) {
-	if (character <= 31 && (door - 1) <= 38) {
-		switch (door) {
+void LogicManager::blockAtDoor(int character, int status) {
+	if (character <= 31 && (status - 1) <= 38) {
+		switch (status) {
 		case 1:
 			block2ViewsBump4(character, kCarGreenSleeping, 41, 51, 17, 38);
-			_blockedEntitiesBits[0] |= 1 << character;
+			_blockedX[0] |= 1 << character;
 			break;
 		case 2:
 			block2ViewsBump4(character, kCarGreenSleeping, 42, 52, 15, 36);
-			_blockedEntitiesBits[1] |= 1 << character;
+			_blockedX[1] |= 1 << character;
 			break;
 		case 3:
 			block2ViewsBump4(character, kCarGreenSleeping, 43, 53, 13, 34);
-			_blockedEntitiesBits[2] |= 1 << character;
+			_blockedX[2] |= 1 << character;
 			break;
 		case 4:
 			block2ViewsBump4(character, kCarGreenSleeping, 44, 54, 11, 32);
-			_blockedEntitiesBits[3] |= 1 << character;
+			_blockedX[3] |= 1 << character;
 			break;
 		case 5:
 			block2ViewsBump4(character, kCarGreenSleeping, 45, 55, 9, 30);
-			_blockedEntitiesBits[4] |= 1 << character;
+			_blockedX[4] |= 1 << character;
 			break;
 		case 6:
 			block2ViewsBump4(character, kCarGreenSleeping, 46, 56, 7, 28);
-			_blockedEntitiesBits[5] |= 1 << character;
+			_blockedX[5] |= 1 << character;
 			break;
 		case 7:
 			block2ViewsBump4(character, kCarGreenSleeping, 47, 57, 5, 26);
-			_blockedEntitiesBits[6] |= 1 << character;
+			_blockedX[6] |= 1 << character;
 			break;
 		case 8:
 			block2ViewsBump4(character, kCarGreenSleeping, 48, 58, 3, 25);
-			_blockedEntitiesBits[7] |= 1 << character;
+			_blockedX[7] |= 1 << character;
 			break;
 		case 32:
 			block2ViewsBump4(character, kCarRedSleeping, 41, 51, 17, 38);
-			_blockedEntitiesBits[8] |= 1 << character;
+			_blockedX[8] |= 1 << character;
 			break;
 		case 33:
 			block2ViewsBump4(character, kCarRedSleeping, 42, 52, 15, 36);
-			_blockedEntitiesBits[9] |= 1 << character;
+			_blockedX[9] |= 1 << character;
 			break;
 		case 34:
 			block2ViewsBump4(character, kCarRedSleeping, 43, 53, 13, 34);
-			_blockedEntitiesBits[10] |= 1 << character;
+			_blockedX[10] |= 1 << character;
 			break;
 		case 35:
 			block2ViewsBump4(character, kCarRedSleeping, 44, 54, 11, 32);
-			_blockedEntitiesBits[11] |= 1 << character;
+			_blockedX[11] |= 1 << character;
 			break;
 		case 36:
 			block2ViewsBump4(character, kCarRedSleeping, 45, 55, 9, 30);
-			_blockedEntitiesBits[12] |= 1 << character;
+			_blockedX[12] |= 1 << character;
 			break;
 		case 37:
 			block2ViewsBump4(character, kCarRedSleeping, 46, 56, 7, 28);
-			_blockedEntitiesBits[13] |= 1 << character;
+			_blockedX[13] |= 1 << character;
 			break;
 		case 38:
 			block2ViewsBump4(character, kCarRedSleeping, 47, 57, 5, 26);
-			_blockedEntitiesBits[14] |= 1 << character;
+			_blockedX[14] |= 1 << character;
 			break;
 		case 39:
 			block2ViewsBump4(character, kCarRedSleeping, 48, 58, 3, 25);
-			_blockedEntitiesBits[15] |= 1 << character;
+			_blockedX[15] |= 1 << character;
 			break;
 		default:
 			return;
@@ -811,72 +811,72 @@ void LogicManager::blockAtDoor(int character, int door) {
 	}
 }
 
-void LogicManager::releaseAtDoor(int character, int door) {
-	if (character <= 31 && (door - 1) <= 38) {
-		switch (door) {
+void LogicManager::releaseAtDoor(int character, int status) {
+	if (character <= 31 && (status - 1) <= 38) {
+		switch (status) {
 		case 1:
 			release2Views(character, kCarGreenSleeping, 41, 51);
-			_blockedEntitiesBits[0] &= ~(1 << character);
+			_blockedX[0] &= ~(1 << character);
 			break;
 		case 2:
 			release2Views(character, kCarGreenSleeping, 42, 52);
-			_blockedEntitiesBits[1] &= ~(1 << character);
+			_blockedX[1] &= ~(1 << character);
 			break;
 		case 3:
 			release2Views(character, kCarGreenSleeping, 43, 53);
-			_blockedEntitiesBits[2] &= ~(1 << character);
+			_blockedX[2] &= ~(1 << character);
 			break;
 		case 4:
 			release2Views(character, kCarGreenSleeping, 44, 54);
-			_blockedEntitiesBits[3] &= ~(1 << character);
+			_blockedX[3] &= ~(1 << character);
 			break;
 		case 5:
 			release2Views(character, kCarGreenSleeping, 45, 55);
-			_blockedEntitiesBits[4] &= ~(1 << character);
+			_blockedX[4] &= ~(1 << character);
 			break;
 		case 6:
 			release2Views(character, kCarGreenSleeping, 46, 56);
-			_blockedEntitiesBits[5] &= ~(1 << character);
+			_blockedX[5] &= ~(1 << character);
 			break;
 		case 7:
 			release2Views(character, kCarGreenSleeping, 47, 57);
-			_blockedEntitiesBits[6] &= ~(1 << character);
+			_blockedX[6] &= ~(1 << character);
 			break;
 		case 8:
 			release2Views(character, kCarGreenSleeping, 48, 58);
-			_blockedEntitiesBits[7] &= ~(1 << character);
+			_blockedX[7] &= ~(1 << character);
 			break;
 		case 32:
 			release2Views(character, kCarRedSleeping, 41, 51);
-			_blockedEntitiesBits[8] &= ~(1 << character);
+			_blockedX[8] &= ~(1 << character);
 			break;
 		case 33:
 			release2Views(character, kCarRedSleeping, 42, 52);
-			_blockedEntitiesBits[9] &= ~(1 << character);
+			_blockedX[9] &= ~(1 << character);
 			break;
 		case 34:
 			release2Views(character, kCarRedSleeping, 43, 53);
-			_blockedEntitiesBits[10] &= ~(1 << character);
+			_blockedX[10] &= ~(1 << character);
 			break;


Commit: 3515db6a9d801a5052eade9d8d5b207e9128d7c4
    https://github.com/scummvm/scummvm/commit/3515db6a9d801a5052eade9d8d5b207e9128d7c4
Author: AndywinXp (andywinxp at gmail.com)
Date: 2025-06-16T23:12:18+02:00

Commit Message:
LASTEXPRESS: Fix some wrongly cleaned up code for TrainM

Changed paths:
    engines/lastexpress/characters/trainm.cpp


diff --git a/engines/lastexpress/characters/trainm.cpp b/engines/lastexpress/characters/trainm.cpp
index 3c052395108..ac8e9b4863d 100644
--- a/engines/lastexpress/characters/trainm.cpp
+++ b/engines/lastexpress/characters/trainm.cpp
@@ -1439,7 +1439,7 @@ void LogicManager::HAND_TrainM_InOffice(HAND_PARAMS) {
 			break;
 		}
 
-		if (_gameTime > 1089000 && !getCharacterCurrentParams(kCharacterTrainM)[7] && !(getCharacterCurrentParams(kCharacterTrainM)[7] = 1, getCharacterCurrentParams(kCharacterTrainM)[4])) {
+		if (_gameTime > 1089000 && !getCharacterCurrentParams(kCharacterTrainM)[7] && (getCharacterCurrentParams(kCharacterTrainM)[7] = 1, !getCharacterCurrentParams(kCharacterTrainM)[4])) {
 			getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 5;
 			TrainMCall(&LogicManager::CONS_TrainM_LeaveOffice, 0, 0, 0, 0);
 			break;
@@ -1499,7 +1499,7 @@ void LogicManager::HAND_TrainM_InOffice(HAND_PARAMS) {
 		break;
 	case 9:
 		getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 17;
-		TrainMCall(&LogicManager::CONS_TrainM_KickCathOut, msg->param.intParam == 105, 0, 0, 0);
+		TrainMCall(&LogicManager::CONS_TrainM_KickCathOut, (msg->param.intParam == 105) ? 1 : 0, 0, 0, 0);
 		break;
 	case 12:
 		getCharacter(kCharacterTrainM).characterPosition.car = kCarBaggage;
@@ -1563,7 +1563,7 @@ void LogicManager::HAND_TrainM_InOffice(HAND_PARAMS) {
 
 			// fall through
 		case 4:
-			if (_gameTime > 1089000 && !getCharacterCurrentParams(kCharacterTrainM)[7] && !(getCharacterCurrentParams(kCharacterTrainM)[7] = 1, getCharacterCurrentParams(kCharacterTrainM)[4])) {
+			if (_gameTime > 1089000 && !getCharacterCurrentParams(kCharacterTrainM)[7] && (getCharacterCurrentParams(kCharacterTrainM)[7] = 1, !getCharacterCurrentParams(kCharacterTrainM)[4])) {
 				getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 5;
 				TrainMCall(&LogicManager::CONS_TrainM_LeaveOffice, 0, 0, 0, 0);
 				break;
@@ -1571,17 +1571,29 @@ void LogicManager::HAND_TrainM_InOffice(HAND_PARAMS) {
 
 			// fall through
 		case 5:
-			getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 6;
-			TrainMCall(&LogicManager::CONS_TrainM_DoWalk, 3, 2000, 0, 0);
-			break;
+			if (getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] == 5) {
+				getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 6;
+				TrainMCall(&LogicManager::CONS_TrainM_DoWalk, 3, 2000, 0, 0);
+				break;
+			}
+
+			// fall through
 		case 6:
-			getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 7;
-			TrainMCall(&LogicManager::CONS_TrainM_DoCond, 3, "TRA1202", 0, 0);
-			break;
+			if (getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] == 6) {
+				getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 7;
+				TrainMCall(&LogicManager::CONS_TrainM_DoCond, 3, "TRA1202", 0, 0);
+				break;
+			}
+
+			// fall through
 		case 7:
-			getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 8;
-			TrainMCall(&LogicManager::CONS_TrainM_WalkBackToOffice, 0, 0, 0, 0);
-			break;
+			if (getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] == 7) {
+				getCharacter(kCharacterTrainM).callbacks[getCharacter(kCharacterTrainM).currentCall + 8] = 8;
+				TrainMCall(&LogicManager::CONS_TrainM_WalkBackToOffice, 0, 0, 0, 0);
+				break;
+			}
+
+			// fall through
 		case 8:
 			if (_gameTime > 1107000 && !getCharacterCurrentParams(kCharacterTrainM)[8]) {
 				getCharacterCurrentParams(kCharacterTrainM)[8] = 1;


Commit: 11e77d1c75c07966f05bc56135b2a3d9b2e1efa1
    https://github.com/scummvm/scummvm/commit/11e77d1c75c07966f05bc56135b2a3d9b2e1efa1
Author: AndywinXp (andywinxp at gmail.com)
Date: 2025-06-16T23:12:18+02:00

Commit Message:
LASTEXPRESS: DEBUG: Differentiate train structure between chapters

Also label some previously unlabeled things

Changed paths:
    engines/lastexpress/debug.cpp
    engines/lastexpress/game/logic.cpp
    engines/lastexpress/game/logic.h
    engines/lastexpress/game/otis.cpp
    engines/lastexpress/game/savegame.cpp
    engines/lastexpress/lastexpress.h


diff --git a/engines/lastexpress/debug.cpp b/engines/lastexpress/debug.cpp
index 156b67d9167..b8b10e996f0 100644
--- a/engines/lastexpress/debug.cpp
+++ b/engines/lastexpress/debug.cpp
@@ -194,7 +194,8 @@ void onImGuiRender() {
 		}
 		ImGui::EndChild();
 
-		// Top-right panels
+		// Top-right area
+
 		// Top-right is Clock
 		ImGui::SetCursorPos(ImVec2(mainAreaWidth + 8, 16));
 		ImGui::BeginChild("Clock", ImVec2(_state->_rightPanelWidth, _state->_rightTopPanelHeight), true);
@@ -255,7 +256,8 @@ void Clock::showCurrentTime() {
 	ImVec2 windowSize = ImGui::GetContentRegionAvail();
 	ImVec2 windowCenter = ImVec2(
 		windowPos.x + ImGui::GetWindowSize().x / 2,
-		windowPos.y + ImGui::GetWindowSize().y / 2);
+		windowPos.y + ImGui::GetWindowSize().y / 2
+	);
 
 	drawList->AddText(
 		ImGui::GetFont(),
@@ -460,18 +462,74 @@ void LogicManager::showTrainMapWindow() {
 		bool isSleeper;
 	};
 
-	CarInfo cars[] = {
-		{ kCarRestaurant,    "Restaurant Car",     restaurantColor,    1.6f, 6, false},
-		{ kCarRedSleeping,   "Red Sleeping Car",   redSleepingColor,   1.2f, 8, true },
-		{ kCarGreenSleeping, "Green Sleeping Car", greenSleepingColor, 1.2f, 8, true },
-		{ kCarVestibule,     "Vestibule",          vestibuleColor,     0.3f, 1, false},
-		{ kCarKronos,        "Kronos Car",         kronosColor,        1.0f, 3, false}
+	CarInfo carsChapter1[] = {
+		{ kCarRestaurant,    "Restaurant Car",     restaurantColor,    1.6f, 6, false },
+		{ kCarRedSleeping,   "Red Sleeping Car",   redSleepingColor,   1.2f, 8, true  },
+		{ kCarGreenSleeping, "Green Sleeping Car", greenSleepingColor, 1.2f, 8, true  },
+		{ kCarVestibule,     "Vestibule",          vestibuleColor,     0.3f, 1, false },
+		{ kCarKronos,        "Kronos Car",         kronosColor,        1.0f, 3, false }
+	};
+
+	CarInfo carsChapters23[] = {
+		{ kCarLocomotive,    "Locomotive",         vestibuleColor,     0.5f, 1, false },
+		{ kCarCoalTender,    "Coal Tender",        voidColor,          1.0f, 1, false },
+		{ kCarBaggage,       "Baggage Car",        vestibuleColor,     1.0f, 1, false },
+		{ kCarRestaurant,    "Restaurant Car",     restaurantColor,    1.6f, 6, false },
+		{ kCarRedSleeping,   "Red Sleeping Car",   redSleepingColor,   1.2f, 8, true  },
+		{ kCarGreenSleeping, "Green Sleeping Car", greenSleepingColor, 1.2f, 8, true  },
+		{ kCarVestibule,     "Vestibule",          vestibuleColor,     0.3f, 1, false },
+		{ kCarKronos,        "Kronos Car",         kronosColor,        1.0f, 3, false },
+		{ kCarBaggageRear,   "Rear Baggage Car",   vestibuleColor,     1.0f, 1, false }
+	};
+
+	CarInfo carsChapter4[] = {
+		{ kCarLocomotive,    "Locomotive",         vestibuleColor,     0.5f, 1, false },
+		{ kCarCoalTender,    "Coal Tender",        voidColor,          1.0f, 1, false },
+		{ kCarBaggage,       "Baggage Car",        vestibuleColor,     1.0f, 1, false },
+		{ kCarRestaurant,    "Restaurant Car",     restaurantColor,    1.6f, 6, false },
+		{ kCarRedSleeping,   "Red Sleeping Car",   redSleepingColor,   1.2f, 8, true  },
+		{ kCarGreenSleeping, "Green Sleeping Car", greenSleepingColor, 1.2f, 8, true  },
+		{ kCarVestibule,     "Vestibule",          vestibuleColor,     0.3f, 1, false },
+		{ kCarBaggageRear,   "Rear Baggage Car",   vestibuleColor,     1.0f, 1, false }
+	};
+
+	CarInfo carsChapter5[] = {
+		{ kCarLocomotive,    "Locomotive",         vestibuleColor,     0.5f, 1, false },
+		{ kCarCoalTender,    "Coal Tender",        voidColor,          1.0f, 1, false },
+		{ kCarBaggage,       "Baggage Car",        vestibuleColor,     1.0f, 1, false },
+		{ kCarRestaurant,    "Restaurant Car",     restaurantColor,    1.6f, 6, false }
 	};
 
-	const int carCount = sizeof(cars) / sizeof(cars[0]);
+	CarInfo *cars = nullptr;
+	int carCount = 0;
+
+	switch (_state->_engine->getLogicManager()->_globals[kProgressChapter]) {
+	case 1:
+		cars = carsChapter1;
+		carCount = ARRAYSIZE(carsChapter1);
+		break;
+	case 2:
+	case 3:
+	default:
+		cars = carsChapters23;
+		carCount = ARRAYSIZE(carsChapters23);
+		break;
+	case 4:
+	case 5:
+		if (_state->_engine->getLogicManager()->_globals[kProgressChapter] == 5 &&
+			(_state->_engine->getLogicManager()->_doneNIS[kEventAugustUnhookCars] || _state->_engine->getLogicManager()->_doneNIS[kEventAugustUnhookCarsBetrayal])) {
+			cars = carsChapter5;
+			carCount = ARRAYSIZE(carsChapter5);
+		} else {
+			cars = carsChapter4;
+			carCount = ARRAYSIZE(carsChapter4);
+		}
+
+		break;
+	}
 
 	// Calculate total relative width to scale properly...
-	float totalRelativeWidth = 0;
+	float totalRelativeWidth = 0.2f;
 	for (int i = 0; i < carCount; i++) {
 		totalRelativeWidth += cars[i].width;
 	}
@@ -538,7 +596,8 @@ void LogicManager::showTrainMapWindow() {
 			carMin,
 			carMax,
 			ImGui::ColorConvertFloat4ToU32(car.color),
-			5.0f);
+			5.0f
+		);
 
 		// Corridor position - default is center for non-sleeper cars...
 		float corridorY = carMin.y + (carHeight - corridorHeight) / 2;
@@ -567,7 +626,8 @@ void LogicManager::showTrainMapWindow() {
 				ImVec2(carMin.x, corridorY),
 				ImVec2(carMax.x, corridorY + corridorHeight),
 				ImGui::ColorConvertFloat4ToU32(corridorColor),
-				0.0f);
+				0.0f
+			);
 
 			// Draw corridor-colored areas on both sides of the compartments
 			// (where the compartements rooms end and the door to the next one is nearby)
@@ -577,14 +637,16 @@ void LogicManager::showTrainMapWindow() {
 				ImVec2(carMin.x, carMin.y),
 				ImVec2(compartmentLeftEdge, corridorY),
 				ImGui::ColorConvertFloat4ToU32(corridorColor),
-				0.0f);
+				0.0f
+			);
 
 			// Right side (beyond compartments)
 			drawList->AddRectFilled(
 				ImVec2(compartmentRightEdge, carMin.y),
 				ImVec2(carMax.x, corridorY),
 				ImGui::ColorConvertFloat4ToU32(corridorColor),
-				0.0f);
+				0.0f
+			);
 
 			// Calculate width of each compartment...
 			float compartmentWidth = (compartmentRightEdge - compartmentLeftEdge) / 8;
@@ -598,7 +660,8 @@ void LogicManager::showTrainMapWindow() {
 					ImVec2(x, carMin.y),
 					ImVec2(x, corridorY),
 					IM_COL32(0, 0, 0, 255),
-					1.0f);
+					1.0f
+				);
 			}
 		} else if (car.id == kCarRestaurant) {
 			// Restaurant car with two sections: lounge and restaurant
@@ -633,7 +696,8 @@ void LogicManager::showTrainMapWindow() {
 				ImVec2(carMin.x, corridorY),
 				ImVec2(carMax.x, corridorY + corridorHeight),
 				ImGui::ColorConvertFloat4ToU32(corridorColor),
-				0.0f);
+				0.0f
+			);
 
 			// Draw restaurant tables...
 			float tableWidth = restaurantWidth / 3;
@@ -701,15 +765,16 @@ void LogicManager::showTrainMapWindow() {
 
 		// Draw car name and ID...
 		char carName[32];
-		Common::sprintf_s(carName, "%s (%d)", car.name, car.id);
+		Common::sprintf_s(carName, "%s\n(%d)", car.name, car.id);
 		ImVec2 textSize = ImGui::CalcTextSize(carName);
 		drawList->AddText(
 			ImVec2(carMin.x + (carWidth / 2) - (textSize.x / 2), carMax.y + 5),
 			IM_COL32(255, 255, 255, 255),
-			carName);
+			carName
+		);
 
 		// Draw characters in this car...
-		for (int i = 0; i < charPositions.size(); i++) {
+		for (uint i = 0; i < charPositions.size(); i++) {
 			if (charPositions[i].car == car.id) {
 				float charX, charY;
 
@@ -767,7 +832,7 @@ void LogicManager::showTrainMapWindow() {
 						if (inLounge) {
 							// Lounge area (right side of car)...
 							charX = carMin.x + restaurantWidth + (loungeWidth / 2);
-							charY = restCorridorY + (compartment % 2 == 0 ? -restCorridorY / 2 : corridorHeight + restCorridorY / 2);
+							charY = carMin.y + carHeight / 2;
 						} else {
 							// Restaurant area (left side of car)...
 							float tableWidth = restaurantWidth / 3;
@@ -801,14 +866,16 @@ void LogicManager::showTrainMapWindow() {
 					ImVec2(charX, charY),
 					8.0f,
 					ImGui::ColorConvertFloat4ToU32(charPositions[i].charIndex == kCharacterCath ? cathColor : characterColor),
-					12);
+					12
+				);
 
 				char charId[8];
 				Common::sprintf_s(charId, "%d", charPositions[i].charIndex);
 				drawList->AddText(
 					ImVec2(charX - ImGui::CalcTextSize(charId).x / 2, charY - ImGui::CalcTextSize(charId).y / 2),
 					charPositions[i].charIndex == kCharacterCath ? IM_COL32(255, 255, 255, 255) : IM_COL32(0, 0, 0, 255),
-					charId);
+					charId
+				);
 
 				// Tooltip!
 				ImGui::SetCursorScreenPos(ImVec2(charX - 8, charY - 8));
@@ -819,7 +886,8 @@ void LogicManager::showTrainMapWindow() {
 					ImGui::Text("Car: %d, Loc: %d, Pos: %d",
 								charPositions[i].car,
 								getCharacter(charPositions[i].charIndex).characterPosition.location,
-								getCharacter(charPositions[i].charIndex).characterPosition.position);
+								getCharacter(charPositions[i].charIndex).characterPosition.position
+					);
 					ImGui::EndTooltip();
 				}
 			}
@@ -855,11 +923,12 @@ void LogicManager::showTrainMapWindow() {
 		drawList->AddText(
 			ImVec2(voidMin.x + 10, voidMin.y + 5),
 			IM_COL32(255, 255, 255, 255),
-			voidLabel);
+			voidLabel
+		);
 
 		// Character markers...
 		float charSpacing = (voidMax.x - voidMin.x - 20) / (voidCharPositions.size() + 1);
-		for (int i = 0; i < voidCharPositions.size(); i++) {
+		for (uint i = 0; i < voidCharPositions.size(); i++) {
 			float charX = voidMin.x + 10 + charSpacing * (i + 1);
 			float charY = voidMin.y + 35;
 
@@ -867,14 +936,16 @@ void LogicManager::showTrainMapWindow() {
 				ImVec2(charX, charY),
 				8.0f,
 				ImGui::ColorConvertFloat4ToU32(characterColor),
-				12);
+				12
+			);
 
 			char charId[16];
 			Common::sprintf_s(charId, "%d", voidCharPositions[i].charIndex);
 			drawList->AddText(
 				ImVec2(charX - ImGui::CalcTextSize(charId).x / 2, charY - ImGui::CalcTextSize(charId).y / 2),
 				IM_COL32(0, 0, 0, 255),
-				charId);
+				charId
+			);
 
 			// Tooltip! :-)
 			ImGui::SetCursorScreenPos(ImVec2(charX - 8, charY - 8));
@@ -884,7 +955,8 @@ void LogicManager::showTrainMapWindow() {
 				ImGui::Text("%s", getCharacterName(voidCharPositions[i].charIndex));
 				ImGui::Text("Car: 0, Loc: %d, Pos: %d",
 							getCharacter(voidCharPositions[i].charIndex).characterPosition.location,
-							getCharacter(voidCharPositions[i].charIndex).characterPosition.position);
+							getCharacter(voidCharPositions[i].charIndex).characterPosition.position
+				);
 				ImGui::EndTooltip();
 			}
 		}
@@ -943,7 +1015,7 @@ void LogicManager::renderCharacterGrid(bool onlyPinned, int &selectedCharacter)
 		Common::StringArray funcNames = getCharacterFunctionNames(i);
 
 		Common::String funcCurrName = "NONE";
-		if (character->callbacks[character->currentCall] - 1 < funcNames.size())
+		if ((uint)(character->callbacks[character->currentCall] - 1) < funcNames.size())
 			funcCurrName = funcNames[character->callbacks[character->currentCall] - 1];
 
 		// Cath (the player) doesn't have logic functions...
@@ -974,7 +1046,8 @@ void LogicManager::renderCharacterGrid(bool onlyPinned, int &selectedCharacter)
 
 	if (displayed == 0) {
 		ImGui::TextColored(ImVec4(0.7f, 0.7f, 0.7f, 1.0f),
-						   onlyPinned ? "No pinned characters match the filter" : "No characters match the filter");
+						   onlyPinned ? "No pinned characters match the filter" : "No characters match the filter"
+		);
 	}
 }
 
@@ -991,12 +1064,13 @@ void LogicManager::renderCharacterDetails(Character *character, int index) {
 	ImGui::Text("Position: Car %u, Location %u, Position %u",
 				character->characterPosition.car,
 				character->characterPosition.location,
-				character->characterPosition.position);
+				character->characterPosition.position
+	);
 
 	Common::StringArray funcNames = getCharacterFunctionNames(index);
 
 	Common::String funcCurrName = "NONE";
-	if (character->callbacks[character->currentCall] - 1 < funcNames.size())
+	if ((uint)(character->callbacks[character->currentCall] - 1) < funcNames.size())
 		funcCurrName = funcNames[character->callbacks[character->currentCall] - 1];
 
 	// Cath (the player) doesn't have logic functions...
@@ -1026,7 +1100,8 @@ void LogicManager::renderCharacterDetails(Character *character, int index) {
 				ImGui::BulletText("Level %d: %s (#%d)",
 								  currentDepth - i,
 								  funcNames[functionId - 1].c_str(),
-								  functionId);
+								  functionId
+				);
 
 				ImGui::Unindent(indentAmount);
 			}
@@ -1059,8 +1134,8 @@ void LogicManager::renderCharacterDetails(Character *character, int index) {
 		ImGui::Text("Process Entity: %d", character->doProcessEntity);
 		ImGui::Text("Previous Car: %d", character->car2);
 		ImGui::Text("Previous Position: %d", character->position2);
-		ImGui::Text("Field_4A9: %d", character->field_4A9);
-		ImGui::Text("Field_4AA: %d", character->field_4AA);
+		ImGui::Text("Position fudge flag: %d", character->needsPosFudge);
+		ImGui::Text("Position fudge flag (secondary): %d", character->needsSecondaryPosFudge);
 	}
 
 	if (ImGui::CollapsingHeader("Call Parameters", ImGuiTreeNodeFlags_DefaultOpen)) {
diff --git a/engines/lastexpress/game/logic.cpp b/engines/lastexpress/game/logic.cpp
index de5fce0617f..b444f329365 100644
--- a/engines/lastexpress/game/logic.cpp
+++ b/engines/lastexpress/game/logic.cpp
@@ -584,40 +584,40 @@ bool LogicManager::whoWalking(int character) {
 	return direction == 1 || direction == 2;
 }
 
-int LogicManager::checkDoor(int object) {
-	if (object < 128) {
-		return _doors[object].status;
+int LogicManager::checkDoor(int door) {
+	if (door < 128) {
+		return _doors[door].status;
 	} else {
 		return 0;
 	}
 }
 
-bool LogicManager::preventEnterComp(int object) {
+bool LogicManager::preventEnterComp(int door) {
 	int car;
 	int position;
 
-	if (object && object <= 8) {
+	if (door && door <= 8) {
 		car = kCarGreenSleeping;
-		position = _objectPosition[object - 1];
+		position = _doorPositions[door - 1];
 
 		if (inComp(kCharacterCath, car, position))
 			return false;
 
-	} else if (object < 32 || object > 39) {
-		if (object < 17 || object > 22) {
-			if (object < 48 || object > 53)
+	} else if (door < 32 || door > 39) {
+		if (door < 17 || door > 22) {
+			if (door < 48 || door > 53)
 				return false;
 
 			car = kCarRedSleeping;
-			position = _objectPosition[object - 48];
+			position = _doorPositions[door - 48];
 		} else {
 			car = kCarGreenSleeping;
-			position = _objectPosition[object - 17];
+			position = _doorPositions[door - 17];
 		}
 
 	} else {
 		car = kCarRedSleeping;
-		position = _objectPosition[object - 32];
+		position = _doorPositions[door - 32];
 		if (inComp(kCharacterCath, car, position))
 			return false;
 	}
@@ -630,37 +630,37 @@ bool LogicManager::preventEnterComp(int object) {
 	return false;	
 }
 
-void LogicManager::setDoor(int object, int character, int status, int cursor, int handleCursor) {
-	if (object < 128) {
-		int oldDoor = _doors[object].status;
-		_doors[object].who = character;
-		_doors[object].status = status;
+void LogicManager::setDoor(int door, int character, int status, int windowCursor, int handleCursor) {
+	if (door < 128) {
+		int oldStatus = _doors[door].status;
+		_doors[door].who = character;
+		_doors[door].status = status;
 
-		if (cursor != 255 || handleCursor != 255) {
-			if (cursor != 255)
-				_doors[object].windowCursor = cursor;
+		if (windowCursor != 255 || handleCursor != 255) {
+			if (windowCursor != 255)
+				_doors[door].windowCursor = windowCursor;
 
 			if (handleCursor != 255)
-				_doors[object].handleCursor = handleCursor;
+				_doors[door].handleCursor = handleCursor;
 
 			mouseStatus();
 		}
 
 		_engine->getSoundManager()->_scanAnySoundLoopingSection = true;
 
-		if (oldDoor != status && (oldDoor == 2 || status == 2) && (object && object <= 8 || object >= 32 && object <= 39))
+		if (oldStatus != status && (oldStatus == 2 || status == 2) && (door && door <= 8 || door >= 32 && door <= 39))
 			_engine->getOtisManager()->drawLooseSprites();
 	}
 }
 
-void LogicManager::setModel(int object, int8 model) {
-	if (object < 128)
-		_doors[object].model = model;
+void LogicManager::setModel(int door, int8 model) {
+	if (door < 128)
+		_doors[door].model = model;
 }
 
-int LogicManager::getModel(int object) {
-	if (object < 128) {
-		return _doors[object].model;
+int LogicManager::getModel(int door) {
+	if (door < 128) {
+		return _doors[door].model;
 	} else {
 		return 0;
 	}
@@ -1091,9 +1091,9 @@ bool LogicManager::obstacleBetween(int character1, int character2) {
 		char2Pos = getCharacter(character2).characterPosition.position;
 	}
 
-	for (i = 7; i > -1 && _objectPosition[i] < (int)char1Pos; i--);
+	for (i = 7; i > -1 && _doorPositions[i] < (int)char1Pos; i--);
 
-	for (j = 0; j < 8 && _objectPosition[j] > (int)char2Pos; j++);
+	for (j = 0; j < 8 && _doorPositions[j] > (int)char2Pos; j++);
 
 	if (i > -1 && j < 8) {
 		while (j <= i) {
@@ -1115,15 +1115,15 @@ bool LogicManager::obstacleBetween(int character1, int character2) {
 	return false;
 }
 
-bool LogicManager::bumpCathTowardsCond(int object, bool playSound, bool loadScene) {
-	if (getCharacter(kCharacterCath).characterPosition.location || (object < 2 || object > 8) && (object < 32 || object > 39)) {
+bool LogicManager::bumpCathTowardsCond(int door, bool playSound, bool loadScene) {
+	if (getCharacter(kCharacterCath).characterPosition.location || (door < 2 || door > 8) && (door < 32 || door > 39)) {
 		return false;
 	}
 
 	if (getCharacter(kCharacterCath).characterPosition.car == getCharacter(kCharacterPolice).characterPosition.car &&
 		!getCharacter(kCharacterPolice).characterPosition.location && !obstacleBetween(kCharacterCath, kCharacterPolice)) {
 		if (playSound) {
-			if (_doors[object].status == 1 || _doors[object].status == 3 || preventEnterComp(object)) {
+			if (_doors[door].status == 1 || _doors[door].status == 3 || preventEnterComp(door)) {
 				queueSFX(kCharacterCath, 13, 0);
 			} else {
 				queueSFX(kCharacterCath, 14, 0);
@@ -1132,7 +1132,7 @@ bool LogicManager::bumpCathTowardsCond(int object, bool playSound, bool loadScen
 		}
 
 		if (loadScene)
-			bumpCathRDoor(object);
+			bumpCathRDoor(door);
 
 		return true;
 	}
@@ -1149,7 +1149,7 @@ bool LogicManager::bumpCathTowardsCond(int object, bool playSound, bool loadScen
 				(getCharacter(kCharacterTrainM).characterPosition.car != kCarGreenSleeping || getCharacter(kCharacterTrainM).characterPosition.position > 2740)) {
 
 				if (playSound) {
-					if (_doors[object].status == 1 || _doors[object].status == 3 || preventEnterComp(object)) {
+					if (_doors[door].status == 1 || _doors[door].status == 3 || preventEnterComp(door)) {
 						queueSFX(kCharacterCath, 13, 0);
 					} else {
 						queueSFX(kCharacterCath, 14, 0);
@@ -1158,12 +1158,12 @@ bool LogicManager::bumpCathTowardsCond(int object, bool playSound, bool loadScen
 				}
 
 				if (!whoRunningDialog(kCharacterCond1))
-					playCondYelling(kCharacterCond1, object);
+					playCondYelling(kCharacterCond1, door);
 
 				send(kCharacterCath, kCharacterCond1, 305159806, 0);
 
 				if (loadScene)
-					bumpCathRDoor(object);
+					bumpCathRDoor(door);
 
 				return true;
 			}
@@ -1174,7 +1174,7 @@ bool LogicManager::bumpCathTowardsCond(int object, bool playSound, bool loadScen
 			getCharacter(kCharacterCond1).characterPosition.position < getCharacter(kCharacterCath).characterPosition.position) {
 
 			if (playSound) {
-				if (_doors[object].status == 1 || _doors[object].status == 3 || preventEnterComp(object)) {
+				if (_doors[door].status == 1 || _doors[door].status == 3 || preventEnterComp(door)) {
 					queueSFX(kCharacterCath, 13, 0);
 				} else {
 					queueSFX(kCharacterCath, 14, 0);
@@ -1191,7 +1191,7 @@ bool LogicManager::bumpCathTowardsCond(int object, bool playSound, bool loadScen
 			}
 
 			if (loadScene)
-				bumpCathRDoor(object);
+				bumpCathRDoor(door);
 
 			return true;
 		}
@@ -1201,7 +1201,7 @@ bool LogicManager::bumpCathTowardsCond(int object, bool playSound, bool loadScen
 			getCharacter(kCharacterCond1).characterPosition.position > getCharacter(kCharacterCath).characterPosition.position) {
 
 			if (playSound) {
-				if (_doors[object].status == 1 || _doors[object].status == 3 || preventEnterComp(object)) {
+				if (_doors[door].status == 1 || _doors[door].status == 3 || preventEnterComp(door)) {
 					queueSFX(kCharacterCath, 13, 0);
 				} else {
 					queueSFX(kCharacterCath, 14, 0);
@@ -1218,7 +1218,7 @@ bool LogicManager::bumpCathTowardsCond(int object, bool playSound, bool loadScen
 			}
 
 			if (loadScene)
-				bumpCathFDoor(object);
+				bumpCathFDoor(door);
 
 			return true;
 		}
@@ -1239,7 +1239,7 @@ bool LogicManager::bumpCathTowardsCond(int object, bool playSound, bool loadScen
 			(getCharacter(kCharacterMadame).characterPosition.car != kCarRedSleeping || getCharacter(kCharacterMadame).characterPosition.position > 2740)) {
 
 			if (playSound) {
-				if (_doors[object].status == 1 || _doors[object].status == 3 || preventEnterComp(object)) {
+				if (_doors[door].status == 1 || _doors[door].status == 3 || preventEnterComp(door)) {
 					queueSFX(kCharacterCath, 13, 0);
 				} else {
 					queueSFX(kCharacterCath, 14, 0);
@@ -1248,12 +1248,12 @@ bool LogicManager::bumpCathTowardsCond(int object, bool playSound, bool loadScen
 			}
 
 			if (!whoRunningDialog(kCharacterCond2))
-				playCondYelling(kCharacterCond2, object);
+				playCondYelling(kCharacterCond2, door);
 
 			send(kCharacterCath, kCharacterCond2, 305159806, 0);
 
 			if (loadScene)
-				bumpCathRDoor(object);
+				bumpCathRDoor(door);
 
 			return true;
 		}
@@ -1261,7 +1261,7 @@ bool LogicManager::bumpCathTowardsCond(int object, bool playSound, bool loadScen
 
 	if (!obstacleBetween(kCharacterCath, kCharacterCond2) && getCharacter(kCharacterCond2).direction == 1 && getCharacter(kCharacterCath).characterPosition.position > getCharacter(kCharacterCond2).characterPosition.position) {
 		if (playSound) {
-			if (_doors[object].status == 1 || _doors[object].status == 3 || preventEnterComp(object)) {
+			if (_doors[door].status == 1 || _doors[door].status == 3 || preventEnterComp(door)) {
 				queueSFX(kCharacterCath, 13, 0);
 			} else {
 				queueSFX(kCharacterCath, 14, 0);
@@ -1278,7 +1278,7 @@ bool LogicManager::bumpCathTowardsCond(int object, bool playSound, bool loadScen
 		}
 
 		if (loadScene)
-			bumpCathRDoor(object);
+			bumpCathRDoor(door);
 
 		return true;
 	}
@@ -1288,7 +1288,7 @@ bool LogicManager::bumpCathTowardsCond(int object, bool playSound, bool loadScen
 	}
 
 	if (playSound) {
-		if (_doors[object].status == 1 || _doors[object].status == 3 || preventEnterComp(object)) {
+		if (_doors[door].status == 1 || _doors[door].status == 3 || preventEnterComp(door)) {
 			queueSFX(kCharacterCath, 13, 0);
 		} else {
 			queueSFX(kCharacterCath, 14, 0);
@@ -1305,7 +1305,7 @@ bool LogicManager::bumpCathTowardsCond(int object, bool playSound, bool loadScen
 	}
 
 	if (loadScene)
-		bumpCathFDoor(object);
+		bumpCathFDoor(door);
 
 	return true;
 }
@@ -1352,9 +1352,9 @@ void LogicManager::bumpCathRx(int car, int position) {
 	}
 }
 
-void LogicManager::bumpCathFDoor(int object) {
-	if ((object - 1) <= 38) {
-		switch (object) {
+void LogicManager::bumpCathFDoor(int door) {
+	if ((door - 1) <= 38) {
+		switch (door) {
 		case 1:
 			bumpCath(kCarGreenSleeping, 17, 255);
 			break;
@@ -1409,9 +1409,9 @@ void LogicManager::bumpCathFDoor(int object) {
 	}
 }
 
-void LogicManager::bumpCathRDoor(int object) {
-	if ((object - 1) <= 38) {
-		switch (object) {
+void LogicManager::bumpCathRDoor(int door) {
+	if ((door - 1) <= 38) {
+		switch (door) {
 		case 1:
 			bumpCath(kCarGreenSleeping, 38, 255);
 			break;
@@ -3117,7 +3117,7 @@ bool LogicManager::walk(int character, int car, int position) {
 		}
 
 		if (whoOnScreen(character)) {
-			if (getCharacter(character).field_4A9) {
+			if (getCharacter(character).needsPosFudge) {
 
 				if (getCharacter(character).characterPosition.car == kCarGreenSleeping) {
 					offset = 0;
@@ -3126,11 +3126,11 @@ bool LogicManager::walk(int character, int car, int position) {
 				}
 
 				for (int i = 0; i < 8; i++) {
-					if ((_blockedX[offset + i] || _softBlockedX[offset + i]) && nearX(character, _objectPosition[i], 750) &&
-						cathWillSeeOtis(_objectPosition[i]) && (getCharacter(character).direction == 1 && (getCharacter(character).characterPosition.position < _objectPosition[i]) &&
-							(car != getCharacter(character).characterPosition.car || position > _objectPosition[i]) ||
-							(getCharacter(character).direction == 2 && (getCharacter(character).characterPosition.position > _objectPosition[i]) &&
-								(car != getCharacter(character).characterPosition.car || position < _objectPosition[i])))) {
+					if ((_blockedX[offset + i] || _softBlockedX[offset + i]) && nearX(character, _doorPositions[i], 750) &&
+						cathWillSeeOtis(_doorPositions[i]) && (getCharacter(character).direction == 1 && (getCharacter(character).characterPosition.position < _doorPositions[i]) &&
+							(car != getCharacter(character).characterPosition.car || position > _doorPositions[i]) ||
+							(getCharacter(character).direction == 2 && (getCharacter(character).characterPosition.position > _doorPositions[i]) &&
+								(car != getCharacter(character).characterPosition.car || position < _doorPositions[i])))) {
 						if (_blockedX[offset + i]) {
 							excuseMeCharacter = whoseBit(_blockedX[offset + i]);
 						} else {
@@ -3430,7 +3430,7 @@ void LogicManager::endGraphics(int character) {
 		delete getCharacter(character).sequence2;
 		getCharacter(character).sequence2 = nullptr;
 		Common::strcpy_s(getCharacter(character).sequenceName2, "");
-		getCharacter(character).field_4AA = 0;
+		getCharacter(character).needsSecondaryPosFudge = 0;
 		getCharacter(character).directionSwitch = 0;
 	}
 
@@ -3439,7 +3439,7 @@ void LogicManager::endGraphics(int character) {
 		delete getCharacter(character).sequence1;
 		getCharacter(character).sequence1 = nullptr;
 		Common::strcpy_s(getCharacter(character).sequenceName, "");
-		getCharacter(character).field_4A9 = 0;
+		getCharacter(character).needsPosFudge = 0;
 		getCharacter(character).currentFrameSeq1 = -1;
 	}
 
diff --git a/engines/lastexpress/game/logic.h b/engines/lastexpress/game/logic.h
index 44ce53e7654..7c81ee9f388 100644
--- a/engines/lastexpress/game/logic.h
+++ b/engines/lastexpress/game/logic.h
@@ -118,11 +118,11 @@ public:
 	bool nearX(int character, int x, int maxDist);
 	bool whoFacingCath(int character);
 	bool whoWalking(int character);
-	int checkDoor(int object);
-	bool preventEnterComp(int object);
-	void setDoor(int object, int character, int status, int cursor, int handleCursor);
-	void setModel(int object, int8 model);
-	int getModel(int object);
+	int checkDoor(int door);
+	bool preventEnterComp(int door);
+	void setDoor(int door, int character, int status, int windowCursor, int handleCursor);
+	void setModel(int door, int8 model);
+	int getModel(int door);
 	void blockView(int character, int car, int position);
 	void releaseView(int character, int car, int position);
 	void releaseEverything(int character);
@@ -135,11 +135,11 @@ public:
 	int getBumpNode(int car, int position, int param);
 	void bumpCath(int car, int position, int param);
 	bool obstacleBetween(int character1, int character2);
-	bool bumpCathTowardsCond(int object, bool playSound, bool loadScene);
+	bool bumpCathTowardsCond(int door, bool playSound, bool loadScene);
 	void bumpCathFx(int car, int position);
 	void bumpCathRx(int car, int position);
-	void bumpCathFDoor(int object);
-	void bumpCathRDoor(int object);
+	void bumpCathFDoor(int door);
+	void bumpCathRDoor(int door);
 	void bumpCathTylerComp();
 	int getSmartBumpNode(int node);
 	void smartBumpCath();
@@ -253,7 +253,7 @@ private:
 	int32 _realTime = 0;
 	int32 _lastSavegameSessionTicks = 0;
 
-	int _objectPosition[8] = {
+	int _doorPositions[8] = {
 		8200, 7500, 6470, 5790,
 		4840, 4070, 3050, 2740 
 	};
diff --git a/engines/lastexpress/game/otis.cpp b/engines/lastexpress/game/otis.cpp
index 1e8a7113213..16d8687ea9e 100644
--- a/engines/lastexpress/game/otis.cpp
+++ b/engines/lastexpress/game/otis.cpp
@@ -79,8 +79,8 @@ void OtisManager::wipeGSysInfo(int character) {
 		getCharacter(character).sequence2 = nullptr;
 	}
 
-	getCharacter(character).field_4A9 = 0;
-	getCharacter(character).field_4AA = 0;
+	getCharacter(character).needsPosFudge = 0;
+	getCharacter(character).needsSecondaryPosFudge = 0;
 	getCharacter(character).sequenceName[0] = '\0';
 	getCharacter(character).sequenceName2[0] = '\0';
 	getCharacter(character).sequenceNameCopy[0] = '\0';
@@ -253,7 +253,7 @@ void OtisManager::startSeq(int character, int direction, bool loadSequence) {
 	else
 		ticksToWaitUntilRestartCycle = 15;
 
-	int8 field_4A9_flag = getCharacter(character).field_4A9;
+	int8 savedNeedsPosFudge = getCharacter(character).needsPosFudge;
 	getCharacter(character).doProcessEntity = 1;
 
 	if (getCharacter(kCharacterCath).characterPosition.car == getCharacter(character).characterPosition.car || direction == 4) {
@@ -329,9 +329,9 @@ void OtisManager::startSeq(int character, int direction, bool loadSequence) {
 						}
 					}
 
-					getCharacter(character).field_4AA = getCharacter(character).field_4A9;
+					getCharacter(character).needsSecondaryPosFudge = getCharacter(character).needsPosFudge;
 
-					if ((direction == 1 || direction == 2) && !getCharacter(character).field_4AA && getCharacter(character).sequence2) {
+					if ((direction == 1 || direction == 2) && !getCharacter(character).needsSecondaryPosFudge && getCharacter(character).sequence2) {
 						getCharacter(character).currentFrameSeq2 = findFrame(character, getCharacter(character).sequence2, 0, false);
 
 						if (getCharacter(character).currentFrameSeq2 == -1) {
@@ -342,7 +342,7 @@ void OtisManager::startSeq(int character, int direction, bool loadSequence) {
 						getCharacter(character).currentFrameSeq2 = 0;
 					}
 
-					getCharacter(character).field_4A9 = field_4A9_flag;
+					getCharacter(character).needsPosFudge = savedNeedsPosFudge;
 					getCharacter(character).waitedTicksUntilCycleRestart = getCharacter(character).frame1->ticksToWaitUntilCycleRestart;
 					getCharacter(character).currentFrameSeq1 = getCharacter(character).sequence1->numFrames - 1;
 					getCharacter(character).direction = 5;
@@ -357,13 +357,13 @@ void OtisManager::startSeq(int character, int direction, bool loadSequence) {
 					getCharacter(character).sequence2 = _engine->getMemoryManager()->copySeq(getCharacter(character).sequence1);
 					Common::strcpy_s(getCharacter(character).sequenceName2, getCharacter(character).sequenceName);
 
-					getCharacter(character).field_4AA = getCharacter(character).field_4A9;
+					getCharacter(character).needsSecondaryPosFudge = getCharacter(character).needsPosFudge;
 					getCharacter(character).waitedTicksUntilCycleRestart = getCharacter(character).frame1->ticksToWaitUntilCycleRestart;
 					getCharacter(character).currentFrameSeq1 = getCharacter(character).sequence1->numFrames - 1;
 					getCharacter(character).direction = 5;
 					getCharacter(character).directionSwitch = direction;
 
-					if ((direction == 1 || direction == 2) && !getCharacter(character).field_4AA && getCharacter(character).sequence2) {
+					if ((direction == 1 || direction == 2) && !getCharacter(character).needsSecondaryPosFudge && getCharacter(character).sequence2) {
 						getCharacter(character).currentFrameSeq2 = findFrame(character, getCharacter(character).sequence2, 0, false);
 
 						if (getCharacter(character).currentFrameSeq2 == -1)
@@ -469,8 +469,8 @@ void OtisManager::startSeq(int character, int direction, bool loadSequence) {
 			Common::strcpy_s(getCharacter(character).sequenceName, "");
 			Common::strcpy_s(getCharacter(character).sequenceName2, "");
 
-			getCharacter(character).field_4A9 = 0;
-			getCharacter(character).field_4AA = 0;
+			getCharacter(character).needsPosFudge = 0;
+			getCharacter(character).needsSecondaryPosFudge = 0;
 			getCharacter(character).directionSwitch = 0;
 			getCharacter(character).currentFrameSeq1 = -1;
 			getCharacter(character).currentFrameSeq2 = 0;
@@ -495,8 +495,8 @@ void OtisManager::startSeq(int character, int direction, bool loadSequence) {
 		Common::strcpy_s(getCharacter(character).sequenceName, "");
 		Common::strcpy_s(getCharacter(character).sequenceName2, "");
 
-		getCharacter(character).field_4A9 = 0;
-		getCharacter(character).field_4AA = 0;
+		getCharacter(character).needsPosFudge = 0;
+		getCharacter(character).needsSecondaryPosFudge = 0;
 		getCharacter(character).directionSwitch = 0;
 		getCharacter(character).currentFrameSeq1 = -1;
 		getCharacter(character).currentFrameSeq2 = 0;
@@ -505,8 +505,8 @@ void OtisManager::startSeq(int character, int direction, bool loadSequence) {
 }
 
 void OtisManager::getNewSeqName(int character, int direction, char *outSeqName, char *outSecondarySeqName) {
-	getCharacter(character).field_4A9 = 0;
-	getCharacter(character).field_4AA = 0;
+	getCharacter(character).needsPosFudge = 0;
+	getCharacter(character).needsSecondaryPosFudge = 0;
 
 	int outSeqNameSize = sizeof(getCharacter(kCharacterCath).sequenceName);
 
@@ -535,11 +535,11 @@ void OtisManager::getNewSeqName(int character, int direction, char *outSeqName,
 			if (getCharacter(character).characterPosition.position > getCharacter(kCharacterCath).characterPosition.position) {
 				if (getCharacter(character).characterPosition.position <= 8513) {
 					Common::sprintf_s(outSeqName, outSeqNameSize, "%02d%01d-03d.seq", character, getCharacter(character).clothes);
-					getCharacter(character).field_4A9 = 1;
+					getCharacter(character).needsPosFudge = 1;
 				} else {
 					Common::sprintf_s(outSeqName, outSeqNameSize, "%02d%01d-%02ded.seq", character, getCharacter(character).clothes, _engine->getLogicManager()->_trainData[_engine->getLogicManager()->_activeNode].cathDir);
 					Common::sprintf_s(outSecondarySeqName, outSeqNameSize, "%02d%01d-03d.seq", character, getCharacter(character).clothes);
-					getCharacter(character).field_4AA = 1;
+					getCharacter(character).needsSecondaryPosFudge = 1;
 				}
 			}
 
@@ -576,7 +576,7 @@ void OtisManager::getNewSeqName(int character, int direction, char *outSeqName,
 				} else {
 					Common::sprintf_s(outSeqName, outSeqNameSize, "%02d%01d-38d.seq", character, getCharacter(character).clothes);
 					Common::sprintf_s(outSecondarySeqName, outSeqNameSize, "%02d%01d-%02ded.seq", character, getCharacter(character).clothes, _engine->getLogicManager()->_trainData[_engine->getLogicManager()->_activeNode].cathDir);
-					getCharacter(character).field_4A9 = 1;
+					getCharacter(character).needsPosFudge = 1;
 				}
 			}
 
@@ -620,7 +620,7 @@ void OtisManager::getNewSeqName(int character, int direction, char *outSeqName,
 				} else {
 					Common::sprintf_s(outSeqName, outSeqNameSize, "%02d%01d-03u.seq", character, getCharacter(character).clothes);
 					Common::sprintf_s(outSecondarySeqName, outSeqNameSize, "%02d%01d-%02deu.seq", character, getCharacter(character).clothes, _engine->getLogicManager()->_trainData[_engine->getLogicManager()->_activeNode].cathDir);
-					getCharacter(character).field_4A9 = 1;
+					getCharacter(character).needsPosFudge = 1;
 				}
 			}
 
@@ -654,11 +654,11 @@ void OtisManager::getNewSeqName(int character, int direction, char *outSeqName,
 			if (getCharacter(character).characterPosition.position < getCharacter(kCharacterCath).characterPosition.position) {
 				if (getCharacter(character).characterPosition.position >= 2087) {
 					Common::sprintf_s(outSeqName, outSeqNameSize, "%02d%01d-38u.seq", character, getCharacter(character).clothes);
-					getCharacter(character).field_4A9 = 1;
+					getCharacter(character).needsPosFudge = 1;
 				} else {
 					Common::sprintf_s(outSeqName, outSeqNameSize, "%02d%01d-%02deu.seq", character, getCharacter(character).clothes, _engine->getLogicManager()->_trainData[_engine->getLogicManager()->_activeNode].cathDir);
 					Common::sprintf_s(outSecondarySeqName, outSeqNameSize, "%02d%01d-38u.seq", character, getCharacter(character).clothes);
-					getCharacter(character).field_4AA = 1;
+					getCharacter(character).needsSecondaryPosFudge = 1;
 				}
 			}
 
@@ -972,7 +972,7 @@ void OtisManager::initCurFrame(int character) {
 				case 15:
 				case 16:
 				case 17:
-					if (!getCharacter(character).field_4A9) {
+					if (!getCharacter(character).needsPosFudge) {
 						getCharacter(character).currentFrameSeq1 = findFrame(
 							character,
 							getCharacter(character).sequence1,
@@ -1013,7 +1013,7 @@ void OtisManager::initCurFrame(int character) {
 				case 37:
 				case 38:
 				case 39:
-					if (getCharacter(character).field_4A9) {
+					if (getCharacter(character).needsPosFudge) {
 						if (getCharacter(character).characterPosition.position >= getCharacter(kCharacterCath).characterPosition.position) {
 							getCharacter(character).currentFrameSeq1 = -1;
 						} else {
@@ -1222,7 +1222,7 @@ void OtisManager::updateCharacter(int character) {
 
 				getCharacter(character).currentFrameSeq1++;
 
-				if (getCharacter(character).currentFrameSeq1 > (getCharacter(character).sequence1->numFrames - 1) || getCharacter(character).field_4A9 && mainWalkTooFar(character)) {
+				if (getCharacter(character).currentFrameSeq1 > (getCharacter(character).sequence1->numFrames - 1) || getCharacter(character).needsPosFudge && mainWalkTooFar(character)) {
 					if (getCharacter(character).direction == 3) {
 						getCharacter(character).currentFrameSeq1 = 0;
 					} else {
@@ -1328,7 +1328,7 @@ void OtisManager::doNewSprite(int character, bool keepPreviousFrame, bool dontPl
 
 		if (newSprite->visibilityDist) {
 			getCharacter(character).characterPosition.position = newSprite->visibilityDist;
-			if (getCharacter(character).field_4A9)
+			if (getCharacter(character).needsPosFudge)
 				getCharacter(character).characterPosition.position += getFudge();
 		}
 
@@ -1383,14 +1383,14 @@ void OtisManager::doNewSprite(int character, bool keepPreviousFrame, bool dontPl
 void OtisManager::doSeqChange(int character) {
 	if (getCharacter(character).direction != 4 || (_engine->getLogicManager()->send(kCharacterCath, character, 3, 0), _engine->getMessageManager()->flush(), !_engine->_stopUpdatingCharacters) && !getCharacter(character).doProcessEntity) {
 		if (_engine->getLogicManager()->whoWalking(character) && !getCharacter(character).sequence2 && corrRender(0) && getCharacter(kCharacterCath).characterPosition.car == getCharacter(character).characterPosition.car) {
-			if (getCharacter(character).field_4A9 && !_engine->getLogicManager()->whoFacingCath(character)) {
+			if (getCharacter(character).needsPosFudge && !_engine->getLogicManager()->whoFacingCath(character)) {
 				getCharacter(character).characterPosition.position = 8514;
 
 				if (getCharacter(character).direction != 1)
 					getCharacter(character).characterPosition.position = 2086;
 
 				startSeq(character, getCharacter(character).direction, 1);
-			} else if (!getCharacter(character).field_4A9 && _engine->getLogicManager()->whoFacingCath(character)) {
+			} else if (!getCharacter(character).needsPosFudge && _engine->getLogicManager()->whoFacingCath(character)) {
 				getCharacter(character).characterPosition.position = 2088;
 
 				if (getCharacter(character).direction != 1)
@@ -1408,17 +1408,17 @@ void OtisManager::doNextSeq(int character) {
 
 	getCharacter(character).sequence1 = getCharacter(character).sequence2;
 	Common::strcpy_s(getCharacter(character).sequenceName, getCharacter(character).sequenceName2);
-	getCharacter(character).field_4A9 = getCharacter(character).field_4AA;
+	getCharacter(character).needsPosFudge = getCharacter(character).needsSecondaryPosFudge;
 
 	if (getCharacter(character).directionSwitch)
 		getCharacter(character).direction = getCharacter(character).directionSwitch;
 
 	getCharacter(character).sequence2 = nullptr;
 	Common::strcpy_s(getCharacter(character).sequenceName2, "");
-	getCharacter(character).field_4AA = 0;
+	getCharacter(character).needsSecondaryPosFudge = 0;
 	getCharacter(character).directionSwitch = 0;
 
-	if (getCharacter(character).field_4A9) {
+	if (getCharacter(character).needsPosFudge) {
 		initCurFrame(character);
 
 		if (getCharacter(character).currentFrameSeq1 == -1)
@@ -1441,7 +1441,7 @@ void OtisManager::doNoSeq(int character) {
 		if (_engine->getLogicManager()->whoFacingCath(character)) {
 			getCharacter(character).characterPosition.position = getCharacter(0).characterPosition.position;
 		} else {
-			if (getCharacter(character).field_4A9) {
+			if (getCharacter(character).needsPosFudge) {
 				if (getCharacter(character).direction == 1) {
 					getCharacter(character).characterPosition.position = 8514;
 				} else {
@@ -1469,7 +1469,7 @@ void OtisManager::doNoSeq(int character) {
 	}
 
 	Common::strcpy_s(getCharacter(character).sequenceName, "");
-	getCharacter(character).field_4A9 = 0;
+	getCharacter(character).needsPosFudge = 0;
 
 	if (getCharacter(character).directionSwitch)
 		getCharacter(character).direction = getCharacter(character).directionSwitch;
diff --git a/engines/lastexpress/game/savegame.cpp b/engines/lastexpress/game/savegame.cpp
index 62019e8554a..6f2404a4a81 100644
--- a/engines/lastexpress/game/savegame.cpp
+++ b/engines/lastexpress/game/savegame.cpp
@@ -147,8 +147,8 @@ void SaveManager::writeSavePoint(CVCRFile *file, int saveType, int character, in
 		charactersBuffer[i * 1262 + offset++] = characterStruct.position2;
 		charactersBuffer[i * 1262 + offset++] = characterStruct.car2;
 		charactersBuffer[i * 1262 + offset++] = characterStruct.doProcessEntity;
-		charactersBuffer[i * 1262 + offset++] = characterStruct.field_4A9;
-		charactersBuffer[i * 1262 + offset++] = characterStruct.field_4AA;
+		charactersBuffer[i * 1262 + offset++] = characterStruct.needsPosFudge;
+		charactersBuffer[i * 1262 + offset++] = characterStruct.needsSecondaryPosFudge;
 		charactersBuffer[i * 1262 + offset++] = characterStruct.directionSwitch;
 
 		// Copy string fields
@@ -346,8 +346,8 @@ void SaveManager::readSavePoint(CVCRFile *file, int *saveType, uint8 *character,
 				characterStruct->position2 = charactersBuffer[i * 1262 + offset]; offset++;
 				characterStruct->car2 = charactersBuffer[i * 1262 + offset]; offset++;
 				characterStruct->doProcessEntity = charactersBuffer[i * 1262 + offset]; offset++;
-				characterStruct->field_4A9 = charactersBuffer[i * 1262 + offset]; offset++;
-				characterStruct->field_4AA = charactersBuffer[i * 1262 + offset]; offset++;
+				characterStruct->needsPosFudge = charactersBuffer[i * 1262 + offset]; offset++;
+				characterStruct->needsSecondaryPosFudge = charactersBuffer[i * 1262 + offset]; offset++;
 				characterStruct->directionSwitch = charactersBuffer[i * 1262 + offset]; offset++;
 
 				// Copy string fields
diff --git a/engines/lastexpress/lastexpress.h b/engines/lastexpress/lastexpress.h
index ad8a5deb5db..c04afdb7b0e 100644
--- a/engines/lastexpress/lastexpress.h
+++ b/engines/lastexpress/lastexpress.h
@@ -252,8 +252,8 @@ typedef struct Character {
 	int8 position2;
 	int8 car2;
 	int8 doProcessEntity;
-	int8 field_4A9;
-	int8 field_4AA;
+	int8 needsPosFudge;
+	int8 needsSecondaryPosFudge;
 	int8 directionSwitch;
 	char sequenceName[13];
 	char sequenceName2[13];
@@ -285,8 +285,8 @@ typedef struct Character {
 		position2 = 0;
 		car2 = 0;
 		doProcessEntity = 0;
-		field_4A9 = 0;
-		field_4AA = 0;
+		needsPosFudge = 0;
+		needsSecondaryPosFudge = 0;
 		directionSwitch = 0;
 
 		memset(sequenceName, 0, sizeof(sequenceName));


Commit: c22a88182a0bae06e728a9bd0c3f5bdad28c8a42
    https://github.com/scummvm/scummvm/commit/c22a88182a0bae06e728a9bd0c3f5bdad28c8a42
Author: AndywinXp (andywinxp at gmail.com)
Date: 2025-06-16T23:12:18+02:00

Commit Message:
LASTEXPRESS: Fix remaining character logic issues

Changed paths:
    engines/lastexpress/characters/abbot.cpp
    engines/lastexpress/characters/alexei.cpp
    engines/lastexpress/characters/anna.cpp
    engines/lastexpress/characters/august.cpp
    engines/lastexpress/characters/cond2.cpp
    engines/lastexpress/characters/cook.cpp
    engines/lastexpress/characters/francois.cpp
    engines/lastexpress/characters/headwait.cpp
    engines/lastexpress/characters/salko.cpp
    engines/lastexpress/characters/tablea.cpp
    engines/lastexpress/characters/tableb.cpp
    engines/lastexpress/characters/tablec.cpp
    engines/lastexpress/characters/tabled.cpp
    engines/lastexpress/characters/tablee.cpp
    engines/lastexpress/characters/tablef.cpp
    engines/lastexpress/characters/tatiana.cpp


diff --git a/engines/lastexpress/characters/abbot.cpp b/engines/lastexpress/characters/abbot.cpp
index 066aca1e789..5bc150dd99f 100644
--- a/engines/lastexpress/characters/abbot.cpp
+++ b/engines/lastexpress/characters/abbot.cpp
@@ -20,7 +20,6 @@
  */
 
 #include "lastexpress/lastexpress.h"
-#include "lastexpress/game/logic.h"
 
 namespace LastExpress {
 
@@ -777,8 +776,8 @@ void LogicManager::HAND_Abbot_GoLunch(HAND_PARAMS) {
 	case 18:
 		switch (getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8]) {
 		case 1:
-			setDoor(34, getCharacter(kCharacterAbbot).currentCall, 0, 10, 9);
-			setDoor(50, getCharacter(kCharacterAbbot).currentCall, 0, 10, 9);
+			setDoor(34, kCharacterCath, 0, 10, 9);
+			setDoor(50, kCharacterCath, 0, 10, 9);
 			getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 2;
 			AbbotCall(&LogicManager::CONS_Abbot_DoCorrOtis, "617Mc", 34, 0, 0);
 			break;
@@ -799,8 +798,10 @@ void LogicManager::HAND_Abbot_GoLunch(HAND_PARAMS) {
 			break;
 		case 5:
 			startSeqOtis(kCharacterAbbot, "029J");
+
 			if (inSalon(kCharacterCath))
 				advanceFrame(kCharacterAbbot);
+
 			getCharacter(kCharacterAbbot).callbacks[getCharacter(kCharacterAbbot).currentCall + 8] = 6;
 			AbbotCall(&LogicManager::CONS_Abbot_FinishSeqOtis, 0, 0, 0, 0);
 			break;
diff --git a/engines/lastexpress/characters/alexei.cpp b/engines/lastexpress/characters/alexei.cpp
index 2765c5577ce..f613d7229bf 100644
--- a/engines/lastexpress/characters/alexei.cpp
+++ b/engines/lastexpress/characters/alexei.cpp
@@ -525,7 +525,7 @@ void LogicManager::HAND_Alexei_ExitComp(HAND_PARAMS) {
 
 		break;
 	case 135664192:
-		setDoor(2, 0, 1, 10, 9);
+		setDoor(2, kCharacterCath, 1, 10, 9);
 		softReleaseAtDoor(kCharacterAlexei, 2);
 
 		getCharacter(kCharacterAlexei).currentCall--;
@@ -681,8 +681,8 @@ void LogicManager::HAND_Alexei_CompLogic(HAND_PARAMS) {
 		break;
 	case 17:
 		if (getCharacterCurrentParams(kCharacterAlexei)[5] || getCharacterCurrentParams(kCharacterAlexei)[4]) {
-			setDoor(2, 12, 1, 10, 9);
-			setDoor(18, 12, 1, 10, 9);
+			setDoor(2, kCharacterAlexei, 1, 10, 9);
+			setDoor(18, kCharacterAlexei, 1, 10, 9);
 			getCharacterCurrentParams(kCharacterAlexei)[5] = 0;
 			getCharacterCurrentParams(kCharacterAlexei)[4] = 0;
 		}
diff --git a/engines/lastexpress/characters/anna.cpp b/engines/lastexpress/characters/anna.cpp
index b9af64ca4b5..6394ba4dbcc 100644
--- a/engines/lastexpress/characters/anna.cpp
+++ b/engines/lastexpress/characters/anna.cpp
@@ -3491,7 +3491,7 @@ void LogicManager::HAND_Anna_LeaveConcert(HAND_PARAMS) {
 			AnnaCall(&LogicManager::CONS_Anna_DoWalk, 4, 4070, 0, 0);
 			break;
 		case 2:
-			setDoor(37, 0, 1, 0, 0);
+			setDoor(37, kCharacterAlexei, 1, 0, 0);
 			send(kCharacterAnna, kCharacterCond2, 205033696, 0);
 			startCycOtis(kCharacterAnna, "625Ef");
 			softBlockAtDoor(kCharacterAnna, 37);
@@ -3733,15 +3733,15 @@ void LogicManager::HAND_Anna_AfterConcert(HAND_PARAMS) {
 
 		break;
 	case 236241630:
-		setDoor(37, 1, 1, 0, 0);
-		setDoor(53, 1, 1, 0, 0);
+		setDoor(37, kCharacterAnna, 1, 0, 0);
+		setDoor(53, kCharacterAnna, 1, 0, 0);
 		getCharacter(kCharacterAnna).callbacks[getCharacter(kCharacterAnna).currentCall + 8] = 7;
 		AnnaCall(&LogicManager::CONS_Anna_DoDialog, "Ann1016A", 0, 0, 0);
 		break;
 	case 236517970:
 		getCharacterCurrentParams(kCharacterAnna)[2] = 1;
-		setDoor(37, 1, 1, 10, 9);
-		setDoor(53, 1, 1, 10, 9);
+		setDoor(37, kCharacterAnna, 1, 10, 9);
+		setDoor(53, kCharacterAnna, 1, 10, 9);
 		break;
 	default:
 		break;
diff --git a/engines/lastexpress/characters/august.cpp b/engines/lastexpress/characters/august.cpp
index 4b6ac078116..cd689f377db 100644
--- a/engines/lastexpress/characters/august.cpp
+++ b/engines/lastexpress/characters/august.cpp
@@ -1484,7 +1484,7 @@ void LogicManager::HAND_August_KnockTyler(HAND_PARAMS) {
 
 			break;
 		case 4:
-			setDoor(1, 0, 0, 10, 9);
+			setDoor(1, kCharacterCath, 0, 10, 9);
 			playDialog(0, "LIB014", -1, 0);
 			endGraphics(kCharacterAugust);
 			getCharacter(kCharacterAugust).characterPosition.location = 1;
@@ -3124,7 +3124,7 @@ void LogicManager::HAND_August_AfterLunch(HAND_PARAMS) {
 		playDialog(kCharacterAugust, "AUG3102", -1, 15);
 		break;
 	case 12:
-		setDoor(3, 0, 2, 0, 0);
+		setDoor(3, kCharacterCath, 2, 0, 0);
 		startCycOtis(kCharacterAugust, "506A2");
 		getCharacter(kCharacterAugust).inventoryItem = 0x92;
 		break;
@@ -3725,7 +3725,7 @@ void LogicManager::HAND_August_StartPart4(HAND_PARAMS) {
 		getCharacter(kCharacterAugust).characterPosition.location = 1;
 		getCharacter(kCharacterAugust).inventoryItem = 0;
 		getCharacter(kCharacterAugust).clothes = 2;
-		setDoor(3, 0, 2, 0, 0);
+		setDoor(3, kCharacterCath, 2, 0, 0);
 		break;
 	default:
 		break;
@@ -3967,7 +3967,7 @@ void LogicManager::HAND_August_GoSalon4(HAND_PARAMS) {
 	case 18:
 		switch (getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8]) {
 		case 1:
-			setDoor(3, 0, 0, 10, 9);
+			setDoor(3, kCharacterCath, 0, 10, 9);
 			getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 2;
 			AugustCall(&LogicManager::CONS_August_DoWalk, 5, 850, 0, 0);
 			break;
diff --git a/engines/lastexpress/characters/cond2.cpp b/engines/lastexpress/characters/cond2.cpp
index 4764d5f4f9f..125e6b5ea59 100644
--- a/engines/lastexpress/characters/cond2.cpp
+++ b/engines/lastexpress/characters/cond2.cpp
@@ -1383,7 +1383,7 @@ void LogicManager::HAND_Cond2_MakeBedIvo(HAND_PARAMS) {
 			break;
 		case 7:
 			softReleaseAtDoor(kCharacterCond2, 39);
-			setDoor(39, 0, 2, 255, 255);
+			setDoor(39, kCharacterCath, 2, 255, 255);
 			getCharacter(kCharacterCond2).characterPosition.location = 1;
 			endGraphics(kCharacterCond2);
 			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 8;
@@ -1391,7 +1391,7 @@ void LogicManager::HAND_Cond2_MakeBedIvo(HAND_PARAMS) {
 			break;
 		case 8:
 			playDialog(kCharacterCond2, "JAC1013A", -1, 0);
-			setDoor(39, 0, 1, 255, 255);
+			setDoor(39, kCharacterCath, 1, 255, 255);
 			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 9;
 			Cond2Call(&LogicManager::CONS_Cond2_DoCorrOtis, "667Uh", 39, 0, 0);
 			break;
@@ -1487,7 +1487,7 @@ void LogicManager::HAND_Cond2_MakeBedMilos(HAND_PARAMS) {
 			break;
 		case 7:
 			softReleaseAtDoor(kCharacterCond2, 38);
-			setDoor(38, 0, 2, 255, 255);
+			setDoor(38, kCharacterCath, 2, 255, 255);
 			getCharacter(kCharacterCond2).characterPosition.location = 1;
 			endGraphics(kCharacterCond2);
 			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 8;
@@ -1495,7 +1495,7 @@ void LogicManager::HAND_Cond2_MakeBedMilos(HAND_PARAMS) {
 			break;
 		case 8:
 			playDialog(kCharacterCond2, "JAC1030A", -1, 0);
-			setDoor(38, 0, 1, 255, 255);
+			setDoor(38, kCharacterCath, 1, 255, 255);
 			getCharacter(kCharacterCond2).callbacks[getCharacter(kCharacterCond2).currentCall + 8] = 9;
 			Cond2Call(&LogicManager::CONS_Cond2_DoCorrOtis, "627Ug", 38, 0, 0);
 			break;
diff --git a/engines/lastexpress/characters/cook.cpp b/engines/lastexpress/characters/cook.cpp
index 9494c91944c..b6bf9efdb4e 100644
--- a/engines/lastexpress/characters/cook.cpp
+++ b/engines/lastexpress/characters/cook.cpp
@@ -74,7 +74,7 @@ void LogicManager::HAND_Cook_DoSeqOtis(HAND_PARAMS) {
 	switch (msg->action) {
 	case 3:
 		getCharacter(kCharacterCook).currentCall--;
-		_engine->getMessageManager()->setMessageHandle(kCharacterCook, _functionsAbbot[getCharacter(kCharacterCook).callbacks[getCharacter(kCharacterCook).currentCall]]);
+		_engine->getMessageManager()->setMessageHandle(kCharacterCook, _functionsCook[getCharacter(kCharacterCook).callbacks[getCharacter(kCharacterCook).currentCall]]);
 		fedEx(kCharacterCook, kCharacterCook, 18, 0);
 		break;
 	case 12:
@@ -101,7 +101,7 @@ void LogicManager::HAND_Cook_DoDialog(HAND_PARAMS) {
 	switch (msg->action) {
 	case 2:
 		getCharacter(kCharacterCook).currentCall--;
-		_engine->getMessageManager()->setMessageHandle(kCharacterCook, _functionsAbbot[getCharacter(kCharacterCook).callbacks[getCharacter(kCharacterCook).currentCall]]);
+		_engine->getMessageManager()->setMessageHandle(kCharacterCook, _functionsCook[getCharacter(kCharacterCook).callbacks[getCharacter(kCharacterCook).currentCall]]);
 		fedEx(kCharacterCook, kCharacterCook, 18, 0);
 		break;
 	case 12:
@@ -233,7 +233,7 @@ void LogicManager::HAND_Cook_DowntrainVersion(HAND_PARAMS) {
 		break;
 	case 17:
 		if (!inKitchen(kCharacterCath)) {
-			endGraphics(kCharacterCath);
+			endGraphics(kCharacterCook);
 			getCharacter(kCharacterCook).currentCall--;
 			_engine->getMessageManager()->setMessageHandle(8, _functionsCook[getCharacter(kCharacterCook).callbacks[getCharacter(kCharacterCook).currentCall]]);
 			fedEx(kCharacterCook, kCharacterCook, 18, 0);
@@ -336,7 +336,8 @@ void LogicManager::HAND_Cook_InKitchenDinner(HAND_PARAMS) {
 	case 0:
 		if (getCharacterCurrentParams(kCharacterCook)[3] || (getCharacterCurrentParams(kCharacterCook)[3] = _gameTime + getCharacterCurrentParams(kCharacterCook)[1], _gameTime + getCharacterCurrentParams(kCharacterCook)[1] != 0)) {
 			if (getCharacterCurrentParams(kCharacterCook)[3] >= _gameTime)
-				return;
+				break;
+
 			getCharacterCurrentParams(kCharacterCook)[3] = 0x7FFFFFFF;
 		}
 
@@ -368,8 +369,8 @@ void LogicManager::HAND_Cook_InKitchenDinner(HAND_PARAMS) {
 	case 18:
 		if (getCharacter(kCharacterCook).callbacks[getCharacter(kCharacterCook).currentCall + 8] == 1) {
 			getCharacterCurrentParams(kCharacterCook)[0] = 0;
-		} else if (getCharacter(kCharacterCook).callbacks[getCharacter(kCharacterCook).currentCall + 8] >= 2 && getCharacter(kCharacterCook).callbacks[getCharacter(kCharacterCook).currentCall + 8] <= 3) {
-			getCharacterCurrentParams(kCharacterCook)[2] = getCharacterCurrentParams(kCharacterCook)[2] == 0;
+		} else if (getCharacter(kCharacterCook).callbacks[getCharacter(kCharacterCook).currentCall + 8] == 2 || getCharacter(kCharacterCook).callbacks[getCharacter(kCharacterCook).currentCall + 8] == 3) {
+			getCharacterCurrentParams(kCharacterCook)[2] = (getCharacterCurrentParams(kCharacterCook)[2] == 0) ? 1 : 0;
 		}
 
 		break;
@@ -481,7 +482,7 @@ void LogicManager::HAND_Cook_InKitchenBreakfast(HAND_PARAMS) {
 		break;
 	case 18:
 		if (getCharacter(kCharacterCook).callbacks[getCharacter(kCharacterCook).currentCall + 8] && getCharacter(kCharacterCook).callbacks[getCharacter(kCharacterCook).currentCall + 8] <= 2)
-			getCharacterCurrentParams(kCharacterCook)[1] = getCharacterCurrentParams(kCharacterCook)[1] == 0;
+			getCharacterCurrentParams(kCharacterCook)[1] = (getCharacterCurrentParams(kCharacterCook)[1] == 0) ? 1 : 0;
 
 		break;
 	default:
@@ -575,8 +576,8 @@ void LogicManager::HAND_Cook_InKitchenLunch(HAND_PARAMS) {
 	case 18:
 		if (getCharacter(kCharacterCook).callbacks[getCharacter(kCharacterCook).currentCall + 8] == 1) {
 			getCharacterCurrentParams(kCharacterCook)[0] = 0;
-		} else if (getCharacter(kCharacterCook).callbacks[getCharacter(kCharacterCook).currentCall + 8] >= 2 && getCharacter(kCharacterCook).callbacks[getCharacter(kCharacterCook).currentCall + 8] <= 3) {
-			getCharacterCurrentParams(kCharacterCook)[2] = getCharacterCurrentParams(kCharacterCook)[2] == 0;
+		} else if (getCharacter(kCharacterCook).callbacks[getCharacter(kCharacterCook).currentCall + 8] == 2 || getCharacter(kCharacterCook).callbacks[getCharacter(kCharacterCook).currentCall + 8] == 3) {
+			getCharacterCurrentParams(kCharacterCook)[2] = (getCharacterCurrentParams(kCharacterCook)[2] == 0) ? 1 : 0;
 		}
 
 		break;
@@ -657,7 +658,7 @@ void LogicManager::HAND_Cook_InKitchenDinner2(HAND_PARAMS) {
 		break;
 	case 18:
 		if (getCharacter(kCharacterCook).callbacks[getCharacter(kCharacterCook).currentCall + 8] && getCharacter(kCharacterCook).callbacks[getCharacter(kCharacterCook).currentCall + 8] <= 2)
-			getCharacterCurrentParams(kCharacterCook)[1] = getCharacterCurrentParams(kCharacterCook)[1] == 0;
+			getCharacterCurrentParams(kCharacterCook)[1] = (getCharacterCurrentParams(kCharacterCook)[1] == 0) ? 1 : 0;
 
 		break;
 	default:
diff --git a/engines/lastexpress/characters/francois.cpp b/engines/lastexpress/characters/francois.cpp
index 9093fa97e41..26b3d20b2b2 100644
--- a/engines/lastexpress/characters/francois.cpp
+++ b/engines/lastexpress/characters/francois.cpp
@@ -491,16 +491,22 @@ void LogicManager::HAND_Francois_EnterComp(HAND_PARAMS) {
 
 		break;
 	case 18:
-		if (getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] == 1) {
+		switch (getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8]) {
+		case 1:
 			setDoor(35, kCharacterCath, 2, 255, 255);
 			send(kCharacterFrancois, kCharacterMadame, 102484312, 0);
-		} else if (getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] == 2) {
+
+			// fall through
+		case 2:
 			getCharacter(kCharacterFrancois).characterPosition.location = 1;
 			endGraphics(kCharacterFrancois);
 
 			getCharacter(kCharacterFrancois).currentCall--;
 			_engine->getMessageManager()->setMessageHandle(kCharacterFrancois, _functionsFrancois[getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall]]);
 			fedEx(kCharacterFrancois, kCharacterFrancois, 18, 0);
+			break;
+		default:
+			break;
 		}
 
 		break;
@@ -1417,7 +1423,7 @@ void LogicManager::HAND_Francois_WithMama(HAND_PARAMS) {
 			break;
 		}
 
-		if (getCharacterCurrentParams(kCharacterFrancois)[4] != 2147483647 && _gameTime) {
+		if (getCharacterCurrentParams(kCharacterFrancois)[4] != 0x7FFFFFFF && _gameTime) {
 			if (_gameTime > 15803100) {
 				getCharacterCurrentParams(kCharacterFrancois)[4] = 0x7FFFFFFF;
 				getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 6;
@@ -1498,7 +1504,7 @@ void LogicManager::HAND_Francois_WithMama(HAND_PARAMS) {
 				break;
 			}
 
-			if (getCharacterCurrentParams(kCharacterFrancois)[4] != 2147483647 && _gameTime) {
+			if (getCharacterCurrentParams(kCharacterFrancois)[4] != 0x7FFFFFFF && _gameTime) {
 				if (_gameTime > 15803100) {
 					getCharacterCurrentParams(kCharacterFrancois)[4] = 0x7FFFFFFF;
 					getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 6;
@@ -1552,7 +1558,7 @@ void LogicManager::HAND_Francois_WithMama(HAND_PARAMS) {
 				break;
 			}
 
-			if (getCharacterCurrentParams(kCharacterFrancois)[4] != 2147483647 && _gameTime) {
+			if (getCharacterCurrentParams(kCharacterFrancois)[4] != 0x7FFFFFFF && _gameTime) {
 				if (_gameTime > 15803100) {
 					getCharacterCurrentParams(kCharacterFrancois)[4] = 0x7FFFFFFF;
 					getCharacter(kCharacterFrancois).callbacks[getCharacter(kCharacterFrancois).currentCall + 8] = 6;
diff --git a/engines/lastexpress/characters/headwait.cpp b/engines/lastexpress/characters/headwait.cpp
index d0d95386004..77cae708f43 100644
--- a/engines/lastexpress/characters/headwait.cpp
+++ b/engines/lastexpress/characters/headwait.cpp
@@ -1034,7 +1034,7 @@ void LogicManager::HAND_HeadWait_DoOtis5029A(HAND_PARAMS) {
 		break;
 	case 12:
 		playDialog(kCharacterHeadWait, "ABB3015", -1, 105);
-		startSeqOtis(kCharacterHeadWait, "029msg");
+		startSeqOtis(kCharacterHeadWait, "029A1");
 		startSeqOtis(kCharacterAbbot, "029A2");
 		break;
 	default:
diff --git a/engines/lastexpress/characters/salko.cpp b/engines/lastexpress/characters/salko.cpp
index 87f776385eb..55b54817d11 100644
--- a/engines/lastexpress/characters/salko.cpp
+++ b/engines/lastexpress/characters/salko.cpp
@@ -291,12 +291,12 @@ void LogicManager::HAND_Salko_DoWalkBehind(HAND_PARAMS) {
 		walk(kCharacterSalko, getCharacterCurrentParams(kCharacterSalko)[0], getCharacterCurrentParams(kCharacterSalko)[1]);
 		break;
 	case 123668192:
-		break;
-	default:
 		getCharacter(kCharacterSalko).currentCall--;
 		_engine->getMessageManager()->setMessageHandle(kCharacterSalko, _functionsSalko[getCharacter(kCharacterSalko).callbacks[getCharacter(kCharacterSalko).currentCall]]);
 		fedEx(kCharacterSalko, kCharacterSalko, 18, 0);
 		break;
+	default:
+		break;
 	}
 }
 
diff --git a/engines/lastexpress/characters/tablea.cpp b/engines/lastexpress/characters/tablea.cpp
index 0b61d0ec832..ebc98db0a9b 100644
--- a/engines/lastexpress/characters/tablea.cpp
+++ b/engines/lastexpress/characters/tablea.cpp
@@ -168,18 +168,18 @@ void LogicManager::HAND_TableA_Idling(HAND_PARAMS) {
 		getCharacter(kCharacterTableA).characterPosition.position = 3970;
 		getCharacter(kCharacterTableA).characterPosition.location = 1;
 		getCharacter(kCharacterTableA).characterPosition.car = kCarRestaurant;
-		_engine->getLogicManager()->startCycOtis(kCharacterTableA, "001P");
+		startCycOtis(kCharacterTableA, "001P");
 		break;
 	case 103798704:
 		if (msg->param.stringParam) {
-			_engine->getLogicManager()->startCycOtis(kCharacterTableA, msg->param.stringParam);
+			startCycOtis(kCharacterTableA, msg->param.stringParam);
 		} else {
-			_engine->getLogicManager()->startCycOtis(kCharacterTableA, "001P");
+			startCycOtis(kCharacterTableA, "001P");
 		}
 
 		break;
 	case 136455232:
-		_engine->getLogicManager()->startCycOtis(kCharacterTableA, "BLANK");
+		startCycOtis(kCharacterTableA, "BLANK");
 		break;
 	default:
 		break;
diff --git a/engines/lastexpress/characters/tableb.cpp b/engines/lastexpress/characters/tableb.cpp
index 7730916e88f..af2c99a9fe4 100644
--- a/engines/lastexpress/characters/tableb.cpp
+++ b/engines/lastexpress/characters/tableb.cpp
@@ -168,18 +168,18 @@ void LogicManager::HAND_TableB_Idling(HAND_PARAMS) {
 		getCharacter(kCharacterTableB).characterPosition.position = 3970;
 		getCharacter(kCharacterTableB).characterPosition.location = 1;
 		getCharacter(kCharacterTableB).characterPosition.car = kCarRestaurant;
-		_engine->getLogicManager()->startCycOtis(kCharacterTableB, "005J");
+		startCycOtis(kCharacterTableB, "005J");
 		break;
 	case 103798704:
 		if (msg->param.stringParam) {
-			_engine->getLogicManager()->startCycOtis(kCharacterTableB, msg->param.stringParam);
+			startCycOtis(kCharacterTableB, msg->param.stringParam);
 		} else {
-			_engine->getLogicManager()->startCycOtis(kCharacterTableB, "005J");
+			startCycOtis(kCharacterTableB, "005J");
 		}
 
 		break;
 	case 136455232:
-		_engine->getLogicManager()->startCycOtis(kCharacterTableB, "BLANK");
+		startCycOtis(kCharacterTableB, "BLANK");
 		break;
 	default:
 		break;
diff --git a/engines/lastexpress/characters/tablec.cpp b/engines/lastexpress/characters/tablec.cpp
index 3019da301ad..80c44873c4d 100644
--- a/engines/lastexpress/characters/tablec.cpp
+++ b/engines/lastexpress/characters/tablec.cpp
@@ -193,18 +193,18 @@ void LogicManager::HAND_TableC_Idling(HAND_PARAMS) {
 		getCharacter(kCharacterTableC).characterPosition.position = 4690;
 		getCharacter(kCharacterTableC).characterPosition.location = 1;
 		getCharacter(kCharacterTableC).characterPosition.car = kCarRestaurant;
-		_engine->getLogicManager()->startCycOtis(kCharacterTableC, "009G");
+		startCycOtis(kCharacterTableC, "009G");
 		break;
 	case 103798704:
 		if (msg->param.stringParam) {
-			_engine->getLogicManager()->startCycOtis(kCharacterTableC, msg->param.stringParam);
+			startCycOtis(kCharacterTableC, msg->param.stringParam);
 		} else {
-			_engine->getLogicManager()->startCycOtis(kCharacterTableC, "009G");
+			startCycOtis(kCharacterTableC, "009G");
 		}
 
 		break;
 	case 136455232:
-		_engine->getLogicManager()->startCycOtis(kCharacterTableC, "BLANK");
+		startCycOtis(kCharacterTableC, "BLANK");
 		break;
 	default:
 		break;
diff --git a/engines/lastexpress/characters/tabled.cpp b/engines/lastexpress/characters/tabled.cpp
index 991bef0c976..755fd84ba3b 100644
--- a/engines/lastexpress/characters/tabled.cpp
+++ b/engines/lastexpress/characters/tabled.cpp
@@ -168,18 +168,18 @@ void LogicManager::HAND_TableD_Idling(HAND_PARAMS) {
 		getCharacter(kCharacterTableD).characterPosition.position = 4690;
 		getCharacter(kCharacterTableD).characterPosition.location = 1;
 		getCharacter(kCharacterTableD).characterPosition.car = kCarRestaurant;
-		_engine->getLogicManager()->startCycOtis(kCharacterTableD, "010M");
+		startCycOtis(kCharacterTableD, "010M");
 		break;
 	case 103798704:
 		if (msg->param.stringParam) {
-			_engine->getLogicManager()->startCycOtis(kCharacterTableD, msg->param.stringParam);
+			startCycOtis(kCharacterTableD, msg->param.stringParam);
 		} else {
-			_engine->getLogicManager()->startCycOtis(kCharacterTableD, "010M");
+			startCycOtis(kCharacterTableD, "010M");
 		}
 
 		break;
 	case 136455232:
-		_engine->getLogicManager()->startCycOtis(kCharacterTableD, "BLANK");
+		startCycOtis(kCharacterTableD, "BLANK");
 		break;
 	default:
 		break;
diff --git a/engines/lastexpress/characters/tablee.cpp b/engines/lastexpress/characters/tablee.cpp
index fa7247f64d0..80ad6929cc3 100644
--- a/engines/lastexpress/characters/tablee.cpp
+++ b/engines/lastexpress/characters/tablee.cpp
@@ -168,18 +168,18 @@ void LogicManager::HAND_TableE_Idling(HAND_PARAMS) {
 		getCharacter(kCharacterTableE).characterPosition.position = 5420;
 		getCharacter(kCharacterTableE).characterPosition.location = 1;
 		getCharacter(kCharacterTableE).characterPosition.car = kCarRestaurant;
-		_engine->getLogicManager()->startCycOtis(kCharacterTableE, "014F");
+		startCycOtis(kCharacterTableE, "014F");
 		break;
 	case 103798704:
 		if (msg->param.stringParam) {
-			_engine->getLogicManager()->startCycOtis(kCharacterTableE, msg->param.stringParam);
+			startCycOtis(kCharacterTableE, msg->param.stringParam);
 		} else {
-			_engine->getLogicManager()->startCycOtis(kCharacterTableE, "014F");
+			startCycOtis(kCharacterTableE, "014F");
 		}
 
 		break;
 	case 136455232:
-		_engine->getLogicManager()->startCycOtis(kCharacterTableE, "BLANK");
+		startCycOtis(kCharacterTableE, "BLANK");
 		break;
 	default:
 		break;
diff --git a/engines/lastexpress/characters/tablef.cpp b/engines/lastexpress/characters/tablef.cpp
index e592fb7f409..9311e2a25b4 100644
--- a/engines/lastexpress/characters/tablef.cpp
+++ b/engines/lastexpress/characters/tablef.cpp
@@ -168,18 +168,18 @@ void LogicManager::HAND_TableF_Idling(HAND_PARAMS) {
 		getCharacter(kCharacterTableF).characterPosition.position = 5420;
 		getCharacter(kCharacterTableF).characterPosition.location = 1;
 		getCharacter(kCharacterTableF).characterPosition.car = kCarRestaurant;
-		_engine->getLogicManager()->startCycOtis(kCharacterTableF, "024D");
+		startCycOtis(kCharacterTableF, "024D");
 		break;
 	case 103798704:
 		if (msg->param.stringParam) {
-			_engine->getLogicManager()->startCycOtis(kCharacterTableF, msg->param.stringParam);
+			startCycOtis(kCharacterTableF, msg->param.stringParam);
 		} else {
-			_engine->getLogicManager()->startCycOtis(kCharacterTableF, "024D");
+			startCycOtis(kCharacterTableF, "024D");
 		}
 
 		break;
 	case 136455232:
-		_engine->getLogicManager()->startCycOtis(kCharacterTableF, "BLANK");
+		startCycOtis(kCharacterTableF, "BLANK");
 		break;
 	default:
 		break;
diff --git a/engines/lastexpress/characters/tatiana.cpp b/engines/lastexpress/characters/tatiana.cpp
index 9c69c10b0f0..6cf89b9e72d 100644
--- a/engines/lastexpress/characters/tatiana.cpp
+++ b/engines/lastexpress/characters/tatiana.cpp
@@ -2670,7 +2670,7 @@ void LogicManager::HAND_Tatiana_SeekCath(HAND_PARAMS) {
 	case 18:
 		switch (getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8]) {
 		case 1:
-			setDoor(33, 0, 0, 10, 9);
+			setDoor(33, kCharacterCath, 0, 10, 9);
 			getCharacter(kCharacterTatiana).characterPosition.location = 0;
 			getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 2;
 			TatianaCall(&LogicManager::CONS_Tatiana_DoWalk, 3, 7500, 0, 0);


Commit: 76075eda6c3d373ceb9f530543bf0038e22ce80b
    https://github.com/scummvm/scummvm/commit/76075eda6c3d373ceb9f530543bf0038e22ce80b
Author: AndywinXp (andywinxp at gmail.com)
Date: 2025-06-16T23:12:18+02:00

Commit Message:
LASTEXPRESS: Remove leftover warning message

Changed paths:
    engines/lastexpress/lastexpress.cpp


diff --git a/engines/lastexpress/lastexpress.cpp b/engines/lastexpress/lastexpress.cpp
index 67075388275..329476af72b 100644
--- a/engines/lastexpress/lastexpress.cpp
+++ b/engines/lastexpress/lastexpress.cpp
@@ -360,7 +360,6 @@ void LastExpressEngine::engineEventHandler(Event *event) {
 	case 1:
 		//++g_numClicks;
 		getNISManager()->abortNIS();
-		warning("abortFight() missing from engineEventHandler");
 		abortFight();
 		abortCredits();
 		if (shouldQuit()) {


Commit: 512b746e71d8b8bb251cc669bcadb6996996c874
    https://github.com/scummvm/scummvm/commit/512b746e71d8b8bb251cc669bcadb6996996c874
Author: AndywinXp (andywinxp at gmail.com)
Date: 2025-06-16T23:12:18+02:00

Commit Message:
LASTEXPRESS: Fix non-virtual dtor warning

Changed paths:
    engines/lastexpress/data/archive.h


diff --git a/engines/lastexpress/data/archive.h b/engines/lastexpress/data/archive.h
index 91c8902c962..4453c57456c 100644
--- a/engines/lastexpress/data/archive.h
+++ b/engines/lastexpress/data/archive.h
@@ -77,7 +77,7 @@ enum HPFFlags {
 class ArchiveManager {
 public:
 	ArchiveManager(LastExpressEngine *engine);
-	~ArchiveManager();
+	virtual ~ArchiveManager();
 
 	HPF *search(const char *name, HPF *archive, int archiveSize);
 	virtual bool lockCD(int32 index);


Commit: ec7d62296cb60c9e7a3d7c4036e19e044578f995
    https://github.com/scummvm/scummvm/commit/ec7d62296cb60c9e7a3d7c4036e19e044578f995
Author: AndywinXp (andywinxp at gmail.com)
Date: 2025-06-16T23:12:18+02:00

Commit Message:
LASTEXPRESS: Fix some trivial warnings

Changed paths:
    engines/lastexpress/data/archive.cpp
    engines/lastexpress/debug.cpp
    engines/lastexpress/fight/opponent_ivo.cpp
    engines/lastexpress/game/credits.cpp
    engines/lastexpress/game/savegame.cpp
    engines/lastexpress/lastexpress.cpp
    engines/lastexpress/menu/menu.h
    engines/lastexpress/sound/driver.cpp
    engines/lastexpress/sound/sound.cpp
    engines/lastexpress/sound/subtitle.cpp


diff --git a/engines/lastexpress/data/archive.cpp b/engines/lastexpress/data/archive.cpp
index f45f6831bb1..b33f5b16a4a 100644
--- a/engines/lastexpress/data/archive.cpp
+++ b/engines/lastexpress/data/archive.cpp
@@ -81,7 +81,7 @@ bool ArchiveManager::lockCD(int32 index) {
 }
 
 bool ArchiveManager::isCDAvailable(int cdNum, char *outPath, int pathSize) {
-	Common::sprintf_s(outPath, pathSize, "CD%ld.hpf", cdNum);
+	Common::sprintf_s(outPath, pathSize, "CD%d.hpf", cdNum);
 	return true;
 }
 
diff --git a/engines/lastexpress/debug.cpp b/engines/lastexpress/debug.cpp
index b8b10e996f0..1da22819802 100644
--- a/engines/lastexpress/debug.cpp
+++ b/engines/lastexpress/debug.cpp
@@ -253,7 +253,6 @@ void Clock::showCurrentTime() {
 
 	ImDrawList *drawList = ImGui::GetWindowDrawList();
 	ImVec2 windowPos = ImGui::GetWindowPos();
-	ImVec2 windowSize = ImGui::GetContentRegionAvail();
 	ImVec2 windowCenter = ImVec2(
 		windowPos.x + ImGui::GetWindowSize().x / 2,
 		windowPos.y + ImGui::GetWindowSize().y / 2
@@ -919,7 +918,6 @@ void LogicManager::showTrainMapWindow() {
 
 		// Label...
 		const char *voidLabel = "THE VOID (id: 0)";
-		ImVec2 textSize = ImGui::CalcTextSize(voidLabel);
 		drawList->AddText(
 			ImVec2(voidMin.x + 10, voidMin.y + 5),
 			IM_COL32(255, 255, 255, 255),
diff --git a/engines/lastexpress/fight/opponent_ivo.cpp b/engines/lastexpress/fight/opponent_ivo.cpp
index 90fd397cceb..a6080b4eb5d 100644
--- a/engines/lastexpress/fight/opponent_ivo.cpp
+++ b/engines/lastexpress/fight/opponent_ivo.cpp
@@ -95,7 +95,7 @@ void COpponent3::send(int action) {
 
 	switch (action) {
 	case 3:
-		if (_currentActionIdx != 3 && _currentActionIdx != 1 || (_currentSprite->flags & 4) != 0) {
+		if ((_currentActionIdx != 3 && _currentActionIdx != 1) || (_currentSprite->flags & 4) != 0) {
 			doAction(6, 1);
 			_opponent->doAction(6, 1);
 			_opponent->send(103);
@@ -103,7 +103,7 @@ void COpponent3::send(int action) {
 
 		break;
 	case 4:
-		if (_currentActionIdx != 3 && _currentActionIdx != 2 || (_currentSprite->flags & 4) != 0) {
+		if ((_currentActionIdx != 3 && _currentActionIdx != 2) || (_currentSprite->flags & 4) != 0) {
 			doAction(6, 1);
 			_opponent->doAction(5, 1);
 			_opponent->send(103);
diff --git a/engines/lastexpress/game/credits.cpp b/engines/lastexpress/game/credits.cpp
index 97fb1e23a55..eb32719433e 100644
--- a/engines/lastexpress/game/credits.cpp
+++ b/engines/lastexpress/game/credits.cpp
@@ -57,7 +57,7 @@ void LastExpressEngine::doCredits() {
 			char currentTgaFilename[24];
 			memset(currentTgaFilename, 0, sizeof(currentTgaFilename));
 
-			Common::sprintf_s(currentTgaFilename, "map%05ld.tga", i + 1);
+			Common::sprintf_s(currentTgaFilename, "map%05d.tga", i + 1);
 			readTGAIntoMemory(currentTgaFilename, &mapTgas[i]);
 
 			handleEvents();
diff --git a/engines/lastexpress/game/savegame.cpp b/engines/lastexpress/game/savegame.cpp
index 6f2404a4a81..0af60bc46c5 100644
--- a/engines/lastexpress/game/savegame.cpp
+++ b/engines/lastexpress/game/savegame.cpp
@@ -424,7 +424,7 @@ void SaveManager::validateSaveFile(bool flag) {
 	int fileSize = saveFile->tell();
 	saveFile->seek(0, SEEK_SET);
 
-	if (fileSize >= sizeof(SVCRFileHeader)) {
+	if (fileSize >= (int32)sizeof(SVCRFileHeader)) {
 		saveFile->read(&fileHeader, sizeof(SVCRFileHeader), 1, false, true);
 		if (checkFileHeader(&fileHeader)) {
 			if (flag) {
@@ -445,7 +445,7 @@ void SaveManager::validateSaveFile(bool flag) {
 				_engine->_savePointHeaders->partNumber = _engine->isDemo() ? 3 : 1;
 			}
 
-			for (int i = 0; fileSize >= sizeof(SVCRFileHeader) && i < fileHeader.numVCRGames; ++i) {
+			for (int i = 0; fileSize >= (int32)sizeof(SVCRFileHeader) && i < fileHeader.numVCRGames; ++i) {
 				_engine->getSoundManager()->soundThread();
 
 				saveFile->read(&savePointHeader, sizeof(SVCRSavePointHeader), 1, false, true);
@@ -487,7 +487,7 @@ void SaveManager::validateSaveFile(bool flag) {
 		fileSize = saveFile->tell();
 		saveFile->seek(0, SEEK_SET);
 
-		if (fileSize < sizeof(SVCRFileHeader)) {
+		if (fileSize < (int32)sizeof(SVCRFileHeader)) {
 			if (fileSize) {
 				error("Attempting to salvage corrupt save game file \"%s\"", _engine->_savegameFilename);
 			}
@@ -541,7 +541,7 @@ void SaveManager::validateSaveFile(bool flag) {
 		int numSavePoints = 0;
 
 		for (int j = 0; true; j++) {
-			if (fileSize < sizeof(SVCRFileHeader) || j >= fileHeader.numVCRGames) {
+			if (fileSize < (int32)sizeof(SVCRFileHeader) || j >= fileHeader.numVCRGames) {
 				saveFile->close();
 				fileHeader.numVCRGames = numSavePoints;
 				tempFile->open("temp.egg", CVCRMODE_RWB);
@@ -617,8 +617,8 @@ void SaveManager::validateSaveFile(bool flag) {
 bool SaveManager::checkFileHeader(SVCRFileHeader *fileHeader) {
 	if (fileHeader->magicNumber == 0x12001200 &&
 		fileHeader->numVCRGames >= 0 &&
-		fileHeader->nextWritePos >= sizeof(SVCRFileHeader) &&
-		fileHeader->realWritePos >= sizeof(SVCRFileHeader) &&
+		fileHeader->nextWritePos >= (int32)sizeof(SVCRFileHeader) &&
+		fileHeader->realWritePos >= (int32)sizeof(SVCRFileHeader) &&
 		fileHeader->lastIsTemporary < 2 &&
 		fileHeader->brightness <= 6 &&
 		fileHeader->volume < 8) {
@@ -636,7 +636,7 @@ bool SaveManager::checkFileHeader(SVCRFileHeader *fileHeader) {
 }
 
 bool SaveManager::checkSavePointHeader(SVCRSavePointHeader *savePointHeader) {
-	if (savePointHeader->magicNumber == 0xE660E660) {
+	if ((uint32)savePointHeader->magicNumber == 0xE660E660) {
 		if (savePointHeader->type > 0 && savePointHeader->type <= 5) {
 			if (savePointHeader->time >= 1061100 && savePointHeader->time <= 4941000) {
 				if (savePointHeader->size > 0 && (savePointHeader->size & 0xF) == 0 && savePointHeader->partNumber > 0)
diff --git a/engines/lastexpress/lastexpress.cpp b/engines/lastexpress/lastexpress.cpp
index 329476af72b..2340cebb1d2 100644
--- a/engines/lastexpress/lastexpress.cpp
+++ b/engines/lastexpress/lastexpress.cpp
@@ -369,7 +369,7 @@ void LastExpressEngine::engineEventHandler(Event *event) {
 			// AfxEndThread(0, 1);
 		}
 
-		if (getMenu()->isShowingMenu() || getMessageManager()->getEventHandle(1) == &LastExpressEngine::nodeStepMouseWrapper && !getVCR()->isVirgin(_currentGameFileColorId)) {
+		if (getMenu()->isShowingMenu() || (getMessageManager()->getEventHandle(1) == &LastExpressEngine::nodeStepMouseWrapper && !getVCR()->isVirgin(_currentGameFileColorId))) {
 			getMenu()->doEgg(1, 0, 0);
 			quitGame();
 		} else {
diff --git a/engines/lastexpress/menu/menu.h b/engines/lastexpress/menu/menu.h
index 7ba9b17dd89..eb23ffd4e08 100644
--- a/engines/lastexpress/menu/menu.h
+++ b/engines/lastexpress/menu/menu.h
@@ -88,7 +88,7 @@ protected:
 		nullptr
 	};
 
-	const char _eggButtonsSeqNames[8][13] = {
+	char _eggButtonsSeqNames[8][13] = {
 		"helpnewr.seq",
 		"buttns.seq",
 		"quit.seq",
diff --git a/engines/lastexpress/sound/driver.cpp b/engines/lastexpress/sound/driver.cpp
index 88883180580..2017a8281fc 100644
--- a/engines/lastexpress/sound/driver.cpp
+++ b/engines/lastexpress/sound/driver.cpp
@@ -39,9 +39,6 @@ void SoundManager::soundDriverInit() {
 void SoundManager::soundDriverCopyBuffersToDevice() {
 	_sound30HzCounter++;
 
-	if (_stream->numQueuedStreams() < 0 && _soundCacheCount > 0)
-		warning("Buffer underrun");
-
 	while (_stream->numQueuedStreams() < 4) {
 		byte *ptr = (byte *)malloc(1470 * sizeof(int16));
 		assert(ptr);
@@ -78,7 +75,7 @@ int SoundManager::soundDriverGetVolume() {
 		dsVolume = (2000 * log10((double)scummVMVolume / 255.0));
 	}
 
-	// Convert DirectSound format to app format (0-7)
+	// Convert DirectSound scale to game scale (0-7)
 	int engineVolume;
 	if (dsVolume <= -3000) {
 		engineVolume = 0;
diff --git a/engines/lastexpress/sound/sound.cpp b/engines/lastexpress/sound/sound.cpp
index b1bbbac455e..120b033f21d 100644
--- a/engines/lastexpress/sound/sound.cpp
+++ b/engines/lastexpress/sound/sound.cpp
@@ -374,7 +374,7 @@ void SoundManager::soundThread() {
 					ambientSlot2 = ambientSlot2->getNext();
 				} while (ambientSlot2);
 
-				if (!ambientSlot2 || _scanAnySoundLoopingSection || ambientSlot1 && ambientSlot1->getTime() > _loopingSoundDuration)
+				if (!ambientSlot2 || _scanAnySoundLoopingSection || (ambientSlot1 && ambientSlot1->getTime() > _loopingSoundDuration))
 					loopedPlaying = true;
 			}
 
diff --git a/engines/lastexpress/sound/subtitle.cpp b/engines/lastexpress/sound/subtitle.cpp
index 71cedfb4080..b61902f376b 100644
--- a/engines/lastexpress/sound/subtitle.cpp
+++ b/engines/lastexpress/sound/subtitle.cpp
@@ -354,7 +354,7 @@ void SubtitleManager::subThread() {
 			(slot->getStatusFlags() & kSoundFlagMute) != 0 ||
 			!slot->getTime() ||
 			((slot->getStatusFlags() & kSoundVolumeMask) < kVolume6) ||
-			(_engine->getNISManager()->getNISFlag() & kNisFlagSoundFade) != 0 && slot->getPriority() < 90) {
+			((_engine->getNISManager()->getNISFlag() & kNisFlagSoundFade) != 0 && slot->getPriority() < 90)) {
 
 			curPriority = 0;
 		} else {


Commit: cf38031f569c4e560ee967332688098a7f89582f
    https://github.com/scummvm/scummvm/commit/cf38031f569c4e560ee967332688098a7f89582f
Author: AndywinXp (andywinxp at gmail.com)
Date: 2025-06-16T23:12:18+02:00

Commit Message:
LASTEXPRESS: Fix some more trivial warnings

Changed paths:
    engines/lastexpress/characters/abbot.cpp
    engines/lastexpress/characters/cond1.cpp
    engines/lastexpress/characters/kahina.cpp
    engines/lastexpress/characters/milos.cpp
    engines/lastexpress/game/beetle.cpp
    engines/lastexpress/game/navigation.cpp


diff --git a/engines/lastexpress/characters/abbot.cpp b/engines/lastexpress/characters/abbot.cpp
index 5bc150dd99f..9008e85f96a 100644
--- a/engines/lastexpress/characters/abbot.cpp
+++ b/engines/lastexpress/characters/abbot.cpp
@@ -2380,6 +2380,7 @@ void LogicManager::HAND_Abbot_CatchCath(HAND_PARAMS) {
 		}
 
 		send(kCharacterAbbot, kCharacterAbbot, 157489665, 0);
+		break;
 	case 8:
 		if (!cathRunningDialog("LIB012"))
 			playDialog(0, "LIB012", -1, 0);
diff --git a/engines/lastexpress/characters/cond1.cpp b/engines/lastexpress/characters/cond1.cpp
index 30b0beed67d..1c22a696003 100644
--- a/engines/lastexpress/characters/cond1.cpp
+++ b/engines/lastexpress/characters/cond1.cpp
@@ -3987,9 +3987,9 @@ void LogicManager::HAND_Cond1_Sitting(HAND_PARAMS) {
 				Cond1Call(&LogicManager::CONS_Cond1_Listen, 9, 0, 0, 0);
 				break;
 			}
-
-			// fall through
 		}
+
+		// fall through
 		case 9:
 			if (_globals[kProgressField14] != 29) {
 				if (getCharacterParams(kCharacterCond1, 8)[13]) {
diff --git a/engines/lastexpress/characters/kahina.cpp b/engines/lastexpress/characters/kahina.cpp
index 60404cd7b40..98729771260 100644
--- a/engines/lastexpress/characters/kahina.cpp
+++ b/engines/lastexpress/characters/kahina.cpp
@@ -1023,6 +1023,7 @@ void LogicManager::HAND_Kahina_StartPart3(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
 		CONS_Kahina_BeforeConcert(0, 0, 0, 0);
+		break;
 	case 12:
 		endGraphics(kCharacterKahina);
 		getCharacter(kCharacterKahina).characterPosition.car = kCarKronos;
diff --git a/engines/lastexpress/characters/milos.cpp b/engines/lastexpress/characters/milos.cpp
index 69f2775b6de..07fb190c88d 100644
--- a/engines/lastexpress/characters/milos.cpp
+++ b/engines/lastexpress/characters/milos.cpp
@@ -2168,6 +2168,7 @@ void LogicManager::HAND_Milos_StartPart5(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
 		CONS_Milos_RunningTrain(0, 0, 0, 0);
+		break;
 	case 12:
 		endGraphics(kCharacterMilos);
 		getCharacter(kCharacterMilos).characterPosition.location = 1;
diff --git a/engines/lastexpress/game/beetle.cpp b/engines/lastexpress/game/beetle.cpp
index cd9f142233f..9ff0a52ddf4 100644
--- a/engines/lastexpress/game/beetle.cpp
+++ b/engines/lastexpress/game/beetle.cpp
@@ -142,7 +142,6 @@ void CBeetle::tick() {
 		_currentFrame += 10;
 	}
 
-	bool sequenceEnded = false;
 	bool terminate = false;
 
 	if (_currentSequence->numFrames <= _currentFrame) {
@@ -158,8 +157,6 @@ void CBeetle::tick() {
 			_currentSequence = nullptr;
 			terminate = true;
 		}
-
-		sequenceEnded = true;
 	}
 
 	if (terminate) {
diff --git a/engines/lastexpress/game/navigation.cpp b/engines/lastexpress/game/navigation.cpp
index ea26cbe6ba9..db47d0b09c2 100644
--- a/engines/lastexpress/game/navigation.cpp
+++ b/engines/lastexpress/game/navigation.cpp
@@ -725,7 +725,6 @@ void LogicManager::checkInventory(int32 flags) {
 		if (_inventoryFlag2) {
 			if ((flags & 1) != 0) {
 				if (_highlightedItem) {
-					bool found = false;
 					int count = 0;
 
 					for (int i = 1; i < 32; i++) {
@@ -733,7 +732,6 @@ void LogicManager::checkInventory(int32 flags) {
 							count++;
 							if (count == _highlightedItem) {
 								selectedItemIdx = i;
-								found = 1;
 								break;
 							}
 						}
@@ -839,7 +837,6 @@ void LogicManager::checkInventory(int32 flags) {
 		if ((flags & 1) != 0) {
 			int itemToHighlight = _engine->_cursorY / 40;
 			if (_highlightedItem && itemToHighlight != _highlightedItem) {
-				bool found = false;
 				int count = 0;
 
 				for (int i = 1; i < 32; i++) {
@@ -847,7 +844,6 @@ void LogicManager::checkInventory(int32 flags) {
 						count++;
 						if (count == _highlightedItem) {
 							selectedItemIdx = i;
-							found = 1;
 							break;
 						}
 					}
@@ -861,7 +857,6 @@ void LogicManager::checkInventory(int32 flags) {
 			}
 
 			if (itemToHighlight && itemToHighlight <= _inventoryVerticalSlot && itemToHighlight != _highlightedItem) {
-				bool found = false;
 				int count = 0;
 
 				for (int i = 1; i < 32; i++) {
@@ -869,7 +864,6 @@ void LogicManager::checkInventory(int32 flags) {
 						count++;
 						if (count == itemToHighlight) {
 							selectedItemIdx = i;
-							found = 1;
 							break;
 						}
 					}
@@ -886,7 +880,6 @@ void LogicManager::checkInventory(int32 flags) {
 		}
 
 		if (_highlightedItem) {
-			bool found = false;
 			int count = 0;
 
 			for (int i = 1; i < 32; i++) {
@@ -894,7 +887,6 @@ void LogicManager::checkInventory(int32 flags) {
 					count++;
 					if (count == _highlightedItem) {
 						selectedItemIdx = i;
-						found = 1;
 						break;
 					}
 				}
@@ -1059,7 +1051,6 @@ void LogicManager::checkInventory(int32 flags) {
 	}
 
 	if (_highlightedItem) {
-		bool found = false;
 		int count = 0;
 
 		for (int i = 1; i < 32; i++) {
@@ -1067,7 +1058,6 @@ void LogicManager::checkInventory(int32 flags) {
 				count++;
 				if (count == _highlightedItem) {
 					selectedItemIdx = i;
-					found = true;
 					break;
 				}
 			}


Commit: 208a61abedf3109a0fc0d8b38ab7fa8f0847b693
    https://github.com/scummvm/scummvm/commit/208a61abedf3109a0fc0d8b38ab7fa8f0847b693
Author: AndywinXp (andywinxp at gmail.com)
Date: 2025-06-16T23:12:18+02:00

Commit Message:
LASTEXPRESS: Fix Alexei parentheses warnings

Changed paths:
    engines/lastexpress/characters/alexei.cpp


diff --git a/engines/lastexpress/characters/alexei.cpp b/engines/lastexpress/characters/alexei.cpp
index f613d7229bf..37a62776b56 100644
--- a/engines/lastexpress/characters/alexei.cpp
+++ b/engines/lastexpress/characters/alexei.cpp
@@ -380,7 +380,7 @@ void LogicManager::HAND_Alexei_DoWalk(HAND_PARAMS) {
 			break;
 		}
 
-		if (_doneNIS[kEventAlexeiSalonVassili] || _doneNIS[kEventTatianaAskMatchSpeakRussian] && cathHasItem(kItemPassengerList)) {
+		if (_doneNIS[kEventAlexeiSalonVassili] || (_doneNIS[kEventTatianaAskMatchSpeakRussian] && cathHasItem(kItemPassengerList))) {
 			if (rnd(2) == 0) {
 				playDialog(kCharacterCath, "CAT1012A", -1, 0);
 			} else {
@@ -550,7 +550,7 @@ void LogicManager::CONS_Alexei_PacingAtWindow(CONS_PARAMS) {
 void LogicManager::HAND_Alexei_PacingAtWindow(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
-		if (!getCharacterCurrentParams(kCharacterAlexei)[1] && (getCharacterCurrentParams(kCharacterAlexei)[1] = _gameTime + getCharacterCurrentParams(kCharacterAlexei)[0], _gameTime + getCharacterCurrentParams(kCharacterAlexei)[0] == 0) ||
+		if ((!getCharacterCurrentParams(kCharacterAlexei)[1] && (getCharacterCurrentParams(kCharacterAlexei)[1] = _gameTime + getCharacterCurrentParams(kCharacterAlexei)[0], _gameTime + getCharacterCurrentParams(kCharacterAlexei)[0] == 0)) ||
 			getCharacterCurrentParams(kCharacterAlexei)[1] < _gameTime) {
 			if (rcClear()) {
 				getCharacter(kCharacterAlexei).characterPosition.location = 0;
@@ -1007,7 +1007,7 @@ void LogicManager::CONS_Alexei_Sitting(CONS_PARAMS) {
 void LogicManager::HAND_Alexei_Sitting(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
-		if (!getCharacterCurrentParams(kCharacterAlexei)[1] && (getCharacterCurrentParams(kCharacterAlexei)[1] = _gameTime + getCharacterCurrentParams(kCharacterAlexei)[0], _gameTime + getCharacterCurrentParams(kCharacterAlexei)[0] == 0) || getCharacterCurrentParams(kCharacterAlexei)[1] < _gameTime) {
+		if ((!getCharacterCurrentParams(kCharacterAlexei)[1] && (getCharacterCurrentParams(kCharacterAlexei)[1] = _gameTime + getCharacterCurrentParams(kCharacterAlexei)[0], _gameTime + getCharacterCurrentParams(kCharacterAlexei)[0] == 0)) || getCharacterCurrentParams(kCharacterAlexei)[1] < _gameTime) {
 			if (rcClear()) {
 				getCharacter(kCharacterAlexei).characterPosition.location = 0;
 				getCharacter(kCharacterAlexei).inventoryItem = 0;
@@ -1073,7 +1073,7 @@ void LogicManager::CONS_Alexei_StandingAtWindow(CONS_PARAMS) {
 void LogicManager::HAND_Alexei_StandingAtWindow(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
-		if (!getCharacterCurrentParams(kCharacterAlexei)[1] && (getCharacterCurrentParams(kCharacterAlexei)[1] = _gameTime + getCharacterCurrentParams(kCharacterAlexei)[0], _gameTime + getCharacterCurrentParams(kCharacterAlexei)[0] == 0) ||
+		if ((!getCharacterCurrentParams(kCharacterAlexei)[1] && (getCharacterCurrentParams(kCharacterAlexei)[1] = _gameTime + getCharacterCurrentParams(kCharacterAlexei)[0], _gameTime + getCharacterCurrentParams(kCharacterAlexei)[0] == 0)) ||
 			getCharacterCurrentParams(kCharacterAlexei)[1] < _gameTime) {
 			if (rcClear()) {
 				getCharacter(kCharacterAlexei).characterPosition.location = 0;
@@ -1092,7 +1092,7 @@ void LogicManager::HAND_Alexei_StandingAtWindow(HAND_PARAMS) {
 				break;
 			}
 
-			if ((inSalon(kCharacterCath) || inDiningRoom(kCharacterCath)) && getCharacterCurrentParams(kCharacterAlexei)[2] || (getCharacterCurrentParams(kCharacterAlexei)[2] = _gameTime, _gameTime)) {
+			if (((inSalon(kCharacterCath) || inDiningRoom(kCharacterCath)) && getCharacterCurrentParams(kCharacterAlexei)[2]) || (getCharacterCurrentParams(kCharacterAlexei)[2] = _gameTime, _gameTime)) {
 				if (getCharacterCurrentParams(kCharacterAlexei)[2] >= _gameTime)
 					break;
 
@@ -1702,7 +1702,7 @@ void LogicManager::HAND_Alexei_Pacing3(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
 		if (inSalon(kCharacterCath)) {
-			if (!getCharacterCurrentParams(kCharacterAlexei)[1] && (getCharacterCurrentParams(kCharacterAlexei)[1] = _gameTime + 2700, _gameTime == -2700) || getCharacterCurrentParams(kCharacterAlexei)[1] < _gameTime) {
+			if ((!getCharacterCurrentParams(kCharacterAlexei)[1] && (getCharacterCurrentParams(kCharacterAlexei)[1] = _gameTime + 2700, _gameTime == -2700)) || getCharacterCurrentParams(kCharacterAlexei)[1] < _gameTime) {
 				getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 1;
 				AlexeiCall(&LogicManager::CONS_Alexei_WaitRCClear, 0, 0, 0, 0);
 				break;
@@ -1710,7 +1710,7 @@ void LogicManager::HAND_Alexei_Pacing3(HAND_PARAMS) {
 		} else {
 			getCharacterCurrentParams(kCharacterAlexei)[1] = 0;
 		}
-		if (!getCharacterCurrentParams(kCharacterAlexei)[2] && (getCharacterCurrentParams(kCharacterAlexei)[2] = _gameTime + getCharacterCurrentParams(kCharacterAlexei)[0], _gameTime + getCharacterCurrentParams(kCharacterAlexei)[0] == 0) || getCharacterCurrentParams(kCharacterAlexei)[2] < _gameTime) {
+		if ((!getCharacterCurrentParams(kCharacterAlexei)[2] && (getCharacterCurrentParams(kCharacterAlexei)[2] = _gameTime + getCharacterCurrentParams(kCharacterAlexei)[0], _gameTime + getCharacterCurrentParams(kCharacterAlexei)[0] == 0)) || getCharacterCurrentParams(kCharacterAlexei)[2] < _gameTime) {
 			if (rcClear()) {
 				getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 3;
 				AlexeiCall(&LogicManager::CONS_Alexei_PacingAtWindow, 0, 0, 0, 0);
@@ -2151,7 +2151,7 @@ void LogicManager::HAND_Alexei_Pacing(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
 		if (_gameTime < 1806300) {
-			if (!getCharacterCurrentParams(kCharacterAlexei)[1] && (getCharacterCurrentParams(kCharacterAlexei)[1] = _gameTime + getCharacterCurrentParams(kCharacterAlexei)[0], _gameTime + getCharacterCurrentParams(kCharacterAlexei)[0] == 0) || getCharacterCurrentParams(kCharacterAlexei)[1] < _gameTime) {
+			if ((!getCharacterCurrentParams(kCharacterAlexei)[1] && (getCharacterCurrentParams(kCharacterAlexei)[1] = _gameTime + getCharacterCurrentParams(kCharacterAlexei)[0], _gameTime + getCharacterCurrentParams(kCharacterAlexei)[0] == 0)) || getCharacterCurrentParams(kCharacterAlexei)[1] < _gameTime) {
 				if (rcClear()) {
 					getCharacter(kCharacterAlexei).callbacks[getCharacter(kCharacterAlexei).currentCall + 8] = 1;
 					AlexeiCall(&LogicManager::CONS_Alexei_PacingAtWindow, 0, 0, 0, 0);


Commit: d42de93a679dbe4b4684056035cc6cfb56cfec31
    https://github.com/scummvm/scummvm/commit/d42de93a679dbe4b4684056035cc6cfb56cfec31
Author: AndywinXp (andywinxp at gmail.com)
Date: 2025-06-16T23:12:18+02:00

Commit Message:
LASTEXPRESS: Fix Anna parentheses warnings

Changed paths:
    engines/lastexpress/characters/anna.cpp


diff --git a/engines/lastexpress/characters/anna.cpp b/engines/lastexpress/characters/anna.cpp
index 6394ba4dbcc..9b1a210a75e 100644
--- a/engines/lastexpress/characters/anna.cpp
+++ b/engines/lastexpress/characters/anna.cpp
@@ -3605,7 +3605,7 @@ void LogicManager::HAND_Anna_AfterConcert(HAND_PARAMS) {
 				break;
 			}
 
-			if (!getCharacterCurrentParams(kCharacterAnna)[2] || !cathInCorridor(kCarRedSleeping) && !inSalon(kCharacterCath) && !inDiningRoom(kCharacterCath) || !getCharacterCurrentParams(kCharacterAnna)[3]) {
+			if (!getCharacterCurrentParams(kCharacterAnna)[2] || (!cathInCorridor(kCarRedSleeping) && !inSalon(kCharacterCath) && !inDiningRoom(kCharacterCath)) || !getCharacterCurrentParams(kCharacterAnna)[3]) {
 				getCharacterCurrentParams(kCharacterAnna)[3] = _gameTime;
 				if (!getCharacterCurrentParams(kCharacterAnna)[3]) {
 					CONS_Anna_GoBagg(0, 0, 0, 0);
@@ -4483,7 +4483,7 @@ void LogicManager::HAND_Anna_LetDownHair(HAND_PARAMS) {
 		if (getCharacterCurrentParams(kCharacterAnna)[2] != 0x7FFFFFFF && getCharacterCurrentParams(kCharacterAnna)[0] < _gameTime) {
 			if (getCharacterCurrentParams(kCharacterAnna)[1] < _gameTime) {
 				getCharacterCurrentParams(kCharacterAnna)[2] = 0x7FFFFFFF;
-			} else if ((cathInCorridor(kCarGreenSleeping) || cathInCorridor(kCarRedSleeping)) && getCharacterCurrentParams(kCharacterAnna)[2] || (getCharacterCurrentParams(kCharacterAnna)[2] = _gameTime, _gameTime != 0)) {
+			} else if (((cathInCorridor(kCarGreenSleeping) || cathInCorridor(kCarRedSleeping)) && getCharacterCurrentParams(kCharacterAnna)[2]) || (getCharacterCurrentParams(kCharacterAnna)[2] = _gameTime, _gameTime != 0)) {
 				if (getCharacterCurrentParams(kCharacterAnna)[2] >= _gameTime)
 					break;
 	


Commit: dc3d3a7a802bc8ee51794042f5bc84976e4e4de9
    https://github.com/scummvm/scummvm/commit/dc3d3a7a802bc8ee51794042f5bc84976e4e4de9
Author: AndywinXp (andywinxp at gmail.com)
Date: 2025-06-16T23:12:18+02:00

Commit Message:
LASTEXPRESS: Fix August parentheses warnings

Changed paths:
    engines/lastexpress/characters/august.cpp


diff --git a/engines/lastexpress/characters/august.cpp b/engines/lastexpress/characters/august.cpp
index cd689f377db..a6058aeb6c8 100644
--- a/engines/lastexpress/characters/august.cpp
+++ b/engines/lastexpress/characters/august.cpp
@@ -1294,8 +1294,8 @@ void LogicManager::HAND_August_KnockTyler(HAND_PARAMS) {
 		}
 
 		if (!getCharacterCurrentParams(kCharacterAugust)[1]) {
-			if (!getCharacterCurrentParams(kCharacterAugust)[10] &&
-				(getCharacterCurrentParams(kCharacterAugust)[10] = _realTime + 75, _realTime == -75) ||
+			if ((!getCharacterCurrentParams(kCharacterAugust)[10] &&
+				(getCharacterCurrentParams(kCharacterAugust)[10] = _realTime + 75, _realTime == -75)) ||
 				getCharacterCurrentParams(kCharacterAugust)[10] < _realTime) {
 				if (!getCharacterCurrentParams(kCharacterAugust)[4]) {
 					getCharacter(kCharacterAugust).callbacks[getCharacter(kCharacterAugust).currentCall + 8] = 8;
@@ -1354,7 +1354,7 @@ void LogicManager::HAND_August_KnockTyler(HAND_PARAMS) {
 			break;
 		}
 
-		if (!getCharacterCurrentParams(kCharacterAugust)[8] && (getCharacterCurrentParams(kCharacterAugust)[8] = _realTime + 45, _realTime == -45) || getCharacterCurrentParams(kCharacterAugust)[8] < _realTime) {
+		if ((!getCharacterCurrentParams(kCharacterAugust)[8] && (getCharacterCurrentParams(kCharacterAugust)[8] = _realTime + 45, _realTime == -45)) || getCharacterCurrentParams(kCharacterAugust)[8] < _realTime) {
 			if (checkDoor(1) == 1) {
 				if (getCharacterCurrentParams(kCharacterAugust)[9] || (getCharacterCurrentParams(kCharacterAugust)[9] = _realTime + 75, _realTime != -75)) {
 					if (getCharacterCurrentParams(kCharacterAugust)[9] >= _realTime)
@@ -4108,7 +4108,7 @@ void LogicManager::CONS_August_Drunk(CONS_PARAMS) {
 void LogicManager::HAND_August_Drunk(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
-		if (!getCharacterCurrentParams(kCharacterAugust)[0] && (getCharacterCurrentParams(kCharacterAugust)[0] = _gameTime + 1800, _gameTime == -1800) || getCharacterCurrentParams(kCharacterAugust)[0] < _gameTime) {
+		if ((!getCharacterCurrentParams(kCharacterAugust)[0] && (getCharacterCurrentParams(kCharacterAugust)[0] = _gameTime + 1800, _gameTime == -1800)) || getCharacterCurrentParams(kCharacterAugust)[0] < _gameTime) {
 			if (_gameTime > 2430000) {
 				if (rcClear()) {
 					getCharacter(kCharacterAugust).characterPosition.location = 0;


Commit: 376bac3a151b8741f770c2ca4d65f2defa2a14fa
    https://github.com/scummvm/scummvm/commit/376bac3a151b8741f770c2ca4d65f2defa2a14fa
Author: AndywinXp (andywinxp at gmail.com)
Date: 2025-06-16T23:12:18+02:00

Commit Message:
LASTEXPRESS: Fix Clerk parentheses warnings

Changed paths:
    engines/lastexpress/characters/clerk.cpp


diff --git a/engines/lastexpress/characters/clerk.cpp b/engines/lastexpress/characters/clerk.cpp
index 936b25abcc9..b1865ea6d3f 100644
--- a/engines/lastexpress/characters/clerk.cpp
+++ b/engines/lastexpress/characters/clerk.cpp
@@ -512,8 +512,8 @@ void LogicManager::HAND_Clerk_Processing(HAND_PARAMS) {
 				endDialog("ZFX1001");
 		}
 
-		if ((getCharacterCurrentParams(kCharacterClerk)[2] && (getCharacter(kCharacterCath).characterPosition.car != getCharacterCurrentParams(kCharacterClerk)[0]) ||
-			 (isNight() != (getCharacterCurrentParams(kCharacterClerk)[1] != 0 ? true : false)))) {
+		if ((getCharacterCurrentParams(kCharacterClerk)[2] && (getCharacter(kCharacterCath).characterPosition.car != getCharacterCurrentParams(kCharacterClerk)[0])) ||
+			 (isNight() != (getCharacterCurrentParams(kCharacterClerk)[1] != 0 ? true : false))) {
 
 			switch (getCharacter(kCharacterCath).characterPosition.car) {
 			case 1:


Commit: 74d546a7e1ae5c46f72e16a2ed5355fe9895e78f
    https://github.com/scummvm/scummvm/commit/74d546a7e1ae5c46f72e16a2ed5355fe9895e78f
Author: AndywinXp (andywinxp at gmail.com)
Date: 2025-06-16T23:12:18+02:00

Commit Message:
LASTEXPRESS: Fix Cond1 parentheses warnings

Changed paths:
    engines/lastexpress/characters/cond1.cpp


diff --git a/engines/lastexpress/characters/cond1.cpp b/engines/lastexpress/characters/cond1.cpp
index 1c22a696003..79004412700 100644
--- a/engines/lastexpress/characters/cond1.cpp
+++ b/engines/lastexpress/characters/cond1.cpp
@@ -548,7 +548,7 @@ void LogicManager::HAND_Cond1_DoWalk(HAND_PARAMS) {
 		playChrExcuseMe(kCharacterCond1, kCharacterCath, 0);
 		break;
 	case 12:
-		if (!_globals[kProgressEventFoundCorpse] && !_doneNIS[kEventMertensAskTylerCompartment] && !_doneNIS[kEventMertensAskTylerCompartmentD] || getCharacterParams(kCharacterCond1, 8)[3] && _globals[kProgressJacket] == 2 && !_doneNIS[kEventMertensDontMakeBed] && !_globals[kProgressEventCorpseThrown]) {
+		if ((!_globals[kProgressEventFoundCorpse] && !_doneNIS[kEventMertensAskTylerCompartment] && !_doneNIS[kEventMertensAskTylerCompartmentD]) || (getCharacterParams(kCharacterCond1, 8)[3] && _globals[kProgressJacket] == 2 && !_doneNIS[kEventMertensDontMakeBed] && !_globals[kProgressEventCorpseThrown])) {
 			getCharacterCurrentParams(kCharacterCond1)[2] = 1;
 		}
 
@@ -871,7 +871,7 @@ void LogicManager::HAND_Cond1_Passing(HAND_PARAMS) {
 			break;
 		}
 
-		if (_globals[kProgressChapter] == 3 && !getCharacterCurrentParams(kCharacterCond1)[0] && _gameTime < 2173500 && (_gameTime > 2106000 || getCharacterCurrentParams(kCharacterCond1)[1] && _gameTime > 2079000)) {
+		if (_globals[kProgressChapter] == 3 && !getCharacterCurrentParams(kCharacterCond1)[0] && _gameTime < 2173500 && (_gameTime > 2106000 || (getCharacterCurrentParams(kCharacterCond1)[1] && _gameTime > 2079000))) {
 			if (getCharacterCurrentParams(kCharacterCond1)[1] == 2) {
 				playDialog(kCharacterCond1, "CON3052", -1, 0);
 				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 3;
@@ -3723,8 +3723,8 @@ void LogicManager::HAND_Cond1_Sitting(HAND_PARAMS) {
 					break;
 				}
 
-				if (!cathInCorridor(kCarGreenSleeping) &&
-						!cathInCorridor(kCarRedSleeping) ||
+				if ((!cathInCorridor(kCarGreenSleeping) &&
+						!cathInCorridor(kCarRedSleeping)) ||
 					dialogRunning("REB1205") ||
 					!inComp(kCharacterMadame, kCarRedSleeping, 5790) ||
 					!getCharacterCurrentParams(kCharacterCond1)[3]) {
@@ -3882,7 +3882,7 @@ void LogicManager::HAND_Cond1_Sitting(HAND_PARAMS) {
 				getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 1;
 				Cond1Call(&LogicManager::CONS_Cond1_SaveGame, 2, kEventMertensKronosInvitation, 0, 0);
 			} else if (!checkCathDir(kCarGreenSleeping, 23) || _globals[kProgressEventMertensChronosInvitation] || _doneNIS[kEventMertensLastCar] || _doneNIS[kEventMertensLastCarOriginalJacket]) {
-				if (!checkCathDir(kCarGreenSleeping, 1) && !checkCathDir(kCarGreenSleeping, 23) || getCharacterParams(kCharacterCond1, 8)[0] || getCharacterParams(kCharacterCond1, 8)[16]) {
+				if ((!checkCathDir(kCarGreenSleeping, 1) && !checkCathDir(kCarGreenSleeping, 23)) || getCharacterParams(kCharacterCond1, 8)[0] || getCharacterParams(kCharacterCond1, 8)[16]) {
 					if (cathInCorridor(kCarGreenSleeping) && getCharacter(kCharacterCond1).characterPosition.position < getCharacter(kCharacterCath).characterPosition.position && (_globals[1] == 1 || getCharacterParams(kCharacterCond1, 8)[6])) {
 						getCharacter(kCharacterCond1).inventoryItem = kItemNone;
 						getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 7;
@@ -3922,7 +3922,7 @@ void LogicManager::HAND_Cond1_Sitting(HAND_PARAMS) {
 		case 2:
 		case 4:
 			startCycOtis(kCharacterCond1, "601B");
-			if (!checkCathDir(kCarGreenSleeping, 1) && !checkCathDir(kCarGreenSleeping, 23) || getCharacterParams(kCharacterCond1, 8)[0] || getCharacterParams(kCharacterCond1, 8)[16]) {
+			if ((!checkCathDir(kCarGreenSleeping, 1) && !checkCathDir(kCarGreenSleeping, 23)) || getCharacterParams(kCharacterCond1, 8)[0] || getCharacterParams(kCharacterCond1, 8)[16]) {
 				if (cathInCorridor(kCarGreenSleeping) && getCharacter(kCharacterCond1).characterPosition.position < getCharacter(kCharacterCath).characterPosition.position && (_globals[1] == 1 || getCharacterParams(kCharacterCond1, 8)[6])) {
 					getCharacter(kCharacterCond1).inventoryItem = kItemNone;
 					getCharacter(kCharacterCond1).callbacks[getCharacter(kCharacterCond1).currentCall + 8] = 7;


Commit: bf9fc68b5c4ff53925917cdb814bd3a1e83f7f98
    https://github.com/scummvm/scummvm/commit/bf9fc68b5c4ff53925917cdb814bd3a1e83f7f98
Author: AndywinXp (andywinxp at gmail.com)
Date: 2025-06-16T23:12:18+02:00

Commit Message:
LASTEXPRESS: Fix Cond2 parentheses warnings

Changed paths:
    engines/lastexpress/characters/cond2.cpp


diff --git a/engines/lastexpress/characters/cond2.cpp b/engines/lastexpress/characters/cond2.cpp
index 125e6b5ea59..a6bb5db9fbe 100644
--- a/engines/lastexpress/characters/cond2.cpp
+++ b/engines/lastexpress/characters/cond2.cpp
@@ -2111,8 +2111,8 @@ void LogicManager::HAND_Cond2_CathBuzzing(HAND_PARAMS) {
 			break;
 		case 2:
 			if (inSuite(kCharacterCath, kCarRedSleeping, getCharacterCurrentParams(kCharacterCond2)[2]) ||
-				(getCharacterCurrentParams(kCharacterCond2)[0] == 36 || getCharacterCurrentParams(kCharacterCond2)[0] == 37) &&
-				cathOutRebeccaWindow()) {
+				((getCharacterCurrentParams(kCharacterCond2)[0] == 36 || getCharacterCurrentParams(kCharacterCond2)[0] == 37) &&
+				cathOutRebeccaWindow())) {
 				setDoor(getCharacterCurrentParams(kCharacterCond2)[0], 0, checkDoor(getCharacterCurrentParams(kCharacterCond2)[0]), 0, 0);
 				getCharacterCurrentParams(kCharacterCond2)[4] = 1;
 			}


Commit: 27d7be2ff193ac3319ba90b3d00d17b290b28566
    https://github.com/scummvm/scummvm/commit/27d7be2ff193ac3319ba90b3d00d17b290b28566
Author: AndywinXp (andywinxp at gmail.com)
Date: 2025-06-16T23:12:18+02:00

Commit Message:
LASTEXPRESS: Fix Kahina parentheses warnings

Changed paths:
    engines/lastexpress/characters/kahina.cpp


diff --git a/engines/lastexpress/characters/kahina.cpp b/engines/lastexpress/characters/kahina.cpp
index 98729771260..167c118047f 100644
--- a/engines/lastexpress/characters/kahina.cpp
+++ b/engines/lastexpress/characters/kahina.cpp
@@ -1601,7 +1601,7 @@ void LogicManager::HAND_Kahina_Finished(HAND_PARAMS) {
 		getCharacter(kCharacterKahina).characterPosition.location = 0;
 		break;
 	case 17:
-		if (getCharacter(kCharacterCath).characterPosition.car > kCarGreenSleeping || getCharacter(kCharacterCath).characterPosition.car == kCarGreenSleeping && getCharacter(kCharacterCath).characterPosition.position > 2740) {
+		if (getCharacter(kCharacterCath).characterPosition.car > kCarGreenSleeping || (getCharacter(kCharacterCath).characterPosition.car == kCarGreenSleeping && getCharacter(kCharacterCath).characterPosition.position > 2740)) {
 			getCharacterCurrentParams(kCharacterKahina)[0] = 1;
 		}
 


Commit: 87ca7f357f69dd81b19c39d90a928aa4661dfdb4
    https://github.com/scummvm/scummvm/commit/87ca7f357f69dd81b19c39d90a928aa4661dfdb4
Author: AndywinXp (andywinxp at gmail.com)
Date: 2025-06-16T23:12:18+02:00

Commit Message:
LASTEXPRESS: Fix Mahmud parentheses warnings

Changed paths:
    engines/lastexpress/characters/mahmud.cpp


diff --git a/engines/lastexpress/characters/mahmud.cpp b/engines/lastexpress/characters/mahmud.cpp
index 853db86124f..057cead31fe 100644
--- a/engines/lastexpress/characters/mahmud.cpp
+++ b/engines/lastexpress/characters/mahmud.cpp
@@ -407,7 +407,7 @@ void LogicManager::HAND_Mahmud_CathKnockingHarem(HAND_PARAMS) {
 		if (!whoRunningDialog(kCharacterMahmud)) {
 			if (getCharacter(kCharacterCath).characterPosition.position < 1500 ||
 				getCharacter(kCharacterCath).characterPosition.position >= 5790 ||
-				getCharacter(kCharacterCath).characterPosition.position > 4455 && getCharacterCurrentParams(kCharacterMahmud)[4] != 5) {
+				(getCharacter(kCharacterCath).characterPosition.position > 4455 && getCharacterCurrentParams(kCharacterMahmud)[4] != 5)) {
 				setDoor(5, kCharacterClerk, 3, 10, 9);
 				setDoor(6, kCharacterClerk, 3, 10, 9);
 				setDoor(7, kCharacterClerk, 3, 10, 9);


Commit: 8172656789fc3159fa235c699a3ed09e521cd5e8
    https://github.com/scummvm/scummvm/commit/8172656789fc3159fa235c699a3ed09e521cd5e8
Author: AndywinXp (andywinxp at gmail.com)
Date: 2025-06-16T23:12:18+02:00

Commit Message:
LASTEXPRESS: Fix Milos parentheses warnings

Changed paths:
    engines/lastexpress/characters/milos.cpp


diff --git a/engines/lastexpress/characters/milos.cpp b/engines/lastexpress/characters/milos.cpp
index 07fb190c88d..bcc9da981d0 100644
--- a/engines/lastexpress/characters/milos.cpp
+++ b/engines/lastexpress/characters/milos.cpp
@@ -715,7 +715,7 @@ void LogicManager::HAND_Milos_KnockTyler(HAND_PARAMS) {
 				fedEx(kCharacterMilos, kCharacterMilos, 18, 0);
 			}
 		} else if (getCharacterCurrentParams(kCharacterMilos)[0]) {
-			if (!getCharacterCurrentParams(kCharacterMilos)[8] && (getCharacterCurrentParams(kCharacterMilos)[8] = _realTime + 45, _realTime == -45) || getCharacterCurrentParams(kCharacterMilos)[8] < _realTime) {
+			if ((!getCharacterCurrentParams(kCharacterMilos)[8] && (getCharacterCurrentParams(kCharacterMilos)[8] = _realTime + 45, _realTime == -45)) || getCharacterCurrentParams(kCharacterMilos)[8] < _realTime) {
 				if (checkDoor(1) == 1) {
 					if (getCharacterCurrentParams(kCharacterMilos)[9] || (getCharacterCurrentParams(kCharacterMilos)[9] = _realTime + 75, _realTime != -75)) {
 						if (getCharacterCurrentParams(kCharacterMilos)[9] >= _realTime)
@@ -773,7 +773,7 @@ void LogicManager::HAND_Milos_KnockTyler(HAND_PARAMS) {
 					MilosCall(&LogicManager::CONS_Milos_SaveGame, 2, kEventMilosTylerCompartmentVisit, 0, 0);
 				}
 			}
-		} else if (!getCharacterCurrentParams(kCharacterMilos)[10] && (getCharacterCurrentParams(kCharacterMilos)[10] = _realTime + 75, _realTime == -75) || getCharacterCurrentParams(kCharacterMilos)[10] < _realTime) {
+		} else if ((!getCharacterCurrentParams(kCharacterMilos)[10] && (getCharacterCurrentParams(kCharacterMilos)[10] = _realTime + 75, _realTime == -75)) || getCharacterCurrentParams(kCharacterMilos)[10] < _realTime) {
 			if (!getCharacterCurrentParams(kCharacterMilos)[3]) {
 				getCharacter(kCharacterMilos).callbacks[getCharacter(kCharacterMilos).currentCall + 8] = 12;
 				MilosCall(&LogicManager::CONS_Milos_DoDialog, "MIL1030C", 0, 0, 0);


Commit: 4bd4e558644636d4fa3be6599e1f0eebc5181e87
    https://github.com/scummvm/scummvm/commit/4bd4e558644636d4fa3be6599e1f0eebc5181e87
Author: AndywinXp (andywinxp at gmail.com)
Date: 2025-06-16T23:12:18+02:00

Commit Message:
LASTEXPRESS: Fix Police parentheses warnings

Changed paths:
    engines/lastexpress/characters/police.cpp


diff --git a/engines/lastexpress/characters/police.cpp b/engines/lastexpress/characters/police.cpp
index 144ec32df32..933c0890ce1 100644
--- a/engines/lastexpress/characters/police.cpp
+++ b/engines/lastexpress/characters/police.cpp
@@ -568,8 +568,8 @@ void LogicManager::HAND_Police_TrappedCath(HAND_PARAMS) {
 	switch (msg->action) {
 	case 0:
 	{
-		if (!getCharacterCurrentParams(kCharacterPolice)[4] &&
-				(getCharacterCurrentParams(kCharacterPolice)[4] = _realTime + 75, _realTime == -75) ||
+		if ((!getCharacterCurrentParams(kCharacterPolice)[4] &&
+				(getCharacterCurrentParams(kCharacterPolice)[4] = _realTime + 75, _realTime == -75)) ||
 			getCharacterCurrentParams(kCharacterPolice)[4] < _realTime) {
 			if (!cathOutHisWindow() && checkDoor(getCharacterCurrentParams(kCharacterPolice)[2]) != 1) {
 				getCharacter(kCharacterPolice).callbacks[getCharacter(kCharacterPolice).currentCall + 8] = 2;


Commit: b4d936d7fd219ee3551c54f44876e50b55396ca6
    https://github.com/scummvm/scummvm/commit/b4d936d7fd219ee3551c54f44876e50b55396ca6
Author: AndywinXp (andywinxp at gmail.com)
Date: 2025-06-16T23:12:18+02:00

Commit Message:
LASTEXPRESS: Fix Rebecca parentheses warnings

Changed paths:
    engines/lastexpress/characters/rebecca.cpp


diff --git a/engines/lastexpress/characters/rebecca.cpp b/engines/lastexpress/characters/rebecca.cpp
index 4d6b7ff801c..1e0f6ab6adb 100644
--- a/engines/lastexpress/characters/rebecca.cpp
+++ b/engines/lastexpress/characters/rebecca.cpp
@@ -1220,7 +1220,7 @@ void LogicManager::HAND_Rebecca_InSalon1A(HAND_PARAMS) {
 
 		if (skip || getCharacterCurrentParams(kCharacterRebecca)[3] >= _gameTime) {
 			if (getCharacterCurrentParams(kCharacterRebecca)[0]) {
-				if (!getCharacterCurrentParams(kCharacterRebecca)[4] && (getCharacterCurrentParams(kCharacterRebecca)[4] = _gameTime + 900, _gameTime == -900) || getCharacterCurrentParams(kCharacterRebecca)[4] < _gameTime) {
+				if ((!getCharacterCurrentParams(kCharacterRebecca)[4] && (getCharacterCurrentParams(kCharacterRebecca)[4] = _gameTime + 900, _gameTime == -900)) || getCharacterCurrentParams(kCharacterRebecca)[4] < _gameTime) {
 					if (inSalon(kCharacterCath)) {
 						getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 5;
 						RebeccaCall(&LogicManager::CONS_Rebecca_DoDialog, "REB1013", 0, 0, 0);
@@ -1275,7 +1275,7 @@ void LogicManager::HAND_Rebecca_InSalon1A(HAND_PARAMS) {
 		case 4:
 			getCharacterCurrentParams(kCharacterRebecca)[0] = 1;
 			if (getCharacterCurrentParams(kCharacterRebecca)[0]) {
-				if (!getCharacterCurrentParams(kCharacterRebecca)[4] && (getCharacterCurrentParams(kCharacterRebecca)[4] = _gameTime + 900, _gameTime == -900) || getCharacterCurrentParams(kCharacterRebecca)[4] < _gameTime) {
+				if ((!getCharacterCurrentParams(kCharacterRebecca)[4] && (getCharacterCurrentParams(kCharacterRebecca)[4] = _gameTime + 900, _gameTime == -900)) || getCharacterCurrentParams(kCharacterRebecca)[4] < _gameTime) {
 					if (inSalon(kCharacterCath)) {
 						getCharacter(kCharacterRebecca).callbacks[getCharacter(kCharacterRebecca).currentCall + 8] = 5;
 						RebeccaCall(&LogicManager::CONS_Rebecca_DoDialog, "REB1013", 0, 0, 0);


Commit: 2da59e68c10ce339305fdfcd0df2405633f81317
    https://github.com/scummvm/scummvm/commit/2da59e68c10ce339305fdfcd0df2405633f81317
Author: AndywinXp (andywinxp at gmail.com)
Date: 2025-06-16T23:12:18+02:00

Commit Message:
LASTEXPRESS: Fix Salko parentheses warnings

Changed paths:
    engines/lastexpress/characters/salko.cpp


diff --git a/engines/lastexpress/characters/salko.cpp b/engines/lastexpress/characters/salko.cpp
index 55b54817d11..48cfb91361b 100644
--- a/engines/lastexpress/characters/salko.cpp
+++ b/engines/lastexpress/characters/salko.cpp
@@ -264,14 +264,14 @@ void LogicManager::HAND_Salko_DoWalkBehind(HAND_PARAMS) {
 	case 0:
 		getCharacterCurrentParams(kCharacterSalko)[2] = 0;
 		if (nearChar(kCharacterSalko, kCharacterIvo, 500) ||
-			(getCharacter(kCharacterSalko).direction == 1) &&
+			((getCharacter(kCharacterSalko).direction == 1) &&
 				((getCharacter(kCharacterSalko).characterPosition.car > getCharacter(kCharacterIvo).characterPosition.car) ||
-				 getCharacter(kCharacterSalko).characterPosition.car == getCharacter(kCharacterIvo).characterPosition.car &&
-					 getCharacter(kCharacterSalko).characterPosition.position > getCharacter(kCharacterIvo).characterPosition.position) ||
-			getCharacter(kCharacterSalko).direction == 2 &&
+				 (getCharacter(kCharacterSalko).characterPosition.car == getCharacter(kCharacterIvo).characterPosition.car &&
+					 getCharacter(kCharacterSalko).characterPosition.position > getCharacter(kCharacterIvo).characterPosition.position))) ||
+			(getCharacter(kCharacterSalko).direction == 2 &&
 				((getCharacter(kCharacterSalko).characterPosition.car < getCharacter(kCharacterIvo).characterPosition.car) ||
-				 getCharacter(kCharacterSalko).characterPosition.car == getCharacter(kCharacterIvo).characterPosition.car &&
-					 getCharacter(kCharacterSalko).characterPosition.position < getCharacter(kCharacterIvo).characterPosition.position)) {
+				 (getCharacter(kCharacterSalko).characterPosition.car == getCharacter(kCharacterIvo).characterPosition.car &&
+					 getCharacter(kCharacterSalko).characterPosition.position < getCharacter(kCharacterIvo).characterPosition.position)))) {
 
 			getCharacter(kCharacterSalko).waitedTicksUntilCycleRestart = 0;
 			getCharacterCurrentParams(kCharacterSalko)[2] = 1;


Commit: bd6aa554fb851a1c734daa774c1e792f9b7bb230
    https://github.com/scummvm/scummvm/commit/bd6aa554fb851a1c734daa774c1e792f9b7bb230
Author: AndywinXp (andywinxp at gmail.com)
Date: 2025-06-16T23:12:18+02:00

Commit Message:
LASTEXPRESS: Fix Sophie parentheses warnings

Changed paths:
    engines/lastexpress/characters/sophie.cpp


diff --git a/engines/lastexpress/characters/sophie.cpp b/engines/lastexpress/characters/sophie.cpp
index 56aa76cad52..25a49376209 100644
--- a/engines/lastexpress/characters/sophie.cpp
+++ b/engines/lastexpress/characters/sophie.cpp
@@ -109,10 +109,10 @@ void LogicManager::HAND_Sophie_DoWalkBehind(HAND_PARAMS) {
 	case 0:
 		getCharacterCurrentParams(kCharacterSophie)[2] = 0;
 		if (nearChar(kCharacterSophie, kCharacterRebecca, 500) ||
-			(getCharacter(kCharacterSophie).direction == 1) && ((getCharacter(kCharacterSophie).characterPosition.car > getCharacter(kCharacterRebecca).characterPosition.car) ||
-																 getCharacter(kCharacterSophie).characterPosition.car == getCharacter(kCharacterRebecca).characterPosition.car && getCharacter(kCharacterSophie).characterPosition.position > getCharacter(kCharacterRebecca).characterPosition.position) ||
-			getCharacter(kCharacterSophie).direction == 2 && ((getCharacter(kCharacterSophie).characterPosition.car < getCharacter(kCharacterRebecca).characterPosition.car) ||
-															   getCharacter(kCharacterSophie).characterPosition.car == getCharacter(kCharacterRebecca).characterPosition.car && getCharacter(kCharacterSophie).characterPosition.position < getCharacter(kCharacterRebecca).characterPosition.position)) {
+			((getCharacter(kCharacterSophie).direction == 1) && ((getCharacter(kCharacterSophie).characterPosition.car > getCharacter(kCharacterRebecca).characterPosition.car) ||
+																 (getCharacter(kCharacterSophie).characterPosition.car == getCharacter(kCharacterRebecca).characterPosition.car && getCharacter(kCharacterSophie).characterPosition.position > getCharacter(kCharacterRebecca).characterPosition.position))) ||
+			(getCharacter(kCharacterSophie).direction == 2 && ((getCharacter(kCharacterSophie).characterPosition.car < getCharacter(kCharacterRebecca).characterPosition.car) ||
+															   (getCharacter(kCharacterSophie).characterPosition.car == getCharacter(kCharacterRebecca).characterPosition.car && getCharacter(kCharacterSophie).characterPosition.position < getCharacter(kCharacterRebecca).characterPosition.position)))) {
 
 			getCharacter(kCharacterSophie).waitedTicksUntilCycleRestart = 0;
 			getCharacterCurrentParams(kCharacterSophie)[2] = 1;


Commit: c9615ff131d0c3a10b4501dad00349b6aae741ae
    https://github.com/scummvm/scummvm/commit/c9615ff131d0c3a10b4501dad00349b6aae741ae
Author: AndywinXp (andywinxp at gmail.com)
Date: 2025-06-16T23:12:18+02:00

Commit Message:
LASTEXPRESS: Fix Tatiana parentheses warnings

Changed paths:
    engines/lastexpress/characters/tatiana.cpp


diff --git a/engines/lastexpress/characters/tatiana.cpp b/engines/lastexpress/characters/tatiana.cpp
index 6cf89b9e72d..2382dc72998 100644
--- a/engines/lastexpress/characters/tatiana.cpp
+++ b/engines/lastexpress/characters/tatiana.cpp
@@ -1117,7 +1117,7 @@ void LogicManager::HAND_Tatiana_GetSomeAir(HAND_PARAMS) {
 			break;
 		}
 
-		if (!_doneNIS[kEventTatianaAskMatchSpeakRussian] && !_doneNIS[kEventTatianaAskMatch] || onLowPlatform(kCharacterCath) || !getCharacterCurrentParams(kCharacterTatiana)[0]) {
+		if ((!_doneNIS[kEventTatianaAskMatchSpeakRussian] && !_doneNIS[kEventTatianaAskMatch]) || onLowPlatform(kCharacterCath) || !getCharacterCurrentParams(kCharacterTatiana)[0]) {
 			getCharacterCurrentParams(kCharacterTatiana)[0] = _gameTime;
 			if (!_gameTime) {
 				setDoor(25, kCharacterCath, 0, 255, 255);
@@ -1542,7 +1542,7 @@ void LogicManager::HAND_Tatiana_StartPart3(HAND_PARAMS) {
 		setDoor(49, kCharacterCath, 1, 10, 9);
 		_items[kItemFirebird].floating = 2;
 
-		if (_doneNIS[kEventTatianaBreakfastGivePoem] || _doneNIS[kEventTatianaGivePoem] && !_doneNIS[kEventTatianaBreakfastAlexei]) {
+		if (_doneNIS[kEventTatianaBreakfastGivePoem] || (_doneNIS[kEventTatianaGivePoem] && !_doneNIS[kEventTatianaBreakfastAlexei])) {
 			_items[kItemParchemin].floating = 2;
 		}
 
@@ -1579,7 +1579,7 @@ void LogicManager::HAND_Tatiana_PlayChess(HAND_PARAMS) {
 		}
 
 		if (getCharacterCurrentParams(kCharacterTatiana)[3] && getCharacterCurrentParams(kCharacterTatiana)[4]) {
-			if (!getCharacterCurrentParams(kCharacterTatiana)[11] && (getCharacterCurrentParams(kCharacterTatiana)[11] = _gameTime + 6300, _gameTime == -6300) || getCharacterCurrentParams(kCharacterTatiana)[11] < _gameTime) {
+			if ((!getCharacterCurrentParams(kCharacterTatiana)[11] && (getCharacterCurrentParams(kCharacterTatiana)[11] = _gameTime + 6300, _gameTime == -6300)) || getCharacterCurrentParams(kCharacterTatiana)[11] < _gameTime) {
 				if (rcClear()) {
 					getCharacter(kCharacterTatiana).characterPosition.location = 0;
 					getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] = 1;
@@ -2441,7 +2441,7 @@ void LogicManager::HAND_Tatiana_WithAlexei(HAND_PARAMS) {
 		if (_gameTime > 2398500) {
 			getCharacterCurrentParams(kCharacterTatiana)[8] = 0x7FFFFFFF;
 		} else {
-			if (!onLowPlatform(kCharacterCath) && getCharacterCurrentParams(kCharacterTatiana)[8] ||
+			if ((!onLowPlatform(kCharacterCath) && getCharacterCurrentParams(kCharacterTatiana)[8]) ||
 				(getCharacterCurrentParams(kCharacterTatiana)[8] = _gameTime, _gameTime)) {
 				if (getCharacterCurrentParams(kCharacterTatiana)[8] >= _gameTime)
 					break;


Commit: 5c0603461bedab084281a78d6a476ab3aa69e1c8
    https://github.com/scummvm/scummvm/commit/5c0603461bedab084281a78d6a476ab3aa69e1c8
Author: AndywinXp (andywinxp at gmail.com)
Date: 2025-06-16T23:12:18+02:00

Commit Message:
LASTEXPRESS: Fix TrainM parentheses warnings

Changed paths:
    engines/lastexpress/characters/trainm.cpp


diff --git a/engines/lastexpress/characters/trainm.cpp b/engines/lastexpress/characters/trainm.cpp
index ac8e9b4863d..66930591101 100644
--- a/engines/lastexpress/characters/trainm.cpp
+++ b/engines/lastexpress/characters/trainm.cpp
@@ -1242,13 +1242,13 @@ void LogicManager::HAND_TrainM_BoardPolice(HAND_PARAMS) {
 				break;
 			}
 
-			if (getCharacter(kCharacterCath).characterPosition.car > kCarRedSleeping || getCharacter(kCharacterCath).characterPosition.car == kCarRedSleeping && getCharacter(kCharacterCath).characterPosition.position > 9270) {
+			if (getCharacter(kCharacterCath).characterPosition.car > kCarRedSleeping || (getCharacter(kCharacterCath).characterPosition.car == kCarRedSleeping && getCharacter(kCharacterCath).characterPosition.position > 9270)) {
 				playDialog(0, "BUMP", -1, 0);
 				bumpCath(kCarRedSleeping, 40, 255);
 				getCharacter(kCharacterTrainM).characterPosition.car = kCarRedSleeping;
 				getCharacter(kCharacterTrainM).characterPosition.position = 9270;
 			} else {
-				if (getCharacter(kCharacterCath).characterPosition.car < kCarGreenSleeping || getCharacter(kCharacterCath).characterPosition.car == kCarGreenSleeping && getCharacter(kCharacterCath).characterPosition.position < 4840) {
+				if (getCharacter(kCharacterCath).characterPosition.car < kCarGreenSleeping || (getCharacter(kCharacterCath).characterPosition.car == kCarGreenSleeping && getCharacter(kCharacterCath).characterPosition.position < 4840)) {
 					playDialog(0, "BUMP", -1, 0);
 					bumpCathFDoor(5);
 				}


Commit: cfd1da027826c02aeea2d1f898674ea8769bfba9
    https://github.com/scummvm/scummvm/commit/cfd1da027826c02aeea2d1f898674ea8769bfba9
Author: AndywinXp (andywinxp at gmail.com)
Date: 2025-06-16T23:12:18+02:00

Commit Message:
LASTEXPRESS: Fix Vassili parentheses warnings

Changed paths:
    engines/lastexpress/characters/vassili.cpp


diff --git a/engines/lastexpress/characters/vassili.cpp b/engines/lastexpress/characters/vassili.cpp
index cfa32e2ddf0..0379ee78798 100644
--- a/engines/lastexpress/characters/vassili.cpp
+++ b/engines/lastexpress/characters/vassili.cpp
@@ -199,8 +199,8 @@ void LogicManager::HAND_Vassili_WithTatiana(HAND_PARAMS) {
 	case 0:
 		if (getCharacterCurrentParams(kCharacterVassili)[0]) {
 			getCharacter(kCharacterVassili).characterPosition = getCharacter(kCharacterTatiana).characterPosition;
-		} else if (!getCharacterCurrentParams(kCharacterVassili)[2] &&
-			(getCharacterCurrentParams(kCharacterVassili)[2] = _gameTime + 450, _gameTime == -450) || getCharacterCurrentParams(kCharacterVassili)[2] < _gameTime) {
+		} else if ((!getCharacterCurrentParams(kCharacterVassili)[2] &&
+			(getCharacterCurrentParams(kCharacterVassili)[2] = _gameTime + 450, _gameTime == -450)) || getCharacterCurrentParams(kCharacterVassili)[2] < _gameTime) {
 			if (!getCharacterCurrentParams(kCharacterVassili)[1] && getModel(32) == 1) {
 				getCharacterCurrentParams(kCharacterVassili)[1] = 1;
 				startCycOtis(kCharacterVassili, "303A");
@@ -417,8 +417,8 @@ void LogicManager::HAND_Vassili_HavingSeizure(HAND_PARAMS) {
 
 		break;
 	case 17:
-		if (checkDoor(32) == 2 &&
-			checkCathDir(kCarRedSleeping, 17) ||
+		if ((checkDoor(32) == 2 &&
+			checkCathDir(kCarRedSleeping, 17)) ||
 			checkCathDir(kCarRedSleeping, 18) ||
 			checkCathDir(kCarRedSleeping, 37) ||
 			checkCathDir(kCarRedSleeping, 38) ||


Commit: ed4a01d282c54f9526b41d8b77f325bf74003730
    https://github.com/scummvm/scummvm/commit/ed4a01d282c54f9526b41d8b77f325bf74003730
Author: AndywinXp (andywinxp at gmail.com)
Date: 2025-06-16T23:12:18+02:00

Commit Message:
LASTEXPRESS: Fix Vesna parentheses warnings

Changed paths:
    engines/lastexpress/characters/vesna.cpp


diff --git a/engines/lastexpress/characters/vesna.cpp b/engines/lastexpress/characters/vesna.cpp
index 5d34eb8772c..ba86e663579 100644
--- a/engines/lastexpress/characters/vesna.cpp
+++ b/engines/lastexpress/characters/vesna.cpp
@@ -268,11 +268,11 @@ void LogicManager::HAND_Vesna_DoWalkBehind(HAND_PARAMS) {
 		getCharacterCurrentParams(kCharacterVesna)[2] = 0;
 
 		if (nearChar(kCharacterVesna, kCharacterMilos, 500) ||
-			(getCharacter(kCharacterVesna).direction == 1) &&
+			(getCharacter(kCharacterVesna).direction == 1 &&
 				((getCharacter(kCharacterVesna).characterPosition.car > getCharacter(kCharacterMilos).characterPosition.car) ||
-				 getCharacter(kCharacterVesna).characterPosition.car == getCharacter(kCharacterMilos).characterPosition.car && getCharacter(kCharacterVesna).characterPosition.position > getCharacter(kCharacterMilos).characterPosition.position) ||
-			getCharacter(kCharacterVesna).direction == 2 && ((getCharacter(kCharacterVesna).characterPosition.car < getCharacter(kCharacterMilos).characterPosition.car) ||
-															 getCharacter(kCharacterVesna).characterPosition.car == getCharacter(kCharacterMilos).characterPosition.car && getCharacter(kCharacterVesna).characterPosition.position < getCharacter(kCharacterMilos).characterPosition.position)) {
+				 (getCharacter(kCharacterVesna).characterPosition.car == getCharacter(kCharacterMilos).characterPosition.car && getCharacter(kCharacterVesna).characterPosition.position > getCharacter(kCharacterMilos).characterPosition.position))) ||
+			((getCharacter(kCharacterVesna).direction == 2 && getCharacter(kCharacterVesna).characterPosition.car < getCharacter(kCharacterMilos).characterPosition.car) ||
+															 (getCharacter(kCharacterVesna).characterPosition.car == getCharacter(kCharacterMilos).characterPosition.car && getCharacter(kCharacterVesna).characterPosition.position < getCharacter(kCharacterMilos).characterPosition.position))) {
 
 			getCharacter(kCharacterVesna).waitedTicksUntilCycleRestart = 0;
 			getCharacterCurrentParams(kCharacterVesna)[2] = 1;


Commit: 3d22a3bfc22bb1637f450791fbc5550e8440d02c
    https://github.com/scummvm/scummvm/commit/3d22a3bfc22bb1637f450791fbc5550e8440d02c
Author: AndywinXp (andywinxp at gmail.com)
Date: 2025-06-16T23:12:18+02:00

Commit Message:
LASTEXPRESS: Fix TableC parentheses warnings

Changed paths:
    engines/lastexpress/characters/tablec.cpp


diff --git a/engines/lastexpress/characters/tablec.cpp b/engines/lastexpress/characters/tablec.cpp
index 80c44873c4d..df8cebd467b 100644
--- a/engines/lastexpress/characters/tablec.cpp
+++ b/engines/lastexpress/characters/tablec.cpp
@@ -170,7 +170,6 @@ void LogicManager::CONS_TableC_Idling(CONS_PARAMS) {
 }
 
 void LogicManager::HAND_TableC_Idling(HAND_PARAMS) {
-	getCharacterCurrentParams(kCharacterTableC);
 	switch (msg->action) {
 	case 0:
 		if (_globals[kProgressChapter] == 1) {


Commit: 186cdcb63bdd6fffb8873172eb915ccf88f52f23
    https://github.com/scummvm/scummvm/commit/186cdcb63bdd6fffb8873172eb915ccf88f52f23
Author: AndywinXp (andywinxp at gmail.com)
Date: 2025-06-16T23:12:18+02:00

Commit Message:
LASTEXPRESS: Fix action.cpp parentheses warnings

Changed paths:
    engines/lastexpress/game/action.cpp


diff --git a/engines/lastexpress/game/action.cpp b/engines/lastexpress/game/action.cpp
index d539ac7d2a3..6e417ee6530 100644
--- a/engines/lastexpress/game/action.cpp
+++ b/engines/lastexpress/game/action.cpp
@@ -81,7 +81,7 @@ int LogicManager::findCursor(Link *link) {
 	case kActionDropItem:
 		if (link->param1 >= 32) {
 			result = kCursorNormal;
-		} else if (link->param1 != _activeItem || link->param1 == 20 && !_globals[kProgressIsTrainRunning] && link->param2 == 4 || link->param1 == 18 && link->param2 == 1 && _globals[kProgressField5C]) {
+		} else if (link->param1 != _activeItem || (link->param1 == 20 && !_globals[kProgressIsTrainRunning] && link->param2 == 4) || (link->param1 == 18 && link->param2 == 1 && _globals[kProgressField5C])) {
 			result = kCursorNormal;
 		} else {
 			result = _items[_activeItem].mnum;
@@ -99,7 +99,7 @@ int LogicManager::findCursor(Link *link) {
 
 		break;
 	case kActionRattle:
-		if (_activeItem == kItemKey && !_doors[kItemMatchBox].status || _doors[kItemMatchBox].status == 1 && cathHasItem(kItemKey) && (_activeItem == kItemBriefcase || _activeItem == kItemFirebird)) {
+		if ((_activeItem == kItemKey && !_doors[kItemMatchBox].status) || (_doors[kItemMatchBox].status == 1 && cathHasItem(kItemKey) && (_activeItem == kItemBriefcase || _activeItem == kItemFirebird))) {
 			result = _items[kItemKey].mnum;
 		} else {
 			if (link->param1 >= 128) {
@@ -120,7 +120,7 @@ int LogicManager::findCursor(Link *link) {
 		if (_globals[kProgressJacket] == 2) {
 			if ((_doneNIS[kEventCathLookOutsideWindowDay] || _doneNIS[kEventCathLookOutsideWindowNight] || getModel(1) == 1) &&
 				_globals[kProgressIsTrainRunning] &&
-				(link->param1 != 45 || !inComp(kCharacterRebecca, kCarRedSleeping, 4840) && _doors[kObjectOutsideBetweenCompartments].status == 2) &&
+				(link->param1 != 45 || (!inComp(kCharacterRebecca, kCarRedSleeping, 4840) && _doors[kObjectOutsideBetweenCompartments].status == 2)) &&
 				_activeItem != kItemBriefcase && _activeItem != kItemFirebird) {
 				result = kCursorForward;
 			} else {
@@ -195,7 +195,7 @@ int LogicManager::findCursor(Link *link) {
 		result = getHintDialog(link->param1) == 0 ? kCursorNormal : kCursorHandPointer;
 		break;
 	case kActionBed:
-		if (_globals[kProgressField18] == 2 && !_globals[kProgressFieldE4] && (_gameTime > 1404000 || _globals[kProgressEventMetAugust] && _globals[kProgressFieldCC] && (!_globals[kProgressField24] || _globals[kProgressField3C]))) {
+		if (_globals[kProgressField18] == 2 && !_globals[kProgressFieldE4] && (_gameTime > 1404000 || (_globals[kProgressEventMetAugust] && _globals[kProgressFieldCC] && (!_globals[kProgressField24] || _globals[kProgressField3C])))) {
 			result = kCursorSleep;
 		} else {
 			result = kCursorNormal;
@@ -480,12 +480,12 @@ void LogicManager::doPreFunction(int *sceneOut) {
 	case kNodeSoftPointItem:
 		if (_trainData[*sceneOut].parameter1 < (_engine->isDemo() ? 16 : 32)) {
 			if (_softBlockedX[_trainData[*sceneOut].parameter1] || _blockedX[_trainData[*sceneOut].parameter1]) {
-				if (_engine->getOtisManager()->fDirection(_activeNode) &&
+				if ((_engine->getOtisManager()->fDirection(_activeNode) &&
 					_engine->getOtisManager()->fDirection(*sceneOut) &&
-					_trainData[_activeNode].nodePosition.position < _trainData[*sceneOut].nodePosition.position ||
-					_engine->getOtisManager()->rDirection(_activeNode) &&
+					_trainData[_activeNode].nodePosition.position < _trainData[*sceneOut].nodePosition.position) ||
+					(_engine->getOtisManager()->rDirection(_activeNode) &&
 					_engine->getOtisManager()->rDirection(*sceneOut) &&
-					_trainData[_activeNode].nodePosition.position > _trainData[*sceneOut].nodePosition.position) {
+					_trainData[_activeNode].nodePosition.position > _trainData[*sceneOut].nodePosition.position)) {
 
 					if (whoseBit(_softBlockedX[_trainData[*sceneOut].parameter1]) != 30 && whoseBit(_blockedX[_trainData[*sceneOut].parameter1]) != 30) {
 						playDialog(kCharacterCath, "CAT1126A", -1, 0);
@@ -578,11 +578,11 @@ void LogicManager::doPostFunction() {
 
 			for (int j = 1; j < 40; j++) {
 				if (getCharacter(kCharacterCath).characterPosition.position == 4) {
-					if (getCharacter(j).characterPosition.car == kCarRedSleeping && getCharacter(j).characterPosition.position > 9270 || getCharacter(j).characterPosition.car == kCarRestaurant && getCharacter(j).characterPosition.position < 1540) {
+					if ((getCharacter(j).characterPosition.car == kCarRedSleeping && getCharacter(j).characterPosition.position > 9270) || (getCharacter(j).characterPosition.car == kCarRestaurant && getCharacter(j).characterPosition.position < 1540)) {
 						charactersRndArray[characterIdx] = j;
 						characterIdx++;
 					}
-				} else if (getCharacter(j).characterPosition.car == kCarGreenSleeping && getCharacter(j).characterPosition.position > 9270 || getCharacter(j).characterPosition.car == kCarRedSleeping && getCharacter(j).characterPosition.position < 850) {
+				} else if ((getCharacter(j).characterPosition.car == kCarGreenSleeping && getCharacter(j).characterPosition.position > 9270) || (getCharacter(j).characterPosition.car == kCarRedSleeping && getCharacter(j).characterPosition.position < 850)) {
 					charactersRndArray[characterIdx] = j;
 					characterIdx++;
 				}
@@ -1007,8 +1007,8 @@ void LogicManager::doAction(Link *link) {
 		if (_engine->isDemo())
 			break;
 
-		if (!_doneNIS[kEventCathLookOutsideWindowDay] && !_doneNIS[kEventCathLookOutsideWindowNight] && getModel(1) != 1 || !_globals[kProgressIsTrainRunning] || link->param1 == 45 && (inComp(kCharacterRebecca, kCarRedSleeping, 4840) || _doors[kObjectOutsideBetweenCompartments].status != 2) || _activeItem == kItemBriefcase || _activeItem == kItemFirebird) {
-			if (link->param1 == 9 || link->param1 >= 44 && link->param1 <= 45) {
+		if ((!_doneNIS[kEventCathLookOutsideWindowDay] && !_doneNIS[kEventCathLookOutsideWindowNight] && getModel(1) != 1) || !_globals[kProgressIsTrainRunning] || (link->param1 == 45 && (inComp(kCharacterRebecca, kCarRedSleeping, 4840) || _doors[kObjectOutsideBetweenCompartments].status != 2)) || _activeItem == kItemBriefcase || _activeItem == kItemFirebird) {
+			if (link->param1 == 9 || (link->param1 >= 44 && link->param1 <= 45)) {
 				if (isNight()) {
 					playNIS(kEventCathLookOutsideWindowNight);
 				} else {
@@ -1453,7 +1453,7 @@ void LogicManager::doAction(Link *link) {
 			}
 
 			if (_doors[link->param1].status == 1 || _doors[link->param1].status == 3 || preventEnterComp(link->param1)) {
-				if (_doors[link->param1].status != 1 || preventEnterComp(link->param1) || _activeItem != 15 && (link->param1 != 1 || !cathHasItem(kItemKey) || _activeItem != kItemBriefcase && _activeItem != kItemFirebird)) {
+				if (_doors[link->param1].status != 1 || preventEnterComp(link->param1) || (_activeItem != 15 && (link->param1 != 1 || !cathHasItem(kItemKey) || (_activeItem != kItemBriefcase && _activeItem != kItemFirebird)))) {
 					if (!cathRunningDialog("LIB013"))
 						queueSFX(kCharacterCath, 13, 0);
 
@@ -1463,7 +1463,7 @@ void LogicManager::doAction(Link *link) {
 
 				queueSFX(kCharacterCath, 32, 0);
 
-				if (link->param1 != 0 && link->param1 <= 3 || link->param1 >= 32 && link->param1 <= 37)
+				if ((link->param1 != 0 && link->param1 <= 3) || (link->param1 >= 32 && link->param1 <= 37))
 					setDoor(link->param1, kCharacterCath, 0, 10, 9);
 
 				queueSFX(kCharacterCath, 15, 22);


Commit: d7fd0f3130782400d4f7abe2a33ff26cb958efa2
    https://github.com/scummvm/scummvm/commit/d7fd0f3130782400d4f7abe2a33ff26cb958efa2
Author: AndywinXp (andywinxp at gmail.com)
Date: 2025-06-16T23:12:18+02:00

Commit Message:
LASTEXPRESS: Fix navigation.cpp parentheses warnings

Changed paths:
    engines/lastexpress/game/navigation.cpp


diff --git a/engines/lastexpress/game/navigation.cpp b/engines/lastexpress/game/navigation.cpp
index db47d0b09c2..a5a689f4cb7 100644
--- a/engines/lastexpress/game/navigation.cpp
+++ b/engines/lastexpress/game/navigation.cpp
@@ -353,16 +353,16 @@ void LogicManager::getNewMnum() {
 		_isMagnifierInUse) {
 
 		if (_activeItem != kItemMatch ||
-			!cathInCorridor(kCarGreenSleeping) &&
-			!cathInCorridor(kCarRedSleeping) ||
+			(!cathInCorridor(kCarGreenSleeping) &&
+			!cathInCorridor(kCarRedSleeping)) ||
 			_globals[kProgressJacket] != 2 ||
 			_inventoryFlag1 ||
 			_inventoryFlag2 ||
 			_isEggHighlighted ||
 			_isMagnifierInUse ||
-			_items[kItem2].floating &&
+			(_items[kItem2].floating &&
 			getCharacter(kCharacterCath).characterPosition.car == kCarRedSleeping &&
-			getCharacter(kCharacterCath).characterPosition.position == 2300) {
+			getCharacter(kCharacterCath).characterPosition.position == 2300)) {
 
 			character = _engine->getOtisManager()->checkMouse(_engine->_cursorX, _engine->_cursorY);
 
@@ -463,8 +463,8 @@ void LogicManager::nodeStepMouse(Event *event) {
 			_isMagnifierInUse) {
 
 			if (_activeItem != kItemMatch ||
-				!cathInCorridor(kCarGreenSleeping) &&
-				!cathInCorridor(kCarRedSleeping) ||
+				(!cathInCorridor(kCarGreenSleeping) &&
+				!cathInCorridor(kCarRedSleeping)) ||
 				_globals[kProgressJacket] != 2 ||
 				_inventoryFlag1 ||
 				_inventoryFlag2 ||
@@ -798,7 +798,7 @@ void LogicManager::checkInventory(int32 flags) {
 				return;
 			}
 
-			if (!_closeUp || _nodeReturn2 && findLargeItem() == _activeItem) {
+			if (!_closeUp || (_nodeReturn2 && findLargeItem() == _activeItem)) {
 				_isMagnifierInUse = 1;
 			}
 


Commit: 22ff3be4979a03ea5d425ab90db7b5c8f6b907a8
    https://github.com/scummvm/scummvm/commit/22ff3be4979a03ea5d425ab90db7b5c8f6b907a8
Author: AndywinXp (andywinxp at gmail.com)
Date: 2025-06-16T23:12:18+02:00

Commit Message:
LASTEXPRESS: Fix most logic.cpp parentheses warnings

Changed paths:
    engines/lastexpress/game/logic.cpp


diff --git a/engines/lastexpress/game/logic.cpp b/engines/lastexpress/game/logic.cpp
index b444f329365..48b2354a348 100644
--- a/engines/lastexpress/game/logic.cpp
+++ b/engines/lastexpress/game/logic.cpp
@@ -284,7 +284,7 @@ void LogicManager::takeItem(int item) {
 				if (_closeUp)
 					cathDir = _trainData[_nodeReturn].cathDir;
 
-				if (cathDir == 1 || cathDir >= 22 && cathDir <= 33) {
+				if (cathDir == 1 || (cathDir >= 22 && cathDir <= 33)) {
 					if (_closeUp) {
 						_nodeReturn = getBumpNode(kCarGreenSleeping, cathDir, 255);
 						return;
@@ -380,7 +380,7 @@ bool LogicManager::isSingleFemale(int character) {
 
 bool LogicManager::isNight() {
 	int chapter = _globals[kProgressChapter];
-	return chapter == 1 || chapter == 4 || chapter == 5 && !_globals[kProgressIsDayTime];
+	return chapter == 1 || chapter == 4 || (chapter == 5 && !_globals[kProgressIsDayTime]);
 }
 
 bool LogicManager::whoOutside(int character) {
@@ -648,7 +648,7 @@ void LogicManager::setDoor(int door, int character, int status, int windowCursor
 
 		_engine->getSoundManager()->_scanAnySoundLoopingSection = true;
 
-		if (oldStatus != status && (oldStatus == 2 || status == 2) && (door && door <= 8 || door >= 32 && door <= 39))
+		if (oldStatus != status && (oldStatus == 2 || status == 2) && ((door && door <= 8) || (door >= 32 && door <= 39)))
 			_engine->getOtisManager()->drawLooseSprites();
 	}
 }
@@ -1116,7 +1116,7 @@ bool LogicManager::obstacleBetween(int character1, int character2) {
 }
 
 bool LogicManager::bumpCathTowardsCond(int door, bool playSound, bool loadScene) {
-	if (getCharacter(kCharacterCath).characterPosition.location || (door < 2 || door > 8) && (door < 32 || door > 39)) {
+	if (getCharacter(kCharacterCath).characterPosition.location || ((door < 2 || door > 8) && (door < 32 || door > 39))) {
 		return false;
 	}
 
@@ -1706,7 +1706,7 @@ void LogicManager::playNIS(int nisId) {
 
 	bool videoWithoutFade = false;
 
-	if (nisId >= kEventCorpseDropFloorOriginal ||
+	if (nisId >= (int)kEventCorpseDropFloorOriginal ||
 		nisId == kEventCathWakingUp ||
 		nisId == kEventConcertCough ||
 		nisId == kEventConcertSit ||
@@ -2622,7 +2622,7 @@ void LogicManager::playCondYelling(int character, int situation) {
 					playDialog(kCharacterCond2, "Jac1500", 16, 0);
 					break;
 				}
-			} else if (_globals[kProgressField40] || _gameTime > 2101500 && _gameTime < 2133000) {
+			} else if (_globals[kProgressField40] || (_gameTime > 2101500 && _gameTime < 2133000)) {
 				playDialog(kCharacterCond2, "Jac1507A", 16, 0);
 			} else {
 				playDialog(kCharacterCond2, "Jac1507", 16, 0);
@@ -3000,8 +3000,8 @@ bool LogicManager::cathWillSeeOtis(int position) {
 		return true;
 	}
 
-	return _engine->getOtisManager()->fDirection(0) && _engine->_fudgePosition[param1] >= getCharacter(kCharacterCath).characterPosition.position ||
-		   _engine->getOtisManager()->rDirection(0) && _engine->_fudgePosition[param2] <= getCharacter(kCharacterCath).characterPosition.position;
+	return (_engine->getOtisManager()->fDirection(0) && _engine->_fudgePosition[param1] >= getCharacter(kCharacterCath).characterPosition.position) ||
+		   (_engine->getOtisManager()->rDirection(0) && _engine->_fudgePosition[param2] <= getCharacter(kCharacterCath).characterPosition.position);
 }
 
 bool LogicManager::walk(int character, int car, int position) {
@@ -3093,7 +3093,7 @@ bool LogicManager::walk(int character, int car, int position) {
 				getCharacter(character).attachedConductor = 0;
 			}
 		} else if (!getCharacter(character).attachedConductor) {
-			if (getCharacter(character).direction != 1 || position <= 2000 && car == getCharacter(character).characterPosition.car) {
+			if (getCharacter(character).direction != 1 || (position <= 2000 && car == getCharacter(character).characterPosition.car)) {
 				if (getCharacter(character).direction == 2 &&
 					(position < 1500 || car != getCharacter(character).characterPosition.car) &&
 					getCharacter(character).characterPosition.position > 1500) {


Commit: a090b7ebda66e15635b24c6ba0016e64a71f2a4c
    https://github.com/scummvm/scummvm/commit/a090b7ebda66e15635b24c6ba0016e64a71f2a4c
Author: AndywinXp (andywinxp at gmail.com)
Date: 2025-06-16T23:12:18+02:00

Commit Message:
LASTEXPRESS: Fix otis.cpp parentheses warnings

Changed paths:
    engines/lastexpress/game/otis.cpp


diff --git a/engines/lastexpress/game/otis.cpp b/engines/lastexpress/game/otis.cpp
index 16d8687ea9e..d61fc20a887 100644
--- a/engines/lastexpress/game/otis.cpp
+++ b/engines/lastexpress/game/otis.cpp
@@ -183,7 +183,7 @@ bool OtisManager::walkingRender() {
 		return true;
 
 	if (car == kCarRestaurant) {
-		if (cathDir >= 73 && cathDir <= 76 || cathDir >= 77 && cathDir <= 80)
+		if ((cathDir >= 73 && cathDir <= 76) || (cathDir >= 77 && cathDir <= 80))
 			return true;
 
 		if (cathDir == 10 || cathDir == 11)
@@ -272,8 +272,8 @@ void OtisManager::startSeq(int character, int direction, bool loadSequence) {
 
 				if (_engine->getLogicManager()->checkLoc(character, kCarGreenSleeping) || _engine->getLogicManager()->checkLoc(character, kCarRedSleeping)) {
 					if (getCharacter(kCharacterCath).characterPosition.car > getCharacter(character).characterPosition.car ||
-						getCharacter(kCharacterCath).characterPosition.car == getCharacter(character).characterPosition.car &&
-						getCharacter(kCharacterCath).characterPosition.position > getCharacter(character).characterPosition.position) {
+						(getCharacter(kCharacterCath).characterPosition.car == getCharacter(character).characterPosition.car &&
+						getCharacter(kCharacterCath).characterPosition.position > getCharacter(character).characterPosition.position)) {
 						Common::strcat_s(effSeqName1, "R.SEQ");
 					} else {
 						Common::strcat_s(effSeqName1, "F.SEQ");
@@ -291,8 +291,8 @@ void OtisManager::startSeq(int character, int direction, bool loadSequence) {
 
 					if (_engine->getLogicManager()->checkLoc(character, 3) || _engine->getLogicManager()->checkLoc(character, 4)) {
 						if (getCharacter(kCharacterCath).characterPosition.car > getCharacter(character).characterPosition.car ||
-							getCharacter(kCharacterCath).characterPosition.car == getCharacter(character).characterPosition.car &&
-							getCharacter(kCharacterCath).characterPosition.position > getCharacter(character).characterPosition.position) {
+							(getCharacter(kCharacterCath).characterPosition.car == getCharacter(character).characterPosition.car &&
+							getCharacter(kCharacterCath).characterPosition.position > getCharacter(character).characterPosition.position)) {
 							Common::strcat_s(effSeqName2, "R.SEQ");
 						} else {
 							Common::strcat_s(effSeqName2, "F.SEQ");
@@ -815,8 +815,8 @@ void OtisManager::refreshSequences() {
 
 							if (_engine->getLogicManager()->checkLoc(j, 3) || _engine->getLogicManager()->checkLoc(j, 4)) {
 								if (getCharacter(j).characterPosition.car < getCharacter(kCharacterCath).characterPosition.car ||
-									getCharacter(j).characterPosition.car == getCharacter(kCharacterCath).characterPosition.car &&
-									getCharacter(kCharacterCath).characterPosition.position > getCharacter(j).characterPosition.position) {
+									(getCharacter(j).characterPosition.car == getCharacter(kCharacterCath).characterPosition.car &&
+									getCharacter(kCharacterCath).characterPosition.position > getCharacter(j).characterPosition.position)) {
 									Common::strcat_s(seqName, "R.SEQ");
 								} else {
 									Common::strcat_s(seqName, "F.SEQ");
@@ -849,8 +849,8 @@ void OtisManager::refreshSequences() {
 
 							if (_engine->getLogicManager()->checkLoc(j, 3) || _engine->getLogicManager()->checkLoc(j, 4)) {
 								if (getCharacter(j).characterPosition.car < getCharacter(kCharacterCath).characterPosition.car ||
-									getCharacter(j).characterPosition.car == getCharacter(kCharacterCath).characterPosition.car &&
-									getCharacter(kCharacterCath).characterPosition.position > getCharacter(j).characterPosition.position) {
+									(getCharacter(j).characterPosition.car == getCharacter(kCharacterCath).characterPosition.car &&
+									getCharacter(kCharacterCath).characterPosition.position > getCharacter(j).characterPosition.position)) {
 									Common::strcat_s(seqName2, "R.SEQ");
 								} else {
 									Common::strcat_s(seqName2, "F.SEQ");
@@ -1214,7 +1214,7 @@ void OtisManager::updateCharacter(int character) {
 
 		if (getCharacter(character).frame1 && getCharacter(character).direction && getCharacter(character).sequence1) {
 			if (getCharacter(character).waitedTicksUntilCycleRestart < getCharacter(character).frame1->ticksToWaitUntilCycleRestart - 1 ||
-				getCharacter(character).direction == 3 && getCharacter(character).sequence1->numFrames == 1) {
+				(getCharacter(character).direction == 3 && getCharacter(character).sequence1->numFrames == 1)) {
 				getCharacter(character).waitedTicksUntilCycleRestart++;
 			} else if (getCharacter(character).waitedTicksUntilCycleRestart >= getCharacter(character).frame1->ticksToWaitUntilCycleRestart || getCharacter(character).frame1->spritesUnk3) {
 				if (getCharacter(character).frame1->spritesUnk3 == 1)
@@ -1222,7 +1222,7 @@ void OtisManager::updateCharacter(int character) {
 
 				getCharacter(character).currentFrameSeq1++;
 
-				if (getCharacter(character).currentFrameSeq1 > (getCharacter(character).sequence1->numFrames - 1) || getCharacter(character).needsPosFudge && mainWalkTooFar(character)) {
+				if (getCharacter(character).currentFrameSeq1 > (getCharacter(character).sequence1->numFrames - 1) || (getCharacter(character).needsPosFudge && mainWalkTooFar(character))) {
 					if (getCharacter(character).direction == 3) {
 						getCharacter(character).currentFrameSeq1 = 0;
 					} else {
@@ -1289,7 +1289,7 @@ void OtisManager::updateCharacter(int character) {
 
 		getCharacter(character).doProcessEntity = 0;
 
-		if (getCharacter(character).direction == 4 || getCharacter(character).direction == 5 && getCharacter(character).directionSwitch == 4)
+		if (getCharacter(character).direction == 4 || (getCharacter(character).direction == 5 && getCharacter(character).directionSwitch == 4))
 			getCharacter(character).elapsedFrames++;
 	} else {
 		if (getCharacter(character).position2) {
@@ -1303,7 +1303,7 @@ void OtisManager::updateCharacter(int character) {
 
 		getCharacter(character).doProcessEntity = 0;
 
-		if (getCharacter(character).direction == 4 || getCharacter(character).direction == 5 && getCharacter(character).directionSwitch == 4)
+		if (getCharacter(character).direction == 4 || (getCharacter(character).direction == 5 && getCharacter(character).directionSwitch == 4))
 			getCharacter(character).elapsedFrames++;
 	}
 }
@@ -1345,8 +1345,8 @@ void OtisManager::doNewSprite(int character, bool keepPreviousFrame, bool dontPl
 		if ((newSprite->flags & 1) != 0)
 			_engine->getLogicManager()->send(kCharacterCath, character, 5, 0);
 
-		if ((newSprite->flags & 2) == 0 || (_engine->getLogicManager()->send(kCharacterCath, character, 10, 0), _engine->getMessageManager()->flush(), !_engine->_stopUpdatingCharacters) && !getCharacter(character).doProcessEntity) {
-			if ((newSprite->flags & 0x10) == 0 || (_engine->getLogicManager()->send(kCharacterCath, character, 4, 0), _engine->getMessageManager()->flush(), !_engine->_stopUpdatingCharacters) && !getCharacter(character).doProcessEntity) {
+		if ((newSprite->flags & 2) == 0 || ((_engine->getLogicManager()->send(kCharacterCath, character, 10, 0), _engine->getMessageManager()->flush(), !_engine->_stopUpdatingCharacters) && !getCharacter(character).doProcessEntity)) {
+			if ((newSprite->flags & 0x10) == 0 || ((_engine->getLogicManager()->send(kCharacterCath, character, 4, 0), _engine->getMessageManager()->flush(), !_engine->_stopUpdatingCharacters) && !getCharacter(character).doProcessEntity)) {
 				if (getCharacter(character).position2) {
 					_engine->getLogicManager()->releaseView(character, getCharacter(character).car2, getCharacter(character).position2);
 					getCharacter(character).car2 = 0;
@@ -1354,9 +1354,9 @@ void OtisManager::doNewSprite(int character, bool keepPreviousFrame, bool dontPl
 				}
 
 				if (!newSprite->position ||
-					(getCharacter(character).car2 = getCharacter(character).characterPosition.car, getCharacter(character).position2 = newSprite->position,
+					((getCharacter(character).car2 = getCharacter(character).characterPosition.car, getCharacter(character).position2 = newSprite->position,
 						_engine->getLogicManager()->blockView(character, getCharacter(character).car2, getCharacter(character).position2),
-						!_engine->_stopUpdatingCharacters) && !getCharacter(character).doProcessEntity) {
+						!_engine->_stopUpdatingCharacters) && !getCharacter(character).doProcessEntity)) {
 					if (newSprite->soundAction && !dontPlaySound)
 						_engine->getLogicManager()->queueSFX(character, newSprite->soundAction, newSprite->soundDelay);
 
@@ -1381,7 +1381,7 @@ void OtisManager::doNewSprite(int character, bool keepPreviousFrame, bool dontPl
 }
 
 void OtisManager::doSeqChange(int character) {
-	if (getCharacter(character).direction != 4 || (_engine->getLogicManager()->send(kCharacterCath, character, 3, 0), _engine->getMessageManager()->flush(), !_engine->_stopUpdatingCharacters) && !getCharacter(character).doProcessEntity) {
+	if (getCharacter(character).direction != 4 || ((_engine->getLogicManager()->send(kCharacterCath, character, 3, 0), _engine->getMessageManager()->flush(), !_engine->_stopUpdatingCharacters) && !getCharacter(character).doProcessEntity)) {
 		if (_engine->getLogicManager()->whoWalking(character) && !getCharacter(character).sequence2 && corrRender(0) && getCharacter(kCharacterCath).characterPosition.car == getCharacter(character).characterPosition.car) {
 			if (getCharacter(character).needsPosFudge && !_engine->getLogicManager()->whoFacingCath(character)) {
 				getCharacter(character).characterPosition.position = 8514;


Commit: 226dce52922b17d02781320af167c067090c406e
    https://github.com/scummvm/scummvm/commit/226dce52922b17d02781320af167c067090c406e
Author: AndywinXp (andywinxp at gmail.com)
Date: 2025-06-16T23:12:18+02:00

Commit Message:
LASTEXPRESS: SOUND: Fix some dialogs stopping after first frame

Changed paths:
    engines/lastexpress/sound/slot.cpp


diff --git a/engines/lastexpress/sound/slot.cpp b/engines/lastexpress/sound/slot.cpp
index d6bd5b10206..6af9927b689 100644
--- a/engines/lastexpress/sound/slot.cpp
+++ b/engines/lastexpress/sound/slot.cpp
@@ -500,8 +500,8 @@ void Slot::devirtualize() {
 
 					_engine->_soundMutex->lock();
 
-					_size = _soundBuffer[0];
-					_blockCount = _soundBuffer[2] - 1;
+					_size = READ_LE_UINT32(&_soundBuffer[0]);
+					_blockCount = READ_LE_UINT32(&_soundBuffer[4]) - 1;
 					_blockCount -= _time;
 				}
 


Commit: 0ccb25781f76cba2d371321894e0e319d618e6f8
    https://github.com/scummvm/scummvm/commit/0ccb25781f76cba2d371321894e0e319d618e6f8
Author: AndywinXp (andywinxp at gmail.com)
Date: 2025-06-16T23:12:18+02:00

Commit Message:
LASTEXPRESS: Fix warning in comparison of walkCounter

The disassembly showed a comparison with 0x80 but the
decompiler showed a "< 0" comparison. This should now
be fixed and it shows that this walkCounter actually contains
flags...

Changed paths:
    engines/lastexpress/game/logic.cpp


diff --git a/engines/lastexpress/game/logic.cpp b/engines/lastexpress/game/logic.cpp
index 48b2354a348..17e4c3afd56 100644
--- a/engines/lastexpress/game/logic.cpp
+++ b/engines/lastexpress/game/logic.cpp
@@ -3009,7 +3009,7 @@ bool LogicManager::walk(int character, int car, int position) {
 	int excuseMeCharacter;
 	uint32 characterPosition;
 	bool canTeleportToTarget = false;
-	bool negativeWalkCounter = false;
+	bool moveCharacterByOffset = false;
 	bool walkCounterUpdated = false;
 	int offset = 0;
 	
@@ -3024,7 +3024,7 @@ bool LogicManager::walk(int character, int car, int position) {
 	if (getCharacter(character).walkCounter) {
 		getCharacter(character).walkCounter--;
 
-		if (getCharacter(character).walkCounter == 128)
+		if (getCharacter(character).walkCounter == 0x80)
 			getCharacter(character).walkCounter = 0;
 
 		if ((getCharacter(character).walkCounter & 0x7F) != 8) {
@@ -3034,8 +3034,8 @@ bool LogicManager::walk(int character, int car, int position) {
 
 		walkCounterUpdated = true;
 
-		if (getCharacter(character).walkCounter < 0)
-			negativeWalkCounter = true;
+		if ((getCharacter(character).walkCounter & 0x80) != 0)
+			moveCharacterByOffset = true;
 	}
 
 	if (car == getCharacter(character).characterPosition.car) {
@@ -3138,7 +3138,7 @@ bool LogicManager::walk(int character, int car, int position) {
 						}
 
 						playChrExcuseMe(character, excuseMeCharacter, 0);
-						getCharacter(character).walkCounter = 144;
+						getCharacter(character).walkCounter = 0x80 | 0x10;
 
 						break;
 					}
@@ -3171,8 +3171,8 @@ bool LogicManager::walk(int character, int car, int position) {
 								   (getCharacter(character).direction == 2 && (getCharacter(character).characterPosition.position > getCharacter(j).characterPosition.position))) {
 							getCharacter(character).waitedTicksUntilCycleRestart = 0;
 							getCharacter(j).waitedTicksUntilCycleRestart = 0;
-							getCharacter(character).walkCounter = 16;
-							getCharacter(j).walkCounter = 16;
+							getCharacter(character).walkCounter = 0x10;
+							getCharacter(j).walkCounter = 0x10;
 							playChrExcuseMe(character, j, 0);
 							playChrExcuseMe(j, character, 0);
 
@@ -3317,7 +3317,7 @@ bool LogicManager::walk(int character, int car, int position) {
 
 	if (walkCounterUpdated) {
 		if (seqDirection == 1) {
-			if (negativeWalkCounter) {
+			if (moveCharacterByOffset) {
 				if (getCharacter(character).characterPosition.position < 8800)
 					getCharacter(character).characterPosition.position += 1200;
 			} else if (getCharacter(character).characterPosition.position < 9250) {
@@ -3331,7 +3331,7 @@ bool LogicManager::walk(int character, int car, int position) {
 				return true;
 			}
 		} else {
-			if (negativeWalkCounter) {
+			if (moveCharacterByOffset) {
 				if (getCharacter(character).characterPosition.position > 1200)
 					getCharacter(character).characterPosition.position -= 1200;
 			} else if (getCharacter(character).characterPosition.position > 750) {


Commit: 57fdfd45bbb4d2c8cb0c24b5614b85da55c88ed1
    https://github.com/scummvm/scummvm/commit/57fdfd45bbb4d2c8cb0c24b5614b85da55c88ed1
Author: AndywinXp (andywinxp at gmail.com)
Date: 2025-06-16T23:12:18+02:00

Commit Message:
LASTEXPRESS: Fix last parentheses warning in logic.cpp

Changed paths:
    engines/lastexpress/game/logic.cpp


diff --git a/engines/lastexpress/game/logic.cpp b/engines/lastexpress/game/logic.cpp
index 17e4c3afd56..1f1e52acc95 100644
--- a/engines/lastexpress/game/logic.cpp
+++ b/engines/lastexpress/game/logic.cpp
@@ -3127,8 +3127,8 @@ bool LogicManager::walk(int character, int car, int position) {
 
 				for (int i = 0; i < 8; i++) {
 					if ((_blockedX[offset + i] || _softBlockedX[offset + i]) && nearX(character, _doorPositions[i], 750) &&
-						cathWillSeeOtis(_doorPositions[i]) && (getCharacter(character).direction == 1 && (getCharacter(character).characterPosition.position < _doorPositions[i]) &&
-							(car != getCharacter(character).characterPosition.car || position > _doorPositions[i]) ||
+						cathWillSeeOtis(_doorPositions[i]) && ((getCharacter(character).direction == 1 && getCharacter(character).characterPosition.position < _doorPositions[i] &&
+							(car != getCharacter(character).characterPosition.car || position > _doorPositions[i])) ||
 							(getCharacter(character).direction == 2 && (getCharacter(character).characterPosition.position > _doorPositions[i]) &&
 								(car != getCharacter(character).characterPosition.car || position < _doorPositions[i])))) {
 						if (_blockedX[offset + i]) {


Commit: ef7e38e37ae5215e91d493e3310ebf4b676a7533
    https://github.com/scummvm/scummvm/commit/ef7e38e37ae5215e91d493e3310ebf4b676a7533
Author: AndywinXp (andywinxp at gmail.com)
Date: 2025-06-16T23:12:18+02:00

Commit Message:
LASTEXPRESS: DETECTION: Set engine as ready for public testing

Changed paths:
    engines/lastexpress/detection.cpp


diff --git a/engines/lastexpress/detection.cpp b/engines/lastexpress/detection.cpp
index f3aecd56477..f713d722713 100644
--- a/engines/lastexpress/detection.cpp
+++ b/engines/lastexpress/detection.cpp
@@ -60,7 +60,7 @@ static const ADGameDescription gameDescriptions[] = {
 		},
 		Common::EN_ANY,
 		Common::kPlatformUnknown,
-		ADGF_UNSTABLE,
+		ADGF_TESTING,
 		GUIO2(GUIO_NOASPECT, GUIO_NOMIDI)
 	},
 
@@ -79,7 +79,7 @@ static const ADGameDescription gameDescriptions[] = {
 		},
 		Common::EN_ANY,
 		Common::kPlatformUnknown,
-		ADGF_UNSTABLE,
+		ADGF_TESTING,
 		GUIO2(GUIO_NOASPECT, GUIO_NOMIDI)
 	},
 
@@ -98,7 +98,7 @@ static const ADGameDescription gameDescriptions[] = {
 		},
 		Common::EN_ANY,
 		Common::kPlatformUnknown,
-		ADGF_UNSTABLE,
+		ADGF_TESTING,
 		GUIO2(GUIO_NOASPECT, GUIO_NOMIDI)
 	},
 
@@ -114,7 +114,7 @@ static const ADGameDescription gameDescriptions[] = {
 		},
 		Common::EN_ANY,
 		Common::kPlatformUnknown,
-		ADGF_DEMO | ADGF_UNSTABLE,
+		ADGF_DEMO | ADGF_TESTING,
 		GUIO2(GUIO_NOASPECT, GUIO_NOMIDI)
 	},
 
@@ -133,7 +133,7 @@ static const ADGameDescription gameDescriptions[] = {
 		},
 		Common::FR_FRA,
 		Common::kPlatformUnknown,
-		ADGF_UNSTABLE,
+		ADGF_TESTING,
 		GUIO2(GUIO_NOASPECT, GUIO_NOMIDI)
 	},
 
@@ -152,7 +152,7 @@ static const ADGameDescription gameDescriptions[] = {
 		},
 		Common::DE_DEU,
 		Common::kPlatformUnknown,
-		ADGF_UNSTABLE,
+		ADGF_TESTING,
 		GUIO2(GUIO_NOASPECT, GUIO_NOMIDI)
 	},
 
@@ -171,7 +171,7 @@ static const ADGameDescription gameDescriptions[] = {
 		},
 		Common::ES_ESP,
 		Common::kPlatformUnknown,
-		ADGF_UNSTABLE,
+		ADGF_TESTING,
 		GUIO2(GUIO_NOASPECT, GUIO_NOMIDI)
 	},
 
@@ -190,7 +190,7 @@ static const ADGameDescription gameDescriptions[] = {
 		},
 		Common::IT_ITA,
 		Common::kPlatformUnknown,
-		ADGF_UNSTABLE,
+		ADGF_TESTING,
 		GUIO2(GUIO_NOASPECT, GUIO_NOMIDI)
 	},
 
@@ -209,7 +209,7 @@ static const ADGameDescription gameDescriptions[] = {
 		},
 		Common::RU_RUS,
 		Common::kPlatformUnknown,
-		ADGF_UNSTABLE,
+		ADGF_TESTING,
 		GUIO2(GUIO_NOASPECT, GUIO_NOMIDI)
 	},
 


Commit: db7783ab350deb756dbc97a5dfc4554a9c634dd6
    https://github.com/scummvm/scummvm/commit/db7783ab350deb756dbc97a5dfc4554a9c634dd6
Author: AndywinXp (andywinxp at gmail.com)
Date: 2025-06-16T23:12:18+02:00

Commit Message:
LASTEXPRESS: Fix typo in Tatiana's logic

Changed paths:
    engines/lastexpress/characters/tatiana.cpp


diff --git a/engines/lastexpress/characters/tatiana.cpp b/engines/lastexpress/characters/tatiana.cpp
index 2382dc72998..ee518f14380 100644
--- a/engines/lastexpress/characters/tatiana.cpp
+++ b/engines/lastexpress/characters/tatiana.cpp
@@ -1407,11 +1407,6 @@ void LogicManager::CONS_Tatiana_JoinAlexei(CONS_PARAMS) {
 
 void LogicManager::HAND_Tatiana_JoinAlexei(HAND_PARAMS) {
 	switch (msg->action) {
-	case 8:
-		if (getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] == 1)
-			CONS_Tatiana_LeaveBreakfast(0, 0, 0, 0);
-
-		break;
 	case 12:
 		getCharacter(kCharacterTatiana).inventoryItem = 0;
 		getCharacter(kCharacterTatiana).characterPosition.location = 0;
@@ -1422,6 +1417,11 @@ void LogicManager::HAND_Tatiana_JoinAlexei(HAND_PARAMS) {
 			send(kCharacterTatiana, kCharacterAlexei, 236053296, 0);
 		}
 
+		break;
+	case 18:
+		if (getCharacter(kCharacterTatiana).callbacks[getCharacter(kCharacterTatiana).currentCall + 8] == 1)
+			CONS_Tatiana_LeaveBreakfast(0, 0, 0, 0);
+
 		break;
 	case 123857088:
 		startCycOtis(kCharacterTatiana, "018G");


Commit: c4c053bba3f808ea771fde92e0cec856736e29c9
    https://github.com/scummvm/scummvm/commit/c4c053bba3f808ea771fde92e0cec856736e29c9
Author: AndywinXp (andywinxp at gmail.com)
Date: 2025-06-16T23:12:18+02:00

Commit Message:
LASTEXPRESS: Finish the EVENT_QUIT handling

Changed paths:
    engines/lastexpress/lastexpress.cpp
    engines/lastexpress/lastexpress.h


diff --git a/engines/lastexpress/lastexpress.cpp b/engines/lastexpress/lastexpress.cpp
index 2340cebb1d2..45d3d35b4fa 100644
--- a/engines/lastexpress/lastexpress.cpp
+++ b/engines/lastexpress/lastexpress.cpp
@@ -225,6 +225,11 @@ Common::Error LastExpressEngine::run() {
 		elapsedMs += 4 * 17;
 	}
 
+	bool haveEvent = true;
+	while (_pendingExitEvent && haveEvent) {
+		haveEvent = getMessageManager()->process();
+	}
+
 	getTimerManager()->removeTimerProc(soundTimerHandler);
 
 	shutDown();
@@ -357,44 +362,36 @@ void LastExpressEngine::startNewGame() {
 
 void LastExpressEngine::engineEventHandler(Event *event) {
 	switch (event->flags) {
-	case 1:
-		//++g_numClicks;
+	case 1: // Quit signal request
 		getNISManager()->abortNIS();
 		abortFight();
 		abortCredits();
-		if (shouldQuit()) {
-			// g_flag_running = 0;
-			// PostMessageA(g_engine_state->hwnd, WM_CLOSE, 0, 0);
-			// g_flag_main_thread_running = 0;
-			// AfxEndThread(0, 1);
-		}
 
-		if (getMenu()->isShowingMenu() || (getMessageManager()->getEventHandle(1) == &LastExpressEngine::nodeStepMouseWrapper && !getVCR()->isVirgin(_currentGameFileColorId))) {
-			getMenu()->doEgg(1, 0, 0);
-			quitGame();
-		} else {
-			getMessageManager()->addEvent(4, 0, 0, 2);
-		}
-
-		if (shouldQuit() /* || g_numClicks > 100*/) {
-			//g_flag_running = 0;
-			//PostMessageA(g_engine_state->hwnd, WM_CLOSE, 0, 0);
-			//g_flag_main_thread_running = 0;
-			//AfxEndThread(0, 1);
+		if (_pendingExitEvent) {
+			if (getMenu()->isShowingMenu() || (getMessageManager()->getEventHandle(1) == &LastExpressEngine::nodeStepMouseWrapper && !getVCR()->isVirgin(_currentGameFileColorId))) {
+				getMenu()->doEgg(true, 0, 0); // Save!
+				_pendingExitEvent = false; // We're done, we can quit
+			} else {
+				getMessageManager()->addEvent(4, 0, 0, 2); // Give the engine the actual chance to abort NIS, fights and credits by running process()
+				_pendingExitEvent = true;
+			}
 		}
 
 		break;
-	case 2:
+	case 2: // Quit signal handler
 		getNISManager()->abortNIS();
 		abortFight();
-		warning("abortFight() missing from engineEventHandler");
 		abortCredits();
-		if (!shouldQuit() && !getMenu()->isShowingMenu()) {
-			if (getMessageManager()->getEventHandle(1) != &LastExpressEngine::nodeStepMouseWrapper || getVCR()->isVirgin(_currentGameFileColorId))
-				getMessageManager()->addEvent(4, 0, 0, 2);
-			else
-				getMenu()->doEgg(true, 0, 0);
+
+		if (_pendingExitEvent && !getMenu()->isShowingMenu()) {
+			if (getMessageManager()->getEventHandle(1) != &LastExpressEngine::nodeStepMouseWrapper || getVCR()->isVirgin(_currentGameFileColorId)) {
+				_pendingExitEvent = true;
+			} else {
+				getMenu()->doEgg(true, 0, 0); // Save!
+				_pendingExitEvent = false; // We're done, we can quit
+			}
 		}
+
 		break;
 	case 3:
 		// Originally handled WM_PAINT events and triggered burstBox on the screen rectangle
@@ -408,9 +405,8 @@ void LastExpressEngine::engineEventHandler(Event *event) {
 		break;
 	}
 	default:
-		return;
+		break;
 	}
-
 }
 
 int32 LastExpressEngine::getSoundFrameCounter() {
@@ -540,8 +536,9 @@ bool LastExpressEngine::handleEvents() {
 			break;
 
 		case Common::EVENT_QUIT:
+		case Common::EVENT_RETURN_TO_LAUNCHER:
 			getMessageManager()->addEvent(4, 0, 0, 1);
-			quitGame();
+			_pendingExitEvent = true;
 			break;
 
 		default:
diff --git a/engines/lastexpress/lastexpress.h b/engines/lastexpress/lastexpress.h
index c04afdb7b0e..3e66ed232e2 100644
--- a/engines/lastexpress/lastexpress.h
+++ b/engines/lastexpress/lastexpress.h
@@ -608,6 +608,8 @@ public:
 	bool _systemEventRightMouseDown = false;
 	Common::Point _systemEventLastMouseCoords;
 
+	bool _pendingExitEvent = false;
+
 	Seq *_doorSeqs[8] = { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr };
 	Seq *_clockHandsSeqs[2] = { nullptr, nullptr };
 	int32 _clockHandsValues[2] = { 0, 0 };


Commit: 0c1f5c7f2fb8877bbc4d0d3e6e72aca3a0acda97
    https://github.com/scummvm/scummvm/commit/0c1f5c7f2fb8877bbc4d0d3e6e72aca3a0acda97
Author: AndywinXp (andywinxp at gmail.com)
Date: 2025-06-16T23:12:18+02:00

Commit Message:
LASTEXPRESS: Properly handle exit from menu button

Changed paths:
    engines/lastexpress/lastexpress.cpp
    engines/lastexpress/lastexpress.h
    engines/lastexpress/menu/menu.cpp


diff --git a/engines/lastexpress/lastexpress.cpp b/engines/lastexpress/lastexpress.cpp
index 45d3d35b4fa..37c81be2bd8 100644
--- a/engines/lastexpress/lastexpress.cpp
+++ b/engines/lastexpress/lastexpress.cpp
@@ -537,8 +537,11 @@ bool LastExpressEngine::handleEvents() {
 
 		case Common::EVENT_QUIT:
 		case Common::EVENT_RETURN_TO_LAUNCHER:
-			getMessageManager()->addEvent(4, 0, 0, 1);
-			_pendingExitEvent = true;
+			if (!_exitFromMenuButton) {
+				getMessageManager()->addEvent(4, 0, 0, 1);
+				_pendingExitEvent = true;
+			}
+
 			break;
 
 		default:
diff --git a/engines/lastexpress/lastexpress.h b/engines/lastexpress/lastexpress.h
index 3e66ed232e2..eddc546001d 100644
--- a/engines/lastexpress/lastexpress.h
+++ b/engines/lastexpress/lastexpress.h
@@ -609,6 +609,7 @@ public:
 	Common::Point _systemEventLastMouseCoords;
 
 	bool _pendingExitEvent = false;
+	bool _exitFromMenuButton = false;
 
 	Seq *_doorSeqs[8] = { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr };
 	Seq *_clockHandsSeqs[2] = { nullptr, nullptr };
diff --git a/engines/lastexpress/menu/menu.cpp b/engines/lastexpress/menu/menu.cpp
index f21091aca78..b70fefaa79f 100644
--- a/engines/lastexpress/menu/menu.cpp
+++ b/engines/lastexpress/menu/menu.cpp
@@ -310,6 +310,7 @@ bool Menu::eggCursorAction(int8 action, int8 flags) {
 			endEgg();
 
 			_engine->quitGame();
+			_engine->_exitFromMenuButton = true;
 		} else {
 			setSprite(2, 10, true);
 			return true;


Commit: 3eed404feab47a8ad72b26339b81a03651ccf703
    https://github.com/scummvm/scummvm/commit/3eed404feab47a8ad72b26339b81a03651ccf703
Author: AndywinXp (andywinxp at gmail.com)
Date: 2025-06-16T23:12:18+02:00

Commit Message:
LASTEXPRESS: Add MouseFlags enum and relabel some flags accordingly

Changed paths:
    engines/lastexpress/game/events.cpp
    engines/lastexpress/game/navigation.cpp
    engines/lastexpress/lastexpress.cpp
    engines/lastexpress/menu/menu.cpp
    engines/lastexpress/shared.h


diff --git a/engines/lastexpress/game/events.cpp b/engines/lastexpress/game/events.cpp
index 60cf2567c58..997f0625f93 100644
--- a/engines/lastexpress/game/events.cpp
+++ b/engines/lastexpress/game/events.cpp
@@ -68,48 +68,48 @@ void MessageManager::addEvent(int channel, int x, int y, int flags) {
 	if (channel == 3) {
 		_engine->setEventTickInternal(true);
 	} else if (channel == 1) {
-		if ((flags & 1) != 0) {
+		if ((flags & kMouseFlagLeftButton) != 0) {
 			// Originally _engine->mouseSetLeftClicked(true); was called from here,
 			// but it's been moved under the "if" because this lead to fake double
 			// clicks when registering mouse movement events (which are re-paired
 			// with RMOUSE and LMOUSE flags when sent to the engine via this function).
 			if (!_systemEventLeftMouseDown) {
 				_engine->mouseSetLeftClicked(true);
-				flags |= 0x8;
+				flags |= kMouseFlagLeftDown;
 				_systemEventLeftMouseDown = true;
 	
 				if (_doubleClickMaxFrames + _latestTickLeftMousePressed > _engine->getSoundFrameCounter())
-					flags |= (0x20 | 0x8);
+					flags |= (kMouseFlagDoubleClick | kMouseFlagLeftDown);
 	
 				_latestTickLeftMousePressed = _engine->getSoundFrameCounter();
 			}
 		} else {
 			if (_systemEventLeftMouseDown)
-				flags |= 0x80;
+				flags |= kMouseFlagLeftUp;
 	
 			_systemEventLeftMouseDown = false;
 		}
 	
-		if ((flags & 2) != 0) {
+		if ((flags & kMouseFlagRightButton) != 0) {
 			// Originally _engine->mouseSetRightClicked(true); was called from here,
 			// but it's been moved under the "if" because this lead to fake double
 			// clicks when registering mouse movement events (which are re-paired
 			// with RMOUSE and LMOUSE flags when sent to the engine via this function).
 			if (!_systemEventRightMouseDown) {
 				_engine->mouseSetRightClicked(true);
-				flags |= 0x10;
+				flags |= kMouseFlagRightDown;
 				_systemEventRightMouseDown = true;
 			}
 		} else {
 			if (_systemEventRightMouseDown)
-				flags |= 0x100;
+				flags |= kMouseFlagRightUp;
 	
 			_systemEventRightMouseDown = false;
 		}
 
 		// Originally "if (!flags)"; this tames slowdowns when dragging the mouse
 		// with one of the buttons pressed. Hopefully it doesn't break anything...
-		if (!flags || ((flags & 0x01) != 0 || (flags & 0x02) != 0)) {
+		if (!flags || ((flags & kMouseFlagLeftButton) != 0 || (flags & kMouseFlagRightButton) != 0)) {
 			if (_lastEventIndex != 128)
 				_events[_lastEventIndex].channel = 0;
 		
diff --git a/engines/lastexpress/game/navigation.cpp b/engines/lastexpress/game/navigation.cpp
index a5a689f4cb7..700dde9fc6a 100644
--- a/engines/lastexpress/game/navigation.cpp
+++ b/engines/lastexpress/game/navigation.cpp
@@ -423,15 +423,15 @@ void LogicManager::nodeStepMouse(Event *event) {
 	_engine->mouseSetLeftClicked(false);
 	_engine->mouseSetRightClicked(false);
 
-	if ((event->flags & 8) != 0) {
-		if ((event->flags & 0x20) != 0 && _engine->_fastWalkJustDeactivated)
-			event->flags &= ~0x20;
+	if ((event->flags & kMouseFlagLeftDown) != 0) {
+		if ((event->flags & kMouseFlagDoubleClick) != 0 && _engine->_fastWalkJustDeactivated)
+			event->flags &= ~kMouseFlagDoubleClick;
 
 		_engine->_fastWalkJustDeactivated = false;
 	}
 
 	if (_doubleClickFlag) {
-		if ((event->flags & 0x18) != 0) {
+		if ((event->flags & (kMouseFlagRightDown | kMouseFlagLeftDown)) != 0) {
 			_doubleClickFlag = false;
 			_engine->getGraphicsManager()->setMouseDrawable(true);
 			mouseStatus();
@@ -441,7 +441,7 @@ void LogicManager::nodeStepMouse(Event *event) {
 		return;
 	}
 
-	if ((event->flags & 0x20) != 0 && _engine->getOtisManager()->walkingRender() && _engine->_cursorType == 1) {
+	if ((event->flags & kMouseFlagDoubleClick) != 0 && _engine->getOtisManager()->walkingRender() && _engine->_cursorType == kCursorForward) {
 		_engine->getGraphicsManager()->setMouseDrawable(false);
 		_engine->getGraphicsManager()->burstMouseArea();
 		_doubleClickFlag = true;
@@ -481,13 +481,13 @@ void LogicManager::nodeStepMouse(Event *event) {
 						actionLink.left = 1;
 						_engine->_cursorType = _items[getCharacter(foundCharacter).inventoryItem & 0x7F].mnum;
 
-						if ((event->flags & 8) != 0)
+						if ((event->flags & kMouseFlagLeftDown) != 0)
 							send(kCharacterCath, foundCharacter, 1, getCharacter(foundCharacter).inventoryItem & 0x7F);
 					} else if ((getCharacter(foundCharacter).inventoryItem & 0x80) != 0) {
 						actionLink.left = 1;
 						_engine->_cursorType = 15;
 
-						if ((event->flags & 8) != 0)
+						if ((event->flags & kMouseFlagLeftDown) != 0)
 							send(kCharacterCath, foundCharacter, 1, 0);
 					}
 				}
@@ -529,7 +529,7 @@ void LogicManager::nodeStepMouse(Event *event) {
 
 						actionLink.copyFrom(foundLink);
 
-						if ((event->flags & 8) != 0 && !_actionJustPerformed) {
+						if ((event->flags & kMouseFlagLeftDown) != 0 && !_actionJustPerformed) {
 							_actionJustPerformed = true;
 							doAction(&actionLink);
 
@@ -548,7 +548,7 @@ void LogicManager::nodeStepMouse(Event *event) {
 
 							if (!_engine->isDemo() && actionLink.action == 43 &&
 								actionLink.param1 == _globals[kProgressChapter] &&
-								(event->flags & 2) != 0) {
+								(event->flags & kMouseFlagRightButton) != 0) {
 								doF4();
 								return;
 							}
@@ -560,7 +560,7 @@ void LogicManager::nodeStepMouse(Event *event) {
 			} else {
 				_engine->_cursorType = _items[kItemMatch].mnum;
 
-				if ((event->flags & 8) != 0) {
+				if ((event->flags & kMouseFlagLeftDown) != 0) {
 					if (isNight()) {
 						playNIS(kEventCathSmokeNight);
 					} else {
@@ -582,7 +582,7 @@ void LogicManager::nodeStepMouse(Event *event) {
 			}
 		} else {
 			_engine->_cursorType = _items[kItemWhistle].mnum;
-			if ((event->flags & 8) != 0 && !dialogRunning("LIB045")) {
+			if ((event->flags & kMouseFlagLeftDown) != 0 && !dialogRunning("LIB045")) {
 				queueSFX(kCharacterCath, 45, 0);
 
 				if (checkCathDir(kCarGreenSleeping, 26) ||
@@ -706,14 +706,14 @@ void LogicManager::checkInventory(int32 flags) {
 			_isEggHighlighted = true;
 		}
 
-		if ((flags & 8) != 0) {
+		if ((flags & kMouseFlagLeftDown) != 0) {
 			_isEggHighlighted = false;
 			_inventoryFlag1 = false;
 			_inventoryFlag2 = false;
 
 			_engine->getSoundManager()->playSoundFile("LIB039.SND", kSoundTypeMenu | kVolumeFull, 0, 0);
 			_engine->getMenu()->doEgg(true, 0, 0);
-		} else if ((flags & 0x10) != 0 && _engine->_gracePeriodTimer) {
+		} else if ((flags & kMouseFlagRightDown) != 0 && _engine->_gracePeriodTimer) {
 			if (dialogRunning("TIMER"))
 				endDialog("TIMER");
 
@@ -723,7 +723,7 @@ void LogicManager::checkInventory(int32 flags) {
 
 	if (_engine->_cursorX >= 32) {
 		if (_inventoryFlag2) {
-			if ((flags & 1) != 0) {
+			if ((flags & kMouseFlagLeftButton) != 0) {
 				if (_highlightedItem) {
 					int count = 0;
 
@@ -802,7 +802,7 @@ void LogicManager::checkInventory(int32 flags) {
 				_isMagnifierInUse = 1;
 			}
 
-			if ((flags & 8) == 0)
+			if ((flags & kMouseFlagLeftDown) == 0)
 				return;
 
 			if (!_closeUp) {
@@ -834,7 +834,7 @@ void LogicManager::checkInventory(int32 flags) {
 			return;
 		}
 
-		if ((flags & 1) != 0) {
+		if ((flags & kMouseFlagLeftButton) != 0) {
 			int itemToHighlight = _engine->_cursorY / 40;
 			if (_highlightedItem && itemToHighlight != _highlightedItem) {
 				int count = 0;
@@ -981,7 +981,7 @@ void LogicManager::checkInventory(int32 flags) {
 		return;
 	}
 
-	if ((flags & 8) != 0) {
+	if ((flags & kMouseFlagLeftDown) != 0) {
 		_inventoryFlag1 = false;
 		_inventoryFlag2 = true;
 		_engine->getGraphicsManager()->drawItem(_globals[kProgressPortrait] + 1, 0, 0);
@@ -1003,7 +1003,7 @@ void LogicManager::checkInventory(int32 flags) {
 		_engine->getGraphicsManager()->burstBox(0, 0, 32, 32);
 
 		_inventoryFlag1 = true;
-	} else if (_inventoryFlag2 && (flags & 1) == 0) {
+	} else if (_inventoryFlag2 && (flags & kMouseFlagLeftButton) == 0) {
 		if (_inventoryFlag2) {
 			_inventoryFlag2 = false;
 
diff --git a/engines/lastexpress/lastexpress.cpp b/engines/lastexpress/lastexpress.cpp
index 37c81be2bd8..286f39f17d6 100644
--- a/engines/lastexpress/lastexpress.cpp
+++ b/engines/lastexpress/lastexpress.cpp
@@ -481,10 +481,10 @@ bool LastExpressEngine::handleEvents() {
 
 		case Common::EVENT_LBUTTONDOWN:
 			_systemEventLeftMouseDown = true;
-			curFlags |= 1;
+			curFlags |= kMouseFlagLeftButton;
 
 			if (_systemEventRightMouseDown)
-				curFlags |= 2;
+				curFlags |= kMouseFlagRightButton;
 
 			getMessageManager()->addEvent(1, ev.mouse.x, ev.mouse.y, curFlags);
 			break;
@@ -492,17 +492,17 @@ bool LastExpressEngine::handleEvents() {
 			_systemEventLeftMouseDown = false;
 
 			if (_systemEventRightMouseDown)
-				curFlags |= 2;
+				curFlags |= kMouseFlagRightButton;
 
 			getMessageManager()->addEvent(1, ev.mouse.x, ev.mouse.y, curFlags);
 			break;
 
 		case Common::EVENT_RBUTTONDOWN:
 			_systemEventRightMouseDown = true;
-			curFlags |= 2;
+			curFlags |= kMouseFlagRightButton;
 
 			if (_systemEventLeftMouseDown)
-				curFlags |= 1;
+				curFlags |= kMouseFlagLeftButton;
 
 			getMessageManager()->addEvent(1, ev.mouse.x, ev.mouse.y, curFlags);
 			break;
@@ -510,7 +510,7 @@ bool LastExpressEngine::handleEvents() {
 			_systemEventRightMouseDown = false;
 
 			if (_systemEventLeftMouseDown)
-				curFlags |= 1;
+				curFlags |= kMouseFlagLeftButton;
 
 			getMessageManager()->addEvent(1, ev.mouse.x, ev.mouse.y, curFlags);
 			break;
@@ -523,10 +523,10 @@ bool LastExpressEngine::handleEvents() {
 			// works out nicely for them...
 			if (!getLogicManager()->_doubleClickFlag) {
 				if (_systemEventLeftMouseDown)
-					curFlags |= 1;
+					curFlags |= kMouseFlagLeftButton;
 			
 				if (_systemEventRightMouseDown)
-					curFlags |= 2;
+					curFlags |= kMouseFlagRightButton;
 			}
 
 			_systemEventLastMouseCoords.x = ev.mouse.x;
diff --git a/engines/lastexpress/menu/menu.cpp b/engines/lastexpress/menu/menu.cpp
index b70fefaa79f..e5b4f18437b 100644
--- a/engines/lastexpress/menu/menu.cpp
+++ b/engines/lastexpress/menu/menu.cpp
@@ -145,16 +145,16 @@ void Menu::eggMouse(Event *event) {
 		_engine->getGraphicsManager()->burstMouseArea(false); // The original updated the screen, we don't to avoid flickering...
 		_engine->_cursorX = event->x;
 		_engine->_cursorY = event->y;
-		_eggCurrentMouseFlags = (event->flags & 1) != 0;
+		_eggCurrentMouseFlags = (event->flags & kMouseFlagLeftButton) != 0;
 		_engine->_cursorType = 0;
 
 		if (_engine->_doShowCredits) {
-			if ((event->flags & 0x10) != 0) {
+			if ((event->flags & kMouseFlagRightDown) != 0) {
 				setSprite(7, -1, true);
 				_engine->_doShowCredits = false;
 			}
 
-			if ((event->flags & 8) != 0) {
+			if ((event->flags & kMouseFlagLeftDown) != 0) {
 				if (_eggCreditsIndex == _menuSeqs[7]->numFrames - 1) {
 					setSprite(7, -1, true);
 					_engine->_doShowCredits = false;
@@ -174,10 +174,10 @@ void Menu::eggMouse(Event *event) {
 				}
 			}
 
-			if (foundLink != _currentHotspotLink || (event->flags & 8) != 0 || (event->flags & 0x80) != 0) {
+			if (foundLink != _currentHotspotLink || (event->flags & kMouseFlagLeftDown) != 0 || (event->flags & kMouseFlagLeftUp) != 0) {
 				_currentHotspotLink = foundLink;
 
-				if ((event->flags & 0x80) != 0 && !_moveClockHandsFlag && _engine->getClock()->statusClock())
+				if ((event->flags & kMouseFlagLeftUp) != 0 && !_moveClockHandsFlag && _engine->getClock()->statusClock())
 					_engine->getVCR()->stop();
 
 				if (foundLink) {
@@ -259,7 +259,7 @@ bool Menu::eggCursorAction(int8 action, int8 flags) {
 			return true;
 		}
 
-		if ((flags & 8) != 0) {
+		if ((flags & kMouseFlagLeftDown) != 0) {
 			setSprite(1, 6, true);
 			setSprite(0, -1, true);
 
@@ -278,7 +278,7 @@ bool Menu::eggCursorAction(int8 action, int8 flags) {
 
 			return true;
 		} else {
-			if ((flags & 0x80) != 0)
+			if ((flags & kMouseFlagLeftUp) != 0)
 				return true;
 
 			setSprite(1, 5, true);
@@ -289,7 +289,7 @@ bool Menu::eggCursorAction(int8 action, int8 flags) {
 	case kMenuActionQuit:
 		setSprite(0, 12, true);
 
-		if ((flags & 8) != 0) {
+		if ((flags & kMouseFlagLeftDown) != 0) {
 			setSprite(2, 11, true);
 
 			_engine->getSoundManager()->killAllSlots();
@@ -326,7 +326,7 @@ bool Menu::eggCursorAction(int8 action, int8 flags) {
 				return true;
 			}
 
-			if ((flags & 8) != 0)
+			if ((flags & kMouseFlagLeftDown) != 0)
 				_engine->_currentSavePoint = 0;
 		}
 
@@ -353,7 +353,7 @@ bool Menu::eggCursorAction(int8 action, int8 flags) {
 				}
 			}
 
-			if ((flags & 8) == 0)
+			if ((flags & kMouseFlagLeftDown) == 0)
 				return true;
 
 			_engine->getLogicManager()->loadTrain(whichCD);
@@ -399,7 +399,7 @@ bool Menu::eggCursorAction(int8 action, int8 flags) {
 				setSprite(0, whichCD - 1, true);
 			}
 
-			if ((flags & 8) == 0)
+			if ((flags & kMouseFlagLeftDown) == 0)
 				return true;
 
 			if (!_engine->getArchiveManager()->lockCD(whichCD))
@@ -495,15 +495,14 @@ bool Menu::eggCursorAction(int8 action, int8 flags) {
 		}
 
 		if (_engine->isDemo()) {
-			// Demo: simplified implementation
-			if ((flags & 0x88) != 0)
+			if ((flags & (kMouseFlagLeftDown | kMouseFlagLeftUp)) != 0)
 				return true;
 
 			setSprite(3, 0, true);
 			setSprite(0, 7, true);
 			return true;
 		} else {
-			if ((flags & 8) != 0) {
+			if ((flags & kMouseFlagLeftDown) != 0) {
 				setSprite(3, 1, true);
 				setSprite(0, -1, true);
 
@@ -515,7 +514,7 @@ bool Menu::eggCursorAction(int8 action, int8 flags) {
 				return true;
 			}
 
-			if ((flags & 0x80) != 0)
+			if ((flags & kMouseFlagLeftUp) != 0)
 				return true;
 
 			setSprite(3, 0, true);
@@ -559,8 +558,8 @@ bool Menu::eggCursorAction(int8 action, int8 flags) {
 			return true;
 		}
 
-		if ((flags & 1) != 0) {
-			if ((flags & 8) == 0)
+		if ((flags & kMouseFlagLeftButton) != 0) {
+			if ((flags & kMouseFlagLeftDown) == 0)
 				return true;
 
 			if (_engine->getClock()->statusClock())
@@ -581,7 +580,7 @@ bool Menu::eggCursorAction(int8 action, int8 flags) {
 		} else {
 			setSprite(1, 1, true);
 
-			if ((flags & 0x80) == 0)
+			if ((flags & kMouseFlagLeftUp) == 0)
 				setSprite(0, 34, true);
 		}
 
@@ -597,8 +596,8 @@ bool Menu::eggCursorAction(int8 action, int8 flags) {
 			return true;
 		}
 
-		if ((flags & 1) != 0) {
-			if ((flags & 8) == 0)
+		if ((flags & kMouseFlagLeftButton) != 0) {
+			if ((flags & kMouseFlagLeftDown) == 0)
 				return true;
 
 			if (_engine->getClock()->statusClock())
@@ -619,7 +618,7 @@ bool Menu::eggCursorAction(int8 action, int8 flags) {
 		} else {
 			setSprite(1, 3, true);
 
-			if ((flags & 0x80) == 0)
+			if ((flags & kMouseFlagLeftUp) == 0)
 				setSprite(0, 33, true);
 		}
 
@@ -634,13 +633,13 @@ bool Menu::eggCursorAction(int8 action, int8 flags) {
 
 		if (_engine->isDemo()) {
 			// Demo doesn't implement time seeking...
-			if ((flags & 0x88) != 0)
+			if ((flags & (kMouseFlagLeftDown | kMouseFlagLeftUp)) != 0)
 				return true;
 
 			setSprite(0, 13, true);
 			return true;
 		} else {
-			if ((flags & 8) != 0) {
+			if ((flags & kMouseFlagLeftDown) != 0) {
 				setSprite(0, -1, true);
 
 				_engine->getLogicManager()->playDialog(0, "LIB046", -1, 0);
@@ -650,7 +649,7 @@ bool Menu::eggCursorAction(int8 action, int8 flags) {
 				return true;
 			}
 
-			if ((flags & 0x80) != 0)
+			if ((flags & kMouseFlagLeftUp) != 0)
 				return true;
 
 			setSprite(0, 13, true);
@@ -667,7 +666,7 @@ bool Menu::eggCursorAction(int8 action, int8 flags) {
 
 		if (_engine->isDemo()) {
 			// Demo doesn't implement time seeking...
-			if ((flags & 0x88) != 0)
+			if ((flags & (kMouseFlagLeftDown | kMouseFlagLeftUp)) != 0)
 				return true;
 
 			if (_engine->getClock()->getTimeShowing() <= 1490400) {
@@ -678,7 +677,7 @@ bool Menu::eggCursorAction(int8 action, int8 flags) {
 
 			return true;
 		} else {
-			if ((flags & 8) != 0) {
+			if ((flags & kMouseFlagLeftDown) != 0) {
 				setSprite(0, -1, true);
 
 				_engine->getLogicManager()->playDialog(0, "LIB046", -1, 0);
@@ -688,7 +687,7 @@ bool Menu::eggCursorAction(int8 action, int8 flags) {
 				return true;
 			}
 
-			if ((flags & 0x80) != 0)
+			if ((flags & kMouseFlagLeftUp) != 0)
 				return true;
 
 			if (_engine->getClock()->getTimeShowing() <= 1490400) {
@@ -709,7 +708,7 @@ bool Menu::eggCursorAction(int8 action, int8 flags) {
 
 		if (_engine->isDemo()) {
 			// Demo doesn't implement time seeking...
-			if ((flags & 0x88) != 0)
+			if ((flags & (kMouseFlagLeftDown | kMouseFlagLeftUp)) != 0)
 				return true;
 
 			if (_engine->getClock()->getTimeShowing() <= 1852200) {
@@ -720,7 +719,7 @@ bool Menu::eggCursorAction(int8 action, int8 flags) {
 
 			return true;
 		} else {
-			if ((flags & 8) != 0) {
+			if ((flags & kMouseFlagLeftDown) != 0) {
 				setSprite(0, -1, true);
 
 				_engine->getLogicManager()->playDialog(0, "LIB046", -1, 0);
@@ -730,7 +729,7 @@ bool Menu::eggCursorAction(int8 action, int8 flags) {
 				return true;
 			}
 
-			if ((flags & 0x80) != 0)
+			if ((flags & kMouseFlagLeftUp) != 0)
 				return true;
 
 			if (_engine->getClock()->getTimeShowing() <= 1852200) {
@@ -754,7 +753,7 @@ bool Menu::eggCursorAction(int8 action, int8 flags) {
 
 		setCity(3);
 
-		if ((flags & 8) != 0) {
+		if ((flags & kMouseFlagLeftDown) != 0) {
 			setSprite(0, -1, true);
 
 			_engine->getLogicManager()->playDialog(0, "LIB046", -1, 0);
@@ -764,7 +763,7 @@ bool Menu::eggCursorAction(int8 action, int8 flags) {
 			return true;
 		}
 
-		if ((flags & 0x80) != 0)
+		if ((flags & kMouseFlagLeftUp) != 0)
 			return true;
 
 		if (_engine->getClock()->getTimeShowing() <= 2268000) {
@@ -787,7 +786,7 @@ bool Menu::eggCursorAction(int8 action, int8 flags) {
 
 		setCity(4);
 
-		if ((flags & 8) != 0) {
+		if ((flags & kMouseFlagLeftDown) != 0) {
 			setSprite(0, -1, true);
 
 			_engine->getLogicManager()->playDialog(0, "LIB046", -1, 0);
@@ -797,7 +796,7 @@ bool Menu::eggCursorAction(int8 action, int8 flags) {
 			return true;
 		}
 
-		if ((flags & 0x80) != 0)
+		if ((flags & kMouseFlagLeftUp) != 0)
 			return true;
 
 		if (_engine->getClock()->getTimeShowing() <= 2551500) {
@@ -820,7 +819,7 @@ bool Menu::eggCursorAction(int8 action, int8 flags) {
 
 		setCity(5);
 
-		if ((flags & 8) != 0) {
+		if ((flags & kMouseFlagLeftDown) != 0) {
 			setSprite(0, -1, true);
 
 			_engine->getLogicManager()->playDialog(0, "LIB046", -1, 0);
@@ -830,7 +829,7 @@ bool Menu::eggCursorAction(int8 action, int8 flags) {
 			return true;
 		}
 
-		if ((flags & 0x80) != 0)
+		if ((flags & kMouseFlagLeftUp) != 0)
 			return true;
 
 		if (_engine->getClock()->getTimeShowing() <= 2952000) {
@@ -853,7 +852,7 @@ bool Menu::eggCursorAction(int8 action, int8 flags) {
 
 		setCity(6);
 
-		if ((flags & 8) != 0) {
+		if ((flags & kMouseFlagLeftDown) != 0) {
 			setSprite(0, -1, true);
 
 			_engine->getLogicManager()->playDialog(0, "LIB046", -1, 0);
@@ -863,7 +862,7 @@ bool Menu::eggCursorAction(int8 action, int8 flags) {
 			return true;
 		}
 
-		if ((flags & 0x80) != 0)
+		if ((flags & kMouseFlagLeftUp) != 0)
 			return true;
 
 		setSprite(0, 24, true);
@@ -883,7 +882,7 @@ bool Menu::eggCursorAction(int8 action, int8 flags) {
 
 		setSprite(0, 9, true);
 
-		if ((flags & 8) == 0) {
+		if ((flags & kMouseFlagLeftDown) == 0) {
 			setSprite(2, 1, true);
 			return true;
 		}
@@ -922,7 +921,7 @@ bool Menu::eggCursorAction(int8 action, int8 flags) {
 		} else {
 			setSprite(0, 8, true);
 
-			if ((flags & 8) != 0) {
+			if ((flags & kMouseFlagLeftDown) != 0) {
 				if (_engine->isDemo()) {
 					_engine->getSoundManager()->playSoundFile("LIB046.SND", 16, 0, 0);
 				} else {
@@ -963,7 +962,7 @@ bool Menu::eggCursorAction(int8 action, int8 flags) {
 
 		setSprite(0, 11, true);
 
-		if ((flags & 8) == 0) {
+		if ((flags & kMouseFlagLeftDown) == 0) {
 			setSprite(2, 6, true);
 			return true;
 		}
@@ -1014,7 +1013,7 @@ bool Menu::eggCursorAction(int8 action, int8 flags) {
 			} else {
 				setSprite(0, 10, true);
 
-				if ((flags & 8) != 0) {
+				if ((flags & kMouseFlagLeftDown) != 0) {
 					setSprite(2, 9, true);
 
 					if (_engine->isDemo()) {
diff --git a/engines/lastexpress/shared.h b/engines/lastexpress/shared.h
index 48c184f3f5c..79ad830d0f7 100644
--- a/engines/lastexpress/shared.h
+++ b/engines/lastexpress/shared.h
@@ -175,6 +175,16 @@ enum SoundDriverFlag : uint {
 	kSoundDriverStarted              = 0x8000
 };
 
+enum MouseFlags : int {
+	kMouseFlagLeftButton  = 0x1,
+	kMouseFlagRightButton = 0x2,
+	kMouseFlagLeftDown    = 0x8,
+	kMouseFlagRightDown   = 0x10,
+	kMouseFlagDoubleClick = 0x20,
+	kMouseFlagLeftUp      = 0x80,
+	kMouseFlagRightUp     = 0x100
+};
+
 enum NisFlags : uint {
 	kNisFlagHasSound            = 0x1,     // Set when a valid NIS sound exists
 	kNisFlagDataChunksAvailable = 0x100,   // Used during initialization and chunk loading


Commit: 4bcec43eae8d25e4466d055adbe1b62736ade13b
    https://github.com/scummvm/scummvm/commit/4bcec43eae8d25e4466d055adbe1b62736ade13b
Author: AndywinXp (andywinxp at gmail.com)
Date: 2025-06-16T23:12:18+02:00

Commit Message:
LASTEXPRESS: Remove "imgui" flag from required engine components

Changed paths:
    engines/lastexpress/configure.engine


diff --git a/engines/lastexpress/configure.engine b/engines/lastexpress/configure.engine
index debb4b3f111..fd666b98b55 100644
--- a/engines/lastexpress/configure.engine
+++ b/engines/lastexpress/configure.engine
@@ -1,3 +1,3 @@
 # This file is included from the main "configure" script
 # add_engine [name] [desc] [build-by-default] [subengines] [base games] [deps] [components]
-add_engine lastexpress "The Last Express" no "" "" "imgui 16bit highres"
+add_engine lastexpress "The Last Express" no "" "" "16bit highres"




More information about the Scummvm-git-logs mailing list