/* ScummVM - Graphic Adventure Engine
 *
 * ScummVM is the legal property of its developers, whose names
 * are too numerous to list here. Please refer to the COPYRIGHT
 * file distributed with this source distribution.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 *
 */

#ifndef LASTEXPRESS_SHARED_H
#define LASTEXPRESS_SHARED_H

#include "common/func.h"

namespace LastExpress {

//////////////////////////////////////////////////////////////////////////
// Sound
//////////////////////////////////////////////////////////////////////////

enum SoundTag {
	kSoundTagNone        = 0,
	kSoundTagAmbient     = 1,
	kSoundTagOldAmbient  = 2,
	kSoundTagWalla       = 3,
	kSoundTagOldWalla    = 4,
	kSoundTagConcert     = 5,
	// 6 is unused
	kSoundTagLink        = 7,
	kSoundTagOldLink     = 8,
	kSoundTagNIS         = 9,
	kSoundTagOldNIS      = 10,
	kSoundTagIntro       = 11,
	// 12 is unused
	kSoundTagMenu        = 13,
	kSoundTagOldMenu     = 14,
	kSoundTagCredits     = 15,
	kSoundTagFirstNormal = 16
	// every normal sound gets its own tag from an incrementing counter
	// initialized as kSoundTagFirstNormal,
	// so tags can have values not covered by this enum
};

/*
    These are the flags used by the original game
    to keep track of sound entry status.

    They are directly exposed via savefiles,
    so we should be aware of them
    even though we don't use some of them internally.

    Sound playback is asynchronous.
    We have threads and mutexes for synchronization,
    DOS games have main code and IRQ/interrupt handlers instead,
    some flags come in pairs to deal with this:
    the main code sets kSoundFlagXxxRequested as a signal
    to the interrupt handler, the interrupt handler processes it
    (e.g. stops using the associated buffer for Close and Mute requests)
    and sets the corresponding result flag. The main code can proceed then
    (e.g. release the associated buffer).

    The original game has a limited number of sound buffers (namely, 6)
    (plus 16 versions of ADPCM decoder in assembly language,
    one for every non-zero volume, so I suppose the performance was an issue).
    The original game has also many events that could happen in different areas
    of the train at the same time, some of them are synchronized via the sound
    (kActionEndSound). To deal with it, the original game uses kSoundFlagMute:
    muted sounds don't have their own buffer, don't participate in mixing the channels,
    but the interrupt handler still tracks their progress.
    Non-audible sounds (e.g. because the corresponding event goes on in another car)
    are always muted; if the number of audible sounds exceeds the number of buffers,
    least-priority sounds are muted as well (the priority is the sum of a static
    constant from the entry constructor and the current volume).

    Normally the sound duration is read from (one of the fields
    in the header of) the associated file. However, if the sound entry
    is started as muted, the buffer is not allocated and no data are read;
    in this case, the duration is estimated from file size.
    Since HPF archives store all sizes as counts of 0x800-byte blocks,
    this loses some precision, but nothing to really care about.
    If a started-as-muted sound is unmuted later (Cath enters the car
    where a dialog takes place), the exact duration is loaded from the file;
    kSoundFlagHeaderProcessed says that the duration is exact.

    We have more sound channels available, we are not so limited
    by the performance, and we lose some control of how exactly the backend
    processes the sound as a payment for portability, so we can afford
    to just mix the silence without special processing of muted entries.
*/
enum SoundFlag {
	kSoundVolumeEntityDefault = 0xFFFFFFFF, // special value for SoundManager::playSound; choose volume based on distance to the entity

	kVolumeNone               = 0x0,
	kVolume1                  = 0x1,
	kVolume2                  = 0x2,
	kVolume3                  = 0x3,
	kVolume4                  = 0x4,
	kVolume5                  = 0x5,
	kVolume6                  = 0x6,
	kVolume7                  = 0x7,
	kVolume8                  = 0x8,
	kVolume9                  = 0x9,
	kVolume10                 = 0xA,
	kVolume11                 = 0xB,
	kVolume12                 = 0xC,
	kVolume13                 = 0xD,
	kVolume14                 = 0xE,
	kVolume15                 = 0xF,
	kVolumeFull               = 0x10,

	kSoundVolumeMask          = 0x1F,

	kSoundFlagPlayRequested   = 0x20,
	kSoundFlagPlaying         = 0x40, // IRQ handler has seen kSoundFlagPlayRequested and has started the playback
	kSoundFlagMuteRequested   = 0x80,
	kSoundFlagMuteProcessed   = 0x100, // IRQ handler has seen kSoundFlagMuteRequested
	kSoundFlagMute            = kSoundFlagMuteRequested | kSoundFlagMuteProcessed,
	kSoundFlagCloseRequested  = 0x200, // close requested, waiting for IRQ handler to confirm
	kSoundFlagClosed          = 0x400, // IRQ handler has seen kSoundFlagClosing and is completely done with this sound
	kSoundFlagCloseOnDataEnd  = 0x800, // used as the opposite of kSoundFlagLooped
	kSoundFlagLooped          = 0x1000,
	kSoundFlagCyclicBuffer    = 0x2000, // when the decoder reaches the end of buffer, the decoder should continue from the beginning of buffer
	kSoundFlagHasUnreadData   = 0x4000, // stream has more data
	kSoundFlagDelayedActivate = 0x8000, // start playing at _activateTime
	kSoundFlagHasLinkAfter    = 0x10000, // _linkAfter is valid and should be activated after this sound; used by xxx.NIS sounds for xxx.LNK
	kSoundFlagHasSubtitles    = 0x20000,
	kSoundFlagPaused          = 0x40000, // IRQ handler has seen kSoundFlagPauseRequested and does not use the buffer anymore
	kSoundFlagFixedVolume     = 0x80000, // Turns off the logic of volume adjusting for entity-related sounds when distance to entity is changed
	kSoundFlagVolumeChanging  = 0x100000, // smooth changing of the volume is in progress
	kSoundFlagHeaderProcessed = 0x200000, // count of blocks is the accurate value from the header
	kSoundFlagPauseRequested  = 0x400000, // used when the reader needs to change the buffer
	kSoundFlagDecodeStall     = 0x800000, // the decoder has stopped because the reader is too slow and has not yet provided further data

	kSoundTypeNormal          = 0x0000000, // everything not included in any specific category
	kSoundTypeAmbient         = 0x1000000, // train sounds, steam, wind, restaurant sounds
	kSoundTypeConcert         = 0x2000000, // 1917.LNK
	kSoundTypeMenu            = 0x3000000, // menu screen, blinking egg after time travel; excluded from savefiles
	kSoundTypeLink            = 0x4000000, // xxx.LNK linked after NIS sound, except for 1917.LNK
	kSoundTypeIntro           = 0x5000000, // intro at game start before showing the menu
	kSoundTypeWalla           = 0x6000000, // LOOP8A.SND by kEntityTables2
	kSoundTypeNIS             = 0x7000000, // special entry managed by NIS code

	kSoundTypeMask            = 0x7000000,

	kSoundFlagKeepAfterFinish = 0x8000000, // don't free the entry when it has stopped playing; used for kSoundTypeNIS
	kSoundFlagDecodeError     = 0x20000000, // error in compressed stream
	kSoundFlagFading          = 0x40000000, // prevents attempts to unfade once fade is requested
	kSoundFlagUnmuteRequested = 0x80000000  // purely informational
};

enum AmbientSoundState {
	kAmbientSoundEnabled  = 1,
	kAmbientSoundSteam    = 2
};

//////////////////////////////////////////////////////////////////////////
// Time values
//////////////////////////////////////////////////////////////////////////

// Time is measured in ticks, with 15 ticks per second. One minute is 900
// ticks, one hour is 54,000 ticks, and one day is 1,296,000 ticks.

enum TimeValue {
	kTimeNone                 = 0,
	kTime5933                 = 5933,

	kTimeCityParis            = 1037700,	// Day 1, 19:13
	kTime1039500              = 1039500,	// Day 1, 19:15
	kTimeStartGame            = 1061100,	// Day 1, 19:39

