Ticket #10981: full_patch.diff
File full_patch.diff, 529.4 KB (added by , 5 years ago) |
---|
-
AUTHORS
diff --git a/AUTHORS b/AUTHORS index 2800b62..7ccd755 100644
a b Other contributions 533 533 Janne Huttunen - V3 actor mask support, Dig/FT SMUSH audio 534 534 Kovacs Endre Janos - Several fixes for Simon1 535 535 Jeroen Janssen - Numerous readability and bugfix patches 536 Keith Kaisershot - Several Pegasus Prime patches 536 Keith Kaisershot - Several Pegasus Prime patches and DVD 537 additions 537 538 Andreas Karlsson - Initial port for SymbianOS 538 539 Claudio Matsuoka - Daily Linux builds 539 540 Thomas Mayer - PSP port contributions -
Makefile
diff --git a/Makefile b/Makefile index 93a84a5..8f84b26 100644
a b ZIP ?= zip -q 78 78 # Misc stuff - you should never have to edit this # 79 79 ####################################################################### 80 80 81 EXECUTABLE := $(EXEPRE) scummvm$(EXEEXT)81 EXECUTABLE := $(EXEPRE)PegasusPrime$(EXEEXT) 82 82 83 83 include $(srcdir)/Makefile.common 84 84 -
Makefile.common
diff --git a/Makefile.common b/Makefile.common index b56300a..57647db 100644
a b dist-src: \ 233 233 DIST_FILES_DOCS:=$(addprefix $(srcdir)/,AUTHORS COPYING COPYING.BSD COPYING.LGPL COPYING.FREEFONT COPYRIGHT NEWS README) 234 234 235 235 # Themes files 236 DIST_FILES_THEMES=scumm modern.zip scummclassic.zip236 DIST_FILES_THEMES=scummclassic.zip 237 237 ifdef USE_TRANSLATION 238 238 DIST_FILES_THEMES+=translations.dat 239 239 endif -
backends/mixer/sdl/sdl-mixer.cpp
diff --git a/backends/mixer/sdl/sdl-mixer.cpp b/backends/mixer/sdl/sdl-mixer.cpp index 7c709e9..b391782 100644
a b 33 33 #ifdef GP2X 34 34 #define SAMPLES_PER_SEC 11025 35 35 #else 36 #define SAMPLES_PER_SEC 2205036 #define SAMPLES_PER_SEC 44100 37 37 #endif 38 38 //#define SAMPLES_PER_SEC 44100 39 39 -
backends/platform/sdl/macosx/macosx-main.cpp
diff --git a/backends/platform/sdl/macosx/macosx-main.cpp b/backends/platform/sdl/macosx/macosx-main.cpp index 1b9fc1b..712a4ab 100644
a b 20 20 * 21 21 */ 22 22 23 // Disable symbol overrides so that we can use system headers. 24 #define FORBIDDEN_SYMBOL_ALLOW_ALL 25 23 26 #include "common/scummsys.h" 24 27 25 28 #ifdef MACOSX 26 29 27 30 #include "backends/platform/sdl/macosx/macosx.h" 28 31 #include "backends/plugins/sdl/sdl-provider.h" 32 #include "base/commandLine.h" 29 33 #include "base/main.h" 34 #include "common/config-manager.h" 35 #include "common/fs.h" 36 37 #include "CoreFoundation/CoreFoundation.h" 38 39 #define PEGASUS_DVD_TARGET "pegasus-dvd-release" 30 40 31 41 int main(int argc, char *argv[]) { 32 42 … … int main(int argc, char *argv[]) { 41 51 PluginManager::instance().addPluginProvider(new SDLPluginProvider()); 42 52 #endif 43 53 54 // HACK: Special Pegasus release parameters 55 56 // Attempt to detect the PP Data directory 57 // Get URL of the Resource directory of the .app bundle 58 CFURLRef fileUrl = CFBundleCopyBundleURL(CFBundleGetMainBundle()); 59 60 if (!fileUrl) { 61 warning("Failed to get bundle URL"); 62 return 1; 63 } 64 65 // Try to convert the URL to an absolute path 66 char buf[MAXPATHLEN]; 67 if (!CFURLGetFileSystemRepresentation(fileUrl, true, (UInt8 *)buf, sizeof(buf))) { 68 warning("Failed to get FS representation of bundle URL"); 69 return 1; 70 } 71 72 CFRelease(fileUrl); 73 74 Common::String bundlePath(buf); 75 Common::FSNode bundleNode(bundlePath); 76 Common::FSNode bundleParent = bundleNode.getParent(); 77 Common::FSNode ppDataDirectory = bundleParent.getChild("PP Data"); 78 79 Common::String ppDataPath; 80 81 // If we have the "PP Data" folder in the same directory as this bundle 82 if (ppDataDirectory.exists()) { 83 // Try to use this directory 84 ppDataPath = ppDataDirectory.getPath(); 85 } else { 86 // Try to get it off the disc 87 Common::String discPath("/Volumes/Journeyman/"); 88 Common::FSNode discNode(discPath); 89 Common::FSNode discDataDirectory = discNode.getChild("PP Data"); 90 if (discDataDirectory.exists()) { 91 ppDataPath = discDataDirectory.getPath(); 92 } else { 93 warning("Game data missing"); 94 return 1; 95 } 96 } 97 98 // Work this into the config file 99 Base::registerDefaults(); 100 ConfMan.loadDefaultConfigFile(); 101 102 // Add the special target if it doesn't already exist 103 if (!ConfMan.hasGameDomain(PEGASUS_DVD_TARGET)) { 104 ConfMan.addGameDomain(PEGASUS_DVD_TARGET); 105 ConfMan.set("gameid", "pegasus", PEGASUS_DVD_TARGET); 106 ConfMan.set("gfx_mode", "opengl_linear", PEGASUS_DVD_TARGET); 107 ConfMan.set("fullscreen", "true", PEGASUS_DVD_TARGET); 108 ConfMan.set("platform", "macintosh", PEGASUS_DVD_TARGET); 109 } 110 111 // Always update the path 112 ConfMan.set("path", ppDataPath, PEGASUS_DVD_TARGET); 113 114 // Flush for good luck 115 ConfMan.flushToDisk(); 116 117 const char *pegasusParams[] = { 118 argv[0], 119 "--gui-theme=scummpegasus", 120 PEGASUS_DVD_TARGET 121 }; 122 44 123 // Invoke the actual ScummVM main entry point: 45 int res = scummvm_main( argc, argv);124 int res = scummvm_main(ARRAYSIZE(pegasusParams), pegasusParams); 46 125 47 126 // Free OSystem 48 127 delete (OSystem_MacOSX *)g_system; -
backends/platform/sdl/macosx/macosx.cpp
diff --git a/backends/platform/sdl/macosx/macosx.cpp b/backends/platform/sdl/macosx/macosx.cpp index 924e33b..5e61df3 100644
a b 43 43 44 44 OSystem_MacOSX::OSystem_MacOSX() 45 45 : 46 OSystem_POSIX("Library/Preferences/ ScummVMPreferences") {46 OSystem_POSIX("Library/Preferences/Pegasus Prime Preferences") { 47 47 } 48 48 49 49 void OSystem_MacOSX::init() { -
backends/platform/sdl/posix/posix-main.cpp
diff --git a/backends/platform/sdl/posix/posix-main.cpp b/backends/platform/sdl/posix/posix-main.cpp index d07db11..2bacaa8 100644
a b 20 20 * 21 21 */ 22 22 23 // Disable symbol overrides so that we can use system headers. 24 #define FORBIDDEN_SYMBOL_ALLOW_ALL 25 23 26 #include "common/scummsys.h" 24 27 25 28 #if defined(POSIX) && !defined(MACOSX) && !defined(SAMSUNGTV) && !defined(MAEMO) && !defined(WEBOS) && !defined(LINUXMOTO) && !defined(GPH_DEVICE) && !defined(GP2X) && !defined(DINGUX) && !defined(OPENPANDORA) && !defined(PLAYSTATION3) 26 29 30 #include <mntent.h> 31 27 32 #include "backends/platform/sdl/posix/posix.h" 28 33 #include "backends/plugins/sdl/sdl-provider.h" 34 #include "base/commandLine.h" 29 35 #include "base/main.h" 36 #include "common/config-manager.h" 37 #include "common/fs.h" 38 39 #define PEGASUS_DVD_TARGET "pegasus-dvd-release" 30 40 31 41 int main(int argc, char *argv[]) { 32 42 … … int main(int argc, char *argv[]) { 41 51 PluginManager::instance().addPluginProvider(new SDLPluginProvider()); 42 52 #endif 43 53 54 Common::String dataPath(DATA_PATH); 55 Common::FSNode ppDataDirectory(dataPath + "/PP Data/"); 56 57 Common::String ppDataPath; 58 59 // If we have the "PP Data" folder in the same directory as this bundle 60 if (ppDataDirectory.exists()) { 61 // Try to use this directory 62 ppDataPath = ppDataDirectory.getPath(); 63 } else { 64 // Search mounted volumes for the Journeyman disc 65 bool foundData = false; 66 FILE* fp = setmntent(_PATH_MOUNTED, "r"); 67 mntent* ent; 68 while ((ent = getmntent(fp))) { 69 Common::String discPath(ent->mnt_dir); 70 Common::FSNode discNode(discPath); 71 Common::FSNode discDataDirectory = discNode.getChild("PP Data"); 72 if (discDataDirectory.exists()) { 73 foundData = true; 74 ppDataPath = discDataDirectory.getPath(); 75 break; 76 } 77 } 78 79 if (!foundData) { 80 warning("Game data missing"); 81 return 1; 82 } 83 } 84 85 Base::registerDefaults(); 86 ConfMan.loadDefaultConfigFile(); 87 88 // Add the special target if it doesn't already exist 89 if (!ConfMan.hasGameDomain(PEGASUS_DVD_TARGET)) { 90 ConfMan.addGameDomain(PEGASUS_DVD_TARGET); 91 ConfMan.set("gameid", "pegasus", PEGASUS_DVD_TARGET); 92 ConfMan.set("gfx_mode", "opengl_linear", PEGASUS_DVD_TARGET); 93 ConfMan.set("fullscreen", "true", PEGASUS_DVD_TARGET); 94 ConfMan.set("platform", "linux", PEGASUS_DVD_TARGET); 95 } 96 97 // Always update the path 98 ConfMan.set("path", ppDataPath, PEGASUS_DVD_TARGET); 99 100 // Flush for good luck 101 ConfMan.flushToDisk(); 102 103 const char *pegasusParams[] = { 104 argv[0], 105 "--gui-theme=scummpegasus", 106 PEGASUS_DVD_TARGET 107 }; 108 44 109 // Invoke the actual ScummVM main entry point: 45 int res = scummvm_main( argc, argv);110 int res = scummvm_main(ARRAYSIZE(pegasusParams), pegasusParams); 46 111 47 112 // Free OSystem 48 113 delete (OSystem_POSIX *)g_system; -
backends/platform/sdl/posix/posix.cpp
diff --git a/backends/platform/sdl/posix/posix.cpp b/backends/platform/sdl/posix/posix.cpp index a711c3a..2d8a4e5 100644
a b Common::WriteStream *OSystem_POSIX::createLogFile() { 107 107 #ifdef MACOSX 108 108 logFile += "/Library"; 109 109 #else 110 logFile += "/. scummvm";110 logFile += "/.PegasusPrime"; 111 111 #endif 112 112 #ifdef SAMSUNGTV 113 113 logFile = "/mtd_ram"; … … Common::WriteStream *OSystem_POSIX::createLogFile() { 151 151 return 0; 152 152 } 153 153 154 logFile += "/ scummvm.log";154 logFile += "/Pegasus Prime.log"; 155 155 156 156 Common::FSNode file(logFile); 157 157 Common::WriteStream *stream = file.createWriteStream(); -
backends/platform/sdl/posix/posix.h
diff --git a/backends/platform/sdl/posix/posix.h b/backends/platform/sdl/posix/posix.h index 01a0152..f2e6a46 100644
a b 28 28 class OSystem_POSIX : public OSystem_SDL { 29 29 public: 30 30 // Let the subclasses be able to change _baseConfigName in the constructor 31 OSystem_POSIX(Common::String baseConfigName = ". scummvmrc");31 OSystem_POSIX(Common::String baseConfigName = ".PegasusPrimerc"); 32 32 virtual ~OSystem_POSIX() {} 33 33 34 34 virtual bool hasFeature(Feature f); -
backends/platform/sdl/win32/win32-main.cpp
diff --git a/backends/platform/sdl/win32/win32-main.cpp b/backends/platform/sdl/win32/win32-main.cpp index e5b26c3..a93c04a 100644
a b 37 37 38 38 #include "backends/platform/sdl/win32/win32.h" 39 39 #include "backends/plugins/sdl/sdl-provider.h" 40 #include "base/commandLine.h" 40 41 #include "base/main.h" 42 #include "common/config-manager.h" 43 #include "common/fs.h" 41 44 42 45 int __stdcall WinMain(HINSTANCE /*hInst*/, HINSTANCE /*hPrevInst*/, LPSTR /*lpCmdLine*/, int /*iShowCmd*/) { 43 46 SDL_SetModuleHandle(GetModuleHandle(NULL)); 44 47 return main(__argc, __argv); 45 48 } 46 49 50 #define PEGASUS_DVD_TARGET "pegasus-dvd-release" 51 47 52 int main(int argc, char *argv[]) { 48 53 // Create our OSystem instance 49 54 g_system = new OSystem_Win32(); … … int main(int argc, char *argv[]) { 56 61 PluginManager::instance().addPluginProvider(new SDLPluginProvider()); 57 62 #endif 58 63 64 // Get the path to our EXE 65 HMODULE hModule = GetModuleHandleW(NULL); 66 WCHAR wideCharPath[MAX_PATH]; 67 GetModuleFileNameW(hModule, wideCharPath, MAX_PATH); 68 69 // Convert to ANSI 70 char buf[MAX_PATH]; 71 WideCharToMultiByte(CP_ACP, 0, wideCharPath, -1, buf, MAX_PATH, NULL, NULL); 72 73 // Find the directory the EXE is in 74 Common::String exePath(buf); 75 Common::FSNode exeNode(exePath); 76 Common::FSNode ppDataDirectory = exeNode.getParent().getChild("PP Data"); 77 78 Common::String ppDataPath; 79 80 // If we have the "PP Data" folder in the same directory as this bundle 81 if (ppDataDirectory.exists()) { 82 // Try to use this directory 83 ppDataPath = ppDataDirectory.getPath(); 84 } else { 85 // Search mounted volumes for the Journeyman disc 86 bool foundData = false; 87 char szLogicalDrives[26 * 4 + 1]; 88 DWORD dwResult = GetLogicalDriveStrings(sizeof(szLogicalDrives), szLogicalDrives); 89 if (dwResult > 0 && dwResult <= sizeof(szLogicalDrives)) { 90 char *szSingleDrive = szLogicalDrives; 91 while (*szSingleDrive) { 92 if (GetVolumeInformation(szSingleDrive, buf, sizeof(buf), NULL, NULL, NULL, NULL, 0) && !scumm_stricmp(buf, "Journeyman")) { 93 Common::String discPath(szSingleDrive); 94 Common::FSNode discNode(discPath); 95 Common::FSNode discDataDirectory = discNode.getChild("PP Data"); 96 if (discDataDirectory.exists()) { 97 foundData = true; 98 ppDataPath = discDataDirectory.getPath(); 99 break; 100 } 101 } 102 szSingleDrive += strlen(szSingleDrive) + 1; 103 } 104 } 105 106 if (!foundData) { 107 warning("Game data missing"); 108 return 1; 109 } 110 } 111 112 // Work this into the config file 113 Base::registerDefaults(); 114 ConfMan.loadDefaultConfigFile(); 115 116 // Add the special target if it doesn't already exist 117 if (!ConfMan.hasGameDomain(PEGASUS_DVD_TARGET)) { 118 ConfMan.addGameDomain(PEGASUS_DVD_TARGET); 119 ConfMan.set("gameid", "pegasus", PEGASUS_DVD_TARGET); 120 ConfMan.set("gfx_mode", "opengl_linear", PEGASUS_DVD_TARGET); 121 ConfMan.set("fullscreen", "true", PEGASUS_DVD_TARGET); 122 ConfMan.set("console", "false", PEGASUS_DVD_TARGET); 123 ConfMan.set("platform", "windows", PEGASUS_DVD_TARGET); 124 } 125 126 // Always update the path 127 ConfMan.set("path", ppDataPath, PEGASUS_DVD_TARGET); 128 129 // Flush for good luck 130 ConfMan.flushToDisk(); 131 132 const char *pegasusParams[] = { 133 argv[0], 134 "--gui-theme=scummpegasus", 135 PEGASUS_DVD_TARGET 136 }; 137 59 138 // Invoke the actual ScummVM main entry point: 60 int res = scummvm_main( argc, argv);139 int res = scummvm_main(ARRAYSIZE(pegasusParams), pegasusParams); 61 140 62 141 // Free OSystem 63 142 delete (OSystem_Win32 *)g_system; -
backends/platform/sdl/win32/win32.cpp
diff --git a/backends/platform/sdl/win32/win32.cpp b/backends/platform/sdl/win32/win32.cpp index 5f860ad..eb89ffb 100644
a b 44 44 45 45 #include "common/memstream.h" 46 46 47 #define DEFAULT_CONFIG_FILE " scummvm.ini"47 #define DEFAULT_CONFIG_FILE "Pegasus Prime.ini" 48 48 49 49 void OSystem_Win32::init() { 50 50 // Initialize File System Factory … … Common::String OSystem_Win32::getDefaultConfigFileName() { 175 175 } 176 176 } 177 177 178 strcat(configFile, "\\ ScummVM");178 strcat(configFile, "\\Pegasus Prime"); 179 179 if (!CreateDirectory(configFile, NULL)) { 180 180 if (GetLastError() != ERROR_ALREADY_EXISTS) 181 error("Cannot create ScummVMapplication data folder");181 error("Cannot create Pegasus Prime application data folder"); 182 182 } 183 183 184 184 strcat(configFile, "\\" DEFAULT_CONFIG_FILE); … … Common::WriteStream *OSystem_Win32::createLogFile() { 237 237 CreateDirectory(logFile, NULL); 238 238 } 239 239 240 strcat(logFile, "\\ ScummVM");240 strcat(logFile, "\\Pegasus Prime"); 241 241 CreateDirectory(logFile, NULL); 242 242 strcat(logFile, "\\Logs"); 243 243 CreateDirectory(logFile, NULL); 244 strcat(logFile, "\\ scummvm.log");244 strcat(logFile, "\\Pegasus Prime.log"); 245 245 246 246 Common::FSNode file(logFile); 247 247 Common::WriteStream *stream = file.createWriteStream(); -
backends/saves/posix/posix-saves.cpp
diff --git a/backends/saves/posix/posix-saves.cpp b/backends/saves/posix/posix-saves.cpp index 9682832..b31d820 100644
a b 43 43 44 44 45 45 #ifdef MACOSX 46 #define DEFAULT_SAVE_PATH " Documents/ScummVM Savegames"46 #define DEFAULT_SAVE_PATH "Library/Application Support/Pegasus Prime Saves" 47 47 #else 48 #define DEFAULT_SAVE_PATH ". scummvm"48 #define DEFAULT_SAVE_PATH ".PegasusPrime" 49 49 #endif 50 50 51 51 POSIXSaveFileManager::POSIXSaveFileManager() { -
backends/saves/windows/windows-saves.cpp
diff --git a/backends/saves/windows/windows-saves.cpp b/backends/saves/windows/windows-saves.cpp index b84ab13..943ea75 100644
a b WindowsSaveFileManager::WindowsSaveFileManager() { 63 63 } 64 64 } 65 65 66 strcat(defaultSavepath, "\\ ScummVM");66 strcat(defaultSavepath, "\\Pegasus Prime"); 67 67 if (!CreateDirectory(defaultSavepath, NULL)) { 68 68 if (GetLastError() != ERROR_ALREADY_EXISTS) 69 error("Cannot create ScummVMapplication data folder");69 error("Cannot create Pegasus Prime application data folder"); 70 70 } 71 71 72 72 strcat(defaultSavepath, "\\Saved games"); 73 73 if (!CreateDirectory(defaultSavepath, NULL)) { 74 74 if (GetLastError() != ERROR_ALREADY_EXISTS) 75 error("Cannot create ScummVMSaved games folder");75 error("Cannot create Pegasus Prime Saved games folder"); 76 76 } 77 77 78 78 ConfMan.registerDefault("savepath", defaultSavepath); -
configure
diff --git a/configure b/configure index 5499cec..b874090 100755
a b _plugin_prefix= 159 159 _plugin_suffix= 160 160 _nasm=auto 161 161 _optimization_level= 162 _default_optimization_level=-O 2162 _default_optimization_level=-Os 163 163 # Default commands 164 164 _ranlib=ranlib 165 165 _strip=strip -
devtools/credits.pl
diff --git a/devtools/credits.pl b/devtools/credits.pl index 53f0d11..4fdc0db 100755
a b begin_credits("Credits"); 1097 1097 add_person("Janne Huttunen", "", "V3 actor mask support, Dig/FT SMUSH audio"); 1098 1098 add_person("Kovács Endre János", "", "Several fixes for Simon1"); 1099 1099 add_person("Jeroen Janssen", "japj", "Numerous readability and bugfix patches"); 1100 add_person("Keith Kaisershot", "blitter", "Several Pegasus Prime patches ");1100 add_person("Keith Kaisershot", "blitter", "Several Pegasus Prime patches and DVD additions"); 1101 1101 add_person("Andreas Karlsson", "Sprawl", "Initial port for SymbianOS"); 1102 1102 add_person("Claudio Matsuoka", "", "Daily Linux builds"); 1103 1103 add_person("Thomas Mayer", "", "PSP port contributions"); -
new file dists/pegasus/Info.plist
diff --git a/dists/pegasus/Info.plist b/dists/pegasus/Info.plist new file mode 100644 index 0000000..4490d1e
- + 1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 3 <plist version="1.0"> 4 <dict> 5 <key>CFBundleDevelopmentRegion</key> 6 <string>English</string> 7 <key>CFBundleLocalizations</key> 8 <array> 9 <string>en</string> 10 <string>ca</string> 11 <string>cs</string> 12 <string>da</string> 13 <string>de</string> 14 <string>es</string> 15 <string>fr</string> 16 <string>hu</string> 17 <string>it</string> 18 <string>nb</string> 19 <string>nn</string> 20 <string>pl</string> 21 <string>pt</string> 22 <string>ru</string> 23 <string>se</string> 24 <string>uk</string> 25 </array> 26 <key>CFBundleDisplayName</key> 27 <string>ScummVM</string> 28 <key>CFBundleExecutable</key> 29 <string>scummvm</string> 30 <key>CFBundleGetInfoString</key> 31 <string>1.6.0git, Copyright 2001-2013 The ScummVM team</string> 32 <key>CFBundleIconFile</key> 33 <string>pegasus.icns</string> 34 <key>CFBundleIdentifier</key> 35 <string>org.scummvm.scummvm</string> 36 <key>CFBundleInfoDictionaryVersion</key> 37 <string>6.0</string> 38 <key>CFBundleName</key> 39 <string>ScummVM</string> 40 <key>CFBundlePackageType</key> 41 <string>APPL</string> 42 <key>CFBundleShortVersionString</key> 43 <string>1.6.0git</string> 44 <key>CFBundleVersion</key> 45 <string>1.6.0git</string> 46 <key>NSPrincipalClass</key> 47 <string>NSApplication</string> 48 <key>NSHumanReadableCopyright</key> 49 <string>Copyright 2001-2013 The ScummVM team</string> 50 <key>SUFeedURL</key> 51 <string>http://www.scummvm.org/appcasts/macosx/release.xml</string> 52 <key>SUPublicDSAKeyFile</key> 53 <string>dsa_pub.pem</string> 54 </dict> 55 </plist> -
new file dists/pegasus/PegasusPrime.desktop
diff --git a/dists/pegasus/PegasusPrime.desktop b/dists/pegasus/PegasusPrime.desktop new file mode 100644 index 0000000..a9a2a63
- + 1 [Desktop Entry] 2 Name=Pegasus Prime 3 Comment=The epic time travel adventure begins 4 Exec=PegasusPrime 5 Icon=pegasus 6 Terminal=false 7 Type=Application 8 Categories=Game;AdventureGame; 9 StartupNotify=false -
new file dists/pegasus/debian/README.source
diff --git a/dists/pegasus/debian/README.source b/dists/pegasus/debian/README.source new file mode 100644 index 0000000..a7252c2
- + 1 This project uses a custom build of ScummVM licensed under GNU GPLv2 using 2 revision d04667e58a889e4744f36fb5797a69fa437a1abf. You may obtain the sources 3 from GitHub: https://github.com/scummvm/scummvm (direct link: 4 https://github.com/scummvm/scummvm/archive/d04667e58a889e4744f36fb5797a69fa437a1abf.zip). 5 On top of that revision, it has been patched with the "full_patch.diff" 6 (included in the pegasusprime source tarball) The dists/pegasus directory 7 missing from the patch is also included in the pegasusprime source tarball. 8 9 This is a cutdown ScummVM build because Pegasus Prime does not need many of the 10 usual features of ScummVM. -
new file dists/pegasus/debian/changelog
diff --git a/dists/pegasus/debian/changelog b/dists/pegasus/debian/changelog new file mode 100644 index 0000000..c681a98
- + 1 pegasusprime (1.0-5) unstable; urgency=low 2 3 * Minor bugfix release 4 5 -- Keith Kaisershot <archives@thejourneymanproject.com> Mon, 10 Mar 2014 13:29:11 -0800 6 7 pegasusprime (1.0-4) unstable; urgency=low 8 9 * Minor bugfix release 10 11 -- Keith Kaisershot <archives@thejourneymanproject.com> Sun, 09 Mar 2014 18:18:45 -0800 12 13 pegasusprime (1.0-3) unstable; urgency=low 14 15 * Minor bugfix release 16 17 -- Keith Kaisershot <archives@thejourneymanproject.com> Thu, 27 Feb 2014 10:05:56 -0800 18 19 pegasusprime (1.0-2) unstable; urgency=low 20 21 * Minor bugfix release 22 23 -- Keith Kaisershot <archives@thejourneymanproject.com> Mon, 24 Feb 2014 18:15:56 -0800 24 25 pegasusprime (1.0-1) unstable; urgency=low 26 27 * Initial release 28 29 -- Keith Kaisershot <archives@thejourneymanproject.com> Tue, 31 Dec 2013 15:44:53 -0600 -
new file dists/pegasus/debian/compat
diff --git a/dists/pegasus/debian/compat b/dists/pegasus/debian/compat new file mode 100644 index 0000000..7f8f011
- + 1 7 -
new file dists/pegasus/debian/control
diff --git a/dists/pegasus/debian/control b/dists/pegasus/debian/control new file mode 100644 index 0000000..0362061
- + 1 Source: pegasusprime 2 Section: games 3 Priority: optional 4 Maintainer: Keith Kaisershot <archives@thejourneymanproject.com> 5 Build-Depends: debhelper (>= 7.0.50~), autotools-dev 6 Standards-Version: 3.8.4 7 Homepage: http://www.thejourneymanproject.com 8 9 Package: pegasusprime 10 Architecture: any 11 Depends: ${shlibs:Depends}, ${misc:Depends} 12 Description: time travel adventure game 13 Experience the origin of the Journeyman Project series in this "director's 14 cut" remake of the award-winning time travel adventure game with greatly 15 enhanced animation and sound. As Agent 5 of the Temporal Protectorate, you 16 must explore across centuries for clues to a sinister mystery as Earth's 17 future hangs in the balance. -
new file dists/pegasus/debian/copyright
diff --git a/dists/pegasus/debian/copyright b/dists/pegasus/debian/copyright new file mode 100644 index 0000000..2fa382e
- + 1 Pegasus Prime was debianized by Keith Kaisershot <archives@thejourneymanproject.com> the 31st Dec 2013. 2 3 Upstream Authors: see `/usr/share/doc/scummvm/AUTHORS'. 4 5 ScummVM is Copyright © 2002-2013 The ScummVM Project 6 7 This program is free software; you can redistribute it and/or modify it 8 under the terms of the GNU General Public License as published by the 9 Free Software Foundation; either version 2, or (at your option) any 10 later version. 11 12 On Debian GNU/Linux systems, the complete text of the GNU General 13 Public License can be found in `/usr/share/common-licenses/GPL'. 14 15 This copyright also applies to the Debian-related build scripts. 16 17 Some parts of ScummVM (the mt32 softsynth code) is covered by a more 18 permissive BSD-style license: 19 20 * Permission is hereby granted, free of charge, to any person obtaining a copy 21 * of this software and associated documentation files (the "Software"), to 22 * deal in the Software without restriction, including without limitation the 23 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 24 * sell copies of the Software, and to permit persons to whom the Software is 25 * furnished to do so, subject to the following conditions: 26 * 27 * The above copyright notice and this permission notice shall be included in 28 * all copies or substantial portions of the Software. 29 * 30 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 31 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 32 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 33 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 34 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 35 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 36 * IN THE SOFTWARE. -
new file dists/pegasus/debian/docs
diff --git a/dists/pegasus/debian/docs b/dists/pegasus/debian/docs new file mode 100644 index 0000000..c73c810
- + 1 AUTHORS 2 COPYRIGHT 3 README 4 TODO 5 NEWS -
new file dists/pegasus/debian/menu
diff --git a/dists/pegasus/debian/menu b/dists/pegasus/debian/menu new file mode 100644 index 0000000..bf946ff
- + 1 ?package(pegasusprime):needs="x11" section="Games/Adventure" \ 2 title="Pegasus Prime" command="/usr/games/PegasusPrime" \ 3 icon="/usr/share/icons/pegasus.xpm" -
new file dists/pegasus/debian/rules
diff --git a/dists/pegasus/debian/rules b/dists/pegasus/debian/rules new file mode 100755 index 0000000..5f72554
- + 1 #!/usr/bin/make -f 2 3 %: 4 dh $@ 5 6 override_dh_auto_configure: 7 ./configure --prefix=/usr --bindir=/usr/games --datadir=/usr/share/PegasusPrime --docdir=/usr/share/doc/pegasusprime --disable-all-engines --enable-engine=pegasus --enable-optimizations --enable-keymapper --disable-eventrecorder --disable-mt32emu --disable-alsa --disable-bink --disable-faad --disable-flac --disable-fluidsynth --disable-mad --disable-png --disable-timidity 8 9 override_dh_auto_test: 10 11 12 -
new file dists/pegasus/debian/source/format
diff --git a/dists/pegasus/debian/source/format b/dists/pegasus/debian/source/format new file mode 100644 index 0000000..163aaf8
- + 1 3.0 (quilt) -
new file dists/pegasus/pegasus.xpm
diff --git a/dists/pegasus/pegasus.icns b/dists/pegasus/pegasus.icns new file mode 100644 index 0000000..83a4351 Binary files /dev/null and b/dists/pegasus/pegasus.icns differ diff --git a/dists/pegasus/pegasus.ico b/dists/pegasus/pegasus.ico new file mode 100644 index 0000000..d523358 Binary files /dev/null and b/dists/pegasus/pegasus.ico differ diff --git a/dists/pegasus/pegasus.xpm b/dists/pegasus/pegasus.xpm new file mode 100644 index 0000000..d967ede
- + 1 /* XPM */ 2 static const char *pegasus_icon[] = { 3 /* columns rows colors chars-per-pixel */ 4 "256 256 256 2 ", 5 " c #010101", 6 ". c #0B0301", 7 "X c #010B01", 8 "o c #0B0B02", 9 "O c #02010B", 10 "+ c #0B030B", 11 "@ c #060A0B", 12 "# c #130301", 13 "$ c #1B0301", 14 "% c #130B02", 15 "& c #180B07", 16 "* c #061403", 17 "= c #171504", 18 "- c #020113", 19 "; c #090516", 20 ": c #150916", 21 "> c #171618", 22 ", c #0A1415", 23 "< c #240301", 24 "1 c #2C0200", 25 "2 c #270B03", 26 "3 c #330300", 27 "4 c #3B0300", 28 "5 c #340C01", 29 "6 c #3B0B01", 30 "7 c #38090B", 31 "8 c #2C1400", 32 "9 c #261703", 33 "0 c #331300", 34 "q c #3B1300", 35 "w c #371A03", 36 "e c #261717", 37 "r c #310E17", 38 "t c #18280A", 39 "y c #282703", 40 "u c #372702", 41 "i c #2F2C11", 42 "p c #050225", 43 "a c #170526", 44 "s c #16112D", 45 "d c #261627", 46 "f c #2D1231", 47 "g c #2F282D", 48 "h c #1C202A", 49 "j c #470902", 50 "k c #560A03", 51 "l c #441401", 52 "z c #4B1B00", 53 "x c #481702", 54 "c c #531C00", 55 "v c #591704", 56 "b c #4F1216", 57 "n c #661906", 58 "m c #661B15", 59 "M c #73170C", 60 "N c #492702", 61 "B c #542300", 62 "V c #5B2300", 63 "C c #592A02", 64 "Z c #493502", 65 "A c #583803", 66 "S c #4E2D16", 67 "D c #632C01", 68 "F c #692605", 69 "G c #762906", 70 "H c #683602", 71 "J c #773603", 72 "K c #6B2517", 73 "L c #782916", 74 "P c #723618", 75 "I c #4E132D", 76 "U c #6E192D", 77 "Y c #502D2D", 78 "T c #732D2A", 79 "R c #374619", 80 "E c #564606", 81 "W c #694703", 82 "Q c #784703", 83 "! c #764816", 84 "~ c #705208", 85 "^ c #776B07", 86 "/ c #77492D", 87 "( c #5D532A", 88 ") c #12044D", 89 "_ c #2E104C", 90 "` c #332A4D", 91 "' c #310E6D", 92 "] c #22156A", 93 "[ c #4F1250", 94 "{ c #772C4F", 95 "} c #5D2264", 96 "| c #6B5354", 97 " . c #3A474B", 98 ".. c #873904", 99 "X. c #852A19", 100 "o. c #863719", 101 "O. c #913209", 102 "+. c #AD3503", 103 "@. c #872A26", 104 "#. c #8A3626", 105 "$. c #96392B", 106 "%. c #963736", 107 "&. c #8B2D34", 108 "*. c #A33D2F", 109 "=. c #871A0F", 110 "-. c #874902", 111 ";. c #974904", 112 ":. c #895602", 113 ">. c #965902", 114 ",. c #904B18", 115 "<. c #A75703", 116 "1. c #B05009", 117 "2. c #996602", 118 "3. c #8E6D07", 119 "4. c #A56903", 120 "5. c #B86803", 121 "6. c #A97506", 122 "7. c #B77804", 123 "8. c #AF7316", 124 "9. c #95452A", 125 "0. c #984937", 126 "q. c #8E492C", 127 "w. c #A6452B", 128 "e. c #A64533", 129 "r. c #B64F2E", 130 "t. c #B06D2D", 131 "y. c #8D6D2F", 132 "u. c #C8540B", 133 "i. c #C66904", 134 "p. c #C87702", 135 "a. c #D67903", 136 "s. c #D1700F", 137 "d. c #E67903", 138 "f. c #F17105", 139 "g. c #C95626", 140 "h. c #CD562D", 141 "j. c #D0712D", 142 "k. c #E95F15", 143 "l. c #92314D", 144 "z. c #93306F", 145 "x. c #A33365", 146 "c. c #984B4B", 147 "v. c #A64F52", 148 "b. c #95476F", 149 "n. c #AB506F", 150 "m. c #A76C59", 151 "M. c #D2645D", 152 "N. c #C13800", 153 "B. c #B6870D", 154 "V. c #A6950F", 155 "C. c #C88603", 156 "Z. c #D88703", 157 "A. c #D1920D", 158 "S. c #E68803", 159 "D. c #E99702", 160 "F. c #F99902", 161 "G. c #F39011", 162 "H. c #D7AC05", 163 "J. c #FEA401", 164 "K. c #FEAB00", 165 "L. c #F7A705", 166 "P. c #FEB400", 167 "I. c #FFBB00", 168 "U. c #F9B808", 169 "Y. c #FEA916", 170 "T. c #FEB718", 171 "R. c #E8AC05", 172 "E. c #CE8B2E", 173 "W. c #EB942A", 174 "Q. c #FBB32E", 175 "!. c #DCAC2B", 176 "~. c #FFC400", 177 "^. c #FECB00", 178 "/. c #FAC708", 179 "(. c #FED400", 180 "). c #FFDB01", 181 "_. c #FAD808", 182 "`. c #FFC719", 183 "'. c #F7D411", 184 "]. c #FFE400", 185 "[. c #FFEB00", 186 "{. c #FBE609", 187 "}. c #FFF300", 188 "|. c #FFFE00", 189 " X c #FDF508", 190 ".X c #FDEA16", 191 "XX c #FFC728", 192 "oX c #FFD82A", 193 "OX c #FFC737", 194 "+X c #FFD535", 195 "@X c #EBCF2C", 196 "#X c #FEE92E", 197 "$X c #D6CA06", 198 "%X c #AA9361", 199 "&X c #FBB44C", 200 "*X c #E3985E", 201 "=X c #FECB4D", 202 "-X c #FECF73", 203 ";X c #FFE96E", 204 ":X c #FCE855", 205 ">X c #320A90", 206 ",X c #3509AE", 207 "<X c #211698", 208 "1X c #591FA0", 209 "2X c #6A51A6", 210 "3X c #3407D0", 211 "4X c #3106F9", 212 "5X c #2623E7", 213 "6X c #4F0EFA", 214 "7X c #6E14FD", 215 "8X c #712FFA", 216 "9X c #5B22DA", 217 "0X c #6A52EA", 218 "qX c #962F8C", 219 "wX c #A230A3", 220 "eX c #AE528E", 221 "rX c #AF50AF", 222 "tX c #A25A9A", 223 "yX c #CF5F9E", 224 "uX c #A735D0", 225 "iX c #8B19FE", 226 "pX c #8C36F6", 227 "aX c #B737FE", 228 "sX c #AB33F9", 229 "dX c #9A2ADA", 230 "fX c #CA35FE", 231 "gX c #E039E4", 232 "hX c #B352CE", 233 "jX c #954BF6", 234 "kX c #B14FF7", 235 "lX c #A357D9", 236 "zX c #CF52CF", 237 "xX c #CF50FC", 238 "cX c #FD5AFF", 239 "vX c #EC50FC", 240 "bX c #D36CFB", 241 "nX c #FE67FF", 242 "mX c #FD77FE", 243 "MX c #E86FFB", 244 "NX c #D868D0", 245 "BX c #C92FAB", 246 "VX c #FDB394", 247 "CX c #FDB3AC", 248 "ZX c #E3929D", 249 "AX c #FFCD8F", 250 "SX c #FEEE8A", 251 "DX c #FFCAAA", 252 "FX c #FFEDAD", 253 "GX c #FF86FE", 254 "HX c #FF97FF", 255 "JX c #F491E9", 256 "KX c #FEB1FA", 257 "LX c #F9A7D0", 258 "PX c #FFC7D8", 259 "IX c #9E9595", 260 "UX c None", 261 /* pixels */ 262 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 263 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 264 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 265 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 266 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 267 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 268 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 269 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 270 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 271 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 272 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 273 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX& = = = > = > t UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 274 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXg g i i e w 9 2 8 8 8 0 w 9 9 e e h g ` ` ` ` ` .` UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 275 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX> g g Y ` Y Y b l q 0 7 5 5 2 1 3 1 7 q q l 7 S I Y ` .` . .<X .<X` .UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 276 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXe e i S S Y S Y r 5 < 1 < < < < # # # # % 3 k k k x j x j x r i e ` ` ` ` . . .` R UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 277 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX> i i S S S b q 5 3 1 < # % # . . . . . . 7 M k k k j j k k k k k c b w i g R g g g t > t > UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 278 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX> e i S b x 6 7 3 < $ . . . O O O . b &.&.=.M n n M M n k n k v k k k j r r 9 e = % o * o o UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 279 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX> g S S c x j 1 2 # . # O O O O O . I &.l.l.&.@.@.@.L X.X.K F n k k j j 4 3 1 5 & % % % @ o o o UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 280 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXe i S S b j 4 < # . . . O O O O O O . b { %.&.&.#.@.#.&.@.@.@.L L K n n n v k j 5 < < $ # # . . o o * UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 281 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXe i Y S k k 3 < # . O O O O O O O O O O . . : Y &.&.%.@.@.#.&.&.&.#.#.#.@.@.#.#.T L L K n k j 3 1 < $ % o o * * o UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 282 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX& e i b x j 3 $ . O O O O O O O O O O O O O @ : I l.&.#.&.#.&.#.$.$.#.#.o.#.#.#.#.@.@.L L L m n k j 3 3 < # . @ o * = t UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 283 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX% e e w b j 4 < # . O O O O O O O O + + . & Y %.%.%.%.%.$.%.$.#.#.$.#.#.#.o.L X.X.L L L L L K v v j 1 1 # # o * = t t UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 284 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX& e 2 7 j 4 1 # . O O O O O O O O O O O ; + & > T l.v.e.e.e.9.9.$.$.$.9.#.#.#.#.#.#.#.#.X.L L L L K K n v 6 1 < # % = t i R t UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 285 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXo > 9 5 4 4 1 $ . O O O O O O O O O O O O O O + + & & T n.M.M.m.v.0.w.w.9.w.9.$.9.9.9.9.#.#.#.#.o.#.X.L =.M L K F k 4 1 < = t t y R R > UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 286 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX% e 2 5 j 3 $ . O O O O O O O O O o & % e q.*XCXVXVX*X*X*X*Xt.h.r.r.0.q.#.$.#.#.o.@.o.o.o.o.X.L L L K n v j 4 1 & = t t y t * UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 287 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX& > 1 4 4 1 # . O O O O O O O X @ + & e 0.VXFXDXAX;X;X;X:X;X-XVX*X*XM.r.e.w.#.$.#.#.o.o.o.X.o.L K L G n F c j 1 < 9 t t t t t UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 288 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXX & 2 5 4 4 < . O O O O O O O O O O @ X % > & 9 0.VXFXFX;X;X;X;X:X:X;X;X;X;X-X&X*X*Xe.,.w.9.$.O.o.o.#.L G L L G K m v j 4 1 $ o t t t t UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 289 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXo & r 7 4 3 $ . O O O O O O O X X o @ > & e 0.AXDXDXSX-XSX;X;X;X;X:X;X:X:X:X-X-XVX*Xh.w.$.O.o.#.X.L L L L L G K F n v 4 < # * t t R t UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 290 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX@ > r l j 3 $ . O O O O O O X X + > & w c.VXPXFXAX;XSXAX;XSX-X-X-X;X-X:X:X=X;XDXVXM.v.*.$.#.o.@.#.o.X.L L K G F F c j 1 % = * t t t UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 291 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX> d I b j 3 # O O O O O O O X X O @ @ , & e i v.CXPXPXAXAX-XAXAXSXAXSX-X-X:X=X=X:X:X-XPXPXCXZXr.#.o.o.#.P P X.L L F K K K v l < $ * * t t t UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 292 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX: f I r j 3 $ . O O O O O O @ @ @ , , > > e c.CXPXPXDXSXSXAXSXDXAXSXAX-X-X-X-X-X-X=XDXKXKXPXCX*Xg.,.#.#.#.L P X.G K m G K V x 3 2 o * t t t UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 293 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX: d g I 7 4 $ O O O O O O O O @ @ , , > > h i c.CXPXPXDXAXDXAXAXAXAXAXAXAX-X-XAX-X-X-X;XPXKXKXPXVXVXE.w.o.#.o.o.L L L K F n n n x 1 $ * * * * * UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 294 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX& 2 r 7 j 1 # . O O O O O O O O O @ @ , , , , h > e r c.ZXKXCXDXAXAXAXAXAXDXAXDXAXAXAXAXVX-X-X-XCXLXCXAX-X-XVX*Xg.O.#.X.X.o.L P L n n n v q 1 # @ X X UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 295 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX% & e 7 4 4 $ O O O O O O O O O O @ @ , @ , , , , , > e i v.JXKXPXDXDXDXFXDXDXAXDXDXDXDXAXAXAX-XAX-XAXAXVXAX-X-X-XVX-X*X$.X.@.@.P L L L K n m m x 1 X UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 296 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXX & < 1 4 3 < O O O O O O O O X @ , , , - @ , , , , e g n.JXJXDXDXDXDXDXAXAXDXAXAXDXDXDXAXAXAXAXVX-X-XVX-XVXVXAX-X-X-X*Xr.=.@.P L T L K K m V v x $ UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 297 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX: 2 1 3 j < . O O O O O O O O O O O @ @ , , , @ @ @ , , > > h g qXGXKXCXDXDXDXFXDXPXDXVXVXVXDXDXDXCXAXAXAX-X-X-X-X-XVX-XVX-XVXDXVXv.O.L #.T L L K F m n v j # UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 298 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX& & < 4 j 3 # O O O O O O O O O O O O @ @ , @ , @ O - , h > d h d f rXGXKXLXPXPXPXPXPXPXPXDXCXCXVXDXCXDXDXAXAXAX-X-XVX-XVXAXVXAXCXCXJXLXM.=.X.@.P X.L K K n n v 7 X UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 299 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX& e & 1 j 4 # O - O O O O O O O O O O @ @ @ , @ O O O , s h h g g g Y tXGXKXKXKXKXPXKXKXKXKXKXPXDXVXVXDXVXAXVXAXAXAXAXVXVXVXDXDXLXPXKXKXHXJXyX@.o.T L P L m m v v x < UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 300 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX& 2 5 4 4 < O O - O O O O O O O O O O - @ @ @ ; O @ , : h h ` ` ` g g g rXGXHXKXKXKXKXKXKXKXKXKXPXPXDXVXDXDXDXDXVXDXDXDXDXDXDXCXLXPXKXKXHXHXGXmXyX&.L L L L K m m v v j . @ UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 301 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX& 2 5 j j 1 . O O O O O O O O O O O O O O @ @ @ @ - - + @ , s g h ` g g g I tXGXKXPXPXPXPXPXPXKXKXKXKXLXCXCXCXCXCXDXCXCXCXPXPXLXLXPXKXKXKXHXGXGXGXGXmXzX{ U T T K K K m v v 5 UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 302 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX& & 1 4 j 4 # O - - - O O - - O O O O O O O O O @ @ @ + - @ ; @ @ , e d d g g g g b.LXPXPXFXDXDXDXPXPXPXKXKXKXLXCXVXZXCXCXCXLXLXKXKXKXKXKXKXKXHXGXGXGXGXGXHXGXzX{ L T L L K m n v k 2 X UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 303 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX& < 1 4 4 < . - - - - O O O O - - O O O O @ O - + + + @ @ @ + , > d e d I Y l.ZXIX*XVXAXFXDXDXFXDXDXPXPXKXLXCXVXVXCXCXCXPXLXKXKXKXKXKXHXGXGXGXGXGXHXGXGXmXrXT L U K K m m n v j . @ UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 304 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX: & 2 3 4 1 # O - - - - O - O - O O O O O O O @ + + O @ + @ . . @ : > f I Y { { c.c.v.n.b.Y T T c.%XZXVXAXAXAXDXDXDXCXCXVXVXVXVXVXCXCXPXKXKXHXHXGXGXHXHXHXHXHXHXHXGXmXx.L L K K m m v v v 5 O UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 305 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXo & < 1 3 3 $ O p p p - - - - O O O O O O O O + @ + ; @ + . o d Y { c.n.n.M.M.M.M.j.M.tX9X} g d e I Y P / 0.%X*XAXAXAXVXVXZXZXZXVXZXVXVXPXKXHXHXGXHXHXHXHXHXHXHXHXGXGXNX@.L K T K m m v v k $ UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 306 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX: & 1 1 4 1 O - p p p - - - - - O O O @ O O O @ @ + + O O % + + r T b.n.n.M.M.M.M.M.M.j.j.M.uX8X2X_ a : : 2 & r r S / y.*XVXVXVXVXVXZXZX*XZXVXZXJXmXHXHXHXHXKXHXHXHXHXHXHXmXnXeX@.T T K m m v v v 6 UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 307 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX+ & 2 1 3 3 < O p p p p - p - - p O X @ - O O @ + @ O + + . . : Y c.BXM.M.M.M.M.j.k.h.k.h.j.h.rX8X9X) ; : : : : d f e 9 r S 0.*XAXAXVX*X*XM.*X*X*XZXJXGXHXHXHXHXKXHXKXHXHXHXGXnXvXl.L T K K m m v v x # UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 308 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX& < 1 3 4 1 # p p ) p p p p p p - O O , - O O + ; + @ : # + f c.yXyXM.h.h.h.h.h.h.h.j.h.j.h.M.rXpX1X_ a : : a > a : > > e e w b 0.*XVXZX*X*XM.M.M.M.JXGXHXHXHXHXKXHXKXHXHXGXGXmXnXzXU L U U K m k v v 5 . UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 309 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX: & 2 3 4 4 $ + p p p p p p p p - O @ ; - O O O @ + + . # d l.M.yXyXM.M.h.h.u.u.k.h.h.h.h.h.g.h.eXpX1X_ : & : > : : : : : : : > : r m v.M.ZXyXZX*XM.k.yXmXGXHXHXHXHXHXHXHXHXHXGXGXmXcXrXT M K K m m n v k # @ UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 310 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX% : < 1 4 1 + : ) ) ) p ) p p p O O O - O . O + . . O + Y v.yXyXM.M.h.h.h.h.h.h.k.h.h.h.h.h.g.r.qX8X1X_ : + : : + + : : + : : & : : & < Y M.LXNXZXyXM.M.NXnXGXJXHXHXHXHXHXHXGXGXGXmXmXvXl.m m K m m v v b 2 UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 311 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX+ 2 1 1 4 1 : p ) ] ) p p p p p O O O O + O O & / yXyXM.h.h.h.h.N.h.h.N.g.h.h.h.h.h.g.g.t.b.dX1X) ; + ; ; ; ; + + + + + + : & : & & Y M.JXJXNXNXyXyXNXmXmXGXHXHXHXGXHXGXHXGXmXnXnXwXU K m m m m v v 6 . UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 312 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX. % $ 1 1 3 < a ) ] ) ) ) ) ) p p O O O O . . 2 x.yXyXM.M.k.h.h.h.N.N.h.h.h.g.g.h.h.h.g.g.t.b.dX1X_ - . + ; ; O O . + . O + & + & : + : b b.MXGXNXNXyXyXvXnXmXmXGXGXGXGXGXGXGXmXmXnXvXl.m m m m m m n x < UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 313 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX& $ < < 3 3 $ ) <X<X] ) ) ) p p p O O O O . . O r v.yXM.M.h.h.h.g.r.h.h.h.h.N.h.g.h.k.h.h.g.g.r.qX2X1X] - O . ; - O O O O . + + + : + & & e d z.mXGXMXzXzXzXxXnXnXmXmXGXGXmXGXGXmXmXnXnXx.U K m m m v v v 3 UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 314 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX# # < 1 4 1 : <X<X<X) ] ) ) ) ) - O O . O O 2 v.yXyXn.g.g.g.g.g.g.g.r.g.g.N.g.g.g.h.h.h.g.s.r.b.dX1X_ ; + ; O O O O O O + + : : > > e d tXmXmXMXzXrXhXxXvXnXnXmXmXmXmXmXmXmXmXnXBXU T U m m m v v 6 . UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 315 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX# & $ 7 7 r 7 _ 3X3X<X<X] ] ) ) p - O . . < x.M.BXh.h.g.r.r.r.r.g.r.g.g.g.g.u.s.g.g.h.h.j.g.r.qX2X1X) - O O O O O O . + + ; : @ > > g zXGXmXMXzXrXhXxXvXcXnXnXmXmXmXmXnXmXnXgX{ K K m m m n v j $ UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 316 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX: d f f [ I _ >X4X4X<X<X<X] ] ) ) O . # # { M.eXM.h.r.r.r.r.h.h.r.r.h.r.g.g.g.g.g.g.g.h.g.g.r.eX9X1X_ - O O O O O O O O ; ; > > e > [ NXmXMXNXhXhXuXkXvXcXcXnXnXnXnXnXnXcXcXqXm m m m m m b x 3 . @ UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 317 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX: g ' ' [ U [ 3X4X4X5X<X<X] <X) p - . . . I n.n.v.r.r.r.r.r.r.r.r.r.g.r.N.r.g.r.u.g.g.u.g.u.g.t.b.uX1X_ - O O - O O O . O @ , > e > > h } mXmXvXzXrXuXkXfXvXvXcXcXcXcXnXnXcXcXBXU K m m m v v v l . UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 318 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXX > <X,X,X>X[ ] 3X4X4X4X3X<X<X<X) p O O . j x.n.M.r.r.r.r.r.r.r.r.r.r.r.h.r.r.g.N.r.u.N.g.g.g.u.r.qX0X1Xf - O O - O O O @ , , > h h > > 2XmXnXNXyXwXrXaXaXvXvXvXcXcXcXcXcXcXgX} m m m m v v v l # O UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 319 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX, ) 9X0X9X1X1X<X5X4X4X4X4X3X<X<X) p - O . # # @.yXx.v.e.*.*.r.x.h.v.r.r.r.r.r.r.r.g.r.1.r.r.g.r.1.r.r.b.dX1Xf O O O O O O O O O @ , > > h > , > f hXmXnXzXeXwXuXsXxXxXvXcXcXvXcXvXvXgXqXY m m m m v v l < O UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 320 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXs <X5X5X8X9X,X,X3X4X4X4X4X4X<X<X) p - O O . $ b x.M.v.r.*.*.r.e.h.v.r.r.r.r.r.w.r.N.r.r.r.r.N.r.1.r.1.r.b.dX1X_ O O O O O O @ @ @ * t , > h d h g } MXnXzXBXeXwXuXaXfXxXvXvXvXvXvXvXsXqXU m m m b v v k < . UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 321 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX) <X8X0X5X3X} ,X4X4X4X4X4X4X4X<Xp - - O O O O 7 l.n.v.r.e.r.*.e.r.*.e.e.r.e.r.r.r.r.r.r.*.N.r.r.r.r.+.1.w.b.1X1X_ . O O O O O O O X @ * , , > i h d d _ uXnXvXzXrXqXuXkXaXfXfXgXvXvXgXfXuXqXm m m m m v v x 5 UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 322 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXp ] 5X0X8X,X} [ ,X4X4X4X4X4X4X4X,Xp - - O O . b n.eXh.e.e.*.e.e.e.e.r.v.e.e.r.e.r.w.r.w.r.e.w.r.w.w.1.+.w.z.1X1X) * X O O O O O O @ X * * , t h h i h h 1XvXvXzXhXwXwXuXaXkXfXfXvXfXfXfXdXwXU m m m m b v k 5 UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 323 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXs ] 0X5X>X_ I _ ,X4X4X4X4X4X4X4X3X) p - O O O . &.eXqXr.r.*.*.e.e.e.e.e.e.e.e.e.e.r.r.r.w.r.e.r.+.w.r.w.w.O.z.1X1X_ O O - O O O O O X @ , , t h g g h h ' kXvXxXhXwXwXuXsXaXfXfXxXfXfXfXsXwXT m m m v v v v 5 . X UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 324 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXp ` ' ' f 7 7 _ ,X4X6X4X4X4X4X4X3X) - - - O O . O $ x.rXx.r.e.e.e.r.*.e.e.e.e.e.e.e.e.e.*.w.w.w.w.w.r.w.w.w.O.w.{ 1X1Xh O . O O O O O X @ @ * * , e g h d h ` dXvXgXzXwXuXuXsXaXfXfXfXfXfXaXaXwXU m m b b v v v 6 . UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 325 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX, > e : < 7 j _ ,X6X6X6X4X4X4X4X5X) - - O O O . . b eXeXx.*.*.*.e.*.e.e.*.e.e.e.e.*.w.w.e.e.w.w.w.w.w.w.w.w.O.O.l.1X1Xh O . . O O O O X @ * , * , t g t h g f wXfXvXuXuXuXuXsXaXaXaXfXaXfXfXfXwX{ m m m m v v x 6 # @ UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 326 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX& & # $ 1 7 7 ' ,X6X6X6X4X6X4X4X4X) p - - O O O # { BXeX*.*.*.w.*.*.e.e.e.e.e.0.e.%.e.w.e.w.w.w.e.9.9.w.$.o.O.#.| } 1X_ + . . O O O O O O * * , , t t i h g f } zXxXdXwXuXsXaXsXaXfXfXsXfXsXfXdX{ m m m v m v x q < UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 327 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX. & $ 2 r r 7 ' ,X6X7X6X6X4X6X4X3X) - p - - O . # l.eXn.*.+.*.w.w.*.e.*.*.e.e.e.%.e.%.e.e.$.9.w.w.w.e.9.$.O.O.#.{ 1X1X_ + . . + O O O @ * * , t g h g g g ` uXxXuXdXdXsXaXfXfXfXiXfXfXfXfXBX{ m m n b v v v x 1 O UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 328 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXo & 2 2 r r I ' ,X9X6X6X6X4X4X4X4X] - - O - O < x.yXx.*.$.*.*.*.e.e.*.e.0.e.0.e.9.e.9.9.e.e.9.e.9.9.w.r.t.w.,.{ 1X>Xs # . . + . O O X @ @ * t , g h h g h _ wXpXuXrXdXaXsXaXsXfXsXfXfXfXfXdXU v m b n v v x x 1 X X UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 329 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX. & < 2 r I I ' 3X6X7X6X6X6X6X4X4X) - p - O O . . 7 n.BXM.*.+.*.*.e.e.$.e.$.e.e.w.e.e.$.w.e.w.9.$.$.9.e.t.j.E.E.5.,.` ' e = & # . @ O O X @ * * , t t h g h h _ 1XdXuXuXsXsXaXaXaXsXsXfXfXiXsXdXU m m m m V v c x 0 o X X X UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 330 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX@ & < 2 r r [ ,X6X6X6X7X6X6X4X6X4X) - - - - O O . I eXyXx.*.+.*.*.*.*.%.*.e.e.e.%.*.9.e.$.9.e.9.e.w.r.j.E.E.A.S.Z.<.@.K B q 2 $ . . O @ * * * t t h g h h f } dXdXuXsXsXaXaXaXsXsXfXsXsXdXz.T m m v v v v c c l = * X X X UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 331 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXo & 2 < r I [ 1X6X6X7X6X6X6X6X4X4X) - p - O O . . I eXBXv.*.O.w.*.*.*.e.$.*.$.e.$.%.*.$.e.$.9.9.w.g.s.S.S.S.G.L.L.Z.i.1.O.n 6 & . . O O X X X * , t t h g g h ` z.wXuXsXaXaXaXaXaXsXaXiXfXdXz.U m m m m n v c v c u y * * * X X UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 332 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX. & 2 e r I I 1X3X7X7X6X7X6X6X6X4X) p - - - - O . . . U BXyXx.*.O.$.*.*.e.$.*.*.*.$.e.e.$.e.$.$.w.w.g.s.S.S.a.S.K.~.(.~.I.D.a.1.=.j $ # . O O X @ * * * > t g h g h f 1XwXwXsXaXsXsXfXfXsXsXsXdXz.&.U m m m V V v v c B u y t = * * o @ UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 333 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX# > 2 2 e b I [ ,X6X7X7X7X6X6X7X4X<Xp p - - - O . k yXzXn.*.O.$.*.$.%.*.*.$.*.*.$.e.$.$.9.$.,.r.s.a.d.a.Z.J.^._.).).(.(.^.J.k.O.k 1 & . O O X X * * t t h g g s _ 1XwXuXdXsXsXaXsXsXfXiXdXqX&.@.M m F m m v v v c c Z y y y y = * + UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 334 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX+ & e r r e I [ ' 3X7X7X7X6X6X6X6X,Xp p p - O O . j eXzXM.*.=.$.*.*.$.%.*.$.$.$.%.$.$.$.$.*.w.u.s.i.u.S.F.~.).).).(.(.^.^.~.Q.g.=.k 1 + O . O O X * * * t > i g h h _ 1XrXwXdXaXaXaXaXfXiXuXqXl.&.@.K m S n V n v V n V u u y y y y * UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 335 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXo : e r : r I [ [ ,X7X7X6X7X6X6X6X3X) p - - O O . 7 x.zXyX*.+.$.$.$.*.$.$.*.*.$.$.$.$.$.$.*.w.u.5.1.s.F.K.~.).).).).^.(.~.Y.G.u.=.M j $ ; O X X X * , t h h g g f } wXdXsXsXsXsXsXiXdXx.z.l.&.U U m F n n V v F F V u u y y R y * UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 336 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX@ & e 2 & & r I I >X6X7X7X6X7X6X6X4X<X- p - - - O . < l.BXyXx.=.*.*.*.*.$.$.%.$.$.$.$.$.$.$.*.,.;.O.O.i.D.L.U.(.).).(.^.~.P.W.t.,.G M k r ; O X X * o t t h h h e r z.wXuXsXsXsXsXsXwXz.l.l.&.U =.M m m V v c n G J Z u Z y y y y t O UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 337 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXX & = & # # $ r [ 1X7XiX7X7X6X6X6X6X,Xp - O - - O . O $ l.zXzXe.$.$.$.$.$.$.$.$.$.$.$.$.$.$.*.$.O.G n n J 7.H.U.^.(.).(.~.P.W.j.0./ T m k 7 a O X * * > t t t e e g { qXwXsXjXsXdXwXx.z.l.l.U =.U U F F n V v F J J A u y u Z y y t X UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 338 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX@ o # & # $ $ r [ 1XiX7X7X7X6X6X6X6X4X) O - - - O O . . I zXyXx.&.$.&.$.$.@.$.$.$.$.$.$.$.%.$.$.o.G k l N W 3.A.I.^.).^.U.D.8.q.| | } U b 7 ; O X X * = t t t > > I &.x.BXiXsXdXqXx.l.l.&.&.@.L K n F F n n n F ..Q H Z u u u y y = UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 339 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX @ % # # $ < 2 [ dX7XiX7X7X7X6X7X6X4X,X- - - - O O O O O O . r BXzXn.*.$.#.@.%.&.&.$.$.$.$.$.$.$.$.#.X.n j 0 9 u N Q H./.(.(.U.Z.,.T Y } } I k 7 : O X X X * , > h > > h U l.qXwXdXuXqXl.l.l.l.U =.L K m F F n V V F J ..Q A Z Z N u u y = UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 340 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX@ . # $ $ < 5 I 1X9X7X7X7X6X6X6X6X6X4X) - - - O O O O . # l.zXBXv.$.#.@.$.$.$.$.%.%.$.$.%.$.$.#.X.n j 8 9 9 = 2 ~ H.)._.U.6.P S Y / Y b k 7 ; @ X X X X * = t > @ d &.x.x.qXwXqXz.l.&.&.U =.@.L m K F F n n n J ....W W E Z u Z Z y = UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 341 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXX @ % $ $ < 8 b { qX9X7X7X7X7X7X6X6X4X] p p - - O O O O . . + b yXgXn.$.#.&.&.$.$.$.%.$.*.%.$.$.$.$.=.v j 5 & o . 2 B.].}.H.Q c l N b b k j 3 O O O X @ X X * @ t , = , r l.l.l.l.l.l.l.&.&.=.@.@.X.M K F F F F v F ..;...W E W A Z Z Z i = UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 342 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXX X % $ < 2 5 k [ z.1X,X7X7X7X6X6X6X6X3Xs - - - - O O O O O d l.gXeX*.%.&.%.%.$.%.%.$.%.$.%.%.$.@.@.n j 5 & % . 3._.[.H.A N 7 w z x j j $ + O X X * * * = > > > T %.&.&.l.&.&.&.&.@.=.&.L M K K n F F n V J ;.;.-.W ~ ~ E A E E i = UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 343 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX X % 2 1 5 0 j U U } 1X6X7X7X7X6X6X6X4X>X- - - - - O O O O . + : I BXzXx.%.%.&.%.%.%.%.%.%.%.$.%.$.$.@.m 4 1 2 o X ~ /.{.B.H N l q x c j 3 # X X X X X @ * * @ > r &.%.&.*.&.&.@.@.=.@.=.=.X.L F F F G F D G -.>.<.Q Q ~ ~ W A W ~ E o UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 344 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXO X * $ 5 6 q 6 v U } 1X9XiXiX6X8X6X6X6X4X) O - - - - O O O O . . + & x.vXrXv.%.@.@.%.%.%.%.%.&.$.$.&.$.@.M j 3 < . X u V.'.3.S q q q j k j 1 . X O X X X o = o @ > T $.%.&.%.%.&.@.X.=.@.U @.=.F G F F F F F -.;.>.>.^ ~ :.~ W W :.3.u o UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 345 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX X X $ 5 l l z b { z.qXqX7X7X8X6X6X6X4X6X,Xp - - - O O O . O + + + I BXzXeX%.$.$.%.%.%.%.%.$.&.%.&.$.$.L j 4 < . t 3.V.A w q 0 6 j j j < O X X @ * @ * * @ * b &.%.%.*.&.*.&.@.@.@.=.=.=.L M G F G F F ..;.<.<.:.2.2.:.:.~ ~ 6.2.y UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 346 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXX X * % 5 l c B Y c.b.z.} 1X7X6X6X6X6X6X6X4X>X- - - O O O O O O O - l.zXrXx.c.%.*.%.%.%.%.%.$.&.%.%.%.@.m j 3 . X y y > & 0 q 6 j j 3 # O X X * o * o @ d &.0.%.%.%.%.$.@.=.@.X.X.X.L D G F G D F J ;.;.<.>.3.6.6.3.:.^ :.C.6.y UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 347 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXX * * 2 x v C c.c.b.x.{ } 1X6X8X6X6X6X5X6X3X) p - O O O O O . O . O 7 qXzXhXx.l.%.l.%.%.%.&.%.&.$.%.%.&.m j 3 # X + e 7 q j j j < X X X X X = * o o o , T 0.%.%.%.*.l.%.@.$.=.X.X.G G G D G F F J ;.<.<.<.2.6.6.6.3.:.:.4.D.6.= UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 348 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXX * * 9 N S T c.c./ %.&.{ } 9X7X6X6X6X4X6X5X>X) - O O O O O O O . O r BXgXhXn.e.%.%.%.%.%.%.%.%.v.v.l.U k 4 $ . O @ : 5 5 6 l j 4 $ X @ X X X o o * * * @ S %.c.*.l.c.%.%.%.$.@.$.=.L G H G G G F G -.<.i.4.2.6.B.7.6.2.3.4.Z.L.3.X UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 349 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXX * * = N T / / ,.y.*.&.=.U 1X7X6X7X6X6X5X4X,X] ) O O O - O O O O . O . ; f eXvXrXx.%.%.%.%.%.%.%.l.v.x.v.&.m j 3 # . & w 5 5 6 6 j 1 . O X @ X @ O X o * o , & b &.%.%.%.%.%.l.*.%.@.@.=.=...G G G G F G ..<.i.5.2.2.C.C.7.6.6.2.C.D.L.E X UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 350 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXX * X * Z / / ,.,.,.,.,.$.=.U 1X6X6X6X4X6X3X,X>X' p p - O O O O O O O O + ; r z.zXwXv.l.%.&.&.%.l.x.b.n.l.&.M k 7 < . O . & 8 0 6 l j j $ o X X O @ o X o & & b &.$.$.#.#.%.%.%.%.$.@.X.L G J J G G G D J <.i.5.5.6.C.C.C.7.6.6.7.S.P.A.u . UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 351 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXX @ * * i ! / ,.! ,.! ,.,.w.=.[ 9X6X6X6X6X3X,X>X' ) a p O O O O . O . + ; ; 7 l.eXn.v.%.%.%.%.c.qXeXn.%.@.@.m 7 1 # . < 5 7 q j k 4 # @ X . o X > b @.$.$.$.@.#.$.%.*.*.$.X.L ..G G J G J F J <.5.i.4.5.C.Z.A.C.C.6.7.C.D.I.B.y @ UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 352 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX@ X * t u ~ ! -.:.,.3.:.y.j.r.=.I ,X4X5X6X3X,X>X' ] ) a - - O O O O ; O + ; - < U x.eXx.l.%.%.n.rXrXn.&.=.@.=.j 4 2 % * # < 7 7 l x k 1 X . . . O X @ X w T $.$.@.@.@.#.%.%.$.%.%.X.G J G J G G J G J <.p.p.5.4.B.A.A.A.C.B.6.C.S.L.~.3.y @ UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 353 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX * * t E ~ :.,.;.,.,.t.E.M.e.M [ 1X3X9X3X,X<X>X] _ ) a ; O O O . O ; O - O O $ I { eXn.x.l.eXuXuXqX&.&.&.U m j j w y i g b b b x 3 # . . > Y @.&.@.$.@.@.#.@.&.%.#.o.o...J G J J G J G J <.p.p.5.7.C.C.D.D.D.C.C.C.D.K.~.R.W e UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 354 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX X * t E ^ 3.:.,.,.8.j.E.*XM.1.K I >X,X,X,X>X' ' ) ) ) a ; ; - O O O O O + ; ; ; d I { b.z.rXhXkXuXn.l.l.&.=.k v S S ( Y { I b j < O @ . . . . & > Y T &.$.$.@.@.@.$.@.&.$.o.o.X.P ..G G G J G G -.4.p.p.7.7.p.S.D.D.A.Z.Z.A.D.P.~.^.C.y % UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 355 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXX X t E ^ 3.2.,.2.t.E.E.W.j.j.+.v I ' >X>X' ' ' _ _ _ a a p ; O O O O O ; + - @ ; > > d } b.wXrXrXzXhXwXx.%.&.M v S R Y Y Y Y b 4 # . + o . . . . & r m U &.$.$.$.@.o.X.@.$.@.@.@.X.G J G G J J J J J -.5.p.p.p.p.C.D.D.L.D.Z.A.D.R.L.U.^.~.2.t * UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 356 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXo X @ t E y.y.y.8.t.t.E.*XE.E.j.s.+.=.I _ ' _ _ _ _ ) a a a p ; ; O O O O O O @ - ; , , > , h ` } z.z.qXwXqXqXz.&.n k u i S b k j < o o % @ & & > e S T &.$.$.$.$.@.$.@.@.o.X.X.X.L J J X.G J J G J J ..8.p.C.p.p.Z.A.D.L.D.D.D.D.A.R.@XQ.U./.L.W t , UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 357 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXe h e > t y Z ^ y.t.t.t.E.*X*X*Xj.B.s.j.+.=.k f f ) _ _ _ _ a a a ; ; ; O O O O O ; @ ; ; : > ; > > > h g Y [ } } } { b j l 8 w j j 4 < < 5 6 w b m T T %.%.$.$.$.$.@.X.X.X.o.X.X.X.G G J L J J ..G J ..,.5.p.a.Z.Z.A.R.P.I.I.L.D.D.D.A.!.!.=X!.Q.*X| ) ` _ ` UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 358 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXy e i g Y .` g Y i i w w u N ! y.y.m.%XZXZXZX%Xj.p.s.s.s.g.=.k r f a a f ) a a a : + ; + O O O O O O + ; ; ; ; : > > ; , : & : r r Y r j j 3 6 k k k k n m m L #.%.0.%.%.%.#.@.#.o.X.o.L L o.G G G J G L G G G F J ;.7.a.a.p.p.Z.D.U./._.^.~.P.D.C.C.V.%X%X%X%XIXtX0X2X2X2X2X0X2X2X . .i = = UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 359 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX> e e g Y g Y Y Y Y Y Y Y S S A m M C S Y | | tXtXIXNXIXZX*X*Xj.E.A.s.g.=.k b r r a r a a : : : + + O O O + + O + + , : : : : : : & # & $ & 2 & 5 j k F G v k =.+.O.$.@.@.X.L &.#.&.o.L o.G ..X.G L G P J G H G ..J J J J o.4.s.a.a.a.Z.Z.H.$X{..X.X`.D.6.2.:.Q ~ ! / / | ( } 2X2X2X2X2X2X2X2X2X| R i y 9 = = * o UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 360 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXi e g g i Y Y Y T Y { l.&.l.l.&.@.&.l.&.{ &.l.{ z.z.z.b.b.IXlXIXyXIXyX*XW.W.G.u.O.M k 7 r r : : : : + : # + O . O . . . + . . + # # & & & # # % = $ 2 6 k O.1.;.O.M =.1.1.1.,.L G M L L L L G G G G G G ..J G G H G G J J ..,.4.p.Z.Z.p.i.d.R.$X_.{..X:X@X8.-.H H S N N C N u w r e d .g g ` . .g Y u w y 9 9 9 = = = % o o UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 361 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX& e e Y Y m S K I U { z.qXx.x.BXx.n.qXBXx.qXqXx.qXqXqXx.eXn.b.n.b.tXIXlXyXIXeX%XE.G.G.d.N.=.k j < : + : : + + + + + + . O + . . . . . # . # # % & & 9 2 & 2 k =.u.a.5.1.O.M O.+.1.+...G F v F G F G G F G G G J G J G G G G G ..>.6.p.C.a.a.a.a.S.R.(..X:X&XE.,.W D C N N z w w w 9 = & % % * % < & t * = % & % & & % % % % % o = % = , = UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 362 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX& & e 9 8 7 b Y U &.z.z.BXBXgXgXgXvXgXgXgXgXgXgXzXvXNXzXxXxXgXzXzXyXeXeXqXb.eXeXeXn.m.t.t.G.G.G.s.O.=.k j 1 < # + + + . . & + + + . . . . % . # # % % 9 9 w w 6 k M u.f.a.i.5.u.O.=.O.N.u.u.<...G n F F F F F L F F G D G J J -.;.4.8.C.C.p.i.p.a.d.D.L.~.'.Q.t.,.E S C S S 7 q 0 9 9 % % . o . * o o . . . . . . . % = = = t * UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 363 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX% : e 8 w x N k M &.wXgXvXgXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXvXMXMXMXvXxXkXxXhXzXrXwXqXz.b.l.q.o.-.,.s.F.F.s.+.M k k 5 8 & & & & + # % # & % & $ % % % % = 9 9 u Z C G =.N.f.F.S.p.5.i.s.O.=.+.u.i.a.p.5.>.;.G G J ........Q ,.,.1.1.8.p.Z.C.Z.C.C.a.a.a.F.P./.!.8.P c l l 0 w 0 2 9 e & = X o X X X . . . % o o y R R i > UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 364 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX& & 2 $ 1 4 k m { x.BXgXvXvXvXnXnXcXnXcXnXnXcXnXnXcXcXcXcXcXcXvXvXvXbXxXxXxXxXfXkXkXhXhXhXqX{ &.@.=.G O.1.S.Y.F.d.u.+.=.n v 4 < 2 2 $ & < & 9 w w w 9 9 8 8 w N H H ..+.u.Y.K.F.D.Z.j.Z.s.u.+.O.N.u.u.s.A.Z.s.i.5.5.5.8.5.p.8.s.8.A.s.a.a.a.a.p.S.S.F.F.F.L.A.>.H x l 6 0 2 = = % % o % o o o X X . o i R R R t t UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 365 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX& & & 2 2 1 7 k U z.gXvXcXcXcXcXcXcXnXnXnXnXnXnXnXnXcXcXcXcXnXvXvXMXvXvXvXbXxXxXxXxXxXxXxXfXkXhXqXl.U T L K G O.i.Y.K.J.f.N.O.=.n k j x l 0 8 w u u Z Z A N w z B D -.1.u.d.T.(.^.L.S.S.A.Z.d.S.u.+.+.N.u.k.d.d.d.a.p.a.Z.a.p.a.Z.Z.S.S.S.F.D.S.S.S.S.L.P.L.A.2.D j 6 5 2 & & = o o o o o o X . X X X X o * t R R R R t t UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 366 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX& & $ < 5 1 3 U wXgXgXcXnXcXcXnXnXcXnXnXnXmXnXnXnXcXnXcXcXcXnXcXvXvXvXbXbXxXxXxXxXxXbXxXkXxXkXkXkXzXeXz.{ &.@.L M G ,.s.Y.I.K.G.a.u.+.+.O.O.F F D H W :.2.2.Q ......O.N.k.G./.(.{.{.P.F.G.Z.Z.Z.S.f.f.N.N.N.N.i.a.i.f.d.S.f.S.d.d.S.S.S.D.D.K.P.P.P.K.P.P.C.2.H v 6 1 2 % = % o * o X o X o X X X X o t y y y R t * UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 367 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX& & 2 1 3 3 3 j BXgXvXcXcXcXnXnXnXnXnXnXmXnXnXnXnXnXnXnXnXnXMXMXMXMXMXbXMXbXbXxXbXxXbXxXxXkXxXxXkXkXaXhXzXrXx.l.l.@.L M k G ,.A.^.(.P.K.F.S.f.u.u.N.i.a.p.i.i.i.i.5.<.u.a.G.F.P.~.(._.{.~.Y.D.Z.a.d.S.f.F.F.f.u.1.N.N.u.k.f.f.F.f.S.f.f.D.R.U.U.R.~.(.).~.A.2.L c l 2 2 % o o o o o o o X . o * = t t y t t UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 368 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX& & 2 2 < 1 4 j z.gXvXcXnXcXcXcXnXnXnXnXnXnXnXnXnXnXnXnXnXnXnXmXmXMXGXMXMXMXMXMXMXbXMXbXbXxXxXkXkXkXkXkXkXhXrXrXeXn.x.x.&.@.L n n G 8.R.I.^.~.P.J.S.F.F.F.S.d.i.i.i.p.C.Z.D.U.~.~.I.I.^.{.{._./.S.a.Z.S.S.F.F.J.J.F.S.i.u.u.u.u.a.a.a.d.f.F.R.~._.{.}.[.(.A.4.J b b b 2 = o o o o o o X X X X . X * t t t t UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 369 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX: > 2 2 < 1 1 I BXvXcXvXcXcXcXnXnXnXnXnXnXnXmXnXnXnXnXnXnXmXJXJXJXKXJXJXKXLXLXLXCXVXVXLXLXbXbXbXbXxXkXaXaXkXrXBXrXeXeXn.n.v.l.@.=.M v K ,.A.U././.I.P.K.J.F.G.S.a.B.C.D.U.^.(.(.^.^.I.I.I._._._.(.D.S.d.S.S.S.F.J.J.J.P.K.D.Z.p.7.p.C.A.A.H.U./.].}.|.[.H.2.J m m b r & & o o X o . X o X X * t R t t @ UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 370 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXe e 2 2 6 3 7 wXgXcXcXcXcXcXcXnXnXnXnXnXnXnXnXnXnXnXmXmXJXVX-X-X-X-X-X;X-X;X:X:X+X#X#X#X#X:X:X=XVXZXNXNXkXaXsXhXeXwXx.n.n.x.x.c.*.%.@.M v v P t.R.U.I.I.I.P.J.J.L.L.U.U.(.].].].).(.^.~.I.P.^._.]._.U.S.S.S.F.F.J.K.P.P.~.~.~.I.U.U.I.^._.].].[.}.|.|.R.7.Q c b I I f r % o X . X X X X t t t t t UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 371 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX> d d e r 5 4 I BXvXvXvXcXcXcXcXnXnXnXnXmXnXnXnXmXMXJXCXVX-X:X=X+X+X=X+X#X#X#X#X#X#X#X.X#X.X.X.X.X.XoX+X&X&X*X*XM.rXwXeXeXx.n.x.x.v.%.%.$.X.G n v V ! E.W.I.I.I.P.P.~.^.(.(.].{.[.[.).).(.^.I.P.I.(.).]./.D.S.D.F.F.J.K.P.I.~.~.I.^.(.).].[.}.}.}.|.|._.C.;.H K b b r : : & o o . . X * * t t t t * UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 372 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX> d e r 3 j j } gXcXvXcXcXcXcXnXnXnXnXnXnXnXnXnXmXJXLX-X=X+X#X+XoX+X#X#X+X#X+XoX+X#X#X#X#XoX.XoX.XoX.X{.{..X'./.U.W.M.eXeXn.n.x.v.l.c.c.%.%.#.X.G n v c ( t.!.Y.P.I.I.~.^.(.).].[.[.[.].).(.^.I.I.I.(.).].^.L.F.L.F.F.J.J.P.~.~.I.~.~.(.).].[.}.}.|. X'.8.! F B b [ [ f : o o o X t t t t t @ UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 373 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX& e d e 5 3 j wXvXvXvXcXcXcXcXnXcXnXcXnXnXnXnXmXJXVX&XOX+X+X+X+XoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoX'.oX_..XoX'._.'.XXXXXXQ.W.j.n.x.x.v.v.%.%.%.%.$.$.X.M v v S ( y.%XW.U.~.~.^.).).].[.[.[.].).).(.^.^.^.(.].].(.I.I.I.J.J.K.P.I.~.I.I.I.~.(.(.].[.}.|._.6.,.P P v v b [ _ a . X . * * * * X X X UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 374 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX& & 2 2 r j I dXgXvXgXvXvXvXcXcXnXcXcXnXnXnXmXJXVX&X+XoXXXXX+X+XoX+XoX+X+XoX+XoX+XoXoXoX#XoXoX.XoX'..X`.'..X'.`.`.`.XXT././.T.W.h.n.x.c.%.%.%.%.$.o.O.X.M v x x Y / y.E.Y.~.(.].).].[.].[.].).).).).].).].].].^.~./.^.^.~.~.~.~.~.I.P.U.~.(.).[.}.[.$X2.P K K m v I f _ s @ . X X X UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 375 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX. # & < < 1 b dXvXvXvXvXvXvXcXcXcXcXcXnXcXnXMXCX&XXXQ.OXOXXXOXXXXX+XOXoX+X+X+XoX+X+X+XoXoXoXoXoXoXoXoXoX'.oXoX`.`.`.XXT.T.`.T./.U.K.h.c.l.%.9.%.$.$.$.#.o.L n k c S R S ! 8.D.{.).).).[.[.].[.].].].].].[.[.[.].~.P.U.^.^.(.^.~.~.~.I.I.~.~.^.].}.[.A.>.! T T S v b I _ s @ o X X X X @ UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 376 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXo # $ 1 4 3 k uXfXgXgXvXvXcXcXcXcXMXcXcXcXmXCX*XOXOXOXOXOXOXOXOXOXOX+X+XOX+XOXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoX`.`.`.XXXXT.T.T.T.`.U.U.U.K.j.e.%.%.$.$.$.o.#.@.o.G v k x z w u Z Q A.{.).].}.}.[.[.[.[.[.[.[.[.].[.].~.L.I.^.(.(.(.(.(.^.(.^.^.(.).[.[.C.Q H D F m v j r d : O @ . O X X X UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 377 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX . & : 7 k k m wXfXvXvXvXvXvXvXvXvXvXcXcXcXLX&XOXOXOXQ.OXQ.OXOXOXXX+XOX+X+X+X+X+X+X+X+X+XoXoXoX+X+XoX+XoXXX+X`.`.XX`.`.Q.Q.T.T.T.T.T.T.U./.P.G.r.%.&.#.#.o.o.o.o.G F k 6 l 0 9 9 2 B C.{.}.|.|.}.}.}.}.|.}.}.[.].].).~.P.U.^.(.).).].).)._.].{.{.[.).7.D V z x x v k 7 & o . X X X X X X X UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 378 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX. . o : I I U U x.fXfXfXvXvXvXvXvXxXvXcXnXMXVX=XXXQ.OXOXQ.OXQ.OXXXXXOXXXOX+XOX+X+X=X+X=X=X+X+X+XOX=X+XOXOXXXXXXXQ.XXT.XXQ.T.T.Y.Y.T.Y.T.L.Y.P.K.K.G.r.$.#.$.o.o.X.o.X.G k 6 l l 8 9 2 8 A $X|.|.|.|.}.}.}.}.}.[.[.].].).U.J.P.~.(.(._.).].).].[. X|.|.B.C B N c c k k 6 % . X X X X X X X X UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 379 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXo & : I U [ } z.gXfXvXvXxXvXxXvXvXvXvXMXJX&XXXXXXXOXQ.Q.OXXXOXOXOXOXOXOXOXOX=X+X=X=X=X=X=X=X=X=XOX+X+X+X+XOXXXXXXXT.XXXX`.XXQ.Y.T.Y.Q.Y.Y.Y.Y.L.F.J.F.1.$.O.$.X.o.X.X.G F l l 6 0 9 9 9 i 3. X|.|.|.|.[.}.}.[.].].].].).I.L.P.~.^.(.(.(.).].].}.|.|.}.3.S S m S V k j 2 o . X X X X X X X X X X UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 380 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX% $ : f [ [ } } uXfXfXfXxXxXvXxXvXvXvXvXCX+X`.XXXXOXXXXXOXQ.XXXXOXOXOXOX=X=X=X=X=X=X=X=X=X:X=X+X+X+XoXoXoXoX'.'.`./.'.'./.`.`.`.`.T.T.T.Y.Y.Y.Y.G.F.Y.Y.S.1.;.o.o.L ....L K c j 6 0 w y 9 y A '.|.|.|.}.[.}.[.[.].].].).(.P.J.K.I.~.^.^.^.(.].[.}.|.|.H./ Y Y Y Y m k 2 % X X X X X X X X X X o X X X X X X @ UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 381 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX. & & 7 [ } U } uXkXfXxXfXxXxXxXxXvXbXMXZXOX'.XXXXXXXXOXOXQ.Q.OXOXOX=XOXOX=X=X=X=X=X-X=X&X=X=XOXoXoXoX'.oX_.'.'.'.'.'./.`.`./.`.T./.`.U.T.T.Y.Y.F.F.Y.G.F.F.G.1.o.o.X.X.X.G G v j l q u y y 9 y V.|.|.|.|.[.[.[.[.[.].).].).K.F.K.P.^.^.(.(.(.).].|.|. Xy.| | Y Y U b k 2 . . . . . . o o . o . o X * X X o X X X X X X X X X X UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 382 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXo . o a j I [ { qXsXfXfXxXfXxXxXxXfXxXvXCXoX'.+XXXXXXXQ.XXXXXXXXOXOXOX&X=X=X=X&X-X&X=X=X=X=X=X=XXX_.)._./.XX&X&X=X&XQ.OXOX&X&XQ.Y.U.P.U.~.~.~.~.I.P.K.Y.G.F.G.G.i.O.X.L L X.G G v j j x u u u y 9 ^ |.|.|.|.[.].[.}.[.[.].].).D.F.K.P.~.~.^.(.^.).[.}.|.@X| { Y Y Y m b b r : . % o % % % % % % % % % = % = = o X o X X X X X X X X X X UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 383 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXo o . & 7 b U [ qXsXsXfXaXxXxXxXxXxXxXMXCXoXXXXXXXXXXXXXXXXXXXXXOXOX&X=X=X=X=X&X=X=X=X=XOXOXOX&XXX/.`.Q.Q.!.ZXZXNXIXIXNXNXZXZXZXZXZX*X*XQ.`.U.I.I.I.U.Y.Y.Y.G.G.G.G.<.X...o.J L G F k k z A E Z u 9 Z _.|.|.}.[.}.[.[.].].}.$XE 9 :.L.~.~.^.^.^.(.).[.}.|.@X( Y S S S S m b f p . . . . % . % o = 2 2 8 2 0 0 0 w q 0 w 0 0 0 8 2 % % o = o o X X X X X X X X X UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 384 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX. # & 1 b b [ } sXaXsXfXkXfXfXxXxXxXxXVX.X'.XXXXXXXXXXXXXXXXXXOXOX=X=X=X&X=X&X-X&X=XXXXX@XQ.Q.&X*XZXNXhXlXlXlXkXkXkXkXlXkXkXkXlXlXkXkXhXhXNXNX*XW.R.W.A.G.J.F.F.F.W.1.O.O.L G L G G V v V A ~ E Z y Z _.|.|.}.}.}.[.].).).H.u X A A.~.I.^.^.(.).[.|.}.V.S w w u b z k b r ; O X . % % 9 9 9 y w N z c V V D D H J -.-.J H H D D C B z N w 8 = % o . X X X X X X X X X O UXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 385 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUX. . # : 7 b U U dXsXsXsXaXaXfXkXkXxXfXVX'.oXXX`.`.`.`.XXXXXXXXXXOX=X=X=X&X-X&X=X&X=XOX`./.`.*X*XyXlXbXlXlXuXtX2X2X2X2X2X2X2X2X2XrX2X2XrXlXlXbXxXbXNXyXM.E.D.F.F.J.F.G.s.1.O.G L G ....G n D E ~ W Z u E $X|.|.|.}.|.|.}.].V.= X O O y 6.U.^.).)._.[.}.}.H.u 8 w w l j j j r ; . . X = = 2 q z B D J :.>.>.<.2.4.7.7.7.8.6.8.t.8.2.Q Q H B c z 0 2 # o o X X X X X X @ UXUXUXUXUXUXUXUXUXUXUXUXUXUX", 386 "UXUXUXUXUXUXUXUXUXUXUXUXUXUX. . # # r j b U qXsXsXsXaXaXkXaXaXxXfXZX'.oXXXXX`.`.`.XXXXXX`.XXQ.OXOX&X=X&X-X&X&X=X&XQ.T.Q.ZXNXkXkXkXlX2X} ` ` g g .g g h h ` g f I g ` } 2XlXlXkXkXjXjXrXeXj.s.d.F.F.Z.1.O.o.M G ;.O.G n G Q ^ W E E ~ _.|.|.}.[.|.{.V.~ * X * E V.^.(._.}.|.|.V.w 9 9 w w q j 4 2 . . . # . 9 Z Z N c n F ..:.6.A.A.B.B.7.C.B.C.B.B.B.E.%XV.E.V.8.2.Q J H V z q 8 = o o X X X X X X X UXUXUXUXUXUXUXUXUXUXUXUXUXUX", 387 "UXUXUXUXUXUXUXUXUXUXUXUXUXUX. . . $ 7 k b U dXsXsXsXsXaXaXkXxXaXyX~._.XXXXXX`.`.`.`.T.XXQ.OXOXOX&X=X&X&X=X&X&X&XT.Y.ZXhXjXkXkXlX2X` s a e 9 = = t t t * t * * * * % o s ) ` .] 2XkXkXpX9X1X} 0.S.S.Z.g.;.O.G O.;.<.=.G J :.3.~ W E :.$X|.|.|._.V.Z . O = E B./.[.|.|.H.u 2 2 2 5 5 j 4 < . . . . . # . # o y W 7.5.2.>.>.4.7.A.A.E.A.B.C.B.B.7.B.7.8.B.8.E.E.E.E.E.B.E.V.6.4.:.J B w 2 & % . X X X UXUXUXUXUXUXUXUXUXUXUXUXUX", 388 "UXUXUXUXUXUXUXUXUXUXUXUXUXo . . . < 4 k U qXiXsXsXaXaXaXaXkXaXyXT._.oXoXoX`.`.`.`.XXXXXXQ.Q.&X=X&X=X=XOXOXQ.&X&X*XNXjXjXlX2X} ` d + + + & & = > = > = = * , t , > > = > h h h s _ ` } } } ' ' } c.1.<.5.,.O...;.1.<.O.G -.3.3.~ W W ^ $X$X$X^ i X UXUXUXUXUX O = S ^ V.$XV.w # & 2 8 6 j j 3 # . % . % . % # 9 A Q 4.7.C.7.7.7.B.A.E.A.E.B.7.7.8.6.6.6.6.7.8.B.E.E.E.E.E.E.A.E.A.B.8.6.Q D B q 2 = % X X . X X X UXUXUXUXUXUXUXUXUXUXUXUX", 389 "UXUXUXUXUXUXUXUXUXUXUXUX. . . . $ 1 j k U dXiXsXsXiXsXsXsXkXzXQ.'.`.XX`.`.`.`.`.`.`.XXQ.OXOX=X&X=X&XOXXXXXU.W.yXkXkXjX2X` p . . . : + o & @ + @ , & @ @ , = , t , & @ > , h h h ; ; p > : a _ [ ' U O...O.+.;.1.5.1.O.O.;.6.3.:.~ ~ ~ ^ ( = UXUXUXUXUXUXUX X * = Z E 9 % $ 2 w l c k 4 $ # . % . % % 9 W 2.4.6.C.7.7.7.6.C.A.A.E.B.7.6.6.4.4.2.6.6.8.8.8.8.B.V.E.E.V.E.B.E.E.B.E.B.>.J C l 8 % . . X UXUXUXUXUXUXUXUXUXUXUXUX", 390 "UXUXUXUXUXUXUXUXUXUXUXUX. . . . < 3 j k } dXdXdXuXdXsXsXsXfX*X`.XXoXXX`.`.`.`.`.`.Q.OXQ.OX&X&X&X=XOXXX`.U.Q.hXkXkXlX2Xs ; + # # # + # . + + + o , @ ; + @ , , , , > % , s h h h > > & # # : r _ ' ' U G =.;.u.i.1.;.+.;.4.C.4.>.:.:.A X X UXUXUXUXUXUXUXUXUXUXUX O @ = & < 5 l z V n j < # # # . % 9 H >.2.4.4.6.B.B.7.6.7.C.B.E.B.6.6.4.4.2.<.2.4.6.6.6.B.8.B.E.V.E.E.B.E.B.E.E.E.B.2.Q V z w 9 % o X UXUXUXUXUXUXUXUXUXUXUX", 391 "UXUXUXUXUXUXUXUXUXUXUXo # . . & 1 j k U qXwXwXwXuXuXuXsXsXM.I.XXXX`.`.`.`./.U.`.XXXXXXOXQ.OX&X&XOXXX/.U.*XlXjXkX2Xf . . o + + + + + O . O O . + O @ , , t h > , : , s s h > > = & & 2 w f _ ' ' U J 1.p.d.1.+.;.5.C.C.6.2.2.:.~ = UXUXUXUXUXUXUXUXUXUXUXUXUXUXUX O & 8 0 N A H ! J M j 2 9 = 9 w D J J :.:.2.4.6.6.6.6.6.B.B.B.B.6.6.4.6.4.2.4.4.6.6.6.6.8.8.8.8.8.V.t.B.B.B.B.E.V.E.V.:.J D N 9 * o UXUXUXUXUXUXUXUXUXUXUX", 392 "UXUXUXUXUXUXUXUXUXUXUX& % . . < 4 j I { qXqXqXwXwXwXwXuXrXW./.XX`.XX`.`.U.`.U.`.XXQ.XXQ.&X&X&XQ.XXI.P.W.lXkXlX| > . & . + . + O O O O O O O O - @ t , t e > : : s s s s > > & 2 9 9 2 f [ ' >XT 4.a.i.u.N.i.Z.A.C.C.6.8.y.y.i o UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX > 9 w u A ! ,.,.:.O.M v z Z Q :.:.Q -.:.2.3.3.2.3.4.6.6.6.B.B.6.6.4.4.2.2.2.2.2.6.8.6.6.6.8.8.V.8.B.B.t.V.E.V.8.E.B.E.7.>.P D N 9 = X X UXUXUXUXUXUXUXUXUXUX", 393 "UXUXUXUXUXUXUXUXUXUX@ & % o # 1 4 k U { z.z.qXqXqXtXeXwXM.Y.`.Q.T.XXT.T.T.U.T.`.Q.OX&XQ.Q.&X&XOXU.I.*XlXkXlX} p + % # # + + O . O . O O O O - - , > e t g d > > , > s d s : > : & & 2 : f _ ' [ ;.i.k.u.u.a.D.D.H.!.%XIXm.| S > o UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX> i i S N N A ! ! ,.>.-.O.O.=.;.8.7.7.B.6.6.6.6.6.6.2.2.4.6.6.8.8.6.4.4.4.2.4.4.4.4.4.4.6.6.6.6.6.8.8.t.B.B.8.B.t.B.B.E.V.B.B.3.-.H N 9 % . X X X UXUXUXUXUXUXUXUXUX", 394 "UXUXUXUXUXUXUXUXUXUX. % . . $ 3 j k U z.z.z.z.z.qXqXeXn.G.T.Q.T.T.Q.T.Y.T.U.T.Q.Q.OXQ.&X&XQ.Q.T.I.E.kXjXlX .p . # + . + . O O O O O ; ; & e d i g g e e e d > e e = 2 9 2 8 1 7 b b =.N.k.f.k.s.a.Z.C.E.%XlX0XlX| .i > % UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX> i g ( Y S P S P H W ! ,.;.<.1.N.f.G.G.D.R.H.A.C.C.C.V.6.6.2.3.4.6.6.3.2.2.2.2.2.2.2.3.8.3.6.4.4.2.4.4.6.8.8.8.8.8.6.V.8.8.E.V.E.B.8.-.D N = o X X X UXUXUXUXUXUXUXUXUX", 395 "UXUXUXUXUXUXUXUXUX@ . . . . $ 4 k U { { l.z.l.z.z.z.z.j.Y.Q.Q.Y.Y.T.Y.U.U.U.Q.Q.&X&XQ.Q.Q.Q.XXP.W.rXjX2X} : . + + + + O O O O O ; : a d d g Y S g g e e e e e e u w q x v M =.N.N.f.f.f.f.u.+.;.-.H T b.2X2XtX| ( w u y e % @ UXUXUXUXUXUXUXUXUXUXUXUXUX@ e g Y ( Y ( S S S N B C A ~ Q ;.5.Z.J.F.F.J.J.F.F.D.H.H.H.H.A.C.B.B.6.6.2.>.2.>.2.2.2.2.6.4.4.2.4.4.4.4.2.4.6.6.6.8.6.8.8.8.8.V.t.B.8.B.2.H V 0 % o X X UXUXUXUXUXUXUXUX", 396 "UXUXUXUXUXUXUXUXUX # $ 7 b U { l.l.{ l.z.z.z.x.W.T.Y.Q.Y.T.T.T.U.Y.T.Q.&X&X&X&XW.Q.XX`.Y.tXdX2Xf + . # . . . O O O @ ; : d f ` Y .g g R S u u w N A H J ..+.N.N.k.f.F.F.J.F.u.+.M m k 6 j j b Y I I 7 0 8 w 9 y e > UXUXUXUXUXUXUXUXUXUX& & e i S S S K S v l x k z v c v n ..;.$X).I.P.J.F.F.F.F.L.R.H.H.H.H.H.H.H.C.7.2.2.2.<.>.2.2.3.6.2.2.2.2.2.4.2.4.4.4.6.6.6.6.6.8.8.8.B.B.B.B.8.:.V x 8 = o X X UXUXUXUXUXUXUXUX", 397 "UXUXUXUXUXUXUXUX. $ < j M U U &.&.l.l.l.l.x.h.Y.Y.Q.Y.Q.Y.Y.Y.Y.L.Y.&X&X&XW.&XQ.T.XXU.m.2X` e & % # + . + O O O ; : e r f Y Y R Y S S S N B D G ;.N.u.k.f.G.F.J.J.J.J.J.i.$.+.M j 7 5 2 2 < 1 1 < < 3 < 2 9 u S R i > UXUXUXUXUXUXUX@ e 7 w w 7 c v k v k k v n v n F ..<.;.v 2._.[.).~.F.F.F.S.D.F.L.L.L.L.L.R.R.D.H.C.C.6.4.2.>.2.6.6.2.2.2.>.>.>.2.2.2.2.2.2.4.2.3.6.3.6.8.8.B.8.B.8.Q c q 2 o X X X X X UXUXUXUXUXUXUXUX", 398 "UXUXUXUXUXUXUXUXX . $ 1 k U U &.&.&.&.&.l.l.l.s.Y.Y.Y.W.Y.Y.Y.Y.Y.Y.Y.&X&XQ.W.&XQ.Y.T.A.} ' s % % + . . O O O O O + : : d f Y Y Y ( A P H J ..;.N.i.f.G.F.F.K.K.P.P.P.P.L.t.q.O.1.O.3 8 2 # # # # $ # $ 1 1 1 2 w R R R i e UXUXUXUXUX> 9 w r 0 3 7 j j k k m U K K F G -.S.L.;.n D 3.$X[.).^.~.U.U.L.D.L.F.L.L.F.L.D.D.L.R.R.H.A.C.2.>.2.2.2.2.2.2.>.>.>.>.>.2.2.2.2.2.2.2.4.2.3.8.8.6.8.V.3.K x 5 % X X X X X O UXUXUXUXUXUXUX", 399 "UXUXUXUXUXUXUX O . < 4 k =.U U U &.&.&.l.l.w.G.T.Y.Q.Q.Y.Y.Y.Y.Y.L.Q.&X*X*X&X&XW.Y.T.v.' f > & % % + O O O + : e e Y ( ( ~ ! Q ;.1.N.k.f.G.J.P.I.P.P.P.P.I.P.P.Y.E./ U +.u.5.x & % # % . . . . . # < 1 1 0 i i i i e & UXUXUX> 9 r w 5 < 1 1 j k k n U m K F G D 5.P.D.H v G H 3.$X].).).(.(.^.~.I.R.D.H.F.F.F.J.J.R.D.R.H.H.C.6.3.3.2.2.>.>.>.:.:.>.>.:.>.>.>.2.2.2.3.2.2.3.3.2.6.8.8.Q N q 2 o X X O * X X O O O UXUXUXUXUXUXUX", 400 "UXUXUXUXUXUXUXo * , s h + 1 4 v U @.U @.&.&.&.&.l.u.G.Y.Y.W.Y.Y.Y.Y.G.Y.W.Q.VX&XW.!.Q.Q.Y.E.} ` d & @ . . . O O O ; + e e i E ~ 3.:.<.1.u.d.G.K./.~.^.~.~.I.P.P.I.P.I.R.A./ U O.1.a.a.B % # % # # . . . # < 1 & o o X X @ @ @ & 2 8 8 < 1 1 1 4 k M M m K K n V J >.D.~.6.u l n H W ^ B.).).(.(.(.).).(././.^.U.L.L.F.D.D.D.D.H.H.H.A.6.3.:.:.>.:.-.>.;.>.;.;.:.>.>.2.2.2.2.2.2.2.2.2.2.6.:.D x 0 % o . X X X X X O O ; + + . UXUXUXUXUXUXUX", 401 "UXUXUXUXUXUXUX: ] <X<Xh : 3 4 b M U @.@.@.&.U &.*.d.Y.Y.G.Y.W.Y.G.Y.Y.G.W.*X&X*X*XW.Y.Y.W.b.` ` : o % . + O . + > i i H :.6.i.i.s.G.U.(.].).).(.(.^.~./.I.I.I.I.P.8.P Y @.N.d.D.S.Q % . # . . . $ $ . o & 9 2 2 < 1 3 3 7 k m m K G F V B D -.Z.P.L.W 9 8 x n C Z E V.~.).(._.).).].{.[.[.{.).(.U.D.d.Z.S.L.R.R.H.A.6.:.:.-.:.-.-.-.:.-.:.>.:.>.:.>.:.2.2.2.2.3.2.2.2.3.Q c q 2 . X X X X X @ O O ; : a a a ) p O UXUXUXUXUXUX", 402 "UXUXUXUXUXUX, ] 5X5X<Xh $ 3 j m U L L @.@.@.&.@.w.G.Y.Y.Y.G.W.Y.Y.G.G.W.&X*X*XW.W.W.Y.Y.%X} f d & # . O + % e u H ..1.i.a.D./.{.|.|.|.].].).(.~.~.~.I.I./.U.A.! P T O.i.F.F.Z.;.< . . . . . . # # . o 2 2 < 1 3 3 4 k n m K F V V V D J 5.K.K.p.Z 9 & q F D A R .E.'.).(.(._._.).].[.[.}.}.|.{.U.D.S.S.Z.D.D.H.A.6.:.-.:.-.:.-.:.:.;.:.;.:.>.>.>.>.2.>.>.:.:.:.>.:.:.D l 5 & X X O O ; a ) ' ,X3X3X) X X UXUXUXUXUXUX", 403 "UXUXUXUXUXUXh ] 5X5X<Xh < 4 k b M U M L L @.@.@.g.G.G.F.G.Y.W.W.G.G.G.W.*X*X*XW.E.W.Y.W.n.[ h : # . . . + . = e C ;.N.d.D.'. X|.|.|.|.|.}.].).^.^.~.~.~.I.L.8./ K T +.1.d.F.F.D.<.0 . . . . # . . 2 2 2 1 1 4 k k M n F V V V D H ;.D.P.L.2.u % % 8 V G P ( | | E.$X].(.(.(.).).].[.}.|.|.|.|._.R.S.d.Z.C.Z.A.C.8.>.-.-.;.-.-.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.J z 5 < . X X X O O O ; a _ >X3X6X7XiX' O O UXUXUXUXUXUX", 404 "UXUXUXUXUXUX` <X5X5X] p < j k m K M M L L X.@.o.s.G.G.Y.W.G.G.G.G.G.W.*X*X*Xj.j.W.G.H.M.z._ d o . . . @ % 8 C ..N.d.`. X|.|.|.|.|.|.|. X[.(.(.^./.~.^.R.>.P / T O.1.S.D.F.D.S.5.x . . . . # # # e e r 1 3 j k n n n V F V D F -.p.J.K.S.Q 9 % % 2 w c ! ( | .| y.H.).(.^.(.).].[.|.|.|.|.|.|.}._.U.S.a.p.Z.Z.7.2.:.-.:.-.-.-.-.-.-.-.:.-.:.-.-.:.-.-.-.Q Q Q Q Q D l 2 $ O X X X O O : ) >X3X4X6XiXiX1X: O UXUXUXUXUX", 405 "UXUXUXUXUXUX] <X5X<X_ : < j m m L K L L L L o.$.s.G.G.G.G.W.W.A.S.E.E.W.W.E.j.s.E.S.A.m.} p : o . . . = x O.1.A.'. X|.|.|.|.|.|.|.|.|.}.].).).^.~.R.,.H P / ,.+.a.F.L.D.S.S.i.D # . . . . # . & r r r 3 j k n n v V V V F F H <.D.J.J.p.A = o o % = w C ( . .R R W H.).(.).).).].}.|.|.|.|.|.|.}.]./.A.i.C.C.7.6.>.Q -.-.-.-.-.-.-.:.-.Q -.-.-.Q Q -.Q Q J J J H H x 5 8 : ; * X X O O O O a _ ,X3X6X7XiXsX1Xf O O O UXUXUXUXUX", 406 "UXUXUXUXUXs <X5X5X2Xh # 1 j b M M K L L L X.o.1.s.G.G.G.W.W.G.G.A.j.W.j.j.j.7.j.s.A.E.qX_ s + o . . % 9 k O.s.'. X|.|.|.|.|.|.|.|.|.|.|.}.].].].Y.,.D H H $.1.u.S.K.F.D.S.Z.i.J & . . . . X & Y g e j k n n v V V n F D D -.7.D.F.D.6.Z & . % % . & q v b R i t y E H.|.[.].].[.|.|.|.|.|.}.}.[.[.).U.Z.5.i.7.5.>.-.-.-.-.-.-.-.Q -.-.-.Q ..Q ..J J J J J H D F D z q 2 a _ > * O O O ; r ' >X3X6X7XiXfX7Xf @ O O UXUXUXUXUX", 407 "UXUXUXUXUXh <X5X5X<Xe & < j n K K M M L L G o.1.G.G.G.G.d.W.j.W.W.s.A.j.j.i.5.i.s.E.M.} s : + o . . # 5 k +.U.}.|.|.|.|.|.|.|.|.|.|.|.|.}.}.}.!.>.H H H G O.1.a.L.L.G.A.Z.p.7.Q 2 . . . . . . o h ` ` g j k n n v V V V n D J >.C.D.D.Z.2.u % o % % o . & 8 q l y y y y Z $X|.}.[.[.|.|.|.}.}.[.}.].].).^.L.7.>.<.>.>.-.-.-...-.-.Q -.-.J J J J J J J J J H G D D F V c q 3 a f h * X X O - - a ' >X9X6XiXiXfXdX_ O O O UXUXUXUX", 408 "UXUXUXUXUX` 5X5X5X .t # 1 7 m n n K K G L L O.u.f.S.f.S.G.W.W.S.A.s.s.s.i.8.u.8.s.j.c.f : : % o . O o & j M u.).[. X}.|.|.|.|.|.|.|.|.|.|.|.|.@X>.H H L X.X.=.1.S.L.F.S.A.A.7.8.-.8 . . . # X , ` 1X} Y b M n n V V F V V D ..7.Z.Z.Z.C.Q 9 % % . % . . . . 9 5 q 9 = 9 % Z _.|.}.|.|.|.}.}.[.}.[.[.{.].^.P.B.......-.-.-.Q ..Q J J Q J J J J J H J J G D D F V V V c B 6 7 r ) f > * * @ - ; p a ' >X,X6X7XiXiX7X' @ O O UXUXUXUX", 409 "UXUXUXUXUX .5X5X5Xt , o 1 j b n m F M M M G X.u.G.G.G.G.Z.W.j.E.j.j.s.5.1.<.1.5.s.E.c.a ; + + . O O O O . & k M S.).).].}. X|.|.|.|.|.|.|.|.|.|.{.6.J D T T l.&.O.5.D.L.G.Z.Z.s.E.s.;.0 # . . . # o , <X2X>XI M k v v V n V F V D :.C.D.C.C.7.A 9 % o . % . . . & 0 q 9 = = y ^ {.|.|.|.}.}.}.}.[.[.[.{.{._.H.4.J M ..-.-.-.J J Q J J J J J H J H G H D D D D D D V c V c l 4 r f ] ` * * - - ; a _ >X,X6X7XiXiX6X' - X O O UXUXUXUX", 410 "UXUXUXUX, ` ] ) s + # < 7 7 b n n n G G K G =.s.G.G.G.s.E.G.W.s.s.i.s.1.<.1.1.1.8.j.T a ; @ o . O O O O O O O O . . O & 4 F C./.'.(.).}.|.|.|.|.|.|.|.|.|.{.6.Q H P l.b.eXx.1.Z.D.Z.Z.s.C.E.8.j.>.q # . . # . , <X5X .} U M M V V V F V C H 2.C.C.C.C.6.A 9 % X . . . % 2 5 0 2 = t t V.}.}.|. X}.{.[.}.[.[. X/.B.3.,.P M =...Q -.J J J H J J J H H G H D D D D D D V V B B V B l b f ' 1X] h * O - - p a _ ' 9X6X7X7X7X9X' + - O UXUXUXUX", 411 "UXUXUXUX, , @ X # 1 6 l v n n n K M G n J s.G.f.G.s.s.j.j.j.s.i.i.1.+.;.;.1.g.5.S + @ + @ + O O O O O O - - - - O O O . + + . # 5 F t.A.R././.].}.|.|.|.|.|.|.|.'.8.H H P q.n.rXyXm.j.W.E.A.8.8.8.8.t.s.8.N # . . # . + .0X` { U M n V V V n V D J 4.C.C.7.7.6.A & = o . . X o # 2 q 2 t t R V.].|.|.}.{.[.}.[.].^.B.! ! ! H K G J J J J J J J J H J H D D D D D D D D V V V V B V B l 7 [ } 3X1Xh * - - ; a _ ' 3X6X7X7X7X,X_ ; O O @ O UXUXUXUX", 412 "UXUXUXUX@ X # < 7 k v m n n F M n n J s.G.f.W.G.A.Z.j.A.8.i.1.1.;.+.;.1.4.,.x , @ @ @ + O O O - O - ; ; ; ; - O O O . . % o % = z F ! V.H.H.^.{.|.|.|.|.|. X#Xt.W ~ H ! c.n.qXv.j.E.E.E.E.8.8.4.<.8.t.8.z . . % e ` [ U m m n V V V V V D Q 6.7.7.7.7.4.A % o o . . o & 2 0 u i E y.:X$X X{.}.}.[.{./.B.Q ! / / q.X.G ..J J H H H H H H D J D F D D D D V V V V V V V C B l l r } 1X<Xh = X - ; p a f 1X6X6X7XiX7X,X_ ; @ O O O UXUXUXUX", 413 "UXUXUXUXO X # < q x v n n F n n n G L i.d.G.s.a.s.j.s.j.s.1.1.;.+.;.;.1.1.,.N & @ @ @ @ @ O ; - - p p a p ; ; - O O O O O . . O + & > = 9 6 x E 3.B.H.).}.|. X X.X@Xy.! ! P J ,.l.l.e.1.5.8.t.j.m.j.8.1.>.;.<.-.8 . . . . # 9 > b m m m V V V V V V H 2.6.6.6.6.6.4.A % o . X X % & 5 q u R ( IXIX$X$X[.[.[.].T.y.E ( ( / 0.,.;.-.Q Q H J H J D H D H H F H D D C D D C C V V B B B z x r _ ,X} g * @ ; - p a _ ,X6X7X7XiX7X>Xs p O O O O UXUXUXUX", 414 "UXUXUXUX . < j v v n n n F n n F ..i.G.S.a.s.s.s.s.i.i.<.;.+.+.O.O.;.,...S : & : , + , - ; , p a a a a : - - - O O O ; + @ + * , > i w c x N Z ! 3.H. X|.}..X-Xy.! P J o.o.#.$.,.;.<.<.8.4.r.t.t.t.8.;.;...F < . . . % 2 & j m m n B B V V v V J :.6.6.6.6.6.2.A o . X * X o 2 0 z Z R IXIXIX$X$X{.|._.E.( S A P S #.t.p.7.4.:.Q H H D D H D H D D D D D D D D V D V V C V B x l w _ 1X} .t @ ; - ; a ' ,X6X7X7XiX7X>Xa : O - - O UXUXUXUX", 415 "UXUXUXUX . < 6 x v v v n F n n n G i.s.d.s.i.8.5.1.1.1.+.O.O.O.O.o.O.o.J w a s e > : : : a a > s f f f a p p - + + O + @ & = t > g { eXqXT N u ( y.%X@X{.@X%Xy.! ! -.o.O.O.O.O.;.;.<.;.;.;.;.q.0.0.,.,.....V # . . # 2 8 < 4 x v m V c V V V V H 2.4.6.6.4.6.4.A = . . X * * o 2 l N R R IXIXIX%X$X X!.y.P E A D V x D >.C.R.C.2.Q Q H H D H D D D F D D D D C C V V B V V B N l q f 1X} g > * + ; - a >X6X7XiXiXiX6X3X) : @ - @ O UXUXUXUX", 416 "UXUXUXUX . . $ 6 j v v n v n F n G G 1.s.s.i.5.1.<.;.;.O.O.=.O...G o.o.o.F 0 > d d f d a a s f f f f f f f a p ; ; @ + o o * > h ` tXbXmXNXy.A E / m.IXIXZX%Xc.P P q.#.$.O.O.O.;.<.,.<.,.;.;...,.,.q.q.,.;.-.D $ . # 8 8 5 4 k v V c c v V V V J 2.2.2.2.2.2.4.W % o X * * X o & 5 R R | %XIXIXIX%X%Xy.( E A B x 9 % 8 W 7.A.C.7.2.-.H D C D D D D D D D D D V V D V V C V z w l ` 1X} Y t = , ; : a >X6X7XiX7XiX7X6X>X, O - UXUXUXUX", 417 "UXUXUXUXX o . $ 3 x c n n v n n F F G 1.i.s.1.1.1.;.+.O.O.O.G ..=.X.#.o.o.G 5 > f f f d d d f f _ _ [ _ f s > ; ; ; , @ @ * t g b.NXGXNXyXn.w.J ! y.m.IXIXIXtXy./ ,.$.$.$.O.;.;.,.>.4.,.;.;.;.;...P / q.,.,.,.V # . . & w 0 2 4 x V V V c V v V D Q :.:.:.>.>.2.2.W 9 X X X X . % w u R ( .2XIX%X%Xy.^ P c l 9 * * = = N Q 2.C.C.6.:.Q J H D D D D D D D D D D C C C C B z z w [ 9X1XR y > ; ; ; r >X6X7XiXiXiXiX7X,Xp O O - X UXUXUXUX", 418 "UXUXUXUX X X X X . # 1 l v v v n n n n n G ;.1.1.1.O.O.O.O.=.=.=.G G L #.#.%.$.F 6 > f _ f [ _ ` _ _ [ _ ` _ _ d d , , , > s > h | hXMXGXNXeXm.v.w.,.,.,.m.m.eXm.n.c.*.*.$.$.O.O.,.,.,.;.,.1.,.,.;.....J P ! ,.9.,.N # . & w w 0 3 j v V c c V V c V W Q :.:.:.:.:.3.Q 9 X X * = 9 q l w Y y.m.y.! H z 5 9 * * * o o o % w Q 6.C.B.4.:.-.J H D D D D D D C D C C C C B N N b 1X0X} g y t h ; ; r >X6X7XiXiXiXfXiX>Xa . O O O UXUXUXUX", 419 "UXUXUXUX X X X . # $ l v v n n v n n n G =.;.1.O.O...=.M G G M G =.#.#.%.c.$.K l d f ` [ ` [ _ ` [ ` _ [ _ f d > , , , h g z.rXbXbXNXeXv.c.0.0.9.,.,.w.v.m.m.n.n.v.w.w.,.O.,.;.,.;.,.,.,.,.,.,.,.o.....o.o.,.2.,.0 2 w w 2 1 j v V V c c c V V H ~ ~ Q :.~ ~ :.~ y X X X * * t = 8 w w N E R N N w = * * * * X X o = 9 N Q 4.C.7.2.:.Q H H D D D C D C D C C C C Z l } 1X1X1Xg y t , : ; a >X6XiXiXaXfXfXiX' + + O O UXUXUXUX", 420 "UXUXUXUX@ X X X X . . . $ 6 k v v v n n n F F ..;.+.O...=.G G M M G M X.%.l.l.c.#.M b d ` ` ' } [ ` ` [ ' ` f h > > > > ` ` } rXbXGXNXeXv.0.9.9.0.9.q.0.0.r.w.w.v.v.e.w.,.w.9.,.;.-...o.,.,.,.,.,.,.,.....L P o.,.8.J = . 2 u N 8 3 j v V v c c c V C H H W ~ Q Q Q Q W y . X X * * t * * * t 9 9 9 9 = = * * * * * * o * X X X % 2 N :.7.B.7.6.>.-.J H D C C C C C C D C z b ' 9X9X} t t t > > ; _ ,X7XiXiXfXfXfXdX) @ O @ - UXUXUXUX", 421 "UXUXUXUX X X X . $ 3 k x v v v n v n n F O.O.O.M M M M n M M M X.%.l.n.b.&.M m I ` ] ' } [ ` f f f f d s > > s g } bXGXbXbXyXn.0.q.9.9.,.9.9.0.0.0.0.9.0.0.0.0.9.,.O.,.o.,.,.,.o.o.,.9.q.q.q.,.o...J o.P q.8.D # # 8 A Z 2 3 j k V c c B c B B D A H W H Q W ~ A 9 . X X t * * * * * * * * = * X * * * * * * X * * * o X o 9 Z :.7.p.C.4.:.Q H H D C C C C V C N w 1X2X2X` y t h > , + _ 3XiXiXfXfXfXfX,Xd ; O @ O UXUXUXUX", 422 "UXUXUXUXX X X . . # 3 k x v v v v n n n G O.O.=.M M n n M n M M @.&.x.b.x.#.M m I f _ ' [ ` f d : > : h h h ` } rXbXGXGXNXeXm.0.q.9.$.q.9.9.9.0.0.e.0.0.0.0.0.w.9.o.9.,.,.,.o.,.,.,.9.9.,.q.,.q.,.,.P ..o.,.8.S $ w A Z 8 1 j x v V c c c c V B z B B C H H H A 9 o X * * * * * * * * * * * * * * * * * X * * X X * X X X X X X o X o 9 E W 4.7.7.2.:.Q J H C C C C C C Y } 0X1XR y t t > : : ' 6X7XsXfXfXgXiX>Xa ; O O UXUXUXUX", 423 "UXUXUXUX X . # 1 j k v k v v v n n F G ..M M n n n n n M =.L &.l.b.b.l.T U I g ` ` ` f g f > , > g } qXhXMXGXbXNXyXn.m.0.9.#.9.9.q.0.0.0.0.0.0.0.0.0.0.y.9.q.,.9.o.9.9.9.9.,.9.q.9.9.9.,.q.,.,.o.o.,.>.q.w . < z A Z 9 1 j k c c z z c c c x l 6 l x B N B z 9 o . X * * * * * * * * * * * * * X * X X X * X X X * X X X X X * = y u Q 2.7.B.6.:.W D C C A A N I 1X9X` t y t i e @ ; >X6XiXsXfXfXfXiX] a ; O O O UXUXUXUX", 424 "UXUXUXUX X . 1 j v k k v v n V n F G M M n M M n M n M M M L &.l.b.l.{ K b f f h d e > > h h } eXzXMXGXbXhXtXn.m.c.0.0.9.q.9.9.$.9.9.q.0.0.0.r.0.0.0.9.0.9.q.9.9.9.9.q.9.0.w.y.0.q.y.9.q.q./ q.q.y.,.P : O . < N A Z y 1 j k c c z c c c c x 5 5 3 6 q l x q 2 # X X * * * * * * * * * X * X X * X X X X X X X X X X X X X X . X o o o = = u H >.6.6.3.-.Q H A A S [ 2X1X` y i i h > @ p >X6XiXsXfXfXfX9X) ; ; O @ @ O UXUXUXUX", 425 "UXUXUXUX . < 4 x c v v v n v v n M n k n k k n n n M M M L L &.l.b.%.U m r s e & o @ > [ rXMXGXMXJXNXtXm.v.c.0.q.q.q.9.0.9.q.0.9.9.9.0.0.0.v.0.0.9.0.9.9.9.0.9.q.9.0.0.v.c.v.0.c.c.0.0.0.0.q.,.8.w.I + + 1 N E Z r 2 4 j k c c c x c c l 3 1 1 1 3 6 6 5 2 $ X X X X X X * * * * X X * X X X * X * X X * X X X X X X o 9 Z Q >.6.2.Q W A Z ' 9X1XR y t i i > & : >X7X7XsXfXfXiX>Xp - - @ O X UXUXUXUX", 426 "UXUXUXUX . $ 3 x x v v k v v n n n n n k n n n n n n M M M M L { %.c.$.L b e f h s } 2XbXMXMXNXhXtXn.c.c.c.c.c.0.0.q.9.9.9.q.q.9.9.9.0.0.0.e.0.0.0.0.0.0.0.0.c.c.0.v.t.v.v.m.v.v.c.c.y.m.c.0.,.t.b._ + + . 5 C A N 9 < 4 k x c c x c c c x 3 1 1 1 1 3 5 3 5 < X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X o 9 z ~ 2.2.:.A S ' 1X` t y i t e e > a ,X9X7XsXfXfXiX' - O O - O X X X UXUXUXUX", 427 "UXUXUXUX . $ 3 j k v c v v v v n k M k n k n n n n n n M L G X.X.#.w.9...K I _ } dXxXbXbXhXyXn.m.b.c.c.0.0.0.0.0.q.9.9.q.9.$.9.9.9.9.0.0.0.0.c.0.0.c.0.0.0.c.c.c.m.n.n.m.m.n.n.n.tXm.eXtXn.t.t.tXqX_ a + . . # 5 Z E u % $ 4 j x x z c x c c x 3 1 1 1 1 1 1 1 1 1 # X X X X X X X X X X X X X X X X X X X X X . X X . o o = 9 N Q :.W u _ f t t y t R t > = s >X6X7XiXiXiX6X) @ O O O O % % * X X UXUXUXUX", 428 "UXUXUXUX # < l c c k z v v k v n v n k n k k k n n n G M O.;.<.1.<.4.:.H Y dXxXbXbXrXn.c.0.q.q.q.c.q.c.0.0.0.q.9.9.$.q.q.9.$.q.9.9.0.0.0.0.t.c.v.c.c.v.v.v.n.m.n.n.eXtXtXrXrXNXlXbXbXrXn.m.tXwX1Xs a + O O . $ 6 A W u % $ 3 j k x c x c c z x 6 1 < 1 1 1 1 1 5 1 1 . X X X X X X X X X X X X X X . . o . & u A u > * = t > t t > = > e >X3X7X7XiX7X<X; X O X = 9 o o X X X UXUXUXUX", 429 "UXUXUXUX # < 6 x k x k v v v v v v n k k n k M v n G =.,.1.1.5.i.5.t.l.} 1X2XrXrXm.c.%./ P q.! #.q.q.q.0.0.0.9.q.$.,.9.#.9.#.9.9.9.0.0.0.v.v.0.v.c.v.v.v.n.n.n.eXrXtXhXbXkXlXbXbXbXlXtXm.b.uX2X' ) _ a ; O O < q W ~ u % % 3 j x x z x x x x z l 1 < < 1 1 1 1 1 1 1 < . X X X X X X X X X X X . . . . X X 9 S P u = = o & t > > > : & ' 6X7X7X7X3X) @ O O O . 2 9 = o X X UXUXUXUX", 430 "UXUXUXUX . . # 4 x k x k c v v v v v k k v v G M G O.;.1.5.5.1.8.0.b.2X8X8X,Xd ! t.9.q.! / P #.q.q.q.q.q.q.9.0.9.q.9.q.o.o.9.9.9.9.0.0.0.c.v.c.v.v.v.v.m.n.n.eXIXyXhXlXkXbXbXbXbXbXbXtXm.n.rXwX1X>X_ ' ' p O . < z Q ~ w # % 5 j x z x x x x z c l 1 < < 1 1 1 1 1 3 3 3 < X X X X X X X X X X . . . . . % R q.T A A i y > o @ , ; + : _ 3X7X7X7X<X O O O . y y t = * o X UXUXUXUX", 431 "UXUXUXUXUX . # 1 x x x x k z k v v v n n n M ..;.1.<.1.<...J P } 1X6X9X1X' a + 0 :.4.,.,.o.P q.#.#.q.q.#.q.#.#.q.9.9.9.#.9.#.9.9.9.0.0.0.e.c.v.v.v.n.n.n.eXeXeXrXlXkXkXbXbXbXbXbXbXyXm.n.rXlX1X1X>X,X9X1X; . # 5 H 3.~ y # % < j v z x x x x x x x 3 < 1 1 1 1 1 1 1 3 3 3 < . X X X X X X . . . . . & i c.{ T W H H S i r 9 : + : : a ,X6X6X3X) O O O X % u y t = = o o UXUXUXUX", 432 "UXUXUXUXUX . $ j x x k x x x v F G J ..;.1.1.;.;.-.F c r f ' ,X3X1X' s ; ; + S ,.4.,.,.,.#.#.#.,.o.,.q.,.q.9.9.,.9.o.o.9.q.q.0.0.0.v.c.v.v.m.n.n.n.eXeXyXNXlXbXkXbXbXbXbXbXbXrXn.n.tXlXdX1X>X9XiXiX' . # q :.2.^ w & % 8 j v c x x x x l x x 6 < < 1 1 1 1 3 3 3 3 3 3 < X X X X . . o o 9 / v.c.T W W P P P S S w r 2 2 < >X6X3X' p ; O X o 9 u y y = = = o UXUXUXUX", 433 "UXUXUXUXUX X . $ 3 l j x k x c n G ..<.i.u.;.J V N r r a s _ ' ' ] ] a + + . + + # S t.8.,.,.,.o.o.! o.o.o.#.,.o.q.#.,.9.9.#.$.$.9.0.0.c.v.v.n.n.n.n.n.eXIXhXlXkXbXbXbXbXbXbXJXlXeXeXtXuX9X1X1X9XsXfX9X) O O # $ l 3.2.~ N & % 2 q c k c x x x x x x l 1 < 1 1 1 1 3 3 3 3 3 4 3 < X X X X . X o o o Y v.b.c./ ~ ! ! ! W P A T S r r 3 ' ,X>Xa - O X % y u y y y = * o UXUXUXUX", 434 "UXUXUXUXUX O $ < 6 l j x n F ..;.5.i.5.P b & : + : p a a a a a a O O + O O + + . # K t.8.>.,.,.-.P P o.,.o.,.q.o.q.q.o.9.q.%.q.0.0.c.v.m.b.m.eXtXeXeXyXlXlXbXkXbXbXbXJXJXbXNXn.n.rXpXdX9X1XdXfXgXiX,Xp - O O O . % < D 2.3.3.Z & 9 & 0 j z x x l l l x x j 3 1 1 1 1 1 3 3 3 3 4 3 4 3 < X X X X . X X X S c.n.c./ ! ! ! ! ! ! P P P S m b l _ >X_ : . O # 2 u R u y y 9 % o UXUXUXUX", 435 "UXUXUXUXUXUXX X X X . # $ 5 x c F ..<.p.a.t.#.[ _ ; + O O O ; ; a + X X O . + + . + O # S t.8.2.;.,.....P o.,.o.#.,.#.#.q.q.$.q.0.0.c.c.v.v.n.eXtXtXtXrXlXbXbXbXbXbXbXMXbXbXyXm.tXrXlX0X8XpXsXvXcXfX6X] a ; O . 2 q Q 6.4.3.Z 8 8 8 8 l c c x l l x x x l 6 1 1 1 3 3 3 3 3 3 3 3 4 4 4 1 . X X X . o o S c.b.| / ~ ~ ! ! / / P P T T T T I T [ { r + # . O X X & u Z Z Z y y t @ UXUXUXUX", 436 "UXUXUXUXUXUXX X X . $ 5 B Q >.5.i.r.#.I _ ) a + . . . O O . O . . @ + + + . # x ,.8.6.>.,.o.o.P o.o.! #.q.#.#.#.9.0.0.c.c.v.n.n.eXeXtXNXlXbXbXbXbXJXbXbXGXbXNXyXn.tXlXlX8XpXdXxXvXnXxXiX3X) p - O O . % q c 2.B.6.:.Z w w 8 8 x c v x l l l l q q q 3 3 3 1 1 3 3 4 3 3 4 4 3 6 6 3 & X X . o o % S c.c.c./ ! ! ! ,.! / ! P P P T { } qX1X{ U 2 # # # . X & N Z Z Z u y t @ UXUXUXUXUX", 437 "UXUXUXUXUXUX. X X X . # 0 H <.i.1.#.Y _ s a a : . . O O @ @ + . + + . 7 ,.t.8.8.:.,.o.o.o.,.o.#.q.#.#.q.0.c.c.v.n.n.tXtXrXNXlXkXbXbXbXMXbXMXbXNXyXeXn.2XlXpXpX8XlXxXmXmXcXaX6X<Xa ; O O O . . $ l Q B.B.B.:.B u w u w x c V N l l l l l l l 5 3 3 1 1 3 3 5 4 6 3 3 4 4 j l j < X X X X X = S 0.c.{ / ! ~ ! ! / ! / P P P T { { z.1XqXz.b 2 $ $ # # # . . . w Z Z Z Z u u 9 o UXUXUXUXUX", 438 "UXUXUXUXUXUX. X X $ 5 Q <...S f f a a ; + . . O + @ + + + + O # 7 K y.8.8.2.,.q.,.o.#.P #.&.&.%.c.c.v.m.n.tXlXlXlXbXbXbXbXbXbXbXJXZXyXtXn.tXdXdX0XdXpXkXMXmXmXnXkXpX6X) : - O O . . # < B 2.B.C.B.>.Z N N N u S c v c x l q q q l q q 6 3 3 1 3 3 4 4 4 3 4 4 6 4 l x x 5 % X X X X X X = u P q.c.{ / ! ! ! ! q./ / ! P P L T { } } z.z.[ r 8 2 & & & # # . . . & 8 A W E Z u y u = UXUXUXUXUX", 439 "UXUXUXUXUXUX X X X X $ 3 l w e > a p - O . O + ; > & : . + ; + r Y c.t.8.8.1.,.$.9.q.q.%.c.c.c.c.n.n.tXhXlXbXbXbXbXbXbXJXNXyXtXyXtXtXrX2X0X8XpXkXbXmXmXmXnXvXjX6X>Xa ; ; O O O . . . . < 6 Q C.C.B.B.:.A N N A E A B B c c q q q l l q q 6 6 3 1 1 3 5 6 6 4 4 4 4 4 j k c z 6 < o X X X X X X X X . X X o 9 C ! #.&./ ! ~ ! ! ! / / / q.P P L T T T T T U I I e 2 8 9 2 2 < $ # . . & & 5 A ~ ~ E Z Z Z y = UXUXUXUXUX", 440 "UXUXUXUXUXUXUX X X * $ $ O - O O . . : : : : : : + @ + : r f T c.t.8.8.8.8.w.9.,.q.0.c.c.v.b.eXyXNXlXNXNXbXZXyXIXyXeXyXtXlXuX2XpXpXlXbXMXGXmXmXnXvXaX8X3X) a ; - O O . . . % 2 x 2.C.C.7.B.3.A A A A E ! A N c c l q q q q w q q 6 3 3 1 3 5 6 6 4 4 4 4 4 j l l x c j 5 $ o X X X X X X X X X X o 9 q H o.o.P / / ~ ! ! ! / / / / / P P P T T T T m v q 8 9 9 9 9 = 2 2 % # # 2 2 0 5 c Q ^ ~ E A Z Z u = UXUXUXUXUXUX", 441 "UXUXUXUXUXUXUX X X X * * # . O . O + : : > e > : : + : ; r r Y 0.y.%Xt.t.t.t.t.t.t.v.e.v.v.n.n.yXIXyXZXyXyXeXeXtXtXlXjXjX0XpXsXbXMXmXGXGXmXmXnXxXpX8X,Xf ; ; O O O . . . % 2 5 Q B.C.C.C.C.4.Q E E E ! ( E C V V z q q q q q q q 0 3 3 1 3 6 5 6 4 4 4 4 6 6 l l x k z x l q 2 & X X X X X X X X X X o 9 w C H H P ! ! W W ! ~ ! / q./ q./ T P K K T ( T v b j 8 9 9 9 9 9 9 9 2 = = 0 N C w w H :.Q ~ E E Z Z y = UXUXUXUXUXUX", 442 "UXUXUXUXUXUXUX X X X * * * X O ; : d d a f d e : a : : & f Y z.b.eXb.m.m.t.m.t.M.m.n.n.%Xn.tXeXeXIXhXlXlXdXpXpXpXpXkXxXMXmXGXGXmXmXmXnXvXjX8X6X' a - O O O . . . # 9 0 B 6.A.Z.C.C.C.6.~ ~ ~ E ! ~ E Z N D V x q q 0 q q q q 5 3 1 3 3 6 6 3 4 4 4 4 4 j 6 x x x x c x x l 0 8 % X X X X X X X X X X X X o X X o & w N A J J H H H H ! W ! ~ ! / / / / / / P P P T T P V x l 8 9 9 9 9 9 2 9 2 9 9 w D Q A z z W :.:.~ W E W E 9 X UXUXUXUXUXUX", 443 "UXUXUXUXUXUXUX X X * * * X o . . O + : > f f f f f d r a a s s _ _ ' } tXtXtXtXeXeXIXyX%XtXyXeXtXtXlXlXjXjXjXpXjXkXkXbXMXGXGXGXGXGXmXmXmXxXkX8X6X>Xs ; ; ; O O . . . . % 2 c >.Z.Z.C.Z.C.Z.7.^ ~ ( ( E ~ E A C D F V l 0 q q q q 5 0 5 3 3 3 5 6 5 4 3 4 4 4 6 j l l z z c x x z c x l w 9 & = % % = o o o = o = o o % = 9 u N C A H H H H D D H W ~ ! ! ! / / q.| 0.q.T P K P T P K v l 8 9 9 2 2 9 9 9 9 & % 9 A -.J C z Z Q :.:.~ ~ W ~ E = UXUXUXUXUXUXUX", 444 "UXUXUXUXUXUXUXUX X X * * * * X X . . . O + : a f f ` _ ` ` f f s f s s _ ` } 1X2XlXjXjXjXlXkXlXlXjXlXjXpXjXkXkXkXbXbXbXMXmXGXGXmXmXGXmXmXnXvXkX8X8X9X_ a a ; O O . . . . % 2 q -.A.Z.Z.C.C.C.C.C.3.! ~ ~ ~ W ~ W A V D F z q 5 0 0 q q 6 6 5 3 3 6 5 3 5 3 3 4 4 4 4 6 q l l j l x x x z N c z z x w w w w w w u u w w w N B C D H H H C D D A A H W ~ ! ! / / / / | | / T P P H K P C c x 8 9 8 2 9 9 2 9 2 = 9 9 N :.-.C z V Q >.Q ~ ~ ~ ~ :.W @ UXUXUXUXUXUXUX", 445 "UXUXUXUXUXUXUXUX X X * * X X o . # # . O + : : d f _ ' ` ' } ` _ ` _ ] ] ' 9X7X8X0XjX0XjXjXjXjXkXkXkXkXkXxXMXMXGXGXmXGXGXGXGXGXmXmXnXnXMXjX8X6X9X] a a ; O O . . . % 2 0 V C.L.D.Z.Z.C.Z.A.D.7.^ ~ ~ W W W W A D H H D z 0 5 0 q 0 6 q 5 5 5 3 6 5 4 3 3 3 3 4 4 4 6 6 l l l l l x x x x z c B B B B N B B B B B C A D H H A H H D A A C D H H ! ! ! / / / / 0.| q.T P P K F H C B l 8 9 9 8 9 8 8 9 9 9 2 9 w Q ;.-.V N J >.3.Q Q Q Q 3.2.A @ UXUXUXUXUXUXUX", 446 "UXUXUXUXUXUXUXUX X X X X X X X X . . # # X + : r f _ ` ' } } ] } <X2X9X9X8X8X8XpXjXjXjXkXkXbXkXbXbXMXMXmXGXGXGXGXGXGXGXmXmXmXmXnXnXbXjX8X9X5X} ` a ; + O O . . . % $ 9 8 x <.D.F.D.D.C.C.Z.D.D.7.^ W W W Q H H W W A H J C l q 0 5 q 0 q 5 5 5 6 5 6 3 3 3 1 1 3 4 4 6 6 6 6 6 l l j l l x l x z N N N N B N B B C Z C C C C C C C C C C A H H W ! ! ! / / / / q.q./ P K H H K V c x w 8 9 8 8 8 9 9 8 8 8 9 u Q :.J H D J <.2.:.Q Q Q :.6.4.y UXUXUXUXUXUXUX", 447 "UXUXUXUXUXUXUXUX X X X . # # . X + @ > > h f _ ' ' 2X9X6X8X8X8XpXpXjXjXjXkXkXxXMXMXGXMXmXGXGXGXmXmXmXGXGXmXmXmXmXnXnXMXxXjX8X8X6X1X` s ; ; + + . . . . % # = 8 q Q D.L.D.F.D.C.C.D.P.R.6.~ ~ W W W W W Q :.W J ..J B q 5 q q 6 q 5 q 0 5 5 6 3 3 3 3 3 5 3 4 4 4 6 6 6 6 6 l l l l l l z z z B B B B B B C B B C C C C B N C B D H H Q ! ! ! / ! / / q./ P K A F C F V B N 8 9 9 9 8 8 8 8 8 8 8 y y H ;.:.J D J <.7.2.>.Q Q Q <.Z.~ X UXUXUXUXUXUXUXUX", 448 "UXUXUXUXUXUXUXUXUXX O X X X o . o % # # . @ @ + : a d f ` ] 9X6X8XpXpXkXkXkXkXxXMXMXcXmXmXGXmXGXGXGXGXGXGXGXmXmXmXmXnXnXnXMXxXjX8X8X8X9X1X] a ; ; + O . % . # % 2 l H Z.F.F.D.S.S.S.S.L.I.I.6.~ ~ E W W W Q 3.2.:.Q ..J J V q 6 0 q q 5 q 5 0 5 5 6 3 3 3 3 3 4 4 4 4 3 4 6 6 6 6 4 6 l l q l z z N c N N B B B B C B A C C C B A C A H ! ! ! W K H K H K K F C D C C V V c q w 9 9 8 w 8 8 8 8 9 9 w u H >.-.J J D >.7.5.<.:.-.-.-.4.Z.Z O UXUXUXUXUXUXUXUX", 449 "UXUXUXUXUXUXUXUXUX X X o = & $ # X X X @ @ , a , h ] 9X0XpXjXsXxXvXMXnXnXnXmXmXmXmXmXmXGXmXmXmXmXmXmXnXnXnXMXbXkXkXjX8X7X8X6X6X>X) : - O . O . . % % % % 2 w D p.J.F.D.D.D.S.D.L.I.^.U.3.E ^ ~ W Q Q ^ :.2.3.:.Q Q ..J B q 0 5 q 0 5 5 6 5 5 5 3 3 3 3 3 3 3 4 4 3 3 5 3 3 6 4 6 q l l l z z z N c N B N B B B B A C B B A D H H Q ! W H A B V B V B B V V V V V V z w 9 9 8 8 9 9 8 9 9 8 8 w u A <.2.J J J >.p.p.4.4.:.-.>.<.a.6.= UXUXUXUXUXUXUXUX", 450 "UXUXUXUXUXUXUXUXUX o = = y 9 # # . X @ @ @ ; : d ] 9X8XpXjXxXvXcXnXmXmXmXmXmXmXmXmXmXmXmXnXmXnXnXnXMXbXbXkXkXjX8X8X6X8X6X5X' : ; O O O . . . . % o % 9 2 v 5.F.J.F.S.D.S.F.F.P.(.^.U.6.E ~ ~ E ^ :.:.2.3.4.2.Q Q ..J J N 0 5 0 q 5 q 0 6 5 5 5 5 3 3 4 3 3 4 3 3 3 3 4 6 6 6 6 l x x z N z B N c N B B B B A C C B B B C D H H ! Q A B c z c c c c c V V V V N z w 8 8 8 8 8 8 w 9 9 8 9 8 u E <.>.J J J ;.a.a.7.5.4.:.;.5.d.F.W O UXUXUXUXUXUXUXUXUX", 451 "UXUXUXUXUXUXUXUXUXUX X o = % = 9 9 9 < $ @ O O , : > > ) ,X3X6X8XjXbXMXbXMXMXnXnXnXnXnXnXcXxXxXxXxXxXjXpX8XpXpX8X8X8X5X9X1X,X>Xs ; O O O . . . % & = 9 w v >.L.K.J.F.D.S.F.F.F./._.^.U.V.E E ~ :.~ :.:.2.2.2.4.:.-.Q J J J z 5 0 0 q q q 0 q 5 5 5 5 6 6 5 6 3 3 5 4 3 6 6 6 q l l l x z z N z N c z B B B C C C B c B V C A H ! ! ! H V c c k z c x c V B c z q w 8 8 8 9 8 8 9 w 9 w 8 8 u A 2.>.-.-.-.-.5.Z.p.7.<.4.2.<.a.J.D.y X UXUXUXUXUXUXUXUXUX", 452 "UXUXUXUXUXUXUXUXUXUX X o X X = = y y u w 0 3 $ . O X @ ; ; ; @ ; ) ] 3X,X0XjXjXjXkXxXxXkXaXsXiXdX9X9X9X3X,X,X>X>X,X3X9X9X>X_ s : < + - O . . . o . . % 2 y u B G 5.~.(.P.J.F.F.S.F.L.U./.).~.U.B.u Z 3.3.3.2.2.2.4.2.4.4.>.Q -.;.;.J C q 2 q q 5 0 q q 5 0 5 5 6 5 3 1 3 3 3 6 6 q 6 l l x x x z N c B c B N B B B C C N c c B V C H P P ( P P C V c x x x c k N x w w 8 8 9 8 8 8 w 9 8 8 8 u u Z :.4.>.:.-.-.<.p.S.Z.p.5.4.4.5.a.D.J.:.O UXUXUXUXUXUXUXUXUX", 453 "UXUXUXUXUXUXUXUXUXUXUX X * o = = = 9 9 w y u w 0 1 $ . X X X O @ - , @ @ : : g ` ] <X3X0X0X0X9X9X3X3X,X,X>X>X' ' ) _ ) _ ) ' >X>X] a : . . + O . O O . % . . % = y u C -.C.~.(.^.~.K.F.F.D.F.U.U.(.).~.U.~ 9 y ^ V.6.6.3.2.2.2.4.4.>.-.Q :.;.;.-.H q 0 q q q 6 0 0 q q 5 5 5 5 1 1 5 3 6 3 6 l x l x z z z N B z B c c B C B B B z z c c V D H W P ( ! H H V c c v z z z l w 0 8 8 9 w 8 9 8 w 8 9 9 w u A :.<.<.;.;.-.5.D.L.S.p.7.5.5.i.Z.D.K.F.u UXUXUXUXUXUXUXUXUXUX", 454 "UXUXUXUXUXUXUXUXUXUXUXO X = t y = = 9 9 w u u N q 1 $ . @ @ @ @ - - , h h h h _ ] <X<X<X] ] ) ) ) f a a a a a : a a f _ s a - ; O O O O O . # . . % = y Z H ..C.(.].(.(.~.P.J.F.J.L.~.(.).(.^.H.N % y ^ B.B.A.6.2.>.>.>.2.4.4.:.-.;.>.;.>.J q 2 5 5 q q 0 q q 0 5 0 2 5 1 5 1 1 5 q l x x z z z z z N c c N B B B V B B z N B B D H H J P P H H H D V c x l q w 8 w 9 8 8 8 8 8 w 8 8 9 8 8 u E 4.5.>.-.;.;.4.T.`.J.D.C.7.5.i.C.D.K.P.2.o O UXUXUXUXUXUXUXUXUXUX", 455 "UXUXUXUXUXUXUXUXUXUXUX X = y y y y y 9 u u u Z C N l 1 # . X X O @ @ , ; , , > > h g g g g g d a a a ; : ; a : ; : : a a p ; ; ; + O O + + . . # % % o 9 w N -.<.A.(.).{._._.^./.K.J.T./._._.).(./.! o * y W 3.B.!.A.6.2.2.>.>.4.5.4.>.>.<.<.<.<.-.B 0 5 q w q q q 0 0 5 0 5 5 5 5 5 5 q l l l z z z c c c B B B B B B B B B B B B B D H H H H D D B B B z q w w 8 8 8 8 9 8 9 w 0 8 8 w 8 8 2 A :.2.5.<.-.;.;.7.T.#XXXL.D.p.i.i.p.S.J.I.A.w UXUXUXUXUXUXUXUXUXUXUX", 456 "UXUXUXUXUXUXUXUXUXUXUXUX X X * y E Z y 9 9 u u N Z A A D x 1 $ # . X O @ @ , , s > s h > > , , > : ; ; ; ; ; + ; + ; + + ; + ; O . + + O . . . . % % % & & 9 u J 5.R.).).)._.{._.(.^.I.XX=X+X'.{.).^.B.& o y E 3.B.!.W.A.8.>.>.<.4.5.5.7.<.<.<.<.;.5.;.H N q 0 0 5 0 0 0 5 0 0 0 8 5 5 5 q q q q l z z z c c B B B B B B B B V B V B C D H H C C B z z l q w 0 8 9 8 8 8 8 0 8 0 8 8 8 9 w 0 w W 4.5.<.<.1.<.<.p.I.oX+XOXT.F.Z.a.Z.S.J.P.P.:.O UXUXUXUXUXUXUXUXUXUXUX", 457 "UXUXUXUXUXUXUXUXUXUXUXUX X t E E i w y y w N Z A H H D c 4 < # . . O @ @ , , s , ; , ; @ ; , ; ; + + ; ; + + ; ; + + O . O . O . . + . . # . . % = & 9 8 x -.R.].].).)._._._.(.^./.+X;X#X_.].).'.E @ = E :.6.!.Q.W.A.4.;.4.<.4.5.i.7.4.<.;.<.<.<.;.Q B 0 2 0 0 q 6 0 5 0 5 0 0 5 0 5 0 q w w q q z z z z N B B B B c B V B B B B B C B B N w w q w 0 0 8 8 9 8 8 w 0 8 8 0 w 8 8 2 8 Z ~ 4.p.5.1.;.;.5.Z.I.'.XX+XOXXXY.F.D.Z.L.P.~.Z.9 UXUXUXUXUXUXUXUXUXUXUXUX", 458 "UXUXUXUXUXUXUXUXUXUXUXUXUX X O = u ^ ~ Z N u N N Z A H W W Q F j 1 < # # . @ + + - + @ O @ - O O @ ; + ; + + + + . O . O . . O . . . . % % = o % 9 8 w l F ;.H.).].{.).).)._._.{..X:X;XSX#X(.)._.B.o , u ~ 6.A.&XOXY.C.5.4.<.5.5.7.p.5.5.<.<.<.<.5.u.<.J N 2 5 0 0 0 q 0 0 0 5 0 5 2 0 0 0 0 0 0 0 w q l z l z l x l z N N z N z N w w w q w 0 8 8 8 8 8 0 0 8 0 0 w 8 8 8 8 8 2 u W 4.7.5.<.;.;.5.s.R.~.~.~.`.XXOXOXQ.T.L.J.K.~.U.! . O UXUXUXUXUXUXUXUXUXUXUXUX", 459 "UXUXUXUXUXUXUXUXUXUXUXUXUX . X o t E 3.3.E Z u Z Z A A W W Q -.J n j 3 < # # . . . . . O O . O O . . . . . . o . % & % 9 9 u N V ..a.Y.^.).[.[.{.).).).)..X#X;XSX;X:X(.].H.w * = E 2.B.Q.Q.XXU.D.5.4.5.7.5.p.a.a.p.5.<.<.5.i.i.i.<.J N q 0 0 0 q 0 q q 0 0 0 0 0 0 5 8 5 8 0 8 w 0 0 w 8 0 0 0 q w w 0 w 0 8 8 8 8 8 8 8 0 0 0 8 8 0 8 w 8 w w 8 8 9 N Q 4.i.i.i.1.;.;.5.U./.(.^.~.I././.XX=XOX`./.~./.~.7. UXUXUXUXUXUXUXUXUXUXUXUXUX", 460 "UXUXUXUXUXUXUXUXUXUXUXUXUXUX O o t i ^ %X3.E Z B Z A W H W Q Q :.-.F k j 3 < . . . . . . . . . . . o o o % o % % % 9 9 w B G <.D.I.I.I.^.).[.].).).).]..X:XSXSX;X:X).).3. + X u 2.A.Y.Q.XXT.P.D.5.5.5.5.p.p.a.p.Z.i.5.5.5.5.5.i.1.>.J A l 0 0 0 0 0 0 0 0 0 0 q 0 q 0 0 0 0 8 8 0 8 0 5 8 0 0 0 0 8 8 w 8 w 8 0 8 w 0 0 w 0 w 0 0 8 0 8 8 8 8 Z W 4.p.p.5.1.<.+.+.i.P..X{.(.^.I.I.I./.`.=X-X+X`./._.L.w UXUXUXUXUXUXUXUXUXUXUXUXUX", 461 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUX * * y E V.*XV.( A A A H W W Q Q Q ;.>...M k j 3 $ # . . # . . . . . . . . . . o o o % & = = 9 9 w l V ;.C.I.~.I.I.I.~.^.].].].].]. X.X;XSX;X;X#X).H.y UXUXUX O * ~ A.Q.Q.T.U.I.I.D.i.5.i.i.p.p.a.a.d.a.i.5.<.1.5.i.i.5.>.Q A N 0 0 5 5 0 0 0 0 0 w 0 0 0 0 0 0 0 8 0 0 8 8 8 8 8 0 8 8 8 0 0 w 0 0 0 w w 0 0 0 8 8 0 8 9 w N Q 4.7.i.i.5.1.;.+.i.S.K.~._.{.{.^.I.I.I.~.XX=X:X=XoX_./.:. UXUXUXUXUXUXUXUXUXUXUXUXUXUX", 462 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUX O o 9 Z ^ %X*XV.:.W A A W ~ Q -.:.:.>.<.<.;...n k 4 < & # # % # . . . . . . . . . . . . . . . . o o = o o % = = = 8 w w c C ..7.I.(.^.I.I.I.~.I.^.(.].{.{.]. X#X:XSXSX;X#X/.E O UXUXUXUX u B.Q.Q.U.U.I.P.P.D.p.p.p.p.p.a.Z.S.S.d.d.p.5.5.5.5.i.i.u.5.>.H C w 0 0 0 0 0 w 0 0 0 0 w q 0 0 w 0 0 w 0 0 0 8 w 8 w w 0 0 w w w 0 w 8 w w 8 8 0 w Z W 2.6.p.a.i.5.1.1.+.1.d.F.P.I.I.(.{..X_./.I.P.~.=XAX-X+X`./.4.# O UXUXUXUXUXUXUXUXUXUXUXUXUXUX", 463 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX o = y E %X*X!.B.2.W W Q Q Q Q :.:.>.2.<.5.<.1.O.M k j 5 2 & $ $ # # . # # . . . . . . . . . . . . . . . . . . . . o . o o % o = % % = 9 = 9 y u N V D :.C.R.(.].(.(.~.I.I.I.~.I.~.).{.[.[. X#X:XSXSX:X.X~ UXUXUXUXUX X E W.Q.T.K.P.I.I.~.L.Z.a.p.a.Z.d.S.S.F.S.F.S.p.i.5.i.p.i.a.i.i.4.:.W A N N q q w w w w 0 w w w 0 w q 0 0 w w 8 w w w w w w w w w w w w w w N A ~ ~ 2.5.p.a.i.i.u.1.+.N.a.S.J.J.P.P.P.~.{.{.'.^.~.~.`.-X;X:XoX'.Z.& X UXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 464 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX X y Z y.%X*X!.A.2.:.W Q Q :.:.>.>.2.4.4.5.5.i.u.+.M k l 5 1 2 2 $ % # # . % . . . . . . . . . . . . . . . . . o . . o o o o * = o = = = = 9 8 u q z C H :.7.U.[.}.].).(.^.^.I.I.I.I.~.~.).[.}.[. X#X:XSXSX:XV. UXUXUXUXUXUXUX = E.Y.Y.K.P.P.P.~.~.P.D.a.a.a.Z.S.S.F.F.F.J.L.F.Z.p.i.5.5.1.u.a.a.7.4.>.Q J C w q w w w 0 0 8 2 8 2 8 8 8 8 8 8 8 8 8 8 0 0 w u u u Z A Q 3.6.p.C.a.i.5.u.1.N.1.u.a.D.K.P.J.J.J.K.K.I.'..X_.(.(._.=XAX;X=X'.I.Z UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 465 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX o y ^ %X!.!.Y.D.C.>.Q Q -.:.>.>.<.4.5.7.5.5.i.a.i.+.O.M k j 6 2 2 2 & % $ % # # % # # # % . % o . . % % # % o % % % % = = = = = = = y 9 8 u N V J ,.8.H._. X}.[.].].].(.(.^.~.I.I.~.^.).[.[.[.[..X#X:XSX;X@XZ O UXUXUXUXUXUXUXUX O - E Y.Y.P.P.P.P.I.I.I.P.L.S.d.S.S.S.S.F.F.F.J.K.K.L.Z.p.5.5.i.i.a.d.a.i.7.<.2.:.Q W W A Z N N N N u w 0 8 8 8 w w w N Z Z Z Z E ~ :.2.6.B.p.p.i.a.a.u.u.1.1.u.S.K.I.I.P.K.J.J.K.K.P.P./._.{.).).#XSXSXSX:X/.:.o O UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 466 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX * R y.E.E.!.L.D.Z.7.>.:.:.>.>.4.5.4.5.5.7.p.D.D.S.d.i.N.O.M M k x l 5 5 2 8 5 5 2 & 2 $ & % & & = & & & = = 9 9 9 9 w 9 w u u w N B C H J -.7.U..X X X|.|.|.[.[.[.].).(.^.^.~.~.(.].[.}.[.[.[. X#X;XSX:XR O UXUXUXUXUXUXUXUXUX O ( Y.J.K.P.P.I.I.~.~.~.K.D.S.S.S.S.F.F.J.J.K.P.P.I.L.F.Z.a.p.a.a.a.d.i.d.p.p.p.p.7.6.6.2.3.3.:.! Q Q W H W ~ :.:.3.6.3.6.6.C.B.Z.a.a.p.a.i.i.k.u.u.i.a.D.P.~.(.^.~.I.K.J.K.J.K.K.P.I._.{.]..X:XAXSXSX:X2.# UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 467 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX * t ( %X*XA.D.R.L.F.Z.4.>.>.>.<.4.5.7.p.p.Z.Z.S.D.D.F.S.f.d.u.+.O.=.M n v j j j 5 5 5 2 2 8 2 8 2 9 2 8 8 0 8 0 w q N x c D G J -.<.7.A.H.(.}.|.|.|.|.|.|.|.[.].].].).(.(.^.^.(.].[.}.[.}.[.[. X X;XSX( X X UXUXUXUXUXUXUXUXUXUXUX O ~ P.I.P.K.P.I.~.~.~.^.~.L.D.S.F.F.J.J.K.P.P.I.I.I.I.K.L.D.Z.a.a.a.d.i.d.d.d.S.d.d.Z.Z.p.p.7.7.7.8.7.p.p.p.7.B.C.p.Z.Z.d.a.a.a.a.d.u.u.u.u.a.d.D.L.I.^.^.^.^.^.~.P.P.K.J.J.J.J.I.^.(.].{..X;XSXSX-X2.= UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 468 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX X t m.%XA.R.D.D.L.F.F.p.5.<.4.4.5.7.p.Z.Z.S.D.D.D.D.F.F.F.F.G.k.k.N.N.+.O.=.=.n n v k v c v n n v n n n G G G G G ..O.;.1.i.p.R.'. X|.|.|.|.|.|.|.|.|.|.}.}.[.].].).).(.).).[.}.}.}.[.[.[.}.|..X;X| @ O UXUXUXUXUXUXUXUXUXUXUXUXUX O 3.I.K.K.P.P.I.I.~.^.(.^.P.F.F.L.J.J.K.P.P.P.P.I.I.I.I.I.K.L.D.S.Z.d.d.d.d.d.d.d.f.d.d.d.d.d.a.d.d.S.d.d.a.d.d.d.d.d.d.f.d.a.i.k.s.d.S.D.R.(.).).(.(.^.^.^.~.~.P.P.K.J.J.L.U.^._.).]..X#X;XSXSX8.= O UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 469 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX X g y.E.H.D.D.F.L.J.J.D.S.7.5.5.7.p.a.C.Z.D.D.F.F.L.F.F.F.F.F.F.F.F.f.f.f.f.f.u.u.1.1.1.u.u.1.u.1.u.u.u.s.a.d.G.L.U.^.].[.}. X|.|.|.|.|.|.|.|.|.|.|.|.|.}.[.[.[.].].].[.}.}.[.[.[.[.[.[.[.|.#X| O UXUXUXUXUXUXUXUXUXUXUXUXUXUXUX O :.K.P.K.P.P.I.~.~.(.(.(.~.P.J.K.K.P.P.P.P.P.P.I.I.I.I.I.I.I.P.P.L.L.D.D.Z.S.S.S.d.d.d.d.d.d.d.d.d.d.d.d.d.S.S.Z.Z.Z.A.Z.D.R.U.(.].].[.].].).).).).(.^.~.~.~.I.P.K.J.K.~.).).].).]..X:XSXFX%X= O X UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 470 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX i y.A.D.D.F.J.F.F.J.K.L.Z.p.p.p.C.Z.Z.D.D.R.D.F.F.J.F.J.J.J.K.K.K.J.J.J.F.F.F.F.G.G.F.G.F.G.D.F.L.U.U./._.{.}.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.}.}.[.[.[.[.[.}.}.[.[.[.[.[.}.}. X.X( UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX O X :.P.P.P.P.I.~.~.~.^.(.(.(.~.~.P.P.P.P.P.I.I.I.I.P.I.I.P.I.~.~.^.^.~.~./.R.U.R.R.R.H.H.R.H.H.D.H.H.H.R.I.~._.'._.{.$X{. X}.|.|.|.}.[.].).(.(.).(.(.^.^.~.~.I.I.P.I.(.].].).).).{.#X:XSXIXe UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 471 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX g y.H.F.D.F.J.J.J.K.P.P.D.Z.Z.S.S.S.D.D.F.L.F.J.J.J.J.J.K.K.J.K.K.J.K.K.K.K.K.P.P.P.P.I.~.~.^._.).[.[.}.}.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.}.}.[.}.}.}.}.}.[.[.[.[.}.}.|. X~ UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX O Q P.P.P.I.I.~.^.^.^.(.).(.^.^.I.P.P.P.P.P.I.P.I.I.I.I.I.I.~.^.(.(.).).].].|.}.[.}.{.[.].[.{.}.}.}.|.}.|.|.|.|.|.|.|.|.|.}.}.}.[.[.].).(.).(.(.^.^.^.~.~.^.^.(.).[.[.].].].].{.#X;XZXd X UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 472 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX i y.A.D.F.J.J.J.K.K.P.I.P.L.L.D.D.R.D.F.F.L.J.J.J.J.J.K.J.K.K.K.K.K.P.P.P.I.~.~.^.^.(.(.).).].].[.}.}.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.}.}.}.[.}.[.}.}.}.[.[.[.[.[.{.}. X~ UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX ~ P.I.P.I.~.~.~.^.^.(.(.(._.).(.^.I.P.I.P.P.P.I.I.I.~.~.~.^.(.(.(.).].].[.}.|.|.}.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.}.}.}.[.[.].).).(.(.(.^.^.(.^.(.).].[.[.[.].).].].[.{.:X%Xe UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 473 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX y 3.D.F.F.F.J.K.K.K.I.~.I.I.I.L.R.F.F.F.L.J.J.J.J.J.J.J.K.K.K.P.P.I.I.I.~.^.^.(.(._.).).[.[.[.}.}.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.}.}.[.[.[.}.[.}.[.[.[.}.[.}.|.$X~ X UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX ~ P.I.I.~.~.^.~.~.^.^.(.).].].].).(.^.~.I.I.U.I.I.~.~.^.^.^.(.(.)._.].[.}.}.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.}.}.[.].].].).).(.(.(.(.).).].[.[.[.}.[.].].].].].|.#X%X> UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 474 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX % ^ F.F.J.J.J.J.K.K.P.I.I.~.~.I.P.K.K.J.L.J.J.J.J.J.J.K.K.L.K.P.I.I.I.~.^.^.^.(.).).].].[.[.}.}.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.}.}.}.[.[.[.[.[.[.[.].[.[.[.[.|.}.$Xu X UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX . E R.~.~.~.^.~.~.~.~.(.(.(.).[.[.[.].].(.^.^.~.~.~.I.~.^.^.(.(._.].].].[.}.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.}.[.[.[.].).).).).).].[.[.[.[.[.].].).].].[.]. X.Xy.@ UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 475 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX E Z.F.F.J.J.K.K.K.P.I.~.~.^.^.^.^.I.P.P.P.K.K.K.L.K.P.P.K.P.I.P.I.~.^.~.^.(.(.(._.).].[.[.[.}.}.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.}.}.}.}.[.[.[.[.[.[.[.[.[.].].[.[.V.= UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX O O u A.~.I.I.~.~.~.^.^.^.(.(.).].[.[.[.}.}.[.{.).(.^.^.^.(.(.).).].[.[.}.}.}.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.}.}.}.[.[.].].].].].].[.[.[.[.[.[.].].].].].].[.H.( UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 476 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX O = 4.F.F.F.J.K.K.K.P.I.~.~.^.^.(.(.^.^.^.~.I.I.P.P.P.P.P.P.P.I.I.I.~.^.^.(.(.)._.].).].[.}.}.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.}.}.}.[.[.[.[.[.].[.].[.[.[._.[._.^ O UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX * :.R.~.I.~.~.^.~.^.(.^.).].].[.[.|.|.|.|.|.}.}.].].].).).).].[.}.}.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.}.}.[.[.[.[.[.[.[.[.[.[.].].].].].[.].].[.].V.> UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 477 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX o -.F.J.J.K.K.K.I.I.I.I.^.^.^.(.(.(.(.(.(.(.^.^.^.~.^.~.~.~.~.~.~.^.(.(.(.).].].[.[.}.}.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.}.}.[.[.[.[.[.[.].[.].[.[.}.}.}.H.Z UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX X E C.~.^.^.~.~.^.^.(.(.).].[.}.}.|.|.|.|.|.|.|.|.}.[.}.[.}.}.}.}.|.}.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.}.}.[.}.[.[.[.[.[.[.[.].].].[.].].].].].H.^ % UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 478 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX X A p.J.K.K.P.P.I.I.I.I.~.^.^.^.(.(.).].].[.{.[.[.[.[.[.].].].].].].].[.[.}.}.}.}.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.}.{.}.[.[.[.[.[.[.[.[.].[.}._.^ = UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX % 6.R.~.~.~.^.(.(.).(.).[.[.}.}.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.}.}.}.}.[.[.[.[.[.[.].].].[.].[.].].].].[.V.y UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 479 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX o Q A.K.K.L.K.P.I.I.I.~.^.~.^.^.(._.].}.}.}.|.}.|.|.|.|.|.|.|.}.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.}.}.}.}.[.[.{.].[.[.].[.].[._.V.9 UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX O u 6.~.^.^.^.^.(.).].].[.}.}.}.}.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.}.}.[.}.[.[.[.[.[.[.].].[.].].].].].[.].H.~ UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 480 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX X 9 ~ D.L.L.K.I.I.~.~.~.^.~.^.^.).).].[.[.}.}.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.}.}.[.}.}.[.[.].].].}.).V.Z UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX E B.~.I.^.(.].].[.}.}.}.}.}.|.|.|.}.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.}.}.}.}.[.[.].].].[.[.].].[.[.].).(.].H.^ = UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 481 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX O u 6.D.P.~.^.^.^.~.~.~.^.(.(.).].[.[.}.}.}.}.|.}.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.}.}.[.[.}.}.|.|.}.].V.Z UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX X E A.(.].}.}.}.}.}.}.|.|.}.}.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.}.|.}.}.[.[.].].[.].].].].[.}.}.[.).$X3.y UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 482 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX o Z 3.H.I.~.I.I.~.~.^.(.(.).].{.].}.[.}.}.|.}.|.|.}.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.}.].].}.}._.V.E = UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX 9 E V._.[.}.}.}.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.}.}.[.[.].[.[.].[.[.[.].].].}.}.$X^ u UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 483 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX O 9 A 3.D.I.~.~.~.^.^._.).].[.[.}.}.}.}.}.}.}.|.|.}.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.}._.V.W y UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX o u W V.$X|.|.|.|.|.}.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.}.}.[.[.[.].].[.].[.|.[.[.$X3.E 9 UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 484 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX O o Z ^ B.H.R.U.~._.[.[.}.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.}.{.}.$XV.3.Z o X UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX % Z 3.V.$X{.}.}.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.}.}.}.[.].{._.$XV.3.Z O UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 485 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX * y E 3.H.U.(.].|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.}.$XV.^ u * * UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX X X * * y E 3.$X{.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.]._.H.3.~ y = X UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 486 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX X = u E ^ V.H._.}.}.}.}.}.|.|.}.}.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.$X$XV.^ E 9 O UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX . y Z ~ ^ V.$X$X|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.}.].$XV.^ ~ Z 9 UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 487 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX . o 9 Z E ^ ^ 3.^ 3.V.V.V.V.V.V.V.V.V.V.V.V.3.^ V.^ E E u t * * * X UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX * * o 9 y E E ^ ^ ^ V.V.V.V.V.V.V.V.V.V.V.V.V.V.^ 3.^ E E u 9 o X UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 488 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX X * X % = % t = = 9 = = * X * X X UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX X * o * * = y = = t o o o X X X UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 489 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX X X O X X UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX X X X X X UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 490 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 491 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 492 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 493 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 494 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 495 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 496 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 497 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 498 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 499 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 500 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 501 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 502 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 503 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 504 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 505 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 506 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 507 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 508 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 509 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 510 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 511 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 512 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 513 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 514 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 515 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 516 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", 517 "UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX" 518 }; -
dists/scummvm.rc
diff --git a/dists/pegasus/scummpegasus.zip b/dists/pegasus/scummpegasus.zip new file mode 100644 index 0000000..78a790e Binary files /dev/null and b/dists/pegasus/scummpegasus.zip differ diff --git a/dists/scummvm.rc b/dists/scummvm.rc index f0609c1..1a9796e 100644
a b 9 9 #define IDI_COUNT 1002 10 10 #define ID_GDF_XML __GDF_XML 11 11 12 IDI_ICON ICON DISCARDABLE " icons/scummvm.ico"12 IDI_ICON ICON DISCARDABLE "dists/pegasus/pegasus.ico" 13 13 IDI_COUNT ICON DISCARDABLE "icons/count.ico" 14 14 15 15 ID_GDF_XML DATA "dists/win32/scummvm.gdf.xml" 16 16 17 17 scummclassic.zip FILE "gui/themes/scummclassic.zip" 18 scumm modern.zip FILE "gui/themes/scummmodern.zip"18 scummpegasus.zip FILE "dists/pegasus/scummpegasus.zip" 19 19 #ifdef USE_TRANSLATION 20 20 translations.dat FILE "gui/themes/translations.dat" 21 21 #endif -
engines/pegasus/ai/ai_action.cpp
diff --git a/engines/pegasus/ai/ai_action.cpp b/engines/pegasus/ai/ai_action.cpp index 38d6390..6f24647 100644
a b AIPlayMessageAction::AIPlayMessageAction(const Common::String &movieName, bool k 45 45 } 46 46 47 47 void AIPlayMessageAction::performAIAction(AIRule *) { 48 if (g_AIArea ) {48 if (g_AIArea && g_AIArea->isChattyAI()) { 49 49 g_AIArea->checkMiddleArea(); 50 50 g_AIArea->playAIMovie(kRightAreaSignature, _movieName, _keepLastFrame, _interruptionFilter); 51 51 } -
engines/pegasus/ai/ai_area.cpp
diff --git a/engines/pegasus/ai/ai_area.cpp b/engines/pegasus/ai/ai_area.cpp index 5ac8af8..c6aeda8 100644
a b 29 29 #include "pegasus/pegasus.h" 30 30 #include "pegasus/ai/ai_area.h" 31 31 #include "pegasus/items/biochips/aichip.h" 32 #include "pegasus/items/biochips/arthurchip.h" 32 33 #include "pegasus/items/biochips/biochipitem.h" 33 34 #include "pegasus/items/biochips/opticalchip.h" 34 35 #include "pegasus/items/biochips/pegasuschip.h" … … AIArea::AIArea(InputHandler *nextHandler) : InputHandler(nextHandler), _leftArea 50 51 _middleBiochipTime = 0xffffffff; 51 52 _rightBiochipTime = 0xffffffff; 52 53 _lockCount = 0; 54 _chattyAI = true; 55 ((PegasusEngine *)g_engine)->requestToggle(false); 53 56 startIdling(); 54 57 } 55 58 … … void AIArea::activateHotspots() { 452 455 case kOpticalBiochip: 453 456 ((OpticalChip *)currentBiochip)->activateOpticalHotspots(); 454 457 break; 458 case kArthurBiochip: 459 if (vm->isDVD()) 460 ((ArthurChip *)currentBiochip)->activateArthurHotspots(); 461 break; 455 462 } 456 463 } else if (_middleAreaOwner == kInventorySignature) { 457 464 InventoryItem *currentItem = ((PegasusEngine *)g_engine)->getCurrentInventoryItem(); … … void AIArea::clickInHotspot(const Input &input, const Hotspot *hotspot) { 490 497 handled = true; 491 498 } 492 499 break; 500 case kArthurBiochip: 501 if (vm->isDVD() && (hotspot->getHotspotFlags() & kArthurBiochipSpotFlag) != 0) { 502 ((ArthurChip *)currentBiochip)->clickInArthurHotspot(hotspot->getObjectID()); 503 handled = true; 504 } 505 break; 493 506 } 494 507 } 495 508 } else if (_middleAreaOwner == kInventorySignature) { … … void AIArea::forceAIUnlocked() { 533 546 } 534 547 } 535 548 549 void AIArea::setChattyAI(bool flag) { 550 _chattyAI = flag; 551 552 if (g_arthurChip) 553 g_arthurChip->setUpArthurChip(); 554 555 if (flag) { 556 playAIMovie(kRightAreaSignature, "Images/AI/Globals/XGLOB01", false, kHintInterruption); 557 } else { 558 playAIMovie(kRightAreaSignature, "Images/AI/Globals/XGLOB00", false, kHintInterruption); 559 if (g_arthurChip) 560 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBB29", kArthurDisabledAI); 561 } 562 } 563 536 564 void AIArea::checkRules() { 537 565 if (_lockCount == 0 && ((PegasusEngine *)g_engine)->playerAlive()) 538 566 for (AIRuleList::iterator it = _AIRules.begin(); it != _AIRules.end(); it++) -
engines/pegasus/ai/ai_area.h
diff --git a/engines/pegasus/ai/ai_area.h b/engines/pegasus/ai/ai_area.h index 806e6ef..5541eca 100644
a b public: 130 130 void unlockAI(); 131 131 void forceAIUnlocked(); 132 132 133 bool isChattyAI() { return _chattyAI; } 134 void setChattyAI(bool); 135 133 136 void checkMiddleArea(); 134 137 void checkRules(); 135 138 … … protected: 163 166 AIRuleList _AIRules; 164 167 165 168 uint _lockCount; 169 170 bool _chattyAI; 166 171 }; 167 172 168 173 extern AIArea *g_AIArea; -
new file engines/pegasus/chase.cpp
diff --git a/engines/pegasus/chase.cpp b/engines/pegasus/chase.cpp new file mode 100644 index 0000000..43f88d3
- + 1 /* ScummVM - Graphic Adventure Engine 2 * 3 * ScummVM is the legal property of its developers, whose names 4 * are too numerous to list here. Please refer to the COPYRIGHT 5 * file distributed with this source distribution. 6 * 7 * Additional copyright for this file: 8 * Copyright (C) 1995-2013 Presto Studios, Inc. 9 * 10 * This program is free software; you can redistribute it and/or 11 * modify it under the terms of the GNU General Public License 12 * as published by the Free Software Foundation; either version 2 13 * of the License, or (at your option) any later version. 14 15 * This program is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU General Public License for more details. 19 20 * You should have received a copy of the GNU General Public License 21 * along with this program; if not, write to the Free Software 22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 23 * 24 */ 25 26 #include "pegasus/chase.h" 27 28 namespace Pegasus { 29 30 // Notification constants. 31 32 static const NotificationFlags kChaseNotificationFlags = kChaseEnteredBranchZone | 33 kChaseExitedBranchZone | 34 kChaseFinished; 35 36 ChaseInteraction::ChaseInteraction(const InteractionID interactionID, Neighborhood *handler, 37 const NotificationID notificationID, NotificationManager *manager) : GameInteraction(interactionID, handler), 38 _chaseNotification(notificationID, manager), _steerPict(kNoDisplayElement), _directionNeeded(false), 39 _turnDirection(kNoTurn) { 40 41 // HACK HACK HACK HACK HACK 42 // TRIPLE SUPER ULTRA HACK 43 // This avoids a nasty optimization bug I have been unable to track down 44 // after days and days of searching. Let's just ship the game already. 45 setNextHandler(0); 46 47 _neighborhoodNotification = handler->getNeighborhoodNotification(); 48 } 49 50 void ChaseInteraction::openInteraction() { 51 _steerPict.initFromPICTFile("Images/Interface/steer.pict", true); 52 53 _chaseNotification.notifyMe(this, kChaseNotificationFlags, kChaseNotificationFlags); 54 55 _neighborhoodNotification->notifyMe(this, kDelayCompletedFlag | kSpotSoundCompletedFlag, 56 kDelayCompletedFlag | kSpotSoundCompletedFlag); 57 } 58 59 void ChaseInteraction::closeInteraction() { 60 _steerPict.hide(); 61 _steerPict.deallocateSurface(); 62 63 _chaseNotification.cancelNotification(this); 64 65 _neighborhoodNotification->cancelNotification(this); 66 } 67 68 void ChaseInteraction::receiveNotification(Notification *notification, const NotificationFlags flags) { 69 if (notification == &_chaseNotification) 70 switch (flags) { 71 case kChaseEnteredBranchZone: 72 _directionNeeded = true; 73 showControlsHint(); 74 setUpBranch(); 75 break; 76 case kChaseExitedBranchZone: 77 switch (_turnDirection) { 78 case kTurnLeft: 79 branchLeft(); 80 break; 81 case kTurnRight: 82 branchRight(); 83 break; 84 case kNoTurn: 85 dontBranch(); 86 break; 87 default: 88 break; 89 } 90 hideControlsHint(); 91 _turnDirection = kNoTurn; 92 _directionNeeded = false; 93 break; 94 case kChaseFinished: 95 _owner->requestDeleteCurrentInteraction(); 96 break; 97 default: 98 break; 99 } 100 } 101 102 void ChaseInteraction::handleInput(const Input &input, const Hotspot *cursorSpot) { 103 if (input.anyDirectionInput()) { 104 if (_directionNeeded) { 105 if (input.leftButtonAnyDown()) 106 _turnDirection = kTurnLeft; 107 else if (input.rightButtonAnyDown()) 108 _turnDirection = kTurnRight; 109 } 110 } else { 111 this->InputHandler::handleInput(input, cursorSpot); 112 } 113 } 114 115 void ChaseInteraction::showControlsHint() { 116 _steerPict.show(); 117 } 118 119 void ChaseInteraction::hideControlsHint() { 120 _steerPict.hide(); 121 } 122 123 } // End of namespace Pegasus -
new file engines/pegasus/chase.h
diff --git a/engines/pegasus/chase.h b/engines/pegasus/chase.h new file mode 100644 index 0000000..1e9881d
- + 1 /* ScummVM - Graphic Adventure Engine 2 * 3 * ScummVM is the legal property of its developers, whose names 4 * are too numerous to list here. Please refer to the COPYRIGHT 5 * file distributed with this source distribution. 6 * 7 * Additional copyright for this file: 8 * Copyright (C) 1995-2013 Presto Studios, Inc. 9 * 10 * This program is free software; you can redistribute it and/or 11 * modify it under the terms of the GNU General Public License 12 * as published by the Free Software Foundation; either version 2 13 * of the License, or (at your option) any later version. 14 15 * This program is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU General Public License for more details. 19 20 * You should have received a copy of the GNU General Public License 21 * along with this program; if not, write to the Free Software 22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 23 * 24 */ 25 26 #ifndef PEGASUS_CHASE_H 27 #define PEGASUS_CHASE_H 28 29 #include "pegasus/hotspot.h" 30 #include "pegasus/interaction.h" 31 #include "pegasus/notification.h" 32 #include "pegasus/neighborhood/neighborhood.h" 33 34 namespace Pegasus { 35 36 // Notification constants. 37 38 static const NotificationFlags kChaseEnteredBranchZone = 1; 39 static const NotificationFlags kChaseExitedBranchZone = kChaseEnteredBranchZone << 1; 40 static const NotificationFlags kChaseFinished = kChaseExitedBranchZone << 1; 41 42 // Time to choose a direction. 43 44 static const TimeValue kDecisionTime = 600 * 2; 45 46 class ChaseInteraction : public GameInteraction, public NotificationReceiver { 47 public: 48 ChaseInteraction(const InteractionID, Neighborhood *, NotificationID, NotificationManager *); 49 virtual ~ChaseInteraction() {} 50 51 virtual void handleInput(const Input &, const Hotspot *); 52 53 protected: 54 55 virtual void openInteraction(); 56 virtual void initInteraction() {} 57 virtual void closeInteraction(); 58 59 virtual void receiveNotification(Notification *, const NotificationFlags); 60 61 virtual void setUpBranch() {} 62 virtual void branchLeft() {} 63 virtual void branchRight() {} 64 virtual void dontBranch() {} 65 66 virtual void showControlsHint(); 67 virtual void hideControlsHint(); 68 69 Notification _chaseNotification; 70 71 Notification *_neighborhoodNotification; 72 73 Picture _steerPict; 74 75 private: 76 77 bool _directionNeeded; 78 TurnDirection _turnDirection; 79 }; 80 81 } // End of namespace Pegasus 82 83 #endif -
engines/pegasus/constants.h
diff --git a/engines/pegasus/constants.h b/engines/pegasus/constants.h index f81d219..76fabe8 100644
a b static const NotificationID kNoradPressureNotificationID = kNoradFillingStationN 379 379 static const NotificationID kNoradUtilityNotificationID = kNoradPressureNotificationID + 1; 380 380 static const NotificationID kNoradElevatorNotificationID = kNoradUtilityNotificationID + 1; 381 381 static const NotificationID kNoradSubPlatformNotificationID = kNoradElevatorNotificationID + 1; 382 static const NotificationID kSubControlNotificationID = kNoradSubPlatformNotificationID + 1; 382 static const NotificationID kNoradSubChaseNotificationID = kNoradSubPlatformNotificationID + 1; 383 static const NotificationID kSubControlNotificationID = kNoradSubChaseNotificationID + 1; 383 384 static const NotificationID kNoradGreenBallNotificationID = kSubControlNotificationID + 1; 384 385 static const NotificationID kNoradGlobeNotificationID = kNoradGreenBallNotificationID + 1; 385 386 static const NotificationID kCaldoriaVidPhoneNotificationID = kNoradGlobeNotificationID + 1; 386 387 static const NotificationID kCaldoriaMessagesNotificationID = kCaldoriaVidPhoneNotificationID + 1; 387 388 static const NotificationID kCaldoriaBombTimerNotificationID = kCaldoriaMessagesNotificationID + 1; 389 static const NotificationID kMarsTunnelPodNotificationID = kCaldoriaBombTimerNotificationID + 1; 390 static const NotificationID kMarsCanyonChaseNotificationID = kMarsTunnelPodNotificationID + 1; 388 391 389 392 // Sent to the shell by fShellNotification. 390 393 static const NotificationFlags kGameStartingFlag = 1; … … static const HotSpotID kAISolveSpotID = kAIHint3SpotID + 1; 463 466 static const HotSpotID kAIBriefingSpotID = kAISolveSpotID + 1; 464 467 static const HotSpotID kAIScanSpotID = kAIBriefingSpotID + 1; 465 468 466 static const HotSpotID kPegasusRecallSpotID = kAIScanSpotID + 1; 469 static const HotSpotID kArthurWisdomSpotID = kAIScanSpotID + 1; 470 static const HotSpotID kChattyArthurSpotID = kArthurWisdomSpotID + 1; 471 static const HotSpotID kChattyAISpotID = kChattyArthurSpotID + 1; 472 static const HotSpotID kArthurHeadSpotID = kChattyAISpotID + 1; 473 474 static const HotSpotID kPegasusRecallSpotID = kArthurHeadSpotID + 1; 467 475 468 476 static const HotSpotID kAriesSpotID = kPegasusRecallSpotID + 1; 469 477 static const HotSpotID kMercurySpotID = kAriesSpotID + 1; … … static const HotSpotFlags kInfoReturnSpotFlag = kDropBiochipSpotFlag << 1; 501 509 // Biochip and inventory hot spot flags... 502 510 503 511 static const HotSpotFlags kAIBiochipSpotFlag = kInfoReturnSpotFlag << 1; 504 static const HotSpotFlags kPegasusBiochipSpotFlag = kAIBiochipSpotFlag << 1; 512 static const HotSpotFlags kArthurBiochipSpotFlag = kAIBiochipSpotFlag << 1; 513 static const HotSpotFlags kPegasusBiochipSpotFlag = kArthurBiochipSpotFlag << 1; 505 514 static const HotSpotFlags kOpticalBiochipSpotFlag = kPegasusBiochipSpotFlag << 1; 506 515 static const HotSpotFlags kAirMaskSpotFlag = kOpticalBiochipSpotFlag << 1; 507 516 … … static const HotSpotFlags kJMPClickingSpotFlags = kClickSpotFlag | 510 519 kOpenDoorSpotFlag | 511 520 kInfoReturnSpotFlag | 512 521 kAIBiochipSpotFlag | 522 kArthurBiochipSpotFlag | 513 523 kPegasusBiochipSpotFlag | 514 524 kOpticalBiochipSpotFlag | 515 525 kAirMaskSpotFlag; … … enum { 655 665 // Mars 656 666 kDeathWrongShuttleLock, 657 667 kDeathArrestedInMars, 668 kDeathCollidedWithPod, 658 669 kDeathRunOverByPod, 659 670 kDeathDidntGetOutOfWay, 660 671 kDeathReactorBurn, -
engines/pegasus/cursor.cpp
diff --git a/engines/pegasus/cursor.cpp b/engines/pegasus/cursor.cpp index ad0d2c2..f0976e2 100644
a b void Cursor::loadCursorImage(CursorInfo &cursorInfo) { 160 160 161 161 cursorInfo.surface = new Graphics::Surface(); 162 162 163 // The CD version uses (only) lower color cicn images for its cursors 163 164 Common::SeekableReadStream *cicnStream = vm->_resFork->getResource(MKTAG('c', 'i', 'c', 'n'), cursorInfo.tag); 164 165 165 166 if (!cicnStream) -
engines/pegasus/detection.cpp
diff --git a/engines/pegasus/detection.cpp b/engines/pegasus/detection.cpp old mode 100644 new mode 100755 index 721c382..ac234c2
a b enum { 41 41 42 42 bool PegasusEngine::hasFeature(EngineFeature f) const { 43 43 return 44 (f == kSupportsRTL)45 || (f == kSupportsLoadingDuringRuntime)44 /* (f == kSupportsRTL) 45 || */ (f == kSupportsLoadingDuringRuntime) 46 46 || (f == kSupportsSavingDuringRuntime); 47 47 } 48 48 … … bool PegasusEngine::isWindows() const { 66 66 return _gameDescription->desc.platform == Common::kPlatformWindows; 67 67 } 68 68 69 bool PegasusEngine::isLinux() const { 70 return _gameDescription->desc.platform == Common::kPlatformLinux; 71 } 72 69 73 } // End of namespace Pegasus 70 74 71 75 static const PlainGameDescriptor pegasusGames[] = { … … static const PegasusGameDescription gameDescriptions[] = { 92 96 { 93 97 { 94 98 "pegasus", 99 "DVD", 100 AD_ENTRY1s("JMP PP Resources", "d13a602d2498010d720a6534f097f88b", 2075337), 101 Common::EN_ANY, 102 Common::kPlatformMacintosh, 103 ADGF_MACRESFORK|GF_DVD, 104 GUIO0() 105 }, 106 }, 107 108 { 109 { "pegasus", 110 "DVD", 111 AD_ENTRY1s("JMP PP Resources", "d13a602d2498010d720a6534f097f88b", 2075337), 112 Common::EN_ANY, 113 Common::kPlatformWindows, 114 ADGF_MACRESFORK|GF_DVD, 115 GUIO0() 116 }, 117 }, 118 119 { 120 { 121 "pegasus", 122 "DVD", 123 AD_ENTRY1s("JMP PP Resources", "d13a602d2498010d720a6534f097f88b", 2075337), 124 Common::EN_ANY, 125 Common::kPlatformWindows, 126 ADGF_MACRESFORK|GF_DVD, 127 GUIO0() 128 }, 129 }, 130 131 { 132 { 133 "pegasus", 134 "DVD", 135 AD_ENTRY1s("JMP PP Resources", "d13a602d2498010d720a6534f097f88b", 2075337), 136 Common::EN_ANY, 137 Common::kPlatformLinux, 138 ADGF_MACRESFORK|GF_DVD, 139 GUIO0() 140 }, 141 }, 142 143 { 144 { 145 "pegasus", 95 146 "Demo", 96 147 AD_ENTRY1s("JMP PP Resources", "d13a602d2498010d720a6534f097f88b", 360129), 97 148 Common::EN_ANY, … … static const PegasusGameDescription gameDescriptions[] = { 113 164 }, 114 165 }, 115 166 116 167 { 117 168 { 118 169 "pegasus", 119 170 "DVD Demo", -
engines/pegasus/graphics.cpp
diff --git a/engines/pegasus/graphics.cpp b/engines/pegasus/graphics.cpp index 5475108..fc22bb5 100644
a b 23 23 * 24 24 */ 25 25 26 #include "common/config-manager.h" 26 27 #include "common/events.h" 27 28 #include "common/file.h" 28 29 #include "common/textconsole.h" -
engines/pegasus/input.cpp
diff --git a/engines/pegasus/input.cpp b/engines/pegasus/input.cpp index b74e4a4..6ad9905 100644
a b InputDeviceManager::InputDeviceManager() { 64 64 _keyMap[Common::KEYCODE_RALT] = false; 65 65 _keyMap[Common::KEYCODE_e] = false; 66 66 _keyMap[Common::KEYCODE_KP_ENTER] = false; 67 _keyMap[Common::KEYCODE_a] = false; 67 68 68 69 g_system->getEventManager()->getEventDispatcher()->registerObserver(this, 2, false); 69 70 _lastRawBits = kAllUpBits; 70 71 _consoleRequested = false; 72 _AKeyWasDown = false; 71 73 } 72 74 73 75 InputDeviceManager::~InputDeviceManager() { … … InputDeviceManager::~InputDeviceManager() { 75 77 } 76 78 77 79 void InputDeviceManager::getInput(Input &input, const InputBits filter) { 78 // Poll for events, but ignore them!79 // We'll pick the mup in notifyEvent()80 // Poll for events, but ignore most of them! 81 // We'll pick the rest up in notifyEvent() 80 82 // We do that so that any pollEvent() call can update the variables 81 83 // (ie. if one uses enter to access the restore menu, we never receive 82 84 // the key up event, which leads to bad things) 83 85 // This is to closely emulate what the GetKeys() function did on Mac OS 84 Common::Event event;85 while (g_system->getEventManager()->pollEvent(event))86 ;87 86 88 // Now create the bitfield89 87 InputBits currentBits = 0; 90 88 89 Common::Event event; 90 while (g_system->getEventManager()->pollEvent(event)) { 91 switch (event.type) { 92 case Common::EVENT_WHEELUP: 93 currentBits |= (kRawButtonDown << kUpButtonShift); 94 break; 95 case Common::EVENT_WHEELDOWN: 96 currentBits |= (kRawButtonDown << kDownButtonShift); 97 break; 98 default: 99 break; 100 } 101 } 102 103 // Now fill in the rest of the bitfield 104 91 105 if (_keyMap[Common::KEYCODE_UP] || _keyMap[Common::KEYCODE_KP8]) 92 106 currentBits |= (kRawButtonDown << kUpButtonShift); 93 107 … … void InputDeviceManager::getInput(Input &input, const InputBits filter) { 121 135 if (_keyMap[Common::KEYCODE_BACKSPACE] || _keyMap[Common::KEYCODE_KP_MULTIPLY]) 122 136 currentBits |= (kRawButtonDown << kRightFireButtonShift); 123 137 138 if (((PegasusEngine *)g_engine)->isDVD()) { 139 if (_keyMap[Common::KEYCODE_a] && (_keyMap[Common::KEYCODE_LALT] || _keyMap[Common::KEYCODE_RALT]) && !_AKeyWasDown) { 140 ((PegasusEngine *)g_engine)->requestToggle(); 141 _AKeyWasDown = true; 142 } else if (!_keyMap[Common::KEYCODE_a]) 143 _AKeyWasDown = false; 144 } 145 124 146 // Update mouse button state 125 147 // Note that we don't use EVENT_LBUTTONUP/EVENT_LBUTTONDOWN because 126 148 // they do not show if the button is being held down. We're treating -
engines/pegasus/input.h
diff --git a/engines/pegasus/input.h b/engines/pegasus/input.h index 3e938fa..e2c814a 100644
a b protected: 57 57 Common::HashMap<uint, bool> _keyMap; 58 58 InputBits _lastRawBits; 59 59 bool _consoleRequested; 60 bool _AKeyWasDown; 60 61 }; 61 62 62 63 enum { … … enum { 278 279 }; 279 280 280 281 static const InputBits kHintInterruption = kFilterAllInputNoAuto; 281 static const InputBits kWarningInterruption = kFilter NoInput;282 static const InputBits kWarningInterruption = kFilterAllInputNoAuto; 282 283 static const InputBits kOpticalInterruption = kFilterAllInputNoAuto; 283 284 284 285 /* … … public: 481 482 482 483 static bool isRaiseInventoryInput(const Input &input) { return input.leftFireButtonDown(); } 483 484 static bool isRaiseBiochipsInput(const Input &input) { return input.rightFireButtonDown(); } 484 static InputBits getItemPanelsInputFilter() { return kFilter LeftFireButton | kFilterRightFireButton; }485 static InputBits getItemPanelsInputFilter() { return kFilterFourButton | kFilterLeftFireButton | kFilterRightFireButton; } 485 486 486 487 static bool isToggleAIMiddleInput(const Input &input) { return input.threeButtonDown(); } 487 488 -
engines/pegasus/interface.cpp
diff --git a/engines/pegasus/interface.cpp b/engines/pegasus/interface.cpp index f2429bf..5543672 100644
a b void Interface::raiseInventoryDrawer(const bool doCallBacks) { 398 398 399 399 if (((PegasusEngine *)g_engine)->isDVD()) { 400 400 _inventoryCloseSound.stopSound(); 401 _inventoryOpenSound.setVolume(((PegasusEngine *)g_engine)->getSoundFXLevel()); 401 402 _inventoryOpenSound.playSound(); 402 403 } 403 404 } … … void Interface::playEndMessage() { 412 413 413 414 void Interface::raiseInventoryDrawerForMessage() { 414 415 _inventoryPanel.disableLooping(); 416 417 // The DVD version has a different image for the inventory 418 // for the end message. 419 if (((PegasusEngine *)g_engine)->isDVD()) { 420 _inventoryPanel.setCommPicture(); 421 _inventoryPanel.throwAwayInventoryImage(); 422 _inventoryPanel.initInventoryImage(&_inventoryPush); 423 } 424 415 425 raiseInventoryDrawerSync(); 416 426 } 417 427 … … void Interface::lowerInventoryDrawer(const bool doCallBacks) { 464 474 465 475 if (((PegasusEngine *)g_engine)->isDVD()) { 466 476 _inventoryOpenSound.stopSound(); 477 _inventoryCloseSound.setVolume(((PegasusEngine *)g_engine)->getSoundFXLevel()); 467 478 _inventoryCloseSound.playSound(); 468 479 } 469 480 } … … void Interface::raiseBiochipDrawer(const bool doCallBacks) { 510 521 511 522 if (((PegasusEngine *)g_engine)->isDVD()) { 512 523 _biochipCloseSound.stopSound(); 524 _biochipOpenSound.setVolume(((PegasusEngine *)g_engine)->getSoundFXLevel()); 513 525 _biochipOpenSound.playSound(); 514 526 } 515 527 } -
new file engines/pegasus/items/biochips/arthurchip.cpp
diff --git a/engines/pegasus/items/biochips/arthurchip.cpp b/engines/pegasus/items/biochips/arthurchip.cpp new file mode 100644 index 0000000..931f1de
- + 1 /* ScummVM - Graphic Adventure Engine 2 * 3 * ScummVM is the legal property of its developers, whose names 4 * are too numerous to list here. Please refer to the COPYRIGHT 5 * file distributed with this source distribution. 6 * 7 * Additional copyright for this file: 8 * Copyright (C) 1995-1997 Presto Studios, Inc. 9 * 10 * This program is free software; you can redistribute it and/or 11 * modify it under the terms of the GNU General Public License 12 * as published by the Free Software Foundation; either version 2 13 * of the License, or (at your option) any later version. 14 15 * This program is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU General Public License for more details. 19 20 * You should have received a copy of the GNU General Public License 21 * along with this program; if not, write to the Free Software 22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 23 * 24 */ 25 26 #include "pegasus/pegasus.h" 27 #include "pegasus/ai/ai_area.h" 28 #include "pegasus/items/biochips/arthurchip.h" 29 30 namespace Common { 31 DECLARE_SINGLETON(Pegasus::ArthurManager); 32 } 33 34 namespace Pegasus { 35 36 static const char *kArthurWisdomMovies[] = { 37 "Images/AI/Globals/XGLOBA01", 38 "Images/AI/Globals/XGLOBA03", 39 "Images/AI/Globals/XGLOBA06", 40 "Images/AI/Globals/XGLOBA07", 41 "Images/AI/Globals/XGLOBA09", 42 "Images/AI/Globals/XGLOBA17", 43 "Images/AI/Globals/XGLOBA18", 44 "Images/AI/Globals/XGLOBA25", 45 "Images/AI/Globals/XGLOBA26", 46 "Images/AI/Globals/XGLOBA27", 47 "Images/AI/Globals/XGLOBA28", 48 "Images/AI/Globals/XGLOBA30", 49 "Images/AI/Globals/XGLOBA34", 50 "Images/AI/Globals/XGLOBA35", 51 "Images/AI/Globals/XGLOBA43", 52 "Images/AI/Globals/XGLOBA50", 53 "Images/AI/Globals/XGLOBA56", 54 "Images/AI/Globals/XGLOBA59", 55 "Images/AI/Globals/XGLOBA63", 56 "Images/AI/Globals/XGLOBB10", 57 "Images/AI/Globals/XGLOBB11", 58 "Images/AI/Globals/XGLOBB12", 59 "Images/AI/Globals/XGLOBB13", 60 "Images/AI/Globals/XGLOBB14", 61 "Images/AI/Globals/XGLOBB15", 62 "Images/AI/Globals/XGLOBB16", 63 "Images/AI/Globals/XGLOBB17", 64 "Images/AI/Globals/XGLOBB18", 65 "Images/AI/Globals/XGLOBB19", 66 "Images/AI/Globals/XGLOBB20", 67 "Images/AI/Globals/XGLOBB21", 68 "Images/AI/Globals/XGLOBB22", 69 "Images/AI/Globals/XGLOBB23", 70 "Images/AI/Globals/XGLOBB24", 71 "Images/AI/Globals/XGLOBB25", 72 "Images/AI/Globals/XGLOBB26", 73 "Images/AI/Globals/XGLOBB27", 74 "Images/AI/Globals/XGLOBB28", 75 "Images/AI/Globals/XGLOBB29", 76 "Images/AI/Globals/XGLOBB30", 77 "Images/AI/Globals/XGLOBB31", 78 "Images/AI/Globals/XGLOBB32", 79 "Images/AI/Globals/XGLOBB33", 80 "Images/AI/Globals/XGLOBB34", 81 "Images/AI/Globals/XGLOBB35", 82 "Images/AI/Globals/XGLOBB36", 83 "Images/AI/Globals/XGLOBB37", 84 "Images/AI/Globals/XGLOBB38", 85 "Images/AI/Globals/XGLOBB39", 86 "Images/AI/Globals/XGLOBB43", 87 "Images/AI/Globals/XGLOBB44", 88 "Images/AI/Globals/XGLOBA62" 89 }; 90 91 ArthurChip *g_arthurChip = 0; 92 93 ArthurChip::ArthurChip(const ItemID id, const NeighborhoodID neighborhood, const RoomID room, const DirectionConstant direction) : 94 BiochipItem(id, neighborhood, room, direction), _arthurWisdomHotspot(kArthurWisdomSpotID), 95 _chattyArthurHotspot(kChattyArthurSpotID), _chattyAIHotspot(kChattyAISpotID), 96 _arthurHeadHotspot(kArthurHeadSpotID) { 97 _chattyArthur = true; 98 _lastArthurMovie = ""; 99 100 _arthurWisdomHotspot.setArea(Common::Rect(kAIMiddleAreaLeft + 20, kAIMiddleAreaTop + 27, kAIMiddleAreaLeft + 20 + 161, kAIMiddleAreaTop + 27 + 30)); 101 _arthurWisdomHotspot.setHotspotFlags(kArthurBiochipSpotFlag); 102 g_allHotspots.push_back(&_arthurWisdomHotspot); 103 104 _chattyArthurHotspot.setArea(Common::Rect(kAIMiddleAreaLeft + 100, kAIMiddleAreaTop + 67, kAIMiddleAreaLeft + 100 + 20, kAIMiddleAreaTop + 67 + 20)); 105 _chattyArthurHotspot.setHotspotFlags(kArthurBiochipSpotFlag); 106 g_allHotspots.push_back(&_chattyArthurHotspot); 107 108 _chattyAIHotspot.setArea(Common::Rect(kAIMiddleAreaLeft + 130, kAIMiddleAreaTop + 67, kAIMiddleAreaLeft + 130 + 20, kAIMiddleAreaTop + 67 + 20)); 109 _chattyAIHotspot.setHotspotFlags(kArthurBiochipSpotFlag); 110 g_allHotspots.push_back(&_chattyAIHotspot); 111 112 _arthurHeadHotspot.setArea(Common::Rect(kAIRightAreaLeft, kAIRightAreaTop, kAIRightAreaLeft + kAIRightAreaWidth, kAIRightAreaTop + kAIRightAreaHeight)); 113 _arthurHeadHotspot.setHotspotFlags(kArthurBiochipSpotFlag); 114 g_allHotspots.push_back(&_arthurHeadHotspot); 115 116 setItemState(kArthur000); 117 118 g_arthurChip = this; 119 } 120 121 ArthurChip::~ArthurChip() { 122 g_arthurChip = NULL; 123 124 g_allHotspots.removeOneHotspot(kArthurWisdomSpotID); 125 g_allHotspots.removeOneHotspot(kChattyArthurSpotID); 126 g_allHotspots.removeOneHotspot(kChattyAISpotID); 127 g_allHotspots.removeOneHotspot(kArthurHeadSpotID); 128 } 129 130 void ArthurChip::setChattyArthur(bool flag) { 131 _chattyArthur = flag; 132 133 setUpArthurChip(); 134 135 if (flag) { 136 if (((PegasusEngine *)g_engine)->getRandomBit()) 137 playArthurMovie("Images/AI/Globals/XGLOBAA1"); 138 else 139 playArthurMovie("Images/AI/Globals/XGLOBAA2"); 140 } else { 141 playArthurMovie("Images/AI/Globals/XGLOBAA0"); 142 } 143 } 144 145 void ArthurChip::select() { 146 BiochipItem::select(); 147 setUpArthurChip(); 148 } 149 150 void ArthurChip::setUpArthurChip() { 151 ItemState state = getItemState(); 152 153 if (_chattyArthur) { 154 if (g_AIArea && g_AIArea->isChattyAI()) { 155 if (state != kArthur002) 156 setItemState(kArthur000); 157 } else if (state != kArthur102) { 158 setItemState(kArthur100); 159 } 160 } else { 161 if (g_AIArea && g_AIArea->isChattyAI()) { 162 if (state != kArthur012) 163 setItemState(kArthur010); 164 } else if (state != kArthur112) { 165 setItemState(kArthur110); 166 } 167 } 168 } 169 170 void ArthurChip::activateArthurHotspots() { 171 _arthurWisdomHotspot.setActive(); 172 _chattyArthurHotspot.setActive(); 173 _chattyAIHotspot.setActive(); 174 _arthurHeadHotspot.setActive(); 175 } 176 177 void ArthurChip::clickInArthurHotspot(HotSpotID id) { 178 ItemState state, newState; 179 180 if (id == kArthurHeadSpotID) { 181 if (_lastArthurMovie != "") 182 playArthurMovie(_lastArthurMovie); 183 return; 184 } 185 186 newState = state = getItemState(); 187 switch (state) { 188 case kArthur000: 189 switch (id) { 190 case kArthurWisdomSpotID: 191 newState = kArthur002; 192 break; 193 case kChattyArthurSpotID: 194 newState = kArthur010; 195 break; 196 case kChattyAISpotID: 197 newState = kArthur100; 198 break; 199 } 200 break; 201 case kArthur010: 202 switch (id) { 203 case kArthurWisdomSpotID: 204 newState = kArthur012; 205 break; 206 case kChattyArthurSpotID: 207 newState = kArthur000; 208 break; 209 case kChattyAISpotID: 210 newState = kArthur110; 211 break; 212 } 213 break; 214 case kArthur100: 215 switch (id) { 216 case kArthurWisdomSpotID: 217 newState = kArthur102; 218 break; 219 case kChattyArthurSpotID: 220 newState = kArthur110; 221 break; 222 case kChattyAISpotID: 223 newState = kArthur010; 224 break; 225 } 226 break; 227 case kArthur110: 228 switch (id) { 229 case kArthurWisdomSpotID: 230 newState = kArthur112; 231 break; 232 case kChattyArthurSpotID: 233 newState = kArthur100; 234 break; 235 case kChattyAISpotID: 236 newState = kArthur010; 237 break; 238 } 239 break; 240 } 241 setItemState(newState); 242 switch (id) { 243 case kArthurWisdomSpotID: 244 playArthurMovie(kArthurWisdomMovies[((PegasusEngine *)g_engine)->getRandomNumber(( 245 sizeof(kArthurWisdomMovies) / sizeof(const char *)) - 1)]); 246 break; 247 case kChattyArthurSpotID: 248 setChattyArthur(!_chattyArthur); 249 break; 250 case kChattyAISpotID: 251 if (g_AIArea) 252 g_AIArea->setChattyAI(!g_AIArea->isChattyAI()); 253 break; 254 } 255 256 setItemState(state); 257 } 258 259 void ArthurChip::playArthurMovie(const Common::String &movieName) { 260 if (g_AIArea) { 261 g_AIArea->playAIMovie(kRightAreaSignature, movieName, false, kHintInterruption); 262 if (movieName != "Images/AI/Globals/XGLOB00" && 263 movieName != "Images/AI/Globals/XGLOB01" && 264 movieName != "Images/AI/Globals/XGLOBAA0" && 265 movieName != "Images/AI/Globals/XGLOBAA1" && 266 movieName != "Images/AI/Globals/XGLOBAA2") 267 _lastArthurMovie = movieName; 268 } 269 } 270 271 bool ArthurChip::playArthurMovieForEvent(const Common::String &movieName, ArthurEvent event) { 272 if (((PegasusEngine *)g_engine)->isDVD() && ((PegasusEngine *)g_engine)->playerHasItemID(kArthurBiochip) && 273 isChattyArthur() && !Arthur._arthurFlags.getFlag(event)) { 274 Arthur._arthurFlags.setFlag(event, true); 275 playArthurMovie(movieName); 276 return true; 277 } else { 278 return false; 279 } 280 } 281 282 void ArthurManager::resetArthurState() { 283 bool savedGameFlag = _arthurFlags.getFlag(kArthurLoadedSavedGame); 284 _arthurFlags.clearAllFlags(); 285 _arthurFlags.setFlag(kArthurLoadedSavedGame, savedGameFlag); 286 } 287 288 } // End of namespace Pegasus -
new file engines/pegasus/items/biochips/arthurchip.h
diff --git a/engines/pegasus/items/biochips/arthurchip.h b/engines/pegasus/items/biochips/arthurchip.h new file mode 100644 index 0000000..4c4a580
- + 1 /* ScummVM - Graphic Adventure Engine 2 * 3 * ScummVM is the legal property of its developers, whose names 4 * are too numerous to list here. Please refer to the COPYRIGHT 5 * file distributed with this source distribution. 6 * 7 * Additional copyright for this file: 8 * Copyright (C) 1995-1997 Presto Studios, Inc. 9 * 10 * This program is free software; you can redistribute it and/or 11 * modify it under the terms of the GNU General Public License 12 * as published by the Free Software Foundation; either version 2 13 * of the License, or (at your option) any later version. 14 15 * This program is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU General Public License for more details. 19 20 * You should have received a copy of the GNU General Public License 21 * along with this program; if not, write to the Free Software 22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 23 * 24 */ 25 26 #ifndef PEGASUS_ITEMS_BIOCHIPS_ARTHURCHIP_H 27 #define PEGASUS_ITEMS_BIOCHIPS_ARTHURCHIP_H 28 29 #include "pegasus/hotspot.h" 30 #include "pegasus/util.h" 31 #include "pegasus/items/biochips/biochipitem.h" 32 33 namespace Pegasus { 34 35 enum ArthurEvent { 36 kArthurLoadedSavedGame, 37 kArthurAttemptedLockedDoor, 38 kArthurAttemptedLockedDoorAgain, 39 kArthurDestroyedInventoryItem, 40 kArthurDisabledAI, 41 42 kArthurCaldoriaFinishedJoyride, 43 kArthurCaldoriaSelectedStickyBuns, 44 kArthurCaldoriaCreatedCornbread, 45 kArthurCaldoriaDrankOJ, 46 kArthurCaldoriaZoomedToLaundry, 47 kArthurCaldoriaReachedToilet, 48 kArthurCaldoriaReadPaper, 49 kArthurCaldoriaChoseAgencyHairStyle, 50 kArthurCaldoriaSawVacantApartment, 51 kArthurCaldoriaLookThroughTelescope, 52 kArthurCaldoriaRoofDoor, 53 kArthurCaldoriaUsedCardBomb, 54 kArthurCaldoriaBlownDoor, 55 kArthurCaldoriaSawVoiceAnalysis, 56 kArthurCaldoriaStunningSinclair, 57 kArthurCaldoriaSeeRoofBomb, 58 kArthurCaldoriaDisarmedNuke, 59 60 kArthurTSAEnteredCave, 61 kArthurTSASawAgent3, 62 kArthurTSASawBust, 63 kArthurTSAReachedJunction, 64 kArthurTSAClickedRobot1, 65 kArthurTSAClickedRobot2, 66 kArthurTSAOpenTBPMonitor, 67 kArthurTSASawJourneymanKey, 68 kArthurTSASawBiochips, 69 kArthurTSAUsedPegasus, 70 kArthurTSAConfinedByBaldwin, 71 kArthurTSARedirectedRobots, 72 kArthurTSAUsedTurbolift, 73 kArthurTSASawFirstOpMemMovie, 74 kArthurTSAInPegasusNoVideo, 75 kArthurTSASawBaldwinSayGo, 76 kArthurTSALeaving, 77 78 kArthurGoToPrehistoric, 79 80 kArthurPrehistoricReachedJunction, 81 kArthurPrehistoricSawBreaker, 82 kArthurPrehistoricBreakerThrown, 83 kArthurPrehistoricAtCliffEdge, 84 kArthurPrehistoricSawEggs, 85 kArthurPrehistoricZoomedToVault, 86 kArthurPrehistoricAttemptedBridge, 87 kArthurPrehistoricExtendedBridge, 88 kArthurPrehistoricCrossedBridge, 89 kArthurPrehistoricUnlockedVault, 90 91 kArthurMarsReadyForKiosk, 92 kArthurMarsLookedAtGuards, 93 kArthurMarsZoomedToKeyCard, 94 kArthurMarsTurnedOnTransport, 95 kArthurMarsCantFillMask, 96 kArthurMarsSawWelcomeVideos, 97 kArthurMarsRobotThrownPlayerWithMask, 98 kArthurMarsLeftPodNoCrowBar, 99 kArthurMarsLookAtEmptyTracks, 100 kArthurMarsEnteredReactor, 101 kArthurMarsSawLockedPanel, 102 kArthurMarsSawLockedPanelNoNitrogen, 103 kArthurMarsUsedLiquidNitrogen, 104 kArthurMarsFoundCardBomb, 105 kArthurMarsSolvedReactorGame, 106 kArthurMarsDeactivatedCardBomb, 107 kArthurMarsExitedReactorWithCardBomb, 108 kArthurMarsInAirlockNoOxygen, 109 kArthurMarsMazeReachedJunction, 110 kArthurMarsOxygen50Warning, 111 kArthurMarsOxygen25Warning, 112 kArthurMarsOxygen5Warning, 113 kArthurMarsFoundBuckets, 114 kArthurMarsApproachedBuckets, 115 kArthurMarsEnteredGearRoom, 116 kArthurMarsLookAtGears, 117 kArthurMarsExitedGearRoom, 118 kArthurMarsFoundNoShuttlePresent, 119 kArthurMarsEnteredShuttle, 120 kArthurMarsFoundDeadRobot, 121 kArthurMarsRobotHeadOpen, 122 123 kArthurWSCRemovedDart, 124 kArthurWSCPoisonedDuringGame, 125 kArthurWSCFailedMolecule, 126 kArthurWSCDesignedAntidote, 127 kArthurWSCSawAresHologram, 128 kArthurWSCLookAtMorphExperiment, 129 kArthurWSCStartMorphExperiment, 130 kArthurWSCSawMorphExperiment, 131 kArthurWSCLeftLabNoKeyOrCanisters, 132 kArthurWSCAtOppositeDoor, 133 kArthurWSCReadyForMap, 134 kArthurWSCAttemptedLockedDoor, 135 kArthurWSCSawSinclairDoor, 136 kArthurWSCSawSinclairDoorNoKey, 137 kArthurWSCAttemptedSinclairDoorNoKey, 138 kArthurWSCZoomedToSnake, 139 kArthurWSCActivatedComputer, 140 kArthurWSCZoomedToSinclairMessages, 141 kArthurWSCPlayedEasterEggMessage, 142 kArthurWSCGotMachineGun, 143 kArthurWSCSeenNerd, 144 kArthurWSCSawBrokenDoor, 145 kArthurWSCSawBrokenDoorNoCrowBar, 146 kArthurWSCUsedCrowBar, 147 kArthurWSCDidPlasmaDodge, 148 kArthurWSCEnteredAuditorium, 149 kArthurWSCSawSinclairLecture, 150 kArthurWSCEnteredPassage, 151 kArthurWSCInPassage, 152 kArthurWSCExitedPassage, 153 kArthurWSCSawCatwalkDoor, 154 kArthurWSCRobotHeadOpen, 155 156 kArthurNoradAtSecurityMonitor, 157 kArthurNoradSawFillingStation, 158 kArthurNoradSawIntakeWarning, 159 kArthurNoradDidntFillCanisters, 160 kArthurNoradSawUnconsciousOperator, 161 kArthurNoradAttemptedLockedDoor, 162 kArthurNoradAttemptedLockedDoorAgain, 163 kArthurNoradReachedPressureDoor, 164 kArthurNoradSawSubMessage, 165 kArthurNoradSawClawMonitor, 166 kArthurNoradPlayedWithClaw, 167 kArthurNoradEnteredSub, 168 kArthurNoradExitedSub, 169 kArthurNoradApproachedDamagedDoor, 170 kArthurNoradAtRetScanNoBiochip, 171 kArthurNoradStartGlobeGame, 172 kArthurNoradSelectedIncorrectSilo, 173 kArthurNoradFinishedGlobeGame, 174 kArthurNoradThreatenedByRobot, 175 kArthurNoradBeatRobotWithClaw, 176 kArthurNoradRobotHeadOpen, 177 178 kNumArthurFlags 179 }; 180 181 class ArthurChip : public BiochipItem { 182 public: 183 ArthurChip(const ItemID, const NeighborhoodID, const RoomID, const DirectionConstant); 184 virtual ~ArthurChip(); 185 186 bool isChattyArthur() { return _chattyArthur; } 187 void setChattyArthur(bool); 188 189 void select(); 190 191 void setUpArthurChip(); 192 void activateArthurHotspots(); 193 void clickInArthurHotspot(HotSpotID); 194 void playArthurMovie(const Common::String &); 195 bool playArthurMovieForEvent(const Common::String &, ArthurEvent event); 196 197 protected: 198 Hotspot _arthurWisdomHotspot; 199 Hotspot _chattyArthurHotspot; 200 Hotspot _chattyAIHotspot; 201 Hotspot _arthurHeadHotspot; 202 bool _chattyArthur; 203 Common::String _lastArthurMovie; 204 }; 205 206 class ArthurManager : public Common::Singleton<ArthurManager> { 207 public: 208 ArthurManager() { resetArthurState(); } 209 210 void resetArthurState(); 211 212 protected: 213 friend class Common::Singleton<SingletonBaseType>; 214 friend class ArthurChip; 215 216 private: 217 FlagsArray<byte, kNumArthurFlags> _arthurFlags; 218 }; 219 220 extern ArthurChip *g_arthurChip; 221 222 } // End of namespace Pegasus 223 224 #define Arthur (::Pegasus::ArthurManager::instance()) 225 226 #endif -
engines/pegasus/items/biochips/opticalchip.cpp
diff --git a/engines/pegasus/items/biochips/opticalchip.cpp b/engines/pegasus/items/biochips/opticalchip.cpp index 7b8858e..05121ac 100644
a b void OpticalChip::playOpMemMovie(HotSpotID id) { 127 127 Common::String movieName; 128 128 switch (id) { 129 129 case kAriesSpotID: 130 movieName = "Images/AI/Globals/OMAI"; 130 // WORKAROUND: The original CD release played the ares video even 131 // when you destroyed the shuttle. For the DVD release, we have 132 // some new videos that can be played instead to workaround a plot 133 // loophole. 134 if (!((PegasusEngine *)g_engine)->isDVD() || _opticalFlags.getFlag(kOpticalAriesExposed)) 135 movieName = "Images/AI/Globals/OMAI"; 136 else if (_itemOwnerID == kPlayerID) 137 movieName = "Images/AI/Globals/OMN1"; 138 else 139 movieName = "Images/AI/Globals/OMN0"; 131 140 break; 132 141 case kMercurySpotID: 133 142 movieName = "Images/AI/Globals/OMMI"; -
engines/pegasus/items/inventory/airmask.cpp
diff --git a/engines/pegasus/items/inventory/airmask.cpp b/engines/pegasus/items/inventory/airmask.cpp index c65dd36..26912bb 100644
a b void AirMask::useIdleTime() { 164 164 165 165 void AirMask::refillAirMask() { 166 166 switch (getItemState()) { 167 168 169 170 171 172 173 174 175 176 177 167 case kAirMaskEmptyOff: 168 case kAirMaskLowOff: 169 setItemState(kAirMaskFullOff); 170 break; 171 case kAirMaskEmptyFilter: 172 case kAirMaskLowFilter: 173 setItemState(kAirMaskFullFilter); 174 break; 175 case kAirMaskLowOn: 176 setItemState(kAirMaskFullOn); 177 break; 178 178 } 179 179 180 180 if (_oxygenTimer.isFuseLit()) { -
engines/pegasus/items/inventorypicture.cpp
diff --git a/engines/pegasus/items/inventorypicture.cpp b/engines/pegasus/items/inventorypicture.cpp index fc812fa..99b9ad8 100644
a b void InventoryItemsPicture::deactivateInventoryPicture() { 318 318 } 319 319 } 320 320 321 void InventoryItemsPicture::setCommPicture() { 322 _pictName = "Images/Items/Inventory/Comm Panel"; 323 } 324 321 325 void InventoryItemsPicture::playEndMessage(DisplayElement *pushElement) { 322 326 PegasusEngine *vm = (PegasusEngine *)g_engine; 323 327 … … void InventoryItemsPicture::playEndMessage(DisplayElement *pushElement) { 326 330 _shouldDrawHighlight = false; 327 331 endMessage.shareSurface(this); 328 332 endMessage.initFromMovieFile("Images/Caldoria/A56 Congrats"); 333 endMessage.setVolume(((PegasusEngine *)g_engine)->getSoundFXLevel()); 329 334 endMessage.moveMovieBoxTo(kFinalMessageLeft - kInventoryPushLeft, kFinalMessageTop - kInventoryPushTop); 330 335 endMessage.setTriggeredElement(pushElement); 331 336 endMessage.start(); -
engines/pegasus/items/inventorypicture.h
diff --git a/engines/pegasus/items/inventorypicture.h b/engines/pegasus/items/inventorypicture.h index 9eba25b..1c89f50 100644
a b public: 98 98 99 99 void disableLooping() { _isLooping = false; } 100 100 101 void setCommPicture(); 101 102 void playEndMessage(DisplayElement *); 102 103 103 104 protected: -
engines/pegasus/items/item.h
diff --git a/engines/pegasus/items/item.h b/engines/pegasus/items/item.h index a1451b2..1b0e7c0 100644
a b static const ItemID kArgonPickup = 24; 118 118 // Biochips. 119 119 120 120 static const ItemID kAIBiochip = 0; 121 static const ItemID kArthurBiochip = 1; 121 122 static const ItemID kInterfaceBiochip = 1; 122 123 static const ItemID kMapBiochip = 2; 123 124 static const ItemID kOpticalBiochip = 3; … … static const ItemState kFlashlightOn = 115; 248 249 static const ItemState kNitrogenEmpty = 116; 249 250 static const ItemState kNitrogenFull = 117; 250 251 static const ItemState kFullGlass = 118; 252 static const ItemState kArthur000 = 119; 253 static const ItemState kArthur002 = 120; 254 static const ItemState kArthur010 = 121; 255 static const ItemState kArthur012 = 122; 256 static const ItemState kArthur100 = 123; 257 static const ItemState kArthur102 = 124; 258 static const ItemState kArthur110 = 125; 259 static const ItemState kArthur112 = 126; 251 260 252 261 // Extra IDs. 253 262 -
engines/pegasus/menu.cpp
diff --git a/engines/pegasus/menu.cpp b/engines/pegasus/menu.cpp index e55c006..0897f2a 100644
a b 23 23 * 24 24 */ 25 25 26 #include "common/file.h" 27 26 28 #include "pegasus/gamestate.h" 27 29 #include "pegasus/menu.h" 28 30 #include "pegasus/pegasus.h" … … MainMenu::MainMenu() : GameMenu(kMainMenuID), _menuBackground(0), _overviewButto 155 157 else 156 158 _menuBackground.initFromPICTFile("Images/Demo/DemoMenu.pict"); 157 159 } else { 158 _menuBackground.initFromPICTFile("Images/Main Menu/MainMenu.mac"); 160 if (((PegasusEngine *)g_engine)->isDVD()) 161 _menuBackground.initFromPICTFile("Images/Main Menu/MainMenu_hq.mac"); 162 else 163 _menuBackground.initFromPICTFile("Images/Main Menu/MainMenu.mac"); 159 164 } 160 165 _menuBackground.setDisplayOrder(0); 161 166 _menuBackground.startDisplaying(); … … static const CoordType kCreditsMainMenuSelectTop = 408; 444 449 445 450 static const TimeValue kCoreTeamTime = 0; 446 451 static const TimeValue kSupportTeamTime = 1920; 447 static const TimeValue kOriginalTeamTime = 3000; 448 static const TimeValue kTalentTime = 4440; 449 static const TimeValue kOtherTitlesTime = 4680; 452 static const TimeValue kOriginalTeamCDTime = 3000; 453 static const TimeValue kOriginalTeamDVDTime = 3240; 454 static const TimeValue kTalentCDTime = 4440; 455 static const TimeValue kTalentDVDTime = 4680; 456 static const TimeValue kOtherTitlesCDTime = 4680; 457 static const TimeValue kOtherTitlesDVDTime = 4920; 450 458 451 459 static const TimeValue kFrameIncrement = 120; // Three frames... 452 460 … … static const TimeValue kFrameIncrement = 120; // Three frames... 454 462 CreditsMenu::CreditsMenu() : GameMenu(kCreditsMenuID), _menuBackground(0), _creditsMovie(0), 455 463 _mainMenuButton(0), _largeSelect(0), _smallSelect(0) { 456 464 457 _menuBackground.initFromPICTFile("Images/Credits/CredScrn.pict"); 465 if (((PegasusEngine *)g_engine)->isDVD()) 466 _menuBackground.initFromPICTFile("Images/Credits/CredScrnScummVM.pict"); 467 else 468 _menuBackground.initFromPICTFile("Images/Credits/CredScrn.pict"); 458 469 _menuBackground.setDisplayOrder(0); 459 470 _menuBackground.startDisplaying(); 460 471 _menuBackground.show(); 461 472 462 _creditsMovie.initFromMovieFile("Images/Credits/Credits.movie"); 473 if (((PegasusEngine *)g_engine)->isDVD()) 474 _creditsMovie.initFromMovieFile("Images/Credits/Credits_scummVM.movie"); 475 else 476 _creditsMovie.initFromMovieFile("Images/Credits/Credits.movie"); 463 477 _creditsMovie.setDisplayOrder(1); 464 478 _creditsMovie.moveElementTo(kCreditsMovieLeft, kCreditsMovieTop); 465 479 _creditsMovie.startDisplaying(); … … CreditsMenu::CreditsMenu() : GameMenu(kCreditsMenuID), _menuBackground(0), _cred 484 498 _menuSelection = -1; 485 499 486 500 newMenuSelection(kCreditsMenuCoreTeam); 501 502 if (((PegasusEngine *)g_engine)->isDVD()) { 503 _menuLoop.attachFader(&_menuFader); 504 _menuLoop.initFromAIFFFile("Sounds/Credits.aiff"); 505 } 506 } 507 508 CreditsMenu::~CreditsMenu() { 509 if (_menuLoop.isPlaying()) 510 stopCreditsMenuLoop(); 511 } 512 513 void CreditsMenu::startCreditsMenuLoop() { 514 if (((PegasusEngine *)g_engine)->isDVD()) { 515 FaderMoveSpec spec; 516 517 _menuLoop.loopSound(); 518 spec.makeTwoKnotFaderSpec(30, 0, 0, 30, 255); 519 520 _menuFader.startFader(spec); 521 } 522 } 523 524 void CreditsMenu::stopCreditsMenuLoop() { 525 if (((PegasusEngine *)g_engine)->isDVD()) { 526 FaderMoveSpec spec; 527 528 spec.makeTwoKnotFaderSpec(30, 0, 255, 30, 0); 529 _menuFader.startFaderSync(spec); 530 _menuLoop.stopSound(); 531 } 487 532 } 488 533 489 534 // Assumes the new selection is never more than one away from the old... … … void CreditsMenu::newMenuSelection(const int newSelection) { 493 538 case kCreditsMenuCoreTeam: 494 539 _smallSelect.moveElementTo(kCoreTeamSelectLeft, kCoreTeamSelectTop); 495 540 _creditsMovie.setTime(kCoreTeamTime); 496 _creditsMovie.redrawMovieWorld();497 541 break; 498 542 case kCreditsMenuSupportTeam: 499 543 _smallSelect.moveElementTo(kSupportTeamSelectLeft, kSupportTeamSelectTop); 500 544 _creditsMovie.setTime(kSupportTeamTime); 501 _creditsMovie.redrawMovieWorld();502 545 break; 503 546 case kCreditsMenuOriginalTeam: 504 547 _smallSelect.moveElementTo(kOriginalTeamSelectLeft, kOriginalTeamSelectTop); 505 _creditsMovie.setTime(kOriginalTeamTime); 506 _creditsMovie.redrawMovieWorld(); 548 if (((PegasusEngine *)g_engine)->isDVD()) 549 _creditsMovie.setTime(kOriginalTeamDVDTime); 550 else 551 _creditsMovie.setTime(kOriginalTeamCDTime); 507 552 break; 508 553 case kCreditsMenuTalent: 509 554 _smallSelect.moveElementTo(kTalentSelectLeft, kTalentSelectTop); 510 _creditsMovie.setTime(kTalentTime); 511 _creditsMovie.redrawMovieWorld(); 555 if (((PegasusEngine *)g_engine)->isDVD()) 556 _creditsMovie.setTime(kTalentDVDTime); 557 else 558 _creditsMovie.setTime(kTalentCDTime); 512 559 break; 513 560 case kCreditsMenuOtherTitles: 514 561 _smallSelect.moveElementTo(kOtherTitlesSelectLeft, kOtherTitlesSelectTop); 515 562 _smallSelect.show(); 516 563 _largeSelect.hide(); 517 _creditsMovie.setTime(kOtherTitlesTime); 518 _creditsMovie.redrawMovieWorld(); 564 if (((PegasusEngine *)g_engine)->isDVD()) 565 _creditsMovie.setTime(kOtherTitlesDVDTime); 566 else 567 _creditsMovie.setTime(kOtherTitlesCDTime); 519 568 break; 520 569 case kCreditsMenuMainMenu: 521 570 _smallSelect.hide(); 522 571 _largeSelect.show(); 523 572 break; 524 573 } 574 _creditsMovie.redrawMovieWorld(); 525 575 526 576 _menuSelection = newSelection; 527 577 } 528 578 } 529 579 530 580 void CreditsMenu::newMovieTime(const TimeValue newTime) { 581 // The DVD credits have an extra frame in the support team section 582 bool isDVD = ((PegasusEngine *)g_engine)->isDVD(); 583 531 584 if (newTime < kSupportTeamTime) { 532 585 _smallSelect.moveElementTo(kCoreTeamSelectLeft, kCoreTeamSelectTop); 533 586 _menuSelection = kCreditsMenuCoreTeam; 534 } else if ( newTime < kOriginalTeamTime) {587 } else if ((isDVD && newTime < kOriginalTeamDVDTime) || (!isDVD && newTime < kOriginalTeamCDTime)) { 535 588 _smallSelect.moveElementTo(kSupportTeamSelectLeft, kSupportTeamSelectTop); 536 589 _menuSelection = kCreditsMenuSupportTeam; 537 } else if ( newTime < kTalentTime) {590 } else if ((isDVD && newTime < kTalentDVDTime) || (!isDVD && newTime < kTalentCDTime)) { 538 591 _smallSelect.moveElementTo(kOriginalTeamSelectLeft, kOriginalTeamSelectTop); 539 592 _menuSelection = kCreditsMenuOriginalTeam; 540 } else if ( newTime < kOtherTitlesTime) {593 } else if ((isDVD && newTime < kOtherTitlesDVDTime) || (!isDVD && newTime < kOtherTitlesCDTime)) { 541 594 _smallSelect.moveElementTo(kTalentSelectLeft, kTalentSelectTop); 542 595 _smallSelect.show(); 543 596 _largeSelect.hide(); … … DeathMenu::DeathMenu(const DeathReason deathReason) : GameMenu(kDeathMenuID), _d 664 717 "dAunmade", "dAbombed", "dAshot", "dAassass", "dAnuked", 665 718 "dTunmade", "dTshot", "dPfall", "dPdino", "dPstuck", 666 719 "dNchoke", "dNcaught", "dNcaught", "dNsub", "dNrobot1", 667 "dNrobot2", "dMfall", "dMcaught", "dMtracks", "dMrobot", 668 "dMtoast", "dMexplo1", "dMexplo2", "dMchoke1", "dMchoke2", 669 "dMdroid", "dMfall", "dMgears", "dMshutt1", "dMshutt2", 670 "dWpoison", "dWcaught", "dWplasma", "dWshot", "dAfinale" 720 "dNrobot2", "dMfall", "dMcaught", "dMcollision", "dMtracks", 721 "dMrobot", "dMtoast", "dMexplo1", "dMexplo2", "dMchoke1", 722 "dMchoke2", "dMdroid", "dMshaft", "dMgears", "dMshutt1", 723 "dMshutt2", "dWpoison", "dWcaught", "dWplasma", "dWshot", 724 "dAfinale" 671 725 }; 672 726 673 727 imageName += fileNames[deathReason - 1]; … … DeathMenu::DeathMenu(const DeathReason deathReason) : GameMenu(kDeathMenuID), _d 735 789 _largeSelect.setDisplayOrder(2); 736 790 _largeSelect.startDisplaying(); 737 791 } else { 738 _triumphSound.initFromQuickTime("Sounds/Caldoria/Galactic Triumph"); 792 if (vm->isDVD()) // Updated file for the DVD version 793 _triumphSound.initFromAIFFFile("Sounds/Caldoria/Galactic Triumph.44K.aiff"); 794 else 795 _triumphSound.initFromQuickTime("Sounds/Caldoria/Galactic Triumph"); 739 796 _triumphSound.playSound(); 740 797 } 741 798 … … void DeathMenu::drawAllScores() { 864 921 case kDeathRobotSubControlRoom: 865 922 case kDeathWrongShuttleLock: 866 923 case kDeathArrestedInMars: 924 case kDeathCollidedWithPod: 867 925 case kDeathRunOverByPod: 868 926 case kDeathDidntGetOutOfWay: 869 927 case kDeathReactorBurn: -
engines/pegasus/menu.h
diff --git a/engines/pegasus/menu.h b/engines/pegasus/menu.h index 288b846..c0a27ef 100644
a b protected: 97 97 class CreditsMenu : public GameMenu { 98 98 public: 99 99 CreditsMenu(); 100 virtual ~CreditsMenu() {}100 virtual ~CreditsMenu(); 101 101 102 102 virtual void handleInput(const Input &input, const Hotspot *); 103 void startCreditsMenuLoop(); 104 void stopCreditsMenuLoop(); 103 105 104 106 protected: 105 107 void newMenuSelection(const int); … … protected: 111 113 Picture _mainMenuButton; 112 114 Picture _largeSelect; 113 115 Picture _smallSelect; 116 117 Sound _menuLoop; 118 SoundFader _menuFader; 114 119 }; 115 120 116 121 class DeathMenu : public GameMenu { -
engines/pegasus/module.mk
diff --git a/engines/pegasus/module.mk b/engines/pegasus/module.mk index cb44a04..2dd5b87 100644
a b 1 1 MODULE := engines/pegasus 2 2 3 3 MODULE_OBJS = \ 4 chase.o \ 4 5 compass.o \ 5 6 console.o \ 6 7 cursor.o \ … … MODULE_OBJS = \ 33 34 items/itemdragger.o \ 34 35 items/itemlist.o \ 35 36 items/biochips/aichip.o \ 37 items/biochips/arthurchip.o \ 36 38 items/biochips/biochipitem.o \ 37 39 items/biochips/mapchip.o \ 38 40 items/biochips/mapimage.o \ … … MODULE_OBJS = \ 58 60 neighborhood/caldoria/caldoriabomb.o \ 59 61 neighborhood/caldoria/caldoriamessages.o \ 60 62 neighborhood/caldoria/caldoriamirror.o \ 63 neighborhood/mars/canyonchase.o \ 61 64 neighborhood/mars/energybeam.o \ 62 65 neighborhood/mars/gravitoncannon.o \ 63 66 neighborhood/mars/hermite.o \ … … MODULE_OBJS = \ 71 74 neighborhood/mars/spacechase3d.o \ 72 75 neighborhood/mars/spacejunk.o \ 73 76 neighborhood/mars/tractorbeam.o \ 77 neighborhood/mars/tunnelpod.o \ 74 78 neighborhood/norad/norad.o \ 75 79 neighborhood/norad/noradelevator.o \ 76 80 neighborhood/norad/pressuredoor.o \ … … MODULE_OBJS = \ 82 86 neighborhood/norad/alpha/noradalpha.o \ 83 87 neighborhood/norad/alpha/panorama.o \ 84 88 neighborhood/norad/alpha/panoramascroll.o \ 89 neighborhood/norad/alpha/subchase.o \ 85 90 neighborhood/norad/delta/globegame.o \ 86 91 neighborhood/norad/delta/noraddelta.o \ 87 92 neighborhood/prehistoric/prehistoric.o \ -
engines/pegasus/neighborhood/caldoria/caldoria.cpp
diff --git a/engines/pegasus/neighborhood/caldoria/caldoria.cpp b/engines/pegasus/neighborhood/caldoria/caldoria.cpp index 0707a83..0cb7f22 100644
a b 25 25 26 26 #include "common/system.h" 27 27 #include "video/qt_decoder.h" 28 #include "video/theora_decoder.h" 28 29 29 30 #include "pegasus/cursor.h" 30 31 #include "pegasus/energymonitor.h" … … 32 33 #include "pegasus/interface.h" 33 34 #include "pegasus/pegasus.h" 34 35 #include "pegasus/ai/ai_area.h" 36 #include "pegasus/items/biochips/arthurchip.h" 35 37 #include "pegasus/items/biochips/biochipitem.h" 36 38 #include "pegasus/neighborhood/caldoria/caldoria.h" 37 39 #include "pegasus/neighborhood/caldoria/caldoria4dsystem.h" … … static const int16 kDrawersAngle = -30; 48 50 static const int16 kCaldoria53Angle = 45; 49 51 static const int16 kCaldoria55Angle = -45; 50 52 53 static const ExtraID kCreateCornbread = 1000; 54 static const ExtraID kWashingMachineZoomIn = 1001; 55 static const ExtraID kWashingMachineLoop = 1002; 56 static const ExtraID kWashingMachineZoomOut = 1003; 57 58 static const HotSpotID kCaldoriaLaundryZoomInHotSpotID = 10000; 59 static const HotSpotID kCaldoriaLaundryZoomOutHotSpotID = 10001; 60 static const HotSpotID kCaldoriaCornbreadHotSpotID = 10002; 61 51 62 static const TimeValue kSinclairInterruptionTime1 = 2955; 52 63 static const TimeValue kSinclairInterruptionTime2 = 6835; 53 64 static const TimeValue kSinclairInterruptionTime3 = 9835; … … static const TimeValue kSinclairInterruptionTime4 = 12555; 56 67 static const InputBits kPullbackInterruptFilter = kFilterAllInput; 57 68 static const InputBits kRecalibrationInterruptFilter = kFilterAllInput; 58 69 70 static const TimeValue kCaldoriaLaundryIntro1In = 0; 71 static const TimeValue kCaldoriaLaundryIntro1Out = 2645; 72 73 static const TimeValue kCaldoriaLaundryIntro2In = 2645; 74 static const TimeValue kCaldoriaLaundryIntro2Out = 4933; 75 59 76 static const TimeValue kCaldoriaReplicatorIntroIn = 4933; 60 77 static const TimeValue kCaldoriaReplicatorIntroOut = 6557; 61 78 … … static const TimeValue kCaldoriaNobodyHomeOut = 21469; 92 109 static const TimeValue kCaldoriaNoOtherFloorIn = 21469; 93 110 static const TimeValue kCaldoriaNoOtherFloorOut = 28013; 94 111 95 static const TimeValue kCaldoria4DInstructionsIn = 28013;96 static const TimeValue kCaldoria4DInstructionsOut = 29730;97 98 112 static const TimeValue kCaldoriaDrinkOJIn = 33910; 99 113 static const TimeValue kCaldoriaDrinkOJOut = 35846; 100 114 … … void SinclairCallBack::callBack() { 159 173 } 160 174 161 175 Caldoria::Caldoria(InputHandler* nextHandler, PegasusEngine *owner) 162 : Neighborhood(nextHandler, owner, "Caldoria", kCaldoriaID), _sinclairInterrupt(this) { 176 : Neighborhood(nextHandler, owner, "Caldoria", kCaldoriaID), _extraMovie(kNoDisplayElement), 177 _laundryZoomInSpot(kCaldoriaLaundryZoomInHotSpotID), _laundryZoomOutSpot(kCaldoriaLaundryZoomOutHotSpotID), 178 _cornbreadSpot(kCaldoriaCornbreadHotSpotID), _sinclairInterrupt(this), _lookingAtLaundry(false) { 163 179 setIsItemTaken(kKeyCard); 164 180 setIsItemTaken(kOrangeJuiceGlassEmpty); 165 181 GameState.setTakenItemID(kOrangeJuiceGlassFull, GameState.isTakenItemID(kOrangeJuiceGlassEmpty)); … … Caldoria::Caldoria(InputHandler* nextHandler, PegasusEngine *owner) 169 185 170 186 Caldoria::~Caldoria() { 171 187 _sinclairInterrupt.releaseCallBack(); 188 if (_vm->isDVD()) { 189 _vm->getAllHotspots().remove(&_laundryZoomInSpot); 190 _vm->getAllHotspots().remove(&_laundryZoomOutSpot); 191 _vm->getAllHotspots().remove(&_cornbreadSpot); 192 } 172 193 } 173 194 174 195 void Caldoria::init() { 175 196 Neighborhood::init(); 176 197 198 if (_vm->isDVD()) { 199 _laundryZoomInSpot.setArea(Common::Rect(384, 120, 576, 320)); 200 _laundryZoomInSpot.setHotspotFlags(kNeighborhoodSpotFlag | kZoomInSpotFlag); 201 _vm->getAllHotspots().push_back(&_laundryZoomInSpot); 202 203 _laundryZoomOutSpot.setArea(Common::Rect(64, 64, 576, 320)); 204 _laundryZoomOutSpot.setHotspotFlags(kNeighborhoodSpotFlag | kZoomOutSpotFlag); 205 _vm->getAllHotspots().push_back(&_laundryZoomOutSpot); 206 207 _cornbreadSpot.setArea(Common::Rect(270, 233, 381, 298)); 208 _cornbreadSpot.setHotspotFlags(kNeighborhoodSpotFlag | kClickSpotFlag); 209 _vm->getAllHotspots().push_back(&_cornbreadSpot); 210 } 211 177 212 // We need this notification flag as well. 178 213 _neighborhoodNotification.notifyMe(this, kSinclairLoopDoneFlag, kSinclairLoopDoneFlag); 179 214 215 _extraMovieCallBack.setNotification(&_neighborhoodNotification); 216 180 217 _sinclairInterrupt.initCallBack(&_navMovie, kCallBackAtTime); 181 218 182 219 forceStridingStop(kCaldoria55, kSouth, kAltCaldoriaSinclairDown); … … void Caldoria::start() { 187 224 g_energyMonitor->stopEnergyDraining(); 188 225 189 226 if (!GameState.getCaldoriaSeenPullback()) { 227 Input input; 228 Common::String wakeModeMoviePath; 229 InputDevice.getInput(input, kPullbackInterruptFilter); 230 if (_vm->isDVD() && JMPPPInput::isEasterEggModifierInput(input)) { 231 wakeModeMoviePath = "Images/Caldoria/A00WM"; 232 } else { 233 wakeModeMoviePath = "Images/Caldoria/A00WN"; 234 } 235 190 236 _vm->_gfx->doFadeOutSync(kOneSecond * kFifteenTicksPerSecond, kFifteenTicksPerSecond); 191 237 192 g_system->delayMillis(2 * 1000); 238 Video::VideoDecoder *pullbackMovie = 0; 239 uint16 pullbackX, pullbackY; 193 240 194 Video::VideoDecoder *pullbackMovie = new Video::QuickTimeDecoder(); 241 #ifdef USE_THEORADEC 242 if (_vm->isDVD()) { 243 // Updated larger version 244 pullbackMovie = new Video::TheoraDecoder(); 245 246 if (!pullbackMovie->loadFile("Images/Caldoria/Pullback.ogg")) { 247 delete pullbackMovie; 248 pullbackMovie = 0; 249 } 250 } 251 #endif 252 253 if (!pullbackMovie) { 254 pullbackMovie = new Video::QuickTimeDecoder(); 195 255 196 if (!pullbackMovie->loadFile("Images/Caldoria/Pullback.movie")) 197 error("Could not load pullback movie"); 256 if (!pullbackMovie->loadFile("Images/Caldoria/Pullback.movie")) 257 error("Could not load Pullback.movie"); 258 } 259 260 if (_vm->isDVD()) { 261 uint16 newHeight = (uint16)((640.0f / (float)pullbackMovie->getWidth()) * (float)pullbackMovie->getHeight()); 262 pullbackX = 0; 263 pullbackY = (480 - newHeight) / 2; 264 } else { 265 pullbackX = 80; 266 pullbackY = 112; 267 } 198 268 199 269 // Draw the first frame so we can fade to it 200 270 const Graphics::Surface *frame = pullbackMovie->decodeNextFrame(); 201 271 assert(frame); 202 272 assert(frame->format == g_system->getScreenFormat()); 203 g_system->copyRectToScreen((const byte *)frame->getPixels(), frame->pitch, 64, 112, frame->w, frame->h);273 g_system->copyRectToScreen((const byte *)frame->getPixels(), frame->pitch, pullbackX, pullbackY, frame->w, frame->h); 204 274 _vm->_gfx->doFadeInSync(kTwoSeconds * kFifteenTicksPerSecond, kFifteenTicksPerSecond); 205 275 206 276 bool saveAllowed = _vm->swapSaveAllowed(false); 207 277 bool openAllowed = _vm->swapLoadAllowed(false); 208 278 209 279 bool skipped = false; 210 Input input;211 280 212 281 pullbackMovie->start(); 213 282 … … void Caldoria::start() { 216 285 frame = pullbackMovie->decodeNextFrame(); 217 286 218 287 if (frame) { 219 g_system->copyRectToScreen((const byte *)frame->getPixels(), frame->pitch, 64, 112, frame->w, frame->h);288 g_system->copyRectToScreen((const byte *)frame->getPixels(), frame->pitch, pullbackX, pullbackY, frame->w, frame->h); 220 289 g_system->updateScreen(); 221 290 } 222 291 } 223 292 224 293 InputDevice.getInput(input, kPullbackInterruptFilter); 225 if ( input.anyInput() || _vm->saveRequested() || _vm->loadRequested()) {294 if ((input.anyInput() || _vm->saveRequested() || _vm->loadRequested()) && !GameState.getEasterEgg()) { 226 295 skipped = true; 227 296 break; 228 297 } … … void Caldoria::start() { 241 310 ExtraTable::Entry entry; 242 311 243 312 if (!skipped) { 244 _vm->_gfx->doFadeOutSync(kThreeSeconds * kFifteenTicksPerSecond, kFifteenTicksPerSecond, false); 245 g_system->delayMillis(3 * 1000 / 2); 246 getExtraEntry(kCaldoria00WakeUp1, entry); 247 _navMovie.setTime(entry.movieStart); 248 _navMovie.redrawMovieWorld(); 249 _navMovie.show(); 250 _vm->refreshDisplay(); 251 _vm->_gfx->doFadeInSync(kOneSecond * kFifteenTicksPerSecond, kFifteenTicksPerSecond, false); 313 if (_vm->isDVD()) { 314 Video::VideoDecoder* wakeModeMovie = 0; 315 #ifdef USE_THEORADEC 316 wakeModeMovie = new Video::TheoraDecoder(); 317 if (!wakeModeMovie->loadFile(wakeModeMoviePath + ".ogg")) { 318 delete wakeModeMovie; 319 wakeModeMovie = 0; 320 } 321 #endif 322 if (!wakeModeMovie) { 323 wakeModeMovie = new Video::QuickTimeDecoder(); 324 if (!wakeModeMovie->loadFile(wakeModeMoviePath + ".movie")) 325 error("Could not load Jonny Ego movie"); 326 } 327 328 wakeModeMovie->start(); 329 330 while (!_vm->shouldQuit() && !wakeModeMovie->endOfVideo()) { 331 if (wakeModeMovie->needsUpdate()) { 332 frame = wakeModeMovie->decodeNextFrame(); 333 334 if (frame) { 335 g_system->copyRectToScreen((const byte *)frame->getPixels(), frame->pitch, 0, 0, frame->w, frame->h); 336 g_system->updateScreen(); 337 } 338 } 339 340 InputDevice.getInput(input, kPullbackInterruptFilter); 341 if ((input.anyInput() || _vm->saveRequested() || _vm->loadRequested()) && !GameState.getEasterEgg()) { 342 skipped = true; 343 break; 344 } 345 346 g_system->delayMillis(10); 347 } 348 349 delete wakeModeMovie; 350 351 if (_vm->shouldQuit()) 352 return; 353 } else { 354 _vm->_gfx->doFadeOutSync(kThreeSeconds * kFifteenTicksPerSecond, kFifteenTicksPerSecond, false); 355 g_system->delayMillis(3 * 1000 / 2); 356 getExtraEntry(kCaldoria00WakeUp1, entry); 357 _navMovie.setTime(entry.movieStart); 358 _navMovie.redrawMovieWorld(); 359 _navMovie.show(); 360 _vm->refreshDisplay(); 361 _vm->_gfx->doFadeInSync(kOneSecond * kFifteenTicksPerSecond, kFifteenTicksPerSecond, false); 362 } 252 363 } else { 253 364 getExtraEntry(kCaldoria00WakeUp1, entry); 254 365 _navMovie.setTime(entry.movieStart); … … void Caldoria::start() { 262 373 Neighborhood::start(); 263 374 } 264 375 376 void Caldoria::throwAwayInterface() { 377 Neighborhood::throwAwayInterface(); 378 if (_vm->isDVD()) { 379 _vm->getAllHotspots().remove(&_laundryZoomInSpot); 380 _vm->getAllHotspots().remove(&_laundryZoomOutSpot); 381 _vm->getAllHotspots().remove(&_cornbreadSpot); 382 } 383 } 384 265 385 void Caldoria::flushGameState() { 266 386 GameState.setCaldoriaFuseTimeLimit(_utilityFuse.getTimeRemaining()); 267 387 } … … void Caldoria::getExtraCompassMove(const ExtraTable::Entry &entry, FaderMoveSpec 686 806 void Caldoria::loadAmbientLoops() { 687 807 RoomID room = GameState.getCurrentRoom(); 688 808 689 if (room == kCaldoria00 && GameState.getCaldoriaWokenUp()) 690 loadLoopSound1("Sounds/Caldoria/Apartment Music.AIFF", 0x100 / 4); 691 else if (room >= kCaldoria01 && room <= kCaldoria14) 692 loadLoopSound1("Sounds/Caldoria/Apartment Music.AIFF", 0x100 / 4); 693 else if (room == kCaldoria27 || room == kCaldoria28 || room == kCaldoria45) 694 loadLoopSound1("Sounds/Caldoria/Elevator Loop.AIFF", 0x100 / 5); 695 else if (room == kCaldoria44) 696 loadLoopSound1("Sounds/Caldoria/TSA Hum Loop.AIFF"); 697 else if (room >= kCaldoria15 && room <= kCaldoria48) 698 loadLoopSound1("Sounds/Caldoria/Industrial Nuage.aiff", 2 * 0x100 / 3); 699 else if (room >= kCaldoria49 && room <= kCaldoria56) 700 loadLoopSound1("Sounds/Caldoria/A50NLB00.22K.AIFF", 0x100 / 4); 809 if (_vm->isDVD()) { 810 // Updated sounds in the DVD version 811 if (room == kCaldoria00 && GameState.getCaldoriaWokenUp()) 812 loadLoopSound1("Sounds/Caldoria/Apartment Music.32K.aiff", 0x100 / 4); 813 else if (room >= kCaldoria01 && room <= kCaldoria14) 814 loadLoopSound1("Sounds/Caldoria/Apartment Music.32K.aiff", 0x100 / 4); 815 else if (room == kCaldoria27 || room == kCaldoria28 || room == kCaldoria45) 816 loadLoopSound1("Sounds/Caldoria/Elevator Loop.32K.aiff", 0x100 / 5); 817 else if (room == kCaldoria44) 818 loadLoopSound1("Sounds/Caldoria/TSA Hum Loop.44K.aiff"); 819 else if (room >= kCaldoria15 && room <= kCaldoria48) 820 loadLoopSound1("Sounds/Caldoria/Industrial Nuage.44K.aiff", 2 * 0x100 / 3); 821 else if (room >= kCaldoria49 && room <= kCaldoria56) 822 loadLoopSound1("Sounds/Caldoria/A50NLB00.32K.AIFF", 0x100 / 4); 823 } else { 824 if (room == kCaldoria00 && GameState.getCaldoriaWokenUp()) 825 loadLoopSound1("Sounds/Caldoria/Apartment Music.AIFF", 0x100 / 4); 826 else if (room >= kCaldoria01 && room <= kCaldoria14) 827 loadLoopSound1("Sounds/Caldoria/Apartment Music.AIFF", 0x100 / 4); 828 else if (room == kCaldoria27 || room == kCaldoria28 || room == kCaldoria45) 829 loadLoopSound1("Sounds/Caldoria/Elevator Loop.AIFF", 0x100 / 5); 830 else if (room == kCaldoria44) 831 loadLoopSound1("Sounds/Caldoria/TSA Hum Loop.AIFF"); 832 else if (room >= kCaldoria15 && room <= kCaldoria48) 833 loadLoopSound1("Sounds/Caldoria/Industrial Nuage.aiff", 2 * 0x100 / 3); 834 else if (room >= kCaldoria49 && room <= kCaldoria56) 835 loadLoopSound1("Sounds/Caldoria/A50NLB00.22K.AIFF", 0x100 / 4); 836 } 701 837 } 702 838 703 839 void Caldoria::checkContinuePoint(const RoomID room, const DirectionConstant direction) { … … void Caldoria::checkContinuePoint(const RoomID room, const DirectionConstant dir 718 854 719 855 void Caldoria::spotCompleted() { 720 856 Neighborhood::spotCompleted(); 721 if (GameState.getCurrentRoom() == kCaldoriaBinoculars) 857 switch (GameState.getCurrentRoom()) { 858 case kCaldoriaBinoculars: 722 859 startExtraSequence(kBinocularsZoomInOnShip, kExtraCompletedFlag, kFilterNoInput); 860 break; 861 case kCaldoriaToilet: 862 if (g_arthurChip) 863 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA47", kArthurCaldoriaReadPaper); 864 break; 865 } 723 866 } 724 867 725 868 void Caldoria::arriveAt(const RoomID room, const DirectionConstant direction) { … … void Caldoria::arriveAt(const RoomID room, const DirectionConstant direction) { 741 884 742 885 Neighborhood::arriveAt(room, direction); 743 886 Input dummy; 887 Sound flushSound; 744 888 745 889 switch (room) { 746 890 case kCaldoria00: … … void Caldoria::arriveAt(const RoomID room, const DirectionConstant direction) { 757 901 case kCaldoria09: 758 902 _lastExtra = 0xffffffff; 759 903 break; 904 case kCaldoria10: 905 if (_vm->isDVD() && direction == kWest) { 906 _vm->_cursor->hide(); 907 flushSound.initFromAIFFFile("Sounds/Caldoria/Apartment Toilet.32K.aiff"); 908 flushSound.setVolume(_vm->getSoundFXLevel()); 909 flushSound.playSound(); 910 while (flushSound.isPlaying() && !_vm->shouldQuit()) { 911 InputDevice.getInput(dummy, kFilterNoInput); 912 913 _vm->checkCallBacks(); 914 _vm->refreshDisplay(); 915 _vm->_system->delayMillis(10); 916 } 917 if (_vm->shouldQuit()) 918 return; 919 _vm->_cursor->hideUntilMoved(); 920 } else if (direction == kEast) { 921 if (g_arthurChip) 922 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA42", kArthurCaldoriaReachedToilet); 923 } 924 break; 760 925 case kCaldoriaToilet: 761 926 GameState.setScoringReadPaper(true); 762 927 break; … … void Caldoria::arriveAt(const RoomID room, const DirectionConstant direction) { 812 977 case kCaldoria49: 813 978 arriveAtCaldoria49(); 814 979 break; 980 case kCaldoria48: 981 if (direction == kNorth && !GameState.getCaldoriaDoorBombed() && GameState.isTakenItemID(kCardBomb) && g_arthurChip) 982 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA12", kArthurCaldoriaRoofDoor); 983 break; 815 984 case kCaldoria53: 816 985 if (direction == kEast && !GameState.getCaldoriaSinclairShot()) 817 986 zoomToSinclair(); … … void Caldoria::arriveAt(const RoomID room, const DirectionConstant direction) { 839 1008 void Caldoria::doAIRecalibration() { 840 1009 GameState.setCaldoriaDidRecalibration(true); 841 1010 842 if (!g_AIArea->playAIMovie(kRightAreaSignature, "Images/AI/Caldoria/XA01EB1", true, kRecalibrationInterruptFilter)) 843 return; 1011 Input input; 1012 InputDevice.getInput(input, kPullbackInterruptFilter); 1013 if (_vm->isDVD() && JMPPPInput::isEasterEggModifierInput(input)) { 1014 Video::VideoDecoder *video = 0; 844 1015 845 g_interface->calibrateEnergyBar(); 846 if (!g_AIArea->playAIMovie(kRightAreaSignature, "Images/AI/Caldoria/XA01EB4", true, kRecalibrationInterruptFilter)) 847 return; 1016 _vm->_cursor->hide(); 1017 1018 #ifdef USE_THEORADEC 1019 video = new Video::TheoraDecoder(); 1020 if (!video->loadFile("Images/Caldoria/A00EA.ogg")) { 1021 delete video; 1022 video = 0; 1023 } 1024 #endif 1025 1026 if (!video) { 1027 video = new Video::QuickTimeDecoder(); 1028 if (!video->loadFile("Images/Caldoria/A00EA.movie")) 1029 error("Could not load Month-O-Matic video"); 1030 } 1031 1032 video->setVolume(MIN<uint>(_vm->getSoundFXLevel(), 0xFF)); 1033 video->start(); 1034 1035 while (!_vm->shouldQuit() && !video->endOfVideo()) { 1036 if (video->needsUpdate()) { 1037 const Graphics::Surface *frame = video->decodeNextFrame(); 1038 1039 if (frame) { 1040 g_system->copyRectToScreen((const byte *)frame->getPixels(), frame->pitch, kNavAreaLeft, kNavAreaTop, frame->w, frame->h); 1041 g_system->updateScreen(); 1042 } 1043 } 1044 1045 Common::Event event; 1046 while (g_system->getEventManager()->pollEvent(event)) 1047 ; 1048 1049 g_system->delayMillis(10); 1050 } 1051 1052 delete video; 1053 1054 if (_vm->shouldQuit()) 1055 return; 1056 1057 arriveAt(kCaldoria01, kEast); 1058 } else if (g_AIArea->isChattyAI()) { 1059 if (!g_AIArea->playAIMovie(kRightAreaSignature, "Images/AI/Caldoria/XA01EB1", true, kRecalibrationInterruptFilter)) 1060 return; 1061 1062 g_interface->calibrateEnergyBar(); 1063 if (!g_AIArea->playAIMovie(kRightAreaSignature, "Images/AI/Caldoria/XA01EB4", true, kRecalibrationInterruptFilter)) 1064 return; 1065 1066 g_interface->raiseInventoryDrawerSync(); 1067 if (!g_AIArea->playAIMovie(kRightAreaSignature, "Images/AI/Caldoria/XA01EB6", true, kRecalibrationInterruptFilter)) { 1068 g_interface->lowerInventoryDrawerSync(); 1069 return; 1070 } 848 1071 849 g_interface->raiseInventoryDrawerSync();850 if (!g_AIArea->playAIMovie(kRightAreaSignature, "Images/AI/Caldoria/XA01EB6", true, kRecalibrationInterruptFilter)) {851 1072 g_interface->lowerInventoryDrawerSync(); 852 return; 853 } 1073 g_interface->raiseBiochipDrawerSync(); 854 1074 855 g_interface->lowerInventoryDrawerSync(); 856 g_interface->raiseBiochipDrawerSync(); 1075 if (!g_AIArea->playAIMovie(kRightAreaSignature, "Images/AI/Caldoria/XA01EB5", true, kRecalibrationInterruptFilter)) { 1076 g_interface->lowerBiochipDrawerSync(); 1077 return; 1078 } 857 1079 858 if (!g_AIArea->playAIMovie(kRightAreaSignature, "Images/AI/Caldoria/XA01EB5", true, kRecalibrationInterruptFilter)) {859 1080 g_interface->lowerBiochipDrawerSync(); 860 return;861 }862 863 g_interface->lowerBiochipDrawerSync();864 1081 865 g_AIArea->playAIMovie(kRightAreaSignature, "Images/AI/Caldoria/XA01EB8", false, kRecalibrationInterruptFilter); 1082 g_AIArea->playAIMovie(kRightAreaSignature, "Images/AI/Caldoria/XA01EB8", false, kRecalibrationInterruptFilter); 1083 } 866 1084 } 867 1085 868 1086 void Caldoria::arriveAtCaldoria00() { … … void Caldoria::setUpRoofTop() { 985 1203 } 986 1204 } 987 1205 1206 void Caldoria::leftButton(const Input &input) { 1207 if (!(GameState.getCurrentRoomAndView() == MakeRoomView(kCaldoria11, kWest) && _lookingAtLaundry)) 1208 Neighborhood::leftButton(input); 1209 } 1210 1211 void Caldoria::rightButton(const Input &input) { 1212 if (!(GameState.getCurrentRoomAndView() == MakeRoomView(kCaldoria11, kWest) && _lookingAtLaundry)) 1213 Neighborhood::rightButton(input); 1214 } 1215 988 1216 void Caldoria::downButton(const Input &input) { 989 1217 switch (GameState.getCurrentRoomAndView()) { 990 1218 case MakeRoomView(kCaldoria01, kEast): 991 1219 GameState.setCaldoriaWokenUp(true); 992 1220 startExtraSequence(kCaldoria00SitDown, kExtraCompletedFlag, kFilterNoInput); 993 1221 break; 1222 case MakeRoomView(kCaldoria11, kWest): 1223 if (_lookingAtLaundry) 1224 startExtraSequence(kWashingMachineZoomOut, kExtraCompletedFlag, kFilterNoInput); 1225 break; 994 1226 default: 995 1227 Neighborhood::downButton(input); 996 1228 break; … … void Caldoria::turnTo(const DirectionConstant direction) { 1026 1258 case kCaldoria09: 1027 1259 _lastExtra = 0xffffffff; 1028 1260 break; 1261 case kCaldoria10: 1262 if (direction == kEast && g_arthurChip) 1263 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA42", kArthurCaldoriaReachedToilet); 1264 break; 1029 1265 case kCaldoria11: 1030 1266 if (direction == kEast && !GameState.getCaldoriaSeenMessages()) 1031 1267 loopCroppedMovie("Images/Caldoria/A11 Message Machine Loop", kCaldoria11MessageLoopLeft, kCaldoria11MessageLoopTop); … … void Caldoria::turnTo(const DirectionConstant direction) { 1051 1287 closeCroppedMovie(); 1052 1288 break; 1053 1289 case kCaldoria48: 1054 if (direction == kNorth && !GameState.getCaldoriaDoorBombed()) 1290 if (direction == kNorth && !GameState.getCaldoriaDoorBombed()) { 1055 1291 setCurrentActivation(kActivateRoofSlotEmpty); 1292 if (GameState.isTakenItemID(kCardBomb) && g_arthurChip) 1293 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA12", kArthurCaldoriaRoofDoor); 1294 } 1056 1295 break; 1057 1296 case kCaldoria53: 1058 1297 if (GameState.getCurrentDirection() == kEast && !GameState.getCaldoriaSinclairShot()) … … void Caldoria::zoomTo(const Hotspot *zoomOutSpot) { 1085 1324 // that doesn't involve the ClickInHotSpot function. 1086 1325 _zoomOutSpot = zoomOutSpot; 1087 1326 1088 if (zoomOutSpot->getObjectID() == kCaldoriaDrawersOutSpotID) { 1327 if (_vm->isDVD() && zoomOutSpot->getObjectID() == kCaldoriaReplicatorOutSpotID) { 1328 GameState.setEasterEgg(false); 1329 Neighborhood::zoomTo(zoomOutSpot); 1330 } else if (zoomOutSpot->getObjectID() == kCaldoriaDrawersOutSpotID) { 1089 1331 if (_privateFlags.getFlag(kCaloriaPrivateLeftDrawerOpenFlag)) { 1090 1332 _privateFlags.setFlag(kCaloriaPrivateLeftDrawerOpenFlag, false); 1091 1333 startExtraSequence(kLeftDrawerClose, kExtraCompletedFlag, kFilterNoInput); … … void Caldoria::zoomToSinclair() { 1122 1364 startExtraSequence(kCa53EastZoomToSinclair, kExtraCompletedFlag, kFilterAllInput); 1123 1365 } 1124 1366 1367 void Caldoria::startExtraSequence(const ExtraID extraID, const NotificationFlags flags, const InputBits interruptionFilter) { 1368 short left = kNavAreaLeft, top = kNavAreaTop; 1369 DisplayOrder displayOrder = kNavMovieOrder + 1; 1370 TimeValue segmentStart = 0, segmentStop = 0; 1371 bool loopSequence = false; 1372 Common::Rect pushBounds; 1373 NotificationFlags extraFlags; 1374 1375 switch (extraID) { 1376 case kCreateCornbread: 1377 case kWashingMachineZoomIn: 1378 case kWashingMachineLoop: 1379 case kWashingMachineZoomOut: 1380 _turnPush.getBounds(pushBounds); 1381 1382 switch (extraID) { 1383 case kCreateCornbread: 1384 _extraMovie.initFromMovieFile("Images/Caldoria/A12RC.movie"); 1385 left = pushBounds.left; 1386 top = pushBounds.top; 1387 displayOrder = kNavMovieOrder + 1; 1388 segmentStart = 0; 1389 segmentStop = _extraMovie.getDuration(); 1390 loopSequence = false; 1391 break; 1392 case kWashingMachineZoomIn: 1393 _extraMovie.initFromMovieFile("Images/Caldoria/A11WAS.movie"); 1394 left = pushBounds.left; 1395 top = pushBounds.top; 1396 displayOrder = kNavMovieOrder + 1; 1397 segmentStart = 0; 1398 segmentStop = 5480; 1399 loopSequence = false; 1400 break; 1401 case kWashingMachineLoop: 1402 // The washing machine movie will already be loaded after zooming in 1403 left = pushBounds.left; 1404 top = pushBounds.top; 1405 displayOrder = kNavMovieOrder + 1; 1406 segmentStart = 5480; 1407 segmentStop = 9880; 1408 loopSequence = true; 1409 break; 1410 case kWashingMachineZoomOut: 1411 // The washing machine movie will still be loaded after looping 1412 left = pushBounds.left; 1413 top = pushBounds.top; 1414 displayOrder = kNavMovieOrder + 1; 1415 segmentStart = 9880; 1416 segmentStop = 11200; 1417 loopSequence = false; 1418 break; 1419 default: 1420 break; 1421 } 1422 1423 _lastExtra = extraID; 1424 _turnPush.hide(); 1425 1426 if (!loopSequence && g_AIArea) 1427 g_AIArea->lockAIOut(); 1428 1429 extraFlags = flags; 1430 _interruptionFilter = interruptionFilter; 1431 // Stop the nav movie before doing anything else 1432 _navMovie.stop(); 1433 _navMovie.stopDisplaying(); 1434 1435 _extraMovie.setVolume(_vm->getSoundFXLevel()); 1436 _extraMovie.moveElementTo(left, top); 1437 _extraMovie.setDisplayOrder(displayOrder); 1438 _extraMovie.startDisplaying(); 1439 _extraMovie.show(); 1440 _extraMovie.setFlags(0); 1441 _extraMovie.setSegment(segmentStart, segmentStop); 1442 _extraMovie.setTime(segmentStart); 1443 if (loopSequence) 1444 _extraMovie.setFlags(kLoopTimeBase); 1445 else 1446 extraFlags |= kNeighborhoodMovieCompletedFlag; 1447 _extraMovieCallBack.cancelCallBack(); 1448 _extraMovieCallBack.initCallBack(&_extraMovie, kCallBackAtExtremes); 1449 if (extraFlags != 0) { 1450 _extraMovieCallBack.setCallBackFlag(extraFlags); 1451 _extraMovieCallBack.scheduleCallBack(kTriggerAtStop, 0, 0); 1452 } 1453 _extraMovie.start(); 1454 break; 1455 default: 1456 Neighborhood::startExtraSequence(extraID, flags, interruptionFilter); 1457 break; 1458 } 1459 } 1460 1125 1461 void Caldoria::receiveNotification(Notification *notification, const NotificationFlags flags) { 1126 1462 Neighborhood::receiveNotification(notification, flags); 1127 1463 … … void Caldoria::receiveNotification(Notification *notification, const Notificatio 1158 1494 } 1159 1495 break; 1160 1496 case kCreateOrangeJuice: 1497 GameState.setCaldoriaMadeOJ(true); 1161 1498 setCurrentActivation(kActivateOJOnThePad); 1162 requestSpotSound(kCaldoriaReplicatorOJChoiceIn, kCaldoriaReplicatorOJChoiceOut, kFilterNoInput, 0); 1499 GameState.setEasterEgg(false); 1500 break; 1501 case kCreateCornbread: 1502 _extraMovie.moveElementTo(0, 0); 1503 _vm->_gfx->setCurSurface(_navMovie.getSurface()); 1504 _extraMovie.copyToCurrentPort(); 1505 _vm->_gfx->setCurSurface(_vm->_gfx->getWorkArea()); 1506 _extraMovie.stopDisplaying(); 1507 _extraMovie.releaseMovie(); 1508 _navMovie.startDisplaying(); 1509 GameState.setEasterEgg(true); 1510 if (g_arthurChip) 1511 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBB39", kArthurCaldoriaCreatedCornbread); 1512 break; 1513 case kWashingMachineZoomIn: 1514 _lookingAtLaundry = true; 1515 startExtraSequence(kWashingMachineLoop, kExtraCompletedFlag, kFilterAllInput); 1516 break; 1517 case kWashingMachineZoomOut: 1518 _extraMovie.stopDisplaying(); 1519 _extraMovie.releaseMovie(); 1520 _navMovie.startDisplaying(); 1521 _lookingAtLaundry = false; 1163 1522 break; 1164 1523 case kCaldoria00SitDown: 1165 1524 arriveAt(kCaldoria00, kEast); … … void Caldoria::receiveNotification(Notification *notification, const Notificatio 1202 1561 case kCa48NorthExplosion: 1203 1562 // Current biochip must be the shield if we got here. 1204 1563 _vm->getCurrentBiochip()->setItemState(kShieldNormal); 1564 if (g_arthurChip) { 1565 if (_vm->getRandomBit()) 1566 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA41", kArthurCaldoriaBlownDoor); 1567 else 1568 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBB42", kArthurCaldoriaBlownDoor); 1569 } 1205 1570 break; 1206 1571 case kBinocularsZoomInOnShip: 1207 1572 setCurrentActivation(kActivateFocusedOnShip); 1573 if (g_arthurChip) 1574 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA03", kArthurCaldoriaLookThroughTelescope); 1208 1575 break; 1209 1576 case kCa49NorthVoiceAnalysis: 1210 1577 _utilityFuse.primeFuse(kSinclairShootsTimeLimit); 1211 1578 _utilityFuse.setFunctor(new Common::Functor0Mem<void, Caldoria>(this, &Caldoria::sinclairTimerExpired)); 1212 1579 _utilityFuse.lightFuse(); 1213 1580 GameState.setCaldoriaSawVoiceAnalysis(true); 1581 if (_vm->isDVD() && g_AIArea) 1582 g_AIArea->checkRules(); 1583 if (g_arthurChip) 1584 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA20", kArthurCaldoriaSawVoiceAnalysis); 1214 1585 break; 1215 1586 case kCa53EastZoomToSinclair: 1216 1587 if (GameState.getCaldoriaSinclairShot()) { … … void Caldoria::receiveNotification(Notification *notification, const Notificatio 1234 1605 } 1235 1606 } else if ((flags & kSpotSoundCompletedFlag) != 0) { 1236 1607 switch (GameState.getCurrentRoom()) { 1608 case kCaldoria11: 1609 if (g_arthurChip) 1610 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA46", kArthurCaldoriaZoomedToLaundry); 1611 break; 1237 1612 case kCaldoria20: 1238 1613 case kCaldoria21: 1239 1614 case kCaldoria26: … … void Caldoria::receiveNotification(Notification *notification, const Notificatio 1241 1616 case kCaldoria34: 1242 1617 case kCaldoria35: 1243 1618 updateViewFrame(); 1619 if ((GameState.getCurrentRoom() == kCaldoria34 || GameState.getCurrentRoom() == kCaldoria35) && g_arthurChip) 1620 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA44", kArthurCaldoriaSawVacantApartment); 1244 1621 break; 1245 1622 case kCaldoria27: 1246 1623 case kCaldoria28: … … void Caldoria::receiveNotification(Notification *notification, const Notificatio 1248 1625 updateElevatorMovie(); 1249 1626 break; 1250 1627 case kCaldoriaReplicator: 1251 emptyOJGlass(); 1628 if (_spotSounds.getStart() == kCaldoriaReplicatorWrongChoiceIn) { 1629 if (g_arthurChip) 1630 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA16", kArthurCaldoriaSelectedStickyBuns); 1631 } else { 1632 emptyOJGlass(); 1633 if (g_arthurChip) 1634 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA45", kArthurCaldoriaDrankOJ); 1635 } 1252 1636 break; 1253 1637 } 1254 1638 } else if ((flags & kSinclairLoopDoneFlag) != 0) { … … void Caldoria::activateHotspots() { 1313 1697 case kCaldoriaReplicator: 1314 1698 if (GameState.getCaldoriaMadeOJ()) 1315 1699 _vm->getAllHotspots().deactivateOneHotspot(kCaldoriaMakeOJSpotID); 1700 if (GameState.getEasterEgg()) 1701 _vm->getAllHotspots().activateOneHotspot(kCaldoriaCornbreadHotSpotID); 1702 break; 1703 case kCaldoria11: 1704 if (_vm->isDVD() && GameState.getCurrentDirection() == kWest) { 1705 if (_lookingAtLaundry) 1706 _vm->getAllHotspots().activateOneHotspot(kCaldoriaLaundryZoomOutHotSpotID); 1707 else 1708 _vm->getAllHotspots().activateOneHotspot(kCaldoriaLaundryZoomInHotSpotID); 1709 } 1316 1710 break; 1317 1711 case kCaldoria27: 1318 1712 if (GameState.isCurrentDoorOpen()) { … … void Caldoria::clickInHotspot(const Input &input, const Hotspot *spot) { 1405 1799 startExtraSequence(kRightDrawerCloseNoKeys, kExtraCompletedFlag, kFilterNoInput); 1406 1800 break; 1407 1801 case kCaldoriaMakeStickyBunsSpotID: 1408 requestSpotSound(kCaldoriaReplicatorWrongChoiceIn, kCaldoriaReplicatorWrongChoiceOut, kFilterNoInput, 0);1802 requestSpotSound(kCaldoriaReplicatorWrongChoiceIn, kCaldoriaReplicatorWrongChoiceOut, kFilterNoInput, kSpotSoundCompletedFlag); 1409 1803 break; 1410 1804 case kCaldoriaMakeOJSpotID: 1411 GameState.setCaldoriaMadeOJ(true); 1412 startExtraSequence(kCreateOrangeJuice, kExtraCompletedFlag, kFilterNoInput); 1805 if (_vm->isDVD() && JMPPPInput::isEasterEggModifierInput(input)) { 1806 startExtraSequence(kCreateCornbread, kExtraCompletedFlag, kFilterNoInput); 1807 } else { 1808 requestSpotSound(kCaldoriaReplicatorOJChoiceIn, kCaldoriaReplicatorOJChoiceOut, kFilterNoInput, 0); 1809 requestExtraSequence(kCreateOrangeJuice, kExtraCompletedFlag, kFilterNoInput); 1810 } 1811 break; 1812 case kCaldoriaCornbreadHotSpotID: 1813 doArthurJoyride(); 1814 break; 1815 case kCaldoriaLaundryZoomInHotSpotID: 1816 if (_vm->isDVD()) { 1817 startExtraSequence(kWashingMachineZoomIn, kExtraCompletedFlag, kFilterNoInput); 1818 requestDelay(30, 10, kFilterNoInput, kDelayCompletedFlag); 1819 requestSpotSound(kCaldoriaLaundryIntro1In, kCaldoriaLaundryIntro2Out, kFilterNoInput, kSpotSoundCompletedFlag); 1820 } 1821 break; 1822 case kCaldoriaLaundryZoomOutHotSpotID: 1823 startExtraSequence(kWashingMachineZoomOut, kExtraCompletedFlag, kFilterNoInput); 1413 1824 break; 1414 1825 case kCaBedroomVidPhoneActivationSpotID: 1415 1826 newInteraction(kCaldoriaMessagesInteractionID); … … void Caldoria::clickInHotspot(const Input &input, const Hotspot *spot) { 1491 1902 1492 1903 void Caldoria::clickOnDoorbell(const HotSpotID doorBellSpotID) { 1493 1904 uint32 extra; 1905 Sound doorbellSound; 1494 1906 ExtraTable::Entry entry; 1907 Input input; 1495 1908 1496 1909 switch (doorBellSpotID) { 1497 1910 case kCaldoria20DoorbellSpotID: 1911 if (_vm->isDVD()) 1912 doorbellSound.initFromAIFFFile("Sounds/Caldoria/AH5.AIFF"); 1498 1913 extra = kCaldoria20Doorbell; 1499 1914 break; 1500 1915 case kCaldoria21DoorbellSpotID: 1916 if (_vm->isDVD()) 1917 doorbellSound.initFromAIFFFile("Sounds/Caldoria/AH4.AIFF"); 1501 1918 extra = kCaldoria21Doorbell; 1502 1919 break; 1503 1920 case kCaldoria26DoorbellSpotID: 1921 if (_vm->isDVD()) 1922 doorbellSound.initFromAIFFFile("Sounds/Caldoria/AH3.AIFF"); 1504 1923 extra = kCaldoria26Doorbell; 1505 1924 break; 1506 1925 case kCaldoria29DoorbellSpotID: 1926 if (_vm->isDVD()) 1927 doorbellSound.initFromAIFFFile("Sounds/Caldoria/AH1.AIFF"); 1507 1928 extra = kCaldoria29Doorbell; 1508 1929 break; 1509 1930 case kCaldoria34DoorbellSpotID: … … void Caldoria::clickOnDoorbell(const HotSpotID doorBellSpotID) { 1518 1939 1519 1940 getExtraEntry(extra, entry); 1520 1941 showViewFrame(entry.movieStart); 1521 requestSpotSound(kCaldoriaNobodyHomeIn, kCaldoriaNobodyHomeOut, kFilterNoInput, kSpotSoundCompletedFlag); 1942 if (_vm->isDVD() && doorBellSpotID != kCaldoria34DoorbellSpotID && doorBellSpotID != kCaldoria35DoorbellSpotID) { 1943 _vm->_cursor->hide(); 1944 doorbellSound.setVolume(_vm->getSoundFXLevel()); 1945 doorbellSound.playSound(); 1946 while (doorbellSound.isPlaying() && !_vm->shouldQuit()) { 1947 InputDevice.getInput(input, kFilterNoInput); 1948 1949 _vm->checkCallBacks(); 1950 _vm->refreshDisplay(); 1951 _vm->_system->delayMillis(10); 1952 } 1953 if (_vm->shouldQuit()) 1954 return; 1955 _vm->_cursor->hideUntilMoved(); 1956 updateViewFrame(); 1957 } else { 1958 requestSpotSound(kCaldoriaNobodyHomeIn, kCaldoriaNobodyHomeOut, kFilterNoInput, kSpotSoundCompletedFlag); 1959 } 1960 } 1961 1962 void Caldoria::cantMoveThatWay(CanOpenDoorReason reason) { 1963 switch (reason) { 1964 case kCantMoveDoorClosed: 1965 case kCantMoveDoorLocked: 1966 openDoor(); 1967 break; 1968 case kCantMoveBlocked: 1969 switch (GameState.getCurrentRoomAndView()) { 1970 case MakeRoomView(kCaldoria20, kWest): 1971 case MakeRoomView(kCaldoria21, kEast): 1972 case MakeRoomView(kCaldoria26, kSouth): 1973 case MakeRoomView(kCaldoria29, kSouth): 1974 case MakeRoomView(kCaldoria34, kWest): 1975 case MakeRoomView(kCaldoria35, kEast): 1976 cantOpenDoor(kCantOpenLocked); 1977 break; 1978 default: 1979 zoomUpOrBump(); 1980 break; 1981 } 1982 break; 1983 default: 1984 bumpIntoWall(); 1985 break; 1986 } 1522 1987 } 1523 1988 1524 1989 CanOpenDoorReason Caldoria::canOpenDoor(DoorTable::Entry &entry) { … … void Caldoria::pickedUpItem(Item *item) { 1606 2071 } 1607 2072 1608 2073 void Caldoria::dropItemIntoRoom(Item *item, Hotspot *dropSpot) { 2074 Input input; 2075 Sound cardBombVoice; 2076 1609 2077 switch (item->getObjectID()) { 1610 2078 case kKeyCard: 1611 2079 Neighborhood::dropItemIntoRoom(item, dropSpot); … … void Caldoria::dropItemIntoRoom(Item *item, Hotspot *dropSpot) { 1629 2097 _utilityFuse.lightFuse(); 1630 2098 GameState.setCaldoriaFuseTimeLimit(kCardBombCountDownTime); 1631 2099 loopCroppedMovie("Images/Caldoria/A48 Bomb Loop", kCaldoria48CardBombLoopLeft, kCaldoria48CardBombLoopTop); 2100 if (_vm->isDVD()) { 2101 InputDevice.getInput(input, kFilterAllInput); 2102 if (JMPPPInput::isEasterEggModifierInput(input)) 2103 cardBombVoice.initFromAIFFFile("Sounds/Caldoria/Card Bomb.Geno.aiff"); 2104 else 2105 cardBombVoice.initFromAIFFFile("Sounds/Caldoria/Card Bomb.44K.aiff"); 2106 cardBombVoice.playSound(); 2107 while (cardBombVoice.isPlaying() && !_vm->shouldQuit()) { 2108 InputDevice.getInput(input, kFilterNoInput); 2109 2110 _vm->checkCallBacks(); 2111 _vm->refreshDisplay(); 2112 _vm->_system->delayMillis(10); 2113 } 2114 if (_vm->shouldQuit()) 2115 return; 2116 } 1632 2117 GameState.setScoringUsedCardBomb(true); 2118 if (g_arthurChip) 2119 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA19", kArthurCaldoriaUsedCardBomb); 1633 2120 break; 1634 2121 case kStunGun: 1635 2122 GameState.setCaldoriaGunAimed(true); … … void Caldoria::dropItemIntoRoom(Item *item, Hotspot *dropSpot) { 1640 2127 _gunSprite->moveElementTo(kCaldoriaGunSpriteLeft, kCaldoriaGunSpriteTop); 1641 2128 _gunSprite->startDisplaying(); 1642 2129 _gunSprite->show(); 2130 if (g_arthurChip) 2131 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA17", kArthurCaldoriaStunningSinclair); 1643 2132 break; 1644 2133 default: 1645 2134 Neighborhood::dropItemIntoRoom(item, dropSpot); … … void Caldoria::dropItemIntoRoom(Item *item, Hotspot *dropSpot) { 1647 2136 } 1648 2137 } 1649 2138 2139 void Caldoria::playMissingFloorSound() { 2140 Input input; 2141 Sound elevatorVoice; 2142 2143 InputDevice.getInput(input, kFilterAllInput); 2144 if (_vm->isDVD() && JMPPPInput::isEasterEggModifierInput(input)) { 2145 _vm->_cursor->hide(); 2146 elevatorVoice.initFromAIFFFile("Sounds/Caldoria/Elevator Denied.32K.aiff"); 2147 elevatorVoice.setVolume(_vm->getSoundFXLevel()); 2148 elevatorVoice.playSound(); 2149 while (elevatorVoice.isPlaying() && !_vm->shouldQuit()) { 2150 InputDevice.getInput(input, kFilterNoInput); 2151 2152 _vm->checkCallBacks(); 2153 _vm->refreshDisplay(); 2154 _vm->_system->delayMillis(10); 2155 } 2156 if (_vm->shouldQuit()) 2157 return; 2158 _vm->_cursor->hideUntilMoved(); 2159 updateElevatorMovie(); 2160 } else { 2161 requestSpotSound(kCaldoriaNoOtherFloorIn, 2162 kCaldoriaNoOtherFloorOut, 2163 kFilterNoInput, 2164 kSpotSoundCompletedFlag); 2165 } 2166 } 2167 1650 2168 void Caldoria::takeElevator(uint startFloor, uint endFloor) { 1651 2169 _croppedMovie.stop(); 1652 2170 _croppedMovie.setSegment(0, _croppedMovie.getDuration()); … … void Caldoria::takeElevator(uint startFloor, uint endFloor) { 1660 2178 case 2: 1661 2179 _croppedMovie.setTime(k1To2Time); 1662 2180 _croppedMovie.redrawMovieWorld(); 1663 requestSpotSound(kCaldoriaNoOtherDestinationIn, kCaldoriaNoOtherDestinationOut, kFilterNoInput, kSpotSoundCompletedFlag);2181 playMissingFloorSound(); 1664 2182 break; 1665 2183 case 3: 1666 2184 _croppedMovie.setTime(k1To3Time); 1667 2185 _croppedMovie.redrawMovieWorld(); 1668 requestSpotSound(kCaldoriaNoOtherDestinationIn, kCaldoriaNoOtherDestinationOut, kFilterNoInput, kSpotSoundCompletedFlag);2186 playMissingFloorSound(); 1669 2187 break; 1670 2188 case 4: 1671 2189 _croppedMovie.setSegment(k1To4Start, k1To4Stop); … … void Caldoria::takeElevator(uint startFloor, uint endFloor) { 1692 2210 case 2: 1693 2211 _croppedMovie.setTime(k4To2Time); 1694 2212 _croppedMovie.redrawMovieWorld(); 1695 requestSpotSound(kCaldoriaNoOtherDestinationIn, kCaldoriaNoOtherDestinationOut, kFilterNoInput, kSpotSoundCompletedFlag);2213 playMissingFloorSound(); 1696 2214 break; 1697 2215 case 3: 1698 2216 _croppedMovie.setTime(k4To3Time); 1699 2217 _croppedMovie.redrawMovieWorld(); 1700 requestSpotSound(kCaldoriaNoOtherDestinationIn, kCaldoriaNoOtherDestinationOut, kFilterNoInput, kSpotSoundCompletedFlag);2218 playMissingFloorSound(); 1701 2219 break; 1702 2220 case 4: 1703 2221 // Do nothing. … … void Caldoria::takeElevator(uint startFloor, uint endFloor) { 1721 2239 case 2: 1722 2240 _croppedMovie.setTime(k5To2Time); 1723 2241 _croppedMovie.redrawMovieWorld(); 1724 requestSpotSound(kCaldoriaNoOtherDestinationIn, kCaldoriaNoOtherDestinationOut, kFilterNoInput, kSpotSoundCompletedFlag);2242 playMissingFloorSound(); 1725 2243 break; 1726 2244 case 3: 1727 2245 _croppedMovie.setTime(k5To3Time); 1728 2246 _croppedMovie.redrawMovieWorld(); 1729 requestSpotSound(kCaldoriaNoOtherDestinationIn, kCaldoriaNoOtherDestinationOut, kFilterNoInput, kSpotSoundCompletedFlag);2247 playMissingFloorSound(); 1730 2248 break; 1731 2249 case 4: 1732 2250 _croppedMovie.setSegment(k5To4Start, k5To4Stop); … … Common::String Caldoria::getSoundSpotsName() { 1984 2502 return "Sounds/Caldoria/Caldoria Spots"; 1985 2503 } 1986 2504 2505 void Caldoria::doArthurJoyride() { 2506 Video::VideoDecoder *video = 0; 2507 BiochipItem *item; 2508 2509 setNextHandler(_vm); 2510 throwAwayInterface(); 2511 loadLoopSound1(""); 2512 2513 _vm->_cursor->hide(); 2514 2515 #ifdef USE_THEORADEC 2516 video = new Video::TheoraDecoder(); 2517 if (!video->loadFile("Images/Caldoria/A12RD.ogg")) { 2518 delete video; 2519 video = 0; 2520 } 2521 #endif 2522 2523 if (!video) { 2524 video = new Video::QuickTimeDecoder(); 2525 if (!video->loadFile("Images/Caldoria/A12RD.movie")) 2526 error("Could not load joyride video"); 2527 } 2528 2529 video->setVolume(MIN<uint>(_vm->getSoundFXLevel(), 0xFF)); 2530 video->start(); 2531 2532 while (!_vm->shouldQuit() && !video->endOfVideo()) { 2533 if (video->needsUpdate()) { 2534 const Graphics::Surface *frame = video->decodeNextFrame(); 2535 2536 if (frame) { 2537 g_system->copyRectToScreen((const byte *)frame->getPixels(), frame->pitch, 0, 0, frame->w, frame->h); 2538 g_system->updateScreen(); 2539 } 2540 } 2541 2542 Common::Event event; 2543 while (g_system->getEventManager()->pollEvent(event)) 2544 ; 2545 2546 g_system->delayMillis(10); 2547 } 2548 2549 delete video; 2550 2551 if (_vm->shouldQuit()) 2552 return; 2553 2554 reinstateMonocleInterface(); 2555 loadAmbientLoops(); 2556 updateViewFrame(); 2557 if (!_vm->playerHasItemID(kArthurBiochip)) { 2558 item = (BiochipItem *)_vm->getAllItems().findItemByID(kArthurBiochip); 2559 _vm->addItemToBiochips(item); 2560 if (g_arthurChip) 2561 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA06", kArthurCaldoriaFinishedJoyride); 2562 } 2563 g_interface->setCurrentBiochipID(kArthurBiochip); 2564 GameState.setEasterEgg(false); 2565 } 2566 1987 2567 } // End of namespace Pegasus -
engines/pegasus/neighborhood/caldoria/caldoria.h
diff --git a/engines/pegasus/neighborhood/caldoria/caldoria.h b/engines/pegasus/neighborhood/caldoria/caldoria.h index 3d6a155..982789f 100644
a b static const HotSpotID kCaldoriaRoofElevatorSpotID = 5065; 195 195 static const HotSpotID kCaldoriaRoofDoorSpotID = 5066; 196 196 static const HotSpotID kCaldoriaRoofCardDropSpotID = 5067; 197 197 static const HotSpotID kCaldoria53EastSinclairTargetSpotID = 5068; 198 static const HotSpotID kCaldoriaCornbread = 5069; 198 199 199 200 // Extra sequence IDs. 200 201 … … static const DisplayElementID kCaldoriaUtilityID = kCaldoriaMessagesID + 1; 383 384 static const DisplayElementID kCaldoriaBombGridID = kCaldoriaUtilityID + 1; 384 385 static const DisplayElementID kCaldoriaBombTimerID = kCaldoriaBombGridID + 1; 385 386 387 static const TimeValue kCaldoria4DInstructionsIn = 28013; 388 static const TimeValue kCaldoria4DInstructionsOut = 29730; 389 386 390 static const TimeValue kCaldoria4DBlankChoiceIn = 29730; 387 391 static const TimeValue kCaldoria4DBlankChoiceOut = 33910; 388 392 … … protected: 445 449 446 450 void init(); 447 451 void start(); 452 void throwAwayInterface(); 448 453 449 454 void setUpRoofTop(); 450 455 … … protected: 472 477 void arriveAtCaldoriaDeath(); 473 478 void turnTo(const DirectionConstant); 474 479 void zoomTo(const Hotspot *); 480 void leftButton(const Input &); 481 void rightButton(const Input &); 475 482 void downButton(const Input &); 483 void startExtraSequence(const ExtraID, const NotificationFlags, const InputBits); 476 484 void receiveNotification(Notification *, const NotificationFlags); 477 485 InputBits getInputFilter(); 478 486 void activateHotspots(); … … protected: 483 491 484 492 Hotspot *getItemScreenSpot(Item *, DisplayElement *); 485 493 void dropItemIntoRoom(Item *, Hotspot *); 494 void playMissingFloorSound(); 486 495 void takeElevator(uint, uint); 487 496 void updateElevatorMovie(); 488 497 void openElevatorMovie(); … … protected: 495 504 void zoomToSinclair(); 496 505 void playEndMessage(); 497 506 void checkInterruptSinclair(); 507 void doArthurJoyride(); 498 508 509 void cantMoveThatWay(CanMoveForwardReason); 499 510 CanOpenDoorReason canOpenDoor(DoorTable::Entry &); 500 511 void doorOpened(); 501 512 … … protected: 505 516 506 517 const Hotspot *_zoomOutSpot; 507 518 519 Hotspot _laundryZoomInSpot; 520 Hotspot _laundryZoomOutSpot; 521 Hotspot _cornbreadSpot; 522 523 Movie _extraMovie; 524 NotificationCallBack _extraMovieCallBack; 525 526 bool _lookingAtLaundry; 527 508 528 FuseFunction _utilityFuse; 509 529 510 530 long _sinclairLoopCount; -
engines/pegasus/neighborhood/caldoria/caldoria4dsystem.cpp
diff --git a/engines/pegasus/neighborhood/caldoria/caldoria4dsystem.cpp b/engines/pegasus/neighborhood/caldoria/caldoria4dsystem.cpp index 0494753..a4b0276 100644
a b void Caldoria4DSystem::useIdleTime() { 210 210 void Caldoria4DSystem::initInteraction() { 211 211 setSpritesMovie(); 212 212 213 _owner->loadLoopSound1("Sounds/Caldoria/Rock.aiff"); 213 playSound("Rock"); 214 _owner->playSpotSoundSync(kCaldoria4DInstructionsIn, kCaldoria4DInstructionsOut); 214 215 loopExtra(k4DIslandLoop); 215 216 } 216 217 … … void Caldoria4DSystem::handleInput(const Input &input, const Hotspot *cursorSpot 243 244 244 245 void Caldoria4DSystem::activateHotspots() { 245 246 GameInteraction::activateHotspots(); 246 if (_whichMenu == k4DAudioMenu) 247 g_allHotspots.activateOneHotspot(kCa4DChoice4SpotID); 247 g_allHotspots.activateOneHotspot(kCa4DChoice4SpotID); 248 248 } 249 249 250 250 void Caldoria4DSystem::clickInHotspot(const Input &input, const Hotspot *spot) { … … void Caldoria4DSystem::makeRockChoice() { 335 335 if (_audioChoice != k4DRockChoice) { 336 336 _audioChoice = k4DRockChoice; 337 337 setSpritesMovie(); 338 _owner->loadLoopSound1("Sounds/Caldoria/Rock.aiff");338 playSound("Rock"); 339 339 } 340 340 } 341 341 … … void Caldoria4DSystem::makeOrchestralChoice() { 343 343 if (_audioChoice != k4DOrchestralChoice) { 344 344 _audioChoice = k4DOrchestralChoice; 345 345 setSpritesMovie(); 346 _owner->loadLoopSound1("Sounds/Caldoria/Orchestral.aiff");346 playSound("Orchestral"); 347 347 } 348 348 } 349 349 … … void Caldoria4DSystem::makeRhythmsChoice() { 351 351 if (_audioChoice != k4DRhythmsChoice) { 352 352 _audioChoice = k4DRhythmsChoice; 353 353 setSpritesMovie(); 354 _owner->loadLoopSound1("Sounds/Caldoria/Rhythms.aiff");354 playSound("Rhythms"); 355 355 } 356 356 } 357 357 … … void Caldoria4DSystem::makeAcousticChoice() { 359 359 if (_audioChoice != k4DAcousticChoice) { 360 360 _audioChoice = k4DAcousticChoice; 361 361 setSpritesMovie(); 362 _owner->loadLoopSound1("Sounds/Caldoria/Acoustic.aiff");362 playSound("Acoustic"); 363 363 } 364 364 } 365 365 … … void Caldoria4DSystem::shutDown4DSystem() { 367 367 _whichMenu = k4DShuttingDown; 368 368 } 369 369 370 void Caldoria4DSystem::playSound(const Common::String &baseFileName) { 371 Common::String fileName = "Sounds/Caldoria/" + baseFileName; 372 373 // Updated DVD files 374 if (((PegasusEngine *)g_engine)->isDVD()) 375 fileName += ".44K"; 376 377 _owner->loadLoopSound1(fileName + ".aiff"); 378 } 379 370 380 } // End of namespace Pegasus -
engines/pegasus/neighborhood/caldoria/caldoria4dsystem.h
diff --git a/engines/pegasus/neighborhood/caldoria/caldoria4dsystem.h b/engines/pegasus/neighborhood/caldoria/caldoria4dsystem.h index 1c5fa44..0d57d7c 100644
a b protected: 63 63 void useIdleTime(); 64 64 void loopExtra(const ExtraID); 65 65 66 void playSound(const Common::String &baseFileName); 67 66 68 Movie _4DSpritesMovie; 67 69 TimeScale _4DSpritesScale; 68 70 uint _whichMenu; -
engines/pegasus/neighborhood/caldoria/caldoriabomb.cpp
diff --git a/engines/pegasus/neighborhood/caldoria/caldoriabomb.cpp b/engines/pegasus/neighborhood/caldoria/caldoriabomb.cpp index abf34d3..adfd77d 100644
a b 25 25 26 26 #include "pegasus/gamestate.h" 27 27 #include "pegasus/pegasus.h" 28 #include "pegasus/items/biochips/arthurchip.h" 28 29 #include "pegasus/neighborhood/caldoria/caldoria.h" 29 30 #include "pegasus/neighborhood/caldoria/caldoriabomb.h" 30 31 … … static const uint32 kOnTime3 = kOffTime2 + kFlashOnTime; 48 49 static const uint32 kOffTime3 = kOnTime3 + kFlashOffTime; 49 50 static const uint32 kOnTime4 = kOffTime3 + kFlashOnTime; 50 51 51 static const HotSpotID kVertextHotSpotBaseID = 10000; 52 // Bomb hotspots start at 20000 since the extra Caldoria hotspots start at 10000. 53 // Assigning these vice versa causes a hotspot in level 4 to never activate for some reason. 54 static const HotSpotID kVertextHotSpotBaseID = 20000; 52 55 53 56 static const CoordType kVertextHotSpotWidth = 24; 54 57 static const CoordType kVertextHotSpotHeight = 24; … … void CaldoriaBomb::receiveNotification(Notification *notification, const Notific 1235 1238 _currentLevel = 0; 1236 1239 _lastVertex = -1; 1237 1240 startBombAmbient("Sounds/Caldoria/BmbLoop1.22K.AIFF"); 1241 if (g_arthurChip) { 1242 if (((PegasusEngine *)g_engine)->getRandomBit()) 1243 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA14", kArthurCaldoriaSeeRoofBomb); 1244 else 1245 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBB28", kArthurCaldoriaSeeRoofBomb); 1246 } 1238 1247 break; 1239 1248 case kCaldoria56BombStage2: 1240 1249 case kCaldoria56BombStage3: … … void CaldoriaBomb::handleInput(const Input &input, const Hotspot *hotspot) { 1412 1421 _grid.hide(); 1413 1422 _timer.hide(); 1414 1423 _owner->startExtraSequence(kCaldoria56BombStage7, kExtraCompletedFlag, kFilterNoInput); 1424 if (g_arthurChip) 1425 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA02", kArthurCaldoriaDisarmedNuke); 1415 1426 break; 1416 1427 } 1417 1428 } -
engines/pegasus/neighborhood/caldoria/caldoriamirror.cpp
diff --git a/engines/pegasus/neighborhood/caldoria/caldoriamirror.cpp b/engines/pegasus/neighborhood/caldoria/caldoriamirror.cpp index ff4d181..9f487cb 100644
a b 25 25 26 26 #include "pegasus/gamestate.h" 27 27 #include "pegasus/pegasus.h" 28 #include "pegasus/items/biochips/arthurchip.h" 28 29 #include "pegasus/neighborhood/neighborhood.h" 29 30 #include "pegasus/neighborhood/caldoria/caldoria.h" 30 31 #include "pegasus/neighborhood/caldoria/caldoriamirror.h" … … void CaldoriaMirror::openInteraction() { 42 43 void CaldoriaMirror::initInteraction() { 43 44 _owner->setCurrentActivation(kActivateMirrorReady); 44 45 _owner->startExtraSequence(kCaBathroomGreeting, kExtraCompletedFlag, kFilterNoInput); 46 // The original made the player click to start each of the following sequences, 47 // which was unnecessary, so it is automated here. 48 _owner->startExtraSequenceSync(kCaBathroomGreeting, kFilterNoInput); 49 _owner->startExtraSequenceSync(kCaBathroomBodyFat, kFilterNoInput); 50 _owner->startExtraSequence(kCaBathroomStylistIntro, kExtraCompletedFlag, kFilterNoInput); 45 51 } 46 52 47 53 void CaldoriaMirror::closeInteraction() { … … void CaldoriaMirror::activateHotspots() { 79 85 80 86 void CaldoriaMirror::clickInHotspot(const Input &input, const Hotspot *spot) { 81 87 switch (spot->getObjectID()) { 82 case kCaBathroomMirrorSpotID: 83 switch (_owner->getLastExtra()) { 84 case kCaBathroomGreeting: 85 _owner->startExtraSequence(kCaBathroomBodyFat, kExtraCompletedFlag, kFilterNoInput); 86 break; 87 case kCaBathroomBodyFat: 88 _owner->startExtraSequence(kCaBathroomStylistIntro, kExtraCompletedFlag, kFilterNoInput); 89 break; 90 case kCaBathroomRetrothrash: 91 _owner->startExtraSequence(kCaBathroomRetrothrashReturn, kExtraCompletedFlag, kFilterNoInput); 92 break; 93 case kCaBathroomGeoWave: 94 _owner->startExtraSequence(kCaBathroomGeoWaveReturn, kExtraCompletedFlag, kFilterNoInput); 95 break; 96 } 97 break; 88 // The original made the player click through several interstitial screens before 89 // reaching the hairstyle menu, which was unnecessary, so it's skipped here. 98 90 case kCaHairStyle1SpotID: 99 _owner->startExtraSequence(kCaBathroomRetrothrash, kExtraCompletedFlag, kFilterNoInput); 91 _owner->startExtraSequenceSync(kCaBathroomRetrothrash, kFilterNoInput); 92 _owner->startExtraSequence(kCaBathroomRetrothrashReturn, kExtraCompletedFlag, kFilterNoInput); 100 93 break; 101 94 case kCaHairStyle2SpotID: 102 95 _owner->startExtraSequence(kCaBathroomAgencyStandard, kExtraCompletedFlag, kFilterNoInput); 103 96 break; 104 97 case kCaHairStyle3SpotID: 105 _owner->startExtraSequence(kCaBathroomGeoWave, kExtraCompletedFlag, kFilterNoInput); 98 _owner->startExtraSequenceSync(kCaBathroomGeoWave, kFilterNoInput); 99 _owner->startExtraSequence(kCaBathroomGeoWaveReturn, kExtraCompletedFlag, kFilterNoInput); 106 100 break; 107 101 default: 108 102 GameInteraction::clickInHotspot(input, spot); … … void CaldoriaMirror::receiveNotification(Notification *, const NotificationFlags 126 120 _owner->requestDeleteCurrentInteraction(); 127 121 GameState.setScoringFixedHair(true); 128 122 GameState.setCaldoriaDoneHygiene(true); 123 if (g_arthurChip) 124 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA43", kArthurCaldoriaChoseAgencyHairStyle); 129 125 break; 130 126 } 131 132 allowInput(true);133 127 } 134 128 135 129 } // End of namespace Pegasus -
new file engines/pegasus/neighborhood/mars/canyonchase.cpp
diff --git a/engines/pegasus/neighborhood/mars/canyonchase.cpp b/engines/pegasus/neighborhood/mars/canyonchase.cpp new file mode 100644 index 0000000..4435998
- + 1 /* ScummVM - Graphic Adventure Engine 2 * 3 * ScummVM is the legal property of its developers, whose names 4 * are too numerous to list here. Please refer to the COPYRIGHT 5 * file distributed with this source distribution. 6 * 7 * Additional copyright for this file: 8 * Copyright (C) 1995-2013 Presto Studios, Inc. 9 * 10 * This program is free software; you can redistribute it and/or 11 * modify it under the terms of the GNU General Public License 12 * as published by the Free Software Foundation; either version 2 13 * of the License, or (at your option) any later version. 14 15 * This program is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU General Public License for more details. 19 20 * You should have received a copy of the GNU General Public License 21 * along with this program; if not, write to the Free Software 22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 23 * 24 */ 25 26 #include "pegasus/pegasus.h" 27 #include "pegasus/neighborhood/mars/canyonchase.h" 28 #include "pegasus/neighborhood/mars/mars.h" 29 30 namespace Pegasus { 31 32 // Segment start and end points. 33 34 static const TimeValue kPrepStart = 0; 35 static const TimeValue kPrepEnd = 3000; 36 static const TimeValue kLaunchStart = kPrepEnd; 37 static const TimeValue kLaunchEnd = 6640; 38 static const TimeValue kBranch1Start = kLaunchEnd; 39 static const TimeValue kBranch1End = 22240; 40 static const TimeValue kBranch2Start = kBranch1End; 41 static const TimeValue kBranch2End = 28440; 42 static const TimeValue kBranch3Start = kBranch2End; 43 static const TimeValue kBranch3End = 38640; 44 static const TimeValue kBranch4Start = kBranch3End; 45 static const TimeValue kBranch4End = 43880; 46 static const TimeValue kBranch5Start = kBranch4End; 47 static const TimeValue kBranch5End = 58680; 48 static const TimeValue kExitStart = kBranch5End; 49 static const TimeValue kExitEnd = 66480; 50 static const TimeValue kExitLoopPoint = 66200; 51 static const TimeValue kExitGenoPoint = 62560; 52 53 // Death start and end points. 54 55 static const TimeValue kDeath1Start = 0; 56 static const TimeValue kDeath1End = 2400; 57 static const TimeValue kDeath2Start = kDeath1End; 58 static const TimeValue kDeath2End = 4720; 59 static const TimeValue kDeath3Start = kDeath2End; 60 static const TimeValue kDeath3End = 7120; 61 static const TimeValue kDeath4Start = kDeath3End; 62 static const TimeValue kDeath4End = 9280; 63 static const TimeValue kDeath5Start = kDeath4End; 64 static const TimeValue kDeath5End = 12000; 65 66 // Chase state. 67 68 enum { 69 kCanyonLaunch, 70 kCanyonBranch1Left, 71 kCanyonBranch1Right, 72 kCanyonBranch2Left, 73 kCanyonBranch2Right, 74 kCanyonBranch3Left, 75 kCanyonBranch4Left, 76 kCanyonBranch4Right, 77 kCanyonBranch5Left, 78 kCanyonBranch5Right, 79 kCanyonExit, 80 kCanyonLoop 81 }; 82 83 void MusicTimerEvent::fire() { 84 canyonChase->musicTimerExpired(*this); 85 } 86 87 CanyonChase::CanyonChase(Neighborhood *handler) : ChaseInteraction(kMarsCanyonChaseInteractionID, handler, 88 kMarsCanyonChaseNotificationID, (PegasusEngine *)g_engine), _canyonMovie1(kNoDisplayElement), 89 _canyonMovie2(kNoDisplayElement), _deathMovie(kNoDisplayElement), _genoMovie(kNoDisplayElement) { 90 _currentMovie = NULL; 91 _currentCallBack = NULL; 92 } 93 94 void CanyonChase::startCanyonMusicLoop(void) { 95 FaderMoveSpec spec; 96 97 _musicLoop.loopSound(); 98 spec.makeTwoKnotFaderSpec(10, 0, 0, 1, 255); 99 _musicFader.startFader(spec); 100 } 101 102 void CanyonChase::stopCanyonMusicLoop(const long ticks) { 103 FaderMoveSpec spec; 104 105 spec.makeTwoKnotFaderSpec(10, 0, 255, ticks, 0); 106 _musicFader.startFader(spec); 107 } 108 109 void CanyonChase::openInteraction() { 110 _canyonMovie1.initFromMovieFile("Images/Mars/Canyon_hq1.mov"); 111 _canyonMovie1.setVolume(((PegasusEngine *)g_engine)->getSoundFXLevel()); 112 _canyonMovie1.moveElementTo(kShuttleWindowLeft, kShuttleWindowTop); 113 _canyonMovie1.setDisplayOrder(kShuttleMonitorOrder); 114 115 _canyon1CallBack.setNotification(&_chaseNotification); 116 _canyon1CallBack.initCallBack(&_canyonMovie1, kCallBackAtExtremes); 117 _canyon1CallBack.setCallBackFlag(kChaseEnteredBranchZone); 118 _canyon1CallBack.scheduleCallBack(kTriggerAtStop, 0, 0); 119 120 _canyonMovie2.initFromMovieFile("Images/Mars/Canyon_hq2.mov"); 121 _canyonMovie2.setVolume(((PegasusEngine *)g_engine)->getSoundFXLevel()); 122 _canyonMovie2.moveElementTo(kShuttleWindowLeft, kShuttleWindowTop); 123 _canyonMovie2.setDisplayOrder(kShuttleMonitorOrder); 124 125 _canyon2CallBack.setNotification(&_chaseNotification); 126 _canyon2CallBack.initCallBack(&_canyonMovie2, kCallBackAtExtremes); 127 _canyon2CallBack.setCallBackFlag(kChaseEnteredBranchZone); 128 _canyon2CallBack.scheduleCallBack(kTriggerAtStop, 0, 0); 129 130 _deathMovie.initFromMovieFile("Images/Mars/Canyon_hqD.mov"); 131 _deathMovie.setVolume(((PegasusEngine *)g_engine)->getSoundFXLevel()); 132 _deathMovie.moveElementTo(kShuttleWindowLeft, kShuttleWindowTop); 133 _deathMovie.setDisplayOrder(kShuttleMonitorOrder); 134 135 _deathCallBack.setNotification(&_chaseNotification); 136 _deathCallBack.initCallBack(&_deathMovie, kCallBackAtExtremes); 137 _deathCallBack.setCallBackFlag(kChaseFinished); 138 _deathCallBack.scheduleCallBack(kTriggerAtStop, 0, 0); 139 140 _musicLoop.attachFader(&_musicFader); 141 _musicLoop.initFromAIFFFile("Sounds/Mars/Canyon Loop.44K.16.AIFF"); 142 _musicFader.setMasterVolume(((PegasusEngine *)g_engine)->getSoundFXLevel()); 143 144 ChaseInteraction::openInteraction(); 145 146 _steerPict.setDisplayOrder(kShuttleMonitorOrder + 1); 147 _steerPict.moveElementTo(kShuttleSteerLeft, kShuttleSteerTop); 148 } 149 150 void CanyonChase::initInteraction() { 151 _steerPict.startDisplaying(); 152 153 // Launch branch is identical in both movies 154 _canyonState = kCanyonLaunch; 155 _canyonMovie1.setSegment(kLaunchStart, kLaunchEnd - kDecisionTime); 156 _canyonMovie1.setTime(kLaunchStart); 157 switchTo(_canyonMovie1, _canyon1CallBack); 158 startCanyonMusicLoop(); 159 ChaseInteraction::initInteraction(); 160 } 161 162 void CanyonChase::closeInteraction() { 163 _canyonMovie1.stop(); 164 _canyonMovie1.stopDisplaying(); 165 _canyonMovie1.releaseMovie(); 166 _canyon1CallBack.releaseCallBack(); 167 168 _canyonMovie2.stop(); 169 _canyonMovie2.stopDisplaying(); 170 _canyonMovie2.releaseMovie(); 171 _canyon2CallBack.releaseCallBack(); 172 173 _deathMovie.stop(); 174 _deathMovie.stopDisplaying(); 175 _deathMovie.releaseMovie(); 176 _deathCallBack.releaseCallBack(); 177 178 _genoMovie.stop(); 179 _genoMovie.stopDisplaying(); 180 _genoMovie.releaseMovie(); 181 _genoCallBack.releaseCallBack(); 182 183 ChaseInteraction::closeInteraction(); 184 } 185 186 void CanyonChase::receiveNotification(Notification *notification, const NotificationFlags flags) { 187 Input input; 188 189 if (notification == &_chaseNotification && flags == kChaseFinished) { 190 if (_canyonState == kCanyonLoop) { 191 // Swallow the notification if we loop back to the beginning 192 InputDevice.getInput(input, kFilterAllInput); 193 if (JMPPPInput::isEasterEggModifierInput(input)) { 194 stopCanyonMusicLoop(15); 195 doGenoChase(); 196 } else { 197 _canyonMovie2.setSegment(kExitGenoPoint, kExitLoopPoint - kDecisionTime); 198 _canyonMovie2.setTime(kExitGenoPoint); 199 switchTo(_canyonMovie2, _canyon2CallBack); 200 _canyon2CallBack.setCallBackFlag(kChaseEnteredBranchZone); 201 _canyon2CallBack.scheduleCallBack(kTriggerAtStop, 0, 0); 202 _canyonState = kCanyonLaunch; 203 } 204 return; 205 } else if (_canyonState != kCanyonExit) { 206 // We died 207 ((Mars *)_owner)->die(kDeathRanIntoCanyonWall); 208 } 209 } 210 ChaseInteraction::receiveNotification(notification, flags); 211 } 212 213 void CanyonChase::setUpBranch() { 214 TimeValue branchStart, branchEnd; 215 216 branchStart = 0; 217 branchEnd = 0; 218 switch (_canyonState) { 219 case kCanyonLaunch: 220 case kCanyonExit: 221 branchStart = kLaunchEnd - kDecisionTime; 222 branchEnd = kLaunchEnd; 223 break; 224 case kCanyonBranch1Left: 225 case kCanyonBranch1Right: 226 branchStart = kBranch1End - kDecisionTime; 227 branchEnd = kBranch1End; 228 break; 229 case kCanyonBranch2Left: 230 case kCanyonBranch2Right: 231 branchStart = kBranch2End - kDecisionTime; 232 branchEnd = kBranch2End; 233 break; 234 case kCanyonBranch3Left: 235 branchStart = kBranch3End - kDecisionTime; 236 branchEnd = kBranch3End; 237 break; 238 case kCanyonBranch4Left: 239 case kCanyonBranch4Right: 240 branchStart = kBranch4End - kDecisionTime; 241 branchEnd = kBranch4End; 242 break; 243 case kCanyonBranch5Left: 244 case kCanyonBranch5Right: 245 branchStart = kBranch5End - kDecisionTime; 246 branchEnd = kBranch5End; 247 break; 248 default: 249 break; 250 } 251 252 _currentMovie->setSegment(branchStart, branchEnd); 253 // Need to call SetTime here in case we loop 254 _currentMovie->setTime(branchStart); 255 256 _currentCallBack->setCallBackFlag(kChaseExitedBranchZone); 257 _currentCallBack->scheduleCallBack(kTriggerAtStop, 0, 0); 258 } 259 260 void CanyonChase::branchLeft() { 261 TimeValue branchStart, branchEnd; 262 Movie *movie; 263 NotificationCallBack *callBack; 264 265 branchStart = 0; 266 branchEnd = 0; 267 switch (_canyonState) { 268 case kCanyonLaunch: 269 branchStart = kBranch1Start; 270 branchEnd = kBranch1End - kDecisionTime; 271 _canyonState = kCanyonBranch1Left; 272 break; 273 case kCanyonBranch1Left: 274 case kCanyonBranch1Right: 275 branchStart = kBranch2Start; 276 branchEnd = kBranch2End - kDecisionTime; 277 _canyonState = kCanyonBranch2Left; 278 break; 279 case kCanyonBranch2Left: 280 case kCanyonBranch2Right: 281 branchStart = kBranch3Start; 282 branchEnd = kBranch3End - kDecisionTime; 283 _canyonState = kCanyonBranch3Left; 284 break; 285 case kCanyonBranch3Left: 286 branchStart = kBranch4Start; 287 branchEnd = kBranch4End - kDecisionTime; 288 _canyonState = kCanyonBranch4Left; 289 break; 290 case kCanyonBranch4Left: 291 case kCanyonBranch4Right: 292 branchStart = kBranch5Start; 293 branchEnd = kBranch5End - kDecisionTime; 294 _canyonState = kCanyonBranch5Left; 295 break; 296 case kCanyonBranch5Left: 297 case kCanyonBranch5Right: 298 dontBranch(); 299 return; 300 default: 301 break; 302 } 303 304 // Left branches are in hq2 (except exit) 305 // Segment 5 branches are switched 306 if (_canyonState == kCanyonBranch5Left || _canyonState == kCanyonBranch5Right) { 307 movie = &_canyonMovie1; 308 callBack = &_canyon1CallBack; 309 } else { 310 movie = &_canyonMovie2; 311 callBack = &_canyon2CallBack; 312 } 313 314 movie->setSegment(branchStart, branchEnd); 315 movie->setTime(branchStart); 316 317 switchTo(*movie, *callBack); 318 319 callBack->setCallBackFlag(kChaseEnteredBranchZone); 320 callBack->scheduleCallBack(kTriggerAtStop, 0, 0); 321 } 322 323 void CanyonChase::branchRight() { 324 TimeValue branchStart, branchEnd; 325 NotificationFlags flag; 326 Movie *movie; 327 NotificationCallBack *callBack; 328 329 branchStart = 0; 330 branchEnd = 0; 331 flag = 0; 332 switch (_canyonState) { 333 case kCanyonLaunch: 334 branchStart = kBranch1Start; 335 branchEnd = kBranch1End - kDecisionTime; 336 _canyonState = kCanyonBranch1Right; 337 flag = kChaseEnteredBranchZone; 338 break; 339 case kCanyonBranch1Left: 340 case kCanyonBranch1Right: 341 branchStart = kBranch2Start; 342 branchEnd = kBranch2End - kDecisionTime; 343 _canyonState = kCanyonBranch2Right; 344 flag = kChaseEnteredBranchZone; 345 break; 346 case kCanyonBranch2Left: 347 case kCanyonBranch2Right: 348 dontBranch(); 349 return; 350 case kCanyonBranch3Left: 351 branchStart = kBranch4Start; 352 branchEnd = kBranch4End - kDecisionTime; 353 _canyonState = kCanyonBranch4Right; 354 flag = kChaseEnteredBranchZone; 355 break; 356 case kCanyonBranch4Left: 357 case kCanyonBranch4Right: 358 branchStart = kBranch5Start; 359 branchEnd = kBranch5End - kDecisionTime; 360 _canyonState = kCanyonBranch5Right; 361 flag = kChaseEnteredBranchZone; 362 break; 363 case kCanyonBranch5Left: 364 case kCanyonBranch5Right: 365 // Exit loop branch is in hq2 366 branchStart = kExitStart; 367 branchEnd = kExitEnd; 368 _canyonState = kCanyonExit; 369 flag = kChaseFinished; 370 startMusicTimer(kCanyonChaseStart + kCanyonChaseExitedTime - kExitStart, kMovieTicksPerSecond, 371 kCanyonExited); 372 break; 373 default: 374 break; 375 } 376 377 // Right branches are in hq1 (except exit) 378 // Segment 5 branches are switched 379 if (_canyonState == kCanyonBranch5Left || _canyonState == kCanyonBranch5Right) { 380 movie = &_canyonMovie2; 381 callBack = &_canyon2CallBack; 382 } else { 383 movie = &_canyonMovie1; 384 callBack = &_canyon1CallBack; 385 } 386 387 movie->setSegment(branchStart, branchEnd); 388 movie->setTime(branchStart); 389 390 switchTo(*movie, *callBack); 391 392 callBack->setCallBackFlag(flag); 393 callBack->scheduleCallBack(kTriggerAtStop, 0, 0); 394 } 395 396 void CanyonChase::dontBranch() { 397 TimeValue branchStart, branchEnd; 398 399 branchStart = 0; 400 branchEnd = 0; 401 switch (_canyonState) { 402 case kCanyonLaunch: 403 branchStart = kDeath1Start; 404 branchEnd = kDeath1End; 405 break; 406 case kCanyonBranch1Left: 407 case kCanyonBranch1Right: 408 branchStart = kDeath2Start; 409 branchEnd = kDeath2End; 410 break; 411 case kCanyonBranch2Left: 412 case kCanyonBranch2Right: 413 branchStart = kDeath3Start; 414 branchEnd = kDeath3End; 415 break; 416 case kCanyonBranch3Left: 417 branchStart = kDeath4Start; 418 branchEnd = kDeath4End; 419 break; 420 case kCanyonBranch4Left: 421 case kCanyonBranch4Right: 422 branchStart = kDeath5Start; 423 branchEnd = kDeath5End; 424 break; 425 case kCanyonBranch5Left: 426 case kCanyonBranch5Right: 427 _canyonMovie2.setSegment(kExitStart, kExitGenoPoint); 428 _canyonMovie2.setTime(kExitStart); 429 switchTo(_canyonMovie2, _canyon2CallBack); 430 _canyon2CallBack.setCallBackFlag(kChaseFinished); 431 _canyon2CallBack.scheduleCallBack(kTriggerAtStop, 0, 0); 432 _canyonState = kCanyonLoop; 433 return; 434 default: 435 break; 436 } 437 438 _deathMovie.setSegment(branchStart, branchEnd); 439 _deathMovie.setTime(branchStart); 440 441 switchTo(_deathMovie, _deathCallBack); 442 443 startMusicTimer(10, 10, kCanyonRanIntoWall); 444 } 445 446 void CanyonChase::showControlsHint() { 447 ((Mars *)_owner)->_lowerLeftShuttleMovie.setTime(kShuttleLowerLeftKeypadHintTime); 448 ((Mars *)_owner)->_lowerLeftShuttleMovie.redrawMovieWorld(); 449 ChaseInteraction::showControlsHint(); 450 } 451 452 void CanyonChase::hideControlsHint() { 453 ((Mars *)_owner)->_lowerLeftShuttleMovie.setTime(kShuttleLowerLeftCollisionTime); 454 ((Mars *)_owner)->_lowerLeftShuttleMovie.redrawMovieWorld(); 455 ChaseInteraction::hideControlsHint(); 456 } 457 458 void CanyonChase::switchTo(Movie &movie, NotificationCallBack &callBack) { 459 if (_currentMovie != &movie) { 460 if (_currentMovie != NULL) { 461 _currentMovie->stop(); 462 _currentMovie->hide(); 463 _currentMovie->stopDisplaying(); 464 } 465 466 _currentMovie = &movie; 467 468 _currentMovie->startDisplaying(); 469 _currentMovie->show(); 470 _currentMovie->start(); 471 } 472 473 if (_currentCallBack != &callBack) { 474 _currentCallBack = &callBack; 475 } 476 } 477 478 void CanyonChase::startMusicTimer(TimeValue time, TimeScale scale, MusicTimerCode code) { 479 _musicFuse.primeFuse(time, scale); 480 _musicEvent.canyonChase = this; 481 _musicEvent.theEvent = code; 482 _musicFuse.setFunctor(new Common::Functor0Mem<void, MusicTimerEvent>(&_musicEvent, &MusicTimerEvent::fire)); 483 _musicFuse.lightFuse(); 484 } 485 486 void CanyonChase::musicTimerExpired(MusicTimerEvent &event) { 487 FaderMoveSpec spec; 488 489 switch (event.theEvent) { 490 case kCanyonRanIntoWall: 491 stopCanyonMusicLoop(5); 492 break; 493 case kCanyonExited: 494 spec.makeTwoKnotFaderSpec(20, 0, 255, 5, 160); 495 _musicFader.startFader(spec); 496 startMusicTimer(kCanyonChaseFadedTime, kMovieTicksPerSecond, kCanyonFaded); 497 break; 498 case kCanyonFaded: 499 spec.makeTwoKnotFaderSpec(10, 0, 160, 30, 0); 500 _musicFader.startFader(spec); 501 ((Mars *)_owner)->startMarsTimer(kLaunchTubeDVDReachedTime, kMovieTicksPerSecond, 502 kMarsLaunchTubeReached); 503 break; 504 default: 505 break; 506 } 507 } 508 509 void CanyonChase::doGenoChase() { 510 _genoMovie.initFromMovieFile("Images/Mars/Canyon_hqG.mov"); 511 _genoMovie.setVolume(((PegasusEngine *)g_engine)->getSoundFXLevel()); 512 _genoMovie.moveElementTo(kShuttleWindowLeft, kShuttleWindowTop); 513 _genoMovie.setDisplayOrder(kShuttleMonitorOrder); 514 _genoMovie.startDisplaying(); 515 _genoMovie.show(); 516 _genoMovie.start(); 517 518 _genoCallBack.setNotification(&_chaseNotification); 519 _genoCallBack.initCallBack(&_genoMovie, kCallBackAtExtremes); 520 _genoCallBack.setCallBackFlag(kChaseFinished); 521 _genoCallBack.scheduleCallBack(kTriggerAtStop, 0, 0); 522 523 _canyonState = kCanyonExit; 524 525 ((Mars *)_owner)->startMarsTimer(_genoMovie.getDuration() - 5 * kMovieTicksPerSecond, 526 kMovieTicksPerSecond, kMarsLaunchTubeReached); 527 } 528 529 } // End of namespace Pegasus -
new file engines/pegasus/neighborhood/mars/canyonchase.h
diff --git a/engines/pegasus/neighborhood/mars/canyonchase.h b/engines/pegasus/neighborhood/mars/canyonchase.h new file mode 100644 index 0000000..5b40c64
- + 1 /* ScummVM - Graphic Adventure Engine 2 * 3 * ScummVM is the legal property of its developers, whose names 4 * are too numerous to list here. Please refer to the COPYRIGHT 5 * file distributed with this source distribution. 6 * 7 * Additional copyright for this file: 8 * Copyright (C) 1995-2013 Presto Studios, Inc. 9 * 10 * This program is free software; you can redistribute it and/or 11 * modify it under the terms of the GNU General Public License 12 * as published by the Free Software Foundation; either version 2 13 * of the License, or (at your option) any later version. 14 15 * This program is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU General Public License for more details. 19 20 * You should have received a copy of the GNU General Public License 21 * along with this program; if not, write to the Free Software 22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 23 * 24 */ 25 26 #ifndef PEGASUS_NEIGHBORHOOD_MARS_CANYONCHASE_H 27 #define PEGASUS_NEIGHBORHOOD_MARS_CANYONCHASE_H 28 29 #include "pegasus/chase.h" 30 #include "pegasus/fader.h" 31 #include "pegasus/movie.h" 32 #include "pegasus/sound.h" 33 34 namespace Pegasus { 35 36 class CanyonChase; 37 class Mars; 38 39 enum MusicTimerCode { 40 kCanyonRanIntoWall, 41 kCanyonExited, 42 kCanyonFaded 43 }; 44 45 struct MusicTimerEvent { 46 CanyonChase *canyonChase; 47 MusicTimerCode theEvent; 48 49 void fire(); 50 }; 51 52 class CanyonChase : public ChaseInteraction { 53 friend class Mars; 54 friend struct MusicTimerEvent; 55 public: 56 57 CanyonChase(Neighborhood *); 58 virtual ~CanyonChase() {} 59 60 protected: 61 62 void startCanyonMusicLoop(); 63 void stopCanyonMusicLoop(const long); 64 65 void openInteraction(); 66 void initInteraction(); 67 void closeInteraction(); 68 69 void receiveNotification(Notification *, const NotificationFlags); 70 71 void setUpBranch(); 72 void branchLeft(); 73 void branchRight(); 74 void dontBranch(); 75 76 void showControlsHint(); 77 void hideControlsHint(); 78 79 void switchTo(Movie &, NotificationCallBack &); 80 void startMusicTimer(TimeValue, TimeScale, MusicTimerCode); 81 void musicTimerExpired(MusicTimerEvent &); 82 void doGenoChase(); 83 84 Movie _canyonMovie1; 85 Movie _canyonMovie2; 86 Movie _deathMovie; 87 Movie _genoMovie; 88 NotificationCallBack _canyon1CallBack; 89 NotificationCallBack _canyon2CallBack; 90 NotificationCallBack _deathCallBack; 91 NotificationCallBack _genoCallBack; 92 Sound _musicLoop; 93 SoundFader _musicFader; 94 FuseFunction _musicFuse; 95 96 MusicTimerEvent _musicEvent; 97 98 Movie *_currentMovie; 99 NotificationCallBack *_currentCallBack; 100 short _canyonState; 101 }; 102 103 } // End of namespace Pegasus 104 105 #endif -
engines/pegasus/neighborhood/mars/constants.h
diff --git a/engines/pegasus/neighborhood/mars/constants.h b/engines/pegasus/neighborhood/mars/constants.h index 82a7f03..f6c1724 100644
a b namespace Pegasus { 32 32 33 33 // Element Coordinates 34 34 35 static const CoordType kPodScreenLeft = kNavAreaLeft + 88; 36 static const CoordType kPodScreenTop = kNavAreaTop + 204; 37 38 static const CoordType kPodSteerLeft = kNavAreaLeft + 212; 39 static const CoordType kPodSteerTop = kNavAreaTop + 232; 40 35 41 static const CoordType kUndoHiliteLeft = kNavAreaLeft + 140; 36 42 static const CoordType kUndoHiliteTop = kNavAreaTop + 36; 37 43 … … static const CoordType kShuttleEnergyTop = 60; 99 105 static const CoordType kShuttleEnergyWidth = 252; 100 106 static const CoordType kShuttleEnergyHeight = 22; 101 107 108 static const CoordType kShuttleSteerLeft = kShuttleWindowLeft + 136; 109 static const CoordType kShuttleSteerTop = kShuttleWindowTop + 196; 110 102 111 static const CoordType kPlanetStartLeft = kShuttleWindowLeft; 103 112 static const CoordType kPlanetStartTop = kShuttleWindowTop + kShuttleWindowHeight; 104 113 … … static const TimeValue kShuttleSwingStart = 0; 130 139 static const TimeValue kShuttleSwingStop = 5 * 600; 131 140 132 141 static const TimeValue kCanyonChaseStart = kShuttleSwingStop; 133 static const TimeValue kCanyonChaseStop = 60 * 600 + 43 * 600 + 14 * 40; 134 135 static const TimeValue kLaunchTubeReachedTime = 60 * 600 + 38 * 600 - kCanyonChaseStart; 136 static const TimeValue kCanyonChaseFinishedTime = kCanyonChaseStop - kCanyonChaseStart - 137 kLaunchTubeReachedTime; 142 static const TimeValue kCanyonChaseCDStop = 60 * 600 + 43 * 600 + 14 * 40; 143 static const TimeValue kCanyonChaseDVDStop = 60 * 600 + 50 * 600 + 12 * 40; 144 145 static const TimeValue kCanyonChaseExitedTime = 60 * 600 + 40 * 600 + 13 * 40 - kCanyonChaseStart; 146 static const TimeValue kCanyonChaseFadedTime = 60 * 600 + 43 * 600 + 6 * 40 - kCanyonChaseStart - 147 kCanyonChaseExitedTime; 148 149 static const TimeValue kLaunchTubeCDReachedTime = 60 * 600 + 38 * 600 - kCanyonChaseStart; 150 static const TimeValue kLaunchTubeDVDReachedTime = 60 * 600 + 45 * 600 - kCanyonChaseStart - 151 kCanyonChaseExitedTime - kCanyonChaseFadedTime; 152 static const TimeValue kCanyonChaseCDFinishedTime = kCanyonChaseCDStop - kCanyonChaseStart - 153 kLaunchTubeCDReachedTime; 154 static const TimeValue kCanyonChaseDVDFinishedTime = kCanyonChaseDVDStop - kCanyonChaseStart - 155 kCanyonChaseExitedTime - kCanyonChaseFadedTime - 156 kLaunchTubeDVDReachedTime; 138 157 139 158 // Left shuttle. 140 159 … … static const TimeValue kShuttleLowerLeftTubeTime = 40; 183 202 184 203 static const TimeValue kShuttleLowerLeftAutopilotTime = 80; 185 204 205 static const TimeValue kShuttleLowerLeftKeypadHintTime = 120; 206 186 207 // Lower Right shuttle. 187 208 188 209 static const TimeValue kShuttleLowerRightOffTime = 0; … … static const ExtraID kMarsMaze184WestLoop = 109; 929 950 static const ExtraID kMarsMaze184WestDeath = 110; 930 951 static const ExtraID kMars200DeathInBucket = 111; 931 952 953 // Mars interactions. 954 955 static const InteractionID kMarsTunnelPodInteractionID = 0; 956 static const InteractionID kMarsCanyonChaseInteractionID = 1; 957 932 958 static const ResIDType kReactorUndoHilitePICTID = 900; 933 959 934 960 static const int16 kMars52Compass = 90; -
engines/pegasus/neighborhood/mars/mars.cpp
diff --git a/engines/pegasus/neighborhood/mars/mars.cpp b/engines/pegasus/neighborhood/mars/mars.cpp index 435bcd4..55e0ddc 100644
a b 25 25 26 26 #include "common/events.h" 27 27 #include "video/qt_decoder.h" 28 #include "video/theora_decoder.h" 28 29 29 30 #include "pegasus/cursor.h" 30 31 #include "pegasus/energymonitor.h" 31 32 #include "pegasus/gamestate.h" 32 33 #include "pegasus/pegasus.h" 33 34 #include "pegasus/ai/ai_area.h" 35 #include "pegasus/items/biochips/arthurchip.h" 34 36 #include "pegasus/items/biochips/opticalchip.h" 35 37 #include "pegasus/items/biochips/shieldchip.h" 36 38 #include "pegasus/items/inventory/airmask.h" 39 #include "pegasus/neighborhood/mars/canyonchase.h" 37 40 #include "pegasus/neighborhood/mars/mars.h" 41 #include "pegasus/neighborhood/mars/tunnelpod.h" 38 42 39 43 namespace Pegasus { 40 44 … … static const int16 kMarsShieldPanelOffsetAngle = 22; 44 48 45 49 static const CanMoveForwardReason kCantMoveRobotBlocking = kCantMoveLastReason + 1; 46 50 51 static const ExtraID kMarsRobotBobSlow = 1000; 52 static const ExtraID kMarsRobotGenoSlow = 1001; 53 47 54 static const NotificationFlags kTimeForCanyonChaseFlag = kLastNeighborhoodNotificationFlag << 1; 48 55 static const NotificationFlags kExplosionFinishedFlag = kTimeForCanyonChaseFlag << 1; 49 56 static const NotificationFlags kTimeToTransportFlag = kExplosionFinishedFlag << 1; … … static const NotificationFlags kMarsNotificationFlags = kTimeForCanyonChaseFlag 52 59 kExplosionFinishedFlag | 53 60 kTimeToTransportFlag; 54 61 62 static const TimeValue kBucketClimbInTime = 1393980; 63 static const TimeValue kBucketSeeGearRoomTime = 2240; 64 static const TimeValue kBucketClimbOutTime = 1340; 65 66 static const TimeValue kPodCautionDisplayedTime = 1631; 67 static const TimeValue kPodCautionDismissedTime = 3889; 68 55 69 static const TimeValue kLittleExplosionStart = 0 * 40; 56 70 static const TimeValue kLittleExplosionStop = 24 * 40; 57 71 … … void MarsTimerEvent::fire() { 90 104 } 91 105 92 106 Mars::Mars(InputHandler *nextHandler, PegasusEngine *owner) : Neighborhood(nextHandler, owner, "Mars", kMarsID), 93 _guessObject(kNoDisplayElement), _undoPict(kNoDisplayElement), _guessHistory(kNoDisplayElement), 94 _choiceHighlight(kNoDisplayElement), _shuttleInterface1(kNoDisplayElement), _shuttleInterface2(kNoDisplayElement), 95 _shuttleInterface3(kNoDisplayElement), _shuttleInterface4(kNoDisplayElement), _canyonChaseMovie(kNoDisplayElement), 96 _leftShuttleMovie(kNoDisplayElement), _rightShuttleMovie(kNoDisplayElement), _lowerLeftShuttleMovie(kNoDisplayElement), 97 _lowerRightShuttleMovie(kNoDisplayElement), _centerShuttleMovie(kNoDisplayElement), 98 _upperLeftShuttleMovie(kNoDisplayElement), _upperRightShuttleMovie(kNoDisplayElement), 99 _leftDamageShuttleMovie(kNoDisplayElement), _rightDamageShuttleMovie(kNoDisplayElement), _explosions(kNoDisplayElement), 100 _planetMovie(kNoDisplayElement), _junk(kNoDisplayElement), _energyChoiceSpot(kShuttleEnergySpotID), 101 _gravitonChoiceSpot(kShuttleGravitonSpotID), _tractorChoiceSpot(kShuttleTractorSpotID), 102 _shuttleViewSpot(kShuttleViewSpotID), _shuttleTransportSpot(kShuttleTransportSpotID) { 107 _extraMovie(kNoDisplayElement), _podSteerMovie(kNoDisplayElement), _guessObject(kNoDisplayElement), 108 _undoPict(kNoDisplayElement), _guessHistory(kNoDisplayElement), _choiceHighlight(kNoDisplayElement), 109 _shuttleInterface1(kNoDisplayElement), _shuttleInterface2(kNoDisplayElement), 110 _shuttleInterface3(kNoDisplayElement), _shuttleInterface4(kNoDisplayElement), 111 _canyonChaseMovie(kNoDisplayElement), _leftShuttleMovie(kNoDisplayElement), _rightShuttleMovie(kNoDisplayElement), 112 _lowerLeftShuttleMovie(kNoDisplayElement), _lowerRightShuttleMovie(kNoDisplayElement), 113 _centerShuttleMovie(kNoDisplayElement), _upperLeftShuttleMovie(kNoDisplayElement), 114 _upperRightShuttleMovie(kNoDisplayElement), _leftDamageShuttleMovie(kNoDisplayElement), 115 _rightDamageShuttleMovie(kNoDisplayElement), _explosions(kNoDisplayElement), _planetMovie(kNoDisplayElement), 116 _junk(kNoDisplayElement), _energyChoiceSpot(kShuttleEnergySpotID), _gravitonChoiceSpot(kShuttleGravitonSpotID), 117 _tractorChoiceSpot(kShuttleTractorSpotID), _shuttleViewSpot(kShuttleViewSpotID), 118 _shuttleTransportSpot(kShuttleTransportSpotID) { 103 119 _noAirFuse.setFunctor(new Common::Functor0Mem<void, Mars>(this, &Mars::airStageExpired)); 104 120 setIsItemTaken(kMarsCard); 105 121 setIsItemTaken(kAirMask); … … void Mars::init() { 126 142 127 143 _neighborhoodNotification.notifyMe(this, kMarsNotificationFlags, kMarsNotificationFlags); 128 144 145 _extraMovieCallBack.setNotification(&_neighborhoodNotification); 146 129 147 _explosionCallBack.setNotification(&_neighborhoodNotification); 130 148 _explosionCallBack.setCallBackFlag(kExplosionFinishedFlag); 131 149 132 150 _weaponSelection = kNoWeapon; 133 151 } 134 152 153 GameInteraction *Mars::makeInteraction(const InteractionID interactionID) { 154 switch (interactionID) { 155 case kMarsTunnelPodInteractionID: 156 return new TunnelPod(this); 157 case kMarsCanyonChaseInteractionID: 158 return new CanyonChase(this); 159 default: 160 return NULL; 161 } 162 } 163 135 164 void Mars::flushGameState() { 136 165 g_energyMonitor->saveCurrentEnergyValue(); 137 166 } … … void Mars::start() { 144 173 Neighborhood::start(); 145 174 } 146 175 176 class ArthurOxygen50Action : public AIPlayMessageAction { 177 public: 178 ArthurOxygen50Action(); 179 180 virtual void performAIAction(AIRule *); 181 }; 182 183 ArthurOxygen50Action::ArthurOxygen50Action() : AIPlayMessageAction("Images/AI/Mars/XMMAZB1", false, kWarningInterruption) { 184 } 185 186 void ArthurOxygen50Action::performAIAction(AIRule *rule) { 187 if (GameState.isTakenItemID(kArthurBiochip) && g_arthurChip && g_arthurChip->isChattyArthur()) 188 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA84", kArthurMarsOxygen50Warning); 189 else 190 AIPlayMessageAction::performAIAction(rule); 191 } 192 193 class ArthurOxygen25Action : public AIPlayMessageAction { 194 public: 195 ArthurOxygen25Action(); 196 197 virtual void performAIAction(AIRule *); 198 }; 199 200 ArthurOxygen25Action::ArthurOxygen25Action() : AIPlayMessageAction("Images/AI/Mars/XMMAZB2", false, kWarningInterruption) { 201 } 202 203 void ArthurOxygen25Action::performAIAction(AIRule *rule) { 204 if (GameState.isTakenItemID(kArthurBiochip) && g_arthurChip && g_arthurChip->isChattyArthur()) { 205 if (((PegasusEngine *)g_engine)->getRandomBit()) 206 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA85", kArthurMarsOxygen25Warning); 207 else 208 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA87", kArthurMarsOxygen25Warning); 209 } else { 210 AIPlayMessageAction::performAIAction(rule); 211 } 212 } 213 214 class ArthurOxygen5Action : public AIPlayMessageAction { 215 public: 216 ArthurOxygen5Action(); 217 218 virtual void performAIAction(AIRule *); 219 }; 220 221 ArthurOxygen5Action::ArthurOxygen5Action() : AIPlayMessageAction("Images/AI/Mars/XMMAZB3", false, kWarningInterruption) { 222 } 223 224 void ArthurOxygen5Action::performAIAction(AIRule *rule) { 225 if (GameState.isTakenItemID(kArthurBiochip) && g_arthurChip && g_arthurChip->isChattyArthur()) { 226 if (((PegasusEngine *)g_engine)->getRandomBit()) 227 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA86", kArthurMarsOxygen5Warning); 228 else 229 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA88", kArthurMarsOxygen5Warning); 230 } else { 231 AIPlayMessageAction::performAIAction(rule); 232 } 233 } 234 147 235 class AirMaskCondition : public AICondition { 148 236 public: 149 237 AirMaskCondition(const uint32); … … void Mars::setUpAIRules() { 210 298 g_AIArea->addAIRule(rule); 211 299 212 300 AirMaskCondition *airMask50Condition = new AirMaskCondition(50); 213 messageAction = new AIPlayMessageAction("Images/AI/Mars/XMMAZB1", false); 301 if (_vm->isDVD()) 302 messageAction = new ArthurOxygen50Action(); 303 else 304 messageAction = new AIPlayMessageAction("Images/AI/Mars/XMMAZB1", false); 214 305 AIRule *rule50 = new AIRule(airMask50Condition, messageAction); 215 306 216 307 AirMaskCondition *airMask25Condition = new AirMaskCondition(25); 217 308 AICompoundAction *compound = new AICompoundAction(); 218 messageAction = new AIPlayMessageAction("Images/AI/Mars/XMMAZB2", false); 309 if (_vm->isDVD()) 310 messageAction = new ArthurOxygen25Action(); 311 else 312 messageAction = new AIPlayMessageAction("Images/AI/Mars/XMMAZB2", false); 219 313 compound->addAction(messageAction); 220 314 deactivate = new AIDeactivateRuleAction(rule50); 221 315 compound->addAction(deactivate); … … void Mars::setUpAIRules() { 223 317 224 318 AirMaskCondition *airMask5Condition = new AirMaskCondition(5); 225 319 compound = new AICompoundAction; 226 messageAction = new AIPlayMessageAction("Images/AI/Mars/XMMAZB3", false); 320 if (_vm->isDVD()) 321 messageAction = new ArthurOxygen5Action(); 322 else 323 messageAction = new AIPlayMessageAction("Images/AI/Mars/XMMAZB3", false); 227 324 compound->addAction(messageAction); 228 325 deactivate = new AIDeactivateRuleAction(rule50); 229 326 compound->addAction(deactivate); … … void Mars::cantMoveThatWay(CanMoveForwardReason reason) { 396 493 } 397 494 398 495 void Mars::moveForward() { 399 if (GameState.getCurrentRoom() == kMars02 || (GameState.getCurrentRoom() >= kMars05 && GameState.getCurrentRoom() <= kMars08)) 496 if (GameState.getCurrentRoom() == kMars02 || (GameState.getCurrentRoom() >= kMars05 && GameState.getCurrentRoom() <= kMars08)) { 400 497 loadLoopSound2(""); 498 } else if (_vm->isDVD()) { 499 Movie movie(kNoDisplayElement); 500 Input input; 501 502 if (!GameState.isTakenItemID(kCardBomb) && 503 GameState.getCurrentRoom() == kMars60 && 504 GameState.getCurrentDirection() == kWest) { 505 loadLoopSound1(""); 506 loadLoopSound2(""); 507 movie.initFromMovieFile("Images/Mars/MMbomb.mov"); 508 movie.setVolume(_vm->getSoundFXLevel()); 509 movie.moveElementTo(kNavAreaLeft, kNavAreaTop); 510 movie.setDisplayOrder(kNavMovieOrder + 1); 511 movie.startDisplaying(); 512 movie.show(); 513 movie.start(); 514 515 while (movie.isRunning() && !_vm->shouldQuit()) { 516 InputDevice.getInput(input, kFilterNoInput); 517 518 _vm->checkCallBacks(); 519 _vm->refreshDisplay(); 520 _vm->_system->delayMillis(10); 521 } 522 523 if (_vm->shouldQuit()) 524 return; 525 526 movie.moveElementTo(0, 0); 527 _vm->_gfx->setCurSurface(_navMovie.getSurface()); 528 movie.copyToCurrentPort(); 529 _vm->_gfx->setCurSurface(_vm->_gfx->getWorkArea()); 530 531 movie.hide(); 532 movie.stopDisplaying(); 533 movie.releaseMovie(); 534 535 didntFindBomb(); 536 return; 537 } else if (!GameState.getWalkthroughMode() && 538 GameState.getCurrentRoom() == kMarsMaze200 && 539 GameState.getCurrentDirection() == kWest) { 540 ExitTable::Entry exitEntry; 541 Common::Rect pushBounds; 542 bool leavingBucket; 543 544 // Fall down the shaft immediately if we miss the climb-in 545 if (_navMovie.getTime() >= kBucketClimbInTime) { 546 _navMovie.stop(); 547 548 movie.initFromMovieFile("Images/Mars/MMfall.mov"); 549 movie.setVolume(_vm->getSoundFXLevel()); 550 movie.moveElementTo(kNavAreaLeft, kNavAreaTop); 551 movie.setDisplayOrder(kNavMovieOrder + 1); 552 movie.startDisplaying(); 553 movie.show(); 554 movie.start(); 555 556 while (movie.isRunning() && !_vm->shouldQuit()) { 557 InputDevice.getInput(input, kFilterNoInput); 558 559 _vm->checkCallBacks(); 560 _vm->refreshDisplay(); 561 _vm->_system->delayMillis(10); 562 } 563 564 if (_vm->shouldQuit()) 565 return; 566 567 movie.moveElementTo(0, 0); 568 _vm->_gfx->setCurSurface(_navMovie.getSurface()); 569 movie.copyToCurrentPort(); 570 _vm->_gfx->setCurSurface(_vm->_gfx->getWorkArea()); 571 572 movie.hide(); 573 movie.stopDisplaying(); 574 movie.releaseMovie(); 575 576 die(kDeathMissedOreBucket); 577 return; 578 } 579 580 canMoveForward(exitEntry); 581 582 leavingBucket = false; 583 _navMovie.stop(); 584 _turnPush.getBounds(pushBounds); 585 _navMovie.moveElementTo(pushBounds.left, pushBounds.top); 586 _navMovie.show(); 587 _navMovie.setFlags(0); 588 589 // Set segment so we can skip ahead as needed 590 // Ride up the shaft but don't try to get out 591 _navMovie.setSegment(exitEntry.movieStart, exitEntry.movieEnd - kBucketClimbOutTime); 592 _navMovie.setTime(exitEntry.movieStart); 593 _navMovie.start(); 594 while (_navMovie.isRunning() && _navMovie.getTime() < exitEntry.movieEnd - kBucketSeeGearRoomTime) { 595 InputDevice.getInput(input, kFilterAllDirections); 596 597 if (input.upButtonDown() || 598 input.downButtonDown() || 599 input.leftButtonDown() || 600 input.rightButtonDown()) { 601 _navMovie.stop(); 602 _vm->getDeathSound().initFromAIFFFile("Sounds/Mars/Mars Maze Fall.AIFF"); 603 _vm->getDeathSound().setVolume(_vm->getSoundFXLevel()); 604 _vm->getDeathSound().playSound(); 605 die(kDeathMissedOreBucket); 606 return; 607 } 608 609 _vm->checkCallBacks(); 610 _vm->refreshDisplay(); 611 g_system->delayMillis(10); 612 } 613 614 // We can see the gear room at this point so it's safe to try to get out 615 _navMovie.setTime(exitEntry.movieEnd - kBucketSeeGearRoomTime); 616 while (_navMovie.isRunning()) { 617 InputDevice.getInput(input, kFilterAllDirections); 618 619 if (input.upButtonAnyDown()) { 620 leavingBucket = true; 621 } else if (input.anyDirectionInput()) { 622 _navMovie.stop(); 623 _vm->getDeathSound().initFromAIFFFile("Sounds/Mars/Mars Maze Fall.AIFF"); 624 _vm->getDeathSound().setVolume(_vm->getSoundFXLevel()); 625 _vm->getDeathSound().playSound(); 626 die(kDeathMissedOreBucket); 627 return; 628 } 629 630 _vm->checkCallBacks(); 631 _vm->refreshDisplay(); 632 g_system->delayMillis(10); 633 } 634 _navMovie.stop(); 635 636 if (leavingBucket) { 637 exitEntry.movieStart = exitEntry.movieEnd - kBucketClimbOutTime; 638 startExitMovie(exitEntry); 639 } else { 640 playDeathExtra(kMars200DeathInBucket, kDeathDidntLeaveBucket); 641 } 642 return; 643 } 644 } 401 645 402 646 Neighborhood::moveForward(); 403 647 } … … void Mars::checkAirlockDoors() { 709 953 } 710 954 } 711 955 956 void Mars::startDoorOpenMovie(const TimeValue startTime, const TimeValue stopTime) { 957 Movie movie(kNoDisplayElement); 958 Input input; 959 960 if (_vm->isDVD() && GameState.getCurrentRoomAndView() == MakeRoomView(kMars18, kNorth) && 961 GameState.getMarsPodAtUpperPlatform()) { 962 movie.initFromMovieFile("Images/Mars/M45DF.movie"); 963 movie.setVolume(_vm->getSoundFXLevel()); 964 movie.moveElementTo(kNavAreaLeft, kNavAreaTop); 965 movie.setDisplayOrder(kNavMovieOrder + 1); 966 movie.startDisplaying(); 967 movie.show(); 968 movie.start(); 969 970 while (movie.isRunning() && !_vm->shouldQuit()) { 971 InputDevice.getInput(input, kFilterNoInput); 972 973 _vm->checkCallBacks(); 974 _vm->refreshDisplay(); 975 _vm->_system->delayMillis(10); 976 } 977 978 if (_vm->shouldQuit()) 979 return; 980 981 movie.moveElementTo(0, 0); 982 _vm->_gfx->setCurSurface(_navMovie.getSurface()); 983 movie.copyToCurrentPort(); 984 _vm->_gfx->setCurSurface(_vm->_gfx->getWorkArea()); 985 986 movie.hide(); 987 movie.stopDisplaying(); 988 movie.releaseMovie(); 989 990 Neighborhood::doorOpened(); 991 } else { 992 Neighborhood::startDoorOpenMovie(startTime, stopTime); 993 } 994 } 995 996 void Mars::startExitMovie(const ExitTable::Entry &exitEntry) { 997 Movie movie(kNoDisplayElement); 998 Input input; 999 1000 if (_vm->isDVD() && GameState.getCurrentRoomAndView() == MakeRoomView(kMars18, kNorth) && 1001 GameState.getMarsPodAtUpperPlatform()) { 1002 movie.initFromMovieFile("Images/Mars/M45DG.movie"); 1003 movie.setVolume(_vm->getSoundFXLevel()); 1004 movie.moveElementTo(kNavAreaLeft, kNavAreaTop); 1005 movie.setDisplayOrder(kNavMovieOrder + 1); 1006 movie.startDisplaying(); 1007 movie.show(); 1008 movie.start(); 1009 1010 while (movie.isRunning() && !_vm->shouldQuit()) { 1011 InputDevice.getInput(input, kFilterNoInput); 1012 1013 _vm->checkCallBacks(); 1014 _vm->refreshDisplay(); 1015 _vm->_system->delayMillis(10); 1016 } 1017 1018 if (_vm->shouldQuit()) 1019 return; 1020 1021 movie.moveElementTo(0, 0); 1022 _vm->_gfx->setCurSurface(_navMovie.getSurface()); 1023 movie.copyToCurrentPort(); 1024 _vm->_gfx->setCurSurface(_vm->_gfx->getWorkArea()); 1025 1026 movie.hide(); 1027 movie.stopDisplaying(); 1028 movie.releaseMovie(); 1029 1030 arriveAt(kMars32, kNorth); 1031 } else { 1032 Neighborhood::startExitMovie(exitEntry); 1033 } 1034 if (GameState.getCurrentRoomAndView() == MakeRoomView(kMars43, kEast) && g_arthurChip) 1035 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA07", kArthurMarsEnteredShuttle); 1036 } 1037 712 1038 int16 Mars::getStaticCompassAngle(const RoomID room, const DirectionConstant dir) { 713 1039 int16 angle = Neighborhood::getStaticCompassAngle(room, dir); 714 1040 … … void Mars::getExtraCompassMove(const ExtraTable::Entry &entry, FaderMoveSpec &co 877 1203 } 878 1204 879 1205 void Mars::loadAmbientLoops() { 1206 // Don't load an ambient loop if we died in a chase sequence 1207 if (_vm->getEnergyDeathReason() == kDeathRanIntoCanyonWall || _vm->getEnergyDeathReason() == kDeathCollidedWithPod) 1208 return; 1209 880 1210 RoomID room = GameState.getCurrentRoom(); 881 1211 882 1212 if ((room >= kMars0A && room <= kMars21) || (room >= kMars41 && room <= kMars43)) { 883 if (GameState.getMarsSeenTimeStream()) 884 loadLoopSound1("Sounds/Mars/Gantry Ambient.22K.8.AIFF"); 1213 if (GameState.getMarsSeenTimeStream()) { 1214 if (_vm->isDVD()) // Updated for the DVD version 1215 loadLoopSound1("Sounds/Mars/Gantry Ambient.32K.16.AIFF"); 1216 else 1217 loadLoopSound1("Sounds/Mars/Gantry Ambient.22K.8.AIFF"); 1218 } 885 1219 } else if (room >= kMars22 && room <= kMars31South) { 886 loadLoopSound1("Sounds/Mars/Reception.02.22K.8.AIFF", 0x100 / 4); 1220 if (_vm->isDVD()) // Updated for the DVD version 1221 loadLoopSound1("Sounds/Mars/Reception.02.32K.16.AIFF", 0x100 / 4); 1222 else 1223 loadLoopSound1("Sounds/Mars/Reception.02.22K.8.AIFF", 0x100 / 4); 887 1224 } else if (room >= kMars32 && room <= kMars34) { 888 loadLoopSound1("Sounds/Mars/Pod Room Ambient.22K.8.AIFF"); 889 } else if (room == kMars35) { 890 if (getAirQuality(room) == kAirQualityVacuum) 891 loadLoopSound1("Sounds/Mars/Gear Room Ambient.22K.8.AIFF"); 1225 if (_vm->isDVD()) // Updated for the DVD version 1226 loadLoopSound1("Sounds/Mars/Pod Room Ambient.32K.16.AIFF"); 892 1227 else 893 loadLoopSound1("Sounds/Mars/Gantry Ambient.22K.8.AIFF", 0x100 / 2); 1228 loadLoopSound1("Sounds/Mars/Pod Room Ambient.22K.8.AIFF"); 1229 } else if (room == kMars35) { 1230 if (getAirQuality(room) == kAirQualityVacuum) { 1231 if (_vm->isDVD()) // Updated for the DVD version 1232 loadLoopSound1("Sounds/Mars/Gear Room Ambient.44K.16.AIFF"); 1233 else 1234 loadLoopSound1("Sounds/Mars/Gear Room Ambient.22K.8.AIFF"); 1235 } else { 1236 if (_vm->isDVD()) // Updated for the DVD version 1237 loadLoopSound1("Sounds/Mars/Gantry Ambient.32K.16.AIFF", 0x100 / 2); 1238 else 1239 loadLoopSound1("Sounds/Mars/Gantry Ambient.22K.8.AIFF", 0x100 / 2); 1240 } 894 1241 } else if (room >= kMars36 && room <= kMars39) { 895 loadLoopSound1("Sounds/Mars/Gear Room Ambient.22K.8.AIFF"); 1242 if (_vm->isDVD()) // Updated for the DVD version 1243 loadLoopSound1("Sounds/Mars/Gear Room Ambient.44K.16.AIFF"); 1244 else 1245 loadLoopSound1("Sounds/Mars/Gear Room Ambient.22K.8.AIFF"); 896 1246 } else if (room >= kMars45 && room <= kMars51) { 897 loadLoopSound1("Sounds/Mars/Lower Mars Ambient.22K.8.AIFF"); 1247 if (_vm->isDVD()) // Updated for the DVD version 1248 loadLoopSound1("Sounds/Mars/Lower Mars Ambient.32K.16.AIFF"); 1249 else 1250 loadLoopSound1("Sounds/Mars/Lower Mars Ambient.22K.8.AIFF"); 898 1251 } else if (room >= kMars52 && room <= kMars58) { 899 loadLoopSound1("Sounds/Mars/ReactorLoop.22K.8.AIFF"); 900 } else if (room == kMars60) { 901 if (getAirQuality(room) == kAirQualityVacuum) 902 loadLoopSound1("Sounds/Mars/Mars Maze Ambient.22K.8.AIFF"); 1252 if (_vm->isDVD()) // Updated for the DVD version 1253 loadLoopSound1("Sounds/Mars/ReactorLoop.44K.16.AIFF"); 903 1254 else 904 loadLoopSound1("Sounds/Mars/Lower Mars Ambient.22K.8.AIFF", 0x100 / 2); 1255 loadLoopSound1("Sounds/Mars/ReactorLoop.22K.8.AIFF"); 1256 } else if (room == kMars60) { 1257 if (getAirQuality(room) == kAirQualityVacuum) { 1258 if (_vm->isDVD()) // Updated for the DVD version 1259 loadLoopSound1("Sounds/Mars/Mars Maze Ambient.32K.16.AIFF"); 1260 else 1261 loadLoopSound1("Sounds/Mars/Mars Maze Ambient.22K.8.AIFF"); 1262 } else { 1263 if (_vm->isDVD()) // Updated for the DVD version 1264 loadLoopSound1("Sounds/Mars/Lower Mars Ambient.32K.16.AIFF", 0x100 / 2); 1265 else 1266 loadLoopSound1("Sounds/Mars/Lower Mars Ambient.22K.8.AIFF", 0x100 / 2); 1267 } 905 1268 } else if (room >= kMarsMaze004 && room <= kMarsMaze200) { 906 loadLoopSound1("Sounds/Mars/Mars Maze Ambient.22K.8.AIFF"); 1269 if (_vm->isDVD()) { // Updated for the DVD version 1270 if (GameState.getEasterEgg() || room == kMarsMaze200 || 1271 (room == kMarsMaze199 && GameState.getCurrentDirection() == kWest)) 1272 loadLoopSound1("Sounds/Mars/Mars Maze Ambient.32K.16.AIFF"); 1273 else 1274 loadLoopSound1("Sounds/Mars/Mars Maze GenoLoop.32K.16.AIFF"); 1275 } else { 1276 loadLoopSound1("Sounds/Mars/Mars Maze Ambient.22K.8.AIFF"); 1277 } 907 1278 } else if (room == kMarsRobotShuttle) { 908 1279 loadLoopSound1("Sounds/Mars/Robot Shuttle.22K.8.AIFF"); 909 1280 } … … void Mars::timerExpired(const uint32 eventType) { 1130 1501 } 1131 1502 1132 1503 void Mars::arriveAt(const RoomID room, const DirectionConstant direction) { 1504 Input input; 1505 InventoryItem *item; 1506 1133 1507 switch (MakeRoomView(room, direction)) { 1134 1508 case MakeRoomView(kMars18, kNorth): 1135 1509 if (GameState.getMarsPodAtUpperPlatform()) … … void Mars::arriveAt(const RoomID room, const DirectionConstant direction) { 1142 1516 else 1143 1517 setCurrentAlternate(kAltMarsNormal); 1144 1518 break; 1519 case MakeRoomView(kMars31South, kSouth): 1520 if (!GameState.isTakenItemID(kMarsCard) && g_arthurChip) { 1521 if (_vm->getRandomBit()) 1522 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA05", kArthurMarsZoomedToKeyCard); 1523 else 1524 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA96", kArthurMarsZoomedToKeyCard); 1525 } 1526 break; 1145 1527 case MakeRoomView(kMars35, kEast): 1146 1528 case MakeRoomView(kMars35, kWest): 1147 1529 if (GameState.getMarsAirlockOpen()) … … void Mars::arriveAt(const RoomID room, const DirectionConstant direction) { 1155 1537 setCurrentAlternate(kAltMars60AirlockEast); 1156 1538 else 1157 1539 setCurrentAlternate(kAltMars60AirlockWest); 1540 if (!(g_airMask && g_airMask->getAirLeft() > 0) && g_arthurChip) 1541 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA39", kArthurMarsInAirlockNoOxygen); 1158 1542 break; 1159 1543 case MakeRoomView(kMars45, kNorth): 1160 1544 case MakeRoomView(kMars45, kSouth): … … void Mars::arriveAt(const RoomID room, const DirectionConstant direction) { 1175 1559 setCurrentAlternate(kAltMarsNormal); 1176 1560 else 1177 1561 setCurrentAlternate(kAltMarsPodAtMars45); 1562 if (g_arthurChip && room == kMars46) { 1563 if (direction == kEast && !GameState.isTakenItemID(kCrowbar)) 1564 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA34", kArthurMarsLeftPodNoCrowBar); 1565 else if (direction == kWest && GameState.getMarsPodAtUpperPlatform()) 1566 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA82", kArthurMarsLookAtEmptyTracks); 1567 } 1178 1568 break; 1179 1569 case MakeRoomView(kMars48, kNorth): 1180 1570 case MakeRoomView(kMars48, kSouth): … … void Mars::arriveAt(const RoomID room, const DirectionConstant direction) { 1196 1586 else 1197 1587 setCurrentAlternate(kAltMarsNormal); 1198 1588 break; 1589 case MakeRoomView(kMarsMaze004, kWest): 1590 if (_vm->isDVD() && GameState.getCurrentRoom() == kMars60) { 1591 InputDevice.getInput(input, kFilterAllInput); 1592 // Check easter egg modifier for the Geno mix 1593 if (JMPPPInput::isEasterEggModifierInput(input)) 1594 GameState.setEasterEgg(true); 1595 else 1596 GameState.setEasterEgg(false); 1597 } 1598 break; 1199 1599 } 1200 1600 1201 1601 Neighborhood::arriveAt(room, direction); … … void Mars::arriveAt(const RoomID room, const DirectionConstant direction) { 1207 1607 if (!GameState.getMarsSeenTimeStream()) 1208 1608 startExtraLongSequence(kMarsArrivalFromTSA, kMars0AWatchShuttleDepart, kExtraCompletedFlag, kFilterNoInput); 1209 1609 break; 1610 case MakeRoomView(kMars07, kNorth): 1611 item = (InventoryItem *)g_allItems.findItemByID(kNitrogenCanister); 1612 if (((g_airMask && g_airMask->getAirLeft() > 0) || item->getItemState() == kNitrogenFull) && g_arthurChip) 1613 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA24", kArthurMarsSawWelcomeVideos); 1614 break; 1210 1615 case MakeRoomView(kMars07, kSouth): 1211 1616 case MakeRoomView(kMars13, kNorth): 1212 1617 if (!GameState.getMarsHeardCheckInMessage()) { … … void Mars::arriveAt(const RoomID room, const DirectionConstant direction) { 1214 1619 GameState.setMarsHeardCheckInMessage(true); 1215 1620 } 1216 1621 break; 1622 case MakeRoomView(kMars41, kEast): 1623 case MakeRoomView(kMars42, kEast): 1624 if (g_arthurChip) 1625 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA73", kArthurMarsFoundNoShuttlePresent); 1626 break; 1217 1627 case MakeRoomView(kMars44, kWest): 1218 1628 if (GameState.getMarsReadyForShuttleTransport()) 1219 1629 startUpFromFinishedSpaceChase(); … … void Mars::arriveAt(const RoomID room, const DirectionConstant direction) { 1229 1639 case MakeRoomView(kMars11, kSouth): 1230 1640 case MakeRoomView(kMars12, kSouth): 1231 1641 setCurrentActivation(kActivationReadyForKiosk); 1642 if (g_arthurChip) 1643 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA33", kArthurMarsReadyForKiosk); 1232 1644 break; 1233 1645 case MakeRoomView(kMars15, kWest): 1234 1646 if (GameState.getMarsThreadedMaze() && !GameState.getMarsSecurityDown()) { … … void Mars::arriveAt(const RoomID room, const DirectionConstant direction) { 1253 1665 case MakeRoomView(kMars19, kNorth): 1254 1666 case MakeRoomView(kMars19, kSouth): 1255 1667 case MakeRoomView(kMars19, kWest): 1256 if (GameState.getMarsThreadedMaze() && !GameState.getMarsSawRobotLeave()) 1668 if (GameState.getMarsThreadedMaze() && !GameState.getMarsSawRobotLeave()) { 1257 1669 forceStridingStop(kMars19, kWest, kAltMarsNormal); 1670 if (g_arthurChip) 1671 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA38", kArthurMarsExitedGearRoom); 1672 } 1258 1673 1259 1674 if (GameState.getMarsThreadedMaze() && !GameState.getMarsSecurityDown()) 1260 1675 forceStridingStop(kMars17, kWest, kAltMarsNormal); … … void Mars::arriveAt(const RoomID room, const DirectionConstant direction) { 1305 1720 setCurrentActivation(kActivateReadyToPressurizeAirlock); 1306 1721 break; 1307 1722 case MakeRoomView(kMars39, kWest): 1308 if (GameState.getLastRoom() == kMarsMaze200) 1723 if (GameState.getLastRoom() == kMarsMaze200) { 1309 1724 GameState.setMarsPodAtUpperPlatform(false); 1725 if (_vm->isDVD()) 1726 GameState.setEasterEgg(false); 1727 } 1728 if (g_arthurChip) 1729 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBB40", kArthurMarsEnteredGearRoom); 1730 break; 1731 case MakeRoomView(kMars39, kNorth): 1732 case MakeRoomView(kMars39, kSouth): 1733 case MakeRoomView(kMars38, kNorth): 1734 case MakeRoomView(kMars38, kSouth): 1735 case MakeRoomView(kMars37, kNorth): 1736 case MakeRoomView(kMars37, kSouth): 1737 case MakeRoomView(kMars36, kNorth): 1738 case MakeRoomView(kMars36, kSouth): 1739 if (g_arthurChip) 1740 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA83", kArthurMarsLookAtGears); 1310 1741 break; 1311 1742 case MakeRoomView(kMars45, kSouth): 1312 1743 // Set up maze doors here. … … void Mars::arriveAt(const RoomID room, const DirectionConstant direction) { 1322 1753 if (!GameState.getMarsSeenRobotAtReactor()) { 1323 1754 // Preload the looping sound... 1324 1755 loadLoopSound2("Sounds/Mars/Robot Loop.aiff", 0, 0, 0); 1325 startExtraSequence(kMars48RobotApproaches, kExtraCompletedFlag, kFilterNoInput); 1756 if (!_vm->isDVD()) { 1757 startExtraSequence(kMars48RobotApproaches, kExtraCompletedFlag, kFilterNoInput); 1758 } else { 1759 InputDevice.getInput(input, kFilterAllInput); 1760 if (JMPPPInput::isEasterEggModifierInput(input)) { 1761 if (_vm->getRandomBit()) 1762 startExtraSequence(kMars48RobotApproaches, kExtraCompletedFlag, kFilterNoInput); 1763 else 1764 startExtraSequence(kMarsRobotBobSlow, kExtraCompletedFlag, kFilterNoInput); 1765 } else { 1766 startExtraSequence(kMarsRobotGenoSlow, kExtraCompletedFlag, kFilterNoInput); 1767 } 1768 } 1326 1769 } else if (!GameState.getMarsAvoidedReactorRobot()) { 1327 1770 loadLoopSound2("Sounds/Mars/Robot Loop.aiff", 0x100, 0, 0); 1328 1771 loopExtraSequence(kMars48RobotLoops); … … void Mars::arriveAt(const RoomID room, const DirectionConstant direction) { 1362 1805 g_shield->setItemState(kShieldNormal); 1363 1806 g_energyMonitor->setEnergyDrainRate(kEnergyDrainNormal); 1364 1807 _vm->resetEnergyDeathReason(); 1808 if (GameState.isTakenItemID(kCardBomb) && g_arthurChip) 1809 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA78", kArthurMarsExitedReactorWithCardBomb); 1365 1810 break; 1811 case MakeRoomView(kMars52, kEast): 1812 if (g_arthurChip) 1813 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA11", kArthurMarsEnteredReactor); 1366 1814 case MakeRoomView(kMars52, kNorth): 1367 1815 case MakeRoomView(kMars52, kSouth): 1368 case MakeRoomView(kMars52, kEast):1369 1816 case MakeRoomView(kMars52, kWest): 1370 1817 case MakeRoomView(kMars54, kNorth): 1371 1818 case MakeRoomView(kMars54, kSouth): … … void Mars::arriveAt(const RoomID room, const DirectionConstant direction) { 1407 1854 case MakeRoomView(kMarsMaze007, kNorth): 1408 1855 launchMaze007Robot(); 1409 1856 break; 1857 case MakeRoomView(kMarsMaze009, kWest): 1858 if (g_arthurChip) 1859 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA20", kArthurMarsMazeReachedJunction); 1860 break; 1410 1861 case MakeRoomView(kMarsMaze015, kSouth): 1411 1862 launchMaze015Robot(); 1412 1863 break; … … void Mars::arriveAt(const RoomID room, const DirectionConstant direction) { 1429 1880 GameState.setScoringThreadedMaze(); 1430 1881 GameState.setMarsThreadedMaze(true); 1431 1882 break; 1883 case MakeRoomView(kMarsMaze199, kWest): 1884 if (g_arthurChip) 1885 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA77", kArthurMarsFoundBuckets); 1886 break; 1887 case MakeRoomView(kMarsMaze200, kWest): 1888 if (g_arthurChip) { 1889 if (_vm->getRandomBit()) 1890 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA10", kArthurMarsApproachedBuckets); 1891 else 1892 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA76", kArthurMarsApproachedBuckets); 1893 } 1894 break; 1432 1895 case MakeRoomView(kMarsDeathRoom, kNorth): 1433 1896 case MakeRoomView(kMarsDeathRoom, kSouth): 1434 1897 case MakeRoomView(kMarsDeathRoom, kEast): … … void Mars::shieldOff() { 1456 1919 } 1457 1920 1458 1921 void Mars::turnTo(const DirectionConstant direction) { 1922 Input input; 1923 1459 1924 switch (MakeRoomView(GameState.getCurrentRoom(), direction)) { 1460 1925 case MakeRoomView(kMars27, kNorth): 1461 1926 case MakeRoomView(kMars27, kSouth): … … void Mars::turnTo(const DirectionConstant direction) { 1481 1946 case MakeRoomView(kMars11, kSouth): 1482 1947 case MakeRoomView(kMars12, kSouth): 1483 1948 setCurrentActivation(kActivationReadyForKiosk); 1949 if (g_arthurChip) 1950 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA33", kArthurMarsReadyForKiosk); 1484 1951 break; 1485 1952 case MakeRoomView(kMars18, kNorth): 1486 1953 if (GameState.getMarsPodAtUpperPlatform()) … … void Mars::turnTo(const DirectionConstant direction) { 1492 1959 GameState.setMarsHeardCheckInMessage(true); 1493 1960 } 1494 1961 break; 1962 case MakeRoomView(kMars41, kEast): 1963 case MakeRoomView(kMars42, kEast): 1964 if (g_arthurChip) 1965 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA73", kArthurMarsFoundNoShuttlePresent); 1966 break; 1495 1967 case MakeRoomView(kMars34, kSouth): 1496 1968 case MakeRoomView(kMars45, kNorth): 1497 1969 setCurrentActivation(kActivateMarsPodClosed); … … void Mars::turnTo(const DirectionConstant direction) { 1517 1989 if (GameState.getMarsThreadedMaze()) 1518 1990 GameState.setScoringThreadedGearRoom(); 1519 1991 break; 1992 case MakeRoomView(kMars39, kNorth): 1993 case MakeRoomView(kMars39, kSouth): 1994 case MakeRoomView(kMars38, kNorth): 1995 case MakeRoomView(kMars38, kSouth): 1996 case MakeRoomView(kMars37, kNorth): 1997 case MakeRoomView(kMars37, kSouth): 1998 case MakeRoomView(kMars36, kNorth): 1999 case MakeRoomView(kMars36, kSouth): 2000 if (g_arthurChip) 2001 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA83", kArthurMarsLookAtGears); 2002 break; 2003 case MakeRoomView(kMars46, kWest): 2004 if (GameState.getMarsPodAtUpperPlatform() && g_arthurChip) 2005 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA82", kArthurMarsLookAtEmptyTracks); 2006 break; 1520 2007 case MakeRoomView(kMars48, kNorth): 1521 2008 if (GameState.getMarsSeenRobotAtReactor() && !GameState.getMarsAvoidedReactorRobot()) 1522 2009 die(kDeathDidntGetOutOfWay); … … void Mars::turnTo(const DirectionConstant direction) { 1525 2012 if (!GameState.getMarsSeenRobotAtReactor()) { 1526 2013 // Preload the looping sound... 1527 2014 loadLoopSound2("Sounds/Mars/Robot Loop.aiff", 0, 0, 0); 1528 startExtraSequence(kMars48RobotApproaches, kExtraCompletedFlag, kFilterNoInput); 2015 if (!_vm->isDVD()) { 2016 startExtraSequence(kMars48RobotApproaches, kExtraCompletedFlag, kFilterNoInput); 2017 } else { 2018 InputDevice.getInput(input, kFilterAllInput); 2019 if (JMPPPInput::isEasterEggModifierInput(input)) { 2020 if (_vm->getRandomBit()) 2021 startExtraSequence(kMars48RobotApproaches, kExtraCompletedFlag, kFilterNoInput); 2022 else 2023 startExtraSequence(kMarsRobotBobSlow, kExtraCompletedFlag, kFilterNoInput); 2024 } else { 2025 startExtraSequence(kMarsRobotGenoSlow, kExtraCompletedFlag, kFilterNoInput); 2026 } 2027 } 1529 2028 } else if (!GameState.getMarsAvoidedReactorRobot()) { 1530 2029 loopExtraSequence(kMars48RobotLoops); 1531 2030 } else if (GameState.isTakenItemID(kAirMask)) { … … void Mars::turnTo(const DirectionConstant direction) { 1541 2040 setCurrentAlternate(kAltMarsTookMask); 1542 2041 else 1543 2042 setCurrentAlternate(kAltMarsNormal); 2043 if (GameState.isTakenItemID(kCardBomb) && g_arthurChip) 2044 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA78", kArthurMarsExitedReactorWithCardBomb); 1544 2045 break; 1545 2046 case MakeRoomView(kMars49, kSouth): 1546 2047 if (GameState.isTakenItemID(kAirMask)) … … void Mars::turnTo(const DirectionConstant direction) { 1548 2049 else 1549 2050 setCurrentActivation(kActivateMaskOnHolder); 1550 2051 break; 2052 case MakeRoomView(kMars51, kWest): 2053 case MakeRoomView(kMars50, kWest): 2054 if (GameState.isTakenItemID(kCardBomb) && g_arthurChip) 2055 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA78", kArthurMarsExitedReactorWithCardBomb); 2056 break; 1551 2057 case MakeRoomView(kMars52, kNorth): 1552 2058 case MakeRoomView(kMars52, kSouth): 1553 2059 case MakeRoomView(kMars52, kEast): … … void Mars::turnTo(const DirectionConstant direction) { 1587 2093 case MakeRoomView(kMarsMaze184, kWest): 1588 2094 launchMaze184Robot(); 1589 2095 break; 2096 case MakeRoomView(kMarsMaze199, kNorth): 2097 case MakeRoomView(kMarsMaze199, kSouth): 2098 case MakeRoomView(kMarsMaze199, kEast): 2099 case MakeRoomView(kMarsMaze199, kWest): 2100 if (_vm->isDVD()) 2101 loadAmbientLoops(); 2102 if (GameState.getCurrentDirection() == kWest && g_arthurChip) 2103 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA77", kArthurMarsFoundBuckets); 2104 break; 2105 case MakeRoomView(kMarsMaze200, kWest): 2106 if (g_arthurChip) { 2107 if (_vm->getRandomBit()) 2108 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA10", kArthurMarsApproachedBuckets); 2109 else 2110 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA76", kArthurMarsApproachedBuckets); 2111 } 2112 break; 1590 2113 } 1591 2114 } 1592 2115 … … void Mars::pickedUpItem(Item *item) { 1891 2414 case kAirMask: 1892 2415 setCurrentActivation(kActivateHotSpotAlways); 1893 2416 if (!GameState.getScoringGotOxygenMask()) { 1894 g_AIArea->playAIMovie(kRightAreaSignature, "Images/AI/Mars/XM48SB", false, kWarningInterruption); 2417 if (g_AIArea->isChattyAI()) 2418 g_AIArea->playAIMovie(kRightAreaSignature, "Images/AI/Mars/XM48SB", false, kWarningInterruption); 1895 2419 GameState.setScoringGotOxygenMask(); 1896 2420 } 1897 2421 break; … … void Mars::dropItemIntoRoom(Item *item, Hotspot *dropSpot) { 1954 2478 switch (item->getObjectID()) { 1955 2479 case kMarsCard: 1956 2480 Neighborhood::dropItemIntoRoom(item, dropSpot); 1957 if (dropSpot && dropSpot->getObjectID() == kMars34NorthCardDropSpotID) 1958 startExtraSequence(kMarsTurnOnPod, kExtraCompletedFlag, kFilterNoInput); 2481 if (dropSpot && dropSpot->getObjectID() == kMars34NorthCardDropSpotID) { 2482 if (_vm->isDVD()) { 2483 if (!GameState.getWalkthroughMode()) { 2484 _interruptionFilter = kFilterNoInput; 2485 _podSteerMovie.initFromMovieFile("Images/Mars/M45OMK.movie"); 2486 _podSteerMovie.setVolume(_vm->getSoundFXLevel()); 2487 _podSteerMovie.setDisplayOrder(kNavMovieOrder + 1); 2488 _podSteerMovie.moveElementTo(kNavAreaLeft, kNavAreaTop); 2489 _podSteerMovie.startDisplaying(); 2490 _podSteerMovie.show(); 2491 _podSteerMovie.start(); 2492 } else { 2493 startExtraSequence(kMarsTurnOnPod, kExtraCompletedFlag, kFilterNoInput); 2494 } 2495 startMarsTimer(kPodCautionDisplayedTime, kMovieTicksPerSecond, kMarsPodCautionDisplayed); 2496 } else { 2497 startExtraSequence(kMarsTurnOnPod, kExtraCompletedFlag, kFilterNoInput); 2498 } 2499 } 1959 2500 break; 1960 2501 case kNitrogenCanister: 1961 2502 Neighborhood::dropItemIntoRoom(item, dropSpot); 1962 if (dropSpot && dropSpot->getObjectID() == kMars57DropNitrogenSpotID) 2503 if (dropSpot && dropSpot->getObjectID() == kMars57DropNitrogenSpotID) { 1963 2504 startExtraSequence(kMars57FreezeLock, kExtraCompletedFlag, kFilterNoInput); 2505 if (g_arthurChip) 2506 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA19", kArthurMarsUsedLiquidNitrogen); 2507 } 1964 2508 break; 1965 2509 case kCrowbar: 1966 2510 _utilityFuse.stopFuse(); … … void Mars::turnRight() { 2088 2632 } 2089 2633 } 2090 2634 2635 void Mars::startExtraSequence(const ExtraID extraID, const NotificationFlags flags, const InputBits interruptionFilter) { 2636 TimeValue segmentStart = 0, segmentStop = 0; 2637 bool loopSequence = false; 2638 Common::Rect pushBounds; 2639 NotificationFlags extraFlags; 2640 2641 switch (extraID) { 2642 case kMarsRobotBobSlow: 2643 case kMarsRobotGenoSlow: 2644 _turnPush.getBounds(pushBounds); 2645 2646 switch (extraID) { 2647 case kMarsRobotBobSlow: 2648 _extraMovie.initFromMovieFile("Images/Mars/M48RSB.movie"); 2649 break; 2650 case kMarsRobotGenoSlow: 2651 _extraMovie.initFromMovieFile("Images/Mars/M48RSA.movie"); 2652 break; 2653 default: 2654 break; 2655 } 2656 segmentStart = 0; 2657 segmentStop = _extraMovie.getDuration(); 2658 loopSequence = false; 2659 2660 _lastExtra = extraID; 2661 _turnPush.hide(); 2662 2663 if (!loopSequence && g_AIArea) 2664 g_AIArea->lockAIOut(); 2665 2666 extraFlags = flags; 2667 _interruptionFilter = interruptionFilter; 2668 // Stop the nav movie before doing anything else 2669 _navMovie.stop(); 2670 _navMovie.stopDisplaying(); 2671 2672 _extraMovie.setVolume(_vm->getSoundFXLevel()); 2673 _extraMovie.moveElementTo(pushBounds.left, pushBounds.top); 2674 _extraMovie.setDisplayOrder(kNavMovieOrder + 1); 2675 _extraMovie.startDisplaying(); 2676 _extraMovie.show(); 2677 _extraMovie.setFlags(0); 2678 _extraMovie.setSegment(segmentStart, segmentStop); 2679 _extraMovie.setTime(segmentStart); 2680 if (loopSequence) 2681 _extraMovie.setFlags(kLoopTimeBase); 2682 else 2683 extraFlags |= kNeighborhoodMovieCompletedFlag; 2684 _extraMovieCallBack.cancelCallBack(); 2685 _extraMovieCallBack.initCallBack(&_extraMovie, kCallBackAtExtremes); 2686 if (extraFlags != 0) { 2687 _extraMovieCallBack.setCallBackFlag(extraFlags); 2688 _extraMovieCallBack.scheduleCallBack(kTriggerAtStop, 0, 0); 2689 } 2690 _extraMovie.start(); 2691 break; 2692 default: 2693 Neighborhood::startExtraSequence(extraID, flags, interruptionFilter); 2694 break; 2695 } 2696 } 2697 2091 2698 void Mars::receiveNotification(Notification *notification, const NotificationFlags flag) { 2092 2699 InventoryItem *item; 2093 2700 … … void Mars::receiveNotification(Notification *notification, const NotificationFla 2113 2720 kMarsPodDepartedUpperPlatformOut); 2114 2721 GameState.setMarsHeardUpperPodMessage(true); 2115 2722 } 2723 if (g_airMask && g_airMask->getAirLeft() > 0 && g_arthurChip) 2724 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA74", kArthurMarsRobotThrownPlayerWithMask); 2116 2725 break; 2117 2726 case kMarsInfoKioskIntro: 2118 2727 GameState.setScoringSawMarsKiosk(); … … void Mars::receiveNotification(Notification *notification, const NotificationFla 2144 2753 } 2145 2754 break; 2146 2755 case kMarsTurnOnPod: 2147 item = (InventoryItem *)_vm->getAllItems().findItemByID(kMarsCard); 2148 _vm->addItemToInventory(item); 2149 GameState.setScoringTurnedOnTransport(); 2150 loadLoopSound1(""); 2151 loadLoopSound2(""); 2152 startExtraSequence(kMarsTakePodToMars45, kExtraCompletedFlag, kFilterNoInput); 2756 if (!_vm->isDVD()) { 2757 item = (InventoryItem *)_vm->getAllItems().findItemByID(kMarsCard); 2758 _vm->addItemToInventory(item); 2759 GameState.setScoringTurnedOnTransport(); 2760 loadLoopSound1(""); 2761 loadLoopSound2(""); 2762 } 2763 if (!_vm->isDVD() || GameState.getWalkthroughMode()) 2764 startExtraSequence(kMarsTakePodToMars45, kExtraCompletedFlag, kFilterNoInput); 2153 2765 break; 2154 2766 case kMarsTakePodToMars45: 2155 2767 arriveAt(kMars45, kSouth); … … void Mars::receiveNotification(Notification *notification, const NotificationFla 2172 2784 checkAirMask(); 2173 2785 loadAmbientLoops(); 2174 2786 break; 2787 case kMarsRobotBobSlow: 2788 case kMarsRobotGenoSlow: 2789 _extraMovie.stopDisplaying(); 2790 _extraMovie.releaseMovie(); 2791 _navMovie.startDisplaying(); 2792 // Fall through... 2175 2793 case kMars48RobotApproaches: 2176 2794 loadLoopSound2("Sounds/Mars/Robot Loop.aiff", 0x100, 0, 0); 2177 2795 GameState.setMarsSeenRobotAtReactor(true); … … void Mars::receiveNotification(Notification *notification, const NotificationFla 2199 2817 setCurrentActivation(kActivateMaskOnFiller); 2200 2818 setCurrentAlternate(kAltMarsMaskOnFiller); 2201 2819 GameState.setMarsMaskOnFiller(true); 2820 if (g_arthurChip) { 2821 if (_vm->getRandomBit()) 2822 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA13", kArthurMarsCantFillMask); 2823 else 2824 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA80", kArthurMarsCantFillMask); 2825 } 2202 2826 break; 2203 2827 case kMars58SpinLeft: 2204 2828 case kMars54SpinRight: … … void Mars::receiveNotification(Notification *notification, const NotificationFla 2247 2871 setCurrentActivation(kActivateReactorAskLowerScreen); 2248 2872 break; 2249 2873 case kMars57LowerScreenClosed: 2874 item = (InventoryItem *)_vm->getAllItems().findItemByID(kNitrogenCanister); 2875 if (g_arthurChip) { 2876 if (item->getItemState() == kNitrogenFull) 2877 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA12", kArthurMarsSawLockedPanel); 2878 else 2879 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA39", kArthurMarsSawLockedPanelNoNitrogen); 2880 } 2881 // Fall through... 2250 2882 case kMars57ThawLock: 2251 2883 setCurrentActivation(kActivateReactorReadyForNitrogen); 2252 2884 GameState.setMarsLockFrozen(false); … … void Mars::receiveNotification(Notification *notification, const NotificationFla 2283 2915 case kMars57RunDiagnostics: 2284 2916 setCurrentActivation(kActivateReactorRanDiagnostics); 2285 2917 GameState.setScoringFoundCardBomb(); 2918 if (g_arthurChip) { 2919 if (_vm->getRandomBit()) 2920 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA73", kArthurMarsFoundCardBomb); 2921 else 2922 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBB34", kArthurMarsFoundCardBomb); 2923 } 2286 2924 break; 2287 2925 case kMars57BombExplodes: 2288 2926 case kMars57BombExplodesInGame: … … void Mars::receiveNotification(Notification *notification, const NotificationFla 2310 2948 case kMars57ExposeBomb: 2311 2949 setCurrentActivation(kActivateReactorBombExposed); 2312 2950 _privateFlags.setFlag(kMarsPrivateBombExposedFlag, true); 2951 if (g_arthurChip) 2952 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA75", kArthurMarsDeactivatedCardBomb); 2313 2953 break; 2314 2954 case kMars57BackToNormal: 2315 2955 setCurrentActivation(kActivateReactorPlatformIn); 2316 2956 _privateFlags.setFlag(kMarsPrivateBombExposedFlag, false); 2317 g_AIArea->playAIMovie(kRightAreaSignature, "Images/AI/Mars/XM51SW", false, kWarningInterruption); 2957 if (g_AIArea->isChattyAI()) 2958 g_AIArea->playAIMovie(kRightAreaSignature, "Images/AI/Mars/XM51SW", false, kWarningInterruption); 2959 if (g_arthurChip) 2960 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA02", kArthurMarsSolvedReactorGame); 2318 2961 break; 2319 2962 case kMars60WestSpinAirlockToEast: 2320 2963 GameState.setMarsAirlockOpen(true); … … void Mars::receiveNotification(Notification *notification, const NotificationFla 2336 2979 break; 2337 2980 case kMarsRobotHeadOpen: 2338 2981 setCurrentActivation(kActivationRobotHeadOpen); 2982 if (g_arthurChip) { 2983 switch (_vm->getRandomNumber(2)) { 2984 case 0: 2985 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA36", kArthurMarsRobotHeadOpen); 2986 break; 2987 case 1: 2988 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA37", kArthurMarsRobotHeadOpen); 2989 break; 2990 case 2: 2991 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA40", kArthurMarsRobotHeadOpen); 2992 break; 2993 } 2994 } 2339 2995 break; 2340 2996 case kMarsRobotHeadClose: 2341 2997 recallToTSASuccess(); … … void Mars::receiveNotification(Notification *notification, const NotificationFla 2364 3020 _rightDamageShuttleMovie.hide(); 2365 3021 playMovieSegment(&_rightShuttleMovie, kShuttleRightDestroyedStart, kShuttleRightDestroyedStop); 2366 3022 playSpotSoundSync(kShuttleDestroyedIn, kShuttleDestroyedOut); 2367 t hrowAwayMarsShuttle();3023 transportOutFromSpaceChase(true); 2368 3024 reinstateMonocleInterface(); 2369 3025 recallToTSASuccess(); 2370 3026 } 2371 3027 } else if ((flag & kTimeToTransportFlag) != 0) { 2372 transport ToRobotShip();3028 transportOutFromSpaceChase(false); 2373 3029 } 2374 3030 2375 3031 if (g_AIArea) … … void Mars::receiveNotification(Notification *notification, const NotificationFla 2379 3035 void Mars::spotCompleted() { 2380 3036 Neighborhood::spotCompleted(); 2381 3037 2382 if (GameState.getCurrentRoom() == kMarsRobotShuttle) 2383 g_AIArea->playAIMovie(kRightAreaSignature, "Images/AI/Mars/XN59WD", false, kWarningInterruption); 3038 switch (GameState.getCurrentRoomAndView()) { 3039 case MakeRoomView(kMars27, kNorth): 3040 case MakeRoomView(kMars28, kNorth): 3041 if (g_arthurChip) { 3042 switch (_vm->getRandomNumber(2)) { 3043 case 0: 3044 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA09", kArthurMarsLookedAtGuards); 3045 break; 3046 case 1: 3047 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA81", kArthurMarsLookedAtGuards); 3048 break; 3049 case 2: 3050 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBB32", kArthurMarsLookedAtGuards); 3051 break; 3052 } 3053 } 3054 break; 3055 case MakeRoomView(kMarsRobotShuttle, kEast): 3056 if (g_arthurChip) 3057 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA79", kArthurMarsFoundDeadRobot); 3058 if (g_AIArea->isChattyAI()) 3059 g_AIArea->playAIMovie(kRightAreaSignature, "Images/AI/Mars/XN59WD", false, kWarningInterruption); 3060 break; 3061 } 3062 } 3063 3064 void Mars::startUpFromFinishedTunnelPod() { 3065 arriveAt(kMars45, kSouth); 3066 if (g_AIArea != NULL) 3067 g_AIArea->checkMiddleArea(); 2384 3068 } 2385 3069 2386 3070 void Mars::doCanyonChase() { 3071 Input input; 3072 FaderMoveSpec spec; 3073 2387 3074 GameState.setScoringEnteredShuttle(); 2388 3075 setNextHandler(_vm); 2389 3076 throwAwayInterface(); … … void Mars::doCanyonChase() { 2394 3081 _spotSounds.initFromQuickTime(getSoundSpotsName()); 2395 3082 _spotSounds.setVolume(_vm->getSoundFXLevel()); 2396 3083 2397 Video::VideoDecoder *video = new Video::QuickTimeDecoder(); 2398 if (!video->loadFile("Images/Mars/M44ESA.movie")) 2399 error("Could not load interface->shuttle transition video"); 3084 Video::VideoDecoder *video = 0; 3085 3086 #ifdef USE_THEORADEC 3087 if (_vm->isDVD()) { 3088 video = new Video::TheoraDecoder(); 3089 3090 if (!video->loadFile("Images/Mars/M44ESA_hq.ogg")) { 3091 delete video; 3092 video = 0; 3093 } 3094 } 3095 #endif 3096 3097 if (!video) { 3098 video = new Video::QuickTimeDecoder(); 3099 if (!video->loadFile("Images/Mars/M44ESA.movie")) 3100 error("Could not load interface->shuttle transition video"); 3101 } 2400 3102 2401 3103 video->start(); 2402 3104 … … void Mars::doCanyonChase() { 2429 3131 initOnePicture(&_shuttleInterface4, "Images/Mars/MCmain4.pict", kShuttleBackgroundOrder, kShuttle4Left, 2430 3132 kShuttle4Top, true); 2431 3133 2432 initOneMovie(&_canyonChaseMovie, "Images/Mars/Canyon.movie", 3134 if (_vm->isDVD()) 3135 initOneMovie(&_canyonChaseMovie, "Images/Mars/Canyon_hq1.mov", 3136 kShuttleMonitorOrder, kShuttleWindowLeft, kShuttleWindowTop, true); 3137 else 3138 initOneMovie(&_canyonChaseMovie, "Images/Mars/Canyon.movie", 2433 3139 kShuttleMonitorOrder, kShuttleWindowLeft, kShuttleWindowTop, true); 2434 3140 _canyonChaseMovie.setVolume(_vm->getSoundFXLevel()); 2435 3141 2436 loadLoopSound1("Sounds/Mars/Inside Cockpit.22K.8.AIFF"); 3142 if (_vm->isDVD()) 3143 loadLoopSound1("Sounds/Mars/Inside Cockpit.44K.16.AIFF"); 3144 else 3145 loadLoopSound1("Sounds/Mars/Inside Cockpit.22K.8.AIFF"); 2437 3146 2438 3147 // Swing shuttle around... 2439 3148 playMovieSegment(&_canyonChaseMovie, kShuttleSwingStart, kShuttleSwingStop); … … void Mars::doCanyonChase() { 2465 3174 initOneMovie(&_rightDamageShuttleMovie, "Images/Mars/Right Damage Shuttle.movie", 2466 3175 kShuttleStatusOrder, kShuttleRightEnergyLeft, kShuttleRightEnergyTop, false); 2467 3176 3177 if (_vm->isDVD()) { 3178 _musicLoop.attachFader(&_musicFader); 3179 _musicLoop.initFromAIFFFile("Sounds/Mars/Canyon Loop.44K.16.AIFF"); 3180 _musicFader.setMasterVolume(_vm->getSoundFXLevel()); 3181 } 3182 2468 3183 _centerShuttleMovie.show(); 2469 3184 _centerShuttleMovie.setTime(kShuttleCenterBoardingTime); 2470 3185 playSpotSoundSync(kShuttleCockpitIn, kShuttleCockpitOut); … … void Mars::doCanyonChase() { 2538 3253 2539 3254 loadLoopSound1(""); 2540 3255 2541 _canyonChaseMovie.setSegment(kCanyonChaseStart, kCanyonChaseStop); 2542 _canyonChaseMovie.start(); 3256 if (_vm->isDVD()) { 3257 InputDevice.getInput(input, kFilterAllInput); 3258 if (JMPPPInput::isEasterEggModifierInput(input)) { 3259 initOneMovie(&_canyonChaseMovie, "Images/Mars/Canyon_hqG.mov", 3260 kShuttleMonitorOrder, kShuttleWindowLeft, kShuttleWindowTop, true); 3261 _canyonChaseMovie.setVolume(_vm->getSoundFXLevel()); 3262 _canyonChaseMovie.start(); 3263 3264 startMarsTimer(_canyonChaseMovie.getDuration() - 5 * kMovieTicksPerSecond, 3265 kMovieTicksPerSecond, kMarsLaunchTubeReached); 3266 } else if (GameState.getWalkthroughMode()) { 3267 _canyonChaseMovie.setSegment(kCanyonChaseStart, kCanyonChaseDVDStop); 3268 _canyonChaseMovie.start(); 3269 3270 _musicLoop.loopSound(); 3271 spec.makeTwoKnotFaderSpec(10, 0, 0, 1, 255); 3272 _musicFader.startFader(spec); 3273 3274 startMarsTimer(kCanyonChaseExitedTime, kMovieTicksPerSecond, kMarsCanyonChaseExited); 3275 } else { 3276 _canyonChaseMovie.stop(); 3277 _canyonChaseMovie.stopDisplaying(); 3278 _canyonChaseMovie.releaseMovie(); 3279 3280 newInteraction(kMarsCanyonChaseInteractionID); 3281 } 3282 } else { 3283 _canyonChaseMovie.setSegment(kCanyonChaseStart, kCanyonChaseCDStop); 3284 _canyonChaseMovie.start(); 2543 3285 2544 startMarsTimer(kLaunchTubeReachedTime, kMovieTicksPerSecond, kMarsLaunchTubeReached); 3286 startMarsTimer(kLaunchTubeCDReachedTime, kMovieTicksPerSecond, kMarsLaunchTubeReached); 3287 } 2545 3288 } 2546 3289 2547 3290 void Mars::startUpFromFinishedSpaceChase() { … … void Mars::startUpFromFinishedSpaceChase() { 2601 3344 2602 3345 _lowerLeftShuttleMovie.show(); 2603 3346 2604 loadLoopSound1("Sounds/Mars/Space Ambient.22K.8.AIFF");3347 playSpaceAmbient(); 2605 3348 2606 3349 initOneMovie(&_junk, "Images/Mars/Junk.movie", kShuttleJunkOrder, kShuttleJunkLeft, 2607 3350 kShuttleJunkTop, false); … … void Mars::startUpFromSpaceChase() { 2710 3453 2711 3454 _lowerLeftShuttleMovie.show(); 2712 3455 2713 loadLoopSound1("Sounds/Mars/Space Ambient.22K.8.AIFF");3456 playSpaceAmbient(); 2714 3457 2715 3458 initOneMovie(&_planetMovie, "Images/Mars/Planet.movie", kShuttlePlanetOrder, 2716 3459 kPlanetStartLeft, kPlanetStartTop, true); … … void Mars::startUpFromSpaceChase() { 2781 3524 } 2782 3525 2783 3526 void Mars::setSoundFXLevel(const uint16 level) { 3527 CanyonChase *chase; 3528 2784 3529 Neighborhood::setSoundFXLevel(level); 2785 3530 2786 if (_canyonChaseMovie.isMovieValid()) 2787 _canyonChaseMovie.setVolume(level); 3531 if (_vm->isDVD()) { 3532 if (GameState.getCurrentRoomAndView() == MakeRoomView(kMars44, kWest) && 3533 _currentInteraction != NULL) { 3534 chase = (CanyonChase *)_currentInteraction; 3535 if (chase->_canyonMovie1.isMovieValid()) 3536 chase->_canyonMovie1.setVolume(level); 3537 if (chase->_canyonMovie2.isMovieValid()) 3538 chase->_canyonMovie2.setVolume(level); 3539 if (chase->_deathMovie.isMovieValid()) 3540 chase->_deathMovie.setVolume(level); 3541 if (chase->_genoMovie.isMovieValid()) 3542 chase->_genoMovie.setVolume(level); 3543 if (chase->_musicLoop.isSoundLoaded()) 3544 chase->_musicFader.setMasterVolume(level); 3545 } 3546 if (_musicLoop.isSoundLoaded()) 3547 _musicFader.setMasterVolume(level); 3548 } else { 3549 if (_canyonChaseMovie.isMovieValid()) 3550 _canyonChaseMovie.setVolume(level); 3551 } 2788 3552 2789 3553 if (_explosions.isMovieValid()) 2790 3554 _explosions.setVolume(level); … … void Mars::startMarsTimer(TimeValue time, TimeScale scale, MarsTimerCode code) { 2799 3563 } 2800 3564 2801 3565 void Mars::marsTimerExpired(MarsTimerEvent &event) { 3566 InventoryItem *item; 3567 FaderMoveSpec spec; 2802 3568 Common::Rect r; 2803 3569 uint16 x, y; 2804 3570 2805 3571 switch (event.event) { 3572 case kMarsPodCautionDisplayed: 3573 item = (InventoryItem *)_vm->getAllItems().findItemByID(kMarsCard); 3574 _vm->addItemToInventory(item); 3575 startMarsTimer(kPodCautionDismissedTime, kMovieTicksPerSecond, kMarsPodCautionDismissed); 3576 return; 3577 case kMarsPodCautionDismissed: 3578 _podSteerMovie.hide(); 3579 _podSteerMovie.stopDisplaying(); 3580 _podSteerMovie.releaseMovie(); 3581 _interruptionFilter = kFilterAllInput; 3582 GameState.setScoringTurnedOnTransport(); 3583 loadLoopSound1(""); 3584 loadLoopSound2(""); 3585 if (!GameState.getWalkthroughMode()) 3586 newInteraction(kMarsTunnelPodInteractionID); 3587 return; 3588 // Bail out early for pod events so input is not filtered 3589 case kMarsCanyonChaseExited: 3590 spec.makeTwoKnotFaderSpec(20, 0, 255, 5, 160); 3591 _musicFader.startFader(spec); 3592 startMarsTimer(kCanyonChaseFadedTime, kMovieTicksPerSecond, kMarsCanyonChaseFaded); 3593 break; 3594 case kMarsCanyonChaseFaded: 3595 spec.makeTwoKnotFaderSpec(10, 0, 160, 30, 0); 3596 _musicFader.startFader(spec); 3597 startMarsTimer(kLaunchTubeDVDReachedTime, kMovieTicksPerSecond, kMarsLaunchTubeReached); 3598 break; 2806 3599 case kMarsLaunchTubeReached: 2807 3600 _lowerLeftShuttleMovie.setTime(kShuttleLowerLeftTubeTime); 2808 3601 _lowerLeftShuttleMovie.redrawMovieWorld(); 2809 startMarsTimer(kCanyonChase FinishedTime, kMovieTicksPerSecond, kMarsCanyonChaseFinished);3602 startMarsTimer(kCanyonChaseCDFinishedTime, kMovieTicksPerSecond, kMarsCanyonChaseFinished); 2810 3603 break; 2811 3604 case kMarsCanyonChaseFinished: 2812 3605 GameState.setScoringEnteredLaunchTube(); 2813 3606 2814 while (_canyonChaseMovie.isRunning()) { 2815 _vm->checkCallBacks(); 2816 _vm->refreshDisplay(); 2817 _vm->_system->delayMillis(10); 2818 } 3607 if (_canyonChaseMovie.isMovieValid()) { 3608 while (_canyonChaseMovie.isRunning()) { 3609 _vm->checkCallBacks(); 3610 _vm->refreshDisplay(); 3611 _vm->_system->delayMillis(10); 3612 } 2819 3613 2820 _canyonChaseMovie.stop(); 2821 _canyonChaseMovie.stopDisplaying(); 2822 _canyonChaseMovie.releaseMovie(); 3614 _canyonChaseMovie.stop(); 3615 _canyonChaseMovie.stopDisplaying(); 3616 _canyonChaseMovie.releaseMovie(); 3617 } 2823 3618 2824 3619 _vm->_gfx->enableErase(); 2825 3620 2826 loadLoopSound1("Sounds/Mars/Space Ambient.22K.8.AIFF");3621 playSpaceAmbient(); 2827 3622 2828 playSpotSoundSync(kShuttleConfiguringIn, kShuttleConfiguringOut); 2829 playSpotSoundSync(kShuttleGeneratingIn, kShuttleGeneratingOut); 2830 playSpotSoundSync(kShuttleBreakawayIn, kShuttleBreakawayOut); 2831 playSpotSoundSync(kMarsAtmosphericBreakawayIn, kMarsAtmosphericBreakawayOut); 3623 if (!_vm->isDVD()) { 3624 // Don't play a couple sounds in the DVD version; they were put into 3625 // the canyon video. 3626 playSpotSoundSync(kShuttleConfiguringIn, kShuttleConfiguringOut); 3627 playSpotSoundSync(kShuttleGeneratingIn, kShuttleGeneratingOut); 3628 playSpotSoundSync(kShuttleBreakawayIn, kShuttleBreakawayOut); 3629 playSpotSoundSync(kMarsAtmosphericBreakawayIn, kMarsAtmosphericBreakawayOut); 3630 } 2832 3631 2833 3632 initOneMovie(&_planetMovie, "Images/Mars/Planet.movie", kShuttlePlanetOrder, kPlanetStartLeft, kPlanetStartTop, true); 2834 3633 _planetMovie.setFlags(kLoopTimeBase); … … void Mars::throwAwayMarsShuttle() { 3013 3812 loadLoopSound1(""); 3014 3813 } 3015 3814 3016 void Mars::transportToRobotShip() { 3815 void Mars::playSpaceAmbient() { 3816 if (_vm->isDVD()) 3817 loadLoopSound1("Sounds/Mars/Space Ambient.44K.16.AIFF"); 3818 else 3819 loadLoopSound1("Sounds/Mars/Space Ambient.22K.8.AIFF"); 3820 } 3821 3822 void Mars::transportOutFromSpaceChase(bool destroyedShip) { 3017 3823 throwAwayMarsShuttle(); 3018 3824 3019 Video::VideoDecoder *video = new Video::QuickTimeDecoder(); 3020 if (!video->loadFile("Images/Mars/M98EAE.movie")) 3021 error("Could not load shuttle->interface transition video"); 3825 Video::VideoDecoder *video = 0; 3826 3827 #ifdef USE_THEORADEC 3828 if (_vm->isDVD()) { 3829 video = new Video::TheoraDecoder(); 3830 3831 if (destroyedShip) { 3832 if (!video->loadFile("Images/Mars/M98EAP_hq.ogg")) { 3833 delete video; 3834 video = 0; 3835 } 3836 } else if (!video->loadFile("Images/Mars/M98EAE_hq.ogg")) { 3837 delete video; 3838 video = 0; 3839 } 3840 } 3841 #endif 3842 3843 if (!video) { 3844 video = new Video::QuickTimeDecoder(); 3845 if (destroyedShip && _vm->isDVD()) { 3846 if (!video->loadFile("Images/Mars/M98EAP.movie")) 3847 error("Could not load shuttle->TSA transition video"); 3848 } else if (!video->loadFile("Images/Mars/M98EAE.movie")) 3849 error("Could not load shuttle->interface transition video"); 3850 } 3022 3851 3852 video->setVolume(MIN<uint>(_vm->getSoundFXLevel(), 0xFF)); 3023 3853 video->start(); 3024 3854 3025 3855 while (!_vm->shouldQuit() && !video->endOfVideo()) { … … void Mars::transportToRobotShip() { 3042 3872 if (_vm->shouldQuit()) 3043 3873 return; 3044 3874 3045 reinstateMonocleInterface(); 3875 if (!destroyedShip) { 3876 reinstateMonocleInterface(); 3046 3877 3047 g_energyMonitor->stopEnergyDraining();3048 g_energyMonitor->restoreLastEnergyValue();3049 _vm->resetEnergyDeathReason();3050 g_energyMonitor->startEnergyDraining();3878 g_energyMonitor->stopEnergyDraining(); 3879 g_energyMonitor->restoreLastEnergyValue(); 3880 _vm->resetEnergyDeathReason(); 3881 g_energyMonitor->startEnergyDraining(); 3051 3882 3052 arriveAt(kMarsRobotShuttle, kEast);3883 arriveAt(kMarsRobotShuttle, kEast); 3053 3884 3054 _navMovie.stop(); 3055 _navMovie.setTime(_navMovie.getStart()); 3056 _navMovie.start(); 3885 _navMovie.stop(); 3886 _navMovie.setTime(_navMovie.getStart()); 3887 _navMovie.start(); 3888 } 3057 3889 } 3058 3890 3059 3891 const int kRobotTooStrong = 1; -
engines/pegasus/neighborhood/mars/mars.h
diff --git a/engines/pegasus/neighborhood/mars/mars.h b/engines/pegasus/neighborhood/mars/mars.h index 0859522..09b4faf 100644
a b 40 40 41 41 namespace Pegasus { 42 42 43 class CanyonChase; 43 44 class InventoryItem; 44 45 class Mars; 46 class TunnelPod; 45 47 46 48 enum MarsTimerCode { 49 kMarsPodCautionDisplayed, 50 kMarsPodCautionDismissed, 51 kMarsCanyonChaseExited, 52 kMarsCanyonChaseFaded, 47 53 kMarsLaunchTubeReached, 48 54 kMarsCanyonChaseFinished, 49 55 kMarsSpaceChaseFinished // Player ran out of time... … … enum ShuttleWeaponSelection { 64 70 }; 65 71 66 72 class Mars : public Neighborhood { 73 friend class CanyonChase; 74 friend class TunnelPod; 67 75 friend struct MarsTimerEvent; 68 76 public: 69 77 Mars(InputHandler *, PegasusEngine *); 70 78 virtual ~Mars(); 71 79 80 virtual GameInteraction *makeInteraction(const InteractionID); 81 72 82 void flushGameState(); 73 83 74 84 virtual uint16 getDateResID() const; … … protected: 133 143 CanOpenDoorReason canOpenDoor(DoorTable::Entry &); 134 144 void openDoor(); 135 145 void closeDoorOffScreen(const RoomID, const DirectionConstant); 146 void startDoorOpenMovie(const TimeValue, const TimeValue); 147 void startExitMovie(const ExitTable::Entry &); 136 148 int16 getStaticCompassAngle(const RoomID, const DirectionConstant); 137 149 void getExitCompassMove(const ExitTable::Entry &, FaderMoveSpec &); 138 150 void getExtraCompassMove(const ExtraTable::Entry &, FaderMoveSpec &); 139 151 void turnTo(const DirectionConstant); 152 void startExtraSequence(const ExtraID, const NotificationFlags, const InputBits); 140 153 void receiveNotification(Notification *, const NotificationFlags); 141 154 void doorOpened(); 155 void startUpFromFinishedTunnelPod(); 142 156 void setUpReactorEnergyDrain(); 143 157 Hotspot *getItemScreenSpot(Item *, DisplayElement *); 144 158 void lockThawed(); … … protected: 170 184 void launchMaze136Robot(); 171 185 void launchMaze184Robot(); 172 186 void timerExpired(const uint32); 187 void showRobotAtReactor(); 173 188 void spotCompleted(); 174 189 175 190 void doCanyonChase(void); … … protected: 178 193 void throwAwayMarsShuttle(); 179 194 void startUpFromFinishedSpaceChase(); 180 195 void startUpFromSpaceChase(); 181 void transport ToRobotShip();196 void transportOutFromSpaceChase(bool); 182 197 void spaceChaseClick(const Input &, const HotSpotID); 183 198 void updateCursor(const Common::Point, const Hotspot *); 199 void playSpaceAmbient(); 184 200 185 201 Common::String getSoundSpotsName(); 186 202 Common::String getNavMovieName(); 187 203 204 Movie _extraMovie; 205 NotificationCallBack _extraMovieCallBack; 206 207 Movie _podSteerMovie; 188 208 InventoryItem *_attackingItem; 189 209 FuseFunction _bombFuse; 190 210 FuseFunction _noAirFuse; … … protected: 202 222 Picture _shuttleInterface3; 203 223 Picture _shuttleInterface4; 204 224 Movie _canyonChaseMovie; 225 Sound _musicLoop; 226 SoundFader _musicFader; 205 227 206 228 MarsTimerEvent _marsEvent; 207 229 -
new file engines/pegasus/neighborhood/mars/tunnelpod.cpp
diff --git a/engines/pegasus/neighborhood/mars/tunnelpod.cpp b/engines/pegasus/neighborhood/mars/tunnelpod.cpp new file mode 100644 index 0000000..b96c427
- + 1 /* ScummVM - Graphic Adventure Engine 2 * 3 * ScummVM is the legal property of its developers, whose names 4 * are too numerous to list here. Please refer to the COPYRIGHT 5 * file distributed with this source distribution. 6 * 7 * Additional copyright for this file: 8 * Copyright (C) 1995-2013 Presto Studios, Inc. 9 * 10 * This program is free software; you can redistribute it and/or 11 * modify it under the terms of the GNU General Public License 12 * as published by the Free Software Foundation; either version 2 13 * of the License, or (at your option) any later version. 14 15 * This program is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU General Public License for more details. 19 20 * You should have received a copy of the GNU General Public License 21 * along with this program; if not, write to the Free Software 22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 23 * 24 */ 25 26 #include "pegasus/pegasus.h" 27 #include "pegasus/items/biochips/arthurchip.h" 28 #include "pegasus/neighborhood/mars/tunnelpod.h" 29 #include "pegasus/neighborhood/mars/mars.h" 30 31 namespace Pegasus { 32 33 // Segment start and end points. 34 35 static const TimeValue kLaunchStart = 315754; 36 static const TimeValue kLaunchEnd = 319392; 37 38 static const TimeValue kBranch1MainStart = 0; 39 static const TimeValue kBranch1MainEnd = 3600; 40 static const TimeValue kBranch2MainStart = kBranch1MainEnd; 41 static const TimeValue kBranch2MainEnd = 13200; 42 static const TimeValue kBranch3MainStart = kBranch2MainEnd; 43 static const TimeValue kBranch3MainEnd = 20400; 44 static const TimeValue kFinishMainStart = kBranch3MainEnd; 45 static const TimeValue kFinishMainEnd = 30640; 46 47 static const TimeValue kBranch2AltStart = 0; 48 static const TimeValue kBranch2AltEnd = 13200; 49 static const TimeValue kBranch3AltStart = kBranch2AltEnd; 50 static const TimeValue kBranch3AltEnd = 22800; 51 static const TimeValue kFinishAltStart = kBranch3AltEnd; 52 static const TimeValue kFinishAltEnd = 33640; 53 54 // Tunnel state. 55 56 enum { 57 kTunnelLaunch, 58 kTunnelBranch1Left, 59 kTunnelBranch2Left, 60 kTunnelBranch2Right, 61 kTunnelBranch3Left, 62 kTunnelBranch3Right, 63 kTunnelFinish 64 }; 65 66 67 TunnelPod::TunnelPod(Neighborhood *handler) : ChaseInteraction(kMarsTunnelPodInteractionID, handler, 68 kMarsTunnelPodNotificationID, (PegasusEngine *)g_engine), _tunnelMainMovie(kNoDisplayElement), 69 _tunnelAltMovie(kNoDisplayElement), _deathMovie(kNoDisplayElement) { 70 _currentMovie = NULL; 71 _currentCallBack = NULL; 72 } 73 74 void TunnelPod::openInteraction() { 75 ((Mars *)_owner)->_navMovie.stop(); 76 77 _tunnelCallBack.setNotification(&_chaseNotification); 78 _tunnelCallBack.initCallBack(&((Mars *)_owner)->_navMovie, kCallBackAtExtremes); 79 _tunnelCallBack.setCallBackFlag(kChaseEnteredBranchZone); 80 _tunnelCallBack.scheduleCallBack(kTriggerAtStop, 0, 0); 81 82 _tunnelMainMovie.initFromMovieFile("Images/Mars/Pod 2345M.mov"); 83 _tunnelMainMovie.setVolume(((PegasusEngine *)g_engine)->getSoundFXLevel()); 84 _tunnelMainMovie.moveElementTo(kNavAreaLeft, kNavAreaTop); 85 _tunnelMainMovie.setDisplayOrder(kNavMovieOrder); 86 87 _tunnelMainCallBack.setNotification(&_chaseNotification); 88 _tunnelMainCallBack.initCallBack(&_tunnelMainMovie, kCallBackAtExtremes); 89 _tunnelMainCallBack.setCallBackFlag(kChaseEnteredBranchZone); 90 _tunnelMainCallBack.scheduleCallBack(kTriggerAtStop, 0, 0); 91 92 _tunnelAltMovie.initFromMovieFile("Images/Mars/Pod 345A.mov"); 93 _tunnelAltMovie.setVolume(((PegasusEngine *)g_engine)->getSoundFXLevel()); 94 _tunnelAltMovie.moveElementTo(kNavAreaLeft, kNavAreaTop); 95 _tunnelAltMovie.setDisplayOrder(kNavMovieOrder); 96 97 _tunnelAltCallBack.setNotification(&_chaseNotification); 98 _tunnelAltCallBack.initCallBack(&_tunnelAltMovie, kCallBackAtExtremes); 99 _tunnelAltCallBack.setCallBackFlag(kChaseEnteredBranchZone); 100 _tunnelAltCallBack.scheduleCallBack(kTriggerAtStop, 0, 0); 101 102 _deathMovie.initFromMovieFile("Images/Mars/Pod 2D.mov"); 103 _deathMovie.setVolume(((PegasusEngine *)g_engine)->getSoundFXLevel()); 104 _deathMovie.moveElementTo(kNavAreaLeft, kNavAreaTop); 105 _deathMovie.setDisplayOrder(kNavMovieOrder); 106 107 _deathCallBack.setNotification(&_chaseNotification); 108 _deathCallBack.initCallBack(&_deathMovie, kCallBackAtExtremes); 109 _deathCallBack.setCallBackFlag(kChaseFinished); 110 _deathCallBack.scheduleCallBack(kTriggerAtStop, 0 ,0); 111 112 ChaseInteraction::openInteraction(); 113 114 _steerPict.setDisplayOrder(kNavMovieOrder + 1); 115 _steerPict.moveElementTo(kPodSteerLeft, kPodSteerTop); 116 } 117 118 void TunnelPod::initInteraction() { 119 _steerPict.startDisplaying(); 120 121 _tunnelState = kTunnelLaunch; 122 ((Mars *)_owner)->_navMovie.setSegment(kLaunchStart, kLaunchEnd - kDecisionTime); 123 ((Mars *)_owner)->_navMovie.setTime(kLaunchStart); 124 ((Mars *)_owner)->_navMovie.start(); 125 _currentMovie = &((Mars *)_owner)->_navMovie; 126 _currentCallBack = &_tunnelCallBack; 127 ChaseInteraction::initInteraction(); 128 if (g_arthurChip) 129 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBB27", kArthurMarsTurnedOnTransport); 130 } 131 132 void TunnelPod::closeInteraction() { 133 ((Mars *)_owner)->_navMovie.stop(); 134 if (_tunnelState == kTunnelFinish) { 135 // Only bring nack the nav movie if we successfully finished the chase 136 ((Mars *)_owner)->_navMovie.startDisplaying(); 137 ((Mars *)_owner)->_navMovie.show(); 138 } 139 _tunnelCallBack.releaseCallBack(); 140 141 _tunnelAltMovie.stop(); 142 _tunnelAltMovie.stopDisplaying(); 143 _tunnelAltMovie.releaseMovie(); 144 _tunnelAltCallBack.releaseCallBack(); 145 146 _deathMovie.stop(); 147 _deathMovie.stopDisplaying(); 148 _deathMovie.releaseMovie(); 149 _deathCallBack.releaseCallBack(); 150 151 ChaseInteraction::closeInteraction(); 152 } 153 154 void TunnelPod::receiveNotification(Notification *notification, const NotificationFlags flags) { 155 if (notification == &_chaseNotification && flags == kChaseFinished) { 156 if (_tunnelState != kTunnelFinish) { 157 // We died 158 ((Mars *)_owner)->die(kDeathCollidedWithPod); 159 } else { 160 ((Mars *)_owner)->startUpFromFinishedTunnelPod(); 161 } 162 } 163 ChaseInteraction::receiveNotification(notification, flags); 164 } 165 166 void TunnelPod::setUpBranch() { 167 TimeValue branchStart, branchEnd; 168 169 branchStart = 0; 170 branchEnd = 0; 171 switch (_tunnelState) { 172 case kTunnelLaunch: 173 branchStart = kLaunchEnd - kDecisionTime; 174 branchEnd = kLaunchEnd; 175 break; 176 case kTunnelBranch1Left: 177 branchStart = kBranch1MainEnd - kDecisionTime; 178 branchEnd = kBranch1MainEnd; 179 break; 180 case kTunnelBranch2Left: 181 branchStart = kBranch2AltEnd - kDecisionTime; 182 branchEnd = kBranch2AltEnd; 183 break; 184 case kTunnelBranch2Right: 185 branchStart = kBranch2MainEnd - kDecisionTime; 186 branchEnd = kBranch2MainEnd; 187 break; 188 case kTunnelBranch3Left: 189 branchStart = kBranch3MainEnd - kDecisionTime; 190 branchEnd = kBranch3MainEnd; 191 break; 192 case kTunnelBranch3Right: 193 branchStart = kBranch3AltEnd - kDecisionTime; 194 branchEnd = kBranch3AltEnd; 195 break; 196 default: 197 break; 198 } 199 200 _currentMovie->setSegment(branchStart, branchEnd); 201 202 _currentCallBack->setCallBackFlag(kChaseExitedBranchZone); 203 _currentCallBack->scheduleCallBack(kTriggerAtStop, 0, 0); 204 } 205 206 void TunnelPod::branchLeft() { 207 TimeValue branchStart, branchEnd; 208 NotificationFlags flag; 209 Movie *movie; 210 NotificationCallBack *callBack; 211 212 branchStart = 0; 213 branchEnd = 0; 214 flag = 0; 215 movie = NULL; 216 callBack = NULL; 217 switch (_tunnelState) { 218 case kTunnelLaunch: 219 branchStart = kBranch1MainStart; 220 branchEnd = kBranch1MainEnd - kDecisionTime; 221 _tunnelState = kTunnelBranch1Left; 222 flag = kChaseEnteredBranchZone; 223 movie = &_tunnelMainMovie; 224 callBack = &_tunnelMainCallBack; 225 break; 226 case kTunnelBranch1Left: 227 branchStart = kBranch2AltStart; 228 branchEnd = kBranch2AltEnd - kDecisionTime; 229 _tunnelState = kTunnelBranch2Left; 230 flag = kChaseEnteredBranchZone; 231 movie = &_tunnelAltMovie; 232 callBack = &_tunnelAltCallBack; 233 break; 234 case kTunnelBranch2Left: 235 case kTunnelBranch2Right: 236 branchStart = kBranch3MainStart; 237 branchEnd = kBranch3MainEnd - kDecisionTime; 238 _tunnelState = kTunnelBranch3Left; 239 flag = kChaseEnteredBranchZone; 240 movie = &_tunnelMainMovie; 241 callBack = &_tunnelMainCallBack; 242 break; 243 case kTunnelBranch3Left: 244 case kTunnelBranch3Right: 245 branchStart = kFinishAltStart; 246 branchEnd = kFinishAltEnd; 247 _tunnelState = kTunnelFinish; 248 flag = kChaseFinished; 249 movie = &_tunnelAltMovie; 250 callBack = &_tunnelAltCallBack; 251 break; 252 default: 253 break; 254 } 255 256 movie->setSegment(branchStart, branchEnd); 257 movie->setTime(branchStart); 258 259 switchTo(*movie, *callBack); 260 261 callBack->setCallBackFlag(flag); 262 callBack->scheduleCallBack(kTriggerAtStop, 0, 0); 263 } 264 265 void TunnelPod::branchRight() { 266 TimeValue branchStart, branchEnd; 267 NotificationFlags flag; 268 Movie *movie; 269 NotificationCallBack *callBack; 270 271 branchStart = 0; 272 branchEnd = 0; 273 flag = 0; 274 movie = NULL; 275 callBack = NULL; 276 switch (_tunnelState) { 277 case kTunnelLaunch: 278 switchTo(_deathMovie, _deathCallBack); 279 return; 280 case kTunnelBranch1Left: 281 branchStart = kBranch2MainStart; 282 branchEnd = kBranch2MainEnd - kDecisionTime; 283 _tunnelState = kTunnelBranch2Right; 284 flag = kChaseEnteredBranchZone; 285 movie = &_tunnelMainMovie; 286 callBack = &_tunnelMainCallBack; 287 break; 288 case kTunnelBranch2Left: 289 case kTunnelBranch2Right: 290 branchStart = kBranch3AltStart; 291 branchEnd = kBranch3AltEnd - kDecisionTime; 292 _tunnelState = kTunnelBranch3Right; 293 flag = kChaseEnteredBranchZone; 294 movie = &_tunnelAltMovie; 295 callBack = &_tunnelAltCallBack; 296 break; 297 case kTunnelBranch3Left: 298 case kTunnelBranch3Right: 299 branchStart = kFinishMainStart; 300 branchEnd = kFinishMainEnd; 301 _tunnelState = kTunnelFinish; 302 flag = kChaseFinished; 303 movie = &_tunnelMainMovie; 304 callBack = &_tunnelMainCallBack; 305 break; 306 default: 307 break; 308 } 309 310 movie->setSegment(branchStart, branchEnd); 311 movie->setTime(branchStart); 312 313 switchTo(*movie, *callBack); 314 315 callBack->setCallBackFlag(flag); 316 callBack->scheduleCallBack(kTriggerAtStop, 0, 0); 317 } 318 319 void TunnelPod::dontBranch() { 320 switch (_tunnelState) { 321 case kTunnelLaunch: 322 case kTunnelBranch1Left: 323 if (_currentMovie == &_tunnelAltMovie) 324 branchLeft(); 325 else 326 branchRight(); 327 break; 328 case kTunnelBranch2Left: 329 case kTunnelBranch2Right: 330 if (_currentMovie == &_tunnelAltMovie) 331 branchRight(); 332 else 333 branchLeft(); 334 break; 335 case kTunnelBranch3Left: 336 case kTunnelBranch3Right: 337 if (_currentMovie == &_tunnelAltMovie) 338 branchLeft(); 339 else 340 branchRight(); 341 break; 342 default: 343 break; 344 } 345 } 346 347 void TunnelPod::switchTo(Movie &movie, NotificationCallBack &callBack) { 348 if (_currentMovie != &movie) { 349 if (_currentMovie != NULL) { 350 _currentMovie->stop(); 351 _currentMovie->hide(); 352 _currentMovie->stopDisplaying(); 353 } 354 355 _currentMovie = &movie; 356 357 _currentMovie->startDisplaying(); 358 _currentMovie->show(); 359 _currentMovie->start(); 360 } 361 362 if (_currentCallBack != &callBack) { 363 _currentCallBack = &callBack; 364 } 365 } 366 367 } // End of namespace Pegasus -
new file engines/pegasus/neighborhood/mars/tunnelpod.h
diff --git a/engines/pegasus/neighborhood/mars/tunnelpod.h b/engines/pegasus/neighborhood/mars/tunnelpod.h new file mode 100644 index 0000000..12b2dd9
- + 1 /* ScummVM - Graphic Adventure Engine 2 * 3 * ScummVM is the legal property of its developers, whose names 4 * are too numerous to list here. Please refer to the COPYRIGHT 5 * file distributed with this source distribution. 6 * 7 * Additional copyright for this file: 8 * Copyright (C) 1995-2013 Presto Studios, Inc. 9 * 10 * This program is free software; you can redistribute it and/or 11 * modify it under the terms of the GNU General Public License 12 * as published by the Free Software Foundation; either version 2 13 * of the License, or (at your option) any later version. 14 15 * This program is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU General Public License for more details. 19 20 * You should have received a copy of the GNU General Public License 21 * along with this program; if not, write to the Free Software 22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 23 * 24 */ 25 26 #ifndef PEGASUS_NEIGHBORHOOD_MARS_TUNNELPOD_H 27 #define PEGASUS_NEIGHBORHOOD_MARS_TUNNELPOD_H 28 29 #include "pegasus/chase.h" 30 #include "pegasus/movie.h" 31 32 namespace Pegasus { 33 34 class Mars; 35 36 class TunnelPod : public ChaseInteraction { 37 friend class Mars; 38 friend struct MusicTimerEvent; 39 public: 40 41 TunnelPod(Neighborhood *); 42 virtual ~TunnelPod() {} 43 44 protected: 45 46 void openInteraction(); 47 void initInteraction(); 48 void closeInteraction(); 49 50 void receiveNotification(Notification *, const NotificationFlags); 51 52 void setUpBranch(); 53 void branchLeft(); 54 void branchRight(); 55 void dontBranch(); 56 57 void switchTo(Movie &, NotificationCallBack &); 58 59 Movie _tunnelMainMovie; 60 Movie _tunnelAltMovie; 61 Movie _deathMovie; 62 NotificationCallBack _tunnelCallBack; 63 NotificationCallBack _tunnelMainCallBack; 64 NotificationCallBack _tunnelAltCallBack; 65 NotificationCallBack _deathCallBack; 66 67 Movie *_currentMovie; 68 NotificationCallBack *_currentCallBack; 69 short _tunnelState; 70 }; 71 72 } // End of namespace Pegasus 73 74 #endif -
engines/pegasus/neighborhood/neighborhood.cpp
diff --git a/engines/pegasus/neighborhood/neighborhood.cpp b/engines/pegasus/neighborhood/neighborhood.cpp index 3116bd7..d7e25a1 100644
a b 36 36 #include "pegasus/interface.h" 37 37 #include "pegasus/pegasus.h" 38 38 #include "pegasus/ai/ai_area.h" 39 #include "pegasus/items/biochips/arthurchip.h" 39 40 #include "pegasus/items/biochips/mapchip.h" 40 41 #include "pegasus/neighborhood/neighborhood.h" 41 42 #include "pegasus/neighborhood/tsa/fulltsa.h" … … void Neighborhood::cantMoveThatWay(CanMoveForwardReason reason) { 719 720 } 720 721 721 722 void Neighborhood::cantOpenDoor(CanOpenDoorReason) { 723 bool firstLockedDoor; 724 722 725 bumpIntoWall(); 726 if (g_arthurChip) { 727 firstLockedDoor = g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA31", kArthurAttemptedLockedDoor); 728 729 if (!firstLockedDoor) 730 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA32", kArthurAttemptedLockedDoorAgain); 731 } 723 732 } 724 733 725 734 void Neighborhood::turnTo(const DirectionConstant direction) { … … void Neighborhood::startExitMovie(const ExitTable::Entry &exitEntry) { 1004 1013 GameState.setNextDirection(exitEntry.exitDirection); 1005 1014 1006 1015 if (exitEntry.movieEnd == exitEntry.exitEnd) // Just a walk. 1007 startMovieSequence(exitEntry.movieStart, exitEntry.movieEnd, kMoveForwardCompletedFlag, kFilterNoInput, false);1016 startMovieSequence(exitEntry.movieStart, exitEntry.movieEnd, kMoveForwardCompletedFlag, false, kFilterNoInput); 1008 1017 else // We're stridin'! 1009 startMovieSequence(exitEntry.movieStart, exitEntry.exitEnd, kStrideCompletedFlag, kFilterNoInput, false, exitEntry.movieEnd);1018 startMovieSequence(exitEntry.movieStart, exitEntry.exitEnd, kStrideCompletedFlag, false, kFilterNoInput, exitEntry.movieEnd); 1010 1019 1011 1020 if (g_compass) 1012 1021 g_compass->startFader(compassMove); … … void Neighborhood::startZoomMovie(const ZoomTable::Entry &zoomEntry) { 1021 1030 GameState.setNextRoom(zoomEntry.room); 1022 1031 GameState.setNextDirection(zoomEntry.direction); 1023 1032 1024 startMovieSequence(zoomEntry.movieStart, zoomEntry.movieEnd, kMoveForwardCompletedFlag, kFilterNoInput, false);1033 startMovieSequence(zoomEntry.movieStart, zoomEntry.movieEnd, kMoveForwardCompletedFlag, false, kFilterNoInput); 1025 1034 1026 1035 if (g_compass) 1027 1036 g_compass->startFader(compassMove); 1028 1037 } 1029 1038 1030 1039 void Neighborhood::startDoorOpenMovie(const TimeValue startTime, const TimeValue stopTime) { 1031 startMovieSequence(startTime, stopTime, kDoorOpenCompletedFlag, kFilterNoInput, false);1040 startMovieSequence(startTime, stopTime, kDoorOpenCompletedFlag, false, kFilterNoInput); 1032 1041 } 1033 1042 1034 1043 void Neighborhood::startTurnPush(const TurnDirection turnDirection, const TimeValue newView, const DirectionConstant nextDir) { … … void Neighborhood::activateOneHotspot(HotspotInfoTable::Entry &entry, Hotspot *h 1186 1195 1187 1196 void Neighborhood::startSpotOnceOnly(TimeValue startTime, TimeValue stopTime) { 1188 1197 _turnPush.hide(); 1189 startMovieSequence(startTime, stopTime, kSpotCompletedFlag, kFilterNoInput, false);1198 startMovieSequence(startTime, stopTime, kSpotCompletedFlag, false, kFilterNoInput); 1190 1199 } 1191 1200 1192 1201 void Neighborhood::startMovieSequence(const TimeValue startTime, const TimeValue stopTime, NotificationFlags flags, bool loopSequence, … … void Neighborhood::startExtraLongSequence(const uint32 firstExtra, const uint32 1550 1559 getExtraEntry(lastExtra, lastEntry); 1551 1560 _lastExtra = firstExtra; 1552 1561 _turnPush.hide(); 1553 startMovieSequence(firstEntry.movieStart, lastEntry.movieEnd, flags, kFilterNoInput, interruptionFilter);1562 startMovieSequence(firstEntry.movieStart, lastEntry.movieEnd, flags, false, interruptionFilter); 1554 1563 } 1555 1564 } 1556 1565 … … void Neighborhood::handleInput(const Input &input, const Hotspot *cursorSpot) { 1647 1656 else if (input.rightButtonAnyDown()) 1648 1657 rightButton(input); 1649 1658 } 1650 1659 if (_vm->toggleRequested()) { 1660 _vm->requestToggle(false); 1661 if (g_AIArea) 1662 g_AIArea->setChattyAI(!g_AIArea->isChattyAI()); 1663 } 1651 1664 InputHandler::handleInput(input, cursorSpot); 1652 1665 } 1653 1666 -
engines/pegasus/neighborhood/neighborhood.h
diff --git a/engines/pegasus/neighborhood/neighborhood.h b/engines/pegasus/neighborhood/neighborhood.h index 3c1c5ea..308f608 100644
a b bool operator!=(const QueueRequest &arg1, const QueueRequest &arg2); 93 93 94 94 class GameInteraction; 95 95 class Item; 96 class SubChase; 97 class SubPlatform; 96 98 class Neighborhood; 97 99 98 100 class StriderCallBack : public TimeBaseCallBack { … … typedef Common::Queue<QueueRequest> NeighborhoodActionQueue; 110 112 111 113 class Neighborhood : public IDObject, public NotificationReceiver, public InputHandler, public Idler { 112 114 friend class StriderCallBack; 115 friend class SubChase; 116 friend class SubPlatform; 113 117 114 118 public: 115 119 Neighborhood(InputHandler *nextHandler, PegasusEngine *vm, const Common::String &resName, NeighborhoodID id); … … protected: 290 294 291 295 virtual void createNeighborhoodSpots(); 292 296 293 void resetLastExtra() { _lastExtra = -1; }297 void resetLastExtra() { _lastExtra = 0xffffffff; } 294 298 295 299 virtual void throwAwayInterface(); 296 300 … … protected: 352 356 AlternateID _currentAlternate; 353 357 HotSpotActivationID _currentActivation; 354 358 355 int32_lastExtra;359 ExtraID _lastExtra; 356 360 DeathReason _extraDeathReason; 357 361 358 362 // Graphics -
engines/pegasus/neighborhood/norad/alpha/ecrmonitor.cpp
diff --git a/engines/pegasus/neighborhood/norad/alpha/ecrmonitor.cpp b/engines/pegasus/neighborhood/norad/alpha/ecrmonitor.cpp index e2a0267..d15fe33 100644
a b 24 24 */ 25 25 26 26 #include "pegasus/pegasus.h" 27 #include "pegasus/items/biochips/arthurchip.h" 27 28 #include "pegasus/neighborhood/norad/constants.h" 28 29 #include "pegasus/neighborhood/norad/norad.h" 29 30 #include "pegasus/neighborhood/norad/alpha/ecrmonitor.h" … … void NoradAlphaECRMonitor::closeInteraction() { 214 215 _ecrPan.stopDisplaying(); 215 216 _ecrPan.releasePanorama(); 216 217 _ecrPanCallBack.releaseCallBack(); 218 219 if (g_arthurChip) 220 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBB33", kArthurNoradAtSecurityMonitor); 217 221 } 218 222 219 223 } // End of namespace Pegasus -
engines/pegasus/neighborhood/norad/alpha/fillingstation.cpp
diff --git a/engines/pegasus/neighborhood/norad/alpha/fillingstation.cpp b/engines/pegasus/neighborhood/norad/alpha/fillingstation.cpp index 3491f16..ff5f2d7 100644
a b 25 25 26 26 #include "pegasus/gamestate.h" 27 27 #include "pegasus/pegasus.h" 28 #include "pegasus/items/biochips/arthurchip.h" 28 29 #include "pegasus/items/inventory/airmask.h" 29 30 #include "pegasus/neighborhood/norad/constants.h" 30 31 #include "pegasus/neighborhood/norad/alpha/fillingstation.h" … … void NoradAlphaFillingStation::splashFinished() { 192 193 193 194 void NoradAlphaFillingStation::intakeWarningFinished() { 194 195 setStaticState(kFSMainMenu, kMainMenu); 196 if (g_arthurChip) 197 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA29", kArthurNoradSawIntakeWarning); 195 198 } 196 199 197 200 void NoradAlphaFillingStation::showIntakeInProgress(uint16 numSeconds) { -
engines/pegasus/neighborhood/norad/alpha/noradalpha.cpp
diff --git a/engines/pegasus/neighborhood/norad/alpha/noradalpha.cpp b/engines/pegasus/neighborhood/norad/alpha/noradalpha.cpp index 6a24113..744dff4 100644
a b 23 23 * 24 24 */ 25 25 26 #include "pegasus/cursor.h" 26 27 #include "pegasus/energymonitor.h" 27 28 #include "pegasus/gamestate.h" 29 #include "pegasus/interface.h" 28 30 #include "pegasus/pegasus.h" 29 31 #include "pegasus/ai/ai_area.h" 32 #include "pegasus/items/biochips/arthurchip.h" 30 33 #include "pegasus/items/inventory/airmask.h" 31 34 #include "pegasus/neighborhood/norad/constants.h" 32 35 #include "pegasus/neighborhood/norad/subcontrolroom.h" 33 36 #include "pegasus/neighborhood/norad/alpha/ecrmonitor.h" 34 37 #include "pegasus/neighborhood/norad/alpha/fillingstation.h" 35 38 #include "pegasus/neighborhood/norad/alpha/noradalpha.h" 39 #include "pegasus/neighborhood/norad/alpha/subchase.h" 36 40 37 41 namespace Pegasus { 38 42 43 static const ExtraID kShowThermalScan = 1000; 44 45 static const HotSpotID kThermalScanHotSpotID = 10000; 46 39 47 const uint32 NoradAlpha::_noradAlphaClawExtras[22] = { 40 48 kN22ClawFromAToB, 41 49 kN22ClawALoop, … … const uint32 NoradAlpha::_noradAlphaClawExtras[22] = { 61 69 kN22ClawDClockwise 62 70 }; 63 71 64 NoradAlpha::NoradAlpha(InputHandler *nextHandler, PegasusEngine *owner) : Norad(nextHandler, owner, "Norad Alpha", kNoradAlphaID) { 72 NoradAlpha::NoradAlpha(InputHandler *nextHandler, PegasusEngine *owner) 73 : Norad(nextHandler, owner, "Norad Alpha", kNoradAlphaID), 74 _thermalScanSpot(kThermalScanHotSpotID), _extraMovie(kNoDisplayElement) { 65 75 _elevatorUpRoomID = kNorad11South; 66 76 _elevatorDownRoomID = kNorad12South; 67 77 _elevatorUpSpotID = kNorad12ElevatorUpSpotID; … … NoradAlpha::NoradAlpha(InputHandler *nextHandler, PegasusEngine *owner) : Norad( 82 92 _lowerPressureDoorDownSpotID = kAlphaLowerPressureDoorDownSpotID; 83 93 _lowerPressureDoorAbortSpotID = kNorad21WestOutSpotID; 84 94 85 _pressureSoundIn = k PressureDoorIntro1In;86 _pressureSoundOut = k PressureDoorIntro1Out;87 _equalizeSoundIn = k PressureDoorIntro2In;88 _equalizeSoundOut = k PressureDoorIntro2Out;95 _pressureSoundIn = kAlphaPressureDoorIntro1In; 96 _pressureSoundOut = kAlphaPressureDoorIntro1Out; 97 _equalizeSoundIn = kAlphaPressureDoorIntro2In; 98 _equalizeSoundOut = kAlphaPressureDoorIntro2Out; 89 99 _accessDeniedIn = kAlphaAccessDeniedIn; 90 100 _accessDeniedOut = kAlphaAccessDeniedOut; 91 101 … … NoradAlpha::NoradAlpha(InputHandler *nextHandler, PegasusEngine *owner) : Norad( 97 107 setIsItemTaken(kGasCanister); 98 108 } 99 109 110 NoradAlpha::~NoradAlpha() { 111 if (_vm->isDVD()) 112 _vm->getAllHotspots().remove(&_thermalScanSpot); 113 } 114 100 115 void NoradAlpha::init() { 101 116 Norad::init(); 102 117 118 _extraMovieCallBack.setNotification(&_neighborhoodNotification); 119 120 if (_vm->isDVD()) { 121 _thermalScanSpot.setArea(Common::Rect(216, 112, 336, 312)); 122 _thermalScanSpot.setHotspotFlags(kNeighborhoodSpotFlag | kClickSpotFlag); 123 _vm->getAllHotspots().push_back(&_thermalScanSpot); 124 } 125 103 126 Hotspot *hotspot = _vm->getAllHotspots().findHotspotByID(kN01GasCanisterSpotID); 104 127 hotspot->setMaskedHotspotFlags(kPickUpItemSpotFlag, kPickUpItemSpotFlag); 105 128 HotspotInfoTable::Entry *hotspotEntry = findHotspotEntry(kN01GasCanisterSpotID); … … void NoradAlpha::getExtraCompassMove(const ExtraTable::Entry &entry, FaderMoveSp 208 231 } 209 232 210 233 void NoradAlpha::playClawMonitorIntro() { 211 playSpotSoundSync(k LoadClawIntroIn, kLoadClawIntroOut);234 playSpotSoundSync(kAlphaLoadClawIntroIn, kAlphaLoadClawIntroOut); 212 235 } 213 236 214 237 GameInteraction *NoradAlpha::makeInteraction(const InteractionID interactionID) { … … GameInteraction *NoradAlpha::makeInteraction(const InteractionID interactionID) 217 240 return new NoradAlphaECRMonitor(this); 218 241 case kNoradFillingStationInteractionID: 219 242 return new NoradAlphaFillingStation(this); 243 case kNoradSubChaseInteractionID: 244 return new SubChase(this); 220 245 } 221 246 222 247 return Norad::makeInteraction(interactionID); … … void NoradAlpha::loadAmbientLoops() { 247 272 play unmanned loop 248 273 */ 249 274 250 if (!GameState.getNoradSeenTimeStream() )275 if (!GameState.getNoradSeenTimeStream() || !g_interface || _vm->getEnergyDeathReason() == kDeathSubDestroyed) 251 276 return; 252 277 253 278 RoomID room = GameState.getCurrentRoom(); 254 279 if (GameState.getNoradGassed()) { 255 if (room >= kNorad11 && room <= kNorad19West) 256 loadLoopSound1("Sounds/Norad/NEW SUB AMB.22K.AIFF", kNoradWarningVolume * 3); 257 else if (room >= kNorad21 && room <= kNorad22West) 258 loadLoopSound1("Sounds/Norad/SUB CONTRL LOOP.22K.AIFF", kNoradWarningVolume * 3); 259 else 260 loadLoopSound1("Sounds/Norad/WARNING LOOP.22K.AIFF", kNoradWarningVolume); 280 if (room >= kNorad11 && room <= kNorad19West) { 281 if (_vm->isDVD()) 282 loadLoopSound1("Sounds/Norad/NEW SUB AMB.44K.AIFF", kNoradWarningVolume * 3); 283 else 284 loadLoopSound1("Sounds/Norad/NEW SUB AMB.22K.AIFF", kNoradWarningVolume * 3); 285 } else if (room >= kNorad21 && room <= kNorad22West) { 286 if (_vm->isDVD()) 287 loadLoopSound1("Sounds/Norad/SUB CONTRL LOOP.32K.AIFF", kNoradWarningVolume * 3); 288 else 289 loadLoopSound1("Sounds/Norad/SUB CONTRL LOOP.22K.AIFF", kNoradWarningVolume * 3); 290 } else { 291 if (_vm->isDVD()) 292 loadLoopSound1("Sounds/Norad/WARNING LOOP.32K.AIFF", kNoradWarningVolume); 293 else 294 loadLoopSound1("Sounds/Norad/WARNING LOOP.22K.AIFF", kNoradWarningVolume); 295 } 261 296 } else { 262 297 loadLoopSound1(""); 263 298 } … … void NoradAlpha::arriveAt(const RoomID room, const DirectionConstant direction) 317 352 case kNorad04: 318 353 arriveAtNorad04(); 319 354 break; 355 case kNorad07: 356 if (_vm->isDVD() && GameState.getLastRoom() == kNorad06) 357 startExtraSequence(kShowThermalScan, kExtraCompletedFlag, kFilterNoInput); 358 break; 320 359 case kNorad07North: 321 360 GameState.setScoringSawUnconsciousOperator(true); 361 if (g_arthurChip) 362 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA70", kArthurNoradSawUnconsciousOperator); 322 363 break; 323 364 case kNorad11: 324 365 GameState.setScoringWentThroughPressureDoor(true); … … void NoradAlpha::arriveAt(const RoomID room, const DirectionConstant direction) 330 371 } 331 372 332 373 void NoradAlpha::arriveAtNorad01() { 333 if (!GameState.getNoradSeenTimeStream() && GameState.getCurrentDirection() == kSouth) { 334 GameState.setNoradN22MessagePlayed(false); 335 requestExtraSequence(kNoradArriveFromTSA, kExtraCompletedFlag, kFilterNoInput); 336 // You are no match for me, human. 337 requestExtraSequence(kNorad01RobotTaunt, kExtraCompletedFlag, kFilterNoInput); 374 Item *argonCanister, *nitrogenCanister; 375 376 switch (GameState.getCurrentDirection()) { 377 case kSouth: 378 if (!GameState.getNoradSeenTimeStream()) { 379 GameState.setNoradN22MessagePlayed(false); 380 requestExtraSequence(kNoradArriveFromTSA, kExtraCompletedFlag, kFilterNoInput); 381 // You are no match for me, human. 382 requestExtraSequence(kNorad01RobotTaunt, kExtraCompletedFlag, kFilterNoInput); 383 } 384 break; 385 case kEast: 386 if (g_arthurChip) 387 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA33", kArthurNoradAtSecurityMonitor); 388 break; 389 case kWest: 390 if (GameState.getLastRoom() == kNorad01West) { 391 argonCanister = g_allItems.findItemByID(kArgonCanister); 392 nitrogenCanister = g_allItems.findItemByID(kNitrogenCanister); 393 if (((GameState.isTakenItemID(kArgonCanister) && argonCanister->getItemState() != kArgonFull) || 394 (GameState.isTakenItemID(kNitrogenCanister) && nitrogenCanister->getItemState() != kNitrogenFull)) && g_arthurChip) 395 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA34", kArthurNoradDidntFillCanisters); 396 } 397 break; 338 398 } 339 399 } 340 400 … … void NoradAlpha::arriveAtNorad22() { 359 419 } 360 420 } 361 421 422 void NoradAlpha::turnTo(const DirectionConstant direction) { 423 Norad::turnTo(direction); 424 if (GameState.getCurrentRoomAndView() == MakeRoomView(kNorad01, kEast) && g_arthurChip) 425 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA33", kArthurNoradAtSecurityMonitor); 426 } 427 362 428 void NoradAlpha::bumpIntoWall() { 363 429 requestSpotSound(kAlphaBumpIntoWallIn, kAlphaBumpIntoWallOut, kFilterNoInput, 0); 364 430 Neighborhood::bumpIntoWall(); 365 431 } 366 432 433 void NoradAlpha::startExtraSequence(const ExtraID extraID, const NotificationFlags flags, const InputBits interruptionFilter) { 434 TimeValue segmentStart = 0, segmentStop = 0; 435 bool loopSequence = false; 436 Common::Rect pushBounds; 437 NotificationFlags extraFlags; 438 439 switch (extraID) { 440 case kShowThermalScan: 441 _turnPush.getBounds(pushBounds); 442 443 switch (extraID) { 444 case kShowThermalScan: 445 _extraMovie.initFromMovieFile("Images/Norad Alpha/N07NS.movie"); 446 segmentStart = 0; 447 segmentStop = _extraMovie.getDuration(); 448 loopSequence = false; 449 break; 450 default: 451 break; 452 } 453 454 _lastExtra = extraID; 455 _turnPush.hide(); 456 457 if (!loopSequence && g_AIArea) 458 g_AIArea->lockAIOut(); 459 460 extraFlags = flags; 461 _interruptionFilter = interruptionFilter; 462 // Stop the nav movie before doing anything else 463 _navMovie.stop(); 464 _navMovie.stopDisplaying(); 465 466 _extraMovie.setVolume(_vm->getSoundFXLevel()); 467 _extraMovie.moveElementTo(pushBounds.left, pushBounds.top); 468 _extraMovie.setDisplayOrder(kNavMovieOrder + 1); 469 _extraMovie.startDisplaying(); 470 _extraMovie.show(); 471 _extraMovie.setFlags(0); 472 _extraMovie.setSegment(segmentStart, segmentStop); 473 _extraMovie.setTime(segmentStart); 474 if (loopSequence) 475 _extraMovie.setFlags(kLoopTimeBase); 476 else 477 extraFlags |= kNeighborhoodMovieCompletedFlag; 478 _extraMovieCallBack.cancelCallBack(); 479 _extraMovieCallBack.initCallBack(&_extraMovie, kCallBackAtExtremes); 480 if (extraFlags != 0) { 481 _extraMovieCallBack.setCallBackFlag(extraFlags); 482 _extraMovieCallBack.scheduleCallBack(kTriggerAtStop, 0, 0); 483 } 484 _extraMovie.start(); 485 break; 486 default: 487 Neighborhood::startExtraSequence(extraID, flags, interruptionFilter); 488 break; 489 } 490 } 491 367 492 void NoradAlpha::receiveNotification(Notification *notification, const NotificationFlags flags) { 368 493 if ((flags & kExtraCompletedFlag) != 0) { 369 494 switch (_lastExtra) { 495 case kShowThermalScan: 496 _interruptionFilter = kFilterAllInput; 497 _extraMovie.stopDisplaying(); 498 _extraMovie.releaseMovie(); 499 _navMovie.startDisplaying(); 500 break; 501 case kNorad19ExitToSub: 502 if (_vm->isDVD()) { 503 _interruptionFilter = kFilterAllInput; 504 _vm->_cursor->hide(); 505 setNextHandler(_vm); 506 throwAwayInterface(); 507 loadLoopSound1(""); 508 newInteraction(kNoradSubChaseInteractionID); 509 GameState.setScoringEnteredSub(true); 510 } 511 break; 370 512 case kNoradArriveFromTSA: 371 513 GameState.setNoradSeenTimeStream(true); 372 514 loadAmbientLoops(); 373 515 break; 374 516 case kNorad01RobotTaunt: 375 g_AIArea->playAIMovie(kRightAreaSignature, "Images/AI/Norad/XN01SB", false, kWarningInterruption); 517 if (g_AIArea->isChattyAI()) 518 g_AIArea->playAIMovie(kRightAreaSignature, "Images/AI/Norad/XN01SB", false, kWarningInterruption); 376 519 _interruptionFilter = kFilterAllInput; 377 520 makeContinuePoint(); 378 521 break; … … void NoradAlpha::receiveNotification(Notification *notification, const Notificat 389 532 startExtraSequence(kNorad22SouthFinish, kExtraCompletedFlag, kFilterNoInput); 390 533 break; 391 534 case kNorad22SouthFinish: 535 if (g_arthurChip) 536 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBB29", kArthurNoradSawSubMessage); 392 537 _interruptionFilter = kFilterAllInput; 393 538 // Force ArriveAt to do its thing... 394 539 GameState.setCurrentRoom(kNorad21); 395 540 arriveAt(kNorad22, kSouth); 396 541 break; 542 case kN22ClawFromAToB: 543 case kN22ClawAPinch: 544 case kN22ClawACounterclockwise: 545 case kN22ClawAClockwise: 546 case kN22ClawFromBToA: 547 case kN22ClawFromBToC: 548 case kN22ClawFromBToD: 549 case kN22ClawBPinch: 550 case kN22ClawBCounterclockwise: 551 case kN22ClawBClockwise: 552 case kN22ClawFromCToB: 553 case kN22ClawCPinch: 554 case kN22ClawCCounterclockwise: 555 case kN22ClawCClockwise: 556 case kN22ClawFromDToB: 557 case kN22ClawDPinch: 558 case kN22ClawDCounterclockwise: 559 case kN22ClawDClockwise: 560 if (g_arthurChip) { 561 if (_vm->getRandomBit()) 562 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA64", kArthurNoradPlayedWithClaw); 563 else 564 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA66", kArthurNoradPlayedWithClaw); 565 } 566 break; 397 567 } 398 568 } 399 569 … … TimeValue NoradAlpha::getViewTime(const RoomID room, const DirectionConstant dir 490 660 return Norad::getViewTime(room, direction); 491 661 } 492 662 663 void NoradAlpha::setSoundFXLevel(const uint16 level) { 664 SubChase *chase; 665 666 Neighborhood::setSoundFXLevel(level); 667 if (_currentInteraction != NULL && GameState.getScoringEnteredSub()) { 668 chase = (SubChase *)_currentInteraction; 669 if (chase->_subMovie.isMovieValid()) 670 chase->_subMovie.setVolume(level); 671 } 672 } 673 493 674 void NoradAlpha::turnOnFillingStation() { 494 675 if (GameState.getCurrentRoom() == kNorad01West && !GameState.getNoradFillingStationOn()) { 495 676 GameState.setNoradFillingStationOn(true); 496 677 updateViewFrame(); 678 if (g_arthurChip) 679 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA72", kArthurNoradSawFillingStation); 497 680 } 498 681 } 499 682 … … void NoradAlpha::activateHotspots() { 545 728 } 546 729 } 547 730 break; 731 case MakeRoomView(kNorad07, kNorth): 732 if (_vm->isDVD()) 733 _vm->getAllHotspots().activateOneHotspot(kThermalScanHotSpotID); 734 break; 548 735 case MakeRoomView(kNorad10, kEast): 549 736 if (GameState.isCurrentDoorOpen()) 550 737 _vm->getAllHotspots().deactivateOneHotspot(kNorad10DoorSpotID); … … void NoradAlpha::clickInHotspot(const Input &input, const Hotspot *cursorSpot) { 568 755 hotspotEntry->hotspotItem = item->getObjectID(); 569 756 } 570 757 } 758 } else if (GameState.getCurrentRoomAndView() == MakeRoomView(kNorad07, kNorth) && 759 cursorSpot->getObjectID() == kThermalScanHotSpotID) { 760 startExtraSequence(kShowThermalScan, kExtraCompletedFlag, kFilterNoInput); 571 761 } 572 762 } 573 763 -
engines/pegasus/neighborhood/norad/alpha/noradalpha.h
diff --git a/engines/pegasus/neighborhood/norad/alpha/noradalpha.h b/engines/pegasus/neighborhood/norad/alpha/noradalpha.h index 582d6c2..ef209d3 100644
a b 31 31 namespace Pegasus { 32 32 33 33 class Item; 34 class SubChase; 34 35 35 36 class NoradAlpha : public Norad { 37 friend class SubChase; 36 38 public: 37 39 NoradAlpha(InputHandler *, PegasusEngine *); 38 virtual ~NoradAlpha() {}40 virtual ~NoradAlpha(); 39 41 40 42 virtual void init(); 41 43 void start(); … … public: 77 79 78 80 void checkContinuePoint(const RoomID, const DirectionConstant); 79 81 82 void setSoundFXLevel(const uint16); 83 80 84 bool canSolve(); 81 85 void doSolve(); 82 86 … … protected: 90 94 virtual void arriveAtNorad22(); 91 95 92 96 virtual void arriveAt(const RoomID, const DirectionConstant); 97 virtual void turnTo(const DirectionConstant); 98 99 virtual void startExtraSequence(const ExtraID, const NotificationFlags, const InputBits); 93 100 94 101 virtual void getZoomEntry(const HotSpotID, ZoomTable::Entry &); 95 102 virtual TimeValue getViewTime(const RoomID, const DirectionConstant); … … protected: 102 109 103 110 void bumpIntoWall(); 104 111 112 Hotspot _thermalScanSpot; 113 114 Movie _extraMovie; 115 NotificationCallBack _extraMovieCallBack; 116 105 117 Item *_fillingStationItem; 106 118 107 119 bool _subPrepFailed; -
new file engines/pegasus/neighborhood/norad/alpha/subchase.cpp
diff --git a/engines/pegasus/neighborhood/norad/alpha/subchase.cpp b/engines/pegasus/neighborhood/norad/alpha/subchase.cpp new file mode 100644 index 0000000..861227d
- + 1 /* ScummVM - Graphic Adventure Engine 2 * 3 * ScummVM is the legal property of its developers, whose names 4 * are too numerous to list here. Please refer to the COPYRIGHT 5 * file distributed with this source distribution. 6 * 7 * Additional copyright for this file: 8 * Copyright (C) 1995-2013 Presto Studios, Inc. 9 * 10 * This program is free software; you can redistribute it and/or 11 * modify it under the terms of the GNU General Public License 12 * as published by the Free Software Foundation; either version 2 13 * of the License, or (at your option) any later version. 14 15 * This program is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU General Public License for more details. 19 20 * You should have received a copy of the GNU General Public License 21 * along with this program; if not, write to the Free Software 22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 23 * 24 */ 25 26 #include "pegasus/pegasus.h" 27 #include "pegasus/gamestate.h" 28 #include "pegasus/neighborhood/norad/alpha/subchase.h" 29 #include "pegasus/neighborhood/norad/alpha/noradalpha.h" 30 #include "pegasus/neighborhood/norad/constants.h" 31 32 namespace Pegasus { 33 34 static const TimeScale kSubChaseScale = 600; 35 36 static const DisplayOrder kSubChaseOrder = 27000; 37 38 // Segment start and end points. 39 40 static const TimeValue kIntroStart = 0; 41 static const TimeValue kIntroEnd = 2400; 42 static const TimeValue kDialogStart = kIntroEnd; 43 static const TimeValue kDialogEnd = 20920; 44 static const TimeValue kBranch1Start = kDialogEnd; 45 static const TimeValue kBranch1End = 32120; 46 static const TimeValue kBranch2LeftStart = kBranch1End; 47 static const TimeValue kBranch2LeftEnd = 48080; 48 static const TimeValue kBranch3Start = kBranch2LeftEnd; 49 static const TimeValue kBranch3End = 61080; 50 static const TimeValue kBranch4Start = kBranch3End; 51 static const TimeValue kBranch4End = 84080; 52 static const TimeValue kBranch5Start = kBranch4End; 53 static const TimeValue kBranch5End = 94840; 54 static const TimeValue kBranch6Start = kBranch5End; 55 static const TimeValue kBranch6End = 106040; 56 static const TimeValue kBranch7LeftStart = kBranch6End; 57 static const TimeValue kBranch7LeftEnd = 118840; 58 static const TimeValue kExitStart = kBranch7LeftEnd; 59 static const TimeValue kExitEnd = 133200; 60 static const TimeValue kBranch2RightStart = 133200; 61 static const TimeValue kBranch2RightEnd = 149160; 62 static const TimeValue kBranch7RightStart = 168000; 63 static const TimeValue kBranch7RightEnd = 180800; 64 65 // Death start and end points. 66 67 static const TimeValue kDeath4Start = 149160; 68 static const TimeValue kDeath4End = 158040; 69 static const TimeValue kDeath5Start = kDeath4End; 70 static const TimeValue kDeath5End = 163760; 71 static const TimeValue kDeath6Start = kDeath5End; 72 static const TimeValue kDeath6End = 168000; 73 static const TimeValue kDeath7Start = 180800; 74 static const TimeValue kDeath7End = 187040; 75 76 // Chase state. 77 78 enum { 79 kSubDialog, 80 kSubBranch1, 81 kSubBranch2Left, 82 kSubBranch2Right, 83 kSubBranch3, 84 kSubBranch4, 85 kSubBranch5, 86 kSubBranch6, 87 kSubBranch7Left, 88 kSubBranch7Right, 89 kSubExit 90 }; 91 92 void HintTimerEvent::fire() { 93 subChase->hintTimerExpired(*this); 94 } 95 96 void BlinkTimerEvent::fire() { 97 subChase->blinkTimerExpired(*this); 98 } 99 100 SubChase::SubChase(Neighborhood *handler) : ChaseInteraction(kNoradSubChaseInteractionID, handler, 101 kNoradSubChaseNotificationID, (PegasusEngine *)g_engine), _subMovie(kNoDisplayElement), 102 _hintPict(kNoDisplayElement), _blinkPict(kNoDisplayElement), _canSteerSub(true) { 103 } 104 105 void SubChase::openInteraction() { 106 _subMovie.initFromMovieFile("Images/Norad Alpha/Sub Chase Movie"); 107 _subMovie.setVolume(((PegasusEngine *)g_engine)->getSoundFXLevel()); 108 _subMovie.moveElementTo(0, 0); 109 _subMovie.setDisplayOrder(kSubChaseOrder); 110 _subMovie.startDisplaying(); 111 _subMovie.show(); 112 113 _subCallBack.setNotification(&_chaseNotification); 114 _subCallBack.initCallBack(&_subMovie, kCallBackAtExtremes); 115 116 ChaseInteraction::openInteraction(); 117 118 _steerPict.setDisplayOrder(kSubChaseOrder + 1); 119 _steerPict.moveElementTo(kNoradSubSteerLeft, kNoradSubSteerTop); 120 121 _hintPict.initFromPICTFile("Images/Norad Alpha/Sub Chase steerk1.pict", true); 122 _hintPict.setDisplayOrder(kSubChaseOrder + 1); 123 _hintPict.moveElementTo(kNoradSubHintLeft, kNoradSubHintTop); 124 _blinkPict.initFromPICTFile("Images/Norad Alpha/Sub Chase steerk0.pict", true); 125 _blinkPict.setDisplayOrder(kSubChaseOrder + 1); 126 _blinkPict.moveElementTo(kNoradSubHintLeft, kNoradSubHintTop); 127 } 128 129 void SubChase::initInteraction() { 130 _canSteerSub = !GameState.getWalkthroughMode(); 131 132 _owner->playMovieSegment(&_subMovie, kIntroStart, kIntroEnd); 133 134 _subCallBack.scheduleCallBack(kTriggerAtStop, 0, 0); 135 136 if (_canSteerSub) { 137 _steerPict.startDisplaying(); 138 _hintPict.startDisplaying(); 139 _blinkPict.startDisplaying(); 140 startHintTimer(20000 - kDialogStart, kSubChaseScale, kStartedHint); 141 _subCallBack.setCallBackFlag(kChaseEnteredBranchZone); 142 _subMovie.setSegment(kDialogStart, kBranch1End - kDecisionTime); 143 } else { 144 _subCallBack.setCallBackFlag(kChaseFinished); 145 _subMovie.setSegment(kDialogStart, kExitEnd); 146 } 147 148 _subState = kSubDialog; 149 _subMovie.setTime(kDialogStart); 150 _subMovie.start(); 151 152 ChaseInteraction::initInteraction(); 153 } 154 155 void SubChase::closeInteraction() { 156 _subMovie.stop(); 157 _subMovie.stopDisplaying(); 158 _subMovie.releaseMovie(); 159 _subCallBack.releaseCallBack(); 160 161 _hintPict.hide(); 162 _hintPict.deallocateSurface(); 163 164 _blinkPict.hide(); 165 _blinkPict.deallocateSurface(); 166 167 ChaseInteraction::closeInteraction(); 168 } 169 170 void SubChase::receiveNotification(Notification *notification, const NotificationFlags flags) { 171 if (notification == &_chaseNotification && flags == kChaseFinished) { 172 if (_subState != kSubDialog && _subState != kSubExit) { 173 // We died 174 ((NoradAlpha *)_owner)->die(kDeathSubDestroyed); 175 } else { 176 _subMovie.stopDisplaying(); 177 ((PegasusEngine *)g_engine)->_gfx->enableErase(); 178 ((PegasusEngine *)g_engine)->_gfx->updateDisplay(); 179 ((PegasusEngine *)g_engine)->_gfx->disableErase(); 180 ((PegasusEngine *)g_engine)->jumpToNewEnvironment(kNoradDeltaID, kNorad41, kEast); 181 } 182 } 183 ChaseInteraction::receiveNotification(notification, flags); 184 } 185 186 void SubChase::handleInput(const Input &input, const Hotspot *cursorSpot) { 187 if (_subMovie.getTime() < kBranch1Start && input.anyInput()) { 188 if (_canSteerSub) { 189 if (!_blinkFuse.isFuseLit()) { 190 // If the hint is not blinking then it must not be running, so display it 191 _hintPict.show(); 192 startBlinkTimer(10, 10, kEnteredBlinkState); 193 } 194 _subState = kSubBranch1; 195 startHintTimer(3000, kSubChaseScale, kEndedHint); 196 } else { 197 _subState = kSubExit; 198 } 199 _subMovie.setTime(kBranch1Start); 200 } else { 201 ChaseInteraction::handleInput(input, cursorSpot); 202 } 203 } 204 205 void SubChase::setUpBranch() { 206 TimeValue branchStart, branchEnd; 207 208 branchStart = 0; 209 branchEnd = 0; 210 switch (_subState) { 211 case kSubDialog: 212 case kSubBranch1: 213 branchStart = kBranch1End - kDecisionTime; 214 branchEnd = kBranch1End; 215 break; 216 case kSubBranch2Left: 217 branchStart = kBranch2LeftEnd - kDecisionTime; 218 branchEnd = kBranch2LeftEnd; 219 break; 220 case kSubBranch2Right: 221 branchStart = kBranch2RightEnd - kDecisionTime; 222 branchEnd = kBranch2RightEnd; 223 break; 224 case kSubBranch3: 225 branchStart = kBranch3End - kDecisionTime; 226 branchEnd = kBranch3End; 227 break; 228 case kSubBranch4: 229 branchStart = kBranch4End - kDecisionTime; 230 branchEnd = kBranch4End; 231 break; 232 case kSubBranch5: 233 branchStart = kBranch5End - kDecisionTime; 234 branchEnd = kBranch5End; 235 break; 236 case kSubBranch6: 237 branchStart = kBranch6End - kDecisionTime; 238 branchEnd = kBranch6End; 239 break; 240 case kSubBranch7Left: 241 branchStart = kBranch7LeftEnd - kDecisionTime; 242 branchEnd = kBranch7LeftEnd; 243 break; 244 case kSubBranch7Right: 245 branchStart = kBranch7RightEnd - kDecisionTime; 246 branchEnd = kBranch7RightEnd; 247 break; 248 default: 249 break; 250 } 251 252 _subMovie.setSegment(branchStart, branchEnd); 253 254 _subCallBack.setCallBackFlag(kChaseExitedBranchZone); 255 _subCallBack.scheduleCallBack(kTriggerAtStop, 0, 0); 256 } 257 258 void SubChase::branchLeft() { 259 TimeValue branchStart, branchEnd; 260 NotificationFlags flag; 261 262 branchStart = 0; 263 branchEnd = 0; 264 flag = 0; 265 switch (_subState) { 266 case kSubDialog: 267 case kSubBranch1: 268 branchStart = kBranch2LeftStart; 269 branchEnd = kBranch2LeftEnd; 270 // Don't show the controls hint when we approach the whale 271 // since the branch segments here are identical 272 flag = kChaseExitedBranchZone; 273 _subState = kSubBranch2Left; 274 break; 275 case kSubBranch2Left: 276 case kSubBranch2Right: 277 branchStart = kBranch3Start; 278 branchEnd = kBranch3End - kDecisionTime; 279 flag = kChaseEnteredBranchZone; 280 _subState = kSubBranch3; 281 break; 282 case kSubBranch3: 283 branchStart = kBranch4Start; 284 branchEnd = kBranch4End - kDecisionTime; 285 flag = kChaseEnteredBranchZone; 286 _subState = kSubBranch4; 287 break; 288 case kSubBranch4: 289 branchStart = kDeath5Start; 290 branchEnd = kDeath5End; 291 flag = kChaseFinished; 292 _subState = kSubBranch5; 293 break; 294 case kSubBranch5: 295 branchStart = kBranch6Start; 296 branchEnd = kBranch6End - kDecisionTime; 297 flag = kChaseEnteredBranchZone; 298 _subState = kSubBranch6; 299 break; 300 case kSubBranch6: 301 branchStart = kBranch7LeftStart; 302 branchEnd = kBranch7LeftEnd; 303 flag = kChaseExitedBranchZone; 304 _subState = kSubBranch7Left; 305 break; 306 case kSubBranch7Left: 307 case kSubBranch7Right: 308 branchStart = kExitStart; 309 branchEnd = kExitEnd; 310 flag = kChaseFinished; 311 _subState = kSubExit; 312 break; 313 default: 314 break; 315 } 316 317 _subMovie.setSegment(branchStart, branchEnd); 318 _subMovie.setTime(branchStart); 319 320 _subCallBack.setCallBackFlag(flag); 321 _subCallBack.scheduleCallBack(kTriggerAtStop, 0, 0); 322 } 323 324 void SubChase::branchRight() { 325 TimeValue branchStart, branchEnd; 326 NotificationFlags flag; 327 328 branchStart = 0; 329 branchEnd = 0; 330 flag = 0; 331 switch (_subState) { 332 case kSubDialog: 333 case kSubBranch1: 334 branchStart = kBranch2RightStart; 335 branchEnd = kBranch2RightEnd; 336 // Don't show the controls hint when we approach the whale 337 // since the branch segments here are identical 338 flag = kChaseExitedBranchZone; 339 _subState = kSubBranch2Right; 340 break; 341 case kSubBranch2Left: 342 case kSubBranch2Right: 343 branchStart = kBranch3Start; 344 branchEnd = kBranch3End - kDecisionTime; 345 flag = kChaseEnteredBranchZone; 346 _subState = kSubBranch3; 347 break; 348 case kSubBranch3: 349 branchStart = kDeath4Start; 350 branchEnd = kDeath4End; 351 flag = kChaseFinished; 352 _subState = kSubBranch4; 353 break; 354 case kSubBranch4: 355 branchStart = kBranch5Start; 356 branchEnd = kBranch5End - kDecisionTime; 357 flag = kChaseEnteredBranchZone; 358 _subState = kSubBranch5; 359 break; 360 case kSubBranch5: 361 branchStart = kDeath6Start; 362 branchEnd = kDeath6End; 363 flag = kChaseFinished; 364 _subState = kSubBranch6; 365 break; 366 case kSubBranch6: 367 if (((PegasusEngine *)g_engine)->getRandomBit()) { 368 branchStart = kBranch7RightStart; 369 branchEnd = kBranch7RightEnd; 370 flag = kChaseExitedBranchZone; 371 } else { 372 branchStart = kDeath7Start; 373 branchEnd = kDeath7End; 374 flag = kChaseFinished; 375 } 376 _subState = kSubBranch7Right; 377 break; 378 case kSubBranch7Left: 379 case kSubBranch7Right: 380 branchStart = kExitStart; 381 branchEnd = kExitEnd; 382 flag = kChaseFinished; 383 _subState = kSubExit; 384 break; 385 default: 386 break; 387 } 388 389 _subMovie.setSegment(branchStart, branchEnd); 390 _subMovie.setTime(branchStart); 391 392 _subCallBack.setCallBackFlag(flag); 393 _subCallBack.scheduleCallBack(kTriggerAtStop, 0, 0); 394 } 395 396 void SubChase::dontBranch() { 397 if (((PegasusEngine *)g_engine)->getRandomBit()) 398 branchLeft(); 399 else 400 branchRight(); 401 } 402 403 void SubChase::startHintTimer(TimeValue time, TimeScale scale, HintTimerCode code) { 404 if (_canSteerSub) { 405 _hintFuse.primeFuse(time, scale); 406 _hintEvent.subChase = this; 407 _hintEvent.theEvent = code; 408 _hintFuse.setFunctor(new Common::Functor0Mem<void, HintTimerEvent>(&_hintEvent, &HintTimerEvent::fire)); 409 _hintFuse.lightFuse(); 410 } 411 } 412 413 void SubChase::hintTimerExpired(HintTimerEvent &event) { 414 switch (event.theEvent) { 415 case kStartedHint: 416 _hintPict.show(); 417 startBlinkTimer(10, 10, kEnteredBlinkState); 418 startHintTimer(3920, kSubChaseScale, kEndedHint); 419 break; 420 case kEndedHint: 421 _hintPict.hide(); 422 _blinkPict.hide(); 423 _blinkFuse.stopFuse(); 424 break; 425 default: 426 break; 427 } 428 } 429 430 void SubChase::startBlinkTimer(TimeValue time, TimeScale scale, BlinkTimerCode code) { 431 _blinkFuse.primeFuse(time, scale); 432 _blinkEvent.subChase = this; 433 _blinkEvent.theEvent = code; 434 _blinkFuse.setFunctor(new Common::Functor0Mem<void, BlinkTimerEvent>(&_blinkEvent, &BlinkTimerEvent::fire)); 435 _blinkFuse.lightFuse(); 436 } 437 438 void SubChase::blinkTimerExpired(BlinkTimerEvent &event) { 439 switch (event.theEvent) { 440 case kEnteredBlinkState: 441 _hintPict.hide(); 442 _blinkPict.show(); 443 startBlinkTimer(5, 10, kExitedBlinkState); 444 break; 445 case kExitedBlinkState: 446 _blinkPict.hide(); 447 _hintPict.show(); 448 startBlinkTimer(10, 10, kEnteredBlinkState); 449 break; 450 default: 451 break; 452 } 453 } 454 455 } // End of namespace Pegasus -
new file engines/pegasus/neighborhood/norad/alpha/subchase.h
diff --git a/engines/pegasus/neighborhood/norad/alpha/subchase.h b/engines/pegasus/neighborhood/norad/alpha/subchase.h new file mode 100644 index 0000000..6eeb6d5
- + 1 /* ScummVM - Graphic Adventure Engine 2 * 3 * ScummVM is the legal property of its developers, whose names 4 * are too numerous to list here. Please refer to the COPYRIGHT 5 * file distributed with this source distribution. 6 * 7 * Additional copyright for this file: 8 * Copyright (C) 1995-2013 Presto Studios, Inc. 9 * 10 * This program is free software; you can redistribute it and/or 11 * modify it under the terms of the GNU General Public License 12 * as published by the Free Software Foundation; either version 2 13 * of the License, or (at your option) any later version. 14 15 * This program is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU General Public License for more details. 19 20 * You should have received a copy of the GNU General Public License 21 * along with this program; if not, write to the Free Software 22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 23 * 24 */ 25 26 #ifndef PEGASUS_NEIGHBORHOOD_NORAD_ALPHA_SUBCHASE_H 27 #define PEGASUS_NEIGHBORHOOD_NORAD_ALPHA_SUBCHASE_H 28 29 #include "pegasus/chase.h" 30 #include "pegasus/movie.h" 31 32 namespace Pegasus { 33 34 class NoradAlpha; 35 class SubChase; 36 37 enum HintTimerCode { 38 kStartedHint, 39 kEndedHint 40 }; 41 42 struct HintTimerEvent { 43 SubChase *subChase; 44 HintTimerCode theEvent; 45 46 void fire(); 47 }; 48 49 enum BlinkTimerCode { 50 kEnteredBlinkState, 51 kExitedBlinkState 52 }; 53 54 struct BlinkTimerEvent { 55 SubChase *subChase; 56 BlinkTimerCode theEvent; 57 58 void fire(); 59 }; 60 61 class SubChase : public ChaseInteraction { 62 friend class NoradAlpha; 63 friend struct HintTimerEvent; 64 friend struct BlinkTimerEvent; 65 public: 66 67 SubChase(Neighborhood *); 68 virtual ~SubChase() {} 69 70 void handleInput(const Input &, const Hotspot *); 71 72 protected: 73 74 void openInteraction(); 75 void initInteraction(); 76 void closeInteraction(); 77 78 void receiveNotification(Notification *, const NotificationFlags); 79 80 void startBranching(); 81 void setUpBranch(); 82 void branchLeft(); 83 void branchRight(); 84 void dontBranch(); 85 86 void startHintTimer(TimeValue, TimeScale, HintTimerCode); 87 void hintTimerExpired(HintTimerEvent &); 88 89 void startBlinkTimer(TimeValue, TimeScale, BlinkTimerCode); 90 void blinkTimerExpired(BlinkTimerEvent &); 91 92 Movie _subMovie; 93 NotificationCallBack _subCallBack; 94 Picture _hintPict; 95 Picture _blinkPict; 96 FuseFunction _hintFuse; 97 FuseFunction _blinkFuse; 98 99 HintTimerEvent _hintEvent; 100 BlinkTimerEvent _blinkEvent; 101 102 short _subState; 103 104 bool _canSteerSub; 105 }; 106 107 } // End of namespace Pegasus 108 109 #endif -
engines/pegasus/neighborhood/norad/constants.h
diff --git a/engines/pegasus/neighborhood/norad/constants.h b/engines/pegasus/neighborhood/norad/constants.h index 37c1769..68e4bcf 100644
a b static const InteractionID kNoradElevatorInteractionID = 3; 216 216 static const InteractionID kNoradPressureDoorInteractionID = 4; 217 217 static const InteractionID kNoradSubControlRoomInteractionID = 5; 218 218 static const InteractionID kNoradSubPlatformInteractionID = 6; 219 static const InteractionID kNoradSubChaseInteractionID = 7; 219 220 220 221 ///////////////////////////////////////////// 221 222 // … … static const CoordType kNoradLowerDownTop = kNavAreaTop + 212; 265 266 static const CoordType kNoradPlatformLeft = kNavAreaLeft + 36; 266 267 static const CoordType kNoradPlatformTop = kNavAreaTop + 87; 267 268 269 static const CoordType kNoradSubSteerLeft = 288; 270 static const CoordType kNoradSubSteerTop = 28; 271 272 static const CoordType kNoradSubHintLeft = 480; 273 static const CoordType kNoradSubHintTop = 240; 274 268 275 static const CoordType kNoradSubControlLeft = kNavAreaLeft + 0; 269 276 static const CoordType kNoradSubControlTop = kNavAreaTop + 84; 270 277 … … static const DisplayElementID kClawMonitorGreenBallID = kSubControlCWID + 1; 385 392 386 393 // Norad Delta display IDs. 387 394 388 static const DisplayElementID kGlobeMonitorID = kNeighborhoodDisplayID; 389 static const DisplayElementID kGlobeMovieID = kGlobeMonitorID + 14; 395 static const DisplayElementID kGlobeRobotID = kNeighborhoodDisplayID; 396 static const DisplayElementID kGlobeMonitorID = kGlobeRobotID + 1; 397 static const DisplayElementID kGlobeMovieID = kGlobeMonitorID + 1; 390 398 static const DisplayElementID kGlobeCircleLeftID = kGlobeMovieID + 1; 391 399 static const DisplayElementID kGlobeCircleRightID = kGlobeCircleLeftID + 1; 392 400 static const DisplayElementID kGlobeCircleUpID = kGlobeCircleRightID + 1; -
engines/pegasus/neighborhood/norad/delta/globegame.cpp
diff --git a/engines/pegasus/neighborhood/norad/delta/globegame.cpp b/engines/pegasus/neighborhood/norad/delta/globegame.cpp index 0b95e9b..db90daf 100644
a b 25 25 26 26 #include "pegasus/cursor.h" 27 27 #include "pegasus/pegasus.h" 28 #include "pegasus/items/biochips/arthurchip.h" 28 29 #include "pegasus/neighborhood/norad/constants.h" 29 30 #include "pegasus/neighborhood/norad/delta/globegame.h" 30 31 #include "pegasus/neighborhood/norad/delta/noraddelta.h" … … static const TimeValue kGlobeMovieStartTime = 2 * 2 * kNumLongSlices * 600 / 15; 387 388 static const TimeValue kTimePerGlobeFrame = 40; 388 389 389 390 static const NotificationFlags kGlobeSplash1Finished = 1; 390 static const NotificationFlags kGlobeTimerExpired = kGlobeSplash1Finished << 1; 391 static const NotificationFlags kGlobeRobot1Finished = kGlobeSplash1Finished << 1; 392 static const NotificationFlags kGlobeRobot2Finished = kGlobeRobot1Finished << 1; 393 static const NotificationFlags kGlobeRobot3Finished = kGlobeRobot2Finished << 1; 394 static const NotificationFlags kGlobeRobot4Finished = kGlobeRobot3Finished << 1; 395 static const NotificationFlags kGlobeRobot5Finished = kGlobeRobot4Finished << 1; 396 static const NotificationFlags kGlobeRobot6Finished = kGlobeRobot5Finished << 1; 397 static const NotificationFlags kGlobeTimerExpired = kGlobeRobot6Finished << 1; 391 398 static const NotificationFlags kMaxDeactivatedFinished = kGlobeTimerExpired << 1; 392 399 393 400 static const NotificationFlags kGlobeNotificationFlags = kGlobeSplash1Finished | 401 kGlobeRobot1Finished | 402 kGlobeRobot2Finished | 403 kGlobeRobot3Finished | 404 kGlobeRobot4Finished | 405 kGlobeRobot5Finished | 406 kGlobeRobot6Finished | 394 407 kGlobeTimerExpired | 395 408 kMaxDeactivatedFinished; 396 409 … … float radiansToDegrees(float angle) { 440 453 } 441 454 442 455 GlobeGame::GlobeGame(Neighborhood *handler) : GameInteraction(kNoradGlobeGameInteractionID, handler), 443 _ monitorMovie(kGlobeMonitorID), _globeMovie(kGlobeMovieID), _upperNamesMovie(kGlobeUpperNamesID),444 _ lowerNamesMovie(kGlobeLowerNamesID), _globeNotification(kNoradGlobeNotificationID, (PegasusEngine *)g_engine),445 _globe CircleLeft(kGlobeCircleLeftID), _globeCircleRight(kGlobeCircleRightID),446 _globeCircle Up(kGlobeCircleUpID), _globeCircleDown(kGlobeCircleDownID),456 _robotMovie(kGlobeRobotID), _monitorMovie(kGlobeMonitorID), _globeMovie(kGlobeMovieID), 457 _upperNamesMovie(kGlobeUpperNamesID), _lowerNamesMovie(kGlobeLowerNamesID), 458 _globeNotification(kNoradGlobeNotificationID, (PegasusEngine *)g_engine), _globeCircleLeft(kGlobeCircleLeftID), 459 _globeCircleRight(kGlobeCircleRightID), _globeCircleUp(kGlobeCircleUpID), _globeCircleDown(kGlobeCircleDownID), 447 460 _motionHighlightLeft(kMotionHiliteLeftID), _motionHighlightRight(kMotionHiliteRightID), 448 461 _motionHighlightUp(kMotionHiliteUpID), _motionHighlightDown(kMotionHiliteDownID), 449 462 _targetHighlightUpperLeft(kTargetHiliteUpperLeftID), _targetHighlightUpperRight(kTargetHiliteUpperRightID), … … GlobeGame::GlobeGame(Neighborhood *handler) : GameInteraction(kNoradGlobeGameInt 454 467 } 455 468 456 469 void GlobeGame::openInteraction() { 470 if (((PegasusEngine *)g_engine)->isDVD()) { 471 _robotMovie.initFromMovieFile("Images/Norad Delta/N79 Back Monitor1"); 472 _robotMovie.moveElementTo(kNavAreaLeft, kNavAreaTop); 473 _robotMovie.setDisplayOrder(kGlobeMonitorLayer); 474 _robotMovie.startDisplaying(); 475 _robotMovie.show(); 476 477 _robotCallBack.setNotification(&_globeNotification); 478 _robotCallBack.initCallBack(&_robotMovie, kCallBackAtExtremes); 479 _robotCallBack.setCallBackFlag(kGlobeRobot1Finished); 480 _robotCallBack.scheduleCallBack(kTriggerAtStop, 0, 0); 481 } 482 457 483 _monitorMovie.initFromMovieFile("Images/Norad Delta/N79 Left Monitor"); 458 484 _monitorMovie.moveElementTo(kGlobeMonitorLeft, kGlobeMonitorTop); 459 485 _monitorMovie.setDisplayOrder(kGlobeMonitorLayer); … … void GlobeGame::openInteraction() { 563 589 } 564 590 565 591 void GlobeGame::initInteraction() { 592 if (((PegasusEngine *)g_engine)->isDVD()) 593 _robotMovie.start(); 566 594 _monitorMovie.start(); 567 595 _monitorMovie.redrawMovieWorld(); 568 596 } 569 597 570 598 void GlobeGame::closeInteraction() { 599 if (((PegasusEngine *)g_engine)->isDVD()) { 600 _robotMovie.stop(); 601 _robotMovie.stopDisplaying(); 602 _robotMovie.releaseMovie(); 603 _robotCallBack.releaseCallBack(); 604 } 605 571 606 _monitorMovie.stop(); 572 607 _monitorMovie.stopDisplaying(); 573 608 _monitorMovie.releaseMovie(); … … void GlobeGame::receiveNotification(Notification *notification, const Notificati 626 661 if (notification == _neighborhoodNotification) { 627 662 switch (_gameState) { 628 663 case kPlayingRobotIntro: 629 _monitorMovie.stop(); 630 _monitorMovie.setSegment(0, _monitorMovie.getDuration()); 631 _monitorMovie.setTime(kSplash2End * scale - 1); 632 _monitorMovie.redrawMovieWorld(); 633 _monitorMovie.setFlags(0); 664 if (!((PegasusEngine *)g_engine)->isDVD()) { 665 _monitorMovie.stop(); 666 _monitorMovie.setSegment(0, _monitorMovie.getDuration()); 667 _monitorMovie.setTime(kSplash2End * scale - 1); 668 _monitorMovie.redrawMovieWorld(); 669 _monitorMovie.setFlags(0); 634 670 635 _owner->requestDelay(1, 2, kFilterNoInput, 0); 636 _owner->requestSpotSound(kStrikeAuthorizedIn, kStrikeAuthorizedOut, 637 kFilterNoInput, kSpotSoundCompletedFlag); 638 _gameState = kPlayingStrikeAuthorized; 671 _owner->requestDelay(1, 2, kFilterNoInput, 0); 672 _owner->requestSpotSound(kStrikeAuthorizedIn, kStrikeAuthorizedOut, 673 kFilterNoInput, kSpotSoundCompletedFlag); 674 _gameState = kPlayingStrikeAuthorized; 675 } 639 676 break; 640 677 case kPlayingStrikeAuthorized: 641 678 _monitorMovie.setSegment(kSplash3Start * scale, kSplash3Stop * scale); … … void GlobeGame::receiveNotification(Notification *notification, const Notificati 741 778 742 779 switch (_currentSiloIndex) { 743 780 case 3: 744 _owner->requestSpotSound(kYouCannotPossiblyIn, kYouCannotPossiblyOut, 745 kFilterNoInput, kSpotSoundCompletedFlag); 781 if (!((PegasusEngine *)g_engine)->isDVD()) { 782 _owner->requestSpotSound(kYouCannotPossiblyIn, kYouCannotPossiblyOut, 783 kFilterNoInput, kSpotSoundCompletedFlag); 784 } else { 785 _robotMovie.hide(); 786 _robotMovie.stopDisplaying(); 787 _robotMovie.releaseMovie(); 788 789 _robotMovie.initFromMovieFile("Images/Norad Delta/N79 Back Monitor2"); 790 _robotMovie.moveElementTo(kNavAreaLeft, kNavAreaTop); 791 _robotMovie.startDisplaying(); 792 _robotMovie.show(); 793 _robotMovie.start(); 794 795 _owner->requestDelay(_robotMovie.getDuration(), 0, kFilterNoInput, kDelayCompletedFlag); 796 } 746 797 break; 747 798 case 5: 748 _owner->requestSpotSound(kYouWillFailIn, kYouWillFailOut, kFilterNoInput, 749 kSpotSoundCompletedFlag); 799 if (!((PegasusEngine *)g_engine)->isDVD()) { 800 _owner->requestSpotSound(kYouWillFailIn, kYouWillFailOut, kFilterNoInput, 801 kSpotSoundCompletedFlag); 802 } else { 803 _robotMovie.hide(); 804 _robotMovie.stopDisplaying(); 805 _robotMovie.releaseMovie(); 806 807 _robotMovie.initFromMovieFile("Images/Norad Delta/N79 Back Monitor3"); 808 _robotMovie.moveElementTo(kNavAreaLeft, kNavAreaTop); 809 _robotMovie.startDisplaying(); 810 _robotMovie.show(); 811 _robotMovie.start(); 812 813 _owner->requestDelay(_robotMovie.getDuration(), 0, kFilterNoInput, kDelayCompletedFlag); 814 } 750 815 break; 751 816 case 7: 752 _owner->requestSpotSound(kGiveUpHumanIn, kGiveUpHumanOut, kFilterNoInput, 753 kSpotSoundCompletedFlag); 817 if (!((PegasusEngine *)g_engine)->isDVD()) { 818 _owner->requestSpotSound(kGiveUpHumanIn, kGiveUpHumanOut, kFilterNoInput, 819 kSpotSoundCompletedFlag); 820 } else { 821 _robotMovie.hide(); 822 _robotMovie.stopDisplaying(); 823 _robotMovie.releaseMovie(); 824 825 _robotMovie.initFromMovieFile("Images/Norad Delta/N79 Back Monitor4"); 826 _robotMovie.moveElementTo(kNavAreaLeft, kNavAreaTop); 827 _robotMovie.startDisplaying(); 828 _robotMovie.show(); 829 _robotMovie.start(); 830 831 _owner->requestDelay(_robotMovie.getDuration(), 0, kFilterNoInput, kDelayCompletedFlag); 832 } 754 833 break; 755 834 case 9: 756 _owner->requestSpotSound(kYouAreRunningIn, kYouAreRunningOut, 757 kFilterNoInput, kSpotSoundCompletedFlag); 835 if (!((PegasusEngine *)g_engine)->isDVD()) { 836 _owner->requestSpotSound(kYouAreRunningIn, kYouAreRunningOut, 837 kFilterNoInput, kSpotSoundCompletedFlag); 838 } else { 839 _robotMovie.hide(); 840 _robotMovie.stopDisplaying(); 841 _robotMovie.releaseMovie(); 842 843 _robotMovie.initFromMovieFile("Images/Norad Delta/N79 Back Monitor5"); 844 _robotMovie.moveElementTo(kNavAreaLeft, kNavAreaTop); 845 _robotMovie.startDisplaying(); 846 _robotMovie.show(); 847 _robotMovie.start(); 848 849 _owner->requestDelay(_robotMovie.getDuration(), 0, kFilterNoInput, kDelayCompletedFlag); 850 } 758 851 break; 759 852 default: 760 853 _owner->requestSpotSound(kNewLaunchSiloIn, kNewLaunchSiloOut, … … void GlobeGame::receiveNotification(Notification *notification, const Notificati 766 859 } 767 860 break; 768 861 case kRobotTaunting: 769 _owner->requestDelay(1, 1, kFilterNoInput, 0);862 _owner->requestDelay(1, 2, kFilterNoInput, 0); 770 863 _owner->requestSpotSound(kNewLaunchSiloIn, kNewLaunchSiloOut, kFilterNoInput, kSpotSoundCompletedFlag); 771 864 _monitorMovie.setTime(kNewLaunchSiloTime * scale); 772 865 _monitorMovie.redrawMovieWorld(); … … void GlobeGame::receiveNotification(Notification *notification, const Notificati 790 883 791 884 switch (flags) { 792 885 case kGlobeSplash1Finished: 793 _owner->getExtraEntry(kN79BrightView, entry);794 886 _monitorMovie.stop(); 795 887 _monitorMovie.setSegment(kSplash1End * scale, kSplash2End * scale); 796 888 _monitorMovie.setFlags(kLoopTimeBase); 797 889 _monitorMovie.start(); 798 _owner->showViewFrame(entry.movieStart); 799 _owner->requestSpotSound(kIJustBrokeIn, kIJustBrokeOut, kFilterNoInput, 0); 800 _owner->requestDelay(1, 2, kFilterNoInput, kDelayCompletedFlag); 801 _gameState = kPlayingRobotIntro; 890 if (!((PegasusEngine *)g_engine)->isDVD()) { 891 _owner->getExtraEntry(kN79BrightView, entry); 892 _owner->showViewFrame(entry.movieStart); 893 _owner->requestSpotSound(kIJustBrokeIn, kIJustBrokeOut, kFilterNoInput, 0); 894 _owner->requestDelay(1, 2, kFilterNoInput, kDelayCompletedFlag); 895 _gameState = kPlayingRobotIntro; 896 } 897 break; 898 case kGlobeRobot1Finished: 899 if (((PegasusEngine *)g_engine)->isDVD()) { 900 _owner->getExtraEntry(kN79BrightView, entry); 901 _monitorMovie.stop(); 902 _monitorMovie.setSegment(0, _monitorMovie.getDuration()); 903 _monitorMovie.setTime(kSplash2End * scale - 1); 904 _monitorMovie.redrawMovieWorld(); 905 _monitorMovie.setFlags(0); 906 907 _owner->showViewFrame(entry.movieStart); 908 _owner->requestDelay(1, 2, kFilterNoInput, 0); 909 _owner->requestSpotSound(kStrikeAuthorizedIn, kStrikeAuthorizedOut, 910 kFilterNoInput, kSpotSoundCompletedFlag); 911 912 _gameState = kPlayingStrikeAuthorized; 913 } 802 914 break; 803 915 case kGlobeTimerExpired: 804 916 // Missile launched, player loses. 917 _upperNamesMovie.hide(); 918 _lowerNamesMovie.hide(); 919 _countdown.hide(); 920 _monitorMovie.setTime(kMissileLaunchedTime * scale); 921 _monitorMovie.redrawMovieWorld(); 805 922 _owner->requestSpotSound(kMissileLaunchedIn, kMissileLaunchedOut, kFilterNoInput, kSpotSoundCompletedFlag); 806 923 _gameState = kPlayerLost1; 807 924 break; 808 925 case kMaxDeactivatedFinished: 809 926 _monitorMovie.stop(); 810 927 _monitorMovie.setSegment(0, _monitorMovie.getDuration()); 811 _owner->requestDelay(1, 2, kFilterNoInput, 0); 812 _owner->requestSpotSound(kTheOnlyGoodHumanIn, kTheOnlyGoodHumanOut, kFilterNoInput, 0); 813 _owner->requestDelay(1, 2, kFilterNoInput, kDelayCompletedFlag); 928 if (g_arthurChip) 929 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA02", kArthurNoradFinishedGlobeGame); 930 if (!((PegasusEngine *)g_engine)->isDVD()) { 931 _owner->requestDelay(1, 2, kFilterNoInput, 0); 932 _owner->requestSpotSound(kTheOnlyGoodHumanIn, kTheOnlyGoodHumanOut, kFilterNoInput, 0); 933 _owner->requestDelay(1, 2, kFilterNoInput, kDelayCompletedFlag); 934 } else { 935 _robotMovie.hide(); 936 _robotMovie.stopDisplaying(); 937 _robotMovie.releaseMovie(); 938 939 _robotMovie.initFromMovieFile("Images/Norad Delta/N79 Back Monitor6"); 940 _robotMovie.moveElementTo(kNavAreaLeft, kNavAreaTop); 941 _robotMovie.setDisplayOrder(kGlobeCountdownLayer + 1); 942 _robotMovie.startDisplaying(); 943 _robotMovie.show(); 944 _robotMovie.start(); 945 946 _owner->requestDelay(_robotMovie.getDuration(), 0, kFilterNoInput, kDelayCompletedFlag); 947 } 814 948 _gameState = kPlayerWon2; 815 949 break; 816 950 default: … … void GlobeGame::spinGlobe(const Input &input, const Hotspot *spot, GlobeTrackDir 874 1008 } 875 1009 876 1010 void GlobeGame::clickGlobe(const Input &input) { 877 int16 newSilo = findClickedSilo(input); 878 879 if (newSilo != -1) { 880 _targetHighlightUpperLeft.hide(); 881 _targetHighlightUpperRight.hide(); 882 _targetHighlightLowerLeft.hide(); 883 _targetHighlightLowerRight.hide(); 884 _lowerNamesMovie.show(); 885 _lowerNamesMovie.setTime(newSilo * _lowerNamesMovie.getScale()); 886 _lowerNamesMovie.redrawMovieWorld(); 887 _owner->requestSpotSound(kSiloBeepIn, kSiloBeepOut, kFilterNoInput, 0); 1011 Movie movie(kNoDisplayElement); 1012 Input movieInput; 1013 1014 if (((PegasusEngine *)g_engine)->isDVD() && JMPPPInput::isEasterEggModifierInput(input)) { 1015 ((PegasusEngine *)g_engine)->_cursor->hide(); 1016 1017 movie.initFromMovieFile("Images/Norad Delta/N79 Back Monitor7"); 1018 movie.setVolume(((PegasusEngine *)g_engine)->getSoundFXLevel()); 1019 movie.moveElementTo(kNavAreaLeft, kNavAreaTop); 1020 movie.setDisplayOrder(kGlobeCountdownLayer + 1); 1021 movie.startDisplaying(); 1022 movie.show(); 1023 movie.start(); 1024 1025 while (movie.isRunning() && !((PegasusEngine *)g_engine)->shouldQuit()) { 1026 InputDevice.getInput(movieInput, kFilterNoInput); 1027 1028 ((PegasusEngine *)g_engine)->checkCallBacks(); 1029 ((PegasusEngine *)g_engine)->refreshDisplay(); 1030 ((PegasusEngine *)g_engine)->_system->delayMillis(10); 1031 } 888 1032 889 if (newSilo == _targetSilo[_currentSiloIndex]) { 890 _currentSiloIndex++; 891 _countdown.stopCountdown(); 892 _owner->requestSpotSound(kSiloDeactivatedIn, kSiloDeactivatedOut, kFilterNoInput, 0); 1033 if (((PegasusEngine *)g_engine)->shouldQuit()) 1034 return; 893 1035 894 if (_currentSiloIndex == kNumTargetSilos) { 895 // Player won. 896 _owner->requestDelay(1, 2, kFilterNoInput, 0); 897 _upperNamesMovie.hide(); 898 _lowerNamesMovie.hide(); 899 _countdown.hide(); 900 _monitorMovie.setSegment(kMaxDeactivatedStart * _monitorMovie.getScale(), 901 kMaxDeactivatedStop * _monitorMovie.getScale()); 902 _monitorMovie.setTime(kMaxDeactivatedStart * _monitorMovie.getScale()); 903 _monitorCallBack.setCallBackFlag(kMaxDeactivatedFinished); 904 _monitorCallBack.scheduleCallBack(kTriggerAtStop, 0, 0); 905 _monitorMovie.start(); 906 _owner->requestSpotSound(kMaximumDeactivationIn, kMaximumDeactivationOut, 907 kFilterNoInput, kSpotSoundCompletedFlag); 1036 movie.hide(); 1037 movie.stopDisplaying(); 1038 movie.releaseMovie(); 908 1039 909 // This sound was left out of the original. 910 _owner->requestSpotSound(kAllSilosDeactivatedIn, kAllSilosDeactivatedOut, 911 kFilterNoInput, kSpotSoundCompletedFlag); 912 913 _gameState = kPlayerWon1; 1040 ((PegasusEngine *)g_engine)->_cursor->hideUntilMoved(); 1041 } else { 1042 int16 newSilo = findClickedSilo(input); 1043 if (newSilo != -1) { 1044 _targetHighlightUpperLeft.hide(); 1045 _targetHighlightUpperRight.hide(); 1046 _targetHighlightLowerLeft.hide(); 1047 _targetHighlightLowerRight.hide(); 1048 _lowerNamesMovie.show(); 1049 _lowerNamesMovie.setTime(newSilo * _lowerNamesMovie.getScale()); 1050 _lowerNamesMovie.redrawMovieWorld(); 1051 _owner->requestSpotSound(kSiloBeepIn, kSiloBeepOut, kFilterNoInput, 0); 1052 1053 if (newSilo == _targetSilo[_currentSiloIndex]) { 1054 _currentSiloIndex++; 1055 _countdown.stopCountdown(); 1056 _owner->requestSpotSound(kSiloDeactivatedIn, kSiloDeactivatedOut, kFilterNoInput, 0); 1057 1058 if (_currentSiloIndex == kNumTargetSilos) { 1059 // Player won. 1060 _owner->requestDelay(1, 2, kFilterNoInput, 0); 1061 _upperNamesMovie.hide(); 1062 _lowerNamesMovie.hide(); 1063 _countdown.hide(); 1064 _monitorMovie.setSegment(kMaxDeactivatedStart * _monitorMovie.getScale(), 1065 kMaxDeactivatedStop * _monitorMovie.getScale()); 1066 _monitorMovie.setTime(kMaxDeactivatedStart * _monitorMovie.getScale()); 1067 _monitorCallBack.setCallBackFlag(kMaxDeactivatedFinished); 1068 _monitorCallBack.scheduleCallBack(kTriggerAtStop, 0, 0); 1069 _monitorMovie.start(); 1070 _owner->requestSpotSound(kMaximumDeactivationIn, kMaximumDeactivationOut, 1071 kFilterNoInput, kSpotSoundCompletedFlag); 1072 1073 // This sound was left out of the original. 1074 _owner->requestSpotSound(kAllSilosDeactivatedIn, kAllSilosDeactivatedOut, 1075 kFilterNoInput, kSpotSoundCompletedFlag); 1076 1077 _gameState = kPlayerWon1; 1078 } else { 1079 _owner->requestDelay(1, 2, kFilterNoInput, kDelayCompletedFlag); 1080 _upperNamesMovie.hide(); 1081 _lowerNamesMovie.hide(); 1082 _countdown.hide(); 1083 _monitorMovie.setTime(kSiloDeactivatedTime * _monitorMovie.getScale()); 1084 _monitorMovie.redrawMovieWorld(); 1085 _gameState = kSiloDeactivated; 1086 } 914 1087 } else { 915 _owner->requestDelay(2, 1, kFilterNoInput, kDelayCompletedFlag); 916 _upperNamesMovie.hide(); 917 _lowerNamesMovie.hide(); 918 _countdown.hide(); 919 _monitorMovie.setTime(kSiloDeactivatedTime * _monitorMovie.getScale()); 920 _monitorMovie.redrawMovieWorld(); 921 _gameState = kSiloDeactivated; 1088 _owner->requestDelay(5, 1, kFilterNoInput, kDelayCompletedFlag); 1089 _gameState = kDelayingPlayer; 1090 // Play "incorrect" sound? 1091 if (g_arthurChip) 1092 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBB38", kArthurNoradSelectedIncorrectSilo); 922 1093 } 923 } else {924 _owner->requestDelay(5, 1, kFilterNoInput, kDelayCompletedFlag);925 _gameState = kDelayingPlayer;926 // Play "incorrect" sound?927 1094 } 928 1095 } 929 1096 } -
engines/pegasus/neighborhood/norad/delta/globegame.h
diff --git a/engines/pegasus/neighborhood/norad/delta/globegame.h b/engines/pegasus/neighborhood/norad/delta/globegame.h index 73ed488..89c1afd 100644
a b protected: 137 137 void screenPointTo3DPoint(int16, int16, Point3D &); 138 138 bool lineHitsGlobe(const Line3D &, Point3D &); 139 139 140 Movie _robotMovie; 140 141 Movie _monitorMovie; 141 142 Movie _globeMovie; 142 143 Movie _upperNamesMovie; 143 144 Movie _lowerNamesMovie; 144 145 Notification _globeNotification; 146 NotificationCallBack _robotCallBack; 145 147 NotificationCallBack _monitorCallBack; 146 148 GlobeTracker _globeTracker; 147 149 Picture _globeCircleLeft; -
engines/pegasus/neighborhood/norad/delta/noraddelta.cpp
diff --git a/engines/pegasus/neighborhood/norad/delta/noraddelta.cpp b/engines/pegasus/neighborhood/norad/delta/noraddelta.cpp index 1eea2f0..e20ee96 100644
a b 28 28 #include "pegasus/interface.h" 29 29 #include "pegasus/pegasus.h" 30 30 #include "pegasus/ai/ai_area.h" 31 #include "pegasus/items/biochips/arthurchip.h" 31 32 #include "pegasus/items/biochips/opticalchip.h" 32 33 #include "pegasus/items/biochips/retscanchip.h" 33 34 #include "pegasus/items/inventory/airmask.h" … … void NoradDelta::loadAmbientLoops() { 265 266 if (GameState.getNoradArrivedFromSub()) { 266 267 RoomID room = GameState.getCurrentRoom(); 267 268 268 if (room == kNorad79West) { 269 if (_privateFlags.getFlag(kNoradPrivateFinishedGlobeGameFlag)) 270 loadLoopSound1("Sounds/Norad/GlobAmb2.22K.AIFF"); 271 else 269 if (room >= kNorad78 && room <= kNorad79West) { 270 if (GameState.getNoradPlayedGlobeGame()) { 271 // blitter moved clone2727's globe room loop fix up here 272 // since the original didn't play the red alert sound during the 273 // globe game. 274 275 // clone2727 added this fix so we can play the correct sound 276 // with the DVD version. This originally loaded it into slot 2, 277 // which in addition to having the corrupted sound on the disk, 278 // caused it to never play. 279 if (_vm->isDVD()) 280 loadLoopSound1("Sounds/Norad/GlobAmb2.32K.AIFF"); 281 else 282 loadLoopSound1("Sounds/Norad/GlobAmb2.22K.AIFF"); 283 } else 272 284 loadLoopSound1("Sounds/Norad/RedAlert.22K.AIFF"); 273 } else if (room >= kNorad78 && room <= kNorad79) {274 // clone2727 says: This looks like it should be loadLoopSound1...275 loadLoopSound2("Sounds/Norad/RedAlert.22K.AIFF");276 285 } else if (GameState.getNoradGassed()) { 277 if (room >= kNorad41 && room <= kNorad49South) 278 loadLoopSound1("Sounds/Norad/NEW SUB AMB.22K.AIFF", kNoradWarningVolume * 3); 279 else if (room >= kNorad59 && room <= kNorad60West) 280 loadLoopSound1("Sounds/Norad/SUB CONTRL LOOP.22K.AIFF", kNoradWarningVolume * 3); 281 else 282 loadLoopSound1("Sounds/Norad/WARNING LOOP.22K.AIFF", kNoradWarningVolume); 286 if (room >= kNorad41 && room <= kNorad49South) { 287 if (_vm->isDVD()) 288 loadLoopSound1("Sounds/Norad/NEW SUB AMB.44K.AIFF", kNoradWarningVolume * 3); 289 else 290 loadLoopSound1("Sounds/Norad/NEW SUB AMB.22K.AIFF", kNoradWarningVolume * 3); 291 } else if (room >= kNorad59 && room <= kNorad60West) { 292 if (_vm->isDVD()) 293 loadLoopSound1("Sounds/Norad/SUB CONTRL LOOP.32K.AIFF", kNoradWarningVolume * 3); 294 else 295 loadLoopSound1("Sounds/Norad/SUB CONTRL LOOP.22K.AIFF", kNoradWarningVolume * 3); 296 } else { 297 if (_vm->isDVD()) 298 loadLoopSound1("Sounds/Norad/WARNING LOOP.32K.AIFF", kNoradWarningVolume); 299 else 300 loadLoopSound1("Sounds/Norad/WARNING LOOP.22K.AIFF", kNoradWarningVolume); 301 } 283 302 } else { 284 303 loadLoopSound1(""); 285 304 } … … void NoradDelta::loadAmbientLoops() { 290 309 else 291 310 loadLoopSound2("Sounds/Norad/SUCKING WIND.22K.AIFF", kNoradSuckWindVolume, 0, 0); 292 311 } else { 293 if (room == kNorad54North) 294 loadLoopSound2("Sounds/Norad/N54NAS.22K.AIFF", 0x100 / 2); 295 else 312 if (room == kNorad54North) { 313 if (_vm->isDVD()) 314 loadLoopSound2("Sounds/Norad/N54NAS.32K.AIFF", 0x100 / 2); 315 else 316 loadLoopSound2("Sounds/Norad/N54NAS.22K.AIFF", 0x100 / 2); 317 } else 296 318 loadLoopSound2(""); 297 319 } 298 320 } else { 299 321 // Start them off at zero... 300 if (GameState.getNoradGassed()) 301 loadLoopSound1("Sounds/Norad/NEW SUB AMB.22K.AIFF", 0, 0, 0); 322 if (GameState.getNoradGassed()) { 323 if (_vm->isDVD()) 324 loadLoopSound1("Sounds/Norad/NEW SUB AMB.44K.AIFF", 0, 0, 0); 325 else 326 loadLoopSound1("Sounds/Norad/NEW SUB AMB.22K.AIFF", 0, 0, 0); 327 } 302 328 if (!g_airMask->isAirFilterOn()) 303 329 loadLoopSound2("Sounds/Norad/SUCKING WIND.22K.AIFF", 0, 0, 0); 304 330 } … … void NoradDelta::arriveAt(const RoomID room, const DirectionConstant direction) 328 354 329 355 switch (room) { 330 356 case kNorad41: 331 if (direction == kEast && !GameState.getNoradArrivedFromSub()) { 332 GameState.setNoradPlayedGlobeGame(false); 357 if (direction == kEast) { 358 if (!GameState.getNoradArrivedFromSub()) { 359 GameState.setNoradPlayedGlobeGame(false); 333 360 334 GameState.setNoradBeatRobotWithClaw(false);335 GameState.setNoradBeatRobotWithDoor(false);336 GameState.setNoradRetScanGood(false);361 GameState.setNoradBeatRobotWithClaw(false); 362 GameState.setNoradBeatRobotWithDoor(false); 363 GameState.setNoradRetScanGood(false); 337 364 338 GameState.setScoringExitedSub(true);365 GameState.setScoringExitedSub(true); 339 366 340 getExtraEntry(kArriveFromSubChase, entry);367 getExtraEntry(kArriveFromSubChase, entry); 341 368 342 loop1Spec.makeTwoKnotFaderSpec(kNoradDeltaMovieScale, 0, 0, entry.movieEnd -343 entry.movieStart, kNoradWarningVolume);344 loop1Spec.insertFaderKnot(7320, 0);345 loop1Spec.insertFaderKnot(7880, kNoradWarningVolume);369 loop1Spec.makeTwoKnotFaderSpec(kNoradDeltaMovieScale, 0, 0, entry.movieEnd - 370 entry.movieStart, kNoradWarningVolume); 371 loop1Spec.insertFaderKnot(7320, 0); 372 loop1Spec.insertFaderKnot(7880, kNoradWarningVolume); 346 373 347 loop2Spec.makeTwoKnotFaderSpec(kNoradDeltaMovieScale, 0, 0, entry.movieEnd -348 entry.movieStart, kNoradSuckWindVolume);349 loop1Spec.insertFaderKnot(7320, 0);350 loop1Spec.insertFaderKnot(7880, kNoradSuckWindVolume);374 loop2Spec.makeTwoKnotFaderSpec(kNoradDeltaMovieScale, 0, 0, entry.movieEnd - 375 entry.movieStart, kNoradSuckWindVolume); 376 loop1Spec.insertFaderKnot(7320, 0); 377 loop1Spec.insertFaderKnot(7880, kNoradSuckWindVolume); 351 378 352 startExtraSequence(kArriveFromSubChase, kExtraCompletedFlag, kFilterNoInput);379 startExtraSequence(kArriveFromSubChase, kExtraCompletedFlag, kFilterNoInput); 353 380 354 startLoop1Fader(loop1Spec); 355 startLoop2Fader(loop2Spec); 381 startLoop1Fader(loop1Spec); 382 startLoop2Fader(loop2Spec); 383 } else { 384 if (g_arthurChip) 385 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA08", kArthurNoradExitedSub); 386 } 356 387 } 357 388 break; 389 case kNorad54: 390 if (g_arthurChip) 391 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA71", kArthurNoradApproachedDamagedDoor); 392 break; 358 393 case kNorad54North: 359 394 GameState.setScoringSawRobotAt54North(true); 360 395 break; 361 396 case kNorad68: 362 397 if (GameState.getNoradRetScanGood()) 363 398 openDoor(); 399 else if (!_vm->playerHasItemID(kRetinalScanBiochip) && g_arthurChip) 400 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA39", kArthurNoradAtRetScanNoBiochip); 364 401 break; 365 402 case kNorad68West: 366 403 arriveAtNorad68West(); … … void NoradDelta::arriveAtNorad79West() { 396 433 newInteraction(kNoradGlobeGameInteractionID); 397 434 } 398 435 436 void NoradDelta::turnTo(const DirectionConstant direction) { 437 Norad::turnTo(direction); 438 if (g_arthurChip) { 439 switch (GameState.getCurrentRoomAndView()) { 440 case MakeRoomView(kNorad54, kNorth): 441 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA71", kArthurNoradApproachedDamagedDoor); 442 break; 443 case MakeRoomView(kNorad68, kWest): 444 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA39", kArthurNoradApproachedDamagedDoor); 445 break; 446 } 447 } 448 } 449 399 450 void NoradDelta::bumpIntoWall() { 400 451 requestSpotSound(kDeltaBumpIntoWallIn, kDeltaBumpIntoWallOut, kFilterNoInput, 0); 401 452 Neighborhood::bumpIntoWall(); … … void NoradDelta::finishedGlobeGame() { 423 474 _privateFlags.setFlag(kNoradPrivateFinishedGlobeGameFlag, true); 424 475 GameState.setScoringFinishedGlobeGame(true); 425 476 loadAmbientLoops(); 426 g_AIArea->playAIMovie(kRightAreaSignature, "Images/AI/Norad/XN60WD1", false, kWarningInterruption); 477 if (g_arthurChip) 478 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA63", kArthurNoradThreatenedByRobot); 479 if (g_AIArea->isChattyAI()) 480 g_AIArea->playAIMovie(kRightAreaSignature, "Images/AI/Norad/XN60WD1", false, kWarningInterruption); 481 updateViewFrame(); 427 482 } 428 483 429 484 bool NoradDelta::playingAgainstRobot() { … … void NoradDelta::playerBeatRobotWithDoor() { 451 506 GameState.setNoradBeatRobotWithDoor(true); 452 507 updateViewFrame(); 453 508 GameState.setScoringStoppedNoradRobot(true); 454 g_AIArea->playAIMovie(kRightAreaSignature, "Images/AI/Norad/XN59WD", false, kWarningInterruption); 509 if (g_AIArea->isChattyAI()) 510 g_AIArea->playAIMovie(kRightAreaSignature, "Images/AI/Norad/XN59WD", false, kWarningInterruption); 455 511 } 456 512 457 513 void NoradDelta::playerBeatRobotWithClaw() { … … void NoradDelta::playerBeatRobotWithClaw() { 459 515 updateViewFrame(); 460 516 GameState.setScoringStoppedNoradRobot(true); 461 517 GameState.setScoringNoradGandhi(true); 462 g_AIArea->playAIMovie(kRightAreaSignature, "Images/AI/Norad/XN59WD", false, kWarningInterruption); 518 if (g_AIArea->isChattyAI()) 519 g_AIArea->playAIMovie(kRightAreaSignature, "Images/AI/Norad/XN59WD", false, kWarningInterruption); 463 520 } 464 521 465 522 TimeValue NoradDelta::getViewTime(const RoomID room, const DirectionConstant direction) { … … void NoradDelta::receiveNotification(Notification *notification, const Notificat 604 661 case kN59RobotHeadOpens: 605 662 case kN60RobotHeadOpens: 606 663 _privateFlags.setFlag(kNoradPrivateRobotHeadOpenFlag, true); 664 if (g_arthurChip) { 665 switch (_vm->getRandomNumber(2)) { 666 case 0: 667 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA36", kArthurNoradRobotHeadOpen); 668 break; 669 case 1: 670 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA37", kArthurNoradRobotHeadOpen); 671 break; 672 case 2: 673 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA40", kArthurNoradRobotHeadOpen); 674 break; 675 } 676 } 607 677 break; 608 678 case kNoradDeltaRetinalScanBad: 609 679 retScan = (RetScanChip *)_vm->getCurrentBiochip(); 610 680 retScan->setItemState(kNormalItem); 611 681 playSpotSoundSync(kRetinalScanFailedIn, kRetinalScanFailedOut); 612 682 downButton(dummy); 683 if (g_arthurChip) 684 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA13", kArthurNoradAtRetScanNoBiochip); 613 685 break; 614 686 case kNoradDeltaRetinalScanGood: 615 687 retScan = (RetScanChip *)_vm->getCurrentBiochip(); … … void NoradDelta::receiveNotification(Notification *notification, const Notificat 623 695 } 624 696 625 697 _interruptionFilter = kFilterAllInput; 698 } else if ((flags & kSpotSoundCompletedFlag) != 0) { 699 if (_spotSounds.getStart() == kToDeactivateIn && g_arthurChip) 700 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBB41", kArthurNoradStartGlobeGame); 626 701 } 627 702 628 703 g_AIArea->checkMiddleArea(); -
engines/pegasus/neighborhood/norad/delta/noraddelta.h
diff --git a/engines/pegasus/neighborhood/norad/delta/noraddelta.h b/engines/pegasus/neighborhood/norad/delta/noraddelta.h index 11065f2..82aa7a9 100644
a b protected: 88 88 virtual void arriveAt(const RoomID, const DirectionConstant); 89 89 void arriveAtNorad68West(); 90 90 void arriveAtNorad79West(); 91 void turnTo(const DirectionConstant); 91 92 TimeValue getViewTime(const RoomID, const DirectionConstant); 92 93 void openDoor(); 93 94 void activateHotspots(); -
engines/pegasus/neighborhood/norad/norad.cpp
diff --git a/engines/pegasus/neighborhood/norad/norad.cpp b/engines/pegasus/neighborhood/norad/norad.cpp index 53b3ff9..177b908 100644
a b 27 27 #include "pegasus/gamestate.h" 28 28 #include "pegasus/pegasus.h" 29 29 #include "pegasus/ai/ai_area.h" 30 #include "pegasus/items/biochips/arthurchip.h" 30 31 #include "pegasus/items/inventory/airmask.h" 31 32 #include "pegasus/neighborhood/norad/constants.h" 32 33 #include "pegasus/neighborhood/norad/norad.h" … … void Norad::arriveAtNoradElevator() { 162 163 163 164 void Norad::arriveAtUpperPressureDoorRoom() { 164 165 newInteraction(kNoradPressureDoorInteractionID); 166 if (g_arthurChip) 167 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA69", kArthurNoradReachedPressureDoor); 165 168 } 166 169 167 170 void Norad::arriveAtLowerPressureDoorRoom() { 168 171 newInteraction(kNoradPressureDoorInteractionID); 172 if (g_arthurChip) 173 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA69", kArthurNoradReachedPressureDoor); 169 174 } 170 175 171 176 void Norad::arriveAtSubPlatformRoom() { … … CanOpenDoorReason Norad::canOpenDoor(DoorTable::Entry &entry) { 199 204 } 200 205 201 206 void Norad::cantOpenDoor(CanOpenDoorReason reason) { 207 bool firstLockedDoor; 208 202 209 if (reason == kCantOpenBadPressure) 203 210 playSpotSoundSync(_pressureSoundIn, _pressureSoundOut); 204 211 else 205 212 playSpotSoundSync(_accessDeniedIn, _accessDeniedOut); 213 if (g_arthurChip) { 214 firstLockedDoor = g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA65", kArthurNoradAttemptedLockedDoor); 215 216 if (!firstLockedDoor) 217 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA68", kArthurNoradAttemptedLockedDoorAgain); 218 } 206 219 } 207 220 208 221 void Norad::startExitMovie(const ExitTable::Entry &exitEntry) { -
engines/pegasus/neighborhood/norad/subcontrolroom.cpp
diff --git a/engines/pegasus/neighborhood/norad/subcontrolroom.cpp b/engines/pegasus/neighborhood/norad/subcontrolroom.cpp index d48481e..6812fa7 100644
a b 25 25 26 26 #include "pegasus/gamestate.h" 27 27 #include "pegasus/pegasus.h" 28 #include "pegasus/items/biochips/arthurchip.h" 28 29 #include "pegasus/neighborhood/norad/constants.h" 29 30 #include "pegasus/neighborhood/norad/norad.h" 30 31 #include "pegasus/neighborhood/norad/subcontrolroom.h" … … void SubControlRoom::receiveNotification(Notification *notification, const Notif 562 563 switch (flags) { 563 564 case kAlphaSplashFinished: 564 565 setControlMonitorToTime(kMainMenuTime * _subControlScale, kAlphaMainMenu, true); 566 if (g_arthurChip) 567 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA29", kArthurNoradSawClawMonitor); 565 568 break; 566 569 case kPrepHighlightFinished: 567 570 if (GameState.getNoradSubPrepState() == kSubDamaged) … … void SubControlRoom::receiveNotification(Notification *notification, const Notif 655 658 hideEverything(); 656 659 _robotState = kPlayerWon; 657 660 owner->startExtraSequence(kN60PlayerFollowsRobotToDoor, kExtraCompletedFlag, kFilterAllInput); 661 if (g_arthurChip) 662 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA67", kArthurNoradBeatRobotWithClaw); 658 663 break; 659 664 case kPlayerWon: 660 665 ((NoradDelta *)owner)->playerBeatRobotWithClaw(); -
engines/pegasus/neighborhood/norad/subplatform.cpp
diff --git a/engines/pegasus/neighborhood/norad/subplatform.cpp b/engines/pegasus/neighborhood/norad/subplatform.cpp index 97079a9..c13d812 100644
a b 26 26 #include "pegasus/gamestate.h" 27 27 #include "pegasus/pegasus.h" 28 28 #include "pegasus/ai/ai_area.h" 29 #include "pegasus/items/biochips/arthurchip.h" 29 30 #include "pegasus/neighborhood/norad/constants.h" 30 31 #include "pegasus/neighborhood/norad/norad.h" 31 32 #include "pegasus/neighborhood/norad/subplatform.h" … … void SubPlatform::receiveNotification(Notification *notification, const Notifica 147 148 loop1Spec.insertFaderKnot(5080, 0); 148 149 149 150 owner->startExtraSequence(kNorad19ExitToSub, kExtraCompletedFlag, kFilterNoInput); 151 if (g_arthurChip) 152 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA07", kArthurNoradEnteredSub); 150 153 151 154 owner->startLoop1Fader(loop1Spec); 152 155 owner->startLoop2Fader(loop2Spec); … … void SubPlatform::receiveNotification(Notification *notification, const Notifica 162 165 allowInput(true); 163 166 break; 164 167 } 165 } else if (notification == _neighborhoodNotification ) {168 } else if (notification == _neighborhoodNotification && !((PegasusEngine *)g_engine)->isDVD()) { 166 169 allowInput(true); 167 170 ((PegasusEngine *)g_engine)->jumpToNewEnvironment(kNoradSubChaseID, kNoRoomID, kNoDirection); 168 171 GameState.setScoringEnteredSub(true); -
engines/pegasus/neighborhood/prehistoric/prehistoric.cpp
diff --git a/engines/pegasus/neighborhood/prehistoric/prehistoric.cpp b/engines/pegasus/neighborhood/prehistoric/prehistoric.cpp index 190984f..b105857 100644
a b 31 31 #include "pegasus/ai/ai_area.h" 32 32 #include "pegasus/ai/ai_condition.h" 33 33 #include "pegasus/ai/ai_rule.h" 34 #include "pegasus/items/biochips/arthurchip.h" 34 35 #include "pegasus/neighborhood/prehistoric/prehistoric.h" 35 36 36 37 namespace Pegasus { … … void Prehistoric::start() { 99 100 } 100 101 101 102 Neighborhood::start(); 103 104 if (GameState.getCurrentRoomAndView() == MakeRoomView(kPrehistoric02, kSouth) && g_arthurChip) 105 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA01", kArthurGoToPrehistoric); 102 106 } 103 107 104 108 class FinishPrehistoricAction : public AIPlayMessageAction { … … void Prehistoric::turnTo(const DirectionConstant newDirection) { 270 274 Neighborhood::turnTo(newDirection); 271 275 272 276 Item *keyCard; 277 bool doArthurFeelLikeYodelingMovie = false; 273 278 274 279 switch (GameState.getCurrentRoomAndView()) { 280 case MakeRoomView(kPrehistoric08, kEast): 281 case MakeRoomView(kPrehistoric10, kEast): 282 case MakeRoomView(kPrehistoric12, kEast): 283 case MakeRoomView(kPrehistoric14, kEast): 284 case MakeRoomView(kPrehistoric25, kWest): 285 doArthurFeelLikeYodelingMovie = true; 286 break; 275 287 case MakeRoomView(kPrehistoric18, kEast): 276 288 zoomToVault(); 277 289 break; … … void Prehistoric::turnTo(const DirectionConstant newDirection) { 285 297 // fall through 286 298 case MakeRoomView(kPrehistoric25, kEast): 287 299 setCurrentActivation(kActivationVaultClosed); 300 if (GameState.getCurrentRoomAndView() == MakeRoomView(kPrehistoric25, kEast) && 301 !GameState.isTakenItemID(kHistoricalLog) && g_arthurChip) 302 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA60", kArthurPrehistoricCrossedBridge); 303 break; 304 case MakeRoomView(kPrehistoric23, kWest): 305 if (g_arthurChip) 306 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA59", kArthurPrehistoricSawEggs); 288 307 break; 289 308 case MakeRoomView(kPrehistoric16, kNorth): 290 309 case MakeRoomView(kPrehistoric21, kWest): … … void Prehistoric::turnTo(const DirectionConstant newDirection) { 305 324 } 306 325 break; 307 326 } 327 if (doArthurFeelLikeYodelingMovie && g_arthurChip) 328 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA15", kArthurPrehistoricAtCliffEdge); 308 329 } 309 330 310 331 void Prehistoric::zoomToVault() { … … void Prehistoric::checkContinuePoint(const RoomID room, const DirectionConstant 326 347 327 348 void Prehistoric::arriveAt(const RoomID room, const DirectionConstant direction) { 328 349 Item *keyCard; 350 bool doArthurLetsSpreadOutMovie, doArthurFeelLikeYodelingMovie; 329 351 330 352 if (MakeRoomView(room, direction) == MakeRoomView(kPrehistoric25, kEast) && 331 353 _privateFlags.getFlag(kPrehistoricPrivateExtendedBridgeFlag)) { … … void Prehistoric::arriveAt(const RoomID room, const DirectionConstant direction) 336 358 337 359 Neighborhood::arriveAt(room, direction); 338 360 361 doArthurLetsSpreadOutMovie = false; 362 doArthurFeelLikeYodelingMovie = false; 339 363 switch (MakeRoomView(room, direction)) { 340 364 case MakeRoomView(kPrehistoricDeath, kNorth): 341 365 case MakeRoomView(kPrehistoricDeath, kSouth): … … void Prehistoric::arriveAt(const RoomID room, const DirectionConstant direction) 356 380 startExtraSequence(kPreArrivalFromTSA, kExtraCompletedFlag, kFilterNoInput); 357 381 } 358 382 break; 383 case MakeRoomView(kPrehistoric06, kNorth): 384 case MakeRoomView(kPrehistoric13, kWest): 385 doArthurLetsSpreadOutMovie = true; 386 break; 387 case MakeRoomView(kPrehistoric22North, kNorth): 388 if (g_arthurChip) 389 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBB44", kArthurPrehistoricSawBreaker); 390 break; 391 case MakeRoomView(kPrehistoric10, kEast): 392 case MakeRoomView(kPrehistoric12, kEast): 393 case MakeRoomView(kPrehistoric14, kEast): 394 case MakeRoomView(kPrehistoric25, kWest): 395 doArthurFeelLikeYodelingMovie = true; 396 break; 359 397 case MakeRoomView(kPrehistoric18, kEast): 360 398 zoomToVault(); 361 399 break; … … void Prehistoric::arriveAt(const RoomID room, const DirectionConstant direction) 375 413 if (g_AIArea) 376 414 g_AIArea->checkRules(); 377 415 break; 416 case MakeRoomView(kPrehistoric13, kNorth): 417 doArthurLetsSpreadOutMovie = true; 378 418 case MakeRoomView(kPrehistoric08, kSouth): 379 419 case MakeRoomView(kPrehistoric10, kSouth): 380 420 case MakeRoomView(kPrehistoric12, kSouth): 381 case MakeRoomView(kPrehistoric13, kNorth):382 421 case MakeRoomView(kPrehistoric14, kSouth): 383 422 case MakeRoomView(kPrehistoric15, kNorth): 384 423 case MakeRoomView(kPrehistoric16, kSouth): … … void Prehistoric::arriveAt(const RoomID room, const DirectionConstant direction) 396 435 break; 397 436 case MakeRoomView(kPrehistoric25, kEast): 398 437 setCurrentActivation(kActivationVaultClosed); 438 if (!GameState.isTakenItemID(kHistoricalLog) && g_arthurChip) 439 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA60", kArthurPrehistoricCrossedBridge); 440 break; 441 case MakeRoomView(kPrehistoric23, kWest): 442 if (g_arthurChip) 443 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA59", kArthurPrehistoricSawEggs); 399 444 break; 400 445 } 446 if (g_arthurChip) { 447 if (doArthurLetsSpreadOutMovie) 448 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA20", kArthurPrehistoricReachedJunction); 449 else if (doArthurFeelLikeYodelingMovie) 450 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA15", kArthurPrehistoricAtCliffEdge); 451 } 401 452 } 402 453 403 454 void Prehistoric::loadAmbientLoops() { … … void Prehistoric::loadAmbientLoops() { 425 476 case kPrehistoric20: 426 477 // 1/4 volume. 427 478 if (_vm->isDVD()) // Updated sound for the DVD version 428 loadLoopSound1("Sounds/Prehistoric/P02SAL00.32 k.AIFF", 64);479 loadLoopSound1("Sounds/Prehistoric/P02SAL00.32K.AIFF", 64); 429 480 else 430 loadLoopSound1("Sounds/Prehistoric/P02SAL00.22 k.AIFF", 64);481 loadLoopSound1("Sounds/Prehistoric/P02SAL00.22K.AIFF", 64); 431 482 break; 432 483 case kPrehistoric08: 433 484 case kPrehistoric10: … … void Prehistoric::loadAmbientLoops() { 438 489 case kPrehistoric21: 439 490 // 3/16 volume. 440 491 if (_vm->isDVD()) // Updated sound for the DVD version 441 loadLoopSound1("Sounds/Prehistoric/P02SAL00.32 k.AIFF", 48);492 loadLoopSound1("Sounds/Prehistoric/P02SAL00.32K.AIFF", 48); 442 493 else 443 loadLoopSound1("Sounds/Prehistoric/P02SAL00.22 k.AIFF", 48);494 loadLoopSound1("Sounds/Prehistoric/P02SAL00.22K.AIFF", 48); 444 495 break; 445 496 case kPrehistoric25: 446 497 // 1/8 volume. 447 498 if (_vm->isDVD()) // Updated sound for the DVD version 448 loadLoopSound1("Sounds/Prehistoric/P02SAL00.32 k.AIFF", 32);499 loadLoopSound1("Sounds/Prehistoric/P02SAL00.32K.AIFF", 32); 449 500 else 450 loadLoopSound1("Sounds/Prehistoric/P02SAL00.22 k.AIFF", 32);501 loadLoopSound1("Sounds/Prehistoric/P02SAL00.22K.AIFF", 32); 451 502 break; 452 503 case kPrehistoric22: 453 504 case kPrehistoric22North: … … void Prehistoric::loadAmbientLoops() { 492 543 case kPrehistoric18: 493 544 if (_privateFlags.getFlag(kPrehistoricPrivateExtendedBridgeFlag)) { 494 545 if (_vm->isDVD()) // Updated sound for the DVD version 495 loadLoopSound2("Sounds/Prehistoric/P18EAL00.44K. aiff", 0x100, 0, 0);546 loadLoopSound2("Sounds/Prehistoric/P18EAL00.44K.AIFF", 0x100, 0, 0); 496 547 else 497 loadLoopSound2("Sounds/Prehistoric/P18EAL00.22 k.AIFF", 0x100, 0, 0);548 loadLoopSound2("Sounds/Prehistoric/P18EAL00.22K.AIFF", 0x100, 0, 0); 498 549 } else { 499 550 loadLoopSound2(""); 500 551 } … … void Prehistoric::loadAmbientLoops() { 504 555 case kPrehistoric22: 505 556 case kPrehistoric22North: 506 557 if (_vm->isDVD()) // Updated sound for the DVD version 507 loadLoopSound2("Sounds/Prehistoric/P24NAL00.32 k.AIFF", 64);558 loadLoopSound2("Sounds/Prehistoric/P24NAL00.32K.AIFF", 64); 508 559 else 509 loadLoopSound2("Sounds/Prehistoric/P24NAL00.22 k.AIFF", 64);560 loadLoopSound2("Sounds/Prehistoric/P24NAL00.22K.aiff", 64); 510 561 break; 511 562 } 512 563 } … … void Prehistoric::receiveNotification(Notification *notification, const Notifica 556 607 break; 557 608 case kPre18EastZoom: 558 609 startExtraSequence(kPre18EastZoomOut, kExtraCompletedFlag, kFilterNoInput); 610 if (g_arthurChip) 611 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA61", kArthurPrehistoricZoomedToVault); 559 612 break; 560 613 case kPre18EastZoomOut: 561 614 GameState.setPrehistoricSeenBridgeZoom(true); … … void Prehistoric::receiveNotification(Notification *notification, const Notifica 566 619 GameState.setPrehistoricTriedToExtendBridge(false); 567 620 loadAmbientLoops(); 568 621 GameState.setScoringExtendedBridge(true); 622 if (g_arthurChip) { 623 if (_vm->getRandomBit()) 624 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA10", kArthurPrehistoricExtendedBridge); 625 else 626 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA56", kArthurPrehistoricExtendedBridge); 627 } 569 628 break; 570 629 case kPre18EastBridgeOut: 571 630 GameState.setPrehistoricTriedToExtendBridge(true); 631 if (g_arthurChip) 632 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA58", kArthurPrehistoricAttemptedBridge); 572 633 if (g_AIArea) 573 634 g_AIArea->checkMiddleArea(); 574 635 break; 575 636 case kPre22ThrowBreaker: 576 637 GameState.setPrehistoricBreakerThrown(true); 577 638 GameState.setScoringThrewBreaker(true); 639 if (g_arthurChip) 640 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA57", kArthurPrehistoricBreakerThrown); 578 641 break; 579 642 case kPre25EastUnlockingVaultNoLog: 580 643 case kPre25EastUnlockingVaultWithLog: 644 if (!GameState.isTakenItemID(kHistoricalLog) && g_arthurChip) 645 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA05", kArthurPrehistoricUnlockedVault); 581 646 _vm->addItemToInventory((InventoryItem *)_vm->getAllItems().findItemByID(kJourneymanKey)); 582 647 break; 583 648 } 649 } else if ((flags & kSpotCompletedFlag) != 0 && 650 GameState.getCurrentRoomAndView() == MakeRoomView(kPrehistoric08, kEast)) { 651 if (g_arthurChip) 652 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA15", kArthurPrehistoricAtCliffEdge); 584 653 } 585 654 586 655 g_AIArea->checkMiddleArea(); 587 656 } 588 657 658 void Prehistoric::spotCompleted() { 659 Neighborhood::spotCompleted(); 660 if (GameState.getCurrentRoomAndView() == MakeRoomView(kPrehistoric08, kEast) && g_arthurChip) 661 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA15", kArthurPrehistoricAtCliffEdge); 662 } 663 589 664 Common::String Prehistoric::getBriefingMovie() { 590 665 Common::String movieName = Neighborhood::getBriefingMovie(); 591 666 -
engines/pegasus/neighborhood/prehistoric/prehistoric.h
diff --git a/engines/pegasus/neighborhood/prehistoric/prehistoric.h b/engines/pegasus/neighborhood/prehistoric/prehistoric.h index 17f9993..a2502b0 100644
a b protected: 140 140 int16 getStaticCompassAngle(const RoomID, const DirectionConstant); 141 141 void getExitCompassMove(const ExitTable::Entry &, FaderMoveSpec &); 142 142 virtual void receiveNotification(Notification *, const NotificationFlags); 143 void spotCompleted(); 143 144 void turnTo(const DirectionConstant); 144 145 void zoomToVault(); 145 146 TimeValue getViewTime(const RoomID, const DirectionConstant); -
engines/pegasus/neighborhood/tsa/fulltsa.cpp
diff --git a/engines/pegasus/neighborhood/tsa/fulltsa.cpp b/engines/pegasus/neighborhood/tsa/fulltsa.cpp index 75f652a..31f84e7 100644
a b 23 23 * 24 24 */ 25 25 26 #include "common/file.h" 27 28 #include "pegasus/compass.h" 26 29 #include "pegasus/cursor.h" 27 30 #include "pegasus/energymonitor.h" 28 31 #include "pegasus/gamestate.h" 29 32 #include "pegasus/pegasus.h" 30 33 #include "pegasus/ai/ai_area.h" 31 34 #include "pegasus/items/biochips/aichip.h" 35 #include "pegasus/items/biochips/arthurchip.h" 32 36 #include "pegasus/items/biochips/opticalchip.h" 33 37 #include "pegasus/neighborhood/caldoria/caldoria.h" 34 38 #include "pegasus/neighborhood/norad/constants.h" … … const CoordType kRedirectionFDRolloverTop = kNavAreaTop + 160; 480 484 const CoordType kRedirectionCCDoorLeft = kNavAreaLeft + 174; 481 485 const CoordType kRedirectionCCDoorTop = kNavAreaTop + 36; 482 486 483 const CoordType kRedirectionRRDoorLeft = kNavAreaLeft + 4 18;487 const CoordType kRedirectionRRDoorLeft = kNavAreaLeft + 428; 484 488 const CoordType kRedirectionRRDoorTop = kNavAreaTop + 32; 485 489 486 490 const CoordType kRedirectionFDDoorLeft = kNavAreaLeft + 298; … … static const bool kPegasusResolved = true; 521 525 static const bool kPegasusCantExit = false; 522 526 static const bool kPegasusCanExit = true; 523 527 528 static const ExtraID kEasterEggJimenez = 1000; 529 static const ExtraID kEasterEggCastillo = 1001; 530 static const ExtraID kEasterEggSinclair = 1002; 531 524 532 // Monitor modes 525 533 enum { 526 534 kMonitorNeutral = 0, … … void RipTimer::timeChanged(const TimeValue newTime) { 644 652 } 645 653 646 654 FullTSA::FullTSA(InputHandler *nextHandler, PegasusEngine *owner) : Neighborhood(nextHandler, owner, "Full TSA", kFullTSAID), 647 _ripTimer(kNoDisplayElement), _sprite1(kNoDisplayElement), _sprite2(kNoDisplayElement), _sprite3(kNoDisplayElement) { 655 _extraMovie(kNoDisplayElement), _blankMovie(kNoDisplayElement), _playedSolvedMusicCue(false), _ripTimer(kNoDisplayElement), 656 _sprite1(kNoDisplayElement), _sprite2(kNoDisplayElement), _sprite3(kNoDisplayElement) { 648 657 setIsItemTaken(kJourneymanKey); 649 658 setIsItemTaken(kPegasusBiochip); 650 659 setIsItemTaken(kMapBiochip); … … FullTSA::FullTSA(InputHandler *nextHandler, PegasusEngine *owner) : Neighborhood 652 661 653 662 void FullTSA::init() { 654 663 Neighborhood::init(); 664 _extraMovieCallBack.setNotification(&_neighborhoodNotification); 665 if (Common::File::exists("Images/TSA/Blank TSA.movie")) 666 _blankMovie.initFromMovieFile("Images/TSA/Blank TSA.movie"); 667 _blankMovie.setVolume(_vm->getSoundFXLevel()); 668 _blankMovie.setDisplayOrder(kNavMovieOrder + 1); 669 _blankMovie.startDisplaying(); 655 670 _ripTimer.setDisplayOrder(kRipTimerOrder); 656 671 _ripTimer.startDisplaying(); 657 672 … … void FullTSA::dieUncreatedInTSA() { 677 692 void FullTSA::start() { 678 693 g_energyMonitor->stopEnergyDraining(); 679 694 695 if (_vm->isDVD()) { 696 _entranceMusic.attachFader(&_entranceFader); 697 _entranceMusic.initFromAIFFFile("Sounds/TSA/TSA Entrance.32K.AIFF"); 698 _entranceFader.setMasterVolume(_vm->getAmbienceLevel() / 2); 699 } 680 700 if (!GameState.getScoringEnterTSA()) { 681 701 _utilityFuse.primeFuse(GameState.getTSAFuseTimeLimit()); 682 702 _utilityFuse.setFunctor(new Common::Functor0Mem<void, FullTSA>(this, &FullTSA::dieUncreatedInTSA)); … … void FullTSA::loadAmbientLoops() { 836 856 switch (GameState.getTSAState()) { 837 857 case kTSAPlayerDetectedRip: 838 858 case kTSAPlayerNeedsHistoricalLog: 839 if ((room >= kTSA16 && room <= kTSA0B) || (room >= kTSA21Cyan && room <= kTSA24Cyan) || (room >= kTSA21Red && room <= kTSA24Red)) 840 loadLoopSound1("Sounds/TSA/TSA CLAXON.22K.AIFF", 0x100 / 4, 0, 0); 841 else if (room == kTSA25Cyan || room == kTSA25Red) 842 loadLoopSound1("Sounds/TSA/TSA CLAXON.22K.AIFF", 0x100 / 6, 0, 0); 843 else 844 loadLoopSound1("Sounds/TSA/TSA EchoClaxon.22K.AIFF", 0x100 / 4, 0, 0); 859 if (_vm->isDVD()) { 860 if ((room >= kTSA16 && room <= kTSA0B) || (room >= kTSA21Cyan && room <= kTSA24Cyan) || (room >= kTSA21Red && room <= kTSA24Red)) 861 loadLoopSound1("Sounds/TSA/TSA CLAXON.44K.AIFF", 0x100 * 3 / 16, 0, 0); 862 else if (room == kTSA25Cyan || room == kTSA25Red) 863 loadLoopSound1("Sounds/TSA/TSA CLAXON.44K.AIFF", 0x100 / 8, 0, 0); 864 else 865 loadLoopSound1("Sounds/TSA/TSA EchoClaxon.22K.AIFF", 0x100 * 3 / 16, 0, 0); 866 } else { 867 if ((room >= kTSA16 && room <= kTSA0B) || (room >= kTSA21Cyan && room <= kTSA24Cyan) || (room >= kTSA21Red && room <= kTSA24Red)) 868 loadLoopSound1("Sounds/TSA/TSA CLAXON.22K.AIFF", 0x100 / 4, 0, 0); 869 else if (room == kTSA25Cyan || room == kTSA25Red) 870 loadLoopSound1("Sounds/TSA/TSA CLAXON.22K.AIFF", 0x100 / 6, 0, 0); 871 else 872 loadLoopSound1("Sounds/TSA/TSA EchoClaxon.22K.AIFF", 0x100 / 4, 0, 0); 873 } 845 874 break; 846 875 default: 847 if (room >= kTSA00 && room <= kTSA02) 848 loadLoopSound1("Sounds/TSA/T01NAE.NEW.22K.AIFF"); 849 else if (room >= kTSA03 && room <= kTSA15) 850 loadLoopSound1("Sounds/TSA/T01NAE.NEW.22K.AIFF"); 851 else if (room >= kTSA16 && room <= kTSA0B) 852 loadLoopSound1("Sounds/TSA/T14SAEO1.22K.AIFF"); 853 else if (room >= kTSA21Cyan && room <= kTSA25Red) 854 loadLoopSound1("Sounds/TSA/T15SAE01.22K.AIFF"); 855 else if (room >= kTSA26 && room <= kTSA37) 856 loadLoopSound1("Sounds/TSA/T01NAE.NEW.22K.AIFF"); 876 if (_vm->isDVD()) { 877 if ((room >= kTSA00 && room <= kTSA02) || (room >= kTSA03 && room <= kTSA15) || (room >= kTSA26 && room <= kTSA37)) 878 loadLoopSound1("Sounds/TSA/T01NAE.NEW.32K.AIFF", 0x100 * 3 / 4, 0, 0); 879 else if (room >= kTSA16 && room <= kTSA0B) 880 loadLoopSound1("Sounds/TSA/T14SAEO1.32K.AIFF", 0x100 * 3 / 4, 0, 0); 881 else if (room >= kTSA21Cyan && room <= kTSA25Red) 882 loadLoopSound1("Sounds/TSA/T15SAE01.32K.AIFF", 0x100 * 3 / 4, 0, 0); 883 } else { 884 if ((room >= kTSA00 && room <= kTSA02) || (room >= kTSA03 && room <= kTSA15) || (room >= kTSA26 && room <= kTSA37)) 885 loadLoopSound1("Sounds/TSA/T01NAE.NEW.22K.AIFF"); 886 else if (room >= kTSA16 && room <= kTSA0B) 887 loadLoopSound1("Sounds/TSA/T14SAEO1.22K.AIFF"); 888 else if (room >= kTSA21Cyan && room <= kTSA25Red) 889 loadLoopSound1("Sounds/TSA/T15SAE01.22K.AIFF"); 890 } 857 891 break; 858 892 } 859 893 } … … void FullTSA::getExtraEntry(const uint32 id, ExtraTable::Entry &extraEntry) { 1107 1141 extraEntry.movieStart += kFullTSAFrameDuration * 3; 1108 1142 } 1109 1143 1144 void FullTSA::showViewFrame(TimeValue viewTime) { 1145 if ((int32)viewTime >= 0) { 1146 _turnPush.hide(); 1147 _navMovie.stop(); 1148 _navMovie.setFlags(0); 1149 if (_blankMovie.isMovieValid() && 1150 (GameState.getTSAState() == kRobotsAtCommandCenter || 1151 GameState.getTSAState() == kRobotsAtFrontDoor || 1152 GameState.getTSAState() == kRobotsAtReadyRoom) && 1153 (GameState.getCurrentRoom() == kTSA0A || 1154 GameState.getCurrentRoom() == kTSA06) && 1155 (GameState.getCurrentDirection() == kEast || 1156 GameState.getCurrentDirection() == kWest)) { 1157 viewTime = 0; 1158 if (GameState.getCurrentRoom() == kTSA06) 1159 viewTime = 2 * _blankMovie.getScale(); 1160 if (GameState.getCurrentDirection() == kWest) 1161 viewTime += _blankMovie.getScale(); 1162 1163 _navMovie.hide(); 1164 _blankMovie.setSegment(0, _blankMovie.getDuration()); 1165 _blankMovie.setTime(viewTime); 1166 1167 Common::Rect pushBounds; 1168 _turnPush.getBounds(pushBounds); 1169 1170 _blankMovie.moveElementTo(pushBounds.left, pushBounds.top); 1171 _blankMovie.show(); 1172 _blankMovie.redrawMovieWorld(); 1173 } else { 1174 _blankMovie.hide(); 1175 _navMovie.setSegment(0, _navMovie.getDuration()); 1176 _navMovie.setTime(viewTime); 1177 1178 Common::Rect pushBounds; 1179 _turnPush.getBounds(pushBounds); 1180 1181 _navMovie.moveElementTo(pushBounds.left, pushBounds.top); 1182 _navMovie.show(); 1183 _navMovie.redrawMovieWorld(); 1184 } 1185 } 1186 } 1187 1110 1188 void FullTSA::pickedUpItem(Item *item) { 1111 1189 BiochipItem *biochip; 1112 1190 … … void FullTSA::startDoorOpenMovie(const TimeValue startTime, const TimeValue stop 1191 1269 Neighborhood::startDoorOpenMovie(startTime, stopTime); 1192 1270 } 1193 1271 1272 void FullTSA::startTurnPush(const TurnDirection turnDirection, const TimeValue newView, const DirectionConstant nextDir) { 1273 if (g_AIArea) 1274 g_AIArea->lockAIOut(); 1275 1276 _vm->_cursor->hide(); 1277 1278 GameState.setNextDirection(nextDir); 1279 1280 _interruptionFilter = kFilterNoInput; 1281 _turnPush.stopFader(); 1282 1283 // Set up callback. 1284 _turnPushCallBack.setCallBackFlag(kTurnCompletedFlag); 1285 _turnPushCallBack.scheduleCallBack(kTriggerAtStop, 0, 0); 1286 1287 // Stop nav movie. 1288 _navMovie.stop(); 1289 _navMovie.setFlags(0); 1290 1291 if (_blankMovie.isMovieValid() && 1292 (GameState.getTSAState() == kRobotsAtCommandCenter || 1293 GameState.getTSAState() == kRobotsAtFrontDoor || 1294 GameState.getTSAState() == kRobotsAtReadyRoom) && 1295 (GameState.getCurrentRoom() == kTSA0A || GameState.getCurrentRoom() == kTSA06) && 1296 (nextDir == kEast || nextDir == kWest)) { 1297 TimeValue newRobotView = 0; 1298 if (GameState.getCurrentRoom() == kTSA06) 1299 newRobotView = 2 * _blankMovie.getScale(); 1300 if (nextDir == kWest) 1301 newRobotView += _blankMovie.getScale(); 1302 1303 _blankMovie.setSegment(0, _blankMovie.getDuration()); 1304 1305 _pushIn.initFromMovieFrame(_blankMovie.getMovie(), newRobotView); 1306 _turnPush.setInAndOutElements(&_pushIn, &_navMovie); 1307 } else { 1308 // Set segment of nav movie to whole movie, so that subsequent initFromMovieFrame 1309 // will work. 1310 _navMovie.setSegment(0, _navMovie.getDuration()); 1311 1312 _pushIn.initFromMovieFrame(_navMovie.getMovie(), newView); 1313 if (_blankMovie.isMovieValid() && 1314 (GameState.getTSAState() == kRobotsAtCommandCenter || 1315 GameState.getTSAState() == kRobotsAtFrontDoor || 1316 GameState.getTSAState() == kRobotsAtReadyRoom) && 1317 (GameState.getCurrentRoom() == kTSA0A || 1318 GameState.getCurrentRoom() == kTSA06)) 1319 _turnPush.setInAndOutElements(&_pushIn, &_blankMovie); 1320 else 1321 _turnPush.setInAndOutElements(&_pushIn, &_navMovie); 1322 } 1323 1324 _blankMovie.hide(); 1325 _navMovie.hide(); 1326 1327 switch (turnDirection) { 1328 case kTurnLeft: 1329 _turnPush.setSlideDirection(kSlideRightMask); 1330 break; 1331 case kTurnRight: 1332 _turnPush.setSlideDirection(kSlideLeftMask); 1333 break; 1334 case kTurnUp: 1335 _turnPush.setSlideDirection(kSlideDownMask); 1336 break; 1337 case kTurnDown: 1338 _turnPush.setSlideDirection(kSlideUpMask); 1339 break; 1340 } 1341 1342 _turnPush.show(); 1343 1344 FaderMoveSpec moveSpec; 1345 moveSpec.makeTwoKnotFaderSpec(60, 0, 0, 15, 1000); 1346 _turnPush.startFader(moveSpec); 1347 1348 if (g_compass) { 1349 _turnPush.pauseFader(); 1350 1351 int32 startAngle = getStaticCompassAngle(GameState.getCurrentRoom(), GameState.getCurrentDirection()); 1352 int32 stopAngle = getStaticCompassAngle(GameState.getCurrentRoom(), nextDir); 1353 1354 if (turnDirection == kTurnLeft) { 1355 if (startAngle < stopAngle) 1356 startAngle += 360; 1357 } else { 1358 if (stopAngle < startAngle) 1359 stopAngle += 360; 1360 } 1361 1362 FaderMoveSpec turnSpec; 1363 _turnPush.getCurrentFaderMove(turnSpec); 1364 1365 FaderMoveSpec compassMove; 1366 compassMove.makeTwoKnotFaderSpec(turnSpec.getFaderScale(), turnSpec.getNthKnotTime(0), startAngle, turnSpec.getNthKnotTime(1), stopAngle); 1367 g_compass->startFader(compassMove); 1368 } 1369 1370 _turnPushCallBack.cancelCallBack(); 1371 _turnPush.continueFader(); 1372 1373 do { 1374 _vm->checkCallBacks(); 1375 _vm->refreshDisplay(); 1376 _vm->_system->delayMillis(10); 1377 } while (_turnPush.isFading()); 1378 1379 _turnPush.stopFader(); 1380 _neighborhoodNotification.setNotificationFlags(kTurnCompletedFlag, kTurnCompletedFlag); 1381 } 1382 1194 1383 InputBits FullTSA::getInputFilter() { 1195 1384 InputBits result = Neighborhood::getInputFilter(); 1196 1385 … … void FullTSA::turnRight() { 1248 1437 } 1249 1438 1250 1439 void FullTSA::openDoor() { 1440 FaderMoveSpec spec; 1441 1251 1442 switch (GameState.getCurrentRoomAndView()) { 1443 case MakeRoomView(kTSA14, kSouth): 1444 if (_vm->isDVD()) { 1445 spec.makeTwoKnotFaderSpec(10, 0, 255, 5, 0); 1446 _entranceFader.startFader(spec); 1447 } 1448 break; 1252 1449 case MakeRoomView(kTSA15, kSouth): 1450 if (_vm->isDVD()) { 1451 spec.makeTwoKnotFaderSpec(10, 0, 255, 5, 0); 1452 _entranceFader.startFader(spec); 1453 } 1253 1454 if (GameState.getTSAState() == kTSAPlayerNeedsHistoricalLog || GameState.getTSAState() == kRobotsAtFrontDoor) 1254 1455 setCurrentAlternate(kAltTSARedAlert); 1255 1456 break; … … void FullTSA::openDoor() { 1258 1459 Neighborhood::openDoor(); 1259 1460 } 1260 1461 1462 void FullTSA::doorOpened() { 1463 if (_vm->isDVD()) { 1464 switch (GameState.getCurrentRoomAndView()) { 1465 case MakeRoomView(kTSA02, kNorth): 1466 if (_lastExtra == kTSA02NorthDoorWithAgent3 && g_arthurChip) { 1467 if (_vm->getRandomBit()) 1468 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBB36", kArthurTSASawAgent3); 1469 else 1470 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBB37", kArthurTSASawAgent3); 1471 } 1472 break; 1473 case MakeRoomView(kTSA16, kSouth): 1474 case MakeRoomView(kTSA21Cyan, kSouth): 1475 _entranceMusic.stopSound(); 1476 break; 1477 } 1478 } 1479 Neighborhood::doorOpened(); 1480 } 1481 1261 1482 CanMoveForwardReason FullTSA::canMoveForward(ExitTable::Entry &entry) { 1262 1483 if (GameState.getCurrentRoomAndView() == MakeRoomView(kTSA25Red, kNorth)) 1263 1484 return kCantMoveBlocked; … … CanMoveForwardReason FullTSA::canMoveForward(ExitTable::Entry &entry) { 1265 1486 return Neighborhood::canMoveForward(entry); 1266 1487 } 1267 1488 1489 void FullTSA::moveForward() { 1490 ExitTable::Entry exitEntry; 1491 CanMoveForwardReason moveReason = kCanMoveForward; 1492 FaderMoveSpec spec; 1493 1494 if (_vm->isDVD()) { 1495 moveReason = canMoveForward(exitEntry); 1496 if (moveReason == kCanMoveForward && 1497 GameState.getCurrentRoomAndView() == MakeRoomView(kTSA02, kNorth) && 1498 !GameState.allTimeZonesFinished()) { 1499 _entranceMusic.playSound(); 1500 spec.makeOneKnotFaderSpec(255); 1501 _entranceFader.startFader(spec); 1502 } 1503 } 1504 Neighborhood::moveForward(); 1505 if (moveReason == kCanMoveForward && GameState.getCurrentRoomAndView() == MakeRoomView(kTSA01, kSouth) && 1506 GameState.allTimeZonesFinished() && g_arthurChip) 1507 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA51", kArthurTSALeaving); 1508 } 1509 1268 1510 CanOpenDoorReason FullTSA::canOpenDoor(DoorTable::Entry &entry) { 1269 1511 switch (GameState.getCurrentRoomAndView()) { 1270 1512 case MakeRoomView(kTSA02, kNorth): … … void FullTSA::activateHotspots() { 1338 1580 if (!GameState.getTSAFrontDoorUnlockedOutside()) 1339 1581 _vm->getAllHotspots().activateOneHotspot(kTSA02DoorSpotID); 1340 1582 break; 1583 case MakeRoomView(kTSA0A, kEast): 1584 if (GameState.getTSAState() == kRobotsAtCommandCenter || 1585 GameState.getTSAState() == kRobotsAtFrontDoor || 1586 GameState.getTSAState() == kRobotsAtReadyRoom) 1587 _vm->getAllHotspots().deactivateOneHotspot(kTSA0AEastSpotID); 1588 break; 1589 case MakeRoomView(kTSA0A, kWest): 1590 if (GameState.getTSAState() == kRobotsAtCommandCenter || 1591 GameState.getTSAState() == kRobotsAtFrontDoor || 1592 GameState.getTSAState() == kRobotsAtReadyRoom) 1593 _vm->getAllHotspots().deactivateOneHotspot(kTSA0AWastSpotID); 1594 break; 1341 1595 case MakeRoomView(kTSA0B, kEast): 1342 1596 if (GameState.getTSA0BZoomedIn()) 1343 1597 switch (GameState.getTSAState()) { … … void FullTSA::clickInHotspot(const Input &input, const Hotspot *clickedSpot) { 1382 1636 Neighborhood::clickInHotspot(input, clickedSpot); 1383 1637 break; 1384 1638 case kTSA03EastJimenezSpotID: 1385 startExtraLongSequence(kTSA03JimenezZoomIn, kTSA03JimenezZoomOut, kExtraCompletedFlag, kFilterNoInput); 1639 if (_vm->isDVD() && JMPPPInput::isEasterEggModifierInput(input)) 1640 startExtraSequence(kEasterEggJimenez, kExtraCompletedFlag, kFilterNoInput); 1641 else 1642 startExtraLongSequence(kTSA03JimenezZoomIn, kTSA03JimenezZoomOut, kExtraCompletedFlag, kFilterNoInput); 1386 1643 break; 1387 1644 case kTSA03WestCrenshawSpotID: 1388 1645 startExtraLongSequence(kTSA03CrenshawZoomIn, kTSA03CrenshawZoomOut, kExtraCompletedFlag, kFilterNoInput); … … void FullTSA::clickInHotspot(const Input &input, const Hotspot *clickedSpot) { 1391 1648 startExtraLongSequence(kTSA04MatsumotoZoomIn, kTSA04MatsumotoZoomOut, kExtraCompletedFlag, kFilterNoInput); 1392 1649 break; 1393 1650 case kTSA04WestCastilleSpotID: 1394 startExtraLongSequence(kTSA04CastilleZoomIn, kTSA04CastilleZoomOut, kExtraCompletedFlag, kFilterNoInput); 1651 if (_vm->isDVD() && JMPPPInput::isEasterEggModifierInput(input)) 1652 startExtraSequence(kEasterEggCastillo, kExtraCompletedFlag, kFilterNoInput); 1653 else 1654 startExtraLongSequence(kTSA04CastilleZoomIn, kTSA04CastilleZoomOut, kExtraCompletedFlag, kFilterNoInput); 1395 1655 break; 1396 1656 case kTSA05EastSinclairSpotID: 1397 startExtraLongSequence(kTSA05SinclairZoomIn, kTSA05SinclairZoomOut, kExtraCompletedFlag, kFilterNoInput); 1657 if (_vm->isDVD() && JMPPPInput::isEasterEggModifierInput(input)) 1658 startExtraSequence(kEasterEggSinclair, kExtraCompletedFlag, kFilterNoInput); 1659 else 1660 startExtraLongSequence(kTSA05SinclairZoomIn, kTSA05SinclairZoomOut, kExtraCompletedFlag, kFilterNoInput); 1398 1661 break; 1399 1662 case kTSA05WestWhiteSpotID: 1400 1663 startExtraLongSequence(kTSA05WhiteZoomIn, kTSA05WhiteZoomOut, kExtraCompletedFlag, kFilterNoInput); … … void FullTSA::clickInHotspot(const Input &input, const Hotspot *clickedSpot) { 1551 1814 // Pegasus 1552 1815 case kTSA37NorthJumpToPrehistoricSpotID: 1553 1816 startExtraSequence(kTSA37PegasusDepart, kExtraCompletedFlag, kFilterNoInput); 1817 if (g_arthurChip) { 1818 if (_vm->getRandomBit()) 1819 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA30", kArthurTSAUsedPegasus); 1820 else 1821 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA35", kArthurTSAUsedPegasus); 1822 } 1554 1823 break; 1555 1824 case kTSA37NorthExitSpotID: 1556 1825 _sprite2.setCurrentFrameIndex(1); … … void FullTSA::playRightComparison() { 1886 2155 // TSA state is kTSABossSawHistoricalLog. 1887 2156 void FullTSA::startRobotGame() { 1888 2157 requestExtraSequence(kTSA0BNorthCantChangeHistory, 0, kFilterNoInput); 1889 requestExtraSequence(kTSA0BAIInterruption, 0, kFilterNoInput);2158 requestExtraSequence(kTSA0BAIInterruption, kExtraCompletedFlag, kFilterNoInput); 1890 2159 requestExtraSequence(kTSA0BShowGuardRobots, 0, kFilterNoInput); 1891 2160 requestExtraSequence(kTSA0BRobotsToCommandCenter, kExtraCompletedFlag, kFilterNoInput); 1892 2161 } … … void FullTSA::startUpRobotMonitor() { 1900 2169 _sprite1.addPICTResourceFrame(kRedirectionRRRolloverPICTID, true, 1901 2170 kRedirectionRRRolloverLeft - kRedirectionSprite1Left, 1902 2171 kRedirectionRRRolloverTop - kRedirectionSprite1Top); 1903 _sprite1.addPICTResourceFrame(kRedirectionFDRolloverPICTID, false,2172 _sprite1.addPICTResourceFrame(kRedirectionFDRolloverPICTID, true, 1904 2173 kRedirectionFDRolloverLeft - kRedirectionSprite1Left, 1905 2174 kRedirectionFDRolloverTop - kRedirectionSprite1Top); 1906 2175 _sprite1.addPICTResourceFrame(kRedirectionCCDoorPICTID, true, … … void FullTSA::startUpRobotMonitor() { 1909 2178 _sprite1.addPICTResourceFrame(kRedirectionRRDoorPICTID, true, 1910 2179 kRedirectionRRDoorLeft - kRedirectionSprite1Left, 1911 2180 kRedirectionRRDoorTop - kRedirectionSprite1Top); 1912 _sprite1.addPICTResourceFrame(kRedirectionFDDoorPICTID, false,2181 _sprite1.addPICTResourceFrame(kRedirectionFDDoorPICTID, true, 1913 2182 kRedirectionFDDoorLeft - kRedirectionSprite1Left, 1914 2183 kRedirectionFDDoorTop - kRedirectionSprite1Top); 1915 2184 _sprite1.addPICTResourceFrame(kRedirectionClosePICTID, false, … … void FullTSA::arriveAt(const RoomID room, const DirectionConstant direction) { 1994 2263 loopExtraSequence(kTSATransporterArrowLoop, 0); 1995 2264 } 1996 2265 break; 2266 case MakeRoomView(kTSA01, kNorth): 2267 if (g_arthurChip) 2268 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA22", kArthurTSAEnteredCave); 2269 break; 1997 2270 case MakeRoomView(kTSA03, kNorth): 1998 2271 case MakeRoomView(kTSA05, kNorth): 1999 2272 case MakeRoomView(kTSA0A, kNorth): 2000 2273 case MakeRoomView(kTSA06, kNorth): 2001 case MakeRoomView(kTSA07, kNorth):2002 2274 if (_utilityFuse.isFuseLit()) 2003 2275 _utilityFuse.stopFuse(); 2004 2276 GameState.setScoringEnterTSA(true); … … void FullTSA::arriveAt(const RoomID room, const DirectionConstant direction) { 2009 2281 if (!GameState.getTSASeenRobotGreeting()) 2010 2282 startExtraSequence(kTSA04NorthRobotGreeting, kExtraCompletedFlag, kFilterNoInput); 2011 2283 break; 2284 case MakeRoomView(kTSA07, kNorth): 2285 if (_utilityFuse.isFuseLit()) 2286 _utilityFuse.stopFuse(); 2287 GameState.setScoringEnterTSA(true); 2288 if (g_arthurChip) 2289 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA23", kArthurTSAReachedJunction); 2290 break; 2012 2291 case MakeRoomView(kTSA03, kSouth): 2013 2292 GameState.setTSAFrontDoorUnlockedInside(GameState.getTSAState() == kRobotsAtFrontDoor || GameState.allTimeZonesFinished()); 2014 2293 break; … … void FullTSA::arriveAt(const RoomID room, const DirectionConstant direction) { 2093 2372 arriveAtTSA25Red(); 2094 2373 break; 2095 2374 case MakeRoomView(kTSA34, kSouth): 2096 if (GameState.getLastRoom() == kTSA37) 2375 if (GameState.getLastRoom() == kTSA37) { 2097 2376 closeDoorOffScreen(kTSA37, kNorth); 2377 if (_vm->isDVD() && GameState.allTimeZonesFinished() && !_playedSolvedMusicCue) { 2378 _solvedMusicCue.initFromAIFFFile("Sounds/TSA/TSA NORM.32K.AIFF"); 2379 _solvedMusicCue.setVolume(_vm->getAmbienceLevel()); 2380 _solvedMusicCue.playSound(); 2381 _playedSolvedMusicCue = true; 2382 } 2383 } 2098 2384 break; 2099 2385 case MakeRoomView(kTSA37, kNorth): 2100 2386 arriveAtTSA37(); … … void FullTSA::checkRobotLocations(const RoomID room, const DirectionConstant dir 2132 2418 switch (GameState.getTSAState()) { 2133 2419 case kRobotsAtCommandCenter: 2134 2420 if (!_privateFlags.getFlag(kTSAPrivateSeenRobotWarningFlag)) { 2135 g_AIArea->playAIMovie(kRightAreaSignature, "Images/AI/TSA/XT11WB", false, kWarningInterruption); 2421 if (g_AIArea->isChattyAI()) 2422 g_AIArea->playAIMovie(kRightAreaSignature, "Images/AI/TSA/XT11WB", false, kWarningInterruption); 2136 2423 _privateFlags.setFlag(kTSAPrivateSeenRobotWarningFlag, true); 2137 2424 } 2138 2425 break; … … void FullTSA::turnTo(const DirectionConstant newDirection) { 2286 2573 switch (GameState.getTSAState()) { 2287 2574 case kRobotsAtCommandCenter: 2288 2575 if (!_privateFlags.getFlag(kTSAPrivateSeenRobotWarningFlag)) { 2289 g_AIArea->playAIMovie(kRightAreaSignature, "Images/AI/TSA/XT11WB", false, kWarningInterruption); 2576 if (g_AIArea->isChattyAI()) 2577 g_AIArea->playAIMovie(kRightAreaSignature, "Images/AI/TSA/XT11WB", false, kWarningInterruption); 2290 2578 _privateFlags.setFlag(kTSAPrivateSeenRobotWarningFlag, true); 2291 2579 } 2292 2580 break; … … void FullTSA::closeDoorOffScreen(const RoomID room, const DirectionConstant) { 2355 2643 } 2356 2644 } 2357 2645 2646 void FullTSA::startExtraSequence(const ExtraID extraID, const NotificationFlags flags, const InputBits interruptionFilter) { 2647 static const TimeValue times[3][2] = { 2648 { 0, 11720 }, 2649 { 11720, 19840 }, 2650 { 19840, 29960 } 2651 }; 2652 TimeValue segmentStart = 0, segmentStop = 0; 2653 bool loopSequence = false; 2654 Common::Rect pushBounds; 2655 NotificationFlags extraFlags; 2656 2657 switch (extraID) { 2658 case kEasterEggJimenez: 2659 case kEasterEggCastillo: 2660 case kEasterEggSinclair: 2661 _turnPush.getBounds(pushBounds); 2662 _extraMovie.initFromMovieFile("Images/TSA/Wacky TSA.movie"); 2663 segmentStart = times[extraID - 1000][0]; 2664 segmentStop = times[extraID - 1000][1]; 2665 loopSequence = false; 2666 2667 _lastExtra = extraID; 2668 _turnPush.hide(); 2669 2670 if (!loopSequence && g_AIArea) 2671 g_AIArea->lockAIOut(); 2672 2673 extraFlags = flags; 2674 _interruptionFilter = interruptionFilter; 2675 // Stop the nav movie before doing anything else 2676 _navMovie.stop(); 2677 _navMovie.stopDisplaying(); 2678 2679 _extraMovie.setVolume(_vm->getSoundFXLevel()); 2680 _extraMovie.moveElementTo(pushBounds.left, pushBounds.top); 2681 _extraMovie.setDisplayOrder(kNavMovieOrder + 1); 2682 _extraMovie.startDisplaying(); 2683 _extraMovie.show(); 2684 _extraMovie.setFlags(0); 2685 _extraMovie.setSegment(segmentStart, segmentStop); 2686 _extraMovie.setTime(segmentStart); 2687 if (loopSequence) 2688 _extraMovie.setFlags(kLoopTimeBase); 2689 else 2690 extraFlags |= kNeighborhoodMovieCompletedFlag; 2691 _extraMovieCallBack.cancelCallBack(); 2692 _extraMovieCallBack.initCallBack(&_extraMovie, kCallBackAtExtremes); 2693 if (extraFlags != 0) { 2694 _extraMovieCallBack.setCallBackFlag(extraFlags); 2695 _extraMovieCallBack.scheduleCallBack(kTriggerAtStop, 0, 0); 2696 } 2697 _extraMovie.start(); 2698 break; 2699 default: 2700 Neighborhood::startExtraSequence(extraID, flags, interruptionFilter); 2701 break; 2702 } 2703 } 2704 2358 2705 void FullTSA::receiveNotification(Notification *notification, const NotificationFlags flags) { 2359 2706 ExtraID lastExtra = _lastExtra; 2360 2707 … … void FullTSA::receiveNotification(Notification *notification, const Notification 2372 2719 Neighborhood::receiveNotification(notification, flags); 2373 2720 2374 2721 InventoryItem *item; 2722 bool doArthurSawBustMovie, doArthurRedirectedRobotsMovie; 2375 2723 2376 2724 if ((flags & kExtraCompletedFlag) != 0) { 2377 2725 // Only allow input if we're not in the middle of series of queue requests. 2378 2726 if (actionQueueEmpty()) 2379 2727 _interruptionFilter = kFilterAllInput; 2380 2728 2729 doArthurSawBustMovie = false; 2730 doArthurRedirectedRobotsMovie = false; 2381 2731 switch (lastExtra) { 2382 2732 case kTSAGTCardSwipe: 2383 2733 item = (InventoryItem *)_vm->getAllItems().findItemByID(kKeyCard); … … void FullTSA::receiveNotification(Notification *notification, const Notification 2408 2758 break; 2409 2759 case kTSA03JimenezZoomIn: 2410 2760 GameState.setScoringSawBust1(true); 2761 doArthurSawBustMovie = true; 2411 2762 break; 2412 2763 case kTSA03CrenshawZoomIn: 2413 2764 GameState.setScoringSawBust2(true); 2765 doArthurSawBustMovie = true; 2414 2766 break; 2415 2767 case kTSA04MatsumotoZoomIn: 2416 2768 GameState.setScoringSawBust3(true); 2769 doArthurSawBustMovie = true; 2417 2770 break; 2418 2771 case kTSA04CastilleZoomIn: 2419 2772 GameState.setScoringSawBust4(true); 2773 doArthurSawBustMovie = true; 2420 2774 break; 2421 2775 case kTSA05SinclairZoomIn: 2422 2776 GameState.setScoringSawBust5(true); 2777 doArthurSawBustMovie = true; 2423 2778 break; 2424 2779 case kTSA05WhiteZoomIn: 2425 2780 GameState.setScoringSawBust6(true); 2781 doArthurSawBustMovie = true; 2782 break; 2783 case kEasterEggJimenez: 2784 case kEasterEggCastillo: 2785 case kEasterEggSinclair: 2786 _extraMovie.stopDisplaying(); 2787 _extraMovie.releaseMovie(); 2788 _navMovie.startDisplaying(); 2789 doArthurSawBustMovie = true; 2790 break; 2791 case kTSA0AEastRobot: 2792 if (g_arthurChip) 2793 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA48", kArthurTSAClickedRobot1); 2794 break; 2795 case kTSA0AWestRobot: 2796 if (g_arthurChip) 2797 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA53", kArthurTSAClickedRobot2); 2426 2798 break; 2427 2799 2428 2800 // Command center … … void FullTSA::receiveNotification(Notification *notification, const Notification 2526 2898 case kTSA0BShowGuardRobots: 2527 2899 startUpRobotMonitor(); 2528 2900 // Fall through 2901 case kTSA0BRobotsFromCommandCenterToFrontDoor: 2902 case kTSA0BRobotsFromReadyRoomToFrontDoor: 2903 doArthurRedirectedRobotsMovie = true; 2529 2904 case kTSA0BRobotsFromCommandCenterToReadyRoom: 2530 2905 case kTSA0BRobotsFromReadyRoomToCommandCenter: 2531 case kTSA0BRobotsFromCommandCenterToFrontDoor:2532 2906 case kTSA0BRobotsFromFrontDoorToCommandCenter: 2533 2907 case kTSA0BRobotsFromFrontDoorToReadyRoom: 2534 case kTSA0BRobotsFromReadyRoomToFrontDoor:2535 2908 _sprite2.setCurrentFrameIndex(kRedirectionSecuredSprite); 2536 2909 _sprite2.show(); 2537 2910 break; 2911 case kTSA0BAIInterruption: 2912 if (g_arthurChip) 2913 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA52", kArthurTSAConfinedByBaldwin); 2914 break; 2538 2915 2539 2916 // TBP monitor. 2540 2917 case kTSA0BWestZoomIn: … … void FullTSA::receiveNotification(Notification *notification, const Notification 2548 2925 } 2549 2926 2550 2927 initializeTBPMonitor(kMonitorNeutral, 0); 2928 if (GameState.getTSAState() == kTSAPlayerForcedReview && g_arthurChip) 2929 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA55", kArthurTSAOpenTBPMonitor); 2551 2930 break; 2552 2931 case kTSA0BWestZoomOut: 2553 2932 GameState.setTSA0BZoomedIn(false); … … void FullTSA::receiveNotification(Notification *notification, const Notification 2574 2953 case kTSA22RedEastZoomInSequence: 2575 2954 _privateFlags.setFlag(kTSAPrivateKeyVaultOpenFlag, true); 2576 2955 setCurrentActivation(kActivationKeyVaultOpen); 2956 if (g_arthurChip) 2957 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA50", kArthurTSASawJourneymanKey); 2577 2958 break; 2578 2959 case kTSA23RedWestVaultZoomInSequence: 2579 2960 _privateFlags.setFlag(kTSAPrivateChipVaultOpenFlag, true); 2580 2961 setCurrentActivation(kActivationChipVaultOpen); 2962 if (g_arthurChip) 2963 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA54", kArthurTSASawBiochips); 2581 2964 break; 2582 2965 case kTSA25NorthPutOnSuit: 2583 2966 GameState.setTSABiosuitOn(true); 2584 2967 GameState.setScoringGotBiosuit(true); 2585 2968 // Fall through... 2586 2969 case kTSA25NorthAlreadyHaveSuit: 2587 requestExtraSequence(kTSA25NorthDescending1, 0, kFilterNoInput); 2970 requestExtraSequence(kTSA25NorthDescending1, kExtraCompletedFlag, kFilterNoInput); 2971 break; 2972 case kTSA25NorthDescending1: 2588 2973 requestExtraSequence(kTSA25NorthDescending2, kExtraCompletedFlag, kFilterNoInput); 2974 if (GameState.getTSAState() != kTSAPlayerNeedsHistoricalLog && g_arthurChip) 2975 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA04", kArthurTSAUsedTurbolift); 2589 2976 break; 2590 2977 case kTSA25NorthDescending2: 2591 2978 arriveAt(kTSA26, kNorth); … … void FullTSA::receiveNotification(Notification *notification, const Notification 2745 3132 case kTSA37CongratulationsToExit: 2746 3133 GameState.setTSAState(kPlayerFinishedWithTSA); 2747 3134 initializePegasusButtons(true); 3135 if (g_arthurChip) { 3136 if (_vm->getRandomBit()) 3137 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA49", kArthurTSASawBaldwinSayGo); 3138 else 3139 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBB22", kArthurTSASawBaldwinSayGo); 3140 } 2748 3141 break; 2749 3142 } 3143 if (g_arthurChip) { 3144 if (doArthurSawBustMovie) 3145 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA21", kArthurTSASawBust); 3146 else if (doArthurRedirectedRobotsMovie && GameState.getTSAState() == kRobotsAtFrontDoor) 3147 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA02", kArthurTSARedirectedRobots); 3148 } 2750 3149 } 2751 3150 2752 3151 g_AIArea->checkMiddleArea(); 2753 3152 } 2754 3153 3154 void FullTSA::setAmbienceLevel(const uint16 level) { 3155 Neighborhood::setAmbienceLevel(level); 3156 if (_entranceMusic.isSoundLoaded()) 3157 _entranceFader.setMasterVolume(level); 3158 } 3159 2755 3160 void FullTSA::arriveFromPrehistoric() { 2756 3161 if (_vm->playerHasItemID(kHistoricalLog)) { 2757 3162 GameState.setScoringFinishedPrehistoric(); -
engines/pegasus/neighborhood/tsa/fulltsa.h
diff --git a/engines/pegasus/neighborhood/tsa/fulltsa.h b/engines/pegasus/neighborhood/tsa/fulltsa.h index a646d57..8f8bacf 100644
a b public: 68 68 69 69 void checkContinuePoint(const RoomID, const DirectionConstant); 70 70 71 void setAmbienceLevel(const uint16); 72 71 73 bool canSolve(); 72 74 void doSolve(); 73 75 … … protected: 99 101 void downButton(const Input &); 100 102 void startDoorOpenMovie(const TimeValue, const TimeValue); 101 103 TimeValue getViewTime(const RoomID, const DirectionConstant); 104 void showViewFrame(TimeValue); 102 105 void findSpotEntry(const RoomID, const DirectionConstant, SpotFlags, SpotTable::Entry &); 103 106 void turnTo(const DirectionConstant); 104 107 CanMoveForwardReason canMoveForward(ExitTable::Entry &); 108 void moveForward(); 105 109 CanOpenDoorReason canOpenDoor(DoorTable::Entry &); 106 110 void bumpIntoWall(); 107 111 void initializeTBPMonitor(const int, const ExtraID); … … protected: 109 113 void getExtraCompassMove(const ExtraTable::Entry &, FaderMoveSpec &); 110 114 Hotspot *getItemScreenSpot(Item *, DisplayElement *); 111 115 void openDoor(); 116 void doorOpened(); 112 117 void turnRight(); 113 118 void turnLeft(); 114 119 void closeDoorOffScreen(const RoomID, const DirectionConstant); 120 void startExtraSequence(const ExtraID, const NotificationFlags, const InputBits); 115 121 void playExtraMovie(const ExtraTable::Entry &, const NotificationFlags, const InputBits interruptionInput); 122 void startTurnPush(const TurnDirection, const TimeValue, const DirectionConstant); 116 123 void handleInput(const Input &, const Hotspot *); 117 124 void arriveAtTSA25Red(); 118 125 void startUpComparisonMonitor(); … … protected: 142 149 void checkRobotLocations(const RoomID, const DirectionConstant); 143 150 void getExtraEntry(const uint32, ExtraTable::Entry &); 144 151 152 Movie _extraMovie; 153 NotificationCallBack _extraMovieCallBack; 154 Movie _blankMovie; 155 156 Sound _entranceMusic; 157 SoundFader _entranceFader; 158 bool _playedSolvedMusicCue; 159 Sound _solvedMusicCue; 160 145 161 Sprite _sprite1, _sprite2, _sprite3; 146 162 FuseFunction _utilityFuse; 147 163 RipTimer _ripTimer; -
engines/pegasus/neighborhood/tsa/tinytsa.cpp
diff --git a/engines/pegasus/neighborhood/tsa/tinytsa.cpp b/engines/pegasus/neighborhood/tsa/tinytsa.cpp index 0326c7f..e703929 100644
a b 28 28 #include "pegasus/pegasus.h" 29 29 #include "pegasus/ai/ai_area.h" 30 30 #include "pegasus/items/biochips/aichip.h" 31 #include "pegasus/items/biochips/arthurchip.h" 31 32 #include "pegasus/items/biochips/opticalchip.h" 32 33 #include "pegasus/neighborhood/mars/constants.h" 33 34 #include "pegasus/neighborhood/norad/constants.h" … … Common::String TinyTSA::getEnvScanMovie() { 179 180 } 180 181 181 182 void TinyTSA::loadAmbientLoops() { 182 loadLoopSound1("Sounds/TSA/T01NAE.NEW.22K.AIFF"); 183 if (_vm->isDVD()) // Updated sound in the DVD version 184 loadLoopSound1("Sounds/TSA/T01NAE.NEW.32K.AIFF"); 185 else 186 loadLoopSound1("Sounds/TSA/T01NAE.NEW.22K.AIFF"); 183 187 } 184 188 185 189 int16 TinyTSA::getStaticCompassAngle(const RoomID room, const DirectionConstant dir) { … … void TinyTSA::receiveNotification(Notification *notification, const Notification 385 389 break; 386 390 } 387 391 } 392 if (((GameState.getNoradFinished() && !(GameState.getMarsFinished() || GameState.getWSCFinished())) || 393 (GameState.getMarsFinished() && !(GameState.getNoradFinished() || GameState.getWSCFinished())) || 394 (GameState.getWSCFinished() && !(GameState.getNoradFinished() || GameState.getMarsFinished()))) && 395 g_arthurChip) 396 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBB43", kArthurTSASawFirstOpMemMovie); 388 397 389 398 requestExtraSequence(kTinyTSA37OpMemReviewToMainMenu, kExtraCompletedFlag, kFilterNoInput); 390 399 break; … … void TinyTSA::receiveNotification(Notification *notification, const Notification 393 402 GameState.setTSAState(kPlayerLockedInPegasus); 394 403 showMainJumpMenu(); 395 404 makeContinuePoint(); 405 if (g_arthurChip) 406 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA22", kArthurTSAInPegasusNoVideo); 396 407 break; 397 408 case kTinyTSA37JumpToNoradMenu: 398 409 setCurrentActivation(kActivationTinyTSAJumpToNorad); -
engines/pegasus/neighborhood/wsc/wsc.cpp
diff --git a/engines/pegasus/neighborhood/wsc/wsc.cpp b/engines/pegasus/neighborhood/wsc/wsc.cpp index 09e2a48..e7e212c 100644
a b 23 23 * 24 24 */ 25 25 26 #include "pegasus/cursor.h" 26 27 #include "pegasus/energymonitor.h" 27 28 #include "pegasus/gamestate.h" 28 29 #include "pegasus/pegasus.h" 29 30 #include "pegasus/ai/ai_area.h" 31 #include "pegasus/items/biochips/arthurchip.h" 30 32 #include "pegasus/items/biochips/opticalchip.h" 31 33 #include "pegasus/items/biochips/shieldchip.h" 32 34 #include "pegasus/neighborhood/wsc/wsc.h" … … static const CanTurnReason kCantTurnWatchingDiagnosis = kCantTurnLastReason + 1; 39 41 static const CanTurnReason kCantTurnWatchingAnalysis = kCantTurnWatchingDiagnosis + 1; 40 42 static const CanTurnReason kCantTurnInMoleculeGame = kCantTurnWatchingAnalysis + 1; 41 43 44 static const ExtraID kImplantNoGun = 1000; 45 static const ExtraID kImplantWithGun = 1001; 46 static const ExtraID kEasterEggWalchek = 1002; 47 48 static const HotSpotID kBiotechImplantHotSpotID = 10000; 49 42 50 static const TimeScale kMoleculesMovieScale = 600; 43 51 static const TimeValue kMoleculeLoopTime = 4 * kMoleculesMovieScale; 44 52 static const TimeValue kMoleculeFailTime = 2 * kMoleculesMovieScale; … … static const CoordType kMoleculesMovieLeft = kNavAreaLeft + 112; 473 481 static const CoordType kMoleculesMovieTop = kNavAreaTop + 40; 474 482 475 483 WSC::WSC(InputHandler *nextHandler, PegasusEngine *owner) : Neighborhood(nextHandler, owner, "WSC", kWSCID), 476 _ moleculesMovie(kNoDisplayElement) {484 _biotechImplantSpot(kBiotechImplantHotSpotID), _extraMovie(kNoDisplayElement), _moleculesMovie(kNoDisplayElement) { 477 485 setIsItemTaken(kArgonCanister); 478 486 setIsItemTaken(kSinclairKey); 479 487 setIsItemTaken(kNitrogenCanister); … … WSC::WSC(InputHandler *nextHandler, PegasusEngine *owner) : Neighborhood(nextHan 486 494 GameState.isTakenItemID(kSinclairKey)); 487 495 } 488 496 497 WSC::~WSC() { 498 if (_vm->isDVD()) 499 _vm->getAllHotspots().remove(&_biotechImplantSpot); 500 } 501 489 502 uint16 WSC::getDateResID() const { 490 503 return kDate2310ID; 491 504 } … … uint16 WSC::getDateResID() const { 493 506 void WSC::init() { 494 507 Neighborhood::init(); 495 508 509 _extraMovieCallBack.setNotification(&_neighborhoodNotification); 510 496 511 _cachedZoomSpot = 0; 497 512 _argonSprite = 0; 498 513 499 514 // HACK: Fix the drag item for picking up the Sinclair Key Card 500 515 HotspotInfoTable::Entry *entry = findHotspotEntry(kWSC02SouthTakeArgonSpotID); 501 516 entry->hotspotItem = kArgonPickup; 517 518 if (_vm->isDVD()) { 519 Hotspot *aSpot = _vm->getAllHotspots().findHotspotByID(kW61TimeBendingSpotID); 520 aSpot->setArea(Common::Rect(97, 156, 275, 174)); 521 522 _biotechImplantSpot.setArea(Common::Rect(kNavAreaLeft + 97, kNavAreaTop + 174, kNavAreaLeft + 275, kNavAreaTop + 182)); 523 _biotechImplantSpot.setHotspotFlags(kNeighborhoodSpotFlag | kClickSpotFlag); 524 _vm->getAllHotspots().push_back(&_biotechImplantSpot); 525 } 502 526 } 503 527 504 528 void WSC::flushGameState() { … … void WSC::getExtraEntry(const uint32 id, ExtraTable::Entry &extraEntry) { 1002 1026 break; 1003 1027 case kW61SouthScreenOnWithGun: 1004 1028 if (GameState.isTakenItemID(kMachineGun)) 1005 Neighborhood::getExtraEntry(id, extraEntry);1006 else1007 1029 Neighborhood::getExtraEntry(kW61SouthScreenOnNoGun, extraEntry); 1030 else 1031 Neighborhood::getExtraEntry(id, extraEntry); 1008 1032 break; 1009 1033 case kW61SouthSmartAlloysWithGun: 1010 1034 if (GameState.isTakenItemID(kMachineGun)) 1011 Neighborhood::getExtraEntry(id, extraEntry);1012 else1013 1035 Neighborhood::getExtraEntry(kW61SouthSmartAlloysNoGun, extraEntry); 1036 else 1037 Neighborhood::getExtraEntry(id, extraEntry); 1014 1038 break; 1015 1039 case kW61SouthMorphingWithGun: 1016 1040 if (GameState.isTakenItemID(kMachineGun)) 1017 Neighborhood::getExtraEntry(id, extraEntry);1018 else1019 1041 Neighborhood::getExtraEntry(kW61SouthMorphingNoGun, extraEntry); 1042 else 1043 Neighborhood::getExtraEntry(id, extraEntry); 1020 1044 break; 1021 1045 case kW61SouthTimeBendingWithGun: 1022 1046 if (GameState.isTakenItemID(kMachineGun)) 1023 Neighborhood::getExtraEntry(id, extraEntry);1024 else1025 1047 Neighborhood::getExtraEntry(kW61SouthTimeBendingNoGun, extraEntry); 1048 else 1049 Neighborhood::getExtraEntry(id, extraEntry); 1026 1050 break; 1027 1051 case kW98RobotHeadOpensLight: 1028 1052 if (GameState.getWSCCatwalkDark()) … … void WSC::bumpIntoWall() { 1084 1108 Neighborhood::bumpIntoWall(); 1085 1109 } 1086 1110 1111 void WSC::spotCompleted() { 1112 Neighborhood::spotCompleted(); 1113 if (_vm->isDVD() && GameState.getCurrentRoomAndView() == MakeRoomView(kWSC58, kSouth) && g_arthurChip) { 1114 g_AIArea->checkRules(); 1115 if (GameState.isTakenItemID(kCrowbar)) { 1116 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA94", kArthurWSCSawBrokenDoor); 1117 } else { 1118 if (_vm->getRandomBit()) 1119 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA95", kArthurWSCSawBrokenDoorNoCrowBar); 1120 else 1121 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA39", kArthurWSCSawBrokenDoorNoCrowBar); 1122 } 1123 } 1124 } 1125 1087 1126 void WSC::closeDoorOffScreen(const RoomID room, const DirectionConstant) { 1088 1127 Item *keyCard; 1089 1128 … … void WSC::cantOpenDoor(CanOpenDoorReason reason) { 1130 1169 switch (GameState.getCurrentRoomAndView()) { 1131 1170 case MakeRoomView(kWSC22, kWest): 1132 1171 playSpotSoundSync(kNakamuraNotHomeIn, kNakamuraNotHomeOut); 1172 if (g_arthurChip) 1173 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA98", kArthurWSCAttemptedLockedDoor); 1133 1174 break; 1134 1175 case MakeRoomView(kWSC23, kEast): 1135 1176 playSpotSoundSync(kHernandezNotHomeIn, kHernandezNotHomeOut); 1177 if (g_arthurChip) 1178 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA98", kArthurWSCAttemptedLockedDoor); 1136 1179 break; 1137 1180 case MakeRoomView(kWSC26, kWest): 1138 1181 playSpotSoundSync(kGrailisNotHomeIn, kGrailisNotHomeOut); 1182 if (g_arthurChip) 1183 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA98", kArthurWSCAttemptedLockedDoor); 1139 1184 break; 1140 1185 case MakeRoomView(kWSC27, kEast): 1141 1186 playSpotSoundSync(kWashingtonNotHomeIn, kWashingtonNotHomeOut); 1187 if (g_arthurChip) 1188 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA98", kArthurWSCAttemptedLockedDoor); 1142 1189 break; 1143 1190 case MakeRoomView(kWSC32, kWest): 1144 1191 playSpotSoundSync(kTheriaultNotHomeIn, kTheriaultNotHomeOut); 1192 if (g_arthurChip) 1193 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA98", kArthurWSCAttemptedLockedDoor); 1145 1194 break; 1146 1195 case MakeRoomView(kWSC33, kEast): 1147 1196 playSpotSoundSync(kSullivanNotHomeIn, kSullivanNotHomeOut); 1197 if (g_arthurChip) 1198 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA98", kArthurWSCAttemptedLockedDoor); 1148 1199 break; 1149 1200 case MakeRoomView(kWSC41, kWest): 1150 1201 playSpotSoundSync(kGlennerNotHomeIn, kGlennerNotHomeOut); 1202 if (g_arthurChip) 1203 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA98", kArthurWSCAttemptedLockedDoor); 1151 1204 break; 1152 1205 case MakeRoomView(kWSC42, kEast): 1153 1206 playSpotSoundSync(kSinclairNotHomeIn, kSinclairNotHomeOut); 1207 if (!GameState.isTakenItemID(kSinclairKey) && g_arthurChip) 1208 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA91", kArthurWSCAttemptedSinclairDoorNoKey); 1154 1209 break; 1155 1210 case MakeRoomView(kWSC15, kWest): 1156 1211 case MakeRoomView(kWSC25, kWest): … … void WSC::cantOpenDoor(CanOpenDoorReason reason) { 1158 1213 case MakeRoomView(kWSC41, kEast): 1159 1214 case MakeRoomView(kWSC46, kWest): 1160 1215 playSpotSoundSync(kWSCLabClosedIn, kWSCLabClosedOut); 1216 if (g_arthurChip) 1217 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA98", kArthurWSCAttemptedLockedDoor); 1161 1218 break; 1162 1219 default: 1163 1220 Neighborhood::cantOpenDoor(reason); … … void WSC::zoomTo(const Hotspot *hotspot) { 1294 1351 } 1295 1352 1296 1353 void WSC::startExtraSequence(const ExtraID extraID, const NotificationFlags flags, const InputBits interruptionFilter) { 1297 if (extraID == kW61Brochure) 1298 loadLoopSound1(""); 1354 TimeValue segmentStart = 0, segmentStop = 0; 1355 bool loopSequence = false; 1356 Common::Rect pushBounds; 1357 NotificationFlags extraFlags; 1358 1359 switch (extraID) { 1360 case kImplantNoGun: 1361 case kImplantWithGun: 1362 case kEasterEggWalchek: 1363 _turnPush.getBounds(pushBounds); 1364 1365 switch (extraID) { 1366 case kImplantNoGun: 1367 _extraMovie.initFromMovieFile("Images/World Science Center/W61SNF.movie"); 1368 break; 1369 case kImplantWithGun: 1370 _extraMovie.initFromMovieFile("Images/World Science Center/W61SZF.movie"); 1371 break; 1372 case kEasterEggWalchek: 1373 _extraMovie.initFromMovieFile("Images/World Science Center/W61WZF.movie"); 1374 break; 1375 default: 1376 break; 1377 } 1378 segmentStart = 0; 1379 segmentStop = _extraMovie.getDuration(); 1380 loopSequence = false; 1381 1382 _lastExtra = extraID; 1383 _turnPush.hide(); 1384 1385 if (!loopSequence && g_AIArea) 1386 g_AIArea->lockAIOut(); 1387 1388 extraFlags = flags; 1389 _interruptionFilter = interruptionFilter; 1390 // Stop the nav movie before doing anything else 1391 _navMovie.stop(); 1392 _navMovie.stopDisplaying(); 1393 1394 _extraMovie.setVolume(_vm->getSoundFXLevel()); 1395 _extraMovie.moveElementTo(pushBounds.left, pushBounds.top); 1396 _extraMovie.setDisplayOrder(kNavMovieOrder + 1); 1397 _extraMovie.startDisplaying(); 1398 _extraMovie.show(); 1399 _extraMovie.setFlags(0); 1400 _extraMovie.setSegment(segmentStart, segmentStop); 1401 _extraMovie.setTime(segmentStart); 1402 if (loopSequence) 1403 _extraMovie.setFlags(kLoopTimeBase); 1404 else 1405 extraFlags |= kNeighborhoodMovieCompletedFlag; 1406 _extraMovieCallBack.cancelCallBack(); 1407 _extraMovieCallBack.initCallBack(&_extraMovie, kCallBackAtExtremes); 1408 if (extraFlags != 0) { 1409 _extraMovieCallBack.setCallBackFlag(extraFlags); 1410 _extraMovieCallBack.scheduleCallBack(kTriggerAtStop, 0, 0); 1411 } 1412 _extraMovie.start(); 1413 break; 1414 default: 1415 switch (extraID) { 1416 case kW61Brochure: 1417 loadLoopSound1(""); 1418 break; 1419 } 1420 Neighborhood::startExtraSequence(extraID, flags, interruptionFilter); 1421 if (extraID == kWSCSpinRobot && g_arthurChip) { 1422 if (_vm->getRandomBit()) 1423 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA93", kArthurWSCSawAresHologram); 1424 else 1425 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBB08", kArthurWSCSawAresHologram); 1426 } 1427 break; 1428 } 1429 } 1299 1430 1300 Neighborhood::startExtraSequence(extraID, flags, interruptionFilter); 1431 void WSC::startDoorOpenMovie(const TimeValue startTime, const TimeValue stopTime) { 1432 Neighborhood::startDoorOpenMovie(startTime, stopTime); 1433 if (GameState.getCurrentRoomAndView() == MakeRoomView(kWSC58, kSouth) && g_arthurChip) 1434 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA19", kArthurWSCUsedCrowBar); 1301 1435 } 1302 1436 1303 1437 int16 WSC::getStaticCompassAngle(const RoomID room, const DirectionConstant dir) { … … void WSC::loadAmbientLoops() { 1371 1505 RoomID room = GameState.getCurrentRoom(); 1372 1506 1373 1507 if (room >= kWSC01 && room <= kWSC04) { 1374 if (GameState.getWSCSeenTimeStream()) 1375 loadLoopSound1("Sounds/World Science Center/WLabLoop.22K.AIFF", 0x100 / 2); 1376 } else if ((room >= kWSC06 && room <= kWSC58) || (room >= kWSC62 && room <= kWSC63)) 1377 loadLoopSound1("Sounds/World Science Center/Organic Walls.22K.AIFF", 0x100 / 2); 1378 else if (room >= kWSC82 && room <= kWSC92) 1379 loadLoopSound1("Sounds/World Science Center/Creature Feature.22K.AIFF"); 1380 else if ((room >= kWSC60 && room <= kWSC61West) || (room >= kWSC64 && room <= kWSC81) || 1381 (room >= kWSC93 && room <= kWSC97)) 1382 loadLoopSound1("Sounds/World Science Center/The Other Side.22K.AIFF", 0x100 / 12); 1383 else if (room == kWSC98) 1384 loadLoopSound1("Sounds/World Science Center/WCatLoop.22K.AIFF"); 1508 if (GameState.getWSCSeenTimeStream()) { 1509 if (_vm->isDVD()) 1510 loadLoopSound1("Sounds/World Science Center/WLabLoop.32K.AIFF", 0x100 / 4); 1511 else 1512 loadLoopSound1("Sounds/World Science Center/WLabLoop.22K.AIFF", 0x100 / 2); 1513 if (_vm->isDVD()) { 1514 if (GameState.getWSCPoisoned()) 1515 loadLoopSound2("Sounds/World Science Center/Poisoned.32K.16.AIFF", 0x100 / 4); 1516 else 1517 loadLoopSound2(""); 1518 } 1519 } 1520 } else { 1521 if ((room >= kWSC06 && room <= kWSC58) || (room >= kWSC62 && room <= kWSC63)) { 1522 if (_vm->isDVD()) // Updated for the DVD version 1523 loadLoopSound1("Sounds/World Science Center/Organic Walls.32K.16.AIFF", 205); // ~80% 1524 else 1525 loadLoopSound1("Sounds/World Science Center/Organic Walls.22K.AIFF", 0x100 / 2); 1526 } else if (room >= kWSC82 && room <= kWSC92) { 1527 if (_vm->isDVD()) // Updated for the DVD version 1528 loadLoopSound1("Sounds/World Science Center/Creature Feature.32K.16.AIFF"); 1529 else 1530 loadLoopSound1("Sounds/World Science Center/Creature Feature.22K.AIFF"); 1531 } else if ((room >= kWSC60 && room <= kWSC61West) || (room >= kWSC64 && room <= kWSC81) || 1532 (room >= kWSC93 && room <= kWSC97)) { 1533 if (_vm->isDVD()) // Updated for the DVD version 1534 loadLoopSound1("Sounds/World Science Center/The Other Side.32K.16.AIFF", 51); // ~20% 1535 else 1536 loadLoopSound1("Sounds/World Science Center/The Other Side.22K.AIFF", 0x100 / 12); 1537 } else if (room == kWSC98) { 1538 loadLoopSound1("Sounds/World Science Center/WCatLoop.22K.AIFF"); 1539 } 1540 loadLoopSound2(""); 1541 } 1385 1542 } 1386 1543 1387 1544 void WSC::checkContinuePoint(const RoomID room, const DirectionConstant direction) { … … void WSC::arriveAt(const RoomID room, const DirectionConstant dir) { 1498 1655 if (GameState.getWSCDesignedAntidote() && !GameState.getWSCPickedUpAntidote()) 1499 1656 setCurrentActivation(kActivationReadyForSynthesis); 1500 1657 break; 1658 case MakeRoomView(kWSC19, kWest): 1659 if (!(GameState.isTakenItemID(kSinclairKey) && GameState.isTakenItemID(kArgonCanister) && 1660 GameState.isTakenItemID(kNitrogenCanister)) && g_arthurChip) 1661 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA34", kArthurWSCLeftLabNoKeyOrCanisters); 1662 break; 1501 1663 case MakeRoomView(kWSC16, kNorth): 1502 1664 if (getCurrentAlternate() == kAltWSCPeopleAtW19North) { 1503 1665 setCurrentAlternate(kAltWSCNormal); 1504 1666 _privateFlags.setFlag(kWSCPrivateSeenPeopleAt19NorthFlag, true); 1505 1667 } 1506 1668 break; 1669 case MakeRoomView(kWSC06, kNorth): 1670 if (g_arthurChip) 1671 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA81", kArthurWSCAtOppositeDoor); 1672 break; 1507 1673 case MakeRoomView(kWSC07, kSouth): 1508 1674 case MakeRoomView(kWSC56, kNorth): 1509 1675 setCurrentActivation(kActivationReadyForMap); … … void WSC::arriveAt(const RoomID room, const DirectionConstant dir) { 1514 1680 case MakeRoomView(kWSC42, kEast): 1515 1681 _privateFlags.setFlag(kWSCPrivateSinclairOfficeOpenFlag, false); 1516 1682 setCurrentActivation(kActivationSinclairOfficeLocked); 1683 if (g_arthurChip) { 1684 if (GameState.isTakenItemID(kSinclairKey)) 1685 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA99", kArthurWSCSawSinclairDoor); 1686 else 1687 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA92", kArthurWSCSawSinclairDoorNoKey); 1688 } 1517 1689 break; 1518 1690 case MakeRoomView(kWSC58, kSouth): 1519 1691 setCurrentActivation(kActivationW58SouthDoorLocked); … … void WSC::arriveAt(const RoomID room, const DirectionConstant dir) { 1522 1694 case MakeRoomView(kWSC60, kEast): 1523 1695 GameState.setScoringEnteredSinclairOffice(); 1524 1696 break; 1697 case MakeRoomView(kWSC60East, kEast): 1698 if (g_arthurChip) 1699 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBB03", kArthurWSCZoomedToSnake); 1700 break; 1525 1701 case MakeRoomView(kWSC61West, kWest): 1526 1702 setCurrentActivation(kActivationW61MessagesOff); 1703 if (g_arthurChip) 1704 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBB00", kArthurWSCZoomedToSinclairMessages); 1527 1705 break; 1528 1706 case MakeRoomView(kWSC61South, kSouth): 1529 1707 setCurrentActivation(kActivationW61SouthOff); … … void WSC::arriveAt(const RoomID room, const DirectionConstant dir) { 1531 1709 case MakeRoomView(kWSC62, kSouth): 1532 1710 if (!GameState.getWSCDidPlasmaDodge()) { 1533 1711 g_AIArea->lockAIOut(); 1534 loadLoopSound1("Sounds/World Science Center/Plasma Rock.22K.AIFF"); 1712 1713 if (_vm->isDVD()) 1714 loadLoopSound1("Sounds/World Science Center/Plasma Rock.44K.16.AIFF"); 1715 else 1716 loadLoopSound1("Sounds/World Science Center/Plasma Rock.22K.AIFF"); 1717 1535 1718 requestExtraSequence(kW62SouthPlasmaRobotAppears, 0, kFilterNoInput); 1536 1719 requestExtraSequence(kW62ZoomToRobot, 0, kFilterNoInput); 1537 1720 requestExtraSequence(kW62ZoomOutFromRobot, kExtraCompletedFlag, kFilterNoInput); 1538 1721 } 1539 1722 break; 1723 case MakeRoomView(kWSC64, kSouth): 1724 if (g_arthurChip) 1725 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBB06", kArthurWSCEnteredAuditorium); 1726 break; 1540 1727 case MakeRoomView(kWSC65Screen, kSouth): 1541 1728 if (!GameState.getWSCSeenSinclairLecture()) { 1542 1729 GameState.setWSCSeenSinclairLecture(true); … … void WSC::arriveAt(const RoomID room, const DirectionConstant dir) { 1562 1749 if (getCurrentAlternate() == kAltWSCW0ZDoorOpen) 1563 1750 turnLeft(); 1564 1751 break; 1752 case MakeRoomView(kWSC82, kSouth): 1753 case MakeRoomView(kWSC82, kEast): 1754 if (g_arthurChip) 1755 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBB05", kArthurWSCEnteredPassage); 1756 break; 1757 case MakeRoomView(kWSC90, kEast): 1758 case MakeRoomView(kWSC91, kEast): 1759 if (g_arthurChip) 1760 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA90", kArthurWSCInPassage); 1761 break; 1565 1762 case MakeRoomView(kWSC93, kEast): 1566 1763 GameState.setWSCBeenAtWSC93(true); 1764 case MakeRoomView(kWSC93, kNorth): 1765 if (g_arthurChip) 1766 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA38", kArthurWSCExitedPassage); 1767 break; 1768 case MakeRoomView(kWSC95, kWest): 1769 if (g_arthurChip) 1770 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA92", kArthurWSCSawCatwalkDoor); 1567 1771 break; 1568 1772 case MakeRoomView(kWSC98, kWest): 1569 1773 if (!GameState.getWSCRobotDead()) { 1774 if (_vm->isDVD()) { 1775 _welcomeSound.initFromAIFFFile("Sounds/World Science Center/Welcome Enrique.22K.AIFF"); 1776 _welcomeSound.setVolume(_vm->getSoundFXLevel()); 1777 _welcomeSound.playSound(); 1778 } 1570 1779 scheduleEvent(kGawkAtRobotTime2, 1, kTimerEventPlayerGawkingAtRobot2); 1571 1780 setCurrentActivation(kActivationRobotTurning); 1572 1781 if (g_AIArea) … … void WSC::turnTo(const DirectionConstant direction) { 1609 1818 if (GameState.getWSCDesignedAntidote() && !GameState.getWSCPickedUpAntidote()) 1610 1819 setCurrentActivation(kActivationReadyForSynthesis); 1611 1820 break; 1821 case MakeRoomView(kWSC06, kNorth): 1822 if (g_arthurChip) 1823 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA81", kArthurWSCAtOppositeDoor); 1824 break; 1612 1825 case MakeRoomView(kWSC07, kSouth): 1613 1826 case MakeRoomView(kWSC56, kNorth): 1614 1827 setCurrentActivation(kActivationReadyForMap); … … void WSC::turnTo(const DirectionConstant direction) { 1631 1844 case MakeRoomView(kWSC42, kEast): 1632 1845 _privateFlags.setFlag(kWSCPrivateSinclairOfficeOpenFlag, false); 1633 1846 setCurrentActivation(kActivationSinclairOfficeLocked); 1847 if (GameState.getCurrentRoom() == kWSC42 && g_arthurChip) { 1848 if (GameState.isTakenItemID(kSinclairKey)) 1849 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA99", kArthurWSCSawSinclairDoor); 1850 else 1851 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA92", kArthurWSCSawSinclairDoorNoKey); 1852 } 1634 1853 break; 1635 1854 case MakeRoomView(kWSC58, kSouth): 1636 1855 setCurrentActivation(kActivationW58SouthDoorLocked); 1637 1856 _privateFlags.setFlag(kWSCPrivate58SouthOpenFlag, false); 1638 1857 break; 1858 case MakeRoomView(kWSC64, kSouth): 1859 if (g_arthurChip) 1860 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBB06", kArthurWSCEnteredAuditorium); 1861 break; 1639 1862 case MakeRoomView(kWSC73, kWest): 1640 1863 setCurrentAlternate(kAltWSCNormal); 1641 1864 break; … … void WSC::turnTo(const DirectionConstant direction) { 1643 1866 if (getCurrentAlternate() == kAltWSCW0ZDoorOpen) 1644 1867 startExtraSequence(kW0ZSpottedByWomen, kExtraCompletedFlag, kFilterNoInput); 1645 1868 break; 1869 case MakeRoomView(kWSC82, kSouth): 1870 case MakeRoomView(kWSC82, kEast): 1871 if (g_arthurChip) 1872 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBB05", kArthurWSCEnteredPassage); 1873 break; 1874 case MakeRoomView(kWSC95, kWest): 1875 if (g_arthurChip) 1876 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA92", kArthurWSCSawCatwalkDoor); 1877 break; 1646 1878 } 1647 1879 1648 1880 checkPeopleCrossing(); … … void WSC::receiveNotification(Notification *notification, const NotificationFlag 1664 1896 setCurrentActivation(kActivationShotByRobot); 1665 1897 GameState.setWSCPoisoned(true); 1666 1898 setUpPoison(); 1899 loadAmbientLoops(); 1667 1900 makeContinuePoint(); 1668 1901 break; 1669 1902 case kWSCDartScan2: … … void WSC::receiveNotification(Notification *notification, const NotificationFlag 1671 1904 GameState.setScoringRemovedDart(); 1672 1905 GameState.setWSCRemovedDart(true); 1673 1906 setUpPoison(); 1674 g_AIArea->playAIMovie(kRightAreaSignature, "Images/AI/WSC/XW1WB2", false, kHintInterruption); 1675 // Fall through... 1676 case kWSCDartScanNo: 1907 if (g_AIArea->isChattyAI()) 1908 g_AIArea->playAIMovie(kRightAreaSignature, "Images/AI/WSC/XW1WB2", false, kHintInterruption); 1677 1909 GameState.setWSCAnsweredAboutDart(true); 1678 1910 startExtraSequence(kWSCDartScan3, kExtraCompletedFlag, kFilterNoInput); 1679 1911 break; 1680 1912 case kWSCDartScan3: 1681 1913 setCurrentActivation(kActivateHotSpotAlways); 1914 if (g_arthurChip) 1915 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBB02", kArthurWSCRemovedDart); 1916 break; 1917 case kWSCDartScanNo: 1918 die(kDeathDidntStopPoison); 1682 1919 break; 1683 1920 case kWSCAnalyzerPowerUp: 1684 1921 case kWSCAnalyzerPowerUpWithDart: … … void WSC::receiveNotification(Notification *notification, const NotificationFlag 1712 1949 break; 1713 1950 case kWSC02TurnOnMorphScreen: 1714 1951 setCurrentActivation(kActivationReadyForMorph); 1952 if (g_arthurChip) 1953 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA29", kArthurWSCLookAtMorphExperiment); 1715 1954 break; 1716 1955 case kWSC02DropToMorphExperiment: 1717 1956 loopExtraSequence(kWSC02MorphLoop, kExtraCompletedFlag); 1718 1957 setCurrentActivation(kActivationMorphLooping); 1958 if (g_arthurChip) { 1959 if (_vm->getRandomBit()) 1960 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA97", kArthurWSCStartMorphExperiment); 1961 else 1962 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBB04", kArthurWSCStartMorphExperiment); 1963 } 1719 1964 break; 1720 1965 case kWSC02MorphLoop: 1721 1966 if (_privateFlags.getFlag(kWSCPrivateInterruptedMorphFlag)) … … void WSC::receiveNotification(Notification *notification, const NotificationFlag 1730 1975 case kWSC02TurnOffMorphScreen: 1731 1976 setCurrentActivation(kActivationMorphScreenOff); 1732 1977 GameState.setWSCSawMorph(true); 1978 if (!(GameState.isTakenItemID(kSinclairKey) && GameState.isTakenItemID(kArgonCanister)) && g_arthurChip) 1979 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA96", kArthurWSCSawMorphExperiment); 1733 1980 break; 1734 1981 case kW03NorthActivate: 1735 1982 if (GameState.getWSCAnalyzedDart() && !GameState.getWSCDesignedAntidote()) … … void WSC::receiveNotification(Notification *notification, const NotificationFlag 1755 2002 _privateFlags.setFlag(kWSCPrivateInMoleculeGameFlag, false); 1756 2003 GameState.setWSCDesignedAntidote(true); 1757 2004 GameState.setScoringBuiltAntidote(); 2005 if (g_arthurChip) 2006 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA02", kArthurWSCDesignedAntidote); 1758 2007 break; 1759 2008 case kW03SouthCreateAntidote: 1760 2009 setCurrentActivation(kActivationSynthesizerLooping); … … void WSC::receiveNotification(Notification *notification, const NotificationFlag 1767 2016 case kWSC56SouthMap: 1768 2017 setCurrentActivation(kActivateHotSpotAlways); 1769 2018 GameState.setScoringSawWSCDirectory(); 2019 if (g_arthurChip) 2020 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA33", kArthurWSCReadyForMap); 1770 2021 break; 1771 2022 case kNerdAtTheDoor1: 1772 2023 GameState.setWSCSeenNerd(true); 2024 if (g_arthurChip) 2025 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA28", kArthurWSCSeenNerd); 1773 2026 break; 1774 2027 case kNerdAtTheDoor2: 1775 2028 die(kDeathArrestedInWSC); … … void WSC::receiveNotification(Notification *notification, const NotificationFlag 1790 2043 case kW61SouthTimeBendingNoGun: 1791 2044 GameState.setScoringSawSinclairEntry3(); 1792 2045 break; 2046 case kImplantWithGun: 2047 case kImplantNoGun: 2048 case kEasterEggWalchek: 2049 _extraMovie.stopDisplaying(); 2050 _extraMovie.releaseMovie(); 2051 _navMovie.startDisplaying(); 2052 break; 1793 2053 case kW61MessagesOn: 1794 2054 GameState.setWSCOfficeMessagesOpen(true); 1795 2055 setCurrentActivation(kActivationW61MessagesOn); … … void WSC::receiveNotification(Notification *notification, const NotificationFlag 1806 2066 case kW61SouthScreenOnNoGun: 1807 2067 _privateFlags.setFlag(kWSCPrivateOfficeLogOpenFlag, true); 1808 2068 setCurrentActivation(kActivationW61SouthOn); 2069 if (g_arthurChip) 2070 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA89", kArthurWSCActivatedComputer); 1809 2071 break; 1810 2072 case kW61SouthScreenOffWithGun: 1811 2073 case kW61SouthScreenOffNoGun: … … void WSC::receiveNotification(Notification *notification, const NotificationFlag 1819 2081 case kW62ZoomOutFromRobot: 1820 2082 // Handle action queue before starting new movie sequences. 1821 2083 Neighborhood::receiveNotification(notification, flags); 1822 _energyDrainRate = g_energyMonitor->getEnergyDrainRate();1823 2084 g_energyMonitor->setEnergyDrainRate(0); 1824 2085 currentEnergy = g_energyMonitor->getCurrentEnergy(); 1825 2086 _vm->setEnergyDeathReason(kDeathHitByPlasma); … … void WSC::receiveNotification(Notification *notification, const NotificationFlag 1847 2108 g_energyMonitor->drainEnergy(kPlasmaEnergyNoShield); 1848 2109 } 1849 2110 1850 g_energyMonitor->setEnergyDrainRate(_energyDrainRate);2111 setUpPoison(); 1851 2112 g_AIArea->unlockAI(); 1852 2113 GameState.setScoringFinishedPlasmaDodge(); 1853 2114 GameState.setWSCDidPlasmaDodge(true); 1854 2115 restoreStriding(kWSC58, kSouth, kAltWSCNormal); 1855 2116 loadAmbientLoops(); 2117 if (g_arthurChip) { 2118 if (_vm->getRandomBit()) 2119 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA11", kArthurWSCDidPlasmaDodge); 2120 else 2121 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBB07", kArthurWSCDidPlasmaDodge); 2122 } 2123 break; 2124 case kW65SouthSinclairLecture: 2125 if (g_arthurChip) 2126 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBB29", kArthurWSCSawSinclairLecture); 1856 2127 break; 1857 2128 case kW0ZSpottedByWomen: 1858 2129 die(kDeathArrestedInWSC); … … void WSC::receiveNotification(Notification *notification, const NotificationFlag 1916 2187 GameState.setWSCRobotDead(true); 1917 2188 GameState.setScoringStoppedWSCRobot(); 1918 2189 1919 // Video is not present 1920 //g_AIArea->playAIMovie(kRightAreaSignature, "Images/AI/WSC/XN59WD", false, kWarningInterruption); 2190 // Video is erroneously not present in the CD version 2191 if (_vm->isDVD() && g_AIArea->isChattyAI()) 2192 g_AIArea->playAIMovie(kRightAreaSignature, "Images/AI/WSC/XN59WD", false, kWarningInterruption); 1921 2193 break; 1922 2194 case kW98RobotGassed: 1923 2195 item = (Item *)_vm->getAllItems().findItemByID(kArgonCanister); … … void WSC::receiveNotification(Notification *notification, const NotificationFlag 1926 2198 GameState.setWSCRobotDead(true); 1927 2199 GameState.setScoringStoppedWSCRobot(); 1928 2200 1929 // Video is not present 1930 //g_AIArea->playAIMovie(kRightAreaSignature, "Images/AI/WSC/XN59WD", false, kWarningInterruption); 2201 // Video is erroneously not present in the CD version 2202 if (_vm->isDVD() && g_AIArea->isChattyAI()) 2203 g_AIArea->playAIMovie(kRightAreaSignature, "Images/AI/WSC/XN59WD", false, kWarningInterruption); 1931 2204 break; 1932 2205 case kW98RobotHeadOpensLight: 1933 2206 case kW98RobotHeadOpensDark: 1934 2207 setCurrentActivation(kActivationWSCRobotHeadOpen); 1935 2208 _privateFlags.setFlag(kWSCPrivateRobotHeadOpenFlag, true); 2209 if (g_arthurChip) { 2210 switch (_vm->getRandomNumber(2)) { 2211 case 0: 2212 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA36", kArthurWSCRobotHeadOpen); 2213 break; 2214 case 1: 2215 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA37", kArthurWSCRobotHeadOpen); 2216 break; 2217 case 2: 2218 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA40", kArthurWSCRobotHeadOpen); 2219 break; 2220 } 2221 } 1936 2222 break; 1937 2223 case kW98RobotHeadClosesDark: 1938 2224 case kW98RobotHeadClosesLight: 1939 2225 setCurrentActivation(kActivationRobotGone); 1940 2226 _privateFlags.setFlag(kWSCPrivateRobotHeadOpenFlag, false); 1941 2227 GameState.setWSCRobotGone(true); 2228 if (GameState.isTakenItemID(kStunGun)) { 2229 GameState.setWSCFinished(true); 2230 2231 if (!GameState.getWSCCatwalkDark()) 2232 GameState.setScoringWSCGandhi(); 2233 2234 recallToTSASuccess(); 2235 } 1942 2236 break; 1943 2237 } 2238 if ((_lastExtra == kW61WalchekEasterEgg1 || _lastExtra == kEasterEggWalchek) && g_arthurChip) 2239 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA09", kArthurWSCPlayedEasterEggMessage); 1944 2240 } 1945 2241 1946 2242 Neighborhood::receiveNotification(notification, flags); … … void WSC::startMoleculeGameLevel() { 2007 2303 } 2008 2304 2009 2305 _moleculesMovie.start(); 2306 if (_moleculeGameLevel == 3 && g_arthurChip) 2307 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA90", kArthurWSCPoisonedDuringGame); 2010 2308 } 2011 2309 2012 2310 void WSC::moleculeGameClick(const HotSpotID id) { … … void WSC::moleculeGameClick(const HotSpotID id) { 2083 2381 2084 2382 _moleculesMovie.stop(); 2085 2383 startMoleculeGameLevel(); 2384 if (g_arthurChip) 2385 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBB38", kArthurWSCFailedMolecule); 2086 2386 } 2087 2387 } 2088 2388 … … void WSC::activateOneHotspot(HotspotInfoTable::Entry &entry, Hotspot *hotspot) { 2126 2426 } 2127 2427 2128 2428 void WSC::activateHotspots() { 2429 Input input; 2430 2129 2431 Neighborhood::activateHotspots(); 2130 2432 2131 if (GameState.getCurrentRoomAndView() == MakeRoomView(kWSC98, kWest) && _privateFlags.getFlag(kWSCPrivateRobotHeadOpenFlag)) { 2132 if (_privateFlags.getFlag(kWSCPrivateGotRetScanChipFlag)) 2133 _vm->getAllHotspots().deactivateOneHotspot(kW98RetinalChipSpotID); 2134 else 2135 _vm->getAllHotspots().activateOneHotspot(kW98RetinalChipSpotID); 2433 switch (GameState.getCurrentRoomAndView()) { 2434 case MakeRoomView(kWSC61South, kSouth): 2435 if (_vm->isDVD()) { 2436 InputDevice.getInput(input, kFilterAllInput); 2437 if (_privateFlags.getFlag(kWSCPrivateOfficeLogOpenFlag) && 2438 JMPPPInput::isEasterEggModifierInput(input)) 2439 _vm->getAllHotspots().activateOneHotspot(kBiotechImplantHotSpotID); 2440 } 2441 break; 2442 case MakeRoomView(kWSC98, kWest): 2443 if (_privateFlags.getFlag(kWSCPrivateRobotHeadOpenFlag)) { 2444 if (_privateFlags.getFlag(kWSCPrivateGotRetScanChipFlag)) 2445 _vm->getAllHotspots().deactivateOneHotspot(kW98RetinalChipSpotID); 2446 else 2447 _vm->getAllHotspots().activateOneHotspot(kW98RetinalChipSpotID); 2136 2448 2137 if (_privateFlags.getFlag(kWSCPrivateGotMapChipFlag))2138 _vm->getAllHotspots().deactivateOneHotspot(kW98MapChipSpotID);2139 else2140 _vm->getAllHotspots().activateOneHotspot(kW98MapChipSpotID);2449 if (_privateFlags.getFlag(kWSCPrivateGotMapChipFlag)) 2450 _vm->getAllHotspots().deactivateOneHotspot(kW98MapChipSpotID); 2451 else 2452 _vm->getAllHotspots().activateOneHotspot(kW98MapChipSpotID); 2141 2453 2142 if (_privateFlags.getFlag(kWSCPrivateGotOpticalChipFlag)) 2143 _vm->getAllHotspots().deactivateOneHotspot(kW98OpticalChipSpotID); 2144 else 2145 _vm->getAllHotspots().activateOneHotspot(kW98OpticalChipSpotID); 2454 if (_privateFlags.getFlag(kWSCPrivateGotOpticalChipFlag)) 2455 _vm->getAllHotspots().deactivateOneHotspot(kW98OpticalChipSpotID); 2456 else 2457 _vm->getAllHotspots().activateOneHotspot(kW98OpticalChipSpotID); 2458 } 2459 break; 2146 2460 } 2147 2461 } 2148 2462 2149 2463 void WSC::clickInHotspot(const Input &input, const Hotspot *clickedSpot) { 2464 Movie movie(kNoDisplayElement); 2465 Input movieInput; 2466 2150 2467 if (JMPPPInput::isEasterEggModifierInput(input)) 2151 2468 GameState.setEasterEgg(true); 2152 2469 … … void WSC::clickInHotspot(const Input &input, const Hotspot *clickedSpot) { 2192 2509 2193 2510 _privateFlags.setFlag(kWSCPrivateClickedCatwalkCableFlag, true); 2194 2511 break; 2512 case kBiotechImplantHotSpotID: 2513 if (GameState.isTakenItemID(kMachineGun)) 2514 startExtraSequence(kImplantNoGun, kExtraCompletedFlag, kFilterNoInput); 2515 else 2516 startExtraSequence(kImplantWithGun, kExtraCompletedFlag, kFilterNoInput); 2517 break; 2518 case kW61WalchekMessageSpotID: 2519 if (_vm->isDVD() && GameState.getEasterEgg() && _vm->getRandomBit()) 2520 startExtraSequence(kEasterEggWalchek, kExtraCompletedFlag, kFilterNoInput); 2521 else 2522 Neighborhood::clickInHotspot(input, clickedSpot); 2523 break; 2195 2524 default: 2196 2525 Neighborhood::clickInHotspot(input, clickedSpot); 2197 2526 break; … … void WSC::pickedUpItem(Item *item) { 2343 2672 _privateFlags.setFlag(kWSCDraggingAntidoteFlag, false); 2344 2673 playSpotSoundSync(kDrinkAntidoteIn, kDrinkAntidoteOut); 2345 2674 setUpPoison(); 2675 loadAmbientLoops(); 2346 2676 2347 2677 if (!GameState.getWSCPickedUpAntidote()) { 2348 2678 GameState.setWSCPickedUpAntidote(true); 2349 2679 startExtraSequence(kW03SouthDeactivate, kExtraCompletedFlag, kFilterNoInput); 2350 2680 } 2351 2681 break; 2682 case kMachineGun: 2683 if (g_arthurChip) { 2684 if (_vm->getRandomBit()) 2685 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBB01", kArthurWSCGotMachineGun); 2686 else 2687 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBB09", kArthurWSCGotMachineGun); 2688 } 2689 break; 2352 2690 case kArgonPickup: 2353 2691 _vm->removeItemFromInventory((InventoryItem *)item); 2354 2692 item = (Item *)_vm->getAllItems().findItemByID(kArgonCanister); -
engines/pegasus/neighborhood/wsc/wsc.h
diff --git a/engines/pegasus/neighborhood/wsc/wsc.h b/engines/pegasus/neighborhood/wsc/wsc.h index d9634b3..8685115 100644
a b static const RoomID kWSC62 = 62; 42 42 class WSC : public Neighborhood { 43 43 public: 44 44 WSC(InputHandler *, PegasusEngine *); 45 virtual ~WSC() {}45 virtual ~WSC(); 46 46 47 47 void flushGameState(); 48 48 … … protected: 126 126 void pickedUpItem(Item *); 127 127 void doorOpened(); 128 128 void startExtraSequence(const ExtraID, const NotificationFlags, const InputBits); 129 void startDoorOpenMovie(const TimeValue, const TimeValue); 129 130 void getExtraEntry(const uint32, ExtraTable::Entry &); 130 131 void takeItemFromRoom(Item *item); 131 132 void checkPeopleCrossing(); … … protected: 137 138 void getExitCompassMove(const ExitTable::Entry &exitEntry, FaderMoveSpec &compassMove); 138 139 void getExtraCompassMove(const ExtraTable::Entry &entry, FaderMoveSpec &compassMove); 139 140 void bumpIntoWall(); 141 void spotCompleted(); 140 142 void activateHotspots(); 141 143 void setUpAIRules(); 142 144 Common::String getBriefingMovie(); … … protected: 153 155 154 156 FlagsArray<byte, kNumWSCPrivateFlags> _privateFlags; 155 157 const Hotspot *_cachedZoomSpot; 158 Hotspot _biotechImplantSpot; 159 Movie _extraMovie; 160 NotificationCallBack _extraMovieCallBack; 156 161 MoleculeBin _moleculeBin; 157 162 int32 _moleculeGameLevel, _numCorrect; 158 163 Movie _moleculesMovie; 159 164 uint32 _levelArray[6]; 160 Common::Rational _energyDrainRate;161 165 Sprite *_argonSprite; 166 Sound _welcomeSound; 162 167 }; 163 168 164 169 } // End of namespace Pegasus -
engines/pegasus/pegasus.cpp
diff --git a/engines/pegasus/pegasus.cpp b/engines/pegasus/pegasus.cpp index c5edd34..e50dd7e 100644
a b 23 23 * 24 24 */ 25 25 26 #ifdef MACOSX 27 #define FORBIDDEN_SYMBOL_ALLOW_ALL 28 #endif 29 26 30 #include "common/config-manager.h" 27 31 #include "common/error.h" 28 32 #include "common/events.h" … … 52 56 #include "pegasus/ai/ai_area.h" 53 57 #include "pegasus/items/itemlist.h" 54 58 #include "pegasus/items/biochips/aichip.h" 59 #include "pegasus/items/biochips/arthurchip.h" 55 60 #include "pegasus/items/biochips/biochipitem.h" 56 61 #include "pegasus/items/biochips/mapchip.h" 57 62 #include "pegasus/items/biochips/opticalchip.h" … … 73 78 #include "pegasus/neighborhood/tsa/tinytsa.h" 74 79 #include "pegasus/neighborhood/wsc/wsc.h" 75 80 81 #ifdef MACOSX 82 #include <CoreServices/CoreServices.h> 83 #endif 84 76 85 namespace Pegasus { 77 86 78 87 PegasusEngine::PegasusEngine(OSystem *syst, const PegasusGameDescription *gamedesc) : Engine(syst), InputHandler(0), _gameDescription(gamedesc), … … PegasusEngine::PegasusEngine(OSystem *syst, const PegasusGameDescription *gamede 93 102 _idlerHead = 0; 94 103 _currentCD = 1; 95 104 _introTimer = 0; 105 _toggleRequested = false; 96 106 _aiSaveStream = 0; 107 _heardOverviewVoice = false; 97 108 } 98 109 99 110 PegasusEngine::~PegasusEngine() { … … void PegasusEngine::createItems() { 261 272 void PegasusEngine::createItem(ItemID itemID, NeighborhoodID neighborhoodID, RoomID roomID, DirectionConstant direction) { 262 273 switch (itemID) { 263 274 case kInterfaceBiochip: 264 // Unused in game, but still in the data and we need to create 265 // it because it's saved/loaded from save files. 266 new BiochipItem(itemID, neighborhoodID, roomID, direction); 275 if (isDVD()) { 276 new ArthurChip(itemID, neighborhoodID, roomID, direction); 277 } else { 278 // Unused in game, but still in the data and we need to create 279 // it because it's saved/loaded from save files. 280 new BiochipItem(itemID, neighborhoodID, roomID, direction); 281 } 267 282 break; 268 283 case kAIBiochip: 269 284 new AIChip(itemID, neighborhoodID, roomID, direction); … … void PegasusEngine::runIntro() { 332 347 if (shouldQuit() || skipped) 333 348 return; 334 349 350 #ifdef USE_THEORADEC 351 if (isDVD() && Common::File::exists(_introDirectory + "/BigMovie_hq.ogg")) { 352 Video::TheoraDecoder hqVideo(Audio::Mixer::kPlainSoundType); 353 354 if (hqVideo.loadFile(_introDirectory + "/BigMovie_hq.ogg")) { 355 hqVideo.start(); 356 playMovieScaled(&hqVideo, 0, 0); 357 return; 358 } 359 } 360 #endif 361 335 362 video = new Video::QuickTimeDecoder(); 336 363 337 364 if (!video->loadFile(_introDirectory + "/Big Movie.movie")) 338 error("Could not load intro movie"); 365 if (!video->loadFile(_introDirectory + "/BigMovie.movie")) 366 error("Could not load intro movie"); 339 367 340 368 video->seek(Audio::Timestamp(0, 10 * 600, 600)); 341 369 video->start(); … … bool PegasusEngine::loadFromStream(Common::SeekableReadStream *stream) { 553 581 } 554 582 } 555 583 584 if (isDVD()) { 585 Arthur.resetArthurState(); 586 _screenDimmer.hide(); 587 _screenDimmer.stopDisplaying(); 588 } 556 589 startNeighborhood(); 590 if (g_arthurChip) 591 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBB24", kArthurLoadedSavedGame); 557 592 558 593 // Make a new continue point if this isn't already one 559 594 if (saveType == kNormalSave) … … Common::Error PegasusEngine::saveGameState(int slot, const Common::String &desc) 716 751 bool valid = writeToStream(saveFile, kNormalSave); 717 752 delete saveFile; 718 753 754 #ifdef MACOSX 755 // HACK HACK HACK HACK: Beyond horrible hack 756 // clone2727 just died on the inside 757 if (!valid) 758 return Common::kUnknownError; 759 760 Common::String savePath = ConfMan.get("savepath"); 761 Common::String filePath = savePath + "/" + output; 762 763 FSCatalogInfo catInfo; 764 FSRef ref; 765 766 if (!FSPathMakeRef((const UInt8 *)filePath.c_str(), &ref, false)) { 767 FSGetCatalogInfo(&ref, kFSCatInfoFinderInfo, &catInfo, 0, 0, 0); 768 FileInfo *info = (FileInfo *)catInfo.finderInfo; 769 info->fileCreator = kPegasusPrimeCreator; 770 info->fileType = kPegasusPrimeDisk1GameType + _currentCD - 1; 771 FSSetCatalogInfo(&ref, kFSCatInfoFinderInfo, &catInfo); 772 } 773 #endif 774 719 775 return valid ? Common::kNoError : Common::kUnknownError; 720 776 } 721 777 … … void PegasusEngine::introTimerExpired() { 788 844 789 845 bool skipped = false; 790 846 791 Video::VideoDecoder *video = new Video::QuickTimeDecoder(); 792 if (!video->loadFile(_introDirectory + "/LilMovie.movie")) 793 error("Failed to load little movie"); 847 Video::VideoDecoder *video = 0; 848 849 #ifdef USE_THEORADEC 850 if (isDVD()) { 851 video = new Video::TheoraDecoder(); 852 853 if (!video->loadFile(_introDirectory + "/LilMovie_hq.ogg")) { 854 delete video; 855 video = 0; 856 } 857 } 858 #endif 859 860 if (!video) { 861 video = new Video::QuickTimeDecoder(); 862 if (!video->loadFile(_introDirectory + "/LilMovie.movie")) 863 error("Failed to load little movie"); 864 } 794 865 795 866 bool saveAllowed = swapSaveAllowed(false); 796 867 bool openAllowed = swapLoadAllowed(false); … … void PegasusEngine::doGameMenuCommand(const GameMenuCommand command) { 885 956 _gfx->doFadeOutSync(); 886 957 useMenu(new CreditsMenu()); 887 958 _gfx->updateDisplay(); 959 ((CreditsMenu *)_gameMenu)->startCreditsMenuLoop(); 888 960 _gfx->doFadeInSync(); 889 961 } 890 962 break; … … void PegasusEngine::doGameMenuCommand(const GameMenuCommand command) { 929 1001 _gfx->updateDisplay(); 930 1002 _gfx->doFadeInSync(); 931 1003 } else { 1004 Input input; 1005 if (isDVD()) { 1006 InputDevice.getInput(input, kFilterAllInput); 1007 if (JMPPPInput::isEasterEggModifierInput(input)) 1008 GameState.setEasterEgg(true); 1009 } 1010 932 1011 _gfx->doFadeOutSync(); 933 1012 useMenu(0); 934 1013 _gfx->clearScreen(); 935 1014 _gfx->updateDisplay(); 936 1015 937 Video::VideoDecoder *video = new Video::QuickTimeDecoder(); 938 if (!video->loadFile(_introDirectory + "/Closing.movie")) 939 error("Could not load closing movie"); 1016 Video::VideoDecoder *video = 0; 1017 if (GameState.getEasterEgg()) { 1018 #ifdef USE_THEORADEC 1019 video = new Video::TheoraDecoder(); 1020 if (!video->loadFile(_introDirectory + "/Closing_hq2.ogg")) { 1021 delete video; 1022 video = 0; 1023 } 1024 #endif 1025 if (!video) { 1026 video = new Video::QuickTimeDecoder(); 1027 if (!video->loadFile(_introDirectory + "/Closing2.movie")) 1028 error("Could not load alternate closing movie"); 1029 } 1030 } else { 1031 #ifdef USE_THEORADEC 1032 video = new Video::TheoraDecoder(); 1033 if (!video->loadFile(_introDirectory + "/Closing_hq1.ogg")) { 1034 delete video; 1035 video = 0; 1036 } 1037 #endif 1038 if (!video) { 1039 video = new Video::QuickTimeDecoder(); 1040 if (!video->loadFile(_introDirectory + "/Closing.movie")) 1041 error("Could not load closing movie"); 1042 } 1043 } 940 1044 941 uint16 x = (640 - video->getWidth() * 2) / 2; 942 uint16 y = (480 - video->getHeight() * 2) / 2; 1045 uint16 newHeight = (uint16)((640.0f / (float)video->getWidth()) * (float)video->getHeight()); 1046 uint16 x = 0; 1047 uint16 y = (480 - newHeight) / 2; 943 1048 944 1049 video->start(); 945 playMovieScaled(video, x, y);1050 bool interrupted = playMovieScaled(video, x, y); 946 1051 947 1052 delete video; 948 1053 1054 if (isDVD() && !interrupted) { 1055 // Display new post credits movie 1056 #ifdef USE_THEORADEC 1057 video = new Video::TheoraDecoder(); 1058 if (!video->loadFile(_introDirectory + "/Closing_hq3.ogg")) { 1059 delete video; 1060 video = 0; 1061 } 1062 #endif 1063 if (!video) { 1064 video = new Video::QuickTimeDecoder(); 1065 if (!video->loadFile(_introDirectory + "/Closing3.movie")) 1066 error("Could not load closing 3 movie"); 1067 } 1068 1069 video->start(); 1070 interrupted = playMovieScaled(video, 0, 0); 1071 delete video; 1072 } 1073 949 1074 if (shouldQuit()) 950 1075 return; 951 1076 952 useMenu(new MainMenu()); 953 _gfx->updateDisplay(); 954 ((MainMenu *)_gameMenu)->startMainMenuLoop(); 955 _gfx->doFadeInSync(); 956 resetIntroTimer(); 1077 if (isDVD()) { 1078 useMenu(new CreditsMenu()); 1079 _gfx->updateDisplay(); 1080 ((CreditsMenu *)_gameMenu)->startCreditsMenuLoop(); 1081 if (!interrupted) 1082 _gfx->doFadeInSync(); 1083 else 1084 _gfx->enableUpdates(); 1085 } else { 1086 useMenu(new MainMenu()); 1087 _gfx->updateDisplay(); 1088 ((MainMenu *)_gameMenu)->startMainMenuLoop(); 1089 if (!interrupted) 1090 _gfx->doFadeInSync(); 1091 else 1092 _gfx->enableUpdates(); 1093 resetIntroTimer(); 1094 } 1095 GameState.setEasterEgg(false); 957 1096 } 958 1097 } else { 959 1098 loadFromContinuePoint(); … … void PegasusEngine::doInterfaceOverview() { 1081 1220 Common::Rect(542, 36, 542 + 58, 36 + 20) 1082 1221 }; 1083 1222 1223 static const Common::Rect hiddenSpot = Common::Rect(595, 417, 595 + 4, 417 + 5); 1224 1084 1225 _gfx->doFadeOutSync(); 1085 1226 useMenu(0); 1086 1227 … … void PegasusEngine::doInterfaceOverview() { 1119 1260 controllerHighlight.startDisplaying(); 1120 1261 1121 1262 Movie overviewText(kNoDisplayElement); 1122 overviewText.initFromMovieFile("Images/Interface/Overview Mac.movie"); 1263 1264 if (isDVD()) { 1265 if (isLinux() && Common::File::exists("Images/Interface/Overview Linux.movie")) 1266 overviewText.initFromMovieFile("Images/Interface/Overview Linux.movie"); 1267 else if (isLinux() || isWindows()) 1268 overviewText.initFromMovieFile("Images/Interface/Overview PC.movie"); 1269 else 1270 overviewText.initFromMovieFile("Images/Interface/Overview ScummVM.movie"); 1271 } else { 1272 overviewText.initFromMovieFile("Images/Interface/Overview Mac.movie"); 1273 } 1274 1123 1275 overviewText.setDisplayOrder(0); 1124 1276 overviewText.moveElementTo(kNavAreaLeft, kNavAreaTop); 1125 1277 overviewText.startDisplaying(); … … void PegasusEngine::doInterfaceOverview() { 1155 1307 if (time == 2) { 1156 1308 highlight.hide(); 1157 1309 controllerHighlight.show(); 1310 1311 // Hidden message in the DVD version 1312 if (isDVD() && hiddenSpot.contains(cursorLoc)) 1313 time = 12; 1158 1314 } else if (i != kNumOverviewSpots) { 1159 1315 controllerHighlight.hide(); 1160 1316 Common::Rect r = overviewSpots[i]; … … void PegasusEngine::doInterfaceOverview() { 1175 1331 _gfx->updateDisplay(); 1176 1332 _gfx->doFadeInSync(); 1177 1333 1334 Sound overviewVoice, overviewMusic; 1335 SoundFader overviewMusicFader; 1336 1337 // In the DVD version, play the voice and some background sound 1338 if (isDVD()) { 1339 if (!_heardOverviewVoice) { 1340 _heardOverviewVoice = true; 1341 overviewVoice.initFromAIFFFile("Sounds/Overview.aiff"); 1342 overviewVoice.playSound(); 1343 } 1344 1345 overviewMusic.attachFader(&overviewMusicFader); 1346 overviewMusic.initFromAIFFFile("Sounds/TSA/T01NAE.NEW.32K.AIFF"); 1347 overviewMusic.loopSound(); 1348 1349 FaderMoveSpec spec; 1350 spec.makeTwoKnotFaderSpec(30, 0, 0, 30, 255); 1351 overviewMusicFader.startFaderSync(spec); 1352 } 1353 1178 1354 for (;;) { 1179 1355 InputDevice.getInput(input, kFilterAllInput); 1180 1356 … … void PegasusEngine::doInterfaceOverview() { 1196 1372 if (time == 2) { 1197 1373 highlight.hide(); 1198 1374 controllerHighlight.show(); 1375 1376 // Hidden message in the DVD version 1377 if (isDVD() && hiddenSpot.contains(cursorLoc)) 1378 time = 12; 1199 1379 } else if (i != kNumOverviewSpots) { 1200 1380 controllerHighlight.hide(); 1201 1381 Common::Rect r = overviewSpots[i]; … … void PegasusEngine::doInterfaceOverview() { 1224 1404 highlight.hide(); 1225 1405 _cursor->hide(); 1226 1406 1407 // Make sure we cut off the music and sound 1408 overviewVoice.stopSound(); 1409 1410 if (overviewMusic.isPlaying()) { 1411 FaderMoveSpec spec; 1412 spec.makeTwoKnotFaderSpec(30, 0, 255, 30, 0); 1413 overviewMusicFader.startFaderSync(spec); 1414 overviewMusic.stopSound(); 1415 } 1416 1227 1417 _gfx->doFadeOutSync(); 1228 1418 useMenu(new MainMenu()); 1229 1419 _gfx->updateDisplay(); … … void PegasusEngine::checkFlashlight() { 1389 1579 bool PegasusEngine::playMovieScaled(Video::VideoDecoder *video, uint16 x, uint16 y) { 1390 1580 bool skipped = false; 1391 1581 1582 assert(video->isPlaying()); 1583 1392 1584 while (!shouldQuit() && !video->endOfVideo() && !skipped) { 1393 1585 if (video->needsUpdate()) { 1394 1586 const Graphics::Surface *frame = video->decodeNextFrame(); … … void PegasusEngine::doDeath() { 1442 1634 useMenu(new DeathMenu(_deathReason)); 1443 1635 _gfx->updateDisplay(); 1444 1636 _gfx->doFadeInSync(); 1637 _deathReason = kDeathStranded; 1445 1638 } 1446 1639 1447 1640 void PegasusEngine::throwAwayEverything() { … … InputBits PegasusEngine::getInputFilter() { 1472 1665 } 1473 1666 1474 1667 void PegasusEngine::processShell() { 1475 checkCallBacks();1476 1668 checkNotifications(); 1477 1669 InputHandler::pollForInput(); 1670 checkCallBacks(); 1478 1671 refreshDisplay(); 1479 1672 } 1480 1673 … … void PegasusEngine::startNewGame() { 1633 1826 bool isWalkthrough = GameState.getWalkthroughMode(); 1634 1827 GameState.resetGameState(); 1635 1828 GameState.setWalkthroughMode(isWalkthrough); 1829 if (isDVD()) 1830 Arthur.resetArthurState(); 1636 1831 1637 1832 // TODO: Enable erase 1638 1833 _gfx->doFadeOutSync(); … … void PegasusEngine::dragTerminated(const Input &) { 1911 2106 delete _draggingSprite; 1912 2107 } else if (_dragType == kDragInventoryUse) { 1913 2108 if (finalSpot && (finalSpot->getHotspotFlags() & kDropItemSpotFlag) != 0) { 2109 delete _draggingSprite; 1914 2110 // *** Need to decide on a case by case basis what to do here. 1915 2111 // the crowbar should break the cover off the Mars reactor if its frozen, the 1916 2112 // global transport card should slide through the slot, the oxygen mask should 1917 2113 // attach to the filling station, and so on... 1918 2114 _neighborhood->dropItemIntoRoom(_draggingItem, finalSpot); 1919 delete _draggingSprite;1920 2115 } else { 1921 2116 autoDragItemIntoInventory(_draggingItem, _draggingSprite); 1922 2117 } … … void PegasusEngine::autoDragItemIntoRoom(Item *item, Sprite *draggingSprite) { 2164 2359 _system->delayMillis(10); 2165 2360 } 2166 2361 2362 delete _draggingSprite; 2167 2363 _neighborhood->dropItemIntoRoom(_draggingItem, dropSpot); 2168 2364 allowInput(true); 2169 delete _draggingSprite;2170 2365 2171 2366 if (g_AIArea) 2172 2367 g_AIArea->unlockAI(); … … void PegasusEngine::autoDragItemIntoInventory(Item *, Sprite *draggingSprite) { 2197 2392 _system->delayMillis(10); 2198 2393 } 2199 2394 2395 delete _draggingSprite; 2200 2396 addItemToInventory((InventoryItem *)_draggingItem); 2201 2397 allowInput(true); 2202 delete _draggingSprite;2203 2398 2204 2399 if (g_AIArea) 2205 2400 g_AIArea->unlockAI(); … … void PegasusEngine::doSubChase() { 2264 2459 if (video->needsUpdate()) { 2265 2460 const Graphics::Surface *frame = video->decodeNextFrame(); 2266 2461 2267 if (frame) 2268 drawScaledFrame(frame, 0, 0); 2462 if (frame) { 2463 if (frame->w <= 320 && frame->h <= 240) { 2464 drawScaledFrame(frame, 0, 0); 2465 } else { 2466 _system->copyRectToScreen((const byte *)frame->getPixels(), frame->pitch, 0, 0, frame->w, frame->h); 2467 _system->updateScreen(); 2468 } 2469 } 2269 2470 } 2270 2471 2271 2472 Common::Event event; … … void PegasusEngine::destroyInventoryItem(const ItemID itemID) { 2367 2568 g_interface->setCurrentInventoryItemID(itemID); 2368 2569 g_AIArea->playAIAreaSequence(kInventorySignature, kMiddleAreaSignature, entry.extraStart, entry.extraStop); 2369 2570 removeItemFromInventory(item); 2571 if (g_arthurChip) 2572 g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA26", kArthurDestroyedInventoryItem); 2370 2573 } 2371 2574 2372 2575 ItemID PegasusEngine::pickItemToDestroy() { -
engines/pegasus/pegasus.h
diff --git a/engines/pegasus/pegasus.h b/engines/pegasus/pegasus.h index fb66eb7..a0d8322 100644
a b public: 99 99 bool isDVDDemo() const; 100 100 bool isOldDemo() const; 101 101 bool isWindows() const; 102 bool isLinux() const; 102 103 void addIdler(Idler *idler); 103 104 void removeIdler(Idler *idler); 104 105 void addTimeBase(TimeBase *timeBase); … … public: 124 125 int32 getSavedEnergyValue() { return _savedEnergyValue; } 125 126 126 127 // Death 128 Sound &getDeathSound() { return _deathSound; } 127 129 void setEnergyDeathReason(const DeathReason reason) { _deathReason = reason; } 128 130 DeathReason getEnergyDeathReason() { return _deathReason; } 129 131 void resetEnergyDeathReason(); 130 132 void die(const DeathReason); 133 DeathReason getDeathReason() { return _deathReason; } 131 134 void playEndMessage(); 132 135 133 136 // Volume … … public: 169 172 bool canSolve(); 170 173 void prepareForAIHint(const Common::String &); 171 174 void cleanUpAfterAIHint(const Common::String &); 175 void requestToggle(bool request = true) { _toggleRequested = request; } 176 bool toggleRequested() const { return _toggleRequested; } 172 177 Common::SeekableReadStream *_aiSaveStream; 173 178 174 179 // Neighborhood … … private: 280 285 void doInterfaceOverview(); 281 286 ScreenDimmer _screenDimmer; 282 287 void pauseMenu(bool menuUp); 288 bool _heardOverviewVoice; 283 289 284 290 // Energy 285 291 int32 _savedEnergyValue; 286 292 287 293 // Death 288 294 DeathReason _deathReason; 295 Sound _deathSound; 289 296 void doDeath(); 290 297 298 // AI 299 bool _toggleRequested; 300 291 301 // Neighborhood 292 302 Neighborhood *_neighborhood; 293 303 void useNeighborhood(Neighborhood *neighborhood); -
engines/pegasus/timers.cpp
diff --git a/engines/pegasus/timers.cpp b/engines/pegasus/timers.cpp index 5fb2551..e923a57 100644
a b void TimeBase::checkCallBacks() { 265 265 setTime(_stopTime, _stopScale); 266 266 else if (getRate() > 0 && time == stopTime) 267 267 setTime(_startTime, _startScale); 268 } else {269 // Stop at the end270 if ((getRate() > 0 && time == stopTime) || (getRate() < 0 && time == startTime))271 stop();272 268 } 273 269 } 274 270 -
gui/credits.h
diff --git a/gui/credits.h b/gui/credits.h index bcace12..ffcd227 100644
a b static const char *credits[] = { 650 650 "C0""Jeroen Janssen", 651 651 "C2""Numerous readability and bugfix patches", 652 652 "C0""Keith Kaisershot", 653 "C2""Several Pegasus Prime patches ",653 "C2""Several Pegasus Prime patches and DVD additions", 654 654 "C0""Andreas Karlsson", 655 655 "C2""Initial port for SymbianOS", 656 656 "C0""Claudio Matsuoka", -
ports.mk
diff --git a/ports.mk b/ports.mk index 306e0f0..085f1bd 100644
a b install: 9 9 $(INSTALL) -d "$(DESTDIR)$(bindir)" 10 10 $(INSTALL) -c -m 755 "./$(EXECUTABLE)" "$(DESTDIR)$(bindir)/$(EXECUTABLE)" 11 11 $(INSTALL) -d "$(DESTDIR)$(mandir)/man6/" 12 $(INSTALL) -c -m 644 "$(srcdir)/dists/scummvm.6" "$(DESTDIR)$(mandir)/man6/scummvm.6" 12 $(INSTALL) -c -m 644 "$(srcdir)/dists/scummvm.6" "$(DESTDIR)$(mandir)/man6/PegasusPrime.6" 13 $(INSTALL) -d "$(DESTDIR)$(datarootdir)/icons/" 14 $(INSTALL) -c -m 644 "$(srcdir)/dists/pegasus/pegasus.xpm" "$(DESTDIR)$(datarootdir)/icons/pegasus.xpm" 13 15 $(INSTALL) -d "$(DESTDIR)$(datarootdir)/pixmaps/" 14 $(INSTALL) -c -m 644 "$(srcdir)/ icons/scummvm.xpm" "$(DESTDIR)$(datarootdir)/pixmaps/scummvm.xpm"16 $(INSTALL) -c -m 644 "$(srcdir)/dists/pegasus/pegasus.xpm" "$(DESTDIR)$(datarootdir)/pixmaps/pegasus.xpm" 15 17 $(INSTALL) -d "$(DESTDIR)$(docdir)" 16 18 $(INSTALL) -c -m 644 $(DIST_FILES_DOCS) "$(DESTDIR)$(docdir)" 17 19 $(INSTALL) -d "$(DESTDIR)$(datadir)" 18 $(INSTALL) -c -m 644 $(DIST_FILES_THEMES) $(DIST_FILES_ENGINEDATA) "$(DESTDIR)$(datadir)/" 20 $(INSTALL) -c -m 644 $(srcdir)/gui/themes/translations.dat "$(DESTDIR)$(datadir)/" 21 $(INSTALL) -c -m 644 $(srcdir)/dists/pegasus/scummpegasus.zip "$(DESTDIR)$(datadir)/" 19 22 ifdef DYNAMIC_MODULES 20 $(INSTALL) -d "$(DESTDIR)$(libdir)/ scummvm/"21 $(INSTALL) -c -m 644 $(PLUGINS) "$(DESTDIR)$(libdir)/ scummvm/"23 $(INSTALL) -d "$(DESTDIR)$(libdir)/PegasusPrime/" 24 $(INSTALL) -c -m 644 $(PLUGINS) "$(DESTDIR)$(libdir)/PegasusPrime/" 22 25 endif 26 $(INSTALL) -d "$(DESTDIR)$(datarootdir)/applications/" 27 $(INSTALL) -c -m 644 $(srcdir)/dists/pegasus/PegasusPrime.desktop "$(DESTDIR)$(datarootdir)/applications/" 23 28 24 29 install-strip: 25 30 $(INSTALL) -d "$(DESTDIR)$(bindir)" 26 31 $(INSTALL) -c -s -m 755 "./$(EXECUTABLE)" "$(DESTDIR)$(bindir)/$(EXECUTABLE)" 27 32 $(INSTALL) -d "$(DESTDIR)$(mandir)/man6/" 28 $(INSTALL) -c -m 644 "$(srcdir)/dists/scummvm.6" "$(DESTDIR)$(mandir)/man6/scummvm.6" 33 $(INSTALL) -c -m 644 "$(srcdir)/dists/scummvm.6" "$(DESTDIR)$(mandir)/man6/PegasusPrime.6" 34 $(INSTALL) -d "$(DESTDIR)$(datarootdir)/icons/" 35 $(INSTALL) -c -m 644 "$(srcdir)/dists/pegasus/pegasus.xpm" "$(DESTDIR)$(datarootdir)/icons/pegasus.xpm" 29 36 $(INSTALL) -d "$(DESTDIR)$(datarootdir)/pixmaps/" 30 $(INSTALL) -c -m 644 "$(srcdir)/ icons/scummvm.xpm" "$(DESTDIR)$(datarootdir)/pixmaps/scummvm.xpm"37 $(INSTALL) -c -m 644 "$(srcdir)/dists/pegasus/pegasus.xpm" "$(DESTDIR)$(datarootdir)/pixmaps/pegasus.xpm" 31 38 $(INSTALL) -d "$(DESTDIR)$(docdir)" 32 39 $(INSTALL) -c -m 644 $(DIST_FILES_DOCS) "$(DESTDIR)$(docdir)" 33 40 $(INSTALL) -d "$(DESTDIR)$(datadir)" 34 $(INSTALL) -c -m 644 $(DIST_FILES_THEMES) $(DIST_FILES_ENGINEDATA) "$(DESTDIR)$(datadir)/" 41 $(INSTALL) -c -m 644 $(srcdir)/gui/themes/translations.dat "$(DESTDIR)$(datadir)/" 42 $(INSTALL) -c -m 644 $(srcdir)/dists/pegasus/scummpegasus.zip "$(DESTDIR)$(datadir)/" 35 43 ifdef DYNAMIC_MODULES 36 $(INSTALL) -d "$(DESTDIR)$(libdir)/ scummvm/"37 $(INSTALL) -c -s -m 644 $(PLUGINS) "$(DESTDIR)$(libdir)/ scummvm/"44 $(INSTALL) -d "$(DESTDIR)$(libdir)/PegasusPrime/" 45 $(INSTALL) -c -s -m 644 $(PLUGINS) "$(DESTDIR)$(libdir)/PegasusPrime/" 38 46 endif 47 $(INSTALL) -d "$(DESTDIR)$(datarootdir)/applications/" 48 $(INSTALL) -c -m 644 $(srcdir)/dists/pegasus/PegasusPrime.desktop "$(DESTDIR)$(datarootdir)/applications/" 39 49 40 50 uninstall: 41 51 rm -f "$(DESTDIR)$(bindir)/$(EXECUTABLE)" 42 rm -f "$(DESTDIR)$(mandir)/man6/scummvm.6" 43 rm -f "$(DESTDIR)$(datarootdir)/pixmaps/scummvm.xpm" 52 rm -f "$(DESTDIR)$(mandir)/man6/PegasusPrime.6" 53 rm -f "$(DESTDIR)$(datarootdir)/icons/pegasus.xpm" 54 rm -f "$(DESTDIR)$(datarootdir)/pixmaps/pegasus.xpm" 44 55 rm -rf "$(DESTDIR)$(docdir)" 45 56 rm -rf "$(DESTDIR)$(datadir)" 46 57 ifdef DYNAMIC_MODULES 47 rm -rf "$(DESTDIR)$(libdir)/ scummvm/"58 rm -rf "$(DESTDIR)$(libdir)/PegasusPrime/" 48 59 endif 60 rm -f "$(DESTDIR)$(datarootdir)/applications/PegasusPrime.desktop" 49 61 50 62 # Special target to create a application wrapper for Mac OS X 51 bundle_name = ScummVM.app63 bundle_name = "Pegasus Prime™ OSX.app" 52 64 bundle: scummvm-static 53 65 mkdir -p $(bundle_name)/Contents/MacOS 54 66 mkdir -p $(bundle_name)/Contents/Resources 55 67 echo "APPL????" > $(bundle_name)/Contents/PkgInfo 56 cp $(srcdir)/dists/ macosx/Info.plist $(bundle_name)/Contents/68 cp $(srcdir)/dists/pegasus/Info.plist $(bundle_name)/Contents/ 57 69 ifdef USE_SPARKLE 58 70 mkdir -p $(bundle_name)/Contents/Frameworks 59 71 cp $(srcdir)/dists/macosx/dsa_pub.pem $(bundle_name)/Contents/Resources/ 60 72 cp -R $(STATICLIBPATH)/Sparkle.framework $(bundle_name)/Contents/Frameworks/ 61 73 endif 62 cp $(srcdir)/ icons/scummvm.icns $(bundle_name)/Contents/Resources/74 cp $(srcdir)/dists/pegasus/pegasus.icns $(bundle_name)/Contents/Resources/ 63 75 cp $(DIST_FILES_DOCS) $(bundle_name)/ 64 cp $(DIST_FILES_THEMES) $(bundle_name)/Contents/Resources/ 76 cp $(srcdir)/gui/themes/translations.dat $(bundle_name)/Contents/Resources/ 77 cp $(srcdir)/dists/pegasus/scummpegasus.zip $(bundle_name)/Contents/Resources/ 65 78 ifdef DIST_FILES_ENGINEDATA 66 79 cp $(DIST_FILES_ENGINEDATA) $(bundle_name)/Contents/Resources/ 67 80 endif … … osxsnap: bundle 235 248 # Windows specific 236 249 # 237 250 238 scummvmwinres.o: $(srcdir)/ icons/scummvm.ico$(DIST_FILES_THEMES) $(DIST_FILES_ENGINEDATA) $(srcdir)/dists/scummvm.rc251 scummvmwinres.o: $(srcdir)/dists/pegasus/pegasus.ico $(srcdir)/dists/pegasus/scummpegasus.zip $(DIST_FILES_THEMES) $(DIST_FILES_ENGINEDATA) $(srcdir)/dists/scummvm.rc 239 252 $(QUIET_WINDRES)$(WINDRES) -DHAVE_CONFIG_H $(WINDRESFLAGS) $(DEFINES) -I. -I$(srcdir) $(srcdir)/dists/scummvm.rc scummvmwinres.o 240 253 241 254 # Special target to create a win32 snapshot binary (for Inno Setup)