	// Chapter 1
	kTimeChapter1             = 1062000,	// Day 1, 19:40
	kTime1071000              = 1071000,	// Day 1, 19:50
	kTimeParisEpernay         = 1075500,	// Day 1, 19:55
	kTime1080000              = 1080000,	// Day 1, 20:00
	kTime1084500              = 1084500,	// Day 1, 20:05
	kTime1089000              = 1089000,	// Day 1, 20:10
	kTime1093500              = 1093500,	// Day 1, 20:15
	kTime1094400              = 1094400,	// Day 1, 20:16
	kTime1096200              = 1096200,	// Day 1, 20:18
	kTime1098000              = 1098000,	// Day 1, 20:20
	kTime1102500              = 1102500,	// Day 1, 20:25
	kTime1107000              = 1107000,	// Day 1, 20:30
	kTime1111500              = 1111500,	// Day 1, 20:35
	kTime1120500              = 1120500,	// Day 1, 20:45
	kTime1125000              = 1125000,	// Day 1, 20:50
	kTime1134000              = 1134000,	// Day 1, 21:00
	kTime1138500              = 1138500,	// Day 1, 21:05
	kTime1143000              = 1143000,	// Day 1, 21:10
	kTimeEnterEpernay         = 1147500,	// Day 1, 21:15
	kTimeCityEpernay          = 1148400,	// Day 1, 21:16
	kTimeExitEpernay          = 1150200,	// Day 1, 21:18
	kTime1156500              = 1156500,	// Day 1, 21:25
	kTime1161000              = 1161000,	// Day 1, 21:30
	kTime1162800              = 1162800,	// Day 1, 21:32
	kTime1165500              = 1165500,	// Day 1, 21:35
	kTime1167300              = 1167300,	// Day 1, 21:37
	kTimeEnterChalons         = 1170000,	// Day 1, 21:40
	kTimeCityChalons          = 1170900,	// Day 1, 21:41
	kTimeExitChalons          = 1173600,	// Day 1, 21:44
	kTime1174500              = 1174500,	// Day 1, 21:45
	kTime1179000              = 1179000,	// Day 1, 21:50
	kTime1183500              = 1183500,	// Day 1, 21:55
	kTime1184400              = 1184400,	// Day 1, 21:56
	kTime1188000              = 1188000,	// Day 1, 22:00
	kTime1189800              = 1189800,	// Day 1, 22:02
	kTime1192500              = 1192500,	// Day 1, 22:05
	kTime1197000              = 1197000,	// Day 1, 22:10
	kTime1201500              = 1201500,	// Day 1, 22:15
	kTime1206000              = 1206000,	// Day 1, 22:20
	kTime1215000              = 1215000,	// Day 1, 22:30
	kTime1224000              = 1224000,	// Day 1, 22:40
	kTime1225800              = 1225800,	// Day 1, 22:42
	kTimeCityBarLeDuc         = 1228500,	// Day 1, 22:45
	kTimeExitBarLeDuc         = 1231200,	// Day 1, 22:48
	kTime1233000              = 1233000,	// Day 1, 22:50
	kTime1242000              = 1242000,	// Day 1, 23:00
	kTime1260000              = 1260000,	// Day 1, 23:20
	kTimeCityNancy            = 1303200,	// Day 2, 00:08
	kTimeExitNancy            = 1307700,	// Day 2, 00:13
	kTime1323000              = 1323000,	// Day 2, 00:30
	kTimeCityLuneville        = 1335600,	// Day 2, 00:44
	kTimeExitLuneville        = 1338300,	// Day 2, 00:47
	kTimeCityAvricourt        = 1359900,	// Day 2, 01:11
	kTimeExitAvricourt        = 1363500,	// Day 2, 01:15
	kTimeCityDeutschAvricourt = 1367100,	// Day 2, 01:19
	kTimeExitDeutschAvricourt = 1370700,	// Day 2, 01:23
	kTime1386000              = 1386000,	// Day 2, 01:40
	kTimeBedTime              = 1404000,	// Day 2, 02:00
	kTime1417500              = 1417500,	// Day 2, 02:15
	kTimeEnterStrasbourg      = 1424700,	// Day 2, 02:23
	kTime1449000              = 1449000,	// Day 2, 02:50
	kTime1458000              = 1458000,	// Day 2, 03:00
	kTime1485000              = 1485000,	// Day 2, 03:30
	kTime1489500              = 1489500,	// Day 2, 03:35
	kTimeCityStrasbourg       = 1490400,	// Day 2, 03:36
	kTime1492200              = 1492200,	// Day 2, 03:38
	kTimeExitStrasbourg       = 1493100,	// Day 2, 03:39
	kTimeChapter1End          = 1494000,	// Day 2, 03:40
	kTime1503000              = 1503000,	// Day 2, 03:50
	kTime1512000              = 1512000,	// Day 2, 04:00
	kTimeCityBadenOos         = 1539000,	// Day 2, 04:30
	kTimeExitBadenOos         = 1541700,	// Day 2, 04:33
	kTimeCityKarlsruhe        = 1563300,	// Day 2, 04:57
	kTimeCityStuttgart        = 1656000,	// Day 2, 06:40
	kTimeChapter1End2         = 1647000,	// Day 2, 06:30
	kTimeChapter1End3         = 1674000,	// Day 2, 07:00
	kTimeCityGeislingen       = 1713600,	// Day 2, 07:44
	kTime1714500              = 1714500,	// Day 2, 07:45
	kTimeCityUlm              = 1739700,	// Day 2, 08:13

	// Chapter 2
	kTimeChapter2             = 1750500,	// Day 2, 08:25
	kTime1759500              = 1759500,	// Day 2, 08:35
	kTime1755000              = 1755000,	// Day 2, 08:30
	kTime1764000              = 1764000,	// Day 2, 08:40
	kTime1768500              = 1768500,	// Day 2, 08:45
	kTime1773000              = 1773000,	// Day 2, 08:50
	kTime1777500              = 1777500,	// Day 2, 08:55
	kTime1782000              = 1782000,	// Day 2, 09:00
	kTime1786500              = 1786500,	// Day 2, 09:05
	kTime1791000              = 1791000,	// Day 2, 09:10
	kTime1800000              = 1800000,	// Day 2, 09:20
	kTime1801800              = 1801800,	// Day 2, 09:22
	kTime1806300              = 1806300,	// Day 2, 09:27
	kTime1809000              = 1809000,	// Day 2, 09:30
	kTimeCityAugsburg         = 1809900,	// Day 2, 09:31
	kTime1813500              = 1813500,	// Day 2, 09:35
	kTime1818000              = 1818000,	// Day 2, 09:40
	kTime1818900              = 1818900,	// Day 2, 09:41
	kTime1820700              = 1820700,	// Day 2, 09:43
	kTime1822500              = 1822500,	// Day 2, 09:45
	kTime1827000              = 1827000,	// Day 2, 09:50
	kTime1831500              = 1831500,	// Day 2, 09:55
	kTime1836000              = 1836000,	// Day 2, 10:00
	kTime1845000              = 1845000,	// Day 2, 10:10
	kTime1849500              = 1849500,	// Day 2, 10:15
	kTimeCityMunich           = 1852200,	// Day 2, 10:18

	// Chapter 3
	kTimeChapter3             = 1944000,	// Day 2, 12:00
	kTime1953000              = 1953000,	// Day 2, 12:10
	kTime1966500              = 1966500,	// Day 2, 12:25
	kTime1969200              = 1969200,	// Day 2, 12:28
	kTime1971000              = 1971000,	// Day 2, 12:30
	kTimeEnterSalzbourg       = 1982700,	// Day 2, 12:43
	kTime1983600              = 1983600,	// Day 2, 12:44
	kTimeCitySalzbourg        = 1984500,	// Day 2, 12:45
	kTime1989000              = 1989000,	// Day 2, 12:50
	kTimeExitSalzbourg        = 1989900,	// Day 2, 12:51
	kTime1993500              = 1993500,	// Day 2, 12:55
	kTime1998000              = 1998000,	// Day 2, 13:00
	kTime2002500              = 2002500,	// Day 2, 13:05
	kTime2011500              = 2011500,	// Day 2, 13:15
	kTime2016000              = 2016000,	// Day 2, 13:20
	kTime2020500              = 2020500,	// Day 2, 13:25
	kTime2025000              = 2025000,	// Day 2, 13:30
	kTime2034000              = 2034000,	// Day 2, 13:40
	kTime2038500              = 2038500,	// Day 2, 13:45
	kTime2040300              = 2040300,	// Day 2, 13:47
	kTime2043000              = 2043000,	// Day 2, 13:50
	kTimeEnterAttnangPuchheim = 2047500,	// Day 2, 13:55
	kTimeCityAttnangPuchheim  = 2049300,	// Day 2, 13:57
	kTime2052000              = 2052000,	// Day 2, 14:00
	kTimeExitAttnangPuchheim  = 2052900,	// Day 2, 14:01
	kTime2056500              = 2056500,	// Day 2, 14:05
	kTime2061000              = 2061000,	// Day 2, 14:10
	kTime2062800              = 2062800,	// Day 2, 14:12
	kTime2065500              = 2065500,	// Day 2, 14:15
	kTime2070000              = 2070000,	// Day 2, 14:20
	kTimeEnterWels            = 2073600,	// Day 2, 14:24
	kTimeCityWels             = 2075400,	// Day 2, 14:26
	kTime2079000              = 2079000,	// Day 2, 14:30
	kTimeExitWels             = 2079900,	// Day 2, 14:31
	kTime2083500              = 2083500,	// Day 2, 14:35
	kTime2088000              = 2088000,	// Day 2, 14:40
	kTime2088900              = 2088900,	// Day 2, 14:41
	kTime2092500              = 2092500,	// Day 2, 14:45
	kTime2097000              = 2097000,	// Day 2, 14:50
	kTimeEnterLinz            = 2099700,	// Day 2, 14:53
	kTimeCityLinz             = 2101500,	// Day 2, 14:55
	kTimeExitLinz             = 2105100,    // Day 2, 14:59
	kTime2106000              = 2106000,	// Day 2, 15:00
	kTime2110500              = 2110500,	// Day 2, 15:05
	kTime2115000              = 2115000,	// Day 2, 15:10
	kTime2117700              = 2117700,	// Day 2, 15:13
	kTime2119500              = 2119500,	// Day 2, 15:15
	kTime2124000              = 2124000,	// Day 2, 15:20
	kTime2133000              = 2133000,	// Day 2, 15:30
	kTime2138400              = 2138400,	// Day 2, 15:36
	kTime2142000              = 2142000,	// Day 2, 15:40
	kTime2146500              = 2146500,	// Day 2, 15:45
	kTime2147400              = 2147400,	// Day 2, 15:46
	kTime2151000              = 2151000,	// Day 2, 15:50
	kTimeCityAmstetten        = 2154600,	// Day 2, 15:54
	kTime2155500              = 2155500,	// Day 2, 15:55
	kTime2160000              = 2160000,	// Day 2, 16:00
	kTime2169000              = 2169000,	// Day 2, 16:10
	kTime2173500              = 2173500,	// Day 2, 16:15
	kTime2187000              = 2187000,	// Day 2, 16:30
	kTime2182500              = 2182500,	// Day 2, 16:25
	kTime2196000              = 2196000,	// Day 2, 16:40
	kTime2200500              = 2200500,	// Day 2, 16:45
	kTime2205000              = 2205000,	// Day 2, 16:50
	kTime2214000              = 2214000,	// Day 2, 17:00
	kTime2218500              = 2218500,	// Day 2, 17:05
	kTime2223000              = 2223000,	// Day 2, 17:10
	kTime2227500              = 2227500,	// Day 2, 17:15
	kTime2241000              = 2241000,	// Day 2, 17:30
	kTime2248200              = 2248200,	// Day 2, 17:38
	kTime2250000              = 2250000,	// Day 2, 17:40
	kTime2254500              = 2254500,	// Day 2, 17:45
	kTime2259000              = 2259000,	// Day 2, 17:50
	kTime2263500              = 2263500,	// Day 2, 17:55
	kTime2266200              = 2266200,	// Day 2, 17:58
	kTimeCityVienna           = 2268000,	// Day 2, 18:00

	// Chapter 4
	kTime2349000              = 2349000,	// Day 2, 19:30
	kTimeChapter4             = 2353500,	// Day 2, 19:35
	kTime2354400              = 2354400,	// Day 2, 19:36
	kTime2356200              = 2356200,	// Day 2, 19:38
	kTime2358000              = 2358000,	// Day 2, 19:40
	kTime2360700              = 2360700,	// Day 2, 19:43
	kTime2362500              = 2362500,	// Day 2, 19:45
	kTime2361600              = 2361600,	// Day 2, 19:44
	kTime2367000              = 2367000,	// Day 2, 19:50
	kTime2370600              = 2370600,	// Day 2, 19:54
	kTime2378700              = 2378700,	// Day 2, 20:03
	kTimeEnterPoszony         = 2381400,	// Day 2, 20:06
	kTimeCityPoszony          = 2383200,	// Day 2, 20:08
	kTime2385000              = 2385000,	// Day 2, 20:10
	kTimeExitPoszony          = 2386800,	// Day 2, 20:12
	kTime2389500              = 2389500,	// Day 2, 20:15
	kTime2394000              = 2394000,	// Day 2, 20:20
	kTime2398500              = 2398500,	// Day 2, 20:25
	kTime2403000              = 2403000,	// Day 2, 20:30
	kTime2407500              = 2407500,	// Day 2, 20:35
	kTime2410200              = 2410200,	// Day 2, 20:38
	kTime2412000              = 2412000,	// Day 2, 20:40
	kTime2414700              = 2414700,	// Day 2, 20:43
	kTime2415600              = 2415600,	// Day 2, 20:44
	kTimeEnterGalanta         = 2416500,	// Day 2, 20:45
	kTimeCityGalanta          = 2418300,	// Day 2, 20:47
	kTime2421000              = 2421000,	// Day 2, 20:50
	kTimeExitGalanta          = 2421900,	// Day 2, 20:51
	kTime2422800              = 2422800,	// Day 2, 20:52
	kTime2428200              = 2428200,	// Day 2, 20:58
	kTime2425500              = 2425500,	// Day 2, 20:55
	kTime2430000              = 2430000,	// Day 2, 21:00
	kTime2434500              = 2434500,	// Day 2, 21:05
	kTime2439000              = 2439000,	// Day 2, 21:10
	kTime2443500              = 2443500,	// Day 2, 21:15
	kTime2448000              = 2448000,	// Day 2, 21:20
	kTime2452500              = 2452500,	// Day 2, 21:25
	kTime2455200              = 2455200,	// Day 2, 21:28
	kTime2457000              = 2457000,	// Day 2, 21:30
	kTime2466000              = 2466000,	// Day 2, 21:40
	kTime2470500              = 2470500,	// Day 2, 21:45
	kTime2475000              = 2475000,	// Day 2, 21:50
	kTime2479500              = 2479500,	// Day 2, 21:55
	kTime2484000              = 2484000,	// Day 2, 22:00
	kTime2488500              = 2488500,	// Day 2, 22:05
	kTime2493000              = 2493000,	// Day 2, 22:10
	kTime2506500              = 2506500,	// Day 2, 22:25
	kTime2507400              = 2507400,	// Day 2, 22:26
	kTime2511000              = 2511000,	// Day 2, 22:30
	kTime2511900              = 2511900,	// Day 2, 22:31
	kTime2517300              = 2517300,	// Day 2, 22:37
	kTime2519100              = 2519100,	// Day 2, 22:39
	kTime2520000              = 2520000,	// Day 2, 22:40
	kTime2533500              = 2533500,	// Day 2, 22:55
	kTime2535300              = 2535300,	// Day 2, 22:57
	kTime2538000              = 2538000,	// Day 2, 23:00
	kTimeCityBudapest         = 2551500,	// Day 2, 23:15

	// Chapter 5
	kTimeChapter5             = 2844000,	// Day 3, 04:40
	kTimeTrainStopped         = 2898000,	// Day 3, 05:40
	kTime2907000              = 2907000,	// Day 3, 05:50
	kTime2916000              = 2916000,	// Day 3, 06:00
	kTime2934000              = 2934000,    // Day 3, 06:20
	kTimeTrainStopped2        = 2943000,	// Day 3, 06:30
	kTime2949300              = 2949300,    // Day 3, 06:37
	kTimeCityBelgrade         = 2952000,	// Day 3, 06:40
	kTime2983500              = 2983500,	// Day 3, 07:15
	kTimeCityNish             = 3205800,	// Day 3, 11:22
	kTimeCityTzaribrod        = 3492000,	// Day 3, 16:40
	kTime3645000              = 3645000,	// Day 3, 19:30
	kTimeCitySofia            = 3690000,	// Day 3, 20:20
	kTimeCityAdrianople       = 4320900,	// Day 4, 08:01
	kTime4914000              = 4914000,    // Day 4, 19:00
	kTime4920300              = 4920300,    // Day 4, 19:07
	kTime4923000              = 4923000,	// Day 4, 19:10
	kTime4929300              = 4929300,	// Day 4, 19:17
	kTimeCityConstantinople   = 4941000,	// Day 4, 19:30


	kTime10881000             = 10881000,
	kTimeEnd                  = 15803100,
	kTime16451100             = 16451100,

	kTimeInvalid              = 2147483647,
	kTimeInvalid2             = 0xFFFFFEDA
};

//////////////////////////////////////////////////////////////////////////
// Archive & Chapter ID
//////////////////////////////////////////////////////////////////////////
enum ArchiveIndex {
	kArchiveAll = 0,
	kArchiveCd1 = 1,
	kArchiveCd2 = 2,
	kArchiveCd3 = 3
};

enum ChapterIndex {
	kChapterAll = 0,
	kChapter1   = 1,
	kChapter2   = 2,
	kChapter3   = 3,
	kChapter4   = 4,
	kChapter5   = 5
};

//////////////////////////////////////////////////////////////////////////
// Index of scenes
//////////////////////////////////////////////////////////////////////////
enum SceneIndex {
	kSceneNone                    = 0,
	kSceneMenu                    = 1,

	kSceneIntro                   = 30,

	// Inventory
	kSceneMatchbox                = 31,
	kSceneTelegram                = 32,
	kScenePassengerList           = 33,
	kSceneScarf                   = 34,
	kSceneParchemin               = 35,
	kSceneArticle                 = 36,
	kScenePaper                   = 37,
	kSceneFirebird                = 38,
	kSceneBriefcase               = 39,

	// Normal scenes
	kSceneDefault                 = 40,
	kScene41                      = 41,
	kSceneCompartmentCorpse       = 42,     // Tyler compartment with corpse on floor

	// Fight
	kSceneFightMilos              = 43,
	kSceneFightMilosBedOpened     = 44,
	kSceneFightAnna               = 45,
	kSceneFightIvo                = 46,
	kSceneFightSalko              = 47,
	kSceneFightVesna              = 48,

	kSceneEuropeMap               = 49,

	// Game over
	kSceneGameOverStopPolice      = 50,
	kSceneGameOverTrainStopped    = 51,
	kSceneGameOverTrainStopped2   = 52,
	kSceneGameOverTrainExplosion  = 53,
	kSceneGameOverTrainExplosion2 = 54,
	kSceneGameOverBloodJacket     = 55,
	kSceneGameOverPolice          = 56,
	kSceneGameOverPolice1         = 57,
	kSceneGameOverAnnaDied        = 58,
	kSceneGameOverVienna          = 59,
	kSceneGameOverVienna1         = 60,
	kSceneGameOverVienna2         = 61,
	kSceneGameOverAlarm           = 62,
	kSceneGameOverPolice2         = 63,
	kSceneGameOverAlarm2          = 64,

	// Start screen
	kSceneStartScreen             = 65,

	kSceneBeetle                  = 128,

	kSceneFightDefault            = 820,

	kSceneInvalid                 = 0xffffffff
};

//////////////////////////////////////////////////////////////////////////
// Jacket
//////////////////////////////////////////////////////////////////////////
enum JacketType {
	kJacketOriginal   = 0,
	kJacketBlood      = 1,
	kJacketGreen      = 2
};

//////////////////////////////////////////////////////////////////////////
// City
//////////////////////////////////////////////////////////////////////////
enum CityIndex {
	kCityEpernay = 0,
	kCityChalons,
	kCityBarleduc,
	kCityNancy,
	kCityLuneville,
	kCityAvricourt,                // 5
	kCityDeutschAvricourt,
	kCityStrasbourg,
	kCityBadenOos,
	kCitySalzbourg,
	kCityAttnangPuchheim,          // 10
	kCityWels,
	kCityLinz,
	kCityVienna,
	kCityPoszony,
	kCityGalanta,                  // 15
	kCityPolice
};

//////////////////////////////////////////////////////////////////////////
// Savegame ID
//////////////////////////////////////////////////////////////////////////
enum GameId {
	kGameBlue,
	kGameRed,
	kGameGreen,
	kGamePurple,
	kGameTeal,
	kGameGold
};

enum SavegameType {
	kSavegameTypeIndex = 0,
	kSavegameTypeTime = 1,
	kSavegameTypeEvent = 2,
	kSavegameTypeEvent2 = 3,
	kSavegameTypeAuto = 4,
	kSavegameTypeTickInterval = 5
};

//////////////////////////////////////////////////////////////////////////
// Cursor style
//////////////////////////////////////////////////////////////////////////
enum CursorStyle {
	kCursorNormal,
	kCursorForward,
	kCursorBackward,
	kCursorTurnRight,
	kCursorTurnLeft,
	kCursorUp,
	kCursorDown,
	kCursorLeft,
	kCursorRight,
	kCursorHand,
	kCursorHandKnock,                     // 10
	kCursorMagnifier,
	kCursorHandPointer,
	kCursorSleep,
	kCursorTalk,
	kCursorTalk2,     // Need better name

	// Items
	kCursorMatchBox,
	kCursorTelegram,
	kCursorPassengerList,
	kCursorArticle,
	kCursorScarf,     // 20
	kCursorPaper,
	kCursorParchemin,
	kCursorMatch,
	kCursorWhistle,
	kCursorKey,
	kCursorBomb,
	kCursorFirebird,
	kCursorBriefcase,
	kCursorCorpse,

	// Combat
	kCursorPunchLeft,                      // 30
	kCursorPunchRight,

	// Portraits
	kCursorPortrait,                      // 32
	kCursorPortraitSelected,
	kCursorPortraitGreen,
	kCursorPortraitGreenSelected,
	kCursorPortraitYellow,
	kCursorPortraitYellowSelected,
	kCursorHourGlass,
	kCursorEggBlue,
	kCursorEggRed,                        // 40
	kCursorEggGreen,
	kCursorEggPurple,
	kCursorEggTeal,
	kCursorEggGold,
	kCursorEggClock,
	kCursorNormal2,
	kCursorBlank,
	kCursorMAX,

	// Special
	kCursorProcess = 128,
	kCursorKeepValue = 255
};

//////////////////////////////////////////////////////////////////////////
// Position - should be between 0 & 100
//////////////////////////////////////////////////////////////////////////
typedef unsigned char Position;

//////////////////////////////////////////////////////////////////////////
// EntityPosition
//////////////////////////////////////////////////////////////////////////
enum EntityPosition {
	kPositionNone     = 0,
	kPosition_1     = 1,
	kPosition_3     = 3,
	kPosition_4     = 4,
	kPosition_500   = 500,
	kPosition_540   = 540,
	kPosition_750   = 750,
	kPosition_849   = 849,
	kPosition_850   = 850,
	kPosition_851   = 851,
	kPosition_1200  = 1200,
	kPosition_1430  = 1430,
	kPosition_1500  = 1500,
	kPosition_1540  = 1540,
	kPosition_1750  = 1750,
	kPosition_2000  = 2000,
	kPosition_2087  = 2087,
	kPosition_2086  = 2086,
	kPosition_2088  = 2088,
	kPosition_2110  = 2110,
	kPosition_2300  = 2300,
	kPosition_2330  = 2330,
	kPosition_2410  = 2410,
	kPosition_2436  = 2436,
	kPosition_2490  = 2490,
	kPosition_2500  = 2500,
	kPosition_2587  = 2587,
	kPosition_2588  = 2588,
	kPosition_2690  = 2690,
	kPosition_2740  = 2740,
	kPosition_2830  = 2830,
	kPosition_2980  = 2980,
	kPosition_3050  = 3050,
	kPosition_3110  = 3110,
	kPosition_3390  = 3390,
	kPosition_3450  = 3450,
	kPosition_3500  = 3500,
	kPosition_3550  = 3550,
	kPosition_3650  = 3650,
	kPosition_3760  = 3760,
	kPosition_3820  = 3820,
	kPosition_3890  = 3890,
	kPosition_3969  = 3969,
	kPosition_3970  = 3970,
	kPosition_4070  = 4070,
	kPosition_4100  = 4100,
	kPosition_4370  = 4370,
	kPosition_4455  = 4455,
	kPosition_4460  = 4460,
	kPosition_4500  = 4500,
	kPosition_4590  = 4590,
	kPosition_4680  = 4680,
	kPosition_4689  = 4689,
	kPosition_4690  = 4690,
	kPosition_4691  = 4691,
	kPosition_4770  = 4470,
	kPosition_4840  = 4840,
	kPosition_5000  = 5000,
	kPosition_5090  = 5090,
	kPosition_5140  = 5140,
	kPosition_5419  = 5419,
	kPosition_5420  = 5420,
	kPosition_5440  = 5440,
	kPosition_5500  = 5500,
	kPosition_5540  = 5540,
	kPosition_5610  = 5610,
	kPosition_5790  = 5790,
	kPosition_5799  = 5799,
	kPosition_5800  = 5800,
	kPosition_5810  = 5810,
	kPosition_5890  = 5890,
	kPosition_5900  = 5900,
	kPosition_5970  = 5970,
	kPosition_6000  = 6000,
	kPosition_6130  = 6130,
	kPosition_6160  = 6160,
	kPosition_6220  = 6220,
	kPosition_6410  = 6410,
	kPosition_6460  = 6460,
	kPosition_6469  = 6469,
	kPosition_6470  = 6470,
	kPosition_6471  = 6471,
	kPosition_6800  = 6800,
	kPosition_6850  = 6850,
	kPosition_7000  = 7000,
	kPosition_7160  = 7160,
	kPosition_7250  = 7250,
	kPosition_7320  = 7320,
	kPosition_7500  = 7500,
	kPosition_7510  = 7510,
	kPosition_7850  = 7850,
	kPosition_7870  = 7870,
	kPosition_7900  = 7900,
	kPosition_7950  = 7950,
	kPosition_8000  = 8000,
	kPosition_8012  = 8012,
	kPosition_8013  = 8013,
	kPosition_8160  = 8160,
	kPosition_8200  = 8200,
	kPosition_8500  = 8500,
	kPosition_8512  = 8512,
	kPosition_8513  = 8513,
	kPosition_8514  = 8514,
	kPosition_8800  = 8800,
	kPosition_9020  = 9020,
	kPosition_9269  = 9269,
	kPosition_9250  = 9250,
	kPosition_9270  = 9270,
	kPosition_9271  = 9271,
	kPosition_9460  = 9460,
	kPosition_9500  = 9500,
	kPosition_9510  = 9510,
	kPosition_30000 = 30000
};

//////////////////////////////////////////////////////////////////////////
// Location
//////////////////////////////////////////////////////////////////////////
enum Location {
	kLocationOutsideCompartment = 0,
	kLocationInsideCompartment = 1,
	kLocationOutsideTrain = 2
};

//////////////////////////////////////////////////////////////////////////
// Car
//////////////////////////////////////////////////////////////////////////
enum CarIndex {
	kCarNone = 0,
	kCarBaggageRear = 1,
	kCarKronos = 2,
	kCarGreenSleeping = 3,
	kCarRedSleeping = 4,
	kCarRestaurant = 5,
	kCarBaggage = 6,
	kCarCoalTender = 7,
	kCarLocomotive = 8,
	kCar9 = 9
};

//////////////////////////////////////////////////////////////////////////
// Clothes
//////////////////////////////////////////////////////////////////////////
enum ClothesIndex {
	kClothesDefault = 0,
	kClothes1 = 1,
	kClothes2 = 2,
	kClothes3 = 3,

	kClothesInvalid
};

//////////////////////////////////////////////////////////////////////////
// Objects (doors)
//////////////////////////////////////////////////////////////////////////
enum ObjectLocation {
	kObjectLocationNone = 0,
	kObjectLocation1    = 1, // Floor?
	kObjectLocation2    = 2, // Bed ?
	kObjectLocation3    = 3,
	kObjectLocation4    = 4, // Window ?
	kObjectLocation5 = 5,
	kObjectLocation6 = 6,
	kObjectLocation7 = 7,
	kObjectLocation8 = 8,
	kObjectLocation9 = 9,
	kObjectLocation10 = 10,
	kObjectLocation18 = 18
};

enum ObjectModel {
	kObjectModelNone = 0,
	kObjectModel1    = 1,
	kObjectModel2    = 2,
	kObjectModel3    = 3,
	kObjectModel4    = 4,
	kObjectModel5    = 5,
	kObjectModel6    = 6,
	kObjectModel7    = 7,
	kObjectModel8    = 8,
	kObjectModel9    = 9,
	kObjectModel10   = 10
};

//////////////////////////////////////////////////////////////////////////
// Entity direction
//////////////////////////////////////////////////////////////////////////
enum EntityDirection {
	kDirectionNone   = 0,
	kDirectionUp     = 1,
	kDirectionDown   = 2,
	kDirectionLeft   = 3,
	kDirectionRight  = 4,
	kDirectionSwitch = 5
};

//////////////////////////////////////////////////////////////////////////
// Combat
//////////////////////////////////////////////////////////////////////////
enum FightType {
	kFightMilos   = 2001,
	kFightAnna    = 2002,
	kFightIvo     = 2003,
	kFightSalko   = 2004,
	kFightVesna   = 2005
};

//////////////////////////////////////////////////////////////////////////
// Index of items in inventory data
//////////////////////////////////////////////////////////////////////////
enum InventoryItem {
	kItemNone,
	kItemMatchBox,
	kItem2,
	kItem3,
	kItemTelegram,
	kItem5,               // 5
	kItemPassengerList,
	kItem7,
	kItemScarf,
	kItem9,
	kItemParchemin,       // 10
	kItem11,
	kItemMatch,
	kItemWhistle,
	kItemBeetle,
	kItemKey,             // 15
	kItemBomb,
	kItem17,
	kItemFirebird,
	kItemBriefcase,
	kItemCorpse,          // 20
	kItemGreenJacket,
	kItem22,
	kItemPaper,
	kItemArticle,
	kItem25,             // 25
	kItem26,
	kItem27,
	kItem28,
	kItem29,
	kItem30,            // 30
	kItem31,

	// Portrait (not an index)
	kPortraitOriginal  = 32,
	kPortraitGreen     = 34,
	kPortraitYellow    = 36,

	kItemInvalid       = 128,

	kItem146           = 146,
	kItem147           = 147,

	// Toggles
	kItemToggleHigh    = 0x7F,
	kItemToggleLow     = 0xF7
};

//////////////////////////////////////////////////////////////////////////
// Object ID
//////////////////////////////////////////////////////////////////////////
enum ObjectIndex {
	kObjectNone,
	kObjectCompartment1,
	kObjectCompartment2,
	kObjectCompartment3,
	kObjectCompartment4,
	kObjectCompartment5,                 // 5
	kObjectCompartment6,
	kObjectCompartment7,
	kObjectCompartment8,
	kObjectOutsideTylerCompartment,
	kObject10,                           // 10
	kObject11,
	kObject12,
	kObject13,
	kObject14,
	kObject15,                           // 15
	kObject16,
	kObjectHandleBathroom,
	kObjectHandleInsideBathroom,
	kObjectKitchen,
	kObject20,                          // 20
	kObject21,
	kObject22,
	kObjectTrainTimeTable,
	kObjectRedSleepingCar,
	kObject25,                          // 25
	kObjectHandleOutsideLeft,
	kObjectHandleOutsideRight,
	kObject28,
	kObject29,
	kObject30,                          // 30
	kObject31,
	kObjectCompartmentA,
	kObjectCompartmentB,
	kObjectCompartmentC,
	kObjectCompartmentD,                // 35
	kObjectCompartmentE,
	kObjectCompartmentF,
	kObjectCompartmentG,
	kObjectCompartmentH,
	kObject40,                          // 40
	kObject41,
	kObject42,
	kObject43,
	kObjectOutsideBetweenCompartments,
	kObjectOutsideAnnaCompartment,     // 45
	kObject46,
	kObject47,
	kObject48, // might be the egg
	kObject49,
	kObject50,                          // 50
	kObject51,
	kObject52,
	kObject53,
	kObject54,
	kObjectRestaurantCar,               // 55
	kObject56,
	kObject57,
	kObject58,
	kObject59,
	kObject60,                          // 60
	kObject61,
	kObject62,
	kObject63,
	kObject64,
	kObject65,                          // 65
	kObject66,
	kObject67,
	kObject68,
	kObject69,
	kObject70,                          // 70
	kObject71,
	kObject72,
	kObjectCeiling,
	kObject74,
	kObjectCompartmentKronos,           // 75
	kObject76,
	kObject77,
	kObject78,
	kObject79,
	kObject80,                          // 80
	kObject81,
	kObject82,
	kObject83,
	kObject84,
	kObject85,                          // 85
	kObject86,
	kObject87,
	kObject88,
	kObject89,
	kObject90,                          // 90
	kObject91,
	kObject92,
	kObject93,
	kObject94,
	kObject95,                          // 95
	kObject96,
	kObject97,
	kObject98,
	kObject99,
	kObject100,                         // 100
	kObject101,
	kObject102,
	kObject103,
	kObject104,
	kObject105,                         // 105
	kObject106,
	kObject107,
	kObject108,
	kObjectCageMax,
	kObject110,                         // 110
	kObject111,
	kObject112,
	kObject113,
	kObject114,
	kObject115,                         // 115
	kObject116,
	kObject117,
	kObject118,
	kObject119,
	kObject120,                         // 120
	kObject121,
	kObject122,
	kObject123,
	kObject124,
	kObject125,                         // 125
	kObject126,
	kObject127,
	kObjectMax
};

//////////////////////////////////////////////////////////////////////////
// Entity ID
//////////////////////////////////////////////////////////////////////////
enum EntityIndex {
	kEntityPlayer,
	kEntityAnna,
	kEntityAugust,
	kEntityMertens,
	kEntityCoudert,
	kEntityPascale,             // 5
	kEntityWaiter1,
	kEntityWaiter2,
	kEntityCooks,
	kEntityVerges,
	kEntityTatiana,             // 10
	kEntityVassili,
	kEntityAlexei,
	kEntityAbbot,
	kEntityMilos,
	kEntityVesna,               // 15
	kEntityIvo,
	kEntitySalko,
	kEntityKronos,
	kEntityKahina,
	kEntityFrancois,            // 20
	kEntityMmeBoutarel,
	kEntityBoutarel,
	kEntityRebecca,
	kEntitySophie,
	kEntityMahmud,              // 25
	kEntityYasmin,
	kEntityHadija,
	kEntityAlouan,
	kEntityGendarmes,
	kEntityMax,                 // 30
	kEntityChapters,
	kEntityTrain,
	kEntityTables0,
	kEntityTables1,
	kEntityTables2,             // 35
	kEntityTables3,
	kEntityTables4,
	kEntityTables5,
	kEntity39,

	kEntitySteam = 255
};

//////////////////////////////////////////////////////////////////////////
// Events
//   - a single D at the end means that Cath is on the right of the "scene" (D = Down the train, U = Up the train)
//   - DD: during the day, coming down the train
//   - DU: during the day, coming up the train
//   - ND: during the night, coming down the train
//   - NU: during the night, coming up the train
//////////////////////////////////////////////////////////////////////////
enum EventIndex {
	kEventNone = 0,
	kEventGotALight = 1,
	kEventGotALightD = 2,
	kEventDinerMindJoin = 3,
	kEventDinerAugustOriginalJacket = 4,
	kEventDinerAugust = 5,
	kEventDinerAugustAlexeiBackground = 6,
	kEventMeetAugustTylerCompartment = 7,
	kEventMeetAugustTylerCompartmentBed = 8,
	kEventMeetAugustHisCompartment = 9,
	kEventMeetAugustHisCompartmentBed = 10,
	kEventAugustFindCorpse = 11,
	kEventAugustPresentAnna = 12,
	kEventAugustPresentAnnaFirstIntroduction = 13,
	kEventAnnaIntroductionRejected = 14,
	kEventAnnaConversationGoodNight = 15,
	kEventAnnaVisitToCompartmentGun = 16,
	kEventInvalid_17 = 17,
	kEventAnnaGoodNight = 18,
	kEventAnnaGoodNightInverse = 19,
	kEventAugustGoodMorning = 20,
	kEventAugustMerchandise = 21,
	kEventAugustTalkGold = 22,
	kEventAugustTalkGoldDay = 23,
	kEventAugustTalkCompartmentDoor = 24,
	kEventAugustTalkCompartmentDoorBlueRedingote = 25,
	kEventAugustLunch = 26,
	kEventKronosVisit = 27,
	kEventAnnaSearchingCompartment = 28,
	kEventAugustBringEgg = 29,
	kEventAugustBringBriefcase = 30,
	kEventAugustTalkCigar = 31,
	kEventAnnaBaggageArgument = 32,
	kEventAnnaBagagePart2 = 33,
	kEventAnnaConversation_34 = 34,
	kEventAugustDrink = 35,
	kEventAnnaTired = 36,
	kEventAnnaTiredKiss = 37,
	kEventAnnaBaggageTies = 38,
	kEventAnnaBaggageTies2 = 39,
	kEventAnnaBaggageTies3 = 40,
	kEventAnnaBaggageTies4 = 41,
	kEventAugustUnhookCarsBetrayal = 42,
	kEventAugustUnhookCars = 43,
	kEventLocomotiveAnnaStopsTrain = 44,
	kEventInvalid_45 = 45,
	kEventTrainStopped = 46,
	kEventAnnaKissTrainHijacked = 47,
	kEventTrainHijacked = 48,
	kEventAnnaKilled = 49,
	kEventKronosGoingToInvitation = 50,
	kEventKronosConversation = 51,
	kEventKahinaAskSpeakFirebird = 52,
	kEventKahinaAskSpeak = 53,
	kEventKronosConversationFirebird = 54,
	kEventKahinaGunYellow = 55,
	kEventKahinaGunBlue = 56,
	kEventKahinaGun = 57,
	kEventKronosBringEggCeiling = 58,
	kEventKronosBringEgg = 59,
	kEventKronosBringNothing = 60,
	kEventKronosReturnBriefcase = 61,
	kEventKronosHostageAnna = 62,
	kEventKronosGiveFirebird = 63,
	kEventKahinaPunchBaggageCarEntrance = 64,
	kEventKahinaPunchBlue = 65,
	kEventKahinaPunchYellow = 66,
	kEventKahinaPunchSalon = 67,
	kEventKahinaPunchKitchen = 68,
	kEventKahinaPunchBaggageCar = 69,
	kEventKahinaPunchCar = 70,
	kEventKahinaPunchSuite4 = 71,
	kEventKahinaPunchRestaurant = 72,
	kEventKronosHostageAnnaNoFirebird = 73,
	kEventKahinaPunch = 74,
	kEventKahinaWrongDoor = 75,
	kEventAlexeiDiner = 76,
	kEventAlexeiDinerOriginalJacket = 77,
	kEventAlexeiSalonVassili = 78,
	kEventAlexeiSalonCath = 79,
	kEventAlexeiSalonPoem = 80,
	kEventTatianaAskMatchSpeakRussian = 81,
	kEventTatianaAskMatch = 82,
	kEventTatianaGivePoem = 83,
	kEventVassiliSeizure = 84,
	kEventTatianaBreakfastAlexei = 85,
	kEventTatianaBreakfast = 86,
	kEventTatianaBreakfastGivePoem = 87,
	kEventTatianaAlexei = 88,
	kEventTatianaCompartmentStealEgg = 89,
	kEventTatianaCompartment = 90,
	kEventVassiliCompartmentStealEgg = 91,
	kEventTatianaTylerCompartment = 92,
	kEventTylerCastleDream= 93,
	kEventVassiliDeadAlexei = 94,
	kEventCathFreePassengers = 95,
	kEventTatianaVassiliTalk = 96,
	kEventTatianaVassiliTalkNight = 97,
	kEventMilosTylerCompartmentVisit = 98,
	kEventMilosTylerCompartmentBedVisit = 99,
	kEventMilosTylerCompartment = 100,
	kEventMilosTylerCompartmentBed = 101,
	kEventMilosTylerCompartmentDefeat = 102,
	kEventMilosCorpseFloor = 103,
	kEventMilosCompartmentVisitAugust = 104,
	kEventMilosCorridorThanks = 105,
	kEventMilosCorridorThanksD = 106,
	kEventMilosCompartmentVisitTyler = 107,
	kEventLocomotiveMilosDay = 108,
	kEventLocomotiveMilosNight = 109,
	kEventAbbotIntroduction = 110,
	kEventAbbotWrongCompartment = 111,
	kEventAbbotWrongCompartmentBed = 112,
	kEventAbbotInvitationDrink = 113,
	kEventAbbotDrinkGiveDetonator = 114,
	kEventTrainExplosionBridge = 115,
	kEventDefuseBomb = 116,
	kEventAbbotDrinkDefuse = 117,
	kEventMertensLastCar = 118,
	kEventMertensLastCarOriginalJacket = 119,
	kEventMertensKronosInvitation = 120,
	kEventMertensKronosInvitationCompartment = 121,
	kEventMertensKronosInvitationClosedWindows = 122,
	kEventMertensBloodJacket = 123,
	kEventCoudertBloodJacket = 124,
	kEventMertensCorpseFloor = 125,
	kEventMertensCorpseBed = 126,
	kEventMertensDontMakeBed = 127,
	kEventInvalid_128 = 128,
	kEventGendarmesArrestation = 129,
	kEventVergesSuitcase = 130,
	kEventVergesSuitcaseStart = 131,
	kEventVergesSuitcaseOtherEntry = 132,
	kEventVergesSuitcaseOtherEntryStart = 133,
	kEventVergesSuitcaseNight = 134,
	kEventVergesSuitcaseNightStart = 135,
	kEventVergesSuitcaseNightOtherEntry = 136,
	kEventVergesSuitcaseNightOtherEntryStart = 137,
	kEventMertensAskTylerCompartment = 138,
	kEventMertensAskTylerCompartmentD = 139,
	kEventMertensPushCallNight = 140,
	kEventMertensPushCall = 141,
	kEventMertensAugustWaiting = 142,
	kEventMertensAugustWaitingCompartment = 143,
	kEventIntroBroderbrund = 144,
	kEventCoudertAskTylerCompartment = 145,
	kEventMertensKronosConcertInvitation = 146,
	kEventCoudertGoingOutOfVassiliCompartment = 147,
	kEventLocomotiveConductorsDiscovered = 148,
	kEventLocomotiveConductorsLook = 149,
	kEventMahmudWrongDoor = 150,
	kEventMahmudWrongDoorOriginalJacket = 151,
	kEventMahmudWrongDoorDay = 152,
	kEventVergesEscortToDiningCar = 153,
	kEventVergesBaggageCarOffLimits = 154,
	kEventVergesCanIHelpYou = 155,
	kEventCoudertBaggageCar = 156,
	kEventCathTurningDay = 157,
	kEventCathTurningNight = 158,
	kEventIntro = 159,
	kEventCathDream = 160,
	kEventCorpseDropBridge = 161,
	kEventTrainPassing = 162,
	kEventVergesAnnaDead = 163,
	kEventViennaAugustUnloadGuns = 164,
	kEventViennaKronosFirebird = 165,
	kEventViennaContinueGame = 166,
	kEventCathVesnaRestaurantKilled = 167,
	kEventCathMaxCage = 168,
	kEventCathMaxFree = 169,
	kEventCathMaxLickHand = 170,
	kEventCathIvoFight = 171,
	kEventCathSalkoTrainTopFight = 172,
	kEventCathVesnaTrainTopFight = 173,
	kEventCathVesnaTrainTopKilled = 174,
	kEventCathVesnaTrainTopWin = 175,
	kEventCathSalkoTrainTopWin = 176,
	kEventFrancoisWhistle = 177,
	kEventFrancoisWhistleD = 178,
	kEventFrancoisWhistleNight = 179,
	kEventFrancoisWhistleNightD = 180,
	kEventFrancoisShowBeetle = 181,
	kEventFrancoisShowBeetleD = 182,
	kEventFrancoisTradeWhistle = 183,
	kEventFrancoisTradeWhistleD = 184,
	kEventFrancoisShowEgg = 185,
	kEventFrancoisShowEggD = 186,
	kEventFrancoisShowEggNightD = 187,
	kEventFrancoisShowEggNight = 188,
	kEventKronosBringFirebird = 189,
	kEventKronosOpenFirebird = 190,
	kEventFinalSequence = 191,
	kEventLocomotiveRestartTrain = 192,
	kEventLocomotiveOldBridge = 193,
	kEventLocomotiveAbbotGetSomeRest = 194,
	kEventLocomotiveAbbotShoveling = 195,
	kEventLocomotiveMilosShovelingDay = 196,
	kEventLocomotiveMilosShovelingNight = 197,
	kEventAnnaGiveScarf = 198,
	kEventAnnaGiveScarfDiner = 199,
	kEventAnnaGiveScarfSalon = 200,
	kEventAnnaGiveScarfMonogram = 201,
	kEventAnnaGiveScarfDinerMonogram = 202,
	kEventAnnaGiveScarfSalonMonogram = 203,
	kEventAnnaGiveScarfAsk = 204,
	kEventAnnaGiveScarfDinerAsk = 205,
	kEventAnnaGiveScarfSalonAsk = 206,
	kEventAugustArrivalInMunich = 207,
	kEventAnnaDialogGoToJerusalem = 208,
	kEventConcertStart = 209,
	kEventConcertEnd = 210,
	kEventCathFallingAsleep = 211,
	kEventCathWakingUp = 212,
	kEventConcertCough = 213,
	kEventConcertSit = 214,
	kEventConcertLeaveWithBriefcase = 215,
	kEventCorpseDropFloorOriginal = 216,
	kEventCorpseDropFloorGreen = 217,
	kEventCorpsePickFloorOriginal = 218,
	kEventCorpsePickFloorGreen = 219,
	kEventCorpsePickFloorOpenedBedOriginal = 220,
	kEventCorpsePickBedOriginal = 221,
	kEventCorpsePickBedGreen = 222,
	kEventCorpseDropBedOriginal = 223,
	kEventCorpseDropBedGreen = 224,
	kEventCorpseDropWindowOriginal = 225,
	kEventCorpseDropWindowGreen = 226,
	kEventCathFindCorpse = 227,
	kEventCathLookOutsideWindowDay = 228,
	kEventCathLookOutsideWindowNight = 229,
	kEventCathGoOutsideTylerCompartmentDay = 230,
	kEventCathGoOutsideTylerCompartmentNight = 231,
	kEventCathGoOutsideDay = 232,
	kEventCathGoOutsideNight = 233,
	kEventCathSlipTylerCompartmentDay = 234,
	kEventCathSlipTylerCompartmentNight = 235,
	kEventCathSlipDay = 236,
	kEventCathSlipNight = 237,
	kEventCathGetInsideTylerCompartmentDay = 238,
	kEventCathGetInsideTylerCompartmentNight = 239,
	kEventCathGetInsideDay = 240,
	kEventCathGetInsideNight = 241,
	kEventCathGettingInsideAnnaCompartment = 242,
	kEventCathClimbUpTrainGreenJacket = 243,
	kEventCathClimbUpTrainNoJacketNight = 244,
	kEventCathClimbUpTrainNoJacketDay = 245,
	kEventCathClimbDownTrainGreenJacket = 246,
	kEventCathClimbDownTrainNoJacketNight = 247,
	kEventCathClimbDownTrainNoJacketDay= 248,
	kEventCathTopTrainGreenJacket = 249,
	kEventCathTopTrainNoJacketNight = 250,
	kEventCathTopTrainNoJacketDay = 251,
	kEventCathBreakCeiling = 252,
	kEventCathJumpDownCeiling = 253,
	kEventCathJumpUpCeilingBriefcase = 254,
	kEventCathJumpUpCeiling = 255,
	kEventPickGreenJacket = 256,
	kEventPickScarfGreen = 257,
	kEventPickScarfOriginal = 258,
	kEventCloseMatchbox = 259,
	kEventCathStruggleWithBonds = 260,
	kEventCathBurnRope = 261,
	kEventCathRemoveBonds = 262,
	kEventCathStruggleWithBonds2 = 263,
	kEventCathDefusingBomb = 264,
	kEventCathSmokeNight = 265,
	kEventCathSmokeDay = 266,
	kEventCathOpenEgg = 267,
	kEventCathOpenEggNoBackground = 268,
	kEventCathCloseEgg = 269,
	kEventCathCloseEggNoBackground = 270,
	kEventCathUseWhistleOpenEgg = 271,
	kEventCathUseWhistleOpenEggNoBackground = 272
};

//////////////////////////////////////////////////////////////////////////
// Action ID (used by entity logic)
//////////////////////////////////////////////////////////////////////////
enum ActionIndex {
	kActionNone            = 0,
	kAction1               = 1,
	kActionEndSound        = 2,
	kActionExitCompartment = 3,
	kAction4               = 4,
	kActionExcuseMeCath    = 5,
	kActionExcuseMe        = 6,
	kActionKnock           = 8,
	kActionOpenDoor        = 9,
	kAction10              = 10,
	kAction11              = 11,
	kActionDefault         = 12,
	kAction16              = 16,
	kActionDrawScene       = 17,
	kActionCallback        = 18,

	/////////////////////////////
	// Abbot
	/////////////////////////////
	kAction100969180 = 100969180,    // Anna
	kAction101169422 = 101169422,
	kAction104060776 = 104060776,
	kAction135600432 = 135600432,
	kAction136196244 = 136196244,
	kAction157159392 = 157159392,
	kAction157489665 = 157489665,
	kAction158480160 = 158480160,
	kAction192054567 = 192054567,
	kAction203073664 = 203073664,
	kAction222609266 = 222609266,

	/////////////////////////////
	// Alexei
	/////////////////////////////
	kAction100906246 = 100906246,
	kAction123536024 = 123536024,
	kAction124697504 = 124697504,
	kAction135664192 = 135664192,
	kAction135854208 = 135854208,
	kAction188784532 = 188784532,
	kAction221617184 = 221617184,

	/////////////////////////////
	// Alouan
	/////////////////////////////
	kAction189489753 = 189489753,
	kAction190219584 = 190219584,    // Francois

	/////////////////////////////
	// Anna
	/////////////////////////////
	kAction136702400 = 136702400,
	kAction139254416 = 139254416,
	kAction156049968 = 156049968,
	kAction157370960 = 157370960,
	kAction157894320 = 157894320,
	kAction159332865 = 159332865,   // August
	kAction189299008 = 189299008,
	kAction191668032 = 191668032,   // some action during or before concert?
	kAction201437056 = 201437056,
	kAction235856512 = 235856512,
	kAction236060709 = 236060709,
	kAction238936000 = 238936000,
	kAction259136835 = 259136835,
	kAction291662081 = 291662081,


	/////////////////////////////
	// August
	/////////////////////////////
	kAction123793792 = 123793792,
	kAction134611040 = 134611040,
	kAction168046720 = 168046720,
	kAction168627977 = 168627977,
	kAction169032608 = 169032608,
	kAction189426612 = 189426612,
	kAction203859488 = 203859488,
	kAction219522616 = 219522616,    // Waiter1
	kAction225182640 = 225182640,
	kAction235257824 = 235257824,

	/////////////////////////////
	// Boutarel
	/////////////////////////////
	kAction125039808 = 125039808,
	kAction134466544 = 134466544,
	kAction135854206 = 135854206,
	kAction159003408 = 159003408,
	kAction203520448 = 203520448,
	kAction237889408 = 237889408,

	/////////////////////////////
	// Chapters
	/////////////////////////////
	kAction135800432 = 135800432,
	kActionChapter3  = 139122728,
	kActionChapter5  = 139254416,
	kAction156435676 = 156435676,
	kAction169629818 = 169629818,
	kAction171843264 = 171843264,
	kAction190346110 = 190346110,

	/////////////////////////////
	// Cooks
	/////////////////////////////
	kAction101632192 = 101632192,
	kAction224849280 = 224849280,
	kAction236976550 = 236976550,

	/////////////////////////////
	// Coudert
	/////////////////////////////
	kAction123733488 = 123733488,
	kAction154005632 = 154005632,
	kAction155991520 = 155991520,
	kAction157026693 = 157026693,
	kAction168253822 = 168253822,
	kAction168254872 = 168254872,
	kAction168316032 = 168316032,    // Tatiana
	kAction169557824 = 169557824,
	kAction171394341 = 171394341,    // Mertens
	kAction185671840 = 185671840,
	kAction185737168 = 185737168,
	kAction188570113 = 188570113,
	kAction189026624 = 189026624,
	kAction189750912 = 189750912,
	kAction192063264 = 192063264,    // Anna
	kAction201431954 = 201431954,    // Mertens / Verges
	kAction201439712 = 201439712,
	kAction205033696 = 205033696,
	kAction205346192 = 205346192,    // Francois
	kAction219971920 = 219971920,    // Anna
	kAction223068211 = 223068211,    // MmeBoutarel
	kAction225932896 = 225932896,
	kAction226031488 = 226031488,    // Verges
	kAction235061888 = 235061888,    // Tatiana
	kAction238358920 = 238358920,    // Anna
	kAction253868128 = 253868128,    // Anna
	kAction285528346 = 285528346,    // Rebecca
	kAction292048641 = 292048641,
	kAction305159806 = 305159806,
	kAction326348944 = 326348944,
	kAction339669520 = 339669520,    // Verges

	/////////////////////////////
	// Francois
	/////////////////////////////
	kAction100901266 = 100901266,
	kAction100957716 = 100957716,
	kAction101107728 = 101107728,
	kAction189872836 = 189872836,
	kAction190390860 = 190390860,

	/////////////////////////////
	// Gendarmes
	/////////////////////////////
	kAction168710784 = 168710784,
	kAction169499649 = 169499649,

	/////////////////////////////
	// Kahina
	/////////////////////////////
	kAction92186062  = 92186062,
	kAction137503360 = 137503360,
	kAction237555748 = 237555748,

	/////////////////////////////
	// Kronos
	/////////////////////////////
	kAction137685712 = 137685712,
	kAction138085344 = 138085344,
	kAction171849314 = 171849314,
	kAction235599361 = 235599361,

	/////////////////////////////
	// Mahmud
	/////////////////////////////
	kAction102227384 = 102227384,    // Mertens
	kAction156567128 = 156567128,
	kAction170483072 = 170483072,
	kAction225563840 = 225563840,

	/////////////////////////////
	// Max
	/////////////////////////////
	kAction71277948  = 71277948,
	kAction158007856 = 158007856,
	kAction101687594 = 101687594,
	kAction122358304 = 122358304,    // also Waiter2/Boutarel?
	kActionMaxFreeFromCage = 135204609,
	kAction156622016 = 156622016,

	/////////////////////////////
	// Mertens
	/////////////////////////////
	kAction155604840 = 155604840,    // MmeBoutarel
	kAction169633856 = 169633856,
	kAction188635520 = 188635520,
	kAction190082817 = 190082817,
	kAction192849856 = 192849856,
	kAction204379649 = 204379649,
	kAction224122407 = 224122407,
	kAction238732837 = 238732837,
	kAction238790488 = 238790488,    // Tatiana
	kAction269436673 = 269436673,
	kAction269624833 = 269624833,
	kAction302614416 = 302614416,
	kAction303343617 = 303343617,

	/////////////////////////////
	// Milos
	/////////////////////////////
	kAction88652208 = 88652208,      // Coudert
	kAction122865568 = 122865568,
	kAction123852928 = 123852928,
	kAction123199584 = 123199584,    // Coudert
	kAction157691176 = 157691176,
	kAction208228224 = 208228224,
	kAction221683008 = 221683008,
	kAction259125998 = 259125998,

	/////////////////////////////
	// Mme Boutarel
	/////////////////////////////
	kAction102484312 = 102484312,
	kAction102752636 = 102752636,
	kAction134289824 = 134289824,
	kAction168986720 = 168986720,
	kAction202221040 = 202221040,
	kAction242526416 = 242526416,

	/////////////////////////////
	// Pascale
	/////////////////////////////
	kAction101824388 = 101824388,
	kAction136059947 = 136059947,
	kAction169750080 = 169750080,
	kAction190605184 = 190605184,
	kAction191604416 = 191604416,
	kAction207769280 = 207769280,
	kAction223262556 = 223262556,
	kAction239072064 = 239072064,
	kAction257489762 = 257489762,
	kAction269479296 = 269479296,
	kAction352703104 = 352703104,
	kAction352768896 = 352768896,

	/////////////////////////////
	// Rebecca
	/////////////////////////////
	kAction125496184 = 125496184,
	kAction155465152 = 155465152,
	kAction155980128 = 155980128,
	kAction169358379 = 169358379,
	kAction224253538 = 224253538,
	kAction254915200 = 254915200,

	/////////////////////////////
	// Salko
	/////////////////////////////
	kAction55996766  = 55996766,
	kAction101169464 = 101169464,
	kAction102675536 = 102675536,    // Ivo
	kAction136184016 = 136184016,

	/////////////////////////////
	// Servers 0
	/////////////////////////////
	kAction170016384 = 170016384,
	kAction188893625 = 188893625,
	kAction201964801 = 201964801,    // August
	kAction204704037 = 204704037,
	kAction207330561 = 207330561,
	kAction218128129 = 218128129,
	kAction218586752 = 218586752,
	kAction218983616 = 218983616,
	kAction223712416 = 223712416,
	kAction237485916 = 237485916,
	kAction252568704 = 252568704,
	kAction268773672 = 268773672,    // Anna / August
	kAction270068760 = 270068760,
	kAction270410280 = 270410280,
	kAction286403504 = 286403504,
	kAction286534136 = 286534136,
	kAction292758554 = 292758554,
	kAction304061224 = 304061224,
	kAction337548856 = 337548856,

	/////////////////////////////
	// Servers 1
	/////////////////////////////
	kAction101106391 = 101106391,
	kAction122288808 = 122288808,    // Boutarel
	kAction123712592 = 123712592,    // Ivo
	kAction125826561 = 125826561,    // August
	kAction134486752 = 134486752,    // August
	kAction168717392 = 168717392,    // Boutarel
	kAction189688608 = 189688608,
	kAction219377792 = 219377792,
	kAction223002560 = 223002560,
	kAction236237423 = 236237423,
	kAction256200848 = 256200848,
	kAction258136010 = 258136010,
	kAction269485588 = 269485588,
	kAction291721418 = 291721418,
	kAction302203328 = 302203328,
	kAction302996448 = 302996448,
	kAction326144276 = 326144276,

	/////////////////////////////
	// Sophie
	/////////////////////////////
	kActionProceedChapter5  = 70549068,
	kAction123668192 = 123668192,
	kAction125242096 = 125242096,
	kAction136654208 = 136654208,
	kAction259921280 = 259921280,
	kAction292775040 = 292775040,

	/////////////////////////////
	// Tables
	/////////////////////////////
	kActionDrawTablesWithChairs = 103798704,
	kAction136455232 = 136455232,

	/////////////////////////////
	// Tatiana
	/////////////////////////////
	kAction69239528  = 69239528,
	kAction123857088 = 123857088,
	kAction124973510 = 124973510,
	kAction154071333 = 154071333,
	kAction156444784 = 156444784,
	kAction169360385 = 169360385,
	kAction191198209 = 191198209,
	kAction223183000 = 223183000,    // August
	kAction236053296 = 236053296,    // Alexei
	kAction236241630 = 236241630,    // Anna
	kAction236517970 = 236517970,    // Anna
	kAction268620864 = 268620864,    // August
	kAction290869168 = 290869168,

	/////////////////////////////
	// Train
	/////////////////////////////
	kAction191070912 = 191070912,
	kActionTrainStopRunning = 191350523,
	kActionCatchBeetle = 202613084,
	kAction203339360 = 203339360,
	kActionTrainStartRunning = 203419131,
	kAction203863200 = 203863200,
	kAction222746496 = 222746496,
	kActionBreakCeiling = 225056224,
	kAction290410610 = 290410610,
	kActionJumpDownCeiling = 338494260,

	/////////////////////////////
	// Verges
	/////////////////////////////
	kAction125233040 = 125233040,   // Abbot
	kAction125499160 = 125499160,
	kAction155853632 = 155853632,
	kAction158617345 = 158617345,
	kAction167854368 = 167854368,
	kAction168187490 = 168187490,
	kAction168255788 = 168255788,
	kActionDeliverMessageToTyler = 191337656,
	kAction202558662 = 202558662,

	/////////////////////////////
	// Vassili
	/////////////////////////////
	kAction122732000 = 122732000,
	kAction168459827 = 168459827,
	kAction191477936 = 191477936,

	/////////////////////////////
	// Vesna
	/////////////////////////////
	kAction124190740 = 124190740,
	kAction134427424 = 134427424,
	kAction135024800 = 135024800,
	kAction137165825 = 137165825,
	kAction155913424 = 155913424,
	kAction190412928 = 190412928,
	kAction203663744 = 203663744,
	kAction204832737 = 204832737,

	/////////////////////////////
	// Misc
	/////////////////////////////
	kAction158610240 = 158610240,
	kAction167992577 = 167992577,
	kAction168646401 = 168646401,
	kAction169300225 = 169300225,
	kAction169773228 = 169773228,
	kActionEndChapter = 190346110,
	kAction191001984 = 191001984,
	kAction192637492 = 192637492,
	kAction201959744 = 201959744,
	kAction202621266 = 202621266,
	kAction202884544 = 202884544,
	kAction203078272 = 203078272,
	kAction205034665 = 205034665,
	kAction205294778 = 205294778,
	kActionUseWhistle = 270751616,
	kAction272177921 = 272177921,
	kAction224309120 = 224309120,
	kAction225358684 = 225358684,
	kAction225367984 = 225367984,
	kAction226078300 = 226078300, // Whistle

	kActionEnd
};

} // End of namespace LastExpress

#endif // LASTEXPRESS_SHARED_